"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default")); var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __decorateClass = (decorators, target, key, kind) => { var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target; for (var i = decorators.length - 1, decorator; i >= 0; i--) if (decorator = decorators[i]) result = (kind ? decorator(target, key, result) : decorator(result)) || result; if (kind && result) __defProp(target, key, result); return result; }; // packages/ag-charts-enterprise/src/main.ts var main_exports = {}; __export(main_exports, { AgChartsEnterpriseModule: () => AgChartsEnterpriseModule, AgTooltipAnchorToType: () => AgTooltipAnchorToType, AgTooltipPlacementType: () => AgTooltipPlacementType, AllCartesianAxesModule: () => AllCartesianAxesModule, AllCartesianModule: () => AllCartesianModule, AllCartesianSeriesModule: () => AllCartesianSeriesModule, AllEnterpriseModule: () => AllEnterpriseModule, AllGaugeModule: () => AllGaugeModule, AllMapSeriesModule: () => AllMapSeriesModule, AllPolarModule: () => AllPolarModule, AngleCategoryAxisModule: () => AngleCategoryAxisModule, AngleNumberAxisModule: () => AngleNumberAxisModule, AnimationModule: () => AnimationModule, AnnotationsModule: () => AnnotationsModule, BandHighlightModule: () => BandHighlightModule, BoxPlotSeriesModule: () => BoxPlotSeriesModule, CandlestickSeriesModule: () => CandlestickSeriesModule, ChartToolbarModule: () => ChartToolbarModule, ChordSeriesModule: () => ChordSeriesModule, ConeFunnelSeriesModule: () => ConeFunnelSeriesModule, ContextMenuModule: () => ContextMenuModule, CrosshairModule: () => CrosshairModule, DataSourceModule: () => DataSourceModule, ErrorBarsModule: () => ErrorBarsModule, FinancialChartModule: () => FinancialChartModule, FlashOnUpdateModule: () => FlashOnUpdateModule, FunnelSeriesModule: () => FunnelSeriesModule, GradientLegendModule: () => GradientLegendModule, HeatmapSeriesModule: () => HeatmapSeriesModule, LicenseManager: () => LicenseManager2, LinearGaugeModule: () => LinearGaugeModule, MapLineBackgroundSeriesModule: () => MapLineBackgroundSeriesModule, MapLineSeriesModule: () => MapLineSeriesModule, MapMarkerSeriesModule: () => MapMarkerSeriesModule, MapShapeBackgroundSeriesModule: () => MapShapeBackgroundSeriesModule, MapShapeSeriesModule: () => MapShapeSeriesModule, NavigatorModule: () => NavigatorModule, NightingaleSeriesModule: () => NightingaleSeriesModule, OhlcSeriesModule: () => OhlcSeriesModule, OrdinalTimeAxisModule: () => OrdinalTimeAxisModule, PyramidSeriesModule: () => PyramidSeriesModule, RadarAreaSeriesModule: () => RadarAreaSeriesModule, RadarLineSeriesModule: () => RadarLineSeriesModule, RadialBarSeriesModule: () => RadialBarSeriesModule, RadialColumnSeriesModule: () => RadialColumnSeriesModule, RadialGaugeModule: () => RadialGaugeModule, RadiusCategoryAxisModule: () => RadiusCategoryAxisModule, RadiusNumberAxisModule: () => RadiusNumberAxisModule, RangeAreaSeriesModule: () => RangeAreaSeriesModule, RangeBarSeriesModule: () => RangeBarSeriesModule, RangesModule: () => RangesModule, SankeySeriesModule: () => SankeySeriesModule, ScrollbarModule: () => ScrollbarModule, StatusBarModule: () => StatusBarModule, SunburstSeriesModule: () => SunburstSeriesModule, SyncModule: () => SyncModule, TreemapSeriesModule: () => TreemapSeriesModule, WaterfallSeriesModule: () => WaterfallSeriesModule, ZoomModule: () => ZoomModule }); module.exports = __toCommonJS(main_exports); var import_ag_charts_core288 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/background/background.ts var import_ag_charts_community2 = require("ag-charts-community"); var import_ag_charts_core2 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/image/image.ts var import_ag_charts_community = require("ag-charts-community"); var import_ag_charts_core = require("ag-charts-core"); var Image = class extends import_ag_charts_core.BaseProperties { constructor() { super(); this.opacity = 1; this.loadedSynchronously = true; this.containerWidth = 0; this.containerHeight = 0; this.onLoad = void 0; this.onImageLoad = () => { if (this.loadedSynchronously) { return; } this.node.visible = false; this.performLayout(this.containerWidth, this.containerHeight); this.onLoad?.(); }; this.imageElement = (0, import_ag_charts_core.createElement)("img"); this.imageElement.onload = this.onImageLoad; this.node = new import_ag_charts_community._ModuleSupport.Image(this.imageElement); } get complete() { return this.imageElement.width > 0 && this.imageElement.height > 0; } performLayout(containerWidth, containerHeight) { this.containerWidth = containerWidth; this.containerHeight = containerHeight; const container = { width: containerWidth, height: containerHeight }; const placement = (0, import_ag_charts_core.calculatePlacement)(this.imageElement.width, this.imageElement.height, container, this); this.node.setProperties( this.complete ? { visible: true, opacity: this.opacity, ...placement } : { visible: false } ); return placement; } }; __decorateClass([ import_ag_charts_core.Property ], Image.prototype, "top", 2); __decorateClass([ import_ag_charts_core.Property ], Image.prototype, "right", 2); __decorateClass([ import_ag_charts_core.Property ], Image.prototype, "bottom", 2); __decorateClass([ import_ag_charts_core.Property ], Image.prototype, "left", 2); __decorateClass([ import_ag_charts_core.Property ], Image.prototype, "width", 2); __decorateClass([ import_ag_charts_core.Property ], Image.prototype, "height", 2); __decorateClass([ import_ag_charts_core.Property ], Image.prototype, "opacity", 2); __decorateClass([ (0, import_ag_charts_core.ProxyProperty)("imageElement.src"), (0, import_ag_charts_core.ObserveChanges)((target) => target.loadedSynchronously = target.complete) ], Image.prototype, "url", 2); // packages/ag-charts-enterprise/src/features/background/background.ts var Background = class extends import_ag_charts_community2._ModuleSupport.Background { constructor() { super(...arguments); this.image = new Image(); } onLayoutComplete(event) { super.onLayoutComplete(event); if (this.image) { const { width, height } = event.chart; this.image.performLayout(width, height); } } onImageLoad() { this.ctx.updateService.update(import_ag_charts_core2.ChartUpdateType.SCENE_RENDER); } }; __decorateClass([ import_ag_charts_core2.Property, (0, import_ag_charts_core2.ActionOnSet)({ newValue(image) { this.node.appendChild(image.node); image.onLoad = () => this.onImageLoad(); }, oldValue(image) { image.node.remove(); image.onLoad = void 0; } }) ], Background.prototype, "image", 2); // packages/ag-charts-enterprise/src/features/foreground/foreground.ts var import_ag_charts_community3 = require("ag-charts-community"); var import_ag_charts_core3 = require("ag-charts-core"); var Foreground = class extends import_ag_charts_community3._ModuleSupport.Background { constructor() { super(...arguments); this.image = new Image(); this.fill = "transparent"; this.fillOpacity = void 0; } createNode() { return new import_ag_charts_community3._ModuleSupport.Group({ name: "foreground", zIndex: import_ag_charts_core3.ZIndexMap.FOREGROUND }); } onLayoutComplete(event) { super.onLayoutComplete(event); const { width, height } = event.chart; const placement = this.image.performLayout(width, height); if (this.text) { this.updateTextNode(placement); } } onImageLoad() { this.ctx.updateService.update(import_ag_charts_core3.ChartUpdateType.SCENE_RENDER); } updateTextNode(placement) { const { textNode } = this; textNode.fontWeight = "bold"; textNode.fontFamily = "Impact, sans-serif"; textNode.fontSize = 19; textNode.opacity = 0.7; textNode.fill = "#9b9b9b"; textNode.textBaseline = "top"; const { width } = textNode.getBBox(); const textPadding = 10; textNode.x = placement.x + placement.width / 2 - width / 2; textNode.y = placement.y + placement.height + textPadding; } }; __decorateClass([ import_ag_charts_core3.Property, (0, import_ag_charts_core3.ActionOnSet)({ newValue(image) { this.node.appendChild(image.node); image.onLoad = () => this.onImageLoad(); }, oldValue(image) { image.node.remove(); image.onLoad = void 0; } }) ], Foreground.prototype, "image", 2); __decorateClass([ import_ag_charts_core3.Property, (0, import_ag_charts_core3.ProxyPropertyOnWrite)("rectNode", "fill") ], Foreground.prototype, "fill", 2); __decorateClass([ import_ag_charts_core3.Property, (0, import_ag_charts_core3.ProxyPropertyOnWrite)("rectNode", "fillOpacity") ], Foreground.prototype, "fillOpacity", 2); // packages/ag-charts-enterprise/src/license/md5.ts var MD5 = class { constructor() { this.ieCompatibility = false; } init() { this.ieCompatibility = this.md5("hello") != "5d41402abc4b2a76b9719d911017c592"; } md5cycle(x, k) { let a = x[0], b = x[1], c = x[2], d = x[3]; a = this.ff(a, b, c, d, k[0], 7, -680876936); d = this.ff(d, a, b, c, k[1], 12, -389564586); c = this.ff(c, d, a, b, k[2], 17, 606105819); b = this.ff(b, c, d, a, k[3], 22, -1044525330); a = this.ff(a, b, c, d, k[4], 7, -176418897); d = this.ff(d, a, b, c, k[5], 12, 1200080426); c = this.ff(c, d, a, b, k[6], 17, -1473231341); b = this.ff(b, c, d, a, k[7], 22, -45705983); a = this.ff(a, b, c, d, k[8], 7, 1770035416); d = this.ff(d, a, b, c, k[9], 12, -1958414417); c = this.ff(c, d, a, b, k[10], 17, -42063); b = this.ff(b, c, d, a, k[11], 22, -1990404162); a = this.ff(a, b, c, d, k[12], 7, 1804603682); d = this.ff(d, a, b, c, k[13], 12, -40341101); c = this.ff(c, d, a, b, k[14], 17, -1502002290); b = this.ff(b, c, d, a, k[15], 22, 1236535329); a = this.gg(a, b, c, d, k[1], 5, -165796510); d = this.gg(d, a, b, c, k[6], 9, -1069501632); c = this.gg(c, d, a, b, k[11], 14, 643717713); b = this.gg(b, c, d, a, k[0], 20, -373897302); a = this.gg(a, b, c, d, k[5], 5, -701558691); d = this.gg(d, a, b, c, k[10], 9, 38016083); c = this.gg(c, d, a, b, k[15], 14, -660478335); b = this.gg(b, c, d, a, k[4], 20, -405537848); a = this.gg(a, b, c, d, k[9], 5, 568446438); d = this.gg(d, a, b, c, k[14], 9, -1019803690); c = this.gg(c, d, a, b, k[3], 14, -187363961); b = this.gg(b, c, d, a, k[8], 20, 1163531501); a = this.gg(a, b, c, d, k[13], 5, -1444681467); d = this.gg(d, a, b, c, k[2], 9, -51403784); c = this.gg(c, d, a, b, k[7], 14, 1735328473); b = this.gg(b, c, d, a, k[12], 20, -1926607734); a = this.hh(a, b, c, d, k[5], 4, -378558); d = this.hh(d, a, b, c, k[8], 11, -2022574463); c = this.hh(c, d, a, b, k[11], 16, 1839030562); b = this.hh(b, c, d, a, k[14], 23, -35309556); a = this.hh(a, b, c, d, k[1], 4, -1530992060); d = this.hh(d, a, b, c, k[4], 11, 1272893353); c = this.hh(c, d, a, b, k[7], 16, -155497632); b = this.hh(b, c, d, a, k[10], 23, -1094730640); a = this.hh(a, b, c, d, k[13], 4, 681279174); d = this.hh(d, a, b, c, k[0], 11, -358537222); c = this.hh(c, d, a, b, k[3], 16, -722521979); b = this.hh(b, c, d, a, k[6], 23, 76029189); a = this.hh(a, b, c, d, k[9], 4, -640364487); d = this.hh(d, a, b, c, k[12], 11, -421815835); c = this.hh(c, d, a, b, k[15], 16, 530742520); b = this.hh(b, c, d, a, k[2], 23, -995338651); a = this.ii(a, b, c, d, k[0], 6, -198630844); d = this.ii(d, a, b, c, k[7], 10, 1126891415); c = this.ii(c, d, a, b, k[14], 15, -1416354905); b = this.ii(b, c, d, a, k[5], 21, -57434055); a = this.ii(a, b, c, d, k[12], 6, 1700485571); d = this.ii(d, a, b, c, k[3], 10, -1894986606); c = this.ii(c, d, a, b, k[10], 15, -1051523); b = this.ii(b, c, d, a, k[1], 21, -2054922799); a = this.ii(a, b, c, d, k[8], 6, 1873313359); d = this.ii(d, a, b, c, k[15], 10, -30611744); c = this.ii(c, d, a, b, k[6], 15, -1560198380); b = this.ii(b, c, d, a, k[13], 21, 1309151649); a = this.ii(a, b, c, d, k[4], 6, -145523070); d = this.ii(d, a, b, c, k[11], 10, -1120210379); c = this.ii(c, d, a, b, k[2], 15, 718787259); b = this.ii(b, c, d, a, k[9], 21, -343485551); x[0] = this.add32(a, x[0]); x[1] = this.add32(b, x[1]); x[2] = this.add32(c, x[2]); x[3] = this.add32(d, x[3]); } cmn(q, a, b, x, s, t) { a = this.add32(this.add32(a, q), this.add32(x, t)); return this.add32(a << s | a >>> 32 - s, b); } ff(a, b, c, d, x, s, t) { return this.cmn(b & c | ~b & d, a, b, x, s, t); } gg(a, b, c, d, x, s, t) { return this.cmn(b & d | c & ~d, a, b, x, s, t); } hh(a, b, c, d, x, s, t) { return this.cmn(b ^ c ^ d, a, b, x, s, t); } ii(a, b, c, d, x, s, t) { return this.cmn(c ^ (b | ~d), a, b, x, s, t); } md51(s) { const n = s.length; const state = [1732584193, -271733879, -1732584194, 271733878]; let i; for (i = 64; i <= s.length; i += 64) { this.md5cycle(state, this.md5blk(s.substring(i - 64, i))); } s = s.substring(i - 64); const tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; for (i = 0; i < s.length; i++) { tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3); } tail[i >> 2] |= 128 << (i % 4 << 3); if (i > 55) { this.md5cycle(state, tail); for (i = 0; i < 16; i++) { tail[i] = 0; } } tail[14] = n * 8; this.md5cycle(state, tail); return state; } /* there needs to be support for Unicode here, * unless we pretend that we can redefine the MD-5 * algorithm for multi-byte characters (perhaps by adding every four 16-bit characters and * shortening the sum to 32 bits). Otherwise I suggest performing MD-5 as if every character * was two bytes--e.g., 0040 0025 = @%--but then how will an ordinary MD-5 sum be matched? * There is no way to standardize text to something like UTF-8 before transformation; speed cost is * utterly prohibitive. The JavaScript standard itself needs to look at this: it should start * providing access to strings as preformed UTF-8 8-bit unsigned value arrays. */ md5blk(s) { const md5blks = []; for (let i = 0; i < 64; i += 4) { md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24); } return md5blks; } rhex(n) { const hex_chr = "0123456789abcdef".split(""); let s = "", j = 0; for (; j < 4; j++) { s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15]; } return s; } hex(x) { for (let i = 0; i < x.length; i++) { x[i] = this.rhex(x[i]); } return x.join(""); } md5(s) { return this.hex(this.md51(s)); } add32(a, b) { return this.ieCompatibility ? this.add32Compat(a, b) : this.add32Std(a, b); } /* this function is much faster, so if possible we use it. Some IEs are the only ones I know of that need the idiotic second function, generated by an if clause. */ add32Std(a, b) { return a + b & 4294967295; } add32Compat(x, y) { const lsw = (x & 65535) + (y & 65535), msw = (x >> 16) + (y >> 16) + (lsw >> 16); return msw << 16 | lsw & 65535; } }; // packages/ag-charts-enterprise/src/license/licenseManager.ts function missingOrEmpty(value) { return value == null || value.length === 0; } var WATERMARK_SVG_DATA_URL = `data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjU4IiBoZWlnaHQ9IjQwIiB2aWV3Qm94PSIwIDAgMjU4IDQwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMjUuNzc5IDI4LjY1N0gxMy4zNTlMMTEuMTczIDM0LjAxMkg1LjY3Mjk3TDE3LjE4MiA3LjA1OTk5SDIxLjk1M0wzMy40NjIgMzQuMDEySDI3Ljk2MkwyNS43NzYgMjguNjU3SDI1Ljc3OVpNMjQuMDY4IDI0LjM5N0wxOS41ODggMTMuNDM0TDE1LjEwNyAyNC4zOTdIMjQuMDY4Wk02Mi4wOTIgMTguODIzSDQ5LjgxN1YyMy4wODZINTYuNzc1QzU2LjU1NSAyNS4yMjIgNTUuNzU1IDI2LjkyNyA1NC4zNzIgMjguMjAyQzUyLjk4OSAyOS40NzYgNTEuMTY2IDMwLjExNSA0OC45MDkgMzAuMTE1QzQ3LjYyMiAzMC4xMTUgNDYuNDUgMjkuODg1IDQ1LjM5MyAyOS40MjNDNDQuMzU4MyAyOC45NzgxIDQzLjQzMjYgMjguMzEzOCA0Mi42OCAyNy40NzZDNDEuOTI3IDI2LjYzOSA0MS4zNDQgMjUuNjMxIDQwLjkzMSAyNC40NTNDNDAuNTE5IDIzLjI3NSA0MC4zMTEgMjEuOTcgNDAuMzExIDIwLjUzN0M0MC4zMTEgMTkuMTA1IDQwLjUxNiAxNy44IDQwLjkzMSAxNi42MjFDNDEuMzQ0IDE1LjQ0MyA0MS45MjcgMTQuNDM2IDQyLjY4IDEzLjU5OEM0My40Mzc2IDEyLjc1NzcgNDQuMzY5NiAxMi4wOTMyIDQ1LjQxMSAxMS42NTFDNDYuNDc4IDExLjE4OSA0Ny42NTYgMTAuOTYgNDguOTQ2IDEwLjk2QzUxLjYxMiAxMC45NiA1My42MzcgMTEuNjAyIDU1LjAyIDEyLjg4NUw1OC4zIDkuNjA0OTlDNTUuODE3IDcuNjY5OTkgNTIuNjc2IDYuNjk5OTkgNDguODcyIDYuNjk5OTlDNDYuNzYgNi42OTk5OSA0NC44NTMgNy4wMzQ5OSA0My4xNTQgNy43MDA5OUM0MS40NTUgOC4zNjc5OSAzOS45OTggOS4zMDM5OSAzOC43ODMgMTAuNTA0QzM3LjU2NyAxMS43MDcgMzYuNjM0IDEzLjE1OCAzNS45NzcgMTQuODU3QzM1LjMxOSAxNi41NTYgMzQuOTk0IDE4LjQ1MSAzNC45OTQgMjAuNTRDMzQuOTk0IDIyLjYzIDM1LjMyOSAyNC40OTQgMzUuOTk1IDI2LjIwNUMzNi42NjIgMjcuOTE2IDM3LjYwNSAyOS4zNzQgMzguODE3IDMwLjU3N0M0MC4wMzIgMzEuNzggNDEuNDg2IDMyLjcxMyA0My4xODggMzMuMzgzQzQ0Ljg4OCAzNC4wNDkgNDYuNzgyIDM0LjM4NCA0OC44NzIgMzQuMzg0QzUwLjk2MSAzNC4zODQgNTIuNzUgMzQuMDQ5IDU0LjM5IDMzLjM4M0M1Ni4wMzEgMzIuNzE2IDU3LjQyNiAzMS43OCA1OC41NzkgMzAuNTc3QzU5LjczMyAyOS4zNzQgNjAuNjE5IDI3LjkxNiA2MS4yMzkgMjYuMjA1QzYxLjg2IDI0LjQ5NCA2Mi4xNyAyMi42MDUgNjIuMTcgMjAuNTRDNjIuMTY5NiAxOS45Njg4IDYyLjE0NDUgMTkuMzk4IDYyLjA5NSAxOC44MjlMNjIuMDkyIDE4LjgyM1pNMTUxLjgxIDE2Ljk4MUMxNTMuNDEgMTQuNjA5IDE1Ny40MTkgMTQuMzU4IDE1OS4wMjIgMTQuMzU4VjE4LjkxQzE1Ni45NTcgMTguOTEgMTU0Ljk4NSAxOC45OTYgMTUzLjc1NyAxOS44OTJDMTUyLjUyOSAyMC43OTIgMTUxLjkxOSAyMS45ODIgMTUxLjkxOSAyMy40NjRWMzMuOTlIMTQ2Ljk2NFYxNC4zNThIMTUxLjczNkwxNTEuODEgMTYuOTgxWk0xNDMuMDExIDE0LjM2MVYzNC4wMzFIMTM4LjI0TDEzOC4xMzEgMzEuMDQ1QzEzNy40NjYgMzIuMDc2IDEzNi41NTEgMzIuOTIxOSAxMzUuNDcxIDMzLjUwNEMxMzQuMzc2IDM0LjA5OSAxMzMuMDY4IDM0LjM5NiAxMzEuNTM2IDM0LjM5NkMxMzAuMiAzNC4zOTYgMTI4Ljk2MyAzNC4xNTIgMTI3LjgyMiAzMy42NjhDMTI2LjcgMzMuMTk2NCAxMjUuNjg5IDMyLjQ5NSAxMjQuODU1IDMxLjYwOUMxMjQuMDE4IDMwLjcyMiAxMjMuMzU0IDI5LjY2MiAxMjIuODcxIDI4LjQyMkMxMjIuMzg0IDI3LjE4NSAxMjIuMTQyIDI1LjgxMSAxMjIuMTQyIDI0LjMwNEMxMjIuMTQyIDIyLjc5OCAxMjIuMzg0IDIxLjM3OCAxMjIuODcxIDIwLjExNkMxMjMuMzU3IDE4Ljg1NCAxMjQuMDE4IDE3Ljc3MiAxMjQuODU1IDE2Ljg3M0MxMjUuNjg4IDE1Ljk3NjQgMTI2LjY5OCAxNS4yNjM2IDEyNy44MjIgMTQuNzhDMTI4Ljk2MyAxNC4yODEgMTMwLjIwMyAxNC4wMzMgMTMxLjUzNiAxNC4wMzNDMTMzLjA0MyAxNC4wMzMgMTM0LjMzIDE0LjMxOCAxMzUuMzk3IDE0Ljg4OEMxMzYuNDYyIDE1LjQ1ODkgMTM3LjM3NSAxNi4yNzggMTM4LjA1NyAxNy4yNzZWMTQuMzYxSDE0My4wMTFaTTEzMi42MzEgMzAuMTMzQzEzNC4yNTYgMzAuMTMzIDEzNS41NjcgMjkuNTk0IDEzNi41NjUgMjguNTEyQzEzNy41NjEgMjcuNDMgMTM4LjA2IDI1Ljk5MSAxMzguMDYgMjQuMTk2QzEzOC4wNiAyMi40MDEgMTM3LjU2MSAyMC45OSAxMzYuNTY1IDE5Ljg5OUMxMzUuNTcgMTguODA3IDEzNC4yNTkgMTguMjU4IDEzMi42MzEgMTguMjU4QzEzMS4wMDMgMTguMjU4IDEyOS43MjkgMTguODA0IDEyOC43MzQgMTkuODk5QzEyNy43MzggMjAuOTkzIDEyNy4yMzkgMjIuNDM4IDEyNy4yMzkgMjQuMjMzQzEyNy4yMzkgMjYuMDI4IDEyNy43MzUgMjcuNDMzIDEyOC43MzQgMjguNTE1QzEyOS43MjkgMjkuNTk0IDEzMS4wMjggMzAuMTM2IDEzMi42MzEgMzAuMTM2VjMwLjEzM1pNOTMuNjk4IDI3Ljg3NkM5My41Nzk1IDI4LjAwMjUgOTMuNDU2NCAyOC4xMjQ2IDkzLjMyOSAyOC4yNDJDOTEuOTQ3IDI5LjUxNiA5MC4xMjMgMzAuMTU1IDg3Ljg2NiAzMC4xNTVDODYuNTggMzAuMTU1IDg1LjQwOCAyOS45MjYgODQuMzUgMjkuNDY0QzgzLjMxNTUgMjkuMDE4OSA4Mi4zODk4IDI4LjM1NDYgODEuNjM3IDI3LjUxN0M4MC44ODQgMjYuNjc5IDgwLjMwMSAyNS42NzIgNzkuODg5IDI0LjQ5NEM3OS40NzYgMjMuMzE1IDc5LjI2OSAyMi4wMSA3OS4yNjkgMjAuNTc4Qzc5LjI2OSAxOS4xNDUgNzkuNDczIDE3Ljg0IDc5Ljg4OSAxNi42NjJDODAuMzAxIDE1LjQ4NCA4MC44ODQgMTQuNDc2IDgxLjYzNyAxMy42MzlDODIuMzk0OSAxMi43OTg3IDgzLjMyNzMgMTIuMTM0MiA4NC4zNjkgMTEuNjkyQzg1LjQzNiAxMS4yMyA4Ni42MTQgMTEgODcuOTAzIDExQzkwLjU3IDExIDkyLjU5NSAxMS42NDIgOTMuOTc3IDEyLjkyNkw5Ny4yNTggOS42NDQ5OUM5NC43NzQgNy43MTA5OSA5MS42MzMgNi43Mzk5OSA4Ny44MjkgNi43Mzk5OUM4NS43MTggNi43Mzk5OSA4My44MTEgNy4wNzQ5OSA4Mi4xMTIgNy43NDE5OUM4MC40MTMgOC40MDc5OSA3OC45NTYgOS4zNDQ5OSA3Ny43NCAxMC41NDVDNzYuNTI1IDExLjc0NyA3NS41OTIgMTMuMTk5IDc0LjkzNCAxNC44OThDNzQuMjc3IDE2LjU5NyA3My45NTEgMTguNDkxIDczLjk1MSAyMC41ODFDNzMuOTUxIDIyLjY3IDc0LjI4NiAyNC41MzQgNzQuOTUzIDI2LjI0NUM3NS42MTkgMjcuOTU3IDc2LjU2MiAyOS40MTQgNzcuNzc0IDMwLjYxN0M3OC45OSAzMS44MiA4MC40NDQgMzIuNzUzIDgyLjE0NiAzMy40MjNDODMuODQ1IDM0LjA5IDg1LjczOSAzNC40MjQgODcuODI5IDM0LjQyNEM4OS45MTkgMzQuNDI0IDkxLjcwOCAzNC4wOSA5My4zNDggMzMuNDIzQzk0LjcxOCAzMi44NjUgOTUuOTE4IDMyLjEyMSA5Ni45NDggMzEuMTkxQzk3LjE0OSAzMS4wMDggOTcuMzQ4IDMwLjgxNSA5Ny41MzcgMzAuNjJMOTMuNzAxIDI3Ljg4NUw5My42OTggMjcuODc2Wk0xMTAuODAyIDE0LjAxNUMxMDkuMTk5IDE0LjAxNSAxMDYuODM2IDE0LjQ3MSAxMDUuNjExIDE2LjE1OEwxMDUuNTM3IDYuMDE1OTlIMTAwLjc2NVYzMy45MzlIMTA1LjcyVjIyLjY0MUMxMDUuNzcxIDIxLjQ2MDcgMTA2LjI4OCAyMC4zNDg4IDEwNy4xNTcgMTkuNTQ4OUMxMDguMDI3IDE4Ljc0OTEgMTA5LjE3OCAxOC4zMjY2IDExMC4zNTggMTguMzc0QzExMy4zOTcgMTguMzc0IDExNC4yNjggMjEuMTU5IDExNC4yNjggMjIuNjQxVjMzLjkzOUgxMTkuMjIzVjIxLjA1OUMxMTkuMjIzIDIxLjA1OSAxMTkuMTQyIDE0LjAxNSAxMTAuODAyIDE0LjAxNVpNMTczLjc2MyAxNC4zNThIMTY5Ljk5OVY4LjcxNDk5SDE2NS4wNDhWMTQuMzU4SDE2MS4yODRWMTguOTE2SDE2NS4wNDhWMzQuMDAzSDE2OS45OTlWMTguOTE2SDE3My43NjNWMTQuMzU4Wk0xOTAuNzg3IDI1LjI2MkMxOTAuMTI5IDI0LjUwMTQgMTg5LjMwNyAyMy44OTk0IDE4OC4zODQgMjMuNTAxQzE4Ny40ODggMjMuMTE3IDE4Ni4zMzEgMjIuNzMyIDE4NC45NDggMjIuMzY0QzE4NC4xNjUgMjIuMTQzOSAxODMuMzkgMjEuODk3OCAxODIuNjIzIDIxLjYyNkMxODIuMTYzIDIxLjQ2MjEgMTgxLjc0MSAyMS4yMDY2IDE4MS4zODMgMjAuODc1QzE4MS4yMzUgMjAuNzQyMSAxODEuMTE4IDIwLjU3ODkgMTgxLjAzOSAyMC4zOTY0QzE4MC45NjEgMjAuMjE0IDE4MC45MjIgMjAuMDE2NiAxODAuOTI3IDE5LjgxOEMxODAuOTI3IDE5LjI3MiAxODEuMTU2IDE4Ljg0NCAxODEuNjI1IDE4LjUxQzE4Mi4xMjEgMTguMTU2IDE4Mi44NjIgMTcuOTc2IDE4My44MjYgMTcuOTc2QzE4NC43OSAxNy45NzYgMTg1LjU4NyAxOC4yMDkgMTg2LjE0OCAxOC42NjhDMTg2LjcwNiAxOS4xMjQgMTg3LjAwNyAxOS43MjUgMTg3LjA3MiAyMC41TDE4Ny4wOTQgMjAuNzgySDE5MS42MzNMMTkxLjYxNyAyMC40NkMxOTEuNTIxIDE4LjQ4NSAxOTAuNzcxIDE2LjkgMTg5LjM4NSAxNS43NUMxODguMDEyIDE0LjYxMiAxODYuMTg1IDE0LjAzMyAxODMuOTYyIDE0LjAzM0MxODIuNDc3IDE0LjAzMyAxODEuMTQxIDE0LjI4NyAxNzkuOTk0IDE0Ljc4NkMxNzguODMxIDE1LjI5MSAxNzcuOTI2IDE1Ljk5NSAxNzcuMjk2IDE2Ljg4MkMxNzYuNjczIDE3Ljc0NTUgMTc2LjMzOCAxOC43ODQgMTc2LjM0MSAxOS44NDlDMTc2LjM0MSAyMS4xNjcgMTc2LjY5OCAyMi4yNDkgMTc3LjM5OSAyMy4wNjRDMTc4LjA2IDIzLjg0MzIgMTc4Ljg5OCAyNC40NTM0IDE3OS44NDIgMjQuODQ0QzE4MC43NDQgMjUuMjE2IDE4MS45MjggMjUuNjA3IDE4My4zNjEgMjZDMTg0LjgwNiAyNi40MSAxODUuODcyIDI2Ljc4NSAxODYuNTMgMjcuMTIzQzE4Ny4xIDI3LjQxNCAxODcuMzc5IDI3Ljg0NSAxODcuMzc5IDI4LjQ0NEMxODcuMzc5IDI5LjA0MiAxODcuMTIyIDI5LjQ2NyAxODYuNTk1IDI5LjgzOUMxODYuMDQzIDMwLjIyNiAxODUuMjM3IDMwLjQyNSAxODQuMjAxIDMwLjQyNUMxODMuMTY2IDMwLjQyNSAxODIuMzk0IDMwLjE3NCAxODEuNzQ5IDI5LjY3NEMxODEuMTEzIDI5LjE4MSAxODAuNzcyIDI4LjU4OSAxODAuNzEgMjcuODY0TDE4MC42ODUgMjcuNTgySDE3Ni4wMTNMMTc2LjAyNSAyNy45MDFDMTc2LjA2NyAyOS4wOTU1IDE3Ni40NzIgMzAuMjQ4NyAxNzcuMTg4IDMxLjIwNkMxNzcuOTA3IDMyLjE4IDE3OC44OTMgMzIuOTU4IDE4MC4xMTggMzMuNTE5QzE4MS4zMzYgMzQuMDc3IDE4Mi43MzIgMzQuMzYyIDE4NC4yNjYgMzQuMzYyQzE4NS44MDEgMzQuMzYyIDE4Ny4xMDkgMzQuMTA4IDE4OC4yMzggMzMuNjA5QzE4OS4zNzYgMzMuMTA0IDE5MC4yNzIgMzIuMzk0IDE5MC45MDEgMzEuNDk0QzE5MS41MzQgMzAuNTkyIDE5MS44NTMgMjkuNTU0IDE5MS44NTMgMjguNDAzQzE5MS44MjggMjcuMTEgMTkxLjQ2NiAyNi4wNTMgMTkwLjc3NyAyNS4yNjJIMTkwLjc4N1oiIGZpbGw9IiM5QjlCOUIiLz4KPHBhdGggZD0iTTI0MS45ODIgMjUuNjU4MlYxNy43MTE3SDIyOC40NDFMMjIwLjQ5NCAyNS42NTgySDI0MS45ODJaIiBmaWxsPSIjOUI5QjlCIi8+CjxwYXRoIGQ9Ik0yNTcuMjM5IDUuOTUwODFIMjQwLjI2NUwyMzIuMjU1IDEzLjg5NzNIMjU3LjIzOVY1Ljk1MDgxWiIgZmlsbD0iIzlCOUI5QiIvPgo8cGF0aCBkPSJNMjEyLjYxMSAzMy42MDQ4TDIxNi42OCAyOS41MzYxSDIzMC40MTJWMzcuNDgyN0gyMTIuNjExVjMzLjYwNDhaIiBmaWxsPSIjOUI5QjlCIi8+CjxwYXRoIGQ9Ik0yMTUuNTk5IDIxLjc4MDNIMjI0LjM3MkwyMzIuMzgyIDEzLjgzMzdIMjE1LjU5OVYyMS43ODAzWiIgZmlsbD0iIzlCOUI5QiIvPgo8cGF0aCBkPSJNMjA2IDMzLjYwNDdIMjEyLjYxMUwyMjAuNDk0IDI1LjY1ODJIMjA2VjMzLjYwNDdaIiBmaWxsPSIjOUI5QjlCIi8+CjxwYXRoIGQ9Ik0yNDAuMjY1IDUuOTUwODFMMjM2LjE5NyAxMC4wMTk0SDIxMC4yNTlWMi4wNzI4OEgyNDAuMjY1VjUuOTUwODFaIiBmaWxsPSIjOUI5QjlCIi8+Cjwvc3ZnPgo=`; var LICENSE_TYPES = { "01": "GRID", "02": "CHARTS", "0102": "BOTH" }; var LICENSING_HELP_URL = "https://www.ag-grid.com/charts/licensing/"; var _LicenseManager = class _LicenseManager { constructor(document2) { this.watermarkMessage = void 0; this.totalMessageLength = 124; this.document = document2; this.md5 = new MD5(); this.md5.init(); } validateLicense() { const licenseDetails = this.getLicenseDetails(_LicenseManager.licenseKey, _LicenseManager.gridContext); const currentLicenseName = `AG ${licenseDetails.currentLicenseType === "BOTH" ? "Grid and " : ""}Charts Enterprise`; let suppliedLicenseName = ""; if (licenseDetails.suppliedLicenseType === "BOTH") { suppliedLicenseName = "AG Grid and AG Charts Enterprise"; } else if (licenseDetails.suppliedLicenseType === "GRID") { suppliedLicenseName = "AG Grid Enterprise"; } else if (licenseDetails.suppliedLicenseType !== void 0) { suppliedLicenseName = "AG Charts Enterprise"; } if (licenseDetails.missing) { if (!this.isWebsiteUrl() || this.isForceWatermark()) { this.outputMissingLicenseKey(currentLicenseName); } } else if (licenseDetails.expired) { const gridReleaseDate = _LicenseManager.getChartsReleaseDate(); const formattedReleaseDate = _LicenseManager.formatDate(gridReleaseDate); this.outputExpiredKey(licenseDetails.expiry, formattedReleaseDate, suppliedLicenseName); } else if (!licenseDetails.valid) { this.outputInvalidLicenseKey( !!licenseDetails.incorrectLicenseType, currentLicenseName, suppliedLicenseName ); } else if (licenseDetails.isTrial && licenseDetails.trialExpired) { this.outputExpiredTrialKey(licenseDetails.expiry, currentLicenseName, suppliedLicenseName); } } static extractExpiry(license) { const restrictionHashed = license.substring(license.lastIndexOf("_") + 1, license.length); return new Date(Number.parseInt(_LicenseManager.decode(restrictionHashed), 10)); } static extractLicenseComponents(licenseKey) { let cleanedLicenseKey = licenseKey.replaceAll(/[\u200B-\u200D\uFEFF]/g, ""); cleanedLicenseKey = cleanedLicenseKey.replaceAll(/\r?\n|\r/g, ""); if (licenseKey.length <= 32) { return { md5: null, license: licenseKey, version: null, isTrial: null }; } const hashStart = cleanedLicenseKey.length - 32; const md5 = cleanedLicenseKey.substring(hashStart); const license = cleanedLicenseKey.substring(0, hashStart); const [version, isTrial, type] = _LicenseManager.extractBracketedInformation(cleanedLicenseKey); return { md5, license, version, isTrial, type }; } getLicenseDetails(licenseKey, gridContext = false) { const currentLicenseType = "CHARTS"; if (missingOrEmpty(licenseKey)) { return { licenseKey, valid: false, missing: true, currentLicenseType }; } const chartsReleaseDate = _LicenseManager.getChartsReleaseDate(); const { md5, license, version, isTrial, type } = _LicenseManager.extractLicenseComponents(licenseKey); let valid = md5 === this.md5.md5(license) && !licenseKey.includes("For_Trialing_ag-Grid_Only"); let trialExpired = void 0; let expired = void 0; let expiry = null; let incorrectLicenseType = false; let suppliedLicenseType = void 0; function handleTrial() { const now = /* @__PURE__ */ new Date(); trialExpired = expiry < now; expired = void 0; } if (valid) { expiry = _LicenseManager.extractExpiry(license); valid = !Number.isNaN(expiry.getTime()); if (valid) { expired = chartsReleaseDate > expiry; switch (version) { case "legacy": case "2": { valid = false; break; } case "3": { if (missingOrEmpty(type)) { valid = false; } else { suppliedLicenseType = type; if (type !== LICENSE_TYPES["02"] && type !== LICENSE_TYPES["0102"]) { valid = false; incorrectLicenseType = true; } else if (isTrial) { handleTrial(); } } } } } } if (!valid) { return { licenseKey, valid, incorrectLicenseType, currentLicenseType, suppliedLicenseType }; } return { licenseKey, valid, expiry: _LicenseManager.formatDate(expiry), expired, version, isTrial, trialExpired, invalidLicenseTypeForCombo: gridContext ? suppliedLicenseType !== "BOTH" : void 0, incorrectLicenseType, currentLicenseType, suppliedLicenseType }; } isDisplayWatermark() { return this.isForceWatermark() || !this.isLocalhost() && !this.isE2ETest() && !this.isWebsiteUrl() && !missingOrEmpty(this.watermarkMessage); } getWatermarkMessage() { return this.watermarkMessage ?? ""; } getWatermarkForegroundConfig() { const message = this.getWatermarkMessage(); if (!message) { return void 0; } return this.buildWatermarkConfig(message); } getWatermarkForegroundConfigForBrowser() { if (!this.isDisplayWatermark()) { return void 0; } const message = this.getWatermarkMessage(); if (!message) { return void 0; } return this.buildWatermarkConfig(message); } buildWatermarkConfig(text2) { return { text: text2, image: { url: WATERMARK_SVG_DATA_URL, width: 170, height: 25, right: 25, bottom: 50, opacity: 0.7 } }; } getHostname() { if (!this.document) { return "localhost"; } const win = this.document.defaultView ?? globalThis; if (!win) { return "localhost"; } try { const hostname = win.location?.hostname ?? ""; return hostname || "localhost"; } catch { return "localhost"; } } isForceWatermark() { if (!this.document) { return false; } const win = this.document?.defaultView ?? globalThis.window != void 0 ? globalThis : void 0; if (!win) { return false; } const pathname = win.location?.pathname; return pathname ? pathname.includes("forceWatermark") : false; } isWebsiteUrl() { const hostname = this.getHostname(); return /^((?:[\w-]+\.)?ag-grid\.com)$/.exec(hostname) !== null; } isLocalhost() { const hostname = this.getHostname(); return /^(?:127\.0\.0\.1|localhost)$/.exec(hostname) !== null; } isE2ETest() { const hostname = this.getHostname(); return /^(?:172\.17\.0\.1|host\.docker\.internal)$/.exec(hostname) !== null; } static formatDate(date2) { const monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ]; const day = date2.getDate(); const monthIndex = date2.getMonth(); const year = date2.getFullYear(); return day + " " + monthNames[monthIndex] + " " + year; } static getChartsReleaseDate() { return new Date(Number.parseInt(_LicenseManager.decode(_LicenseManager.RELEASE_INFORMATION), 10)); } static decode(input) { const keystr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; let t = ""; let n, r, i; let s, o, u, a; let f = 0; const e = input.replaceAll(/[^A-Za-z0-9+/=]/g, ""); while (f < e.length) { s = keystr.indexOf(e.charAt(f++)); o = keystr.indexOf(e.charAt(f++)); u = keystr.indexOf(e.charAt(f++)); a = keystr.indexOf(e.charAt(f++)); n = s << 2 | o >> 4; r = (o & 15) << 4 | u >> 2; i = (u & 3) << 6 | a; t = t + String.fromCodePoint(n); if (u != 64) { t = t + String.fromCodePoint(r); } if (a != 64) { t = t + String.fromCodePoint(i); } } t = _LicenseManager.utf8_decode(t); return t; } static utf8_decode(input) { input = input.replaceAll("rn", "n"); let t = ""; for (let n = 0; n < input.length; n++) { const r = input.codePointAt(n); if (r < 128) { t += String.fromCodePoint(r); } else if (r > 127 && r < 2048) { t += String.fromCodePoint(r >> 6 | 192); t += String.fromCodePoint(r & 63 | 128); } else { t += String.fromCodePoint(r >> 12 | 224); t += String.fromCodePoint(r >> 6 & 63 | 128); t += String.fromCodePoint(r & 63 | 128); } } return t; } static setGridContext(gridContext = false) { _LicenseManager.gridContext = gridContext; } static setLicenseKey(licenseKey) { if (this.licenseKey && this.licenseKey !== licenseKey) { console.warn( `License Key being set multiple times with different values. This can result in an incorrect license key being used.` ); } _LicenseManager.licenseKey = licenseKey; } static extractBracketedInformation(licenseKey) { if (!licenseKey.includes("[")) { return ["legacy", false, void 0]; } const matches = licenseKey.match(/\[(.*?)\]/g).map((match) => match.replace("[", "").replace("]", "")); if (!matches || matches.length === 0) { return ["legacy", false, void 0]; } const isTrial = matches.filter((match) => match === "TRIAL").length === 1; const rawVersion = matches.find((match) => match.startsWith("v")); const version = rawVersion ? rawVersion.replace("v", "") : "legacy"; const type = LICENSE_TYPES[matches.find((match) => LICENSE_TYPES[match])]; return [version, isTrial, type]; } centerPadAndOutput(input) { const paddingRequired = this.totalMessageLength - input.length; console.error(input.padStart(paddingRequired / 2 + input.length, "*").padEnd(this.totalMessageLength, "*")); } padAndOutput(input, padding2 = "*", terminateWithPadding = "") { console.error( input.padEnd(this.totalMessageLength - terminateWithPadding.length, padding2) + terminateWithPadding ); } outputInvalidLicenseKey(incorrectLicenseType, currentLicenseName, suppliedLicenseName) { if (!_LicenseManager.gridContext) { if (incorrectLicenseType) { this.centerPadAndOutput(""); this.centerPadAndOutput(` ${currentLicenseName} License `); this.centerPadAndOutput(" Incompatible License Key "); this.padAndOutput( `* Your license key is for ${suppliedLicenseName} only and does not cover you for ${currentLicenseName}.`, " ", "*" ); this.padAndOutput(`* To troubleshoot your license key visit ${LICENSING_HELP_URL}.`, " ", "*"); this.centerPadAndOutput(""); this.centerPadAndOutput(""); } else { this.centerPadAndOutput(""); this.centerPadAndOutput(` ${currentLicenseName} License `); this.centerPadAndOutput(" Invalid License Key "); this.padAndOutput(`* Your license key is not valid.`, " ", "*"); this.padAndOutput(`* To troubleshoot your license key visit ${LICENSING_HELP_URL}.`, " ", "*"); this.centerPadAndOutput(""); this.centerPadAndOutput(""); } } this.watermarkMessage = "Invalid License"; } outputExpiredTrialKey(formattedExpiryDate, currentLicenseName, suppliedLicenseName) { if (!_LicenseManager.gridContext) { this.centerPadAndOutput(""); this.centerPadAndOutput(` ${currentLicenseName} License `); this.centerPadAndOutput(" Trial Period Expired. "); this.padAndOutput( `* Your trial only license for ${suppliedLicenseName} expired on ${formattedExpiryDate}.`, " ", "*" ); this.padAndOutput("* Please email info@ag-grid.com to purchase a license.", " ", "*"); this.centerPadAndOutput(""); this.centerPadAndOutput(""); } this.watermarkMessage = "Trial Period Expired"; } outputMissingLicenseKey(currentLicenseName) { if (!_LicenseManager.gridContext) { this.centerPadAndOutput(""); this.centerPadAndOutput(` ${currentLicenseName} License `); this.centerPadAndOutput(" License Key Not Found "); this.padAndOutput(`* All ${currentLicenseName} features are unlocked for trial.`, " ", "*"); this.padAndOutput( "* If you want to hide the watermark please email info@ag-grid.com for a trial license key.", " ", "*" ); this.centerPadAndOutput(""); this.centerPadAndOutput(""); } this.watermarkMessage = "For Trial Use Only"; } outputExpiredKey(formattedExpiryDate, formattedReleaseDate, currentLicenseName) { if (!_LicenseManager.gridContext) { this.centerPadAndOutput(""); this.centerPadAndOutput(` ${currentLicenseName} License `); this.centerPadAndOutput(" Incompatible Software Version "); this.padAndOutput( `* Your license key works with versions of ${currentLicenseName} released before ${formattedExpiryDate}.`, " ", "*" ); this.padAndOutput(`* The version you are trying to use was released on ${formattedReleaseDate}.`, " ", "*"); this.padAndOutput("* Please contact info@ag-grid.com to renew your license key.", " ", "*"); this.centerPadAndOutput(""); this.centerPadAndOutput(""); } this.watermarkMessage = "License Expired"; } }; _LicenseManager.RELEASE_INFORMATION = "MTc3MDgwNzY1NDM4MQ=="; _LicenseManager.gridContext = false; var LicenseManager = _LicenseManager; // packages/ag-charts-enterprise/src/license/watermark.ts var import_ag_charts_core4 = require("ag-charts-core"); function injectWatermark(domManager, text2) { const element = domManager.addChild("canvas-overlay", "watermark"); const textElement = (0, import_ag_charts_core4.createElement)("span"); textElement.innerText = text2; element.addEventListener("animationend", () => { domManager.removeChild("canvas-overlay", "watermark"); domManager.removeStyles("watermark"); }); element.classList.add("ag-watermark"); element.appendChild(textElement); } // packages/ag-charts-enterprise/src/styles.css var styles_default = `.ag-watermark{position:absolute;bottom:20px;right:25px;font-weight:700;font-family:Impact,sans-serif;font-size:19px;opacity:.7;animation:1s ease-out 3s ag-watermark-fadeout;color:#9b9b9b;pointer-events:none;&:before{content:"";display:block;height:40px;width:170px;background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjU4IiBoZWlnaHQ9IjQwIiB2aWV3Qm94PSIwIDAgMjU4IDQwIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNMjUuNzc5IDI4LjY1N0gxMy4zNTlMMTEuMTczIDM0LjAxMkg1LjY3Mjk3TDE3LjE4MiA3LjA1OTk5SDIxLjk1M0wzMy40NjIgMzQuMDEySDI3Ljk2MkwyNS43NzYgMjguNjU3SDI1Ljc3OVpNMjQuMDY4IDI0LjM5N0wxOS41ODggMTMuNDM0TDE1LjEwNyAyNC4zOTdIMjQuMDY4Wk02Mi4wOTIgMTguODIzSDQ5LjgxN1YyMy4wODZINTYuNzc1QzU2LjU1NSAyNS4yMjIgNTUuNzU1IDI2LjkyNyA1NC4zNzIgMjguMjAyQzUyLjk4OSAyOS40NzYgNTEuMTY2IDMwLjExNSA0OC45MDkgMzAuMTE1QzQ3LjYyMiAzMC4xMTUgNDYuNDUgMjkuODg1IDQ1LjM5MyAyOS40MjNDNDQuMzU4MyAyOC45NzgxIDQzLjQzMjYgMjguMzEzOCA0Mi42OCAyNy40NzZDNDEuOTI3IDI2LjYzOSA0MS4zNDQgMjUuNjMxIDQwLjkzMSAyNC40NTNDNDAuNTE5IDIzLjI3NSA0MC4zMTEgMjEuOTcgNDAuMzExIDIwLjUzN0M0MC4zMTEgMTkuMTA1IDQwLjUxNiAxNy44IDQwLjkzMSAxNi42MjFDNDEuMzQ0IDE1LjQ0MyA0MS45MjcgMTQuNDM2IDQyLjY4IDEzLjU5OEM0My40Mzc2IDEyLjc1NzcgNDQuMzY5NiAxMi4wOTMyIDQ1LjQxMSAxMS42NTFDNDYuNDc4IDExLjE4OSA0Ny42NTYgMTAuOTYgNDguOTQ2IDEwLjk2QzUxLjYxMiAxMC45NiA1My42MzcgMTEuNjAyIDU1LjAyIDEyLjg4NUw1OC4zIDkuNjA0OTlDNTUuODE3IDcuNjY5OTkgNTIuNjc2IDYuNjk5OTkgNDguODcyIDYuNjk5OTlDNDYuNzYgNi42OTk5OSA0NC44NTMgNy4wMzQ5OSA0My4xNTQgNy43MDA5OUM0MS40NTUgOC4zNjc5OSAzOS45OTggOS4zMDM5OSAzOC43ODMgMTAuNTA0QzM3LjU2NyAxMS43MDcgMzYuNjM0IDEzLjE1OCAzNS45NzcgMTQuODU3QzM1LjMxOSAxNi41NTYgMzQuOTk0IDE4LjQ1MSAzNC45OTQgMjAuNTRDMzQuOTk0IDIyLjYzIDM1LjMyOSAyNC40OTQgMzUuOTk1IDI2LjIwNUMzNi42NjIgMjcuOTE2IDM3LjYwNSAyOS4zNzQgMzguODE3IDMwLjU3N0M0MC4wMzIgMzEuNzggNDEuNDg2IDMyLjcxMyA0My4xODggMzMuMzgzQzQ0Ljg4OCAzNC4wNDkgNDYuNzgyIDM0LjM4NCA0OC44NzIgMzQuMzg0QzUwLjk2MSAzNC4zODQgNTIuNzUgMzQuMDQ5IDU0LjM5IDMzLjM4M0M1Ni4wMzEgMzIuNzE2IDU3LjQyNiAzMS43OCA1OC41NzkgMzAuNTc3QzU5LjczMyAyOS4zNzQgNjAuNjE5IDI3LjkxNiA2MS4yMzkgMjYuMjA1QzYxLjg2IDI0LjQ5NCA2Mi4xNyAyMi42MDUgNjIuMTcgMjAuNTRDNjIuMTY5NiAxOS45Njg4IDYyLjE0NDUgMTkuMzk4IDYyLjA5NSAxOC44MjlMNjIuMDkyIDE4LjgyM1pNMTUxLjgxIDE2Ljk4MUMxNTMuNDEgMTQuNjA5IDE1Ny40MTkgMTQuMzU4IDE1OS4wMjIgMTQuMzU4VjE4LjkxQzE1Ni45NTcgMTguOTEgMTU0Ljk4NSAxOC45OTYgMTUzLjc1NyAxOS44OTJDMTUyLjUyOSAyMC43OTIgMTUxLjkxOSAyMS45ODIgMTUxLjkxOSAyMy40NjRWMzMuOTlIMTQ2Ljk2NFYxNC4zNThIMTUxLjczNkwxNTEuODEgMTYuOTgxWk0xNDMuMDExIDE0LjM2MVYzNC4wMzFIMTM4LjI0TDEzOC4xMzEgMzEuMDQ1QzEzNy40NjYgMzIuMDc2IDEzNi41NTEgMzIuOTIxOSAxMzUuNDcxIDMzLjUwNEMxMzQuMzc2IDM0LjA5OSAxMzMuMDY4IDM0LjM5NiAxMzEuNTM2IDM0LjM5NkMxMzAuMiAzNC4zOTYgMTI4Ljk2MyAzNC4xNTIgMTI3LjgyMiAzMy42NjhDMTI2LjcgMzMuMTk2NCAxMjUuNjg5IDMyLjQ5NSAxMjQuODU1IDMxLjYwOUMxMjQuMDE4IDMwLjcyMiAxMjMuMzU0IDI5LjY2MiAxMjIuODcxIDI4LjQyMkMxMjIuMzg0IDI3LjE4NSAxMjIuMTQyIDI1LjgxMSAxMjIuMTQyIDI0LjMwNEMxMjIuMTQyIDIyLjc5OCAxMjIuMzg0IDIxLjM3OCAxMjIuODcxIDIwLjExNkMxMjMuMzU3IDE4Ljg1NCAxMjQuMDE4IDE3Ljc3MiAxMjQuODU1IDE2Ljg3M0MxMjUuNjg4IDE1Ljk3NjQgMTI2LjY5OCAxNS4yNjM2IDEyNy44MjIgMTQuNzhDMTI4Ljk2MyAxNC4yODEgMTMwLjIwMyAxNC4wMzMgMTMxLjUzNiAxNC4wMzNDMTMzLjA0MyAxNC4wMzMgMTM0LjMzIDE0LjMxOCAxMzUuMzk3IDE0Ljg4OEMxMzYuNDYyIDE1LjQ1ODkgMTM3LjM3NSAxNi4yNzggMTM4LjA1NyAxNy4yNzZWMTQuMzYxSDE0My4wMTFaTTEzMi42MzEgMzAuMTMzQzEzNC4yNTYgMzAuMTMzIDEzNS41NjcgMjkuNTk0IDEzNi41NjUgMjguNTEyQzEzNy41NjEgMjcuNDMgMTM4LjA2IDI1Ljk5MSAxMzguMDYgMjQuMTk2QzEzOC4wNiAyMi40MDEgMTM3LjU2MSAyMC45OSAxMzYuNTY1IDE5Ljg5OUMxMzUuNTcgMTguODA3IDEzNC4yNTkgMTguMjU4IDEzMi42MzEgMTguMjU4QzEzMS4wMDMgMTguMjU4IDEyOS43MjkgMTguODA0IDEyOC43MzQgMTkuODk5QzEyNy43MzggMjAuOTkzIDEyNy4yMzkgMjIuNDM4IDEyNy4yMzkgMjQuMjMzQzEyNy4yMzkgMjYuMDI4IDEyNy43MzUgMjcuNDMzIDEyOC43MzQgMjguNTE1QzEyOS43MjkgMjkuNTk0IDEzMS4wMjggMzAuMTM2IDEzMi42MzEgMzAuMTM2VjMwLjEzM1pNOTMuNjk4IDI3Ljg3NkM5My41Nzk1IDI4LjAwMjUgOTMuNDU2NCAyOC4xMjQ2IDkzLjMyOSAyOC4yNDJDOTEuOTQ3IDI5LjUxNiA5MC4xMjMgMzAuMTU1IDg3Ljg2NiAzMC4xNTVDODYuNTggMzAuMTU1IDg1LjQwOCAyOS45MjYgODQuMzUgMjkuNDY0QzgzLjMxNTUgMjkuMDE4OSA4Mi4zODk4IDI4LjM1NDYgODEuNjM3IDI3LjUxN0M4MC44ODQgMjYuNjc5IDgwLjMwMSAyNS42NzIgNzkuODg5IDI0LjQ5NEM3OS40NzYgMjMuMzE1IDc5LjI2OSAyMi4wMSA3OS4yNjkgMjAuNTc4Qzc5LjI2OSAxOS4xNDUgNzkuNDczIDE3Ljg0IDc5Ljg4OSAxNi42NjJDODAuMzAxIDE1LjQ4NCA4MC44ODQgMTQuNDc2IDgxLjYzNyAxMy42MzlDODIuMzk0OSAxMi43OTg3IDgzLjMyNzMgMTIuMTM0MiA4NC4zNjkgMTEuNjkyQzg1LjQzNiAxMS4yMyA4Ni42MTQgMTEgODcuOTAzIDExQzkwLjU3IDExIDkyLjU5NSAxMS42NDIgOTMuOTc3IDEyLjkyNkw5Ny4yNTggOS42NDQ5OUM5NC43NzQgNy43MTA5OSA5MS42MzMgNi43Mzk5OSA4Ny44MjkgNi43Mzk5OUM4NS43MTggNi43Mzk5OSA4My44MTEgNy4wNzQ5OSA4Mi4xMTIgNy43NDE5OUM4MC40MTMgOC40MDc5OSA3OC45NTYgOS4zNDQ5OSA3Ny43NCAxMC41NDVDNzYuNTI1IDExLjc0NyA3NS41OTIgMTMuMTk5IDc0LjkzNCAxNC44OThDNzQuMjc3IDE2LjU5NyA3My45NTEgMTguNDkxIDczLjk1MSAyMC41ODFDNzMuOTUxIDIyLjY3IDc0LjI4NiAyNC41MzQgNzQuOTUzIDI2LjI0NUM3NS42MTkgMjcuOTU3IDc2LjU2MiAyOS40MTQgNzcuNzc0IDMwLjYxN0M3OC45OSAzMS44MiA4MC40NDQgMzIuNzUzIDgyLjE0NiAzMy40MjNDODMuODQ1IDM0LjA5IDg1LjczOSAzNC40MjQgODcuODI5IDM0LjQyNEM4OS45MTkgMzQuNDI0IDkxLjcwOCAzNC4wOSA5My4zNDggMzMuNDIzQzk0LjcxOCAzMi44NjUgOTUuOTE4IDMyLjEyMSA5Ni45NDggMzEuMTkxQzk3LjE0OSAzMS4wMDggOTcuMzQ4IDMwLjgxNSA5Ny41MzcgMzAuNjJMOTMuNzAxIDI3Ljg4NUw5My42OTggMjcuODc2Wk0xMTAuODAyIDE0LjAxNUMxMDkuMTk5IDE0LjAxNSAxMDYuODM2IDE0LjQ3MSAxMDUuNjExIDE2LjE1OEwxMDUuNTM3IDYuMDE1OTlIMTAwLjc2NVYzMy45MzlIMTA1LjcyVjIyLjY0MUMxMDUuNzcxIDIxLjQ2MDcgMTA2LjI4OCAyMC4zNDg4IDEwNy4xNTcgMTkuNTQ4OUMxMDguMDI3IDE4Ljc0OTEgMTA5LjE3OCAxOC4zMjY2IDExMC4zNTggMTguMzc0QzExMy4zOTcgMTguMzc0IDExNC4yNjggMjEuMTU5IDExNC4yNjggMjIuNjQxVjMzLjkzOUgxMTkuMjIzVjIxLjA1OUMxMTkuMjIzIDIxLjA1OSAxMTkuMTQyIDE0LjAxNSAxMTAuODAyIDE0LjAxNVpNMTczLjc2MyAxNC4zNThIMTY5Ljk5OVY4LjcxNDk5SDE2NS4wNDhWMTQuMzU4SDE2MS4yODRWMTguOTE2SDE2NS4wNDhWMzQuMDAzSDE2OS45OTlWMTguOTE2SDE3My43NjNWMTQuMzU4Wk0xOTAuNzg3IDI1LjI2MkMxOTAuMTI5IDI0LjUwMTQgMTg5LjMwNyAyMy44OTk0IDE4OC4zODQgMjMuNTAxQzE4Ny40ODggMjMuMTE3IDE4Ni4zMzEgMjIuNzMyIDE4NC45NDggMjIuMzY0QzE4NC4xNjUgMjIuMTQzOSAxODMuMzkgMjEuODk3OCAxODIuNjIzIDIxLjYyNkMxODIuMTYzIDIxLjQ2MjEgMTgxLjc0MSAyMS4yMDY2IDE4MS4zODMgMjAuODc1QzE4MS4yMzUgMjAuNzQyMSAxODEuMTE4IDIwLjU3ODkgMTgxLjAzOSAyMC4zOTY0QzE4MC45NjEgMjAuMjE0IDE4MC45MjIgMjAuMDE2NiAxODAuOTI3IDE5LjgxOEMxODAuOTI3IDE5LjI3MiAxODEuMTU2IDE4Ljg0NCAxODEuNjI1IDE4LjUxQzE4Mi4xMjEgMTguMTU2IDE4Mi44NjIgMTcuOTc2IDE4My44MjYgMTcuOTc2QzE4NC43OSAxNy45NzYgMTg1LjU4NyAxOC4yMDkgMTg2LjE0OCAxOC42NjhDMTg2LjcwNiAxOS4xMjQgMTg3LjAwNyAxOS43MjUgMTg3LjA3MiAyMC41TDE4Ny4wOTQgMjAuNzgySDE5MS42MzNMMTkxLjYxNyAyMC40NkMxOTEuNTIxIDE4LjQ4NSAxOTAuNzcxIDE2LjkgMTg5LjM4NSAxNS43NUMxODguMDEyIDE0LjYxMiAxODYuMTg1IDE0LjAzMyAxODMuOTYyIDE0LjAzM0MxODIuNDc3IDE0LjAzMyAxODEuMTQxIDE0LjI4NyAxNzkuOTk0IDE0Ljc4NkMxNzguODMxIDE1LjI5MSAxNzcuOTI2IDE1Ljk5NSAxNzcuMjk2IDE2Ljg4MkMxNzYuNjczIDE3Ljc0NTUgMTc2LjMzOCAxOC43ODQgMTc2LjM0MSAxOS44NDlDMTc2LjM0MSAyMS4xNjcgMTc2LjY5OCAyMi4yNDkgMTc3LjM5OSAyMy4wNjRDMTc4LjA2IDIzLjg0MzIgMTc4Ljg5OCAyNC40NTM0IDE3OS44NDIgMjQuODQ0QzE4MC43NDQgMjUuMjE2IDE4MS45MjggMjUuNjA3IDE4My4zNjEgMjZDMTg0LjgwNiAyNi40MSAxODUuODcyIDI2Ljc4NSAxODYuNTMgMjcuMTIzQzE4Ny4xIDI3LjQxNCAxODcuMzc5IDI3Ljg0NSAxODcuMzc5IDI4LjQ0NEMxODcuMzc5IDI5LjA0MiAxODcuMTIyIDI5LjQ2NyAxODYuNTk1IDI5LjgzOUMxODYuMDQzIDMwLjIyNiAxODUuMjM3IDMwLjQyNSAxODQuMjAxIDMwLjQyNUMxODMuMTY2IDMwLjQyNSAxODIuMzk0IDMwLjE3NCAxODEuNzQ5IDI5LjY3NEMxODEuMTEzIDI5LjE4MSAxODAuNzcyIDI4LjU4OSAxODAuNzEgMjcuODY0TDE4MC42ODUgMjcuNTgySDE3Ni4wMTNMMTc2LjAyNSAyNy45MDFDMTc2LjA2NyAyOS4wOTU1IDE3Ni40NzIgMzAuMjQ4NyAxNzcuMTg4IDMxLjIwNkMxNzcuOTA3IDMyLjE4IDE3OC44OTMgMzIuOTU4IDE4MC4xMTggMzMuNTE5QzE4MS4zMzYgMzQuMDc3IDE4Mi43MzIgMzQuMzYyIDE4NC4yNjYgMzQuMzYyQzE4NS44MDEgMzQuMzYyIDE4Ny4xMDkgMzQuMTA4IDE4OC4yMzggMzMuNjA5QzE4OS4zNzYgMzMuMTA0IDE5MC4yNzIgMzIuMzk0IDE5MC45MDEgMzEuNDk0QzE5MS41MzQgMzAuNTkyIDE5MS44NTMgMjkuNTU0IDE5MS44NTMgMjguNDAzQzE5MS44MjggMjcuMTEgMTkxLjQ2NiAyNi4wNTMgMTkwLjc3NyAyNS4yNjJIMTkwLjc4N1oiIGZpbGw9IiM5QjlCOUIiLz4KPHBhdGggZD0iTTI0MS45ODIgMjUuNjU4MlYxNy43MTE3SDIyOC40NDFMMjIwLjQ5NCAyNS42NTgySDI0MS45ODJaIiBmaWxsPSIjOUI5QjlCIi8+CjxwYXRoIGQ9Ik0yNTcuMjM5IDUuOTUwODFIMjQwLjI2NUwyMzIuMjU1IDEzLjg5NzNIMjU3LjIzOVY1Ljk1MDgxWiIgZmlsbD0iIzlCOUI5QiIvPgo8cGF0aCBkPSJNMjEyLjYxMSAzMy42MDQ4TDIxNi42OCAyOS41MzYxSDIzMC40MTJWMzcuNDgyN0gyMTIuNjExVjMzLjYwNDhaIiBmaWxsPSIjOUI5QjlCIi8+CjxwYXRoIGQ9Ik0yMTUuNTk5IDIxLjc4MDNIMjI0LjM3MkwyMzIuMzgyIDEzLjgzMzdIMjE1LjU5OVYyMS43ODAzWiIgZmlsbD0iIzlCOUI5QiIvPgo8cGF0aCBkPSJNMjA2IDMzLjYwNDdIMjEyLjYxMUwyMjAuNDk0IDI1LjY1ODJIMjA2VjMzLjYwNDdaIiBmaWxsPSIjOUI5QjlCIi8+CjxwYXRoIGQ9Ik0yNDAuMjY1IDUuOTUwODFMMjM2LjE5NyAxMC4wMTk0SDIxMC4yNTlWMi4wNzI4OEgyNDAuMjY1VjUuOTUwODFaIiBmaWxsPSIjOUI5QjlCIi8+Cjwvc3ZnPgo=);background-repeat:no-repeat;background-size:170px 40px}>span{padding-left:.7rem}}@keyframes ag-watermark-fadeout{0%{opacity:.5}to{opacity:0}}.ag-charts-dialog{display:flex;flex-direction:column;font-size:var(--ag-charts-chrome-font-size-large)}.ag-charts-dialog__tabs{display:flex;flex-direction:column}.ag-charts-dialog__header{border-bottom:1px solid var(--ag-charts-border-color);display:flex}.ag-charts-dialog__tab-list{display:flex;gap:calc(var(--ag-charts-spacing) * 2)}.ag-charts-dialog__drag-handle{align-items:center;color:inherit;cursor:grab;display:flex;padding:1px 6px;text-align:center}.ag-charts-dialog__drag-handle--dragging{cursor:grabbing}.ag-charts-dialog__tab-button{background:none;border:0;border-bottom:2px solid transparent;border-radius:0;color:var(--ag-charts-panel-subtle-text-color);margin-bottom:-1px;padding:var(--input-padding) calc(var(--input-padding) / 2)}.ag-charts-dialog__tab-button:hover{background:none}.ag-charts-dialog__tab-button--active{border-color:var(--ag-charts-accent-color);color:inherit}.ag-charts-dialog__drag-handle+.ag-charts-dialog__tab-button{margin-left:calc(var(--ag-charts-spacing) * -2)}.ag-charts-button.ag-charts-dialog__close-button{background:none;border:0;margin-left:auto;padding:1px 6px}.ag-charts-dialog__close-button:focus-visible{outline:var(--ag-charts-focus-border);box-shadow:var(--ag-charts-focus-border-shadow);z-index:calc(var(--ag-charts-layer-ui-overlay) + 1)}.ag-charts-dialog__tab-panel{display:none;flex-direction:column;gap:calc(var(--ag-charts-spacing) * 4);margin:0 calc(var(--ag-charts-spacing) * 4);padding:calc(var(--ag-charts-spacing) * 4) 0}.ag-charts-dialog__tab-panel--active{display:flex}.ag-charts-dialog__input-group-line{display:flex;gap:16px 18px;flex-wrap:wrap}.ag-charts-dialog__input-group{align-items:center;display:flex;font-size:var(--ag-charts-chrome-font-size)}.ag-charts-dialog__input-group-label{color:var(--ag-charts-panel-subtle-text-color);margin-right:5px}.ag-charts-dialog__input-group-label[for]{cursor:pointer}.ag-charts-dialog__button{border-radius:0;margin-right:-1px}.ag-charts-dialog__button.ag-charts-dialog__button--active{background:var(--ag-charts-button-focus-background-color);border-color:var(--ag-charts-input-focus-border-color);color:var(--ag-charts-input-focus-text-color);z-index:var(--input-layer-active)}.ag-charts-dialog__button:first-child,.ag-charts-dialog__input-group-label+.ag-charts-dialog__button{border-bottom-left-radius:var(--ag-charts-input-border-radius);border-top-left-radius:var(--ag-charts-input-border-radius)}.ag-charts-dialog__button:last-child{border-bottom-right-radius:var(--ag-charts-input-border-radius);border-top-right-radius:var(--ag-charts-input-border-radius)}.ag-charts-dialog__color-picker-button{--color: #000;background:var(--color);border:none;color:transparent;height:26px;width:26px}.ag-charts-dialog__color-picker-button:hover{background:var(--color)}.ag-charts-dialog__color-picker-button--multi-color,.ag-charts-dialog__color-picker-button--multi-color:hover{background:linear-gradient(135deg,red 0%,#ff0 calc(100% * 1 / 6),#0f0 calc(100% * 2 / 6),#0ff 50%,#00f calc(100% * 4 / 6),#f0f calc(100% * 5 / 6),red 100%)}.ag-charts-color-picker{width:190px;padding:8px;cursor:default;--h: 0;--s: 0;--v: 0;--a: 0;--color: #000;--color-a: #000;--thumb-size: 18px;--inner-width: 172px;--track-height: 12px;--palette-height: 136px;--checker: url('data:image/svg+xml;utf8,');--multi-color: linear-gradient( 135deg, #f00 0% , #ff0 calc(100% * 1 / 6), #0f0 calc(100% * 2 / 6), #0ff 50% , #00f calc(100% * 4 / 6), #f0f calc(100% * 5 / 6), #f00 100% )}.ag-charts-color-picker__content{display:flex;flex-direction:column}.ag-charts-color-picker__palette{position:relative;width:100%;height:var(--palette-height);margin-bottom:8px;background:linear-gradient(to bottom,#0000,#000),linear-gradient(to right,#fff,#fff0) hsl(var(--h),100%,50%);border-radius:calc(var(--ag-charts-border-radius) * 1.5);box-shadow:inset 0 0 0 1px #0003}.ag-charts-color-picker__palette:after{content:"";position:absolute;display:block;top:calc(var(--thumb-size) * -.5 + (1 - var(--v)) * 100%);left:calc(var(--thumb-size) * -.5 + var(--s) * 100%);background:var(--color);width:var(--thumb-size);height:var(--thumb-size);border-radius:calc(var(--ag-charts-border-radius) * 99);box-shadow:var(--box-shadow);--box-shadow: inset 0 0 0 3px white, inset 0 0 1px 3px #0006, 0 0 5px #00000038}.ag-charts-color-picker__palette:focus-visible:after{outline:var(--ag-charts-focus-border);box-shadow:var(--box-shadow),0 0 0 2px #fff8,var(--ag-charts-focus-border-shadow)}.ag-charts-color-picker__color-row{display:flex;gap:8px;align-items:center;margin-bottom:4px;--inset: calc((var(--thumb-size) - var(--track-height)) / 2)}.ag-charts-color-picker__hue-input,.ag-charts-color-picker__alpha-input{-webkit-appearance:none;display:block;position:relative;padding:0;margin:0 calc(var(--inset) * -1);border:0;height:var(--thumb-size);width:auto;background:transparent;--inset: calc((var(--thumb-size) - var(--track-height)) / 2)}.ag-charts-color-picker__hue-input::-moz-range-thumb,.ag-charts-color-picker__alpha-input::-moz-range-thumb{appearance:none;width:var(--thumb-size);height:var(--thumb-size);border-radius:calc(var(--ag-charts-border-radius) * 99);box-shadow:var(--box-shadow);--box-shadow: inset 0 0 0 3px white, inset 0 0 1px 3px #0006, 0 0 5px #00000038}.ag-charts-color-picker__hue-input::-webkit-slider-thumb,.ag-charts-color-picker__alpha-input::-webkit-slider-thumb{-webkit-appearance:none;width:var(--thumb-size);height:var(--thumb-size);border-radius:calc(var(--ag-charts-border-radius) * 99);box-shadow:var(--box-shadow);--box-shadow: inset 0 0 0 3px white, inset 0 0 1px 3px #0006, 0 0 5px #00000038;transform:translateZ(0)}.ag-charts-color-picker__hue-input::-moz-range-thumb{background:hsl(var(--h),100%,50%)}.ag-charts-color-picker__hue-input::-webkit-slider-thumb{background:hsl(var(--h),100%,50%)}.ag-charts-color-picker__alpha-input::-moz-range-thumb{background:transparent}.ag-charts-color-picker__alpha-input::-webkit-slider-thumb{background:transparent}.ag-charts-color-picker__alpha-input--opaque::-moz-range-thumb{background:var(--color)}.ag-charts-color-picker__alpha-input--opaque::-webkit-slider-thumb{background:var(--color)}.ag-charts-color-picker__hue-input:focus-visible::-moz-range-thumb,.ag-charts-color-picker__alpha-input:focus-visible::-moz-range-thumb{outline:var(--ag-charts-focus-border);box-shadow:var(--box-shadow),var(--ag-charts-focus-border-shadow)}.ag-charts-color-picker__hue-input:focus-visible::-webkit-slider-thumb,.ag-charts-color-picker__alpha-input:focus-visible::-webkit-slider-thumb{outline:var(--ag-charts-focus-border);box-shadow:var(--box-shadow),var(--ag-charts-focus-border-shadow)}.ag-charts-color-picker__hue-input::-moz-range-track,.ag-charts-color-picker__alpha-input::-moz-range-track{position:absolute;content:"";display:block;top:calc(50% - var(--track-height) / 2);left:var(--inset);right:var(--inset);height:var(--track-height);border-radius:calc(var(--ag-charts-border-radius) * 99);box-shadow:inset 0 0 0 1px #0003}.ag-charts-color-picker__hue-input:before,.ag-charts-color-picker__alpha-input:before{position:absolute;content:"";display:block;top:calc(50% - var(--track-height) / 2);left:var(--inset);right:var(--inset);height:var(--track-height);border-radius:calc(var(--ag-charts-border-radius) * 99);box-shadow:inset 0 0 0 1px #0003}.ag-charts-color-picker__multi-color-button{width:36px;margin-left:var(--inset);height:var(--track-height);border-radius:calc(var(--ag-charts-border-radius) * 99);border:0;background:var(--multi-color);box-shadow:inset 0 0 0 1px #0003}.ag-charts-color-picker__multi-color-button--hidden{display:none}.ag-charts-color-picker__multi-color-button--active{box-shadow:inset 0 0 0 1px #0003;outline-offset:1px;outline:2px solid #2196f3}.ag-charts-color-picker__hue-input{flex:1 0 0}.ag-charts-color-picker__hue-input::-moz-range-track{background:linear-gradient(to right,red,red calc((100% - var(--track-height)) * 0 / 6 + var(--track-height) / 2),#ff0 calc((100% - var(--track-height)) * 1 / 6 + var(--track-height) / 2),#0f0 calc((100% - var(--track-height)) * 2 / 6 + var(--track-height) / 2),#0ff calc((100% - var(--track-height)) * 3 / 6 + var(--track-height) / 2),#00f calc((100% - var(--track-height)) * 4 / 6 + var(--track-height) / 2),#f0f calc((100% - var(--track-height)) * 5 / 6 + var(--track-height) / 2),red calc((100% - var(--track-height)) * 6 / 6 + var(--track-height) / 2))}.ag-charts-color-picker__hue-input:before{background:linear-gradient(to right,red,red calc((100% - var(--track-height)) * 0 / 6 + var(--track-height) / 2),#ff0 calc((100% - var(--track-height)) * 1 / 6 + var(--track-height) / 2),#0f0 calc((100% - var(--track-height)) * 2 / 6 + var(--track-height) / 2),#0ff calc((100% - var(--track-height)) * 3 / 6 + var(--track-height) / 2),#00f calc((100% - var(--track-height)) * 4 / 6 + var(--track-height) / 2),#f0f calc((100% - var(--track-height)) * 5 / 6 + var(--track-height) / 2),red calc((100% - var(--track-height)) * 6 / 6 + var(--track-height) / 2))}.ag-charts-color-picker__alpha-input{margin-bottom:7px}.ag-charts-color-picker__alpha-input::-moz-range-track{background:linear-gradient(to right,transparent,var(--color)),var(--checker) top left / 4px 4px}.ag-charts-color-picker__alpha-input:before{background:linear-gradient(to right,transparent,var(--color)),var(--checker) top left / 4px 4px}.ag-charts-color-picker__color-field{display:flex;border:var(--ag-charts-border);background:var(--ag-charts-background-color);border-radius:var(--ag-charts-border-radius);overflow:hidden}.ag-charts-color-picker__color-field:has(:focus-visible){border-color:var(--ag-charts-accent-color);box-shadow:var(--ag-charts-focus-border-shadow)}.ag-charts-color-picker__color-label{width:16px;height:16px;margin:7px 0 7px 7px;color:transparent;background:linear-gradient(to right,var(--color-a),var(--color-a)),var(--checker) top left / 4px 4px;border-radius:calc(var(--ag-charts-border-radius) / 2);box-shadow:inset 0 0 0 1px #0003}.ag-charts-color-picker__color-label--multi-color{background:var(--multi-color)}.ag-charts-color-picker__color-input{flex:1;min-width:0;padding:7px 7px 7px 8px;border:0;margin:0;color:inherit;background:transparent;font-variant:tabular-nums}.ag-charts-color-picker__color-input:focus-visible{border:none;outline:none}.ag-charts-annotations__line-stroke-width-menu,.ag-charts-annotations__line-style-type-menu,.ag-charts-annotations__text-size-menu{border-top-left-radius:0;border-top-right-radius:0;.ag-charts-menu__row:first-child{border-radius:0}}.ag-charts-annotations__text-size-menu{--item-padding: 4px 8px;min-width:34px;text-align:center}.ag-charts-annotations__line-stroke-width-menu{--item-padding: 6px;column-gap:6px}.ag-charts-annotations__line-style-type-menu{--item-padding: 6px;column-gap:0}.ag-charts-annotations__stroke-width-button:before{background:var(--ag-charts-foreground-color);content:"";margin-right:var(--toolbar-button-padding);height:min(var(--stroke-width),20px);width:12px}.ag-charts-annotations__stroke-width-button[aria-disabled=true]:before{filter:grayscale(1);opacity:.5}.ag-charts-annotations__color-picker-button{--emblem: var(--color)}.ag-charts-annotations__color-picker-button--multi-color{--emblem: linear-gradient( to right, #f00 0% , #ff0 calc(100% * 1 / 6), #0f0 calc(100% * 2 / 6), #0ff 50% , #00f calc(100% * 4 / 6), #f0f calc(100% * 5 / 6), #f00 100% )}.ag-charts-annotations__color-picker-button:after{content:"";display:block;position:absolute;bottom:3px;left:5px;right:5px;height:4px;border-radius:99px;box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--ag-charts-foreground-color) 10%,transparent);background:var(--emblem)}.ag-charts-annotations__color-picker-button[aria-disabled=true]:after{filter:grayscale(1);opacity:.5}.ag-charts-annotations__toolbar-menu{min-width:200px}.ag-charts-annotations__axis-button--hidden{display:none}.ag-charts-annotations__axis-button{background-color:var(--ag-charts-crosshair-label-background-color);border-radius:calc(var(--ag-charts-border-radius) / 2);border:none;box-sizing:border-box;color:var(--ag-charts-crosshair-label-text-color);cursor:pointer;font-family:var(--ag-charts-button-font-family);font-size:var(--ag-charts-button-font-size);font-weight:var(--ag-charts-button-font-weight);left:0;line-height:16px;overflow:hidden;padding:0;position:absolute;top:0;user-select:none;white-space:nowrap;z-index:var(--ag-charts-layer-annotations)}.ag-charts-annotations__axis-button:hover{opacity:.8;color:var(--ag-charts-background-color)}.ag-charts-dialog--annotation-settings{min-height:233px;width:289px}.ag-charts-dialog--annotation-settings .ag-charts-textarea{height:calc(10px * 2 + var(--textarea-line-height) * 1em * 3 + 2px);overflow-y:auto;resize:vertical}.ag-charts-context-menu{font-family:var(--ag-charts-chrome-font-family);font-size:var(--ag-charts-chrome-font-size);font-weight:var(--ag-charts-chrome-font-weight);z-index:var(--ag-charts-layer-ui-overlay)}.ag-charts-context-menu__cover{position:fixed;left:0;top:0}.ag-charts-context-menu__menu{background:var(--ag-charts-menu-background-color);border-radius:var(--ag-charts-border-radius);border:var(--ag-charts-menu-border);box-shadow:var(--ag-charts-popup-shadow);color:var(--ag-charts-menu-text-color);display:flex;flex-direction:column;padding:.5em 0;transition:transform .1s ease;white-space:nowrap}.ag-charts-context-menu__menu:focus{outline:none}.ag-charts-context-menu__item{align-items:center;background:none;border:none;box-sizing:border-box;color:inherit;cursor:pointer;display:flex;font:inherit;justify-content:space-between;text-align:left;width:100%;-webkit-appearance:none;-moz-appearance:none}.ag-charts-context-menu__icon>img{width:var(--ag-charts-icon-size);height:var(--ag-charts-icon-size)}.ag-charts-context-menu__icon,.ag-charts-context-menu__cell{display:flex;align-items:center;flex-shrink:0}.ag-charts-context-menu__cell{flex-grow:1}.ag-charts-context-menu__cellpadding{padding:.5em 1em}.ag-charts-context-menu__icon{padding-right:0}.ag-charts-context-menu__item[data-focus-override=true],.ag-charts-context-menu__item:focus,.ag-charts-context-menu__item:active{background:var(--ag-charts-focus-color)}.ag-charts-context-menu__item[data-focus-override=false]{background:inherit}.ag-charts-context-menu__item[data-focus-visible-override=true]:focus,.ag-charts-context-menu__item:focus-visible{outline:var(--ag-charts-focus-border);box-shadow:var(--ag-charts-focus-border-shadow);z-index:calc(var(--ag-charts-layer-ui-overlay) + 1)}.ag-charts-context-menu__item[data-focus-visible-override=false]{outline:inherit;box-shadow:inherit;z-index:inherit}.ag-charts-context-menu__item[aria-disabled=true]{border:none;color:color-mix(in srgb,var(--ag-charts-input-text-color) 50%,transparent)}.ag-charts-context-menu__item[aria-disabled=true]:focus{background:inherit;cursor:inherit}.ag-charts-context-menu__divider{padding:5px 0}.ag-charts-context-menu__divider:after{content:"";display:block;border-top:1px solid var(--ag-charts-border-color)}.ag-charts-crosshair-label{position:absolute;left:0;top:0;user-select:none;pointer-events:none;font-family:var(--ag-charts-font-family);font-size:var(--ag-charts-font-size);font-weight:var(--ag-charts-font-weight);overflow:hidden;white-space:nowrap;z-index:var(--ag-charts-layer-crosshair);box-sizing:border-box}.ag-charts-crosshair-label-content{padding:0 8px;border-radius:calc(var(--ag-charts-border-radius) / 2);line-height:calc(var(--ag-charts-font-size) + 8px);background-color:var(--ag-charts-crosshair-label-background-color);color:var(--ag-charts-crosshair-label-text-color)}.ag-charts-crosshair-label--hidden{visibility:hidden!important}.ag-charts-text-input{position:absolute}.ag-charts-text-input__textarea{--placeholder-text-color: var(--ag-charts-input-placeholder-text-color);display:block;height:100%;width:100%;border:0;background:none;line-height:1.38;outline:none;transform:translateY(.09em)}.ag-charts-text-input__textarea[placeholder]:empty:before{content:attr(placeholder);color:var(--placeholder-text-color);font-weight:400}.ag-charts-text-input__textarea[placeholder]:not(:empty):before{content:""}.ag-charts-chart-toolbar__menu{min-width:200px}.ag-charts-range-buttons .ag-charts-toolbar__button{padding:var(--toolbar-button-padding) calc(var(--toolbar-button-padding) * 1.5)}.ag-charts-zoom-buttons{align-items:center;display:flex;height:44px;justify-content:center;overflow:hidden;padding-bottom:10px;pointer-events:none;width:100%;.ag-charts-toolbar{--toolbar-size: 24px;--toolbar-button-padding: 1px;display:flex;font-size:var(--ag-charts-chrome-font-size);height:var(--toolbar-size);justify-content:center;opacity:1;pointer-events:auto;transition:opacity .2s ease-in-out,transform .4s ease-in-out;.ag-charts-toolbar__button--first{border-bottom-left-radius:var(--ag-charts-border-radius);border-top-left-radius:var(--ag-charts-border-radius)}.ag-charts-toolbar__button--last{border-bottom-right-radius:var(--ag-charts-border-radius);border-top-right-radius:var(--ag-charts-border-radius)}.ag-charts-toolbar__label{padding-left:var(--ag-charts-spacing);padding-right:var(--ag-charts-spacing)}.ag-charts-toolbar__icon+.ag-charts-toolbar__label{padding-left:0}.ag-charts-toolbar__button--gap{margin-left:var(--toolbar-gap)}&.ag-charts-zoom-buttons__toolbar--hidden{opacity:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out}}}.ag-charts-shared-toolbar{gap:var(--toolbar-gap);.ag-charts-toolbar__button{border-radius:var(--ag-charts-border-radius);margin:0}.ag-charts-toolbar__button--active+.ag-charts-toolbar__button{border-left-color:var(--ag-charts-border-color)}} `; // packages/ag-charts-types/src/chart/navigatorOptions.ts var __MINI_CHART_SERIES_OPTIONS = void 0; var __VERIFY_MINI_CHART_SERIES_OPTIONS = void 0; __VERIFY_MINI_CHART_SERIES_OPTIONS = __MINI_CHART_SERIES_OPTIONS; // packages/ag-charts-types/src/chart/themeOptions.ts var __THEME_OVERRIDES = void 0; var __VERIFY_THEME_OVERRIDES = void 0; __VERIFY_THEME_OVERRIDES = __THEME_OVERRIDES; // packages/ag-charts-types/src/chart/tooltipOptions.ts var AgTooltipAnchorToType = /* @__PURE__ */ ((AgTooltipAnchorToType2) => { AgTooltipAnchorToType2["POINTER"] = "pointer"; AgTooltipAnchorToType2["NODE"] = "node"; AgTooltipAnchorToType2["CHART"] = "chart"; return AgTooltipAnchorToType2; })(AgTooltipAnchorToType || {}); var AgTooltipPlacementType = /* @__PURE__ */ ((AgTooltipPlacementType2) => { AgTooltipPlacementType2["TOP"] = "top"; AgTooltipPlacementType2["RIGHT"] = "right"; AgTooltipPlacementType2["BOTTOM"] = "bottom"; AgTooltipPlacementType2["LEFT"] = "left"; AgTooltipPlacementType2["TOP_RIGHT"] = "top-right"; AgTooltipPlacementType2["BOTTOM_RIGHT"] = "bottom-right"; AgTooltipPlacementType2["BOTTOM_LEFT"] = "bottom-left"; AgTooltipPlacementType2["TOP_LEFT"] = "top-left"; AgTooltipPlacementType2["CENTER"] = "center"; return AgTooltipPlacementType2; })(AgTooltipPlacementType || {}); // packages/ag-charts-types/src/presets/gauge/commonOptions.ts var __THEMEABLE_OPTIONS = void 0; var __VERIFY_THEMEABLE_OPTIONS = void 0; __VERIFY_THEMEABLE_OPTIONS = __THEMEABLE_OPTIONS; var __AXIS_LABEL_OPTIONS = void 0; var __VERIFY_AXIS_LABEL_OPTIONS = void 0; __VERIFY_AXIS_LABEL_OPTIONS = __AXIS_LABEL_OPTIONS; // packages/ag-charts-enterprise/src/main.ts __reExport(main_exports, require("ag-charts-community"), module.exports); // packages/ag-charts-enterprise/src/axes/angle-category/angleCategoryAxisModule.ts var import_ag_charts_community9 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/axes/angle-category/angleCategoryAxis.ts var import_ag_charts_community8 = require("ag-charts-community"); var import_ag_charts_core9 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/utils/polar.ts function walkPairsOutward(items, step, visitPair) { const middleIndex = Math.floor(items.length / 2); return walkPairsByStep(items, step, middleIndex, step, visitPair) || walkPairsByStep(items, items.length - step, middleIndex, -step, visitPair); } function walkPairsByStep(items, startIndex, endIndex, step, visitPair) { let previous = items[0]; for (let i = startIndex; step > 0 ? i <= endIndex : i > endIndex; i += step) { const current = items[i]; if (visitPair(previous, current)) { return true; } previous = current; } return false; } // packages/ag-charts-enterprise/src/axes/angle-number/angleAxisInterval.ts var import_ag_charts_community4 = require("ag-charts-community"); var import_ag_charts_core5 = require("ag-charts-core"); var { AxisInterval } = import_ag_charts_community4._ModuleSupport; var AngleAxisInterval = class extends AxisInterval { }; __decorateClass([ import_ag_charts_core5.Property ], AngleAxisInterval.prototype, "minSpacing", 2); // packages/ag-charts-enterprise/src/axes/angle/angleAxis.ts var import_ag_charts_community7 = require("ag-charts-community"); var import_ag_charts_core8 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/axes/polar-crosslines/angleCrossLine.ts var import_ag_charts_community6 = require("ag-charts-community"); var import_ag_charts_core7 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/axes/polar-crosslines/polarCrossLine.ts var import_ag_charts_community5 = require("ag-charts-community"); var import_ag_charts_core6 = require("ag-charts-core"); var { Group, LabelStyle } = import_ag_charts_community5._ModuleSupport; var PolarCrossLineLabel = class extends LabelStyle { constructor() { super(...arguments); this.padding = 5; } }; __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLineLabel.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLineLabel.prototype, "padding", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLineLabel.prototype, "text", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLineLabel.prototype, "parallel", 2); var PolarCrossLine = class extends import_ag_charts_core6.BaseProperties { constructor() { super(...arguments); this.id = (0, import_ag_charts_core6.createId)(this); this.defaultColorRange = []; this.shape = "polygon"; this.label = new PolarCrossLineLabel(); this.scale = void 0; this.clippedRange = [-Infinity, Infinity]; this.gridLength = 0; this.sideFlag = -1; this.parallelFlipRotation = 0; this.regularFlipRotation = 0; this.direction = import_ag_charts_core6.ChartAxisDirection.Angle; this.axisInnerRadius = 0; this.axisOuterRadius = 0; this.lineGroup = new Group({ name: this.id }); this.rangeGroup = new Group({ name: this.id }); this.labelGroup = new Group({ name: this.id }); this._isRange = void 0; } assignCrossLineGroup(isRange, crossLineRange) { if (isRange !== this._isRange) { if (isRange) { this.rangeGroup.appendChild(crossLineRange); } else { this.lineGroup.appendChild(crossLineRange); } } this._isRange = isRange; } setSectorNodeProps(node) { node.fill = this.fill; node.fillOpacity = this.fillOpacity ?? 1; node.stroke = this.stroke; node.strokeOpacity = this.strokeOpacity ?? 1; node.strokeWidth = this.strokeWidth ?? 1; node.lineDash = this.lineDash; } setLabelNodeProps(node, x, y, baseline, rotation) { const { label } = this; node.x = x; node.y = y; node.text = label.text; node.textAlign = "center"; node.textBaseline = baseline; node.rotation = rotation; node.rotationCenterX = x; node.rotationCenterY = y; node.fill = label.color; node.setFont(label); node.setBoxing(label); node.visible = true; } }; PolarCrossLine.className = "PolarCrossLine"; __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "type", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "range", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "value", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "defaultColorRange", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "fill", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "shape", 2); __decorateClass([ import_ag_charts_core6.Property ], PolarCrossLine.prototype, "label", 2); // packages/ag-charts-enterprise/src/axes/polar-crosslines/angleCrossLine.ts var { getCrossLineValue, validateCrossLineValue, Group: Group2, Path, Sector, RotatableText, ContinuousScale } = import_ag_charts_community6._ModuleSupport; var AngleCrossLine = class extends PolarCrossLine { constructor() { super(); this.direction = import_ag_charts_core7.ChartAxisDirection.Angle; this.polygonNode = new Path(); this.sectorNode = new Sector(); this.lineNode = new Path(); this.crossLineRange = new Group2(); this.labelNode = new RotatableText(); this.ticks = []; this.crossLineRange.append(this.polygonNode); this.crossLineRange.append(this.sectorNode); this.crossLineRange.append(this.lineNode); this.labelGroup.append(this.labelNode); } visibilityCheck() { if (!ContinuousScale.is(this.scale)) { return true; } const [d0, d1] = this.scale.domain; const value = getCrossLineValue(this); if (this.type === "range") { const [start, end] = value; return start >= d0 && start <= d1 && end >= start && end <= d1; } else { return value >= d0 && value <= d1; } } update(visible) { const { scale } = this; if (!scale || !validateCrossLineValue(this, scale) || !this.visibilityCheck()) { this.rangeGroup.visible = false; this.lineGroup.visible = false; this.labelGroup.visible = false; return; } this.rangeGroup.visible = visible; this.lineGroup.visible = visible; this.labelGroup.visible = visible; this.updateLineNode(visible); this.updatePolygonNode(visible); this.updateSectorNode(visible); this.updateLabelNode(visible); } updateLineNode(visible) { const { scale, type, value, lineNode: line } = this; if (!visible || type !== "line" || !scale) { line.visible = false; return; } const angle = scale.convert(value); if (Number.isNaN(angle)) { line.visible = false; return; } const { axisInnerRadius, axisOuterRadius } = this; line.visible = true; line.stroke = this.stroke; line.strokeOpacity = this.strokeOpacity ?? 1; line.strokeWidth = this.strokeWidth ?? 1; line.fill = void 0; line.lineDash = this.lineDash; const x = axisOuterRadius * Math.cos(angle); const y = axisOuterRadius * Math.sin(angle); const x0 = axisInnerRadius * Math.cos(angle); const y0 = axisInnerRadius * Math.sin(angle); line.path.clear(true); line.path.moveTo(x0, y0); line.path.lineTo(x, y); this.assignCrossLineGroup(false, this.crossLineRange); } updatePolygonNode(visible) { const { polygonNode: polygon, range: range2, scale, shape, type, ticks } = this; if (!visible || type !== "range" || shape !== "polygon" || !scale || !range2) { polygon.visible = false; return; } const { axisInnerRadius, axisOuterRadius } = this; const startIndex = ticks.indexOf(range2[0]); const endIndex = ticks.indexOf(range2[1]); const stops = startIndex <= endIndex ? ticks.slice(startIndex, endIndex + 1) : ticks.slice(startIndex).concat(ticks.slice(0, endIndex + 1)); const angles = stops.map((value) => scale.convert(value)); polygon.visible = true; this.setSectorNodeProps(polygon); const { path } = polygon; path.clear(true); for (const [index, angle] of angles.entries()) { const x = axisOuterRadius * Math.cos(angle); const y = axisOuterRadius * Math.sin(angle); if (index === 0) { path.moveTo(x, y); } else { path.lineTo(x, y); } } if (axisInnerRadius === 0) { path.lineTo(0, 0); } else { const reversedAngles = angles.slice().reverse(); for (const angle of reversedAngles) { const x = axisInnerRadius * Math.cos(angle); const y = axisInnerRadius * Math.sin(angle); path.lineTo(x, y); } } polygon.path.closePath(); this.assignCrossLineGroup(true, this.crossLineRange); } updateSectorNode(visible) { const { sectorNode: sector, range: range2, scale, shape, type } = this; if (!visible || type !== "range" || shape !== "circle" || !scale || !range2) { sector.visible = false; return; } const { axisInnerRadius, axisOuterRadius } = this; const angles = range2.map((value) => scale.convert(value)); const step = scale.step ?? 0; const padding2 = scale instanceof import_ag_charts_community6._ModuleSupport.BandScale ? step / 2 : 0; sector.visible = true; this.setSectorNodeProps(sector); sector.centerX = 0; sector.centerY = 0; sector.innerRadius = axisInnerRadius; sector.outerRadius = axisOuterRadius; sector.startAngle = angles[0] - padding2; sector.endAngle = angles[1] + padding2; this.assignCrossLineGroup(true, this.crossLineRange); } updateLabelNode(visible) { const { label, labelNode: node, range: range2, scale, type, ticks } = this; if (!visible || label.enabled === false || !label.text || !scale || type === "range" && !range2) { node.visible = false; return; } node.visible = true; const { axisInnerRadius, axisOuterRadius } = this; let labelX; let labelY; let rotation; let textBaseline; if (type === "line") { const angle = (0, import_ag_charts_core7.normalizeAngle360)(scale.convert(this.value)); const angle270 = 1.5 * Math.PI; const isRightSide = (0, import_ag_charts_core7.isNumberEqual)(angle, angle270) || angle > angle270 || angle < Math.PI / 2; const midX = (axisInnerRadius + axisOuterRadius) / 2 * Math.cos(angle); const midY = (axisInnerRadius + axisOuterRadius) / 2 * Math.sin(angle); labelX = midX + label.padding * Math.cos(angle + Math.PI / 2); labelY = midY + label.padding * Math.sin(angle + Math.PI / 2); textBaseline = isRightSide ? "top" : "bottom"; rotation = isRightSide ? angle : angle - Math.PI; } else { const [startAngle, endAngle] = range2.map((value) => (0, import_ag_charts_core7.normalizeAngle360)(scale.convert(value))); let angle = (startAngle + endAngle) / 2; if (startAngle > endAngle) { angle -= Math.PI; } angle = (0, import_ag_charts_core7.normalizeAngle360)(angle); const isBottomSide = ((0, import_ag_charts_core7.isNumberEqual)(angle, 0) || angle > 0) && angle < Math.PI; let distance; if (this.shape === "circle" || ticks.length < 3) { distance = axisOuterRadius - label.padding; } else { distance = axisOuterRadius * Math.cos(Math.PI / ticks.length) - label.padding; } labelX = distance * Math.cos(angle); labelY = distance * Math.sin(angle); textBaseline = isBottomSide ? "bottom" : "top"; rotation = isBottomSide ? angle - Math.PI / 2 : angle + Math.PI / 2; } this.setLabelNodeProps(node, labelX, labelY, textBaseline, rotation); } }; AngleCrossLine.className = "AngleCrossLine"; // packages/ag-charts-enterprise/src/axes/angle/angleAxis.ts var { Path: Path2, RotatableText: RotatableText2, Transformable, BBox, Selection, Line } = import_ag_charts_community7._ModuleSupport; var AngleAxisLabel = class extends import_ag_charts_community7._ModuleSupport.AxisLabel { constructor() { super(...arguments); this.orientation = "fixed"; } }; __decorateClass([ import_ag_charts_core8.Property ], AngleAxisLabel.prototype, "orientation", 2); var AngleAxis = class extends import_ag_charts_community7._ModuleSupport.PolarAxis { constructor(moduleCtx, scale) { super(moduleCtx, scale); this.startAngle = 0; this.endAngle = void 0; this.tickLineGroupSelection = Selection.select( this.tickLineGroup, Line, false ); this.gridLineGroupSelection = Selection.select( this.gridLineGroup, Line, false ); this.labelData = []; this.tickData = []; this.radiusLineGroup = this.axisGroup.appendChild(new import_ag_charts_community7._ModuleSupport.TransformableGroup()); this.radiusLine = this.radiusLineGroup.appendChild(new Path2()); this.includeInvisibleDomains = true; } get direction() { return import_ag_charts_core8.ChartAxisDirection.Angle; } createLabel() { return new AngleAxisLabel(); } calculateRotations() { const rotation = (0, import_ag_charts_core8.toRadians)(this.startAngle); const parallelFlipRotation = (0, import_ag_charts_core8.normalizeAngle360)(rotation); const regularFlipRotation = (0, import_ag_charts_core8.normalizeAngle360)(rotation - Math.PI / 2); return { rotation, parallelFlipRotation, regularFlipRotation }; } calculateTickLayout(domain) { const { nice, scale } = this; const ticksParams = { nice: [nice, nice], interval: void 0, tickCount: void 0, minTickCount: 0, maxTickCount: Infinity }; const niceDomain = nice ? scale.niceDomain(ticksParams, domain) : domain; const tickData = this.generateAngleTicks(niceDomain); this.tickData = tickData; const ticks = tickData.map((t) => t.value); const fractionDigits = ticks.reduce( (f, t) => Math.max(typeof t === "number" ? (0, import_ag_charts_core8.countFractionDigits)(t) : 0, f), 0 ); return { niceDomain, tickDomain: niceDomain, ticks, rawTickCount: void 0, fractionDigits, timeInterval: void 0, bbox: this.getBBox() }; } update() { super.update(); this.updateRadiusLine(); this.updateGridLines(); this.updateTickLines(); } normalizedAngles() { const startAngle = (0, import_ag_charts_core8.normalizeAngle360)(-Math.PI / 2 + (0, import_ag_charts_core8.toRadians)(this.startAngle)); const sweep = this.endAngle == null ? 2 * Math.PI : (0, import_ag_charts_core8.normalizeAngle360Inclusive)((0, import_ag_charts_core8.toRadians)(this.endAngle) - (0, import_ag_charts_core8.toRadians)(this.startAngle)); const endAngle = startAngle + sweep; return [startAngle, endAngle]; } computeRange() { this.range = this.normalizedAngles(); } updateSelections() { const data = this.tickData; this.gridLineGroupSelection.update(this.gridLength && this.gridLine.enabled ? data : []); this.tickLineGroupSelection.update(this.tick.enabled ? data : []); this.tickLabelGroupSelection.update(this.label.enabled ? data : []); this.gridLineGroupSelection.cleanup(); this.tickLineGroupSelection.cleanup(); this.tickLabelGroupSelection.cleanup(); } updatePosition() { super.updatePosition(); const { translation, radiusLineGroup } = this; const translationX = Math.floor(translation.x); const translationY = Math.floor(translation.y); radiusLineGroup.translationX = translationX; radiusLineGroup.translationY = translationY; } updateRadiusLine() { const node = this.radiusLine; const { path } = node; path.clear(true); const { points, closePath } = this.getAxisLinePoints(); for (const { x, y, moveTo: moveTo2, arc, radius = 0, startAngle = 0, endAngle = 0 } of points) { if (arc) { path.arc(x, y, radius, startAngle, endAngle); } else if (moveTo2) { path.moveTo(x, y); } else { path.lineTo(x, y); } } if (closePath) { path.closePath(); } node.visible = this.line.enabled; node.stroke = this.line.stroke; node.strokeWidth = this.line.width; node.fill = void 0; } getAxisLinePoints() { const { scale, shape, gridLength: radius } = this; const [startAngle, endAngle] = this.range; const isFullCircle = (0, import_ag_charts_core8.isNumberEqual)(endAngle - startAngle, 2 * Math.PI); const points = []; if (shape === "circle") { if (isFullCircle) { points.push( { x: radius, y: 0, moveTo: true }, { x: 0, y: 0, radius, startAngle: 0, endAngle: 2 * Math.PI, arc: true, moveTo: false } ); } else { points.push( { x: radius * Math.cos(startAngle), y: radius * Math.sin(startAngle), moveTo: true }, { x: 0, y: 0, radius, startAngle: (0, import_ag_charts_core8.normalizeAngle360)(startAngle), endAngle: (0, import_ag_charts_core8.normalizeAngle360)(endAngle), arc: true, moveTo: false } ); } } else if (shape === "polygon") { const angles = scale.ticks({ nice: [this.nice, this.nice], interval: void 0, tickCount: void 0, minTickCount: 0, maxTickCount: Infinity })?.ticks?.map((value) => scale.convert(value)); if (angles && angles.length > 2) { for (const [i, angle] of angles.entries()) { const x = radius * Math.cos(angle); const y = radius * Math.sin(angle); const moveTo2 = i === 0; points.push({ x, y, moveTo: moveTo2 }); } } } return { points, closePath: isFullCircle }; } updateGridLines() { const { scale, gridLength: radius, gridLine: { style, width }, innerRadiusRatio } = this; if (!(style && radius > 0)) { return; } const innerRadius = radius * innerRadiusRatio; const styleCount = style.length; this.gridLineGroupSelection.each((line, datum, index) => { const { value } = datum; const { stroke: stroke3, lineDash } = style[index % styleCount]; const angle = scale.convert(value); line.x1 = innerRadius * Math.cos(angle); line.y1 = innerRadius * Math.sin(angle); line.x2 = radius * Math.cos(angle); line.y2 = radius * Math.sin(angle); line.stroke = stroke3; line.strokeWidth = width; line.lineDash = lineDash; line.fill = void 0; }); this.gridLineGroupSelection.cleanup(); } updateLabels() { const { label, tickLabelGroupSelection } = this; tickLabelGroupSelection.each((node, _, index) => { const labelDatum = this.labelData[index]; if (!labelDatum || labelDatum.hidden) { node.visible = false; return; } node.text = labelDatum.text; node.setFont(label); node.fill = label.color; node.x = labelDatum.x; node.y = labelDatum.y; node.setAlign(labelDatum); node.setBoxing(label); node.visible = true; if (labelDatum.rotation) { node.rotation = labelDatum.rotation; node.rotationCenterX = labelDatum.x; node.rotationCenterY = labelDatum.y; } else { node.rotation = 0; } }); } updateTickLines() { const { scale, gridLength: radius, tick, tickLineGroupSelection } = this; tickLineGroupSelection.each((line, datum) => { const { value } = datum; const angle = scale.convert(value); const cos = Math.cos(angle); const sin = Math.sin(angle); line.x1 = radius * cos; line.y1 = radius * sin; line.x2 = (radius + tick.size) * cos; line.y2 = (radius + tick.size) * sin; line.stroke = tick.stroke; line.strokeWidth = tick.width; }); } createLabelNodeData(ticks, options, seriesRect) { const { label, gridLength: radius, scale, tick } = this; if (!label.enabled) { return []; } const tempText = new RotatableText2(); const seriesLeft = seriesRect.x - this.translation.x; const seriesRight = seriesRect.x + seriesRect.width - this.translation.x; const { fractionDigits } = this.layout.label; const axisTickFormatter = this.tickFormatter(this.scale.domain, this.tickData, false, fractionDigits); const labelData = ticks.map((datum, index) => { const { value } = datum; const distance = radius + label.spacing + tick.size; const angle = scale.convert(value); const cos = Math.cos(angle); const sin = Math.sin(angle); const x = distance * cos; const y = distance * sin; const { textAlign, textBaseline } = this.getLabelAlign(angle); const isLastTickOverFirst = index === ticks.length - 1 && value !== ticks[0] && (0, import_ag_charts_core8.isNumberEqual)((0, import_ag_charts_core8.normalizeAngle360)(angle), (0, import_ag_charts_core8.normalizeAngle360)(scale.convert(ticks[0]))); const rotation = this.getLabelRotation(angle); let text2 = axisTickFormatter(value, index); tempText.text = text2; tempText.x = x; tempText.y = y; tempText.setFont(label); tempText.textAlign = textAlign; tempText.textBaseline = textBaseline; tempText.rotation = rotation; if (rotation) { tempText.rotationCenterX = x; tempText.rotationCenterY = y; } let box = rotation ? Transformable.toCanvas(tempText) : tempText.getBBox(); if (box && options.hideWhenNecessary && !rotation) { const overflowLeft = seriesLeft - box.x; const overflowRight = box.x + box.width - seriesRight; const pixelError = 1; if (overflowLeft > pixelError || overflowRight > pixelError) { const availWidth = box.width - Math.max(overflowLeft, overflowRight); const wrapOptions = { maxWidth: availWidth, font: label, textWrap: "never" }; text2 = (0, import_ag_charts_core8.wrapTextOrSegments)(text2, wrapOptions); tempText.text = text2; box = tempText.getBBox(); } } return { text: text2, x, y, textAlign, textBaseline, hidden: text2 === "" || (datum.hidden ?? isLastTickOverFirst), rotation, box }; }); if (label.avoidCollisions) { this.avoidLabelCollisions(labelData); } return labelData; } computeLabelsBBox(options, seriesRect) { this.labelData = this.createLabelNodeData(this.tickData, options, seriesRect); const textBoxes = this.labelData.map(({ box }) => box).filter((box) => box != null); if (!this.label.enabled || textBoxes.length === 0) { return null; } return BBox.merge(textBoxes); } getLabelOrientation() { const { label } = this; return label instanceof AngleAxisLabel ? label.orientation : "fixed"; } getLabelRotation(tickAngle) { let rotation = (0, import_ag_charts_core8.toRadians)(this.label.rotation ?? 0); tickAngle = (0, import_ag_charts_core8.normalizeAngle360)(tickAngle); const orientation = this.getLabelOrientation(); if (orientation === "parallel") { rotation += tickAngle; if (tickAngle >= 0 && tickAngle < Math.PI) { rotation -= Math.PI / 2; } else { rotation += Math.PI / 2; } } else if (orientation === "perpendicular") { rotation += tickAngle; if (tickAngle >= Math.PI / 2 && tickAngle < 1.5 * Math.PI) { rotation += Math.PI; } } return rotation; } getLabelAlign(tickAngle) { const cos = Math.cos(tickAngle); const sin = Math.sin(tickAngle); let textAlign; let textBaseline; const orientation = this.getLabelOrientation(); const isCos0 = (0, import_ag_charts_core8.isNumberEqual)(cos, 0); const isSin0 = (0, import_ag_charts_core8.isNumberEqual)(sin, 0); const isCos1 = (0, import_ag_charts_core8.isNumberEqual)(cos, 1); const isSinMinus1 = (0, import_ag_charts_core8.isNumberEqual)(sin, -1); const isCosPositive = cos > 0 && !isCos0; const isSinPositive = sin > 0 && !isSin0; if (orientation === "parallel") { textAlign = "center"; textBaseline = isCos1 && isSin0 || isSinPositive ? "top" : "bottom"; } else if (orientation === "perpendicular") { textAlign = isSinMinus1 || isCosPositive ? "left" : "right"; textBaseline = "middle"; } else { textAlign = "right"; if (isCos0) { textAlign = "center"; } else if (isCosPositive) { textAlign = "left"; } textBaseline = "bottom"; if (isSin0) { textBaseline = "middle"; } else if (isSinPositive) { textBaseline = "top"; } } return { textAlign, textBaseline }; } updateCrossLines() { const { shape, gridLength: radius, innerRadiusRatio } = this; for (const crossLine of this.crossLines) { if (crossLine instanceof AngleCrossLine) { crossLine.ticks = this.tickData.map((t) => t.value); crossLine.shape = shape; crossLine.axisOuterRadius = radius; crossLine.axisInnerRadius = radius * innerRadiusRatio; } } super.updateCrossLines(); } }; AngleAxis.CrossLineConstructor = AngleCrossLine; __decorateClass([ import_ag_charts_core8.Property ], AngleAxis.prototype, "startAngle", 2); __decorateClass([ import_ag_charts_core8.Property ], AngleAxis.prototype, "endAngle", 2); // packages/ag-charts-enterprise/src/axes/angle-category/angleCategoryAxis.ts var { CategoryScale } = import_ag_charts_community8._ModuleSupport; var AngleCategoryAxis = class extends AngleAxis { constructor(moduleCtx) { super(moduleCtx, new CategoryScale()); this.groupPaddingInner = 0; this.paddingInner = 0; this.interval = new AngleAxisInterval(); } hasDefinedDomain() { return false; } generateAngleTicks(domain) { const { scale, gridLength: radius } = this; const { values, minSpacing } = this.interval; const tickParams = { nice: [this.nice, this.nice], interval: void 0, tickCount: void 0, minTickCount: 0, maxTickCount: Infinity }; const ticks = values ?? scale.ticks(tickParams, domain)?.ticks ?? []; if (ticks.length < 2 || minSpacing == null) { return ticks.map((value) => { return { value, visible: true }; }); } const startTick = ticks[0]; const startAngle = scale.convert(startTick); const startX = radius * Math.cos(startAngle); const startY = radius * Math.sin(startAngle); for (let step = 1; step < ticks.length - 1; step++) { const nextTick = ticks[step]; const nextAngle = scale.convert(nextTick); if (nextAngle - startAngle > Math.PI) { break; } const nextX = radius * Math.cos(nextAngle); const nextY = radius * Math.sin(nextAngle); const spacing = Math.hypot(nextX - startX, nextY - startY); if (spacing > minSpacing) { const visibleTicks = /* @__PURE__ */ new Set([startTick]); walkPairsOutward(ticks, step, (_, next) => { visibleTicks.add(next); }); return ticks.map((value) => { const visible = visibleTicks.has(value); return { value, visible }; }); } } return [{ value: startTick, visible: true }]; } avoidLabelCollisions(labelData) { const { minSpacing } = this.label; if (labelData.length < 3) return; const labelsCollide = (prev, next) => { if (prev.hidden || next.hidden) { return false; } else if (minSpacing == null) { return prev.box.collidesBBox(next.box); } const prevBox = prev.box.clone().grow(minSpacing / 2); const nextBox = next.box.clone().grow(minSpacing / 2); return prevBox.collidesBBox(nextBox); }; const firstLabel = labelData[0]; const lastLabel = labelData.at(-1); const visibleLabels = /* @__PURE__ */ new Set([firstLabel]); const lastLabelIsOverFirst = (0, import_ag_charts_core9.isNumberEqual)(firstLabel.x, lastLabel.x) && (0, import_ag_charts_core9.isNumberEqual)(firstLabel.y, lastLabel.y); const maxStep = Math.floor(labelData.length / 2); for (let step = 1; step <= maxStep; step++) { const labels = lastLabelIsOverFirst ? labelData.slice(0, -1) : labelData; const collisionDetected = walkPairsOutward(labels, step, labelsCollide); if (!collisionDetected) { walkPairsOutward(labels, step, (_, next) => { visibleLabels.add(next); }); break; } } for (const datum of labelData) { if (!visibleLabels.has(datum)) { datum.hidden = true; datum.box = void 0; } } } tickFormatParams() { return { type: "category" }; } datumFormatParams(value, params) { const { datum, seriesId, legendItemName, key, source, property, domain, boundSeries } = params; return { type: "category", value, datum, seriesId, legendItemName, key, source, property, domain, boundSeries }; } }; AngleCategoryAxis.className = "AngleCategoryAxis"; AngleCategoryAxis.type = "angle-category"; __decorateClass([ import_ag_charts_core9.Property ], AngleCategoryAxis.prototype, "groupPaddingInner", 2); __decorateClass([ import_ag_charts_core9.Property ], AngleCategoryAxis.prototype, "paddingInner", 2); __decorateClass([ import_ag_charts_core9.Property ], AngleCategoryAxis.prototype, "interval", 2); // packages/ag-charts-enterprise/src/axes/angle-category/angleCategoryAxisModule.ts var AngleCategoryAxisModule = { type: "axis", name: "angle-category", chartType: "polar", enterprise: true, version: import_ag_charts_community9.VERSION, options: import_ag_charts_community9._ModuleSupport.angleCategoryAxisOptionsDefs, themeTemplate: { label: { spacing: 5 }, gridLine: { enabled: false }, shape: { $findFirstSiblingNotOperation: void 0 } }, create: (ctx) => new AngleCategoryAxis(ctx) }; // packages/ag-charts-enterprise/src/axes/angle-number/angleNumberAxisModule.ts var import_ag_charts_community12 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/axes/angle-number/angleNumberAxis.ts var import_ag_charts_community11 = require("ag-charts-community"); var import_ag_charts_core11 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/axes/angle-number/linearAngleScale.ts var import_ag_charts_community10 = require("ag-charts-community"); var import_ag_charts_core10 = require("ag-charts-core"); var { LinearScale } = import_ag_charts_community10._ModuleSupport; var LinearAngleScale = class _LinearAngleScale extends LinearScale { constructor() { super(...arguments); this.arcLength = 0; } static getNiceStepAndTickCount(ticks, domain) { const [start, stop] = domain; let step = LinearScale.getTickStep(start, stop, ticks); const maxTickCount = Number.isNaN(ticks.maxTickCount) ? Infinity : ticks.maxTickCount; const expectedTickCount = Math.abs(stop - start) / step; let niceTickCount = Math.pow(2, Math.ceil(Math.log(expectedTickCount) / Math.log(2))); if (niceTickCount > maxTickCount) { niceTickCount /= 2; step *= 2; } return { count: niceTickCount, step }; } ticks(ticks, domain = this.domain) { const { arcLength } = this; if (!domain || domain.length < 2 || domain.some((d) => !Number.isFinite(d)) || arcLength <= 0) { return { ticks: [], count: 0 }; } const { nice, interval } = ticks; const [d0, d1] = domain; if (interval) { const step2 = Math.abs(interval); const availableRange = this.getPixelRange(); if (!(0, import_ag_charts_core10.isDenseInterval)((d1 - d0) / step2, availableRange)) { const result2 = (0, import_ag_charts_core10.range)(d0, d1, step2); return { ticks: result2.ticks, count: result2.count }; } } let step; if (nice && this.hasNiceRange()) { const linearNiceDomain = super.niceDomain(ticks, domain); step = _LinearAngleScale.getNiceStepAndTickCount(ticks, linearNiceDomain).step; } else { step = LinearScale.getTickStep(d0, d1, ticks); } const result = (0, import_ag_charts_core10.range)(d0, d1, step); return { ticks: result.ticks, count: result.count }; } hasNiceRange() { const sortedRange = this.range.slice().sort((a, b) => a - b); const niceRanges = [Math.PI, 2 * Math.PI]; return niceRanges.some((r) => (0, import_ag_charts_core10.isNumberEqual)(r, sortedRange[1] - sortedRange[0])); } niceDomain(ticks, domain = this.domain) { const linearNiceDomain = super.niceDomain(ticks, domain); if (!this.hasNiceRange()) return linearNiceDomain; const reversed = linearNiceDomain[0] > linearNiceDomain[1]; const start = reversed ? linearNiceDomain[1] : linearNiceDomain[0]; const { step, count } = _LinearAngleScale.getNiceStepAndTickCount(ticks, linearNiceDomain); const s = 1 / step; const stop = step >= 1 ? Math.ceil(start / step + count) * step : Math.ceil((start + count * step) * s) / s; return reversed ? [stop, start] : [start, stop]; } getPixelRange() { return this.arcLength; } }; // packages/ag-charts-enterprise/src/axes/angle-number/angleNumberAxis.ts var AngleNumberAxis = class extends AngleAxis { constructor(moduleCtx) { super(moduleCtx, new LinearAngleScale()); this.shape = "circle"; this.interval = new AngleAxisInterval(); } hasDefinedDomain() { const { min, max } = this; return min != null && max != null && min < max; } normaliseDataDomain(d) { const { min, max, preferredMin, preferredMax } = this; const { extent: extent4, clipped } = (0, import_ag_charts_core11.normalisedExtentWithMetadata)( d.domain, min, max, preferredMin, preferredMax, void 0, d.sortMetadata?.sortOrder ); return { domain: extent4, clipped }; } getDomainExtentsNice() { return [this.min == null && this.nice, this.max == null && this.nice]; } updateScale() { super.updateScale(); this.scale.arcLength = this.getRangeArcLength(); } getRangeArcLength() { const { range: requestedRange } = this; const min = Math.min(...requestedRange); const max = Math.max(...requestedRange); const rotation = (0, import_ag_charts_core11.angleBetween)(min, max) || 2 * Math.PI; const radius = this.gridLength; return rotation * radius; } generateAngleTicks(domain) { const { scale, range: requestedRange, nice } = this; const { values, step, minSpacing, maxSpacing } = this.interval; let rawTicks; if (values == null) { const { arcLength } = scale; const minTickCount = maxSpacing ? Math.floor(arcLength / maxSpacing) : 1; const maxTickCount = minSpacing ? Math.floor(arcLength / minSpacing) : Infinity; const preferredTickCount = Math.floor(4 / Math.PI * Math.abs(requestedRange[0] - requestedRange[1])); const tickCount = Math.max(minTickCount, Math.min(maxTickCount, preferredTickCount)); const tickParams = { nice: [nice, nice], interval: step, tickCount, minTickCount, maxTickCount }; rawTicks = scale.ticks(tickParams, domain)?.ticks ?? []; } else { const [d0, d1] = (0, import_ag_charts_core11.findMinMax)(domain.map(Number)); rawTicks = values.filter((value) => value >= d0 && value <= d1).sort((a, b) => a - b); } return rawTicks.map((value) => ({ value, visible: true })); } avoidLabelCollisions(labelData) { const { minSpacing } = this.label; const labelsCollide = (prev, next) => { if (prev.hidden || next.hidden) { return false; } else if (minSpacing == null) { return prev.box.collidesBBox(next.box); } const prevBox = prev.box.clone().grow(minSpacing / 2); const nextBox = next.box.clone().grow(minSpacing / 2); return prevBox.collidesBBox(nextBox); }; const firstLabel = labelData[0]; const lastLabel = labelData.at(-1); if (firstLabel !== lastLabel && (0, import_ag_charts_core11.isNumberEqual)(firstLabel.x, lastLabel.x) && (0, import_ag_charts_core11.isNumberEqual)(firstLabel.y, lastLabel.y)) { lastLabel.hidden = true; } for (let step = 1; step < labelData.length; step *= 2) { let collisionDetected = false; for (let i = step; i < labelData.length; i += step) { const next = labelData[i]; const prev = labelData[i - step]; if (labelsCollide(prev, next)) { collisionDetected = true; break; } } if (!collisionDetected) { for (const [i, datum] of labelData.entries()) { if (i % step > 0) { datum.hidden = true; datum.box = void 0; } } return; } } for (const [i, datum] of labelData.entries()) { if (i > 0) { datum.hidden = true; datum.box = void 0; } } } tickFormatParams(_domain, _ticks, fractionDigits) { return { type: "number", visibleDomain: void 0, fractionDigits }; } datumFormatParams(value, params, fractionDigits) { const { datum, seriesId, legendItemName, key, source, property, domain, boundSeries } = params; return { type: "number", value, datum, seriesId, legendItemName, key, source, property, domain, boundSeries, fractionDigits, visibleDomain: void 0 }; } }; AngleNumberAxis.className = "AngleNumberAxis"; AngleNumberAxis.type = "angle-number"; __decorateClass([ import_ag_charts_core11.Property ], AngleNumberAxis.prototype, "min", 2); __decorateClass([ import_ag_charts_core11.Property ], AngleNumberAxis.prototype, "max", 2); __decorateClass([ import_ag_charts_core11.Property ], AngleNumberAxis.prototype, "preferredMin", 2); __decorateClass([ import_ag_charts_core11.Property ], AngleNumberAxis.prototype, "preferredMax", 2); __decorateClass([ import_ag_charts_core11.Property ], AngleNumberAxis.prototype, "interval", 2); // packages/ag-charts-enterprise/src/axes/angle-number/angleNumberAxisModule.ts var AngleNumberAxisModule = { type: "axis", name: "angle-number", chartType: "polar", enterprise: true, version: import_ag_charts_community12.VERSION, options: import_ag_charts_community12._ModuleSupport.angleNumberAxisOptionsDefs, themeTemplate: { label: { spacing: 5 }, gridLine: { enabled: false } }, create: (ctx) => new AngleNumberAxis(ctx) }; // packages/ag-charts-enterprise/src/axes/ordinal/ordinalTimeAxisModule.ts var import_ag_charts_community14 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/axes/ordinal/ordinalTimeAxis.ts var import_ag_charts_community13 = require("ag-charts-community"); var import_ag_charts_core12 = require("ag-charts-core"); var { OrdinalTimeScale, ApproximateOrdinalTimeScale, APPROXIMATE_THRESHOLD, TimeAxisParentLevel, minimumTimeAxisDatumGranularity } = import_ag_charts_community13._ModuleSupport; var OrdinalTimeAxis = class extends import_ag_charts_community13._ModuleSupport.DiscreteTimeAxis { constructor(moduleCtx) { const accurateScale = new OrdinalTimeScale(); super(moduleCtx, accurateScale); this.parentLevel = new TimeAxisParentLevel(); this.accurateScale = accurateScale; this.approximateScale = new ApproximateOrdinalTimeScale(); this.approximateScale.setSourceScale(accurateScale); Object.defineProperty(this, "scale", { get: () => this.getActiveScale(), configurable: true }); } get primaryLabel() { return this.parentLevel.enabled ? this.parentLevel.label : void 0; } get primaryTick() { return this.parentLevel.enabled ? this.parentLevel.tick : void 0; } /** * Returns the active scale based on visible range and data uniformity. * Use approximate scale when data is uniform and visible datum count is large. */ getActiveScale() { const visibleBandCount = this.accurateScale.bandCount(this.visibleRange); const isUniform = this.accurateScale.getUniformityCache(this.visibleRange)?.isUniform ?? false; if (isUniform && visibleBandCount >= APPROXIMATE_THRESHOLD) { return this.approximateScale; } return this.accurateScale; } processData() { super.processData(); const { boundSeries, direction } = this; this.minimumTimeGranularity = minimumTimeAxisDatumGranularity(boundSeries, direction, void 0, void 0); } tickFormatParams(domain, ticks, _fractionDigits, timeInterval) { timeInterval ?? (timeInterval = (0, import_ag_charts_core12.lowestGranularityUnitForTicks)(ticks)); const truncateDate = (0, import_ag_charts_core12.dateTruncationForDomain)(domain); const unit = (0, import_ag_charts_core12.intervalUnit)(timeInterval); const step = (0, import_ag_charts_core12.intervalStep)(timeInterval); const epoch = (0, import_ag_charts_core12.intervalEpoch)(timeInterval); return { type: "date", unit, step, epoch, truncateDate }; } datumFormatParams(value, params, _fractionDigits, timeInterval, style) { if (typeof value === "number") value = new Date(value); if (timeInterval == null) { const { minimumTimeGranularity } = this; const datumGranularity = (0, import_ag_charts_core12.lowestGranularityUnitForValue)(value); if (minimumTimeGranularity != null && (0, import_ag_charts_core12.intervalMilliseconds)(minimumTimeGranularity) < (0, import_ag_charts_core12.intervalMilliseconds)(datumGranularity)) { timeInterval = minimumTimeGranularity; } else { timeInterval = datumGranularity; } } const { datum, seriesId, legendItemName, key, source, property, domain, boundSeries } = params; const unit = (0, import_ag_charts_core12.intervalUnit)(timeInterval); const step = (0, import_ag_charts_core12.intervalStep)(timeInterval); const epoch = (0, import_ag_charts_core12.intervalEpoch)(timeInterval); return { type: "date", value, datum, seriesId, legendItemName, key, source, property, domain, boundSeries, unit, step, epoch, style }; } }; OrdinalTimeAxis.className = "OrdinalTimeAxis"; OrdinalTimeAxis.type = "ordinal-time"; __decorateClass([ import_ag_charts_core12.Property ], OrdinalTimeAxis.prototype, "parentLevel", 2); // packages/ag-charts-enterprise/src/axes/ordinal/ordinalTimeAxisModule.ts var OrdinalTimeAxisModule = { type: "axis", name: "ordinal-time", chartType: "cartesian", enterprise: true, version: import_ag_charts_community14.VERSION, options: import_ag_charts_community14._ModuleSupport.ordinalTimeAxisOptionsDefs, themeTemplate: { groupPaddingInner: 0, label: { autoRotate: false, minSpacing: 40 }, gridLine: { enabled: false }, interval: { placement: "between" } }, create: (ctx) => new OrdinalTimeAxis(ctx) }; // packages/ag-charts-enterprise/src/axes/radius-category/radiusCategoryAxisModule.ts var import_ag_charts_community18 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/axes/radius-category/radiusCategoryAxis.ts var import_ag_charts_community17 = require("ag-charts-community"); var import_ag_charts_core15 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/axes/radius/radiusAxis.ts var import_ag_charts_community16 = require("ag-charts-community"); var import_ag_charts_core14 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/axes/polar-crosslines/radiusCrossLine.ts var import_ag_charts_community15 = require("ag-charts-community"); var import_ag_charts_core13 = require("ag-charts-core"); var { validateCrossLineValue: validateCrossLineValue2, Group: Group3, Path: Path3, Sector: Sector2, RotatableText: RotatableText3 } = import_ag_charts_community15._ModuleSupport; var RadiusCrossLineLabel = class extends PolarCrossLineLabel { constructor() { super(...arguments); this.positionAngle = void 0; } }; __decorateClass([ import_ag_charts_core13.Property ], RadiusCrossLineLabel.prototype, "positionAngle", 2); var RadiusCrossLine = class extends PolarCrossLine { constructor() { super(); this.direction = import_ag_charts_core13.ChartAxisDirection.Radius; this.label = new RadiusCrossLineLabel(); this.polygonNode = new Path3(); this.sectorNode = new Sector2(); this.crossLineRange = new Group3(); this.labelNode = new RotatableText3(); this.outerRadius = 0; this.innerRadius = 0; this.crossLineRange.append(this.polygonNode); this.crossLineRange.append(this.sectorNode); this.labelGroup.append(this.labelNode); } update(visible) { const { scale } = this; if (!scale || !validateCrossLineValue2(this, scale)) { this.rangeGroup.visible = false; this.lineGroup.visible = false; this.labelGroup.visible = false; return; } this.updateRadii(); const { innerRadius, outerRadius } = this; visible && (visible = innerRadius >= this.axisInnerRadius && outerRadius <= this.axisOuterRadius); this.rangeGroup.visible = visible; this.lineGroup.visible = visible; this.labelGroup.visible = visible; this.updatePolygonNode(visible); this.updateSectorNode(visible); this.updateLabelNode(visible); this.assignCrossLineGroup(this.type === "range", this.crossLineRange); } updateRadii() { const { range: range2, scale, type, axisInnerRadius, axisOuterRadius } = this; if (!scale) return { innerRadius: 0, outerRadius: 0 }; const getRadius = (value) => axisOuterRadius + axisInnerRadius - value; let outerRadius, innerRadius; if (type === "line") { outerRadius = getRadius(scale.convert(this.value)); innerRadius = outerRadius; } else { const bandwidth = Math.abs(scale?.bandwidth ?? 0); const convertedRange = range2.map((r) => scale.convert(r)); outerRadius = getRadius(Math.max(...convertedRange)); innerRadius = getRadius(Math.min(...convertedRange)) + bandwidth; } this.outerRadius = outerRadius; this.innerRadius = innerRadius; } drawPolygon(radius, angles, polygon) { for (const [index, angle] of angles.entries()) { const x = radius * Math.cos(angle); const y = radius * Math.sin(angle); if (index === 0) { polygon.path.moveTo(x, y); } else { polygon.path.lineTo(x, y); } } polygon.path.closePath(); } updatePolygonNode(visible) { const { gridAngles, polygonNode: polygon, scale, shape, type, innerRadius, outerRadius } = this; if (!visible || shape !== "polygon" || !scale || !gridAngles) { polygon.visible = false; return; } polygon.visible = true; const padding2 = this.getPadding(); polygon.path.clear(true); this.drawPolygon(outerRadius - padding2, gridAngles, polygon); const reversedAngles = gridAngles.slice().reverse(); const innerPolygonRadius = type === "line" ? outerRadius - padding2 : innerRadius + padding2; this.drawPolygon(innerPolygonRadius, reversedAngles, polygon); this.setSectorNodeProps(polygon); } updateSectorNode(visible) { const { axisInnerRadius, axisOuterRadius, scale, sectorNode: sector, shape, innerRadius, outerRadius } = this; if (!visible || shape !== "circle" || !scale) { sector.visible = false; return; } sector.visible = true; sector.startAngle = 0; sector.endAngle = 2 * Math.PI; const padding2 = this.getPadding(); const r0 = (0, import_ag_charts_core13.clamp)(axisInnerRadius, innerRadius + padding2, axisOuterRadius); const r1 = (0, import_ag_charts_core13.clamp)(axisInnerRadius, outerRadius - padding2, axisOuterRadius); sector.innerRadius = Math.min(r0, r1); sector.outerRadius = Math.max(r0, r1); this.setSectorNodeProps(sector); } updateLabelNode(visible) { const { innerRadius, label, labelNode: node, scale, shape, type } = this; if (!visible || label.enabled === false || !label.text || !scale) { node.visible = false; return; } const angle = (0, import_ag_charts_core13.normalizeAngle360FromDegrees)((label.positionAngle ?? 0) - 90); const isBottomSide = ((0, import_ag_charts_core13.isNumberEqual)(angle, 0) || angle > 0) && angle < Math.PI; const rotation = isBottomSide ? angle - Math.PI / 2 : angle + Math.PI / 2; let distance; const angles = this.gridAngles ?? []; if (type === "line") { distance = innerRadius + label.padding; } else if (shape === "circle" || angles.length < 3) { distance = innerRadius - label.padding; } else { distance = innerRadius * Math.cos(Math.PI / angles.length) - label.padding; } const labelX = distance * Math.cos(angle); const labelY = distance * Math.sin(angle); let textBaseline; if (type === "line") { textBaseline = isBottomSide ? "top" : "bottom"; } else { textBaseline = isBottomSide ? "bottom" : "top"; } this.setLabelNodeProps(node, labelX, labelY, textBaseline, rotation); } getPadding() { const { scale } = this; if (!scale) return 0; const bandwidth = Math.abs(scale.bandwidth ?? 0); const step = Math.abs(scale.step ?? 0); return scale instanceof import_ag_charts_community15._ModuleSupport.BandScale ? (step - bandwidth) / 2 : 0; } }; RadiusCrossLine.className = "RadiusCrossLine"; // packages/ag-charts-enterprise/src/axes/radius/radiusAxis.ts var { Caption, Group: Group4, TransformableGroup, Path: Path4, Line: Line2, Selection: Selection2, generateTicks, AxisGroupZIndexMap } = import_ag_charts_community16._ModuleSupport; var RadiusAxisLabel = class extends import_ag_charts_community16._ModuleSupport.AxisLabel { constructor() { super(...arguments); this.autoRotateAngle = 335; } }; __decorateClass([ import_ag_charts_core14.Property ], RadiusAxisLabel.prototype, "autoRotate", 2); __decorateClass([ import_ag_charts_core14.Property ], RadiusAxisLabel.prototype, "autoRotateAngle", 2); var RadiusAxis = class extends import_ag_charts_community16._ModuleSupport.PolarAxis { constructor(moduleCtx, scale) { super(moduleCtx, scale); this.positionAngle = 0; this.gridLineGroupSelection = Selection2.select( this.gridLineGroup, Line2, false ); this.generatedTicks = void 0; this.headingLabelGroup = this.axisGroup.appendChild( new TransformableGroup({ name: `${this.id}-Axis-heading` }) ); this.lineNodeGroup = this.axisGroup.appendChild( new TransformableGroup({ name: `${this.id}-Axis-line` }) ); this.lineNode = this.lineNodeGroup.appendChild( new Line2({ name: `${this.id}-Axis-line`, zIndex: AxisGroupZIndexMap.AxisLine }) ); this.gridPathGroup = this.gridGroup.appendChild( new Group4({ name: `${this.id}-gridPaths`, zIndex: import_ag_charts_core14.ZIndexMap.AXIS_GRID }) ); this.gridPathSelection = Selection2.select(this.gridPathGroup, Path4); this.headingLabelGroup.appendChild(this.title.caption.node); this.cleanup.register(this.title.caption.registerInteraction(this.moduleCtx, "afterend")); } get direction() { return import_ag_charts_core14.ChartAxisDirection.Radius; } getAxisTransform() { const maxRadius = this.scale.range[0]; const { translation, positionAngle, innerRadiusRatio } = this; const innerRadius = maxRadius * innerRadiusRatio; const rotation = (0, import_ag_charts_core14.toRadians)(positionAngle); return { translationX: translation.x, translationY: translation.y - maxRadius - innerRadius, rotation, rotationCenterX: 0, rotationCenterY: maxRadius + innerRadius }; } update() { super.update(); this.updateTitle(); this.updateGridLines(); const { enabled, stroke: stroke3, width } = this.line; this.lineNode.setProperties({ stroke: stroke3, strokeWidth: enabled ? width : 0, x1: 0, y1: this.range[0], x2: 0, y2: this.range[1] }); } updatePosition() { super.updatePosition(); const axisTransform = this.getAxisTransform(); this.tickLineGroup.setProperties(axisTransform); this.tickLabelGroup.setProperties(axisTransform); this.lineNodeGroup.setProperties(axisTransform); this.headingLabelGroup.setProperties(axisTransform); } calculateRotations() { const rotation = 0; const parallelFlipRotation = 0; const regularFlipRotation = -Math.PI / 2; return { rotation, parallelFlipRotation, regularFlipRotation }; } calculateTickLayout(domain, niceMode, _visibleRange) { const visibleRange = [0, 1]; const sideFlag = this.label.getSideFlag(); const labelX = sideFlag * (this.getTickSize() + this.label.spacing + this.seriesAreaPadding); const { range: range2, reverse, defaultTickMinSpacing } = this; const tickGenerationResult = generateTicks({ scale: this.scale, label: this.label, interval: this.interval, tickFormatter: (...args) => this.tickFormatter(...args), domain, range: range2, reverse, niceMode, visibleRange, defaultTickMinSpacing, labelOffset: labelX, sideFlag, axisRotation: 0, sizeLimit: void 0, primaryTickCount: void 0 }); const { tickData } = tickGenerationResult; const { ticks, rawTicks, rawTickCount, tickDomain, fractionDigits, niceDomain = domain } = tickData; const labels = ticks.map((d) => this.getTickLabelProps(d, tickGenerationResult)); this.generatedTicks = { ticks, labels }; return { ticks: rawTicks, tickDomain, niceDomain, rawTickCount, fractionDigits, timeInterval: void 0 }; } updateSelections() { const { generatedTicks } = this; if (!generatedTicks) return; const { ticks, labels } = generatedTicks; this.gridLineGroupSelection.update(this.gridLength ? ticks : []); this.tickLabelGroupSelection.update(labels); this.gridPathSelection.update(this.gridLine.enabled ? this.prepareGridPathTickData(ticks) : []); this.gridLineGroupSelection.cleanup(); this.tickLabelGroupSelection.cleanup(); this.gridPathSelection.cleanup(); } // TODO - abstract out updateLabels() { if (!this.label.enabled) return; const axisLabelPositionFn = import_ag_charts_community16._ModuleSupport.resetAxisLabelSelectionFn(); this.tickLabelGroupSelection.each((node, datum) => { node.fill = datum.color; node.text = datum.text; node.textBaseline = datum.textBaseline; node.textAlign = datum.textAlign ?? "center"; node.setFont(datum); node.setBoxing(datum); node.setProperties(axisLabelPositionFn(node, datum)); }); } updateGridLines() { const { gridLine: { style, width }, shape, generatedTicks } = this; if (!style || !generatedTicks) { return; } const styleCount = style.length; const setStyle = (node, index) => { const { stroke: stroke3, lineDash } = style[index % styleCount]; node.stroke = stroke3; node.strokeWidth = width; node.lineDash = lineDash; node.fill = void 0; }; const [startAngle, endAngle] = this.gridRange ?? [0, 2 * Math.PI]; const isFullCircle = (0, import_ag_charts_core14.isNumberEqual)(endAngle - startAngle, 2 * Math.PI); const drawCircleShape = (node, value) => { const { path } = node; path.clear(true); const radius = this.getTickRadius(value); if (isFullCircle) { path.moveTo(radius, 0); path.arc(0, 0, radius, 0, 2 * Math.PI); } else { path.moveTo(radius * Math.cos(startAngle), radius * Math.sin(startAngle)); path.arc(0, 0, radius, (0, import_ag_charts_core14.normalizeAngle360)(startAngle), (0, import_ag_charts_core14.normalizeAngle360)(endAngle)); } if (isFullCircle) { path.closePath(); } }; const drawPolygonShape = (node, value) => { const { path } = node; const angles = this.gridAngles; path.clear(true); if (!angles || angles.length < 3) { return; } const radius = this.getTickRadius(value); for (const [idx, angle] of angles.entries()) { const x = radius * Math.cos(angle); const y = radius * Math.sin(angle); if (idx === 0) { path.moveTo(x, y); } else { path.lineTo(x, y); } for (const [innerIdx, innerAngle] of angles.entries()) { const x2 = radius * Math.cos(innerAngle); const y2 = radius * Math.sin(innerAngle); if (innerIdx === 0) { path.moveTo(x2, y2); } else { path.lineTo(x2, y2); } } path.closePath(); } path.closePath(); }; const drawFn = shape === "circle" ? drawCircleShape : drawPolygonShape; this.gridPathSelection.each((node, value, index) => { setStyle(node, index); drawFn(node, value); }); } updateTitle() { const identityFormatter = (params) => params.defaultValue; const { title, range: requestedRange } = this; const { formatter = identityFormatter } = this.title; title.caption.enabled = title.enabled; title.caption.fontFamily = title.fontFamily; title.caption.fontSize = title.fontSize; title.caption.fontStyle = title.fontStyle; title.caption.fontWeight = title.fontWeight; title.caption.color = title.color; title.caption.wrapping = title.wrapping; let titleVisible = false; const titleNode = title.caption.node; if (title.enabled) { titleVisible = true; titleNode.rotation = Math.PI / 2; titleNode.x = Math.floor((requestedRange[0] + requestedRange[1]) / 2); titleNode.y = -Caption.SMALL_PADDING; titleNode.textAlign = "center"; titleNode.textBaseline = "bottom"; titleNode.text = this.cachedCallWithContext(formatter, this.getTitleFormatterParams(this.scale.domain)); } titleNode.visible = titleVisible; } updateCrossLines() { for (const crossLine of this.crossLines) { if (crossLine instanceof RadiusCrossLine) { const { shape, gridAngles, range: range2, innerRadiusRatio } = this; const radius = range2[0]; crossLine.shape = shape; crossLine.gridAngles = gridAngles; crossLine.axisOuterRadius = radius; crossLine.axisInnerRadius = radius * innerRadiusRatio; } } super.updateCrossLines(); } createLabel() { return new RadiusAxisLabel(); } // TODO - abstract out (shared with cartesian axis) getTickLabelProps(datum, tickGenerationResult) { const { label } = this; const { rotation, textBaseline, textAlign } = tickGenerationResult; const range2 = this.scale.range; const text2 = datum.tickLabel ?? ""; const sideFlag = label.getSideFlag(); const labelX = sideFlag * (this.getTickSize() + label.spacing + this.seriesAreaPadding); const visible = text2 !== "" && text2 != null; const combinedRotation = rotation; return { ...this.getLabelStyles({ value: datum.tick, formattedValue: datum.tickLabel }), tickId: datum.tickId, rotation: combinedRotation, text: text2, textAlign, textBaseline, visible, x: labelX, y: datum.translation, rotationCenterX: labelX, rotationCenterY: datum.translation, range: range2 }; } }; RadiusAxis.CrossLineConstructor = RadiusCrossLine; __decorateClass([ import_ag_charts_core14.Property ], RadiusAxis.prototype, "positionAngle", 2); // packages/ag-charts-enterprise/src/axes/radius-category/radiusCategoryAxis.ts var { CategoryScale: CategoryScale2 } = import_ag_charts_community17._ModuleSupport; var RadiusCategoryAxis = class extends RadiusAxis { constructor(moduleCtx) { super(moduleCtx, new CategoryScale2()); this.shape = "circle"; this.groupPaddingInner = 0; this.paddingInner = 0; this.paddingOuter = 0; } hasDefinedDomain() { return false; } normaliseDataDomain(d) { return { domain: d.domain, clipped: false }; } prepareGridPathTickData(data) { return data.slice().reverse(); } getTickRadius(tickDatum) { const { scale, innerRadiusRatio } = this; const maxRadius = scale.range[0]; const minRadius = maxRadius * innerRadiusRatio; if (CategoryScale2.is(scale)) { const ticks = scale.domain; const index = ticks.length - 1 - ticks.indexOf(tickDatum.tick); return index === 0 ? minRadius : scale.inset + scale.step * (index - 0.5) + scale.bandwidth / 2; } else { const tickRange = (maxRadius - minRadius) / scale.domain.length; return maxRadius - tickDatum.translation + minRadius - tickRange / 2; } } tickFormatParams() { return { type: "category" }; } datumFormatParams(value, params) { const { datum, seriesId, legendItemName, key, source, property, domain, boundSeries } = params; return { type: "category", value, datum, seriesId, legendItemName, key, source, property, domain, boundSeries }; } }; RadiusCategoryAxis.className = "RadiusCategoryAxis"; RadiusCategoryAxis.type = "radius-category"; __decorateClass([ import_ag_charts_core15.Property ], RadiusCategoryAxis.prototype, "groupPaddingInner", 2); __decorateClass([ (0, import_ag_charts_core15.ProxyPropertyOnWrite)("scale", "paddingInner"), import_ag_charts_core15.Property ], RadiusCategoryAxis.prototype, "paddingInner", 2); __decorateClass([ (0, import_ag_charts_core15.ProxyPropertyOnWrite)("scale", "paddingOuter"), import_ag_charts_core15.Property ], RadiusCategoryAxis.prototype, "paddingOuter", 2); // packages/ag-charts-enterprise/src/axes/radius-category/radiusCategoryAxisModule.ts var RadiusCategoryAxisModule = { type: "axis", name: "radius-category", chartType: "polar", enterprise: true, version: import_ag_charts_community18.VERSION, options: import_ag_charts_community18._ModuleSupport.radiusCategoryAxisOptionsDefs, themeTemplate: { positionAngle: 0, line: { enabled: false }, label: { minSpacing: 5 } }, create: (ctx) => new RadiusCategoryAxis(ctx) }; // packages/ag-charts-enterprise/src/axes/radius-number/radiusNumberAxisModule.ts var import_ag_charts_community20 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/axes/radius-number/radiusNumberAxis.ts var import_ag_charts_community19 = require("ag-charts-community"); var import_ag_charts_core16 = require("ag-charts-core"); var { LinearScale: LinearScale2 } = import_ag_charts_community19._ModuleSupport; var RadiusNumberAxis = class extends RadiusAxis { constructor(moduleCtx) { super(moduleCtx, new LinearScale2()); this.shape = "polygon"; } hasDefinedDomain() { const { min, max } = this; return min != null && max != null && min < max; } prepareGridPathTickData(data) { const { scale } = this; const domainTop = scale.domain[1]; return data.filter(({ tick }) => tick !== domainTop).sort((a, b) => b.tick - a.tick); } getTickRadius(tickDatum) { const { scale } = this; const maxRadius = scale.range[0]; const minRadius = maxRadius * this.innerRadiusRatio; return maxRadius - tickDatum.translation + minRadius; } normaliseDataDomain(d) { const { min, max, preferredMin, preferredMax } = this; const { extent: extent4, clipped } = (0, import_ag_charts_core16.normalisedExtentWithMetadata)( d.domain, min, max, preferredMin, preferredMax, void 0, d.sortMetadata?.sortOrder ); return { domain: extent4, clipped }; } getDomainExtentsNice() { return [this.min == null && this.nice, this.max == null && this.nice]; } tickFormatParams(_domain, _ticks, fractionDigits) { return { type: "number", visibleDomain: void 0, fractionDigits }; } datumFormatParams(value, params, fractionDigits) { const { datum, seriesId, legendItemName, key, source, property, domain, boundSeries } = params; return { type: "number", value, datum, seriesId, legendItemName, key, source, property, domain, boundSeries, fractionDigits, visibleDomain: void 0 }; } }; RadiusNumberAxis.className = "RadiusNumberAxis"; RadiusNumberAxis.type = "radius-number"; __decorateClass([ import_ag_charts_core16.Property ], RadiusNumberAxis.prototype, "min", 2); __decorateClass([ import_ag_charts_core16.Property ], RadiusNumberAxis.prototype, "max", 2); __decorateClass([ import_ag_charts_core16.Property ], RadiusNumberAxis.prototype, "preferredMin", 2); __decorateClass([ import_ag_charts_core16.Property ], RadiusNumberAxis.prototype, "preferredMax", 2); // packages/ag-charts-enterprise/src/axes/radius-number/radiusNumberAxisModule.ts var RadiusNumberAxisModule = { type: "axis", name: "radius-number", chartType: "polar", enterprise: true, version: import_ag_charts_community20.VERSION, options: import_ag_charts_community20._ModuleSupport.radiusNumberAxisOptionsDefs, themeTemplate: { positionAngle: 0, line: { enabled: false }, shape: { $findFirstSiblingNotOperation: void 0 }, label: { minSpacing: 5 } }, create: (ctx) => new RadiusNumberAxis(ctx) }; // packages/ag-charts-enterprise/src/features/animation/animationModule.ts var import_ag_charts_community22 = require("ag-charts-community"); var import_ag_charts_core18 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/animation/animation.ts var import_ag_charts_community21 = require("ag-charts-community"); var import_ag_charts_core17 = require("ag-charts-core"); var Animation = class extends import_ag_charts_core17.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.enabled = true; ctx.animationManager.skip(false); this.cleanup.register(() => ctx.animationManager.skip(true)); } }; __decorateClass([ (0, import_ag_charts_core17.ObserveChanges)((target, newValue) => { target.ctx.animationManager.skip(!newValue); }), import_ag_charts_core17.Property ], Animation.prototype, "enabled", 2); __decorateClass([ (0, import_ag_charts_core17.ObserveChanges)((target, newValue) => { if (newValue != null) { target.ctx.animationManager.defaultDuration = newValue; } }), import_ag_charts_core17.Property ], Animation.prototype, "duration", 2); __decorateClass([ (0, import_ag_charts_core17.ObserveChanges)((target, newValue) => { target.ctx.animationManager.maxAnimatableItems = newValue ?? Infinity; }), import_ag_charts_core17.Property ], Animation.prototype, "maxAnimatableItems", 2); // packages/ag-charts-enterprise/src/features/animation/animationModule.ts var AnimationModule = { type: "plugin", name: "animation", enterprise: true, version: import_ag_charts_community22.VERSION, options: { enabled: import_ag_charts_core18.boolean, duration: import_ag_charts_core18.positiveNumber }, themeTemplate: { enabled: true }, create: (ctx) => new Animation(ctx) }; AnimationModule.options.maxAnimatableItems = (0, import_ag_charts_core18.undocumented)(import_ag_charts_core18.positiveNumber); // packages/ag-charts-enterprise/src/features/annotations/annotationsModule.ts var import_ag_charts_community69 = require("ag-charts-community"); var import_ag_charts_core88 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/shared-toolbar/sharedToolbar.ts var import_ag_charts_community23 = require("ag-charts-community"); var import_ag_charts_core19 = require("ag-charts-core"); var _SharedToolbar = class _SharedToolbar extends import_ag_charts_core19.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.activeSections = /* @__PURE__ */ new Set(); this.sectionButtons = { annotations: [], chartToolbar: [] }; this.container = this.ctx.domManager.addChild("canvas-overlay", "shared-toolbar"); this.container.role = "presentation"; } getSharedToolbar(section) { if (!this.sharedToolbar) { this.createSharedToolbar(); } if (section === "chartToolbar" && this.sharedToolbar) { this.sharedToolbar.setAriaLabelId("ariaLabelFinancialCharts"); } return this.toolbarWithSection(section); } createSharedToolbar() { this.sharedToolbar = new import_ag_charts_community23._ModuleSupport.Toolbar(this.ctx, "ariaLabelAnnotationsToolbar", "vertical"); this.sharedToolbar.addClass("ag-charts-shared-toolbar"); this.container.append(this.sharedToolbar.getElement()); this.cleanup.register(() => { if (!this.sharedToolbar) return; this.sharedToolbar.getElement().remove(); this.sharedToolbar.destroy(); this.sharedToolbar = void 0; }); } toolbarWithSection(section) { const sharedToolbar = this.sharedToolbar; const withSection = { layout: (layoutBox, padding2) => { if (this.firstLayoutSection != null && this.firstLayoutSection !== section && this.activeSections.has(this.firstLayoutSection)) { return; } this.firstLayoutSection = section; const width = sharedToolbar.getBounds().width; sharedToolbar.setBounds({ x: layoutBox.x, y: layoutBox.y, width }); layoutBox.shrink({ left: width + sharedToolbar.horizontalSpacing + (padding2 ?? 0) }); }, addToolbarListener: (eventType, handler) => { return sharedToolbar.addToolbarListener(eventType, (sharedEvent) => { const sectionIndex = this.getSectionIndex(section, sharedEvent.button.index); if (sectionIndex < 0) return; const event = { ...sharedEvent, button: this.sectionButtons[section][sectionIndex] }; handler(event); }); }, updateButtons: (buttons) => { this.sectionButtons[section] = buttons; const sharedButtons = _SharedToolbar.SECTION_ORDER.flatMap((order) => this.sectionButtons[order]); sharedToolbar.updateButtons(sharedButtons); }, updateButtonByIndex: (index, button) => { sharedToolbar.updateButtonByIndex(this.getIndex(section, index), button); }, toggleActiveButtonByIndex: (index) => { sharedToolbar.toggleActiveButtonByIndex(this.getIndex(section, index)); }, toggleButtonEnabledByIndex: (index, enabled) => { sharedToolbar.toggleButtonEnabledByIndex(this.getIndex(section, index), enabled); }, setHidden: (hidden) => { if (hidden) { this.activeSections.delete(section); } else { this.activeSections.add(section); } let sum = 0; for (const order of _SharedToolbar.SECTION_ORDER) { if (order !== section) { sum += this.sectionButtons[order].length; continue; } for (const index of this.sectionButtons[section].keys()) { sharedToolbar.setButtonHiddenByIndex(sum + index, hidden); } } }, destroy: () => { withSection.setHidden(true); if (this.activeSections.size === 0) { this.destroy(); } }, clearActiveButton: sharedToolbar.clearActiveButton.bind(sharedToolbar), addListener: sharedToolbar.addListener.bind(sharedToolbar), removeListener: sharedToolbar.removeListener.bind(sharedToolbar) }; withSection.setHidden(false); return withSection; } getIndex(section, index) { let sum = 0; for (const order of _SharedToolbar.SECTION_ORDER) { if (order === section) return sum + index; sum += this.sectionButtons[order].length; } return -1; } getSectionIndex(section, index) { let sum = 0; for (const order of _SharedToolbar.SECTION_ORDER) { if (order === section) { if (index >= sum + this.sectionButtons[section].length) return -1; return index - sum; } sum += this.sectionButtons[order].length; } return -1; } }; _SharedToolbar.SECTION_ORDER = ["chartToolbar", "annotations"]; var SharedToolbar = _SharedToolbar; // packages/ag-charts-enterprise/src/features/annotations/annotations.ts var import_ag_charts_community67 = require("ag-charts-community"); var import_ag_charts_core86 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/text-input/textInput.ts var import_ag_charts_community24 = require("ag-charts-community"); var import_ag_charts_core20 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/text-input/textInputTemplate.html var textInputTemplate_default = '
'; // packages/ag-charts-enterprise/src/features/text-input/textInput.ts var moduleId = "text-input"; var canvasOverlay = "canvas-overlay"; var TextInput = class { constructor(ctx) { this.ctx = ctx; this.cleanup = new import_ag_charts_core20.CleanupRegistry(); this.layout = { getTextInputCoords: () => ({ x: 0, y: 0 }), getTextPosition: () => "center", alignment: "center", textAlign: "center" }; this.visible = false; this.element = ctx.domManager.addChild(canvasOverlay, moduleId); this.element.classList.add("ag-charts-text-input"); this.cleanup.register(() => ctx.domManager.removeChild(canvasOverlay, moduleId)); } setKeyDownHandler(handler) { this.cleanup.register((0, import_ag_charts_core20.attachListener)(this.element, "keydown", handler)); } show(opts) { this.element.innerHTML = textInputTemplate_default; const textArea = this.element.firstElementChild; (0, import_ag_charts_core20.setAttributes)(textArea, { role: "textbox", // AG-15233 "data-preventdefault": false // AG-13715 }); if (!textArea.isContentEditable) { textArea.contentEditable = "true"; } textArea.setAttribute( "placeholder", this.ctx.localeManager.t(opts.placeholderText ?? "inputTextareaPlaceholder") ); if (opts.styles?.placeholderColor) { textArea.style.setProperty("--placeholder-text-color", opts.styles?.placeholderColor); } textArea.innerText = opts.text ?? ""; textArea.style.color = opts.styles?.color ?? "inherit"; textArea.style.fontFamily = opts.styles?.fontFamily ?? "inherit"; textArea.style.fontSize = opts.styles?.fontSize ? `${opts.styles.fontSize}px` : "inherit"; textArea.style.fontStyle = opts.styles?.fontStyle ?? "inherit"; textArea.style.fontWeight = typeof opts.styles?.fontWeight === "number" ? `${opts.styles.fontWeight}` : opts.styles?.fontWeight ?? "inherit"; (0, import_ag_charts_core20.focusCursorAtEnd)(textArea); textArea.addEventListener("input", () => { this.updatePosition(); opts.onChange?.(this.getValue(), this.getBBox()); }); textArea.addEventListener("click", (event) => { event.stopPropagation(); }); if (opts.layout) { this.layout = opts.layout; this.updatePosition(); } opts.onChange?.(this.getValue(), this.getBBox()); this.visible = true; } hide() { this.element.innerHTML = ""; this.layout = { getTextInputCoords: () => ({ x: 0, y: 0 }), getTextPosition: () => "center", alignment: "center", textAlign: "center" }; this.visible = false; } isVisible() { return this.visible; } updateColor(color7) { if (!this.element.firstElementChild) return; this.element.firstElementChild.style.color = color7; } updateFontSize(fontSize) { if (!this.element.firstElementChild) return; this.element.firstElementChild.style.fontSize = `${fontSize}px`; this.updatePosition(); return this.getBBox(); } getValue() { if (!this.element.firstElementChild) return; return this.element.firstElementChild.innerText.trim(); } updatePosition() { const { element } = this; const textArea = element.firstElementChild; if (!textArea) return; const sceneRect = this.ctx.domManager.getBoundingClientRect(); const { width, getTextInputCoords, getTextPosition, alignment, textAlign } = this.layout; element.style.setProperty("width", width ? `${width}px` : "unset"); const textRect = textArea.getBoundingClientRect(); const point = getTextInputCoords(textRect.height); let horizontalPosition = point.x; if (alignment === "center") { horizontalPosition -= (width ?? textRect.width) / 2; } else if (alignment === "right") { horizontalPosition -= width ?? textRect.width; } const position = getTextPosition(); let verticalPosition = point.y; if (position === "center") { verticalPosition -= textRect.height / 2; } else if (position === "bottom") { verticalPosition -= textRect.height; } element.style.setProperty("top", `${verticalPosition}px`); element.style.setProperty("left", `${horizontalPosition}px`); element.style.setProperty("max-width", `${sceneRect.width - horizontalPosition}px`); element.style.setProperty("text-align", alignment); textArea.style.setProperty("text-align", textAlign); } getBBox() { const { left, top, width, height } = this.element.getBoundingClientRect(); return new import_ag_charts_community24._ModuleSupport.BBox(left, top, (0, import_ag_charts_core20.ceilTo)(width, 2), height); } destroy() { this.cleanup.flush(); } }; // packages/ag-charts-enterprise/src/features/annotations/annotationAxesButtons.ts var import_ag_charts_core21 = require("ag-charts-core"); var AxesButtons = class extends import_ag_charts_core21.BaseProperties { constructor() { super(...arguments); this.enabled = false; this.axes = "y"; } }; __decorateClass([ import_ag_charts_core21.Property ], AxesButtons.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core21.Property ], AxesButtons.prototype, "axes", 2); // packages/ag-charts-enterprise/src/features/annotations/annotationDefaults.ts var import_ag_charts_community32 = require("ag-charts-community"); var import_ag_charts_core43 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/annotationTypes.ts var AnnotationType = /* @__PURE__ */ ((AnnotationType2) => { AnnotationType2["Line"] = "line"; AnnotationType2["HorizontalLine"] = "horizontal-line"; AnnotationType2["VerticalLine"] = "vertical-line"; AnnotationType2["DisjointChannel"] = "disjoint-channel"; AnnotationType2["ParallelChannel"] = "parallel-channel"; AnnotationType2["FibonacciRetracement"] = "fibonacci-retracement"; AnnotationType2["FibonacciRetracementTrendBased"] = "fibonacci-retracement-trend-based"; AnnotationType2["Callout"] = "callout"; AnnotationType2["Comment"] = "comment"; AnnotationType2["Note"] = "note"; AnnotationType2["Text"] = "text"; AnnotationType2["Arrow"] = "arrow"; AnnotationType2["ArrowUp"] = "arrow-up"; AnnotationType2["ArrowDown"] = "arrow-down"; AnnotationType2["DateRange"] = "date-range"; AnnotationType2["PriceRange"] = "price-range"; AnnotationType2["DatePriceRange"] = "date-price-range"; AnnotationType2["QuickDatePriceRange"] = "quick-date-price-range"; return AnnotationType2; })(AnnotationType || {}); var ANNOTATION_TYPES = Object.values(AnnotationType); function stringToAnnotationType(value) { for (const t of ANNOTATION_TYPES) { if (t === value) return t; } } // packages/ag-charts-enterprise/src/features/annotations/utils/has.ts var import_ag_charts_core42 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/callout/calloutProperties.ts var import_ag_charts_core26 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/annotationProperties.ts var import_ag_charts_community25 = require("ag-charts-community"); var import_ag_charts_core22 = require("ag-charts-core"); var PointProperties = class extends import_ag_charts_core22.BaseProperties { }; __decorateClass([ import_ag_charts_core22.Property ], PointProperties.prototype, "x", 2); __decorateClass([ import_ag_charts_core22.Property ], PointProperties.prototype, "y", 2); var ChannelAnnotationMiddleProperties = class extends Stroke(LineStyle(Visible(import_ag_charts_core22.BaseProperties))) { }; var AxisLabelProperties = class extends Stroke(LineStyle(Fill(Label(Font(import_ag_charts_core22.BaseProperties))))) { constructor() { super(...arguments); this.cornerRadius = 2; } }; __decorateClass([ import_ag_charts_core22.Property ], AxisLabelProperties.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core22.Property ], AxisLabelProperties.prototype, "cornerRadius", 2); var BackgroundProperties = class extends Fill(import_ag_charts_core22.BaseProperties) { }; var HandleProperties = class extends Stroke(LineStyle(Fill(import_ag_charts_core22.BaseProperties))) { }; var LineTextProperties = class extends Font(import_ag_charts_core22.BaseProperties) { constructor() { super(...arguments); this.label = ""; this.position = "top"; this.alignment = "left"; } }; __decorateClass([ import_ag_charts_core22.Property ], LineTextProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core22.Property ], LineTextProperties.prototype, "position", 2); __decorateClass([ import_ag_charts_core22.Property ], LineTextProperties.prototype, "alignment", 2); var LabelTextProperties = class extends Font(import_ag_charts_core22.BaseProperties) { }; var ChannelTextProperties = class extends Font(import_ag_charts_core22.BaseProperties) { constructor() { super(...arguments); this.label = ""; } }; __decorateClass([ import_ag_charts_core22.Property ], ChannelTextProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core22.Property ], ChannelTextProperties.prototype, "position", 2); __decorateClass([ import_ag_charts_core22.Property ], ChannelTextProperties.prototype, "alignment", 2); function Annotation(Parent) { class AnnotationInternal extends Writeable(Visible(Parent)) { constructor() { super(...arguments); // A uuid is required, over the usual incrementing index, as annotations can be restored from external databases this.id = (0, import_ag_charts_core22.generateUUID)(); } } return AnnotationInternal; } function Line3(Parent) { class LineInternal extends Parent { constructor() { super(...arguments); this.start = new PointProperties(); this.end = new PointProperties(); } } __decorateClass([ import_ag_charts_core22.Property ], LineInternal.prototype, "start", 2); __decorateClass([ import_ag_charts_core22.Property ], LineInternal.prototype, "end", 2); return LineInternal; } function Point(Parent) { class PointInternal extends Parent { } __decorateClass([ import_ag_charts_core22.Property ], PointInternal.prototype, "x", 2); __decorateClass([ import_ag_charts_core22.Property ], PointInternal.prototype, "y", 2); return PointInternal; } function Value(Parent) { class ValueInternal extends Parent { } __decorateClass([ import_ag_charts_core22.Property ], ValueInternal.prototype, "value", 2); return ValueInternal; } function Background2(Parent) { class BackgroundInternal extends Parent { constructor() { super(...arguments); this.background = new BackgroundProperties(); } } __decorateClass([ import_ag_charts_core22.Property ], BackgroundInternal.prototype, "background", 2); return BackgroundInternal; } function Handle(Parent) { class HandleInternal extends Parent { constructor() { super(...arguments); this.handle = new HandleProperties(); } } __decorateClass([ import_ag_charts_core22.Property ], HandleInternal.prototype, "handle", 2); return HandleInternal; } function AxisLabel(Parent) { class AxisLabelInternal extends Parent { constructor() { super(...arguments); this.axisLabel = new AxisLabelProperties(); } } __decorateClass([ import_ag_charts_core22.Property ], AxisLabelInternal.prototype, "axisLabel", 2); return AxisLabelInternal; } function Label(Parent) { class LabelInternal extends Parent { constructor() { super(...arguments); this.padding = void 0; this.textAlign = "center"; this.formatter = void 0; } // TODO: making this generic causes issues with mixins sequence } __decorateClass([ import_ag_charts_core22.Property ], LabelInternal.prototype, "padding", 2); __decorateClass([ import_ag_charts_core22.Property ], LabelInternal.prototype, "textAlign", 2); __decorateClass([ import_ag_charts_core22.Property ], LabelInternal.prototype, "formatter", 2); return LabelInternal; } function Cappable(Parent) { class CappableInternal extends Parent { } return CappableInternal; } function Extendable(Parent) { class ExtendableInternal extends Parent { } __decorateClass([ import_ag_charts_core22.Property ], ExtendableInternal.prototype, "extendStart", 2); __decorateClass([ import_ag_charts_core22.Property ], ExtendableInternal.prototype, "extendEnd", 2); return ExtendableInternal; } function Writeable(Parent) { class WriteableInternal extends Parent { isWriteable() { return !this.locked && !this.readOnly; } isHoverable() { return !this.readOnly; } } __decorateClass([ import_ag_charts_core22.Property ], WriteableInternal.prototype, "locked", 2); __decorateClass([ import_ag_charts_core22.Property ], WriteableInternal.prototype, "readOnly", 2); return WriteableInternal; } function Localisable(Parent) { class LocalisableInternal extends Parent { setLocaleManager(localeManager) { this.localeManager ?? (this.localeManager = localeManager); } } return LocalisableInternal; } function Visible(Parent) { class VisibleInternal extends Parent { } __decorateClass([ import_ag_charts_core22.Property ], VisibleInternal.prototype, "visible", 2); return VisibleInternal; } function Fill(Parent) { class FillInternal extends Parent { } __decorateClass([ import_ag_charts_core22.Property ], FillInternal.prototype, "fill", 2); __decorateClass([ import_ag_charts_core22.Property ], FillInternal.prototype, "fillOpacity", 2); return FillInternal; } function Stroke(Parent) { class StrokeInternal extends Parent { } __decorateClass([ import_ag_charts_core22.Property ], StrokeInternal.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core22.Property ], StrokeInternal.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core22.Property ], StrokeInternal.prototype, "strokeWidth", 2); return StrokeInternal; } function LineStyle(Parent) { class LineDashInternal extends Parent { constructor() { super(...arguments); this.lineCap = void 0; this.computedLineDash = void 0; } } __decorateClass([ import_ag_charts_core22.Property ], LineDashInternal.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core22.Property ], LineDashInternal.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core22.Property ], LineDashInternal.prototype, "lineStyle", 2); return LineDashInternal; } function Font(Parent) { class FontInternal extends Parent { constructor() { super(...arguments); this.fontSize = import_ag_charts_core22.FONT_SIZE.SMALL; this.fontFamily = "Verdana, sans-serif"; } } __decorateClass([ import_ag_charts_core22.Property ], FontInternal.prototype, "fontStyle", 2); __decorateClass([ import_ag_charts_core22.Property ], FontInternal.prototype, "fontWeight", 2); __decorateClass([ import_ag_charts_core22.Property ], FontInternal.prototype, "fontSize", 2); __decorateClass([ import_ag_charts_core22.Property ], FontInternal.prototype, "fontFamily", 2); __decorateClass([ import_ag_charts_core22.Property ], FontInternal.prototype, "color", 2); return FontInternal; } // packages/ag-charts-enterprise/src/features/annotations/properties/textualStartEndProperties.ts var import_ag_charts_core25 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/utils/scale.ts var import_ag_charts_core23 = require("ag-charts-core"); function getGrouping(d) { if ((0, import_ag_charts_core23.isNumber)(d) || (0, import_ag_charts_core23.isString)(d) || (0, import_ag_charts_core23.isDate)(d)) { return { value: d, groupPercentage: 0 }; } return d ?? { value: void 0, groupPercentage: 0 }; } function getGroupingValue(d) { return getGrouping(d)?.value; } // packages/ag-charts-enterprise/src/features/annotations/utils/values.ts function convertLine(datum, context) { if (datum.start == null || datum.end == null) return; const start = convertPoint(datum.start, context); const end = convertPoint(datum.end, context); if (start == null || end == null) return; return { x1: start.x, y1: start.y, x2: end.x, y2: end.y }; } function convertPoint(point, context) { const x = convert(point.x, context.xAxis); const y = convert(point.y, context.yAxis); return { x, y }; } function convert(p, context) { if (p == null) return 0; const { value, groupPercentage } = getGrouping(p); const { scale, snapToGroup } = context; const width = scale.bandwidth === 0 ? scale.step ?? 0 : scale.bandwidth ?? 0; const offset = snapToGroup ? width / 2 : width * groupPercentage; return scale.convert(value) + offset; } function invertCoords(coords, context) { const x = invert(coords.x, context.xAxis); const y = invert(coords.y, context.yAxis); return { x, y }; } function invert(n, context) { const { scale } = context; if (context.continuous && scale.step == null) { return context.scaleInvert(n); } const value = context.scaleInvertNearest(n); const width = scale.bandwidth === 0 ? scale.step : scale.bandwidth ?? 0; const bandStart = scale.convert(value); const bandEnd = bandStart + width; const groupPercentage = bandStart === bandEnd ? 0 : (n - bandStart) / (bandEnd - bandStart); return { value, groupPercentage }; } // packages/ag-charts-enterprise/src/features/annotations/properties/startEndProperties.ts var import_ag_charts_core24 = require("ag-charts-core"); var StartEndProperties = class extends Annotation(Line3(Handle(import_ag_charts_core24.BaseProperties))) { constructor() { super(...arguments); this.snapToAngle = 45; } getDefaultColor(_colorPickerType) { return void 0; } getDefaultOpacity(_colorPickerType) { return void 0; } }; // packages/ag-charts-enterprise/src/features/annotations/properties/textualStartEndProperties.ts var TextualStartEndProperties = class extends Localisable(Label(Font(StartEndProperties))) { constructor() { super(...arguments); this.text = ""; this.position = "top"; this.alignment = "left"; this.placement = "inside"; this.placeholderText = "inputTextareaPlaceholder"; } getDefaultColor(_colorPickerType) { return this.color; } getDefaultOpacity(_colorPickerType) { return void 0; } getPlaceholderColor() { return void 0; } getPadding() { const { padding: padding2 = 0 } = this; return { top: padding2, right: padding2, bottom: padding2, left: padding2 }; } getText() { const isPlaceholder = this.text.length == 0; let text2 = this.text; if (isPlaceholder) { text2 = this.placeholderText ?? ""; if (this.localeManager) text2 = this.localeManager.t(text2); } return { text: text2, isPlaceholder }; } getTextInputCoords(context, _height) { return convertPoint(this.end, context); } getTextPosition() { return this.position; } }; __decorateClass([ import_ag_charts_core25.Property ], TextualStartEndProperties.prototype, "text", 2); // packages/ag-charts-enterprise/src/features/annotations/callout/calloutProperties.ts var DEFAULT_CALLOUT_PADDING = { top: 6, right: 12, bottom: 9, left: 12 }; var CalloutProperties = class extends Fill(Stroke(TextualStartEndProperties)) { constructor() { super(...arguments); this.type = "callout" /* Callout */; this.position = "bottom"; this.alignment = "left"; } static is(value) { return (0, import_ag_charts_core26.isObject)(value) && value.type === "callout" /* Callout */; } getDefaultColor(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.fill; case `line-color`: return this.stroke; case `text-color`: default: return this.color; } } getDefaultOpacity(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.fillOpacity; case `line-color`: return this.strokeOpacity; case `text-color`: default: return void 0; } } getPlaceholderColor() { const { r, g, b } = import_ag_charts_core26.Color.fromString(this.color ?? "#888888"); return new import_ag_charts_core26.Color(r, g, b, 0.66).toString(); } getPadding() { const { padding: padding2 } = this; if (padding2 == null) { return { ...DEFAULT_CALLOUT_PADDING }; } return { top: padding2, right: padding2, bottom: padding2, left: padding2 }; } getTextInputCoords(context, height) { const coords = super.getTextInputCoords(context, height); const padding2 = this.getPadding(); const paddingLeft = padding2.left ?? 0; const paddingBottom = padding2.bottom ?? 0; return { x: coords.x + paddingLeft, y: coords.y - paddingBottom }; } }; __decorateClass([ import_ag_charts_core26.Property ], CalloutProperties.prototype, "type", 2); // packages/ag-charts-enterprise/src/features/annotations/comment/commentProperties.ts var import_ag_charts_core28 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/properties/textualPointProperties.ts var import_ag_charts_core27 = require("ag-charts-core"); var TextualPointProperties = class extends Annotation(Point(Handle(Label(Font(import_ag_charts_core27.BaseProperties))))) { constructor() { super(...arguments); this.text = ""; this.position = "top"; this.alignment = "left"; this.placement = "inside"; this.placeholderText = "inputTextareaPlaceholder"; } getDefaultColor(_colorPickerType) { return this.color; } getDefaultOpacity(_colorPickerType) { return void 0; } getPlaceholderColor() { return void 0; } getPadding() { const { padding: padding2 = 0 } = this; return { top: padding2, right: padding2, bottom: padding2, left: padding2 }; } getText() { const isPlaceholder = this.text.length == 0; const text2 = isPlaceholder ? this.placeholderText ?? "" : this.text; return { text: text2, isPlaceholder }; } getTextInputCoords(context, _height) { return convertPoint(this, context); } getTextPosition() { return this.position; } }; __decorateClass([ import_ag_charts_core27.Property ], TextualPointProperties.prototype, "text", 2); // packages/ag-charts-enterprise/src/features/annotations/comment/commentProperties.ts var DEFAULT_COMMENT_PADDING = { top: 8, right: 14, bottom: 8, left: 14 }; var CommentProperties = class extends Fill(Stroke(TextualPointProperties)) { constructor() { super(...arguments); this.type = "comment" /* Comment */; this.position = "bottom"; this.alignment = "left"; } static is(value) { return (0, import_ag_charts_core28.isObject)(value) && value.type === "comment" /* Comment */; } getDefaultColor(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.fill; case `line-color`: return this.stroke; case `text-color`: default: return this.color; } } getDefaultOpacity(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.fillOpacity; case `line-color`: return this.strokeOpacity; case `text-color`: default: return void 0; } } getPlaceholderColor() { const { r, g, b } = import_ag_charts_core28.Color.fromString(this.color ?? "#888888"); return new import_ag_charts_core28.Color(r, g, b, 0.66).toString(); } getPadding() { const { padding: padding2, fontSize } = this; if (padding2 == null) { return { top: Math.max(fontSize * 0.4, DEFAULT_COMMENT_PADDING.top), bottom: Math.max(fontSize * 0.4, DEFAULT_COMMENT_PADDING.bottom), left: Math.max(fontSize * 0.8, DEFAULT_COMMENT_PADDING.left), right: Math.max(fontSize * 0.8, DEFAULT_COMMENT_PADDING.right) }; } return { top: padding2, right: padding2, bottom: padding2, left: padding2 }; } getTextInputCoords(context, height) { const coords = super.getTextInputCoords(context, height); const padding2 = this.getPadding(); return { x: coords.x + padding2.left, y: coords.y - padding2.bottom }; } }; __decorateClass([ import_ag_charts_core28.Property ], CommentProperties.prototype, "type", 2); // packages/ag-charts-enterprise/src/features/annotations/measurer/measurerProperties.ts var import_ag_charts_community26 = require("ag-charts-community"); var import_ag_charts_core30 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/utils/line.ts var import_ag_charts_core29 = require("ag-charts-core"); function getLineStyle(lineDash, lineStyle) { return lineDash ? "dashed" : lineStyle ?? "solid"; } function getComputedLineDash(strokeWidth, styleType) { switch (styleType) { case "solid": return []; case "dashed": return [strokeWidth * 4, strokeWidth * 2]; case "dotted": return [0, strokeWidth * 2]; } } function getLineDash(lineDash, computedLineDash, lineStyle, strokeWidth) { const styleType = getLineStyle(lineDash, lineStyle); return computedLineDash ?? lineDash ?? getComputedLineDash(strokeWidth ?? 1, styleType); } function getLineCap(lineCap, lineDash, lineStyle) { const styleType = getLineStyle(lineDash, lineStyle); return lineCap ?? styleType === "dotted" ? "round" : void 0; } function boundsIntersections(coords, bounds) { const [p1, p2] = import_ag_charts_core29.Vec2.from(coords); const reflection = bounds.height; const gradient = import_ag_charts_core29.Vec2.gradient(p2, p1, reflection); const intercept = import_ag_charts_core29.Vec2.intercept(p2, gradient, reflection); const fallback = [ { x: p1.x, y: reflection ?? 0 }, { x: p1.x, y: reflection == null ? bounds.height : reflection - bounds.height } ]; if (gradient === Infinity) { return fallback; } let points = [ import_ag_charts_core29.Vec2.intersectAtY(gradient, intercept, 0, reflection), import_ag_charts_core29.Vec2.intersectAtY(gradient, intercept, bounds.height, reflection), import_ag_charts_core29.Vec2.intersectAtX(gradient, intercept, 0, reflection), import_ag_charts_core29.Vec2.intersectAtX(gradient, intercept, bounds.width, reflection) ]; points = points.filter((p) => p.x >= bounds.x && p.x <= bounds.width && p.y >= bounds.y && p.y <= bounds.height).sort((a, b) => { if (a.x === b.x) return 0; return a.x < b.x ? -1 : 1; }); if (points.length !== 2) { return fallback; } return points; } // packages/ag-charts-enterprise/src/features/annotations/measurer/measurerProperties.ts var MeasurerStatisticsDivider = class extends Stroke(import_ag_charts_core30.BaseProperties) { }; var MeasurerStatistics = class extends Font(Fill(Stroke(import_ag_charts_core30.BaseProperties))) { constructor() { super(...arguments); this.divider = new MeasurerStatisticsDivider(); } }; __decorateClass([ import_ag_charts_core30.Property ], MeasurerStatistics.prototype, "divider", 2); var MeasurerDirectionProperties = class extends Fill(Stroke(Handle(import_ag_charts_core30.BaseProperties))) { constructor() { super(...arguments); this.statistics = new MeasurerStatistics(); } }; __decorateClass([ import_ag_charts_core30.Property ], MeasurerDirectionProperties.prototype, "statistics", 2); var MeasurerTypeProperties = class extends Localisable(Background2(Stroke(LineStyle(StartEndProperties)))) { constructor() { super(...arguments); this.direction = "both"; this.hasDateRange = false; this.hasPriceRange = false; this.statistics = new MeasurerStatistics(); this.getVolume = () => void 0; this.text = new LineTextProperties(); } getDefaultColor(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.background.fill; case `line-color`: return this.stroke; case `text-color`: return this.text.color; } } getDefaultOpacity(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.background.fillOpacity; case `line-color`: return this.strokeOpacity; } } getLineDash() { return getLineDash(this.lineDash, this.computedLineDash, this.lineStyle, this.strokeWidth); } getLineCap() { return getLineCap(this.lineCap, this.lineDash, this.lineStyle); } }; __decorateClass([ import_ag_charts_core30.Property ], MeasurerTypeProperties.prototype, "statistics", 2); __decorateClass([ import_ag_charts_core30.Property ], MeasurerTypeProperties.prototype, "text", 2); function DateRange(Parent) { class DateRangeInternal extends Parent { constructor() { super(...arguments); this.hasDateRange = true; } } return DateRangeInternal; } function PriceRange(Parent) { class PriceRangeInternal extends Parent { constructor() { super(...arguments); this.hasPriceRange = true; } } return PriceRangeInternal; } var DateRangeProperties = class extends DateRange(MeasurerTypeProperties) { constructor() { super(...arguments); this.type = "date-range" /* DateRange */; this.direction = "horizontal"; } static is(value) { return (0, import_ag_charts_core30.isObject)(value) && value.type === "date-range" /* DateRange */; } }; __decorateClass([ import_ag_charts_core30.Property ], DateRangeProperties.prototype, "type", 2); __decorateClass([ import_ag_charts_core30.Property ], DateRangeProperties.prototype, "extendAbove", 2); __decorateClass([ import_ag_charts_core30.Property ], DateRangeProperties.prototype, "extendBelow", 2); var PriceRangeProperties = class extends PriceRange(MeasurerTypeProperties) { constructor() { super(...arguments); this.type = "price-range" /* PriceRange */; this.direction = "vertical"; } static is(value) { return (0, import_ag_charts_core30.isObject)(value) && value.type === "price-range" /* PriceRange */; } }; __decorateClass([ import_ag_charts_core30.Property ], PriceRangeProperties.prototype, "type", 2); __decorateClass([ import_ag_charts_core30.Property ], PriceRangeProperties.prototype, "extendLeft", 2); __decorateClass([ import_ag_charts_core30.Property ], PriceRangeProperties.prototype, "extendRight", 2); var DatePriceRangeProperties = class extends DateRange(PriceRange(MeasurerTypeProperties)) { constructor() { super(...arguments); this.type = "date-price-range" /* DatePriceRange */; this.direction = "both"; } static is(value) { return (0, import_ag_charts_core30.isObject)(value) && value.type === "date-price-range" /* DatePriceRange */; } }; __decorateClass([ import_ag_charts_core30.Property ], DatePriceRangeProperties.prototype, "type", 2); var QuickDatePriceRangeProperties = class extends DateRange(PriceRange(MeasurerTypeProperties)) { constructor() { super(...arguments); this.type = "quick-date-price-range" /* QuickDatePriceRange */; this.up = new MeasurerDirectionProperties(); this.down = new MeasurerDirectionProperties(); this.direction = "both"; } static is(value) { return (0, import_ag_charts_core30.isObject)(value) && value.type === "quick-date-price-range" /* QuickDatePriceRange */; } }; __decorateClass([ import_ag_charts_core30.Property ], QuickDatePriceRangeProperties.prototype, "type", 2); __decorateClass([ import_ag_charts_core30.Property ], QuickDatePriceRangeProperties.prototype, "up", 2); __decorateClass([ import_ag_charts_core30.Property ], QuickDatePriceRangeProperties.prototype, "down", 2); // packages/ag-charts-enterprise/src/features/annotations/note/noteProperties.ts var import_ag_charts_core32 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/text/util.ts var import_ag_charts_community27 = require("ag-charts-community"); var import_ag_charts_core31 = require("ag-charts-core"); var { BBox: BBox2 } = import_ag_charts_community27._ModuleSupport; var ANNOTATION_TEXT_LINE_HEIGHT = 1.38; function maybeWrapText(options, text2, maxWidth) { return maxWidth ? (0, import_ag_charts_core31.wrapText)(text2, { maxWidth, font: options, textWrap: "always", avoidOrphans: false }) : text2; } function measureAnnotationText(options, text2) { const { lineMetrics, width } = (0, import_ag_charts_core31.cachedTextMeasurer)(options).measureLines(text2); const height = lineMetrics.length * (0, import_ag_charts_core31.calcLineHeight)(options.fontSize, ANNOTATION_TEXT_LINE_HEIGHT); return { width, height }; } function getBBox(options, text2, coords, bbox) { let width = bbox?.width ?? 0; let height = bbox?.height ?? 0; if (!bbox) { const wrappedText = options.width == null ? text2 : maybeWrapText(options, text2, options.width); ({ width, height } = measureAnnotationText(options, wrappedText)); } return new BBox2(coords.x, coords.y, width, height); } function updateTextNode(node, text2, isPlaceholder, config, { x, y }, textBaseline) { const { visible = true, fontFamily, fontSize = 14, fontStyle, fontWeight, textAlign } = config; const lineHeight = (0, import_ag_charts_core31.calcLineHeight)(fontSize, ANNOTATION_TEXT_LINE_HEIGHT); textBaseline ?? (textBaseline = config.position == "center" ? "middle" : config.position); const fill = isPlaceholder ? config.getPlaceholderColor() : config.color; node.setProperties({ x, y, visible, text: text2, fill, fontFamily, fontSize, fontStyle, fontWeight, textAlign, lineHeight, textBaseline }); } // packages/ag-charts-enterprise/src/features/annotations/note/noteProperties.ts var DEFAULT_NOTE_PADDING = 10; var HANDLE_SIZE = 11; var ICON_HEIGHT = 20; var ICON_WIDTH = 22; var ICON_SPACING = 10; var LABEL_OFFSET = ICON_HEIGHT + ICON_SPACING; var TOOLBAR_OFFSET = 34; var NoteBackgroundProperties = class extends Fill(Stroke(import_ag_charts_core32.BaseProperties)) { }; var NoteProperties = class extends Fill(Stroke(TextualPointProperties)) { constructor() { super(...arguments); this.type = "note" /* Note */; this.background = new NoteBackgroundProperties(); this.position = "bottom"; this.alignment = "center"; this.width = 200; } static is(value) { return (0, import_ag_charts_core32.isObject)(value) && value.type === "note" /* Note */; } getDefaultColor(colorPickerType) { switch (colorPickerType) { case `line-color`: return this.fill; case `text-color`: return this.color; } } getDefaultOpacity(colorPickerType) { switch (colorPickerType) { case `line-color`: return this.fillOpacity; case `text-color`: return void 0; } } getPadding() { const padding2 = this.padding ?? DEFAULT_NOTE_PADDING; return { top: padding2, right: padding2, bottom: padding2, left: padding2 }; } getTextInputCoords(context, height) { const { width, text: text2 } = this; const textInputCoords = super.getTextInputCoords(context, height); const padding2 = this.getPadding().top; const bbox = getBBox(this, text2, textInputCoords); bbox.x = (0, import_ag_charts_core32.clamp)(width / 2, bbox.x, context.seriesRect.width - width / 2); const topY = bbox.y - LABEL_OFFSET - padding2 * 2; const bottomY = bbox.y + HANDLE_SIZE + padding2 * 2; const textHeight = Math.max(bbox.height, height); if (topY - textHeight - TOOLBAR_OFFSET < 0) { bbox.y = bottomY; this.position = "top"; } else { bbox.y = topY + padding2; this.position = "bottom"; } return { x: bbox.x, y: bbox.y }; } isHoverable() { return true; } }; __decorateClass([ import_ag_charts_core32.Property ], NoteProperties.prototype, "type", 2); __decorateClass([ import_ag_charts_core32.Property ], NoteProperties.prototype, "background", 2); // packages/ag-charts-enterprise/src/features/annotations/properties/pointProperties.ts var import_ag_charts_core33 = require("ag-charts-core"); var PointProperties2 = class extends Annotation(Point(Handle(import_ag_charts_core33.BaseProperties))) { getDefaultColor(_colorPickerType) { return void 0; } getDefaultOpacity(_colorPickerType) { return void 0; } }; // packages/ag-charts-enterprise/src/features/annotations/properties/shapePointProperties.ts var ShapePointProperties = class _ShapePointProperties extends Fill(PointProperties2) { constructor() { super(...arguments); this.size = 32; } static is(value) { return value instanceof _ShapePointProperties; } getDefaultColor(colorPickerType) { return colorPickerType === `fill-color` ? this.fill : void 0; } getDefaultOpacity(colorPickerType) { return colorPickerType === `fill-color` ? this.fillOpacity : void 0; } }; // packages/ag-charts-enterprise/src/features/annotations/cross-line/crossLineProperties.ts var import_ag_charts_community28 = require("ag-charts-community"); var import_ag_charts_core34 = require("ag-charts-core"); var HorizontalLineProperties = class extends Annotation(Value(Handle(AxisLabel(Stroke(LineStyle(import_ag_charts_core34.BaseProperties)))))) { constructor() { super(...arguments); this.direction = "horizontal"; this.type = "horizontal-line" /* HorizontalLine */; this.text = new LineTextProperties(); } static is(value) { return (0, import_ag_charts_core34.isObject)(value) && value.type === "horizontal-line" /* HorizontalLine */; } getDefaultColor() { return this.stroke; } getDefaultOpacity() { return this.strokeOpacity; } getLineDash() { return getLineDash(this.lineDash, this.computedLineDash, this.lineStyle, this.strokeWidth); } getLineCap() { return getLineCap(this.lineCap, this.lineDash, this.lineStyle); } }; __decorateClass([ import_ag_charts_core34.Property ], HorizontalLineProperties.prototype, "type", 2); __decorateClass([ import_ag_charts_core34.Property ], HorizontalLineProperties.prototype, "text", 2); var VerticalLineProperties = class extends Annotation(Value(Handle(AxisLabel(Stroke(LineStyle(import_ag_charts_core34.BaseProperties)))))) { constructor() { super(...arguments); this.direction = "vertical"; this.type = "vertical-line" /* VerticalLine */; this.text = new LineTextProperties(); } static is(value) { return (0, import_ag_charts_core34.isObject)(value) && value.type === "vertical-line" /* VerticalLine */; } getDefaultColor() { return this.stroke; } getDefaultOpacity() { return this.strokeOpacity; } getLineDash() { return getLineDash(this.lineDash, this.computedLineDash, this.lineStyle, this.strokeWidth); } getLineCap() { return getLineCap(this.lineCap, this.lineDash, this.lineStyle); } }; __decorateClass([ import_ag_charts_core34.Property ], VerticalLineProperties.prototype, "type", 2); __decorateClass([ import_ag_charts_core34.Property ], VerticalLineProperties.prototype, "text", 2); // packages/ag-charts-enterprise/src/features/annotations/disjoint-channel/disjointChannelProperties.ts var import_ag_charts_community29 = require("ag-charts-community"); var import_ag_charts_core35 = require("ag-charts-core"); var DisjointChannelProperties = class extends Annotation( Background2(Line3(Handle(Extendable(Stroke(LineStyle(import_ag_charts_core35.BaseProperties)))))) ) { constructor() { super(...arguments); this.type = "disjoint-channel" /* DisjointChannel */; this.text = new ChannelTextProperties(); this.snapToAngle = 45; } static is(value) { return (0, import_ag_charts_core35.isObject)(value) && value.type === "disjoint-channel" /* DisjointChannel */; } get bottom() { const bottom = { start: { x: this.start.x, y: this.start.y }, end: { x: this.end.x, y: this.end.y } }; if (typeof bottom.start.y === "number" && typeof bottom.end.y === "number") { bottom.start.y -= this.startHeight; bottom.end.y -= this.endHeight; } else { import_ag_charts_core35.Logger.warnOnce(`Annotation [${this.type}] can only be used with a numeric y-axis.`); } return bottom; } getDefaultColor(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.background.fill; case `line-color`: return this.stroke; case "text-color": return this.text.color; } } getDefaultOpacity(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.background.fillOpacity; case `line-color`: return this.strokeOpacity; } } getLineDash() { return getLineDash(this.lineDash, this.computedLineDash, this.lineStyle, this.strokeWidth); } getLineCap() { return getLineCap(this.lineCap, this.lineDash, this.lineStyle); } }; __decorateClass([ import_ag_charts_core35.Property ], DisjointChannelProperties.prototype, "type", 2); __decorateClass([ import_ag_charts_core35.Property ], DisjointChannelProperties.prototype, "startHeight", 2); __decorateClass([ import_ag_charts_core35.Property ], DisjointChannelProperties.prototype, "endHeight", 2); __decorateClass([ import_ag_charts_core35.Property ], DisjointChannelProperties.prototype, "text", 2); // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement-trend-based/fibonacciRetracementTrendBasedProperties.ts var import_ag_charts_core38 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/properties/fibonacciProperties.ts var import_ag_charts_core37 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/line/lineProperties.ts var import_ag_charts_community30 = require("ag-charts-community"); var import_ag_charts_core36 = require("ag-charts-core"); var LineTypeProperties = class extends Localisable( Cappable(Extendable(Stroke(LineStyle(StartEndProperties)))) ) { constructor() { super(...arguments); this.text = new LineTextProperties(); } getDefaultColor(colorPickerType) { switch (colorPickerType) { case "line-color": return this.stroke; case "text-color": return this.text.color; } } getDefaultOpacity() { return this.strokeOpacity; } getLineDash() { return getLineDash(this.lineDash, this.computedLineDash, this.lineStyle, this.strokeWidth); } getLineCap() { return getLineCap(this.lineCap, this.lineDash, this.lineStyle); } }; __decorateClass([ import_ag_charts_core36.Property ], LineTypeProperties.prototype, "text", 2); var ArrowProperties = class extends LineTypeProperties { constructor() { super(...arguments); this.type = "arrow" /* Arrow */; this.endCap = "arrow"; } static is(value) { return (0, import_ag_charts_core36.isObject)(value) && value.type === "arrow" /* Arrow */; } }; __decorateClass([ import_ag_charts_core36.Property ], ArrowProperties.prototype, "type", 2); var LineProperties = class extends LineTypeProperties { constructor() { super(...arguments); this.type = "line" /* Line */; } static is(value) { return (0, import_ag_charts_core36.isObject)(value) && value.type === "line" /* Line */; } }; __decorateClass([ import_ag_charts_core36.Property ], LineProperties.prototype, "type", 2); // packages/ag-charts-enterprise/src/features/annotations/properties/fibonacciProperties.ts var FibonacciProperties = class extends LineTypeProperties { constructor() { super(...arguments); this.label = new LabelTextProperties(); this.reverse = false; this.showFill = true; this.isMultiColor = true; this.strokes = []; this.bands = 10; } getDefaultColor(colorPickerType) { switch (colorPickerType) { case "line-color": return this.rangeStroke ?? this.stroke; case "text-color": return this.text.color; } } }; __decorateClass([ import_ag_charts_core37.Property ], FibonacciProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core37.Property ], FibonacciProperties.prototype, "reverse", 2); __decorateClass([ import_ag_charts_core37.Property ], FibonacciProperties.prototype, "showFill", 2); __decorateClass([ import_ag_charts_core37.Property ], FibonacciProperties.prototype, "isMultiColor", 2); __decorateClass([ import_ag_charts_core37.Property ], FibonacciProperties.prototype, "strokes", 2); __decorateClass([ import_ag_charts_core37.Property ], FibonacciProperties.prototype, "rangeStroke", 2); __decorateClass([ import_ag_charts_core37.Property ], FibonacciProperties.prototype, "bands", 2); // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement-trend-based/fibonacciRetracementTrendBasedProperties.ts var FibonacciRetracementTrendBasedProperties = class extends FibonacciProperties { constructor() { super(...arguments); this.type = "fibonacci-retracement-trend-based" /* FibonacciRetracementTrendBased */; this.endRetracement = new PointProperties(); } static is(value) { return (0, import_ag_charts_core38.isObject)(value) && value.type === "fibonacci-retracement-trend-based" /* FibonacciRetracementTrendBased */; } }; __decorateClass([ import_ag_charts_core38.Property ], FibonacciRetracementTrendBasedProperties.prototype, "type", 2); __decorateClass([ import_ag_charts_core38.Property ], FibonacciRetracementTrendBasedProperties.prototype, "endRetracement", 2); // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement/fibonacciRetracementProperties.ts var import_ag_charts_core39 = require("ag-charts-core"); var FibonacciRetracementProperties = class extends FibonacciProperties { constructor() { super(...arguments); this.type = "fibonacci-retracement" /* FibonacciRetracement */; } static is(value) { return (0, import_ag_charts_core39.isObject)(value) && value.type === "fibonacci-retracement" /* FibonacciRetracement */; } }; __decorateClass([ import_ag_charts_core39.Property ], FibonacciRetracementProperties.prototype, "type", 2); // packages/ag-charts-enterprise/src/features/annotations/parallel-channel/parallelChannelProperties.ts var import_ag_charts_community31 = require("ag-charts-community"); var import_ag_charts_core40 = require("ag-charts-core"); var ParallelChannelProperties = class extends Annotation( Background2(Line3(Handle(Extendable(Stroke(LineStyle(import_ag_charts_core40.BaseProperties)))))) ) { constructor() { super(...arguments); this.type = "parallel-channel" /* ParallelChannel */; this.middle = new ChannelAnnotationMiddleProperties(); this.text = new ChannelTextProperties(); this.snapToAngle = 45; } static is(value) { return (0, import_ag_charts_core40.isObject)(value) && value.type === "parallel-channel" /* ParallelChannel */; } get bottom() { const bottom = { start: { x: this.start.x, y: this.start.y }, end: { x: this.end.x, y: this.end.y } }; if (typeof bottom.start.y === "number" && typeof bottom.end.y === "number") { bottom.start.y -= this.height; bottom.end.y -= this.height; } else { import_ag_charts_core40.Logger.warnOnce(`Annotation [${this.type}] can only be used with a numeric y-axis.`); } return bottom; } getDefaultColor(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.background.fill; case `line-color`: return this.stroke; case "text-color": return this.text.color; } } getDefaultOpacity(colorPickerType) { switch (colorPickerType) { case `fill-color`: return this.background.fillOpacity; case `line-color`: return this.strokeOpacity; } } getLineDash() { return getLineDash(this.lineDash, this.computedLineDash, this.lineStyle, this.strokeWidth); } getLineCap() { return getLineCap(this.lineCap, this.lineDash, this.lineStyle); } }; __decorateClass([ import_ag_charts_core40.Property ], ParallelChannelProperties.prototype, "type", 2); __decorateClass([ import_ag_charts_core40.Property ], ParallelChannelProperties.prototype, "height", 2); __decorateClass([ import_ag_charts_core40.Property ], ParallelChannelProperties.prototype, "middle", 2); __decorateClass([ import_ag_charts_core40.Property ], ParallelChannelProperties.prototype, "text", 2); // packages/ag-charts-enterprise/src/features/annotations/text/textProperties.ts var import_ag_charts_core41 = require("ag-charts-core"); var TextProperties = class extends TextualPointProperties { constructor() { super(...arguments); this.type = "text" /* Text */; this.position = "bottom"; } static is(value) { return (0, import_ag_charts_core41.isObject)(value) && value.type === "text" /* Text */; } }; __decorateClass([ import_ag_charts_core41.Property ], TextProperties.prototype, "type", 2); // packages/ag-charts-enterprise/src/features/annotations/utils/types.ts function isEphemeralType(datum) { return QuickDatePriceRangeProperties.is(datum); } function isLineType(datum) { return LineProperties.is(datum) || HorizontalLineProperties.is(datum) || VerticalLineProperties.is(datum) || ArrowProperties.is(datum) || isFibonacciType(datum); } function isChannelType(datum) { return DisjointChannelProperties.is(datum) || ParallelChannelProperties.is(datum); } function isFibonacciType(datum) { return FibonacciRetracementProperties.is(datum) || FibonacciRetracementTrendBasedProperties.is(datum); } function isTextType(datum) { return CalloutProperties.is(datum) || CommentProperties.is(datum) || NoteProperties.is(datum) || TextProperties.is(datum); } function isMeasurerType(datum) { return DateRangeProperties.is(datum) || PriceRangeProperties.is(datum) || DatePriceRangeProperties.is(datum) || QuickDatePriceRangeProperties.is(datum); } // packages/ag-charts-enterprise/src/features/annotations/utils/has.ts function hasFontSize(datum) { return isTextType(datum) && !NoteProperties.is(datum); } function hasLineStyle(datum) { return isLineType(datum) || isChannelType(datum) || isMeasurerType(datum) && !QuickDatePriceRangeProperties.is(datum); } function hasLineColor(datum) { return isLineType(datum) || isChannelType(datum) || isMeasurerType(datum) || CalloutProperties.is(datum) || NoteProperties.is(datum); } function hasIconColor(datum) { return NoteProperties.is(datum); } function hasFillColor(datum) { return isChannelType(datum) || isMeasurerType(datum) || CalloutProperties.is(datum) || CommentProperties.is(datum) || ShapePointProperties.is(datum); } function hasTextColor(datum) { return isTextType(datum) && !NoteProperties.is(datum); } function hasLineText(datum) { return (isLineType(datum) || isChannelType(datum) || isMeasurerType(datum)) && !isEphemeralType(datum) && (0, import_ag_charts_core42.isObject)(datum.text); } // packages/ag-charts-enterprise/src/features/annotations/utils/styles.ts function setFontSize(datum, fontSize) { if ("fontSize" in datum) datum.fontSize = fontSize; if (hasLineText(datum)) datum.text.fontSize = fontSize; } function setLineStyle(datum, style) { const strokeWidth = style?.strokeWidth ?? datum.strokeWidth ?? 1; const lineType = style?.type ?? datum.lineStyle; const lineStyle = lineType ?? getLineStyle(datum.lineDash, lineType); const computedLineDash = getComputedLineDash(strokeWidth, lineStyle); datum.strokeWidth = strokeWidth; datum.computedLineDash = computedLineDash; datum.lineStyle = lineStyle; datum.lineCap = lineStyle === "dotted" ? "round" : void 0; } function setColor(datum, colorPickerType, colorOpacity, color7, opacity, isMultiColor) { switch (colorPickerType) { case `fill-color`: { if ("fill" in datum) datum.fill = color7; if ("fillOpacity" in datum) datum.fillOpacity = opacity; if ("background" in datum) { datum.background.fill = color7; datum.background.fillOpacity = opacity; } break; } case `line-color`: { if ("axisLabel" in datum) { datum.axisLabel.fill = color7; datum.axisLabel.fillOpacity = opacity; datum.axisLabel.stroke = color7; datum.axisLabel.strokeOpacity = opacity; } if ("fill" in datum && "fillOpacity" in datum && hasIconColor(datum)) { datum.fill = color7; datum.fillOpacity = opacity; } else { if ("strokeOpacity" in datum) datum.strokeOpacity = opacity; if ("isMultiColor" in datum && "rangeStroke" in datum) { datum.isMultiColor = isMultiColor; datum.rangeStroke = color7; } else if ("stroke" in datum) { datum.stroke = color7; } } break; } case `text-color`: { if ("color" in datum) datum.color = colorOpacity; if (hasLineText(datum)) datum.text.color = color7; break; } } } // packages/ag-charts-enterprise/src/features/annotations/annotationDefaults.ts var AnnotationDefaults = class { constructor() { this.mementoOriginatorKey = "annotation-defaults"; this.colors = new Map( Object.values(AnnotationType).map((type) => [ type, /* @__PURE__ */ new Map([ ["line-color", void 0], ["fill-color", void 0], ["text-color", void 0] ]) ]) ); this.fontSizes = /* @__PURE__ */ new Map([ ["callout" /* Callout */, void 0], ["comment" /* Comment */, void 0], ["text" /* Text */, void 0], ["arrow" /* Arrow */, void 0], ["line" /* Line */, void 0], ["disjoint-channel" /* DisjointChannel */, void 0], ["parallel-channel" /* ParallelChannel */, void 0], ["date-range" /* DateRange */, void 0], ["price-range" /* PriceRange */, void 0], ["date-price-range" /* DatePriceRange */, void 0] ]); this.lineStyles = /* @__PURE__ */ new Map([ ["line" /* Line */, void 0], ["horizontal-line" /* HorizontalLine */, void 0], ["vertical-line" /* VerticalLine */, void 0], ["disjoint-channel" /* DisjointChannel */, void 0], ["parallel-channel" /* ParallelChannel */, void 0], ["arrow" /* Arrow */, void 0], ["date-range" /* DateRange */, void 0], ["price-range" /* PriceRange */, void 0], ["date-price-range" /* DatePriceRange */, void 0] ]); this.lineTextAlignments = /* @__PURE__ */ new Map([ ["line" /* Line */, void 0], ["horizontal-line" /* HorizontalLine */, void 0], ["vertical-line" /* VerticalLine */, void 0], ["disjoint-channel" /* DisjointChannel */, void 0], ["parallel-channel" /* ParallelChannel */, void 0], ["arrow" /* Arrow */, void 0], ["date-range" /* DateRange */, void 0], ["price-range" /* PriceRange */, void 0], ["date-price-range" /* DatePriceRange */, void 0] ]); this.lineTextPositions = /* @__PURE__ */ new Map([ ["line" /* Line */, void 0], ["horizontal-line" /* HorizontalLine */, void 0], ["vertical-line" /* VerticalLine */, void 0], ["disjoint-channel" /* DisjointChannel */, void 0], ["parallel-channel" /* ParallelChannel */, void 0], ["arrow" /* Arrow */, void 0], ["date-range" /* DateRange */, void 0], ["price-range" /* PriceRange */, void 0], ["date-price-range" /* DatePriceRange */, void 0] ]); this.fibonacciOptions = /* @__PURE__ */ new Map([ [ "fibonacci-retracement" /* FibonacciRetracement */, { bands: void 0, reverse: void 0, showFill: void 0 } ], [ "fibonacci-retracement-trend-based" /* FibonacciRetracementTrendBased */, { bands: void 0, reverse: void 0, showFill: void 0 } ] ]); } createMemento() { return { colors: (0, import_ag_charts_core43.deepClone)(this.colors), fontSizes: (0, import_ag_charts_core43.deepClone)(this.fontSizes), lineStyles: (0, import_ag_charts_core43.deepClone)(this.lineStyles), lineTextAlignments: (0, import_ag_charts_core43.deepClone)(this.lineTextAlignments), lineTextPositions: (0, import_ag_charts_core43.deepClone)(this.lineTextPositions), fibonacciOptions: (0, import_ag_charts_core43.deepClone)(this.fibonacciOptions) }; } guardMemento(_blob) { return true; } restoreMemento(_version, _mementoVersion, blob) { this.colors = (0, import_ag_charts_core43.deepClone)(blob.colors); this.fontSizes = (0, import_ag_charts_core43.deepClone)(blob.fontSizes); this.lineStyles = (0, import_ag_charts_core43.deepClone)(blob.lineStyles); this.lineTextAlignments = (0, import_ag_charts_core43.deepClone)(blob.lineTextAlignments); this.lineTextPositions = (0, import_ag_charts_core43.deepClone)(blob.lineTextPositions); this.fibonacciOptions = (0, import_ag_charts_core43.deepClone)(blob.fibonacciOptions); } setDefaultColor(type, colorType, colorOpacity, color7, opacity, isMultiColor) { this.colors.get(type)?.set(colorType, [colorOpacity, color7, opacity, isMultiColor]); } setDefaultFontSize(type, fontSize) { this.fontSizes.set(type, fontSize); } setDefaultLineStyleType(type, lineStyleType) { const defaultStyle = this.lineStyles.get(type); if (defaultStyle) { defaultStyle.type = lineStyleType; } else { this.lineStyles.set(type, { type: lineStyleType }); } } setDefaultLineStyleWidth(type, strokeWidth) { const defaultStyle = this.lineStyles.get(type); if (defaultStyle) { defaultStyle.strokeWidth = strokeWidth; } else { this.lineStyles.set(type, { strokeWidth }); } } setDefaultLineTextAlignment(type, alignment) { this.lineTextAlignments.set(type, alignment); } setDefaultLineTextPosition(type, position) { this.lineTextPositions.set(type, position); } setDefaultFibonacciOptions(type, key, value) { if (type != "fibonacci-retracement" /* FibonacciRetracement */ && type != "fibonacci-retracement-trend-based" /* FibonacciRetracementTrendBased */) return; const options = this.fibonacciOptions.get(type); options[key] = value; this.fibonacciOptions.set(type, options); } applyDefaults(datum) { for (const [annotationType, colors] of this.colors) { if (datum.type !== annotationType) continue; for (const [colorPickerType, [colorOpacity, color7, opacity, isMultiColor] = []] of colors) { if (colorOpacity && color7 && opacity != null && isMultiColor != null) { setColor(datum, colorPickerType, colorOpacity, color7, opacity, isMultiColor); } } } for (const [annotationType, size] of this.fontSizes) { if (datum.type !== annotationType || size == null) continue; setFontSize(datum, size); } for (const [annotationType, style] of this.lineStyles) { if (datum.type !== annotationType || style == null) continue; setLineStyle(datum, style); } for (const [annotationType, position] of this.lineTextPositions) { if (datum.type !== annotationType || position == null) continue; datum.text.position = position; } for (const [annotationType, alignment] of this.lineTextAlignments) { if (datum.type !== annotationType || alignment == null) continue; datum.text.alignment = alignment; } for (const [annotationType, options] of this.fibonacciOptions) { if (datum.type !== annotationType || options == null) continue; for (const option of Object.keys(options)) { const value = options[option]; if (value == null) { continue; } datum.set({ [option]: value }); } } } }; // packages/ag-charts-enterprise/src/features/annotations/annotationOptionsToolbar.ts var import_ag_charts_community35 = require("ag-charts-community"); var import_ag_charts_core46 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/components/color-picker/colorPicker.ts var import_ag_charts_community33 = require("ag-charts-community"); var import_ag_charts_core44 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/components/color-picker/colorPickerTemplate.html var colorPickerTemplate_default = '
'; // packages/ag-charts-enterprise/src/components/color-picker/colorPicker.ts var getHsva = (input) => { try { const color7 = import_ag_charts_core44.Color.fromString(input); const [h, s, v] = color7.toHSB(); return [h, s, v, color7.a]; } catch { return; } }; var ColorPicker = class extends import_ag_charts_community33._ModuleSupport.AnchoredPopover { constructor(ctx, options) { super(ctx, "color-picker", options); this.hasChanged = false; this.hideFns.push(() => { this.i18nUpdater = void 0; if (this.hasChanged) this.onChangeHide?.(); }); this.cleanup.register(this.ctx.eventsHub.on("locale:change", () => this.i18nUpdater?.())); } show(options) { this.hasChanged = false; this.onChangeHide = options.onChangeHide; const { element, initialFocus } = this.createColorPicker(options); const popover = this.showWithChildren([element], { initialFocus, ...options }); popover.classList.add("ag-charts-color-picker"); popover.setAttribute("role", "dialog"); } createColorPicker(opts) { const { localeManager } = this.ctx; let isMultiColor = opts.isMultiColor ?? false; let [h, s, v, a] = getHsva(opts.color ?? "#f00") ?? [0, 1, 0.5, 1]; a = opts.opacity ?? a; const colorPicker = (0, import_ag_charts_core44.createElement)("div", "ag-charts-color-picker__content"); colorPicker.innerHTML = colorPickerTemplate_default; colorPicker.ariaLabel = this.ctx.localeManager.t("ariaLabelColorPicker"); const paletteInput = colorPicker.querySelector(".ag-charts-color-picker__palette"); const hueInput = colorPicker.querySelector(".ag-charts-color-picker__hue-input"); const multiColorButton = colorPicker.querySelector( ".ag-charts-color-picker__multi-color-button" ); const alphaInput = colorPicker.querySelector(".ag-charts-color-picker__alpha-input"); const colorInput = colorPicker.querySelector(".ag-charts-color-picker__color-input"); const colorInputLabel = colorPicker.querySelector(".ag-charts-color-picker__color-label"); const updatePaletteInputAriaValue = (first) => { const key = { s: "ariaValueColorPalette", v: "ariaValueColorPaletteFirstV" }[first]; paletteInput.ariaValueText = localeManager.t(key, { s, v }); }; this.i18nUpdater = () => { paletteInput.ariaRoleDescription = localeManager.t("ariaRoleDescription2DSlider"); paletteInput.ariaLabel = localeManager.t("ariaLabelColorPickerPalette"); hueInput.ariaLabel = localeManager.t("ariaLabelColorPickerHue"); multiColorButton.ariaLabel = localeManager.t("ariaLabelColorPickerMultiColor"); alphaInput.ariaLabel = localeManager.t("ariaLabelColorPickerAlpha"); colorInput.ariaLabel = localeManager.t("ariaLabelColor"); updatePaletteInputAriaValue("s"); }; this.i18nUpdater(); multiColorButton.classList.toggle( "ag-charts-color-picker__multi-color-button--hidden", !opts.hasMultiColorOption ); const update = (trackChange = true) => { const color7 = import_ag_charts_core44.Color.fromHSB(h, s, v, a); const colorString = color7.toHexString(); colorPicker.style.setProperty("--h", `${h}`); colorPicker.style.setProperty("--s", `${s}`); colorPicker.style.setProperty("--v", `${v}`); colorPicker.style.setProperty("--a", `${a}`); colorPicker.style.setProperty("--color", colorString.slice(0, 7)); colorPicker.style.setProperty("--color-a", colorString); hueInput.value = `${h}`; alphaInput.value = `${a}`; alphaInput.classList.toggle("ag-charts-color-picker__alpha-input--opaque", a === 1); multiColorButton.classList.toggle("ag-charts-color-picker__multi-color-button--active", isMultiColor); colorInputLabel.classList.toggle("ag-charts-color-picker__color-label--multi-color", isMultiColor); if (document.activeElement !== colorInput) { multiColorButton.ariaChecked = isMultiColor.toString(); colorInput.value = isMultiColor ? localeManager.t("ariaLabelColorPickerMultiColor") : colorString.toUpperCase(); } if (trackChange || opts.color == null) { const plainColor = import_ag_charts_core44.Color.fromHSB(h, s, v, 1).toHexString(); opts.onChange?.(colorString, plainColor, a, isMultiColor); } if (trackChange) this.hasChanged = true; }; update(false); const preventDefault = (event) => event.preventDefault(); const stopPropagation = (event) => event.stopPropagation(); const beginPaletteInteraction = (e) => { e.preventDefault(); const currentTarget = e.currentTarget; currentTarget.focus(); const rect = currentTarget.getBoundingClientRect(); const pointerMove = ({ clientX, clientY }) => { isMultiColor = false; s = Math.min(Math.max((clientX - rect.left) / rect.width, 0), 1); v = 1 - Math.min(Math.max((clientY - rect.top) / rect.height, 0), 1); update(); updatePaletteInputAriaValue("s"); }; pointerMove(e); const pointerUp = (0, import_ag_charts_core44.attachListener)((0, import_ag_charts_core44.getWindow)(), "pointermove", pointerMove); (0, import_ag_charts_core44.getWindow)().addEventListener("pointerup", pointerUp, { once: true }); }; colorPicker.addEventListener("mousedown", stopPropagation); colorPicker.addEventListener("touchstart", stopPropagation); colorPicker.addEventListener("touchmove", stopPropagation); colorPicker.addEventListener("keydown", (e) => { e.stopPropagation(); switch (e.key) { case "Enter": case "Escape": this.hide(); break; default: return; } e.preventDefault(); }); paletteInput.addEventListener("pointerdown", beginPaletteInteraction); paletteInput.addEventListener("touchstart", preventDefault, { passive: false }); paletteInput.addEventListener("touchmove", preventDefault, { passive: false }); paletteInput.addEventListener("keydown", (e) => { if (e.key === "ArrowLeft") { s = (0, import_ag_charts_core44.clamp)(0, s - 0.01, 1); updatePaletteInputAriaValue("s"); } else if (e.key === "ArrowRight") { s = (0, import_ag_charts_core44.clamp)(0, s + 0.01, 1); updatePaletteInputAriaValue("s"); } else if (e.key === "ArrowUp") { v = (0, import_ag_charts_core44.clamp)(0, v + 0.01, 1); updatePaletteInputAriaValue("v"); } else if (e.key === "ArrowDown") { v = (0, import_ag_charts_core44.clamp)(0, v - 0.01, 1); updatePaletteInputAriaValue("v"); } else { return; } e.preventDefault(); update(); }); paletteInput.addEventListener("focus", () => { updatePaletteInputAriaValue("s"); }); multiColorButton.addEventListener("click", () => { isMultiColor = !isMultiColor; update(); }); hueInput.addEventListener("input", (e) => { isMultiColor = false; h = e.currentTarget.valueAsNumber ?? 0; update(); }); alphaInput.addEventListener("input", (e) => { isMultiColor = false; a = e.currentTarget.valueAsNumber ?? 0; update(); }); colorInput.addEventListener("input", (e) => { isMultiColor = false; const hsva = getHsva(e.currentTarget.value); if (hsva == null) return; [h, s, v, a] = hsva; update(); }); colorInput.addEventListener("blur", () => update()); colorInput.addEventListener("keydown", (e) => { if (e.key === "Enter") { e.currentTarget.blur(); update(); } }); return { element: colorPicker, initialFocus: paletteInput }; } }; // packages/ag-charts-enterprise/src/features/toolbar/buttonProperties.ts var import_ag_charts_core45 = require("ag-charts-core"); var ToolbarButtonProperties = class extends import_ag_charts_core45.BaseProperties { }; __decorateClass([ import_ag_charts_core45.Property ], ToolbarButtonProperties.prototype, "icon", 2); __decorateClass([ import_ag_charts_core45.Property ], ToolbarButtonProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core45.Property ], ToolbarButtonProperties.prototype, "ariaLabel", 2); __decorateClass([ import_ag_charts_core45.Property ], ToolbarButtonProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/features/annotations/annotationsMenuOptions.ts var import_ag_charts_community34 = require("ag-charts-community"); function channelMenuItemVisible(scale) { return !(scale instanceof import_ag_charts_community34._ModuleSupport.LogScale) && !(scale instanceof import_ag_charts_community34._ModuleSupport.BandScale); } var LINE_ANNOTATION_ITEMS = [ { label: "toolbarAnnotationsTrendLine", icon: "trend-line-drawing", value: "line" /* Line */ }, { label: "toolbarAnnotationsHorizontalLine", icon: "horizontal-line-drawing", value: "horizontal-line" /* HorizontalLine */ }, { label: "toolbarAnnotationsVerticalLine", icon: "vertical-line-drawing", value: "vertical-line" /* VerticalLine */ }, { label: "toolbarAnnotationsParallelChannel", icon: "parallel-channel-drawing", value: "parallel-channel" /* ParallelChannel */, visible: channelMenuItemVisible }, { label: "toolbarAnnotationsDisjointChannel", icon: "disjoint-channel-drawing", value: "disjoint-channel" /* DisjointChannel */, visible: channelMenuItemVisible } ]; var FIBONACCI_ANNOTATION_ITEMS = [ { label: "toolbarAnnotationsFibonacciRetracement", icon: "fibonacci-retracement-drawing", value: "fibonacci-retracement" /* FibonacciRetracement */ }, { label: "toolbarAnnotationsFibonacciRetracementTrendBased", icon: "fibonacci-retracement-trend-based-drawing", value: "fibonacci-retracement-trend-based" /* FibonacciRetracementTrendBased */ } ]; var FIBONACCI_RATIO_ITEMS = [ { label: "Fibonacci - Extended", value: 10 }, { label: "Fibonacci - 6 Band", value: 6 }, { label: "Fibonacci - 4 Band", value: 4 } ]; var TEXT_ANNOTATION_ITEMS = [ { label: "toolbarAnnotationsText", icon: "text-annotation", value: "text" /* Text */ }, { label: "toolbarAnnotationsComment", icon: "comment-annotation", value: "comment" /* Comment */ }, { label: "toolbarAnnotationsCallout", icon: "callout-annotation", value: "callout" /* Callout */ }, { label: "toolbarAnnotationsNote", icon: "note-annotation", value: "note" /* Note */ } ]; var SHAPE_ANNOTATION_ITEMS = [ { label: "toolbarAnnotationsArrow", icon: "arrow-drawing", value: "arrow" /* Arrow */ }, { label: "toolbarAnnotationsArrowUp", icon: "arrow-up-drawing", value: "arrow-up" /* ArrowUp */ }, { label: "toolbarAnnotationsArrowDown", icon: "arrow-down-drawing", value: "arrow-down" /* ArrowDown */ } ]; var MEASURER_ANNOTATION_ITEMS = [ { label: "toolbarAnnotationsQuickDatePriceRange", icon: "measurer-drawing", value: "quick-date-price-range" /* QuickDatePriceRange */ }, { label: "toolbarAnnotationsDateRange", icon: "date-range-drawing", value: "date-range" /* DateRange */ }, { label: "toolbarAnnotationsPriceRange", icon: "price-range-drawing", value: "price-range" /* PriceRange */ }, { label: "toolbarAnnotationsDatePriceRange", icon: "date-price-range-drawing", value: "date-price-range" /* DatePriceRange */ } ]; var LINE_STROKE_WIDTH_ITEMS = [ { strokeWidth: 1, label: "1", value: 1 }, { strokeWidth: 2, label: "2", value: 2 }, { strokeWidth: 3, label: "3", value: 3 }, { strokeWidth: 4, label: "4", value: 4 }, { strokeWidth: 8, label: "8", value: 8 } ]; var LINE_STYLE_TYPE_ITEMS = [ { icon: "line-style-solid", altText: "iconAltTextLineStyleSolid", value: "solid" }, { icon: "line-style-dashed", altText: "iconAltTextLineStyleDashed", value: "dashed" }, { icon: "line-style-dotted", altText: "iconAltTextLineStyleDotted", value: "dotted" } ]; var TEXT_SIZE_ITEMS = [ { label: "10", value: 10 }, { label: "12", value: 12 }, { label: "14", value: 14 }, { label: "16", value: 16 }, { label: "18", value: 18 }, { label: "22", value: 22 }, { label: "28", value: 28 }, { label: "36", value: 36 }, { label: "46", value: 46 } ]; // packages/ag-charts-enterprise/src/features/annotations/annotationOptionsToolbar.ts var { FloatingToolbar, Menu, ToolbarButtonWidget } = import_ag_charts_community35._ModuleSupport; var AnnotationOptionsButtonProperties = class extends ToolbarButtonProperties { constructor() { super(...arguments); this.checkedOverrides = new ToolbarButtonProperties(); } }; __decorateClass([ import_ag_charts_core46.Property ], AnnotationOptionsButtonProperties.prototype, "value", 2); __decorateClass([ import_ag_charts_core46.Property ], AnnotationOptionsButtonProperties.prototype, "checkedOverrides", 2); __decorateClass([ import_ag_charts_core46.Property ], AnnotationOptionsButtonProperties.prototype, "color", 2); __decorateClass([ import_ag_charts_core46.Property ], AnnotationOptionsButtonProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core46.Property ], AnnotationOptionsButtonProperties.prototype, "isMultiColor", 2); var AnnotationOptionsButtonWidget = class extends ToolbarButtonWidget { update(options) { super.update(options); if (options.value === "line-stroke-width" /* LineStrokeWidth */) { this.updateLineStrokeWidth(options); } if (options.value === "fill-color" /* FillColor */ || options.value === "line-color" /* LineColor */ || options.value === "text-color" /* TextColor */) { this.updateFillColor(options); } } updateFillColor(options) { const element = this.getElement(); element.classList.add("ag-charts-annotations__color-picker-button"); element.classList.toggle("ag-charts-annotations__color-picker-button--multi-color", options.isMultiColor); element.style.setProperty("--color", options.color ?? null); } updateLineStrokeWidth(options) { const element = this.getElement(); element.classList.add("ag-charts-annotations__stroke-width-button"); element.style.setProperty("--stroke-width", `${options.strokeWidth}px`); } }; var FloatingAnnotationOptionsToolbar = class extends FloatingToolbar { createButtonWidget() { return new AnnotationOptionsButtonWidget(this.localeManager); } }; var AnnotationOptionsToolbar = class extends import_ag_charts_core46.BaseProperties { constructor(ctx, getActiveDatum) { super(); this.ctx = ctx; this.getActiveDatum = getActiveDatum; this.enabled = true; this.buttons = new import_ag_charts_core46.PropertiesArray(AnnotationOptionsButtonProperties); this.cleanup = new import_ag_charts_core46.CleanupRegistry(); this.events = new import_ag_charts_core46.EventEmitter(); this.visibleButtons = []; this.toolbar = new FloatingAnnotationOptionsToolbar( this.ctx, "ariaLabelAnnotationOptionsToolbar", "annotation-options" ); this.colorPicker = new ColorPicker(this.ctx); this.textSizeMenu = new Menu(this.ctx, "text-size"); this.lineStyleTypeMenu = new Menu(this.ctx, "annotations-line-style-type"); this.lineStrokeWidthMenu = new Menu(this.ctx, "annotations-line-stroke-width"); this.cleanup.register( this.toolbar.addToolbarListener("button-pressed", this.onButtonPress.bind(this)), this.toolbar.addToolbarListener("toolbar-moved", this.onToolbarMoved.bind(this)), ctx.widgets.seriesWidget.addListener("drag-start", this.onDragStart.bind(this)), ctx.widgets.seriesWidget.addListener("drag-end", this.onDragEnd.bind(this)), () => { this.colorPicker.destroy(); this.toolbar.destroy(); } ); } onDragStart() { this.toolbar.ignorePointerEvents(); } onDragEnd() { this.toolbar.capturePointerEvents(); } destroy() { this.cleanup.flush(); } show() { if (!this.enabled) return; this.toolbar.show(); } hide() { this.toolbar.hide(); } updateButtons(datum) { if (!this.enabled) return; const visible = { ["line-style-type" /* LineStyleType */]: hasLineStyle(datum), ["line-stroke-width" /* LineStrokeWidth */]: hasLineStyle(datum), ["line-color" /* LineColor */]: hasLineColor(datum), ["text-color" /* TextColor */]: hasTextColor(datum), ["fill-color" /* FillColor */]: hasFillColor(datum), ["text-size" /* TextSize */]: hasFontSize(datum), ["settings" /* Settings */]: hasLineText(datum), ["lock" /* Lock */]: true, ["delete" /* Delete */]: true }; this.visibleButtons = this.buttons.filter((button) => visible[button.value]); this.toolbar.clearButtons(); this.toolbar.updateButtons(this.visibleButtons); this.refreshButtons(datum); } setAnchorScene(scene) { if (this.toolbar.hasBeenDragged()) return; this.toolbar.setAnchor(scene.getAnchor()); } hideOverlays() { this.toolbar.clearActiveButton(); this.colorPicker.hide({ lastFocus: null }); this.textSizeMenu.hide(); this.lineStyleTypeMenu.hide(); this.lineStrokeWidthMenu.hide(); this.events.emit("hid-overlays", null); } clearActiveButton() { this.toolbar.clearActiveButton(); } updateColors(datum) { this.updateColorPickerColor( "line-color" /* LineColor */, datum.getDefaultColor("line-color" /* LineColor */), datum.getDefaultOpacity("line-color" /* LineColor */), "isMultiColor" in datum && datum?.isMultiColor ); this.updateColorPickerColor( "fill-color" /* FillColor */, datum.getDefaultColor("fill-color" /* FillColor */), datum.getDefaultOpacity("fill-color" /* FillColor */), "isMultiColor" in datum && datum?.isMultiColor ); this.updateColorPickerColor( "text-color" /* TextColor */, datum.getDefaultColor("text-color" /* TextColor */), datum.getDefaultOpacity("text-color" /* TextColor */), "isMultiColor" in datum && datum?.isMultiColor ); } updateColorPickerColor(colorPickerType, color7, opacity, isMultiColor) { if (color7 != null && opacity != null) { const { r, g, b } = import_ag_charts_core46.Color.fromString(color7); color7 = import_ag_charts_core46.Color.fromArray([r, g, b, opacity]).toHexString(); } this.updateButtonByValue(colorPickerType, { color: color7, isMultiColor }); } updateFontSize(fontSize) { this.updateButtonByValue("text-size" /* TextSize */, { label: fontSize == null ? void 0 : String(fontSize) }); } updateLineStyleType(item) { this.updateButtonByValue("line-style-type" /* LineStyleType */, { icon: item.icon }); } updateStrokeWidth(item) { this.updateButtonByValue("line-stroke-width" /* LineStrokeWidth */, { label: item.label, strokeWidth: item.value }); } onButtonPress({ event, button, buttonWidget }) { const datum = this.getActiveDatum(); if (!datum) return; this.hideOverlays(); switch (button.value) { case "line-style-type" /* LineStyleType */: { const lineStyle = hasLineStyle(datum) ? getLineStyle(datum.lineDash, datum.lineStyle) : void 0; this.lineStyleTypeMenu.show(buttonWidget, { items: LINE_STYLE_TYPE_ITEMS, ariaLabel: this.ctx.localeManager.t("toolbarAnnotationsLineStyle"), value: lineStyle, onPress: (item) => this.onLineStyleTypeMenuPress(item, datum), class: "ag-charts-annotations__line-style-type-menu" }); break; } case "line-stroke-width" /* LineStrokeWidth */: { const strokeWidth = hasLineStyle(datum) ? datum.strokeWidth : void 0; this.lineStrokeWidthMenu.show(buttonWidget, { items: LINE_STROKE_WIDTH_ITEMS, ariaLabel: this.ctx.localeManager.t("toolbarAnnotationsLineStrokeWidth"), value: strokeWidth, onPress: (item) => this.onLineStrokeWidthMenuPress(item, datum), class: "ag-charts-annotations__line-stroke-width-menu" }); break; } case "line-color" /* LineColor */: case "fill-color" /* FillColor */: case "text-color" /* TextColor */: { this.toolbar.toggleActiveButtonByIndex(button.index); this.colorPicker.show({ color: datum?.getDefaultColor(button.value), opacity: datum?.getDefaultOpacity(button.value), sourceEvent: event.sourceEvent, hasMultiColorOption: "isMultiColor" in datum, isMultiColor: "isMultiColor" in datum && datum?.isMultiColor, onChange: datum == null ? void 0 : this.onColorPickerChange.bind(this, button.value, datum), onChangeHide: ((type) => { this.events.emit("saved-color", { type: datum.type, colorPickerType: button.value, color: datum.getDefaultColor(type) }); }).bind(this, button.value) }); break; } case "text-size" /* TextSize */: { const fontSize = isTextType(datum) ? datum.fontSize : void 0; this.textSizeMenu.show(buttonWidget, { items: TEXT_SIZE_ITEMS, ariaLabel: this.ctx.localeManager.t("toolbarAnnotationsTextSize"), value: fontSize, onPress: (item) => this.onTextSizeMenuPress(item, datum), class: "ag-charts-annotations__text-size-menu" }); break; } case "delete" /* Delete */: { this.events.emit("pressed-delete", null); break; } case "lock" /* Lock */: { datum.locked = !datum.locked; this.refreshButtons(datum); this.events.emit("pressed-lock", { locked: datum.locked }); break; } case "settings" /* Settings */: { this.toolbar.toggleActiveButtonByIndex(button.index); this.events.emit("pressed-settings", event); break; } } } onToolbarMoved(event) { const { buttonBounds, popoverBounds } = event; const colorPickerAnchor = { x: popoverBounds.x, y: popoverBounds.y + popoverBounds.height + 4 }; const colorPickerFallbackAnchor = { y: popoverBounds.y - 4 }; this.colorPicker.setAnchor(colorPickerAnchor, colorPickerFallbackAnchor); for (const [index, bounds] of buttonBounds.entries()) { const button = this.visibleButtons.at(index); if (!button) continue; const anchor = { x: bounds.x, y: bounds.y + bounds.height - 1 }; const fallbackAnchor = { y: bounds.y }; switch (button.value) { case "line-stroke-width" /* LineStrokeWidth */: this.lineStrokeWidthMenu.setAnchor(anchor, fallbackAnchor); break; case "line-style-type" /* LineStyleType */: this.lineStyleTypeMenu.setAnchor(anchor, fallbackAnchor); break; case "text-size" /* TextSize */: this.textSizeMenu.setAnchor(anchor, fallbackAnchor); break; } } } onColorPickerChange(colorPickerType, datum, colorOpacity, color7, opacity, isMultiColor) { this.events.emit("updated-color", { type: datum.type, colorPickerType, colorOpacity, color: color7, opacity, isMultiColor }); this.updateColorPickerColor(colorPickerType, colorOpacity, opacity, isMultiColor); } onTextSizeMenuPress(item, datum) { if (!hasFontSize(datum)) return; const fontSize = item.value; this.events.emit("updated-font-size", { type: datum.type, fontSize }); this.textSizeMenu.hide(); this.updateFontSize(fontSize); } onLineStyleTypeMenuPress(item, datum) { if (!hasLineStyle(datum)) return; const type = item.value; this.events.emit("updated-line-style", { type: datum.type, lineStyleType: type }); this.lineStyleTypeMenu.hide(); this.updateLineStyleType(item); } onLineStrokeWidthMenuPress(item, datum) { if (!hasLineStyle(datum)) { return; } const strokeWidth = item.value; this.events.emit("updated-line-width", { type: datum.type, strokeWidth }); this.lineStrokeWidthMenu.hide(); this.updateStrokeWidth(item); } refreshButtons(datum) { const locked = datum.locked ?? false; for (const [index, button] of this.visibleButtons.entries()) { if (!button) continue; if (button.value === "lock" /* Lock */) { this.toolbar.toggleSwitchCheckedByIndex(index, locked); this.updateButtonByIndex(index, locked ? button.checkedOverrides.toJson() : button.toJson()); } else { this.toolbar.toggleButtonEnabledByIndex(index, !locked); } } if (hasFontSize(datum)) this.updateFontSize(datum.fontSize); this.updateColors(datum); this.updateLineStyles(datum); } updateLineStyles(datum) { if (!hasLineStyle(datum)) return; const strokeWidth = datum.strokeWidth ?? 1; const lineStyleType = getLineStyle(datum.lineDash, datum.lineStyle); this.updateStrokeWidth({ strokeWidth, value: strokeWidth, label: String(strokeWidth) }); this.updateLineStyleType( LINE_STYLE_TYPE_ITEMS.find((item) => item.value === lineStyleType) ?? LINE_STYLE_TYPE_ITEMS[0] ); } updateButtonByValue(value, change) { const index = this.visibleButtons.findIndex((button) => button.value === value); if (index === -1) return; this.updateButtonByIndex(index, change); } updateButtonByIndex(index, change) { const button = this.visibleButtons.at(index); if (!button) return; this.toolbar.updateButtonByIndex(index, { ...button.toJson(), ...change, value: change.value ?? button.value }); } }; __decorateClass([ import_ag_charts_core46.Property ], AnnotationOptionsToolbar.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core46.Property ], AnnotationOptionsToolbar.prototype, "buttons", 2); // packages/ag-charts-enterprise/src/features/annotations/states/dragState.ts var import_ag_charts_core47 = require("ag-charts-core"); var DragStateMachine = class extends import_ag_charts_core47.StateMachine { constructor(ctx) { const actionKeyChange = ({ context }) => { this.node?.drag(this.datum, this.offset, context, this.snapping); ctx.update(); }; super("idle", { idle: { dragStart: { target: "dragging", action: ({ offset, context }) => { this.hasMoved = false; this.dragStart = offset; this.offset = offset; this.node?.dragStart(this.datum, offset, context); } } }, dragging: { keyDown: actionKeyChange, keyUp: actionKeyChange, drag: ({ offset, context }) => { this.hasMoved = import_ag_charts_core47.Vec2.lengthSquared(import_ag_charts_core47.Vec2.sub(offset, this.dragStart)) > 0; this.offset = offset; this.node?.drag(this.datum, offset, context, this.snapping); ctx.update(); }, dragEnd: { target: import_ag_charts_core47.StateMachine.parent, action: () => { this.node?.stopDragging(); if (this.hasMoved) ctx.recordAction("Move annotation"); ctx.update(); } } } }); this.debug = import_ag_charts_core47.Debug.create(true, "annotations"); this.hasMoved = false; this.snapping = false; } }; __decorateClass([ (0, import_ag_charts_core47.StateMachineProperty)() ], DragStateMachine.prototype, "snapping", 2); __decorateClass([ (0, import_ag_charts_core47.StateMachineProperty)() ], DragStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core47.StateMachineProperty)() ], DragStateMachine.prototype, "node", 2); // packages/ag-charts-enterprise/src/features/annotations/arrow-down/arrowDownProperties.ts var import_ag_charts_core48 = require("ag-charts-core"); var ArrowDownProperties = class extends ShapePointProperties { constructor() { super(...arguments); this.type = "arrow-down" /* ArrowDown */; } static is(value) { return (0, import_ag_charts_core48.isObject)(value) && value.type === "arrow-down" /* ArrowDown */; } }; __decorateClass([ import_ag_charts_core48.Property ], ArrowDownProperties.prototype, "type", 2); // packages/ag-charts-enterprise/src/features/annotations/arrow-down/arrowDownScene.ts var import_ag_charts_community41 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/features/annotations/arrow-up/arrowUpScene.ts var import_ag_charts_community40 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/features/annotations/scenes/annotationScene.ts var import_ag_charts_community38 = require("ag-charts-community"); var import_ag_charts_core49 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/scenes/handle.ts var import_ag_charts_community37 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/features/annotations/scenes/annotationShape.ts var import_ag_charts_community36 = require("ag-charts-community"); var AnnotationShape = class extends import_ag_charts_community36._ModuleSupport.Marker { // Use exact method for this, rather than the Marker's high performance approximation. isPointInPath(x, y) { this.updatePathIfDirty(); return this.path.closedPath && this.path.isPointInPath(x, y); } }; // packages/ag-charts-enterprise/src/features/annotations/scenes/handle.ts var _Handle = class _Handle extends import_ag_charts_community37._ModuleSupport.Group { constructor() { super(...arguments); this.active = false; this.locked = false; this.visible = false; this.zIndex = 1; } drag(target) { const { handle: handle3, locked } = this; if (locked) { return { point: { x: handle3.x, y: handle3.y }, offset: { x: 0, y: 0 } }; } return { point: target, offset: { x: target.x - handle3.x, y: target.y - handle3.y } }; } toggleActive(active) { this.active = active; if (!active) { this.handle.strokeWidth = _Handle.INACTIVE_STROKE_WIDTH; } } toggleHovered(hovered) { this.glow.visible = !this.locked && hovered; this.glow.dirtyPath = true; } toggleDragging(dragging) { if (this.locked) return; this.handle.visible = !dragging; this.glow.visible = this.glow.visible && !dragging; this.handle.dirtyPath = true; this.glow.dirtyPath = true; } toggleLocked(locked) { this.locked = locked; } getCursor() { return void 0; } containsPoint(x, y) { return this.handle.containsPoint(x, y); } }; _Handle.INACTIVE_STROKE_WIDTH = 2; var Handle2 = _Handle; var _InvariantHandle = class _InvariantHandle extends Handle2 { constructor() { super(); this.handle = new AnnotationShape({ shape: "circle" }); this.glow = new AnnotationShape({ shape: "circle" }); this.append([this.handle]); this.handle.size = _InvariantHandle.HANDLE_SIZE; this.handle.strokeWidth = Handle2.INACTIVE_STROKE_WIDTH; this.handle.zIndex = 2; } update(styles) { this.handle.setProperties({ ...styles, strokeWidth: Handle2.INACTIVE_STROKE_WIDTH }); } drag(target) { return { point: target, offset: { x: 0, y: 0 } }; } }; _InvariantHandle.HANDLE_SIZE = 7; _InvariantHandle.GLOW_SIZE = 9; var InvariantHandle = _InvariantHandle; var _UnivariantHandle = class _UnivariantHandle extends Handle2 { constructor() { super(); this.handle = new import_ag_charts_community37._ModuleSupport.Rect(); this.glow = new import_ag_charts_community37._ModuleSupport.Rect(); this.gradient = "horizontal"; this.append([this.glow, this.handle]); this.handle.cornerRadius = _UnivariantHandle.CORNER_RADIUS; this.handle.width = _UnivariantHandle.HANDLE_SIZE; this.handle.height = _UnivariantHandle.HANDLE_SIZE; this.handle.strokeWidth = Handle2.INACTIVE_STROKE_WIDTH; this.handle.zIndex = 2; this.glow.cornerRadius = _UnivariantHandle.CORNER_RADIUS; this.glow.width = _UnivariantHandle.GLOW_SIZE; this.glow.height = _UnivariantHandle.GLOW_SIZE; this.glow.strokeWidth = 0; this.glow.fillOpacity = 0.2; this.glow.zIndex = 1; this.glow.visible = false; } toggleLocked(locked) { super.toggleLocked(locked); if (locked) { const offset = (_UnivariantHandle.HANDLE_SIZE - InvariantHandle.HANDLE_SIZE) / 2; this.handle.cornerRadius = 1; this.handle.fill = this.handle.stroke; this.handle.strokeWidth = 0; this.handle.x += offset; this.handle.y += offset; this.handle.width = InvariantHandle.HANDLE_SIZE; this.handle.height = InvariantHandle.HANDLE_SIZE; this.glow.width = InvariantHandle.GLOW_SIZE; this.glow.height = InvariantHandle.GLOW_SIZE; } else { this.handle.cornerRadius = _UnivariantHandle.CORNER_RADIUS; this.handle.width = _UnivariantHandle.HANDLE_SIZE; this.handle.height = _UnivariantHandle.HANDLE_SIZE; this.glow.width = _UnivariantHandle.GLOW_SIZE; this.glow.height = _UnivariantHandle.GLOW_SIZE; if (this.cachedStyles) { this.handle.setProperties(this.cachedStyles); } } } update(styles) { this.cachedStyles = { ...styles }; if (!this.active) { delete styles.strokeWidth; } if (this.locked) { delete styles.fill; delete styles.strokeWidth; const offset = (_UnivariantHandle.HANDLE_SIZE - InvariantHandle.HANDLE_SIZE) / 2; styles.x -= offset; styles.y -= offset; this.cachedStyles.x -= offset; this.cachedStyles.y -= offset; } this.handle.setProperties(styles); this.glow.setProperties({ ...styles, x: (styles.x ?? this.glow.x) - 2, y: (styles.y ?? this.glow.y) - 2, strokeWidth: 0, fill: styles.stroke }); } drag(target) { if (this.locked) { return { point: target, offset: { x: 0, y: 0 } }; } if (this.gradient === "vertical") { return { point: { x: target.x, y: this.handle.y }, offset: { x: target.x - this.handle.x, y: 0 } }; } return { point: { x: this.handle.x, y: target.y }, offset: { x: 0, y: target.y - this.handle.y } }; } getCursor() { if (this.locked) return; return this.gradient === "vertical" ? "col-resize" : "row-resize"; } }; _UnivariantHandle.HANDLE_SIZE = 12; _UnivariantHandle.GLOW_SIZE = 16; _UnivariantHandle.CORNER_RADIUS = 4; var UnivariantHandle = _UnivariantHandle; var _DivariantHandle = class _DivariantHandle extends Handle2 { constructor() { super(); this.handle = new AnnotationShape({ shape: "circle" }); this.glow = new AnnotationShape({ shape: "circle" }); this.append([this.glow, this.handle]); this.handle.size = _DivariantHandle.HANDLE_SIZE; this.handle.strokeWidth = Handle2.INACTIVE_STROKE_WIDTH; this.handle.zIndex = 2; this.glow.size = _DivariantHandle.GLOW_SIZE; this.glow.strokeWidth = 0; this.glow.fillOpacity = 0.2; this.glow.zIndex = 1; this.glow.visible = false; } toggleLocked(locked) { super.toggleLocked(locked); if (locked) { this.handle.fill = this.handle.stroke; this.handle.strokeWidth = 0; this.handle.size = InvariantHandle.HANDLE_SIZE; this.glow.size = InvariantHandle.GLOW_SIZE; } else { this.handle.size = _DivariantHandle.HANDLE_SIZE; this.glow.size = _DivariantHandle.GLOW_SIZE; if (this.cachedStyles) { this.handle.setProperties(this.cachedStyles); } } } update(styles) { this.cachedStyles = { ...styles }; if (!this.active) { delete styles.strokeWidth; } if (this.locked) { delete styles.fill; delete styles.strokeWidth; } this.handle.setProperties(styles); this.glow.setProperties({ ...styles, strokeWidth: 0, fill: styles.stroke }); } getCursor() { return "pointer"; } }; _DivariantHandle.HANDLE_SIZE = 11; _DivariantHandle.GLOW_SIZE = 17; var DivariantHandle = _DivariantHandle; // packages/ag-charts-enterprise/src/features/annotations/scenes/annotationScene.ts var AnnotationScene = class extends import_ag_charts_community38._ModuleSupport.Group { constructor() { super(...arguments); this.name = "AnnotationScene"; this.zIndex = import_ag_charts_core49.ZIndexMap.CHART_ANNOTATION; } static isCheck(value, type) { return (0, import_ag_charts_core49.isObject)(value) && Object.hasOwn(value, "type") && value.type === type; } toggleHovered(hovered, active, readOnly) { if (readOnly === true) return; this.toggleHandles(hovered || active); } computeBBoxWithoutHandles() { return import_ag_charts_community38._ModuleSupport.Transformable.toCanvas( this, import_ag_charts_community38._ModuleSupport.Group.computeChildrenBBox(this.excludeChildren({ instance: Handle2 })) ); } updateNode(constructor, node, isConfigured) { if (!isConfigured && node) { node.remove(); return; } if (isConfigured && node == null) { node = new constructor(); this.appendChild(node); } return node; } }; // packages/ag-charts-enterprise/src/features/annotations/scenes/pointScene.ts var import_ag_charts_core51 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/utils/coords.ts var import_ag_charts_community39 = require("ag-charts-community"); var import_ag_charts_core50 = require("ag-charts-core"); var { ContinuousScale: ContinuousScale2 } = import_ag_charts_community39._ModuleSupport; function snapPoint(offset, context, snapping = false, origin, angleStep = 1) { if (!snapping) return invertCoords(offset, context); const center = origin ? convertPoint(origin, context) : import_ag_charts_core50.Vec2.origin(); return invertCoords(snapToAngle(offset, center, angleStep), context); } function snapToAngle(vector, center, step) { const radial = import_ag_charts_core50.Vec2.sub(vector, center); const stepRadians = (0, import_ag_charts_core50.toRadians)(step); const theta = Math.round(import_ag_charts_core50.Vec2.angle(radial) / stepRadians) * stepRadians; return import_ag_charts_core50.Vec2.rotate(radial, theta, center); } function getDragStartState(points, context) { const dragState = {}; for (const [name, point] of (0, import_ag_charts_core50.entries)(points)) { dragState[name] = convertPoint(point, context); } return dragState; } function translate(vectors, translation, context, options = { overflowContinuous: 0, translateVectors: void 0, invertYVectors: void 0, snap: void 0 }) { const { xAxis, yAxis } = context; const vectorNames = Object.keys(vectors); const overflowsX = []; const overflowsY = []; const translateVectors = new Set(options.translateVectors ?? vectorNames); const invertYVectors = new Set(options.invertYVectors ?? []); const movingVectors = /* @__PURE__ */ new Set([...translateVectors, ...invertYVectors]); const invertYTranslation = import_ag_charts_core50.Vec2.multiply(translation, import_ag_charts_core50.Vec2.from(1, -1)); for (const name of vectorNames) { if (movingVectors.has(name)) { vectors[name] = import_ag_charts_core50.Vec2.add(vectors[name], invertYVectors.has(name) ? invertYTranslation : translation); if (options.snap) { vectors[name] = snapToAngle(vectors[name], options.snap.vectors[name], options.snap.angle); } } overflowsX.push(xAxis.getRangeOverflow(vectors[name].x)); overflowsY.push(yAxis.getRangeOverflow(vectors[name].y)); } const sortNumbersAbs = (a, b) => Math.abs(a) - Math.abs(b); const overflowDirection = (scale, directionTranslation, overflows) => { if (options.overflowContinuous === 0 || !ContinuousScale2.is(scale)) { return overflows.toSorted(sortNumbersAbs).at(-1) ?? 0; } if (vectorNames.length === movingVectors.size) { return overflows.toSorted(sortNumbersAbs).at(-options.overflowContinuous - 1) ?? 0; } if (overflows.filter((value) => value !== 0).length <= options.overflowContinuous) { return 0; } const newTranslatedOverflows = overflows.filter( (value, index) => value !== 0 && Math.abs(value) <= Math.abs(directionTranslation) && movingVectors.has(vectorNames[index]) ); return newTranslatedOverflows.toSorted(sortNumbersAbs).at(-1) ?? 0; }; const overflow = import_ag_charts_core50.Vec2.from( overflowDirection(xAxis.scale, translation.x, overflowsX), overflowDirection(yAxis.scale, translation.y, overflowsY) ); if (!import_ag_charts_core50.Vec2.equal(overflow, import_ag_charts_core50.Vec2.origin())) { for (const name of vectorNames) { if (!movingVectors.has(name)) continue; vectors[name] = import_ag_charts_core50.Vec2.round(import_ag_charts_core50.Vec2.sub(vectors[name], overflow), 4); } } const result = {}; for (const name of vectorNames) { result[name] = invertCoords(vectors[name], context); } return result; } // packages/ag-charts-enterprise/src/features/annotations/scenes/pointScene.ts var PointScene = class extends AnnotationScene { constructor() { super(...arguments); this.handle = new DivariantHandle(); this.anchor = { x: 0, y: 0, position: "above" }; } update(datum, context) { const coords = convertPoint(datum, context); this.updateHandle(datum, coords); this.anchor = this.updateAnchor(datum, coords, context); } dragStart(datum, target, context) { this.dragState = { offset: target, ...getDragStartState({ handle: datum }, context) }; } drag(datum, target, context) { const { dragState } = this; if (!datum.isWriteable() || !dragState) return; const { point } = translate({ point: dragState.handle }, import_ag_charts_core51.Vec2.sub(target, dragState.offset), context); datum.x = point.x; datum.y = point.y; } translate(datum, translation, context) { if (!datum.isWriteable()) return; const { point } = translate({ point: convertPoint(datum, context) }, translation, context); datum.x = point.x; datum.y = point.y; } toggleHandles(show) { this.handle.visible = Boolean(show); this.handle.toggleHovered(this.activeHandle === "handle"); } toggleActive(active) { this.toggleHandles(active); this.handle.toggleActive(active); } stopDragging() { this.handle.toggleDragging(false); } copy(datum, copiedDatum, context) { const coords = convertPoint(datum, context); const point = invertCoords({ x: coords.x - 30, y: coords.y - 30 }, context); copiedDatum.x = point.x; copiedDatum.y = point.y; return copiedDatum; } getAnchor() { return this.anchor; } getCursor() { return "pointer"; } containsPoint(x, y) { const { handle: handle3 } = this; this.activeHandle = void 0; if (handle3.containsPoint(x, y)) { this.activeHandle = "handle"; return true; } return false; } getNodeAtCoords(x, y) { if (this.handle.containsPoint(x, y)) return "handle"; } updateHandle(datum, point, bbox) { const { x, y } = this.getHandleCoords(datum, point, bbox); const styles = this.getHandleStyles(datum); this.handle.update({ ...styles, x, y }); this.handle.toggleLocked(datum.locked ?? false); } updateAnchor(datum, point, context) { const coords = this.getHandleCoords(datum, point); return { x: coords.x + context.seriesRect.x, y: coords.y + context.seriesRect.y, position: this.anchor.position }; } getHandleCoords(_datum, point, _bbox) { return { x: point.x, y: point.y }; } getHandleStyles(datum) { return { fill: datum.handle.fill, stroke: datum.handle.stroke, strokeOpacity: datum.handle.strokeOpacity, strokeWidth: datum.handle.strokeWidth }; } }; // packages/ag-charts-enterprise/src/features/annotations/scenes/shapePointScene.ts var ShapePointScene = class extends PointScene { constructor() { super(); this.append([this.handle]); } update(datum, context) { super.update(datum, context); const coords = convertPoint(datum, context); this.updateShape(datum, coords); } updateShape(datum, point) { this.updateShapeStyles(datum); this.updateShapePath(datum, point); } updateShapeStyles(datum) { const { shape } = this; shape.fill = datum.fill; shape.fillOpacity = datum.fillOpacity ?? 1; } updateShapePath(datum, point) { const { shape } = this; shape.x = point.x; shape.y = point.y; shape.size = datum.size; } containsPoint(x, y) { return super.containsPoint(x, y) || this.shape.containsPoint(x, y); } getNodeAtCoords(x, y) { if (this.shape.containsPoint(x, y)) return "shape"; return super.getNodeAtCoords(x, y); } }; // packages/ag-charts-enterprise/src/features/annotations/arrow-up/arrowUpScene.ts var arrowUpPoints = [ [0.5, 0], [1, 0.5], [0.75, 0.5], [0.75, 1], [0.25, 1], [0.25, 0.5], [0, 0.5] ]; function arrowUp(params) { import_ag_charts_community40._ModuleSupport.drawMarkerUnitPolygon(params, arrowUpPoints); } arrowUp.anchor = { x: 0.5, y: 0 }; var ArrowUpScene = class extends ShapePointScene { constructor() { super(); this.type = "arrow-up" /* ArrowUp */; this.shape = new AnnotationShape({ shape: arrowUp }); this.append([this.shape]); } static is(value) { return AnnotationScene.isCheck(value, "arrow-up" /* ArrowUp */); } getHandleCoords(datum, point) { const halfSize = DivariantHandle.HANDLE_SIZE / 2; const handleCoords = super.getHandleCoords(datum, point); handleCoords.y -= halfSize; return handleCoords; } }; // packages/ag-charts-enterprise/src/features/annotations/arrow-down/arrowDownScene.ts var arrowDownPoints = arrowUpPoints.map(([x, y]) => [x, 1 - y]); function arrowDown(params) { import_ag_charts_community41._ModuleSupport.drawMarkerUnitPolygon(params, arrowDownPoints); } arrowDown.anchor = { x: 0.5, y: 1 }; var ArrowDownScene = class extends ShapePointScene { constructor() { super(); this.type = "arrow-down" /* ArrowDown */; this.shape = new AnnotationShape({ shape: arrowDown }); this.append([this.shape]); } static is(value) { return AnnotationScene.isCheck(value, "arrow-down" /* ArrowDown */); } updateAnchor(datum, point, context) { const anchor = super.updateAnchor(datum, point, context); anchor.y -= datum.size; return anchor; } getHandleCoords(datum, point) { const halfSize = DivariantHandle.HANDLE_SIZE / 2; const handleCoords = super.getHandleCoords(datum, point); handleCoords.y += halfSize; return handleCoords; } }; // packages/ag-charts-enterprise/src/features/annotations/states/pointState.ts var import_ag_charts_core52 = require("ag-charts-core"); var PointStateMachine = class extends import_ag_charts_core52.StateMachine { constructor(ctx) { const actionCreate = ({ point }) => { const datum = this.createDatum(); datum.set({ x: point.x, y: point.y }); ctx.create(datum); }; const actionFirstRender = () => { this.node?.toggleActive(true); ctx.showAnnotationOptions(); ctx.update(); }; super("start", { start: { click: { target: "waiting-first-render", action: actionCreate }, drag: { target: "waiting-first-render", action: actionCreate }, cancel: import_ag_charts_core52.StateMachine.parent, reset: import_ag_charts_core52.StateMachine.parent }, "waiting-first-render": { render: { target: import_ag_charts_core52.StateMachine.parent, action: actionFirstRender } } }); this.debug = import_ag_charts_core52.Debug.create(true, "annotations"); } }; __decorateClass([ (0, import_ag_charts_core52.StateMachineProperty)() ], PointStateMachine.prototype, "node", 2); // packages/ag-charts-enterprise/src/features/annotations/arrow-down/arrowDownState.ts var ArrowDownStateMachine = class extends PointStateMachine { createDatum() { return new ArrowDownProperties(); } }; // packages/ag-charts-enterprise/src/features/annotations/arrow-down/arrowDownConfig.ts var arrowDownConfig = { type: "arrow-down" /* ArrowDown */, datum: ArrowDownProperties, scene: ArrowDownScene, isDatum: ArrowDownProperties.is, translate: (node, datum, translation, context) => { if (ArrowDownProperties.is(datum) && ArrowDownScene.is(node)) node.translate(datum, translation, context); }, copy: (node, datum, copiedDatum, context) => { if (ArrowDownProperties.is(datum) && ArrowDownProperties.is(copiedDatum) && ArrowDownScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (ArrowDownProperties.is(datum) && ArrowDownScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new ArrowDownStateMachine({ ...ctx, create: createDatum("arrow-down" /* ArrowDown */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/arrow-up/arrowUpProperties.ts var import_ag_charts_core53 = require("ag-charts-core"); var ArrowUpProperties = class extends ShapePointProperties { constructor() { super(...arguments); this.type = "arrow-up" /* ArrowUp */; } static is(value) { return (0, import_ag_charts_core53.isObject)(value) && value.type === "arrow-up" /* ArrowUp */; } }; __decorateClass([ import_ag_charts_core53.Property ], ArrowUpProperties.prototype, "type", 2); // packages/ag-charts-enterprise/src/features/annotations/arrow-up/arrowUpState.ts var ArrowUpStateMachine = class extends PointStateMachine { createDatum() { return new ArrowUpProperties(); } }; // packages/ag-charts-enterprise/src/features/annotations/arrow-up/arrowUpConfig.ts var arrowUpConfig = { type: "arrow-up" /* ArrowUp */, datum: ArrowUpProperties, scene: ArrowUpScene, isDatum: ArrowUpProperties.is, translate: (node, datum, translation, context) => { if (ArrowUpProperties.is(datum) && ArrowUpScene.is(node)) node.translate(datum, translation, context); }, copy: (node, datum, copiedDatum, context) => { if (ArrowUpProperties.is(datum) && ArrowUpProperties.is(copiedDatum) && ArrowUpScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (ArrowUpProperties.is(datum) && ArrowUpScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new ArrowUpStateMachine({ ...ctx, create: createDatum("arrow-up" /* ArrowUp */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/callout/calloutScene.ts var import_ag_charts_community43 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/features/annotations/scenes/textualStartEndScene.ts var import_ag_charts_community42 = require("ag-charts-community"); var import_ag_charts_core56 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/scenes/startEndScene.ts var import_ag_charts_core55 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/scenes/linearScene.ts var import_ag_charts_core54 = require("ag-charts-core"); var LinearScene = class extends AnnotationScene { constructor() { super(...arguments); this.overflowContinuous = 0; } extendLine({ x1, y1, x2, y2 }, datum, context) { const linePoints = { x1, y1, x2, y2 }; if (!datum.extendStart && !datum.extendEnd) { return linePoints; } const [left, right] = boundsIntersections(linePoints, context.yAxis.bounds); const isFlippedX = linePoints.x2 < linePoints.x1; const isFlippedY = linePoints.y1 >= linePoints.y2; const isVertical = linePoints.x2 === linePoints.x1; if (datum.extendEnd) { if (isVertical) { linePoints.y2 = isFlippedY ? right.y : left.y; } else { linePoints.x2 = isFlippedX ? left.x : right.x; linePoints.y2 = isFlippedX ? left.y : right.y; } } if (datum.extendStart) { if (isVertical) { linePoints.y1 = isFlippedY ? left.y : right.y; } else { linePoints.x1 = isFlippedX ? right.x : left.x; linePoints.y1 = isFlippedX ? right.y : left.y; } } return linePoints; } dragStart(datum, target, context) { this.dragState = { offset: target, ...getDragStartState({ start: datum.start, end: datum.end }, context) }; } drag(datum, target, context, snapping) { if (!datum.isWriteable()) return; if (this.activeHandle) { this.dragHandle(datum, target, context, snapping); } else { this.dragAll(datum, target, context); } } dragAll(datum, target, context) { const { dragState } = this; if (!dragState) return; this.translatePoints(datum, dragState.start, dragState.end, import_ag_charts_core54.Vec2.sub(target, dragState.offset), context); } translate(datum, translation, context) { if (!datum.isWriteable()) return; this.translatePoints( datum, convertPoint(datum.start, context), convertPoint(datum.end, context), translation, context ); } copy(datum, copiedDatum, context) { const coords = convertLine(datum, context); if (!coords) { return; } const bbox = this.computeBBoxWithoutHandles(); const translation = { x: -bbox.width / 2, y: -bbox.height / 2 }; this.translatePoints(copiedDatum, import_ag_charts_core54.Vec4.start(coords), import_ag_charts_core54.Vec4.end(coords), translation, context); return copiedDatum; } translatePoints(datum, start, end, translation, context) { const vectors = this.getTranslatePointsVectors(start, end); const points = translate(vectors, translation, context, { overflowContinuous: this.overflowContinuous }); datum.start.x = points.start.x; datum.end.x = points.end.x; datum.start.y = points.start.y; datum.end.y = points.end.y; } getTranslatePointsVectors(start, end) { return { start, end }; } }; // packages/ag-charts-enterprise/src/features/annotations/scenes/startEndScene.ts var StartEndScene = class extends LinearScene { constructor() { super(...arguments); this.start = new DivariantHandle(); this.end = new DivariantHandle(); this.anchor = { x: 0, y: 0, position: "above" }; } update(datum, context) { const coords = convertLine(datum, context); if (coords == null) { return; } this.updateHandles(datum, coords); this.updateAnchor(datum, coords, context); } toggleHandles(show) { if (typeof show === "boolean") { this.start.visible = show; this.end.visible = show; } else { for (const [handle3, visible] of (0, import_ag_charts_core55.entries)(show)) { this[handle3].visible = visible; } } this.start.toggleHovered(this.activeHandle === "start"); this.end.toggleHovered(this.activeHandle === "end"); } toggleActive(active) { this.toggleHandles(active); this.start.toggleActive(active); this.end.toggleActive(active); } dragHandle(datum, target, context, snapping) { const { activeHandle, dragState } = this; if (!activeHandle || !dragState) return; this[activeHandle].toggleDragging(true); const snapHandle = activeHandle === "start" ? "end" : "start"; const snap = snapping ? { vectors: { [activeHandle]: convertPoint(datum[snapHandle], context) }, angle: datum.snapToAngle } : void 0; const { [activeHandle]: point } = translate( { [activeHandle]: dragState[activeHandle] }, import_ag_charts_core55.Vec2.sub(target, dragState.offset), context, { overflowContinuous: 0, snap } ); datum[activeHandle].x = point.x; datum[activeHandle].y = point.y; } stopDragging() { this.start.toggleDragging(false); this.end.toggleDragging(false); } getAnchor() { return this.anchor; } getCursor() { return "pointer"; } containsPoint(x, y) { const { start, end } = this; this.activeHandle = void 0; if (start.containsPoint(x, y)) { this.activeHandle = "start"; return true; } if (end.containsPoint(x, y)) { this.activeHandle = "end"; return true; } return false; } getNodeAtCoords(x, y) { if (this.start.containsPoint(x, y) || this.end.containsPoint(x, y)) return "handle"; } updateHandles(datum, coords, bbox) { this.start.update({ ...this.getHandleStyles(datum, "start"), ...this.getHandleCoords(datum, coords, "start") }); this.end.update({ ...this.getHandleStyles(datum, "end"), ...this.getHandleCoords(datum, coords, "end", bbox) }); this.start.toggleLocked(datum.locked ?? false); this.end.toggleLocked(datum.locked ?? false); } updateAnchor(_datum, coords, context, _bbox) { this.anchor = { x: coords.x1 + context.seriesRect.x, y: coords.y1 + context.seriesRect.y, position: this.anchor.position }; } getHandleCoords(_datum, coords, handle3, _bbox) { return handle3 === "start" ? import_ag_charts_core55.Vec4.start(coords) : import_ag_charts_core55.Vec4.end(coords); } getHandleStyles(datum, _handle) { return { fill: datum.handle.fill, stroke: datum.handle.stroke, strokeOpacity: datum.handle.strokeOpacity, strokeWidth: datum.handle.strokeWidth }; } }; // packages/ag-charts-enterprise/src/features/annotations/scenes/textualStartEndScene.ts var TextualStartEndScene = class extends StartEndScene { constructor() { super(...arguments); this.label = new import_ag_charts_community42._ModuleSupport.Text({ zIndex: 1 }); this.anchor = { x: 0, y: 0, position: "above-left" }; } setTextInputBBox(bbox) { this.textInputBBox = bbox; this.markDirty("TextualStartEndScene"); } update(datum, context) { const coords = convertLine(datum, context); if (coords == null) { return; } const bbox = this.getTextBBox(datum, coords); this.updateLabel(datum, bbox, coords); this.updateHandles(datum, coords, bbox); this.updateShape(datum, bbox, coords); this.updateAnchor(datum, coords, context, bbox); } containsPoint(x, y) { return super.containsPoint(x, y) || this.label.containsPoint(x, y); } getNodeAtCoords(x, y) { if (this.label.containsPoint(x, y)) return "text"; return super.getNodeAtCoords(x, y); } getTextBBox(datum, coords) { const { text: text2 } = datum.getText(); return getBBox(datum, text2, import_ag_charts_core56.Vec4.end(coords), this.textInputBBox); } updateLabel(datum, bbox, coords) { const { text: text2, isPlaceholder } = datum.getText(); updateTextNode(this.label, text2, isPlaceholder, datum, this.getLabelCoords(datum, bbox, coords)); } updateShape(_datum, _textBBox, _coords) { } getLabelCoords(_datum, _bbox, coords) { return import_ag_charts_core56.Vec4.end(coords); } getHandleStyles(datum, handle3) { return { ...super.getHandleStyles(datum, handle3), stroke: datum.handle.stroke ?? datum.color }; } }; // packages/ag-charts-enterprise/src/features/annotations/callout/calloutScene.ts var { drawCorner, Path: Path5 } = import_ag_charts_community43._ModuleSupport; var CalloutScene = class extends TextualStartEndScene { constructor() { super(); this.type = "callout" /* Callout */; this.shape = new Path5(); this.append([this.shape, this.label, this.start, this.end]); } static is(value) { return AnnotationScene.isCheck(value, "callout" /* Callout */); } drag(datum, target, context, snapping) { if (!datum.isWriteable()) return; if (this.activeHandle === "end") { this.dragHandle(datum, target, context, snapping); } else { this.dragAll(datum, target, context); } } getLabelCoords(datum, bbox, coords) { const padding2 = datum.getPadding(); const { bodyBounds = { x: 0, y: 0, width: 0, height: 0 } } = this.getDimensions(datum, bbox, coords) ?? {}; return { x: bodyBounds.x + padding2.left, y: bodyBounds.y - padding2.bottom }; } getHandleStyles(datum, handle3) { return handle3 === "start" ? { fill: datum.handle.fill, stroke: datum.handle.stroke ?? datum.stroke, strokeOpacity: datum.handle.strokeOpacity, strokeWidth: datum.handle.strokeWidth } : { fill: void 0, strokeWidth: 0 }; } updateAnchor(datum, coords, context, bbox) { const { bodyBounds } = this.getDimensions(datum, bbox, coords) ?? {}; const bounds = bodyBounds ?? bbox; this.anchor = { x: bounds.x + context.seriesRect.x, y: bounds.y + context.seriesRect.y - bounds.height, position: this.anchor.position }; } updateShape(datum, textBox, coords) { const { shape } = this; shape.fill = datum.fill; shape.fillOpacity = datum.fillOpacity ?? 1; shape.stroke = datum.stroke; shape.strokeWidth = datum.strokeWidth ?? 1; shape.strokeOpacity = datum.strokeOpacity ?? 1; const { tailPoint, bodyBounds } = this.getDimensions(datum, textBox, coords) ?? {}; if (!tailPoint || !bodyBounds) { return; } this.updatePath(tailPoint, bodyBounds); } updatePath(tailPoint, bodyBounds) { const { x: tailX, y: tailY } = tailPoint; const { x, y, width, height } = bodyBounds; const top = y - height; const right = x + width; const placement = this.calculateCalloutPlacement({ x: tailX, y: tailY }, bodyBounds); const cornerRadius = 8; const pathParams = [ { coordinates: { x0: x, x1: x + cornerRadius, y0: top + cornerRadius, y1: top, cx: placement === `topLeft` ? tailX : x + cornerRadius, cy: placement === `topLeft` ? tailY : top + cornerRadius }, type: placement === `topLeft` ? "calloutCorner" : "corner" }, { coordinates: { x0: x + cornerRadius, x1: right - cornerRadius, y0: top, y1: top, cx: tailX, cy: tailY }, type: placement === `top` ? "calloutSide" : "side" }, { coordinates: { x0: right - cornerRadius, x1: right, y0: top, y1: top + cornerRadius, cx: placement === `topRight` ? tailX : right - cornerRadius, cy: placement === `topRight` ? tailY : top + cornerRadius }, type: placement === `topRight` ? "calloutCorner" : "corner" }, { coordinates: { x0: right, x1: right, y0: top + cornerRadius, y1: y - cornerRadius, cx: tailX, cy: tailY }, type: placement === `right` ? "calloutSide" : "side" }, { coordinates: { x0: right, x1: right - cornerRadius, y0: y - cornerRadius, y1: y, cx: placement === `bottomRight` ? tailX : right - cornerRadius, cy: placement === `bottomRight` ? tailY : y - cornerRadius }, type: placement === `bottomRight` ? "calloutCorner" : "corner" }, { coordinates: { x0: right - cornerRadius, x1: x + cornerRadius, y0: y, y1: y, cx: tailX, cy: tailY }, type: placement === `bottom` ? "calloutSide" : "side" }, { coordinates: { x0: x + cornerRadius, x1: x, y0: y, y1: y - cornerRadius, cx: placement === `bottomLeft` ? tailX : x + cornerRadius, cy: placement === `bottomLeft` ? tailY : y - cornerRadius }, type: placement === `bottomLeft` ? "calloutCorner" : "corner" }, { coordinates: { x0: x, x1: x, y0: y - cornerRadius, y1: top + cornerRadius, cx: tailX, cy: tailY }, type: placement === `left` ? "calloutSide" : "side" } ]; const { path } = this.shape; path.clear(); path.moveTo(x, top + cornerRadius); for (const { coordinates, type } of pathParams) { this.drawPath(path, coordinates, cornerRadius, type); } path.closePath(); } drawPath(path, { x0, y0, x1, y1, cx, cy }, cornerRadius, type) { const sideTailRadius = 6; switch (type) { case "calloutCorner": { path.lineTo(cx, cy); path.lineTo(x1, y1); break; } case "corner": { drawCorner( path, { x0, x1, y0, y1, cx, cy }, cornerRadius, false ); break; } case "calloutSide": { if (x0 === x1) { const direction = y0 > y1 ? -1 : 1; const midY = Math.min(y0, y1) + Math.abs(y0 - y1) / 2; path.lineTo(x0, midY - sideTailRadius * direction); path.lineTo(cx, cy); path.lineTo(x0, midY + sideTailRadius * direction); path.lineTo(x1, y1); } else { const direction = x0 > x1 ? -1 : 1; const midX = Math.min(x0, x1) + Math.abs(x1 - x0) / 2; path.lineTo(midX - sideTailRadius * direction, y0); path.lineTo(cx, cy); path.lineTo(midX + sideTailRadius * direction, y0); path.lineTo(x1, y1); } break; } case "side": default: { path.lineTo(x1, y1); break; } } } calculateCalloutPlacement(placement, bounds) { const right = bounds.x + bounds.width; const top = bounds.y - bounds.height; let xPlacement; let yPlacement; if (placement.x > right) { xPlacement = "right"; } else if (placement.x < bounds.x) { xPlacement = "left"; } if (placement.y > bounds.y) { yPlacement = "bottom"; } else if (placement.y < top) { yPlacement = "top"; } if (xPlacement && yPlacement) { return `${yPlacement}${xPlacement[0].toUpperCase()}${xPlacement.substring(1)}`; } else { return yPlacement ?? xPlacement; } } getDimensions(datum, textBox, coords) { const { fontSize } = datum; const padding2 = datum.getPadding(); const horizontalPadding = padding2.left + padding2.right; const verticalPadding = padding2.top + padding2.bottom; const width = textBox.width + horizontalPadding; const height = Math.max(textBox.height + verticalPadding, fontSize + verticalPadding); return { tailPoint: { x: coords.x1, y: coords.y1 }, bodyBounds: { x: textBox.x, y: textBox.y, width, height } }; } containsPoint(x, y) { const { start, end, shape } = this; this.activeHandle = void 0; if (start.containsPoint(x, y)) { this.activeHandle = "start"; return true; } const bodyContainsPoint = end.containsPoint(x, y) || shape.containsPoint(x, y); if (bodyContainsPoint) { this.activeHandle = "end"; } return bodyContainsPoint; } }; // packages/ag-charts-enterprise/src/features/annotations/states/textualStartEndState.ts var import_ag_charts_community44 = require("ag-charts-community"); var import_ag_charts_core57 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/states/textualStateUtils.ts function guardCancelAndExit({ key }) { return key === "Escape"; } function guardSaveAndExit({ key, shiftKey }) { return !shiftKey && key === "Enter"; } // packages/ag-charts-enterprise/src/features/annotations/states/textualStartEndState.ts var TextualStartEndStateMachine = class extends import_ag_charts_core57.StateMachine { constructor(ctx) { const actionCreate = ({ point }) => { const datum = this.createDatum(); datum.set({ start: point, end: point, visible: true }); ctx.create(datum); }; const actionFirstRender = () => { const { node } = this; node?.toggleActive(true); node?.toggleHandles({ start: true }); }; const onStartEditing = () => { ctx.showTextInput(); if (this.datum) this.datum.visible = false; }; const onStopEditing = () => { ctx.hideTextInput(); if (this.datum) this.datum.visible = true; ctx.deselect(); }; const actionUpdateTextInputBBox = (bbox) => { this.node?.setTextInputBBox(bbox); ctx.update(); }; const onEndHover = ({ point }) => { const { datum, node } = this; datum?.set({ end: point }); node?.toggleActive(true); node?.toggleHandles({ end: false }); ctx.update(); }; const onEndClick = () => { ctx.showAnnotationOptions(); this.node?.toggleHandles({ end: true }); }; const actionColor = ({ colorPickerType, colorOpacity, color: color7, opacity, isMultiColor }) => { const { datum } = this; if (!datum) return; if (colorPickerType === "text-color") { ctx.updateTextInputColor(color7); } setColor(datum, colorPickerType, colorOpacity, color7, opacity, isMultiColor); ctx.update(); }; const actionFontSize = (fontSize) => { const { datum, node } = this; if (!datum || !node || !isTextType(datum)) return; datum.fontSize = fontSize; ctx.updateTextInputFontSize(fontSize); ctx.update(); }; const actionCancel = () => { ctx.delete(); }; const actionSave = ({ textInputValue, bbox }) => { const { datum } = this; if (bbox != null && textInputValue != null && textInputValue.length > 0) { if (!isTextType(datum)) { return; } const wrappedText = maybeWrapText(datum, textInputValue, bbox.width); datum?.set({ text: wrappedText }); ctx.update(); ctx.recordAction(`Create ${datum?.type} annotation`); } else { ctx.delete(); } }; super("start", { start: { click: { target: "waiting-first-render", action: actionCreate }, dragStart: { target: "waiting-first-render", action: actionCreate }, cancel: import_ag_charts_core57.StateMachine.parent, reset: import_ag_charts_core57.StateMachine.parent }, "waiting-first-render": { render: { target: "end", action: actionFirstRender } }, end: { hover: onEndHover, drag: onEndHover, click: { target: "edit", action: onEndClick }, dragEnd: { target: "edit", action: onEndClick }, reset: { target: import_ag_charts_core57.StateMachine.parent, action: actionCancel }, cancel: { target: import_ag_charts_core57.StateMachine.parent, action: actionCancel } }, edit: { onEnter: onStartEditing, updateTextInputBBox: actionUpdateTextInputBBox, color: actionColor, fontSize: actionFontSize, textInput: [ { guard: guardCancelAndExit, target: import_ag_charts_core57.StateMachine.parent, action: actionCancel }, { guard: guardSaveAndExit, target: import_ag_charts_core57.StateMachine.parent, action: actionSave } ], click: { target: import_ag_charts_core57.StateMachine.parent, action: actionSave }, dragStart: { target: import_ag_charts_core57.StateMachine.parent, action: actionSave }, resize: { target: import_ag_charts_core57.StateMachine.parent, action: actionSave }, onExit: onStopEditing, cancel: { target: import_ag_charts_core57.StateMachine.parent, action: actionCancel } } }); this.debug = import_ag_charts_core57.Debug.create(true, "annotations"); } }; __decorateClass([ (0, import_ag_charts_core57.StateMachineProperty)() ], TextualStartEndStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core57.StateMachineProperty)() ], TextualStartEndStateMachine.prototype, "node", 2); // packages/ag-charts-enterprise/src/features/annotations/callout/calloutState.ts var CalloutStateMachine = class extends TextualStartEndStateMachine { createDatum() { return new CalloutProperties(); } }; // packages/ag-charts-enterprise/src/features/annotations/callout/calloutConfig.ts var calloutConfig = { type: "callout" /* Callout */, datum: CalloutProperties, scene: CalloutScene, isDatum: CalloutProperties.is, translate: (node, datum, transition, context) => { if (CalloutProperties.is(datum) && CalloutScene.is(node)) return node.translate(datum, transition, context); }, copy: (node, datum, copiedDatum, context) => { if (CalloutProperties.is(datum) && CalloutProperties.is(copiedDatum) && CalloutScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (CalloutProperties.is(datum) && CalloutScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new CalloutStateMachine({ ...ctx, create: createDatum("callout" /* Callout */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/comment/commentScene.ts var import_ag_charts_community46 = require("ag-charts-community"); var import_ag_charts_core58 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/scenes/textualPointScene.ts var import_ag_charts_community45 = require("ag-charts-community"); var TextualPointScene = class extends PointScene { constructor() { super(...arguments); this.label = new import_ag_charts_community45._ModuleSupport.Text({ zIndex: 1 }); this.anchor = { x: 0, y: 0, position: "above-left" }; } setTextInputBBox(bbox) { this.textInputBBox = bbox; this.markDirty("TextualPointScene"); } update(datum, context) { const coords = convertPoint(datum, context); const bbox = this.getTextBBox(datum, coords, context); this.updateLabel(datum, bbox); this.updateHandle(datum, coords, bbox); this.updateShape(datum, bbox); this.anchor = this.updateAnchor(datum, bbox, context); } copy(datum, copiedDatum, context) { const coords = convertPoint(datum, context); const bbox = this.getTextBBox(datum, coords, context); const padding2 = datum.getPadding(); const horizontalPadding = padding2.left + padding2.right; const verticalPadding = padding2.top + padding2.bottom; const xOffset = (bbox.width + horizontalPadding) / 2; const yOffset = bbox.height + verticalPadding; const point = invertCoords({ x: coords.x - xOffset, y: coords.y - yOffset }, context); copiedDatum.x = point.x; copiedDatum.y = point.y; return copiedDatum; } containsPoint(x, y) { const { label } = this; return super.containsPoint(x, y) || label.visible && label.containsPoint(x, y); } getNodeAtCoords(x, y) { if (this.label.visible && this.label.containsPoint(x, y)) return "text"; return super.getNodeAtCoords(x, y); } getTextBBox(datum, coords, _context) { const { text: text2 } = datum.getText(); return getBBox(datum, text2, { x: coords.x, y: coords.y }, this.textInputBBox); } updateLabel(datum, bbox) { const { text: text2, isPlaceholder } = datum.getText(); updateTextNode( this.label, text2, isPlaceholder, datum, this.getLabelCoords(datum, bbox), this.getTextBaseline(datum) ); } updateShape(_datum, _bbox) { } updateAnchor(_datum, bbox, context) { return { x: bbox.x + context.seriesRect.x, y: bbox.y + context.seriesRect.y - bbox.height, position: this.anchor.position }; } getLabelCoords(_datum, bbox) { return bbox; } getTextBaseline(datum) { return datum.position == "center" ? "middle" : datum.position; } getHandleCoords(_datum, _coords, bbox) { return bbox; } getHandleStyles(datum) { const styles = super.getHandleStyles(datum); styles.stroke = datum.handle.stroke ?? datum.color; return styles; } }; // packages/ag-charts-enterprise/src/features/annotations/comment/commentScene.ts var { drawCorner: drawCorner2 } = import_ag_charts_community46._ModuleSupport; var CommentScene = class extends TextualPointScene { constructor() { super(); this.type = "comment" /* Comment */; this.shape = new import_ag_charts_community46._ModuleSupport.Path(); this.append([this.shape, this.label, this.handle]); } static is(value) { return AnnotationScene.isCheck(value, "comment" /* Comment */); } updateShape(datum, bbox) { const { shape } = this; shape.fill = datum.fill; shape.fillOpacity = datum.fillOpacity ?? 1; shape.stroke = datum.stroke ?? "transparent"; shape.strokeWidth = datum.strokeWidth ?? 1; shape.strokeOpacity = datum.strokeOpacity ?? 1; this.updatePath(datum, bbox); } getLabelCoords(datum, point) { const padding2 = datum.getPadding(); return { x: point.x + padding2.left, y: point.y - padding2.bottom }; } getHandleStyles(datum) { return { fill: datum.handle.fill, stroke: datum.handle.stroke ?? datum.stroke ?? datum.fill, strokeOpacity: datum.handle.strokeOpacity, strokeWidth: datum.handle.strokeWidth }; } updateAnchor(datum, bbox, context) { const anchor = super.updateAnchor(datum, bbox, context); const padding2 = datum.getPadding(); anchor.y -= padding2.bottom + padding2.top; return anchor; } updatePath(datum, bbox) { const padding2 = datum.getPadding(); const { x, y } = bbox; let { width, height } = bbox; const { fontSize } = datum; const horizontalPadding = padding2.left + padding2.right; const verticalPadding = padding2.top + padding2.bottom; width = width + horizontalPadding; height = Math.max(height + verticalPadding, fontSize + verticalPadding); const top = y - height; const right = x + width; const cornerRadius = ((0, import_ag_charts_core58.calcLineHeight)(fontSize, ANNOTATION_TEXT_LINE_HEIGHT) + verticalPadding) / 2; const { path } = this.shape; path.clear(); path.moveTo(x, y); path.lineTo(x, top + cornerRadius); drawCorner2( path, { x0: x, x1: x + cornerRadius, y0: top + cornerRadius, y1: top, cx: x + cornerRadius, cy: top + cornerRadius }, cornerRadius, false ); path.lineTo(right - cornerRadius, top); drawCorner2( path, { x0: right - cornerRadius, x1: right, y0: top, y1: top + cornerRadius, cx: right - cornerRadius, cy: top + cornerRadius }, cornerRadius, false ); path.lineTo(right, y - cornerRadius); drawCorner2( path, { x0: right, x1: right - cornerRadius, y0: y - cornerRadius, y1: y, cx: right - cornerRadius, cy: y - cornerRadius }, cornerRadius, false ); path.closePath(); } containsPoint(x, y) { return super.containsPoint(x, y) || this.shape.containsPoint(x, y); } }; // packages/ag-charts-enterprise/src/features/annotations/states/textualPointState.ts var import_ag_charts_community47 = require("ag-charts-community"); var import_ag_charts_core59 = require("ag-charts-core"); var TextualPointStateMachine = class extends import_ag_charts_core59.StateMachine { constructor(ctx) { const actionCreate = ({ point }) => { const datum = this.createDatum(); datum.set({ x: point.x, y: point.y }); ctx.create(datum); }; const actionFirstRender = () => { this.node?.toggleActive(true); ctx.showAnnotationOptions(); ctx.update(); }; const onStartEditing = () => { ctx.showTextInput(); if (this.datum) { this.datum.visible = false; } }; const onStopEditing = () => { ctx.hideTextInput(); if (this.datum) this.datum.visible = true; ctx.deselect(); }; const actionUpdateTextInputBBox = (bbox) => { this.node?.setTextInputBBox(bbox); ctx.update(); }; const actionColor = ({ colorPickerType, colorOpacity, color: color7, opacity, isMultiColor }) => { if (!this.datum) return; if (colorPickerType === "text-color") { ctx.updateTextInputColor(color7); } setColor(this.datum, colorPickerType, colorOpacity, color7, opacity, isMultiColor); ctx.update(); }; const actionFontSize = (fontSize) => { const { datum, node } = this; if (!datum || !node || !isTextType(datum)) return; datum.fontSize = fontSize; ctx.updateTextInputFontSize(fontSize); ctx.update(); }; const actionCancel = () => { ctx.delete(); }; const actionSave = ({ textInputValue, bbox }) => { if (bbox != null && textInputValue != null && textInputValue.length > 0) { const { datum } = this; if (!isTextType(datum)) { return; } const wrappedText = maybeWrapText(datum, textInputValue, bbox.width); datum?.set({ text: wrappedText }); ctx.update(); ctx.recordAction(`Create ${datum?.type} annotation`); } else { ctx.delete(); } }; super("start", { start: { click: { target: "waiting-first-render", action: actionCreate }, dragStart: { target: "waiting-first-render", action: actionCreate }, cancel: import_ag_charts_core59.StateMachine.parent, reset: import_ag_charts_core59.StateMachine.parent }, "waiting-first-render": { render: { target: "edit", action: actionFirstRender } }, edit: { onEnter: onStartEditing, updateTextInputBBox: actionUpdateTextInputBBox, color: actionColor, fontSize: actionFontSize, textInput: [ { guard: guardCancelAndExit, target: import_ag_charts_core59.StateMachine.parent, action: actionCancel }, { guard: guardSaveAndExit, target: import_ag_charts_core59.StateMachine.parent, action: actionSave } ], click: { target: import_ag_charts_core59.StateMachine.parent, action: actionSave }, dragStart: { target: import_ag_charts_core59.StateMachine.parent, action: actionSave }, resize: { target: import_ag_charts_core59.StateMachine.parent, action: actionSave }, onExit: onStopEditing, cancel: { target: import_ag_charts_core59.StateMachine.parent, action: actionCancel } } }); this.debug = import_ag_charts_core59.Debug.create(true, "annotations"); } }; __decorateClass([ (0, import_ag_charts_core59.StateMachineProperty)() ], TextualPointStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core59.StateMachineProperty)() ], TextualPointStateMachine.prototype, "node", 2); // packages/ag-charts-enterprise/src/features/annotations/comment/commentState.ts var CommentStateMachine = class extends TextualPointStateMachine { createDatum() { return new CommentProperties(); } }; // packages/ag-charts-enterprise/src/features/annotations/comment/commentConfig.ts var commentConfig = { type: "comment" /* Comment */, datum: CommentProperties, scene: CommentScene, isDatum: CommentProperties.is, translate: (node, datum, translation, context) => { if (CommentProperties.is(datum) && CommentScene.is(node)) node.translate(datum, translation, context); }, copy: (node, datum, copiedDatum, context) => { if (CommentProperties.is(datum) && CommentProperties.is(copiedDatum) && CommentScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (CommentProperties.is(datum) && CommentScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new CommentStateMachine({ ...ctx, create: createDatum("comment" /* Comment */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/cross-line/crossLineScene.ts var import_ag_charts_community51 = require("ag-charts-community"); var import_ag_charts_core62 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/scenes/axisLabelScene.ts var import_ag_charts_community48 = require("ag-charts-community"); var { calculateLabelTranslation } = import_ag_charts_community48._ModuleSupport; var AxisLabelScene = class extends import_ag_charts_community48._ModuleSupport.Group { constructor() { super({ name: "AnnotationAxisLabelGroup" }); this.label = new import_ag_charts_community48._ModuleSupport.Text({ zIndex: 1 }); this.rect = new import_ag_charts_community48._ModuleSupport.Rect(); const { label } = this; label.fontSize = 12; label.fontFamily = "Verdana, sans-serif"; label.fill = "black"; label.textBaseline = "middle"; label.textAlign = "center"; this.append([this.rect, this.label]); } update(opts) { this.updateLabel(opts); this.updateRect(opts); this.updatePosition(opts); } updateLabel({ value, styles, context }) { const { fontWeight, fontSize, fontStyle, fontFamily, textAlign, color: color7 = "white", formatter } = styles; const text2 = formatter ? formatter({ value }) : context.formatScaleValue(value, "annotation-label"); this.label.setProperties({ fontWeight, fontSize, fontStyle, fontFamily, textAlign, fill: color7, text: text2 }); } updateRect({ styles }) { const { rect } = this; const { cornerRadius, fill, fillOpacity, stroke: stroke3, strokeOpacity } = styles; rect.fill = fill; rect.fillOpacity = fillOpacity ?? 1; rect.stroke = stroke3; rect.strokeOpacity = strokeOpacity ?? 1; rect.cornerRadius = cornerRadius ?? 0; } updatePosition({ x, y, context, styles: { padding: padding2 } }) { const { label, rect } = this; const labelBBox = label.getBBox()?.clone(); const horizontalPadding = padding2 ?? 8; const verticalPadding = padding2 ?? 4; const { xTranslation, yTranslation } = calculateLabelTranslation({ yDirection: true, padding: context.labelPadding, position: context.position ?? "left", bbox: labelBBox }); labelBBox.grow(horizontalPadding, "horizontal"); labelBBox.grow(verticalPadding, "vertical"); const translationX = x + xTranslation; const translationY = y + yTranslation; label.x = translationX; label.y = translationY; rect.y = translationY - Math.round(labelBBox.height / 2); rect.x = translationX - Math.round(labelBBox.width / 2); rect.height = labelBBox.height; rect.width = labelBBox.width; } }; AxisLabelScene.className = "AxisLabel"; // packages/ag-charts-enterprise/src/features/annotations/scenes/collidableLineScene.ts var import_ag_charts_community49 = require("ag-charts-community"); var import_ag_charts_core60 = require("ag-charts-core"); var CollidableLine = class extends import_ag_charts_community49._ModuleSupport.Line { constructor() { super(...arguments); this.growCollisionBox = 9; this.clipMask = /* @__PURE__ */ new Map(); } setProperties(styles) { super.setProperties(styles); this.updateCollisionBBox(); return this; } updateCollisionBBox() { const { growCollisionBox, strokeWidth, x1, y1, x2, y2 } = this; let height = strokeWidth + growCollisionBox; if (height % 2 === 0) height += 1; const topLeft = import_ag_charts_core60.Vec2.from(x1, y1 - Math.floor(height / 2)); const bottomRight = import_ag_charts_core60.Vec2.from(x2, y2); const width = import_ag_charts_core60.Vec2.distance(topLeft, bottomRight); this.collisionBBox = new import_ag_charts_community49._ModuleSupport.BBox(topLeft.x, topLeft.y, width, height); } isPointInPath(pointX, pointY) { const { collisionBBox, x1, y1, x2, y2 } = this; if (!collisionBBox) return false; const v1 = import_ag_charts_core60.Vec2.from(x1, y1); const v2 = import_ag_charts_core60.Vec2.from(x2, y2); const point = import_ag_charts_core60.Vec2.sub(import_ag_charts_core60.Vec2.from(pointX, pointY), v1); const end = import_ag_charts_core60.Vec2.sub(v2, v1); const rotated = import_ag_charts_core60.Vec2.rotate(point, import_ag_charts_core60.Vec2.angle(point, end), v1); return collisionBBox.containsPoint(rotated.x, rotated.y) ?? false; } render(renderCtx) { const { clipMask } = this; const { ctx } = renderCtx; if (clipMask.size === 0) { super.render(renderCtx); return; } ctx.save(); try { for (const mask of this.clipMask.values()) { const { x, y, radius } = mask; ctx.beginPath(); ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height); ctx.ellipse(x, y, radius, radius, 0, Math.PI * 2, 0, true); ctx.clip(); } super.render(renderCtx); } finally { ctx.restore(); } } setClipMask(id, mask) { const cm = this.clipMask.get(id); if ((0, import_ag_charts_core60.jsonDiff)(cm, mask) != null) { this.markDirty("CollidableLine"); } if (mask) { this.clipMask.set(id, mask); } else { this.clipMask.delete(id); } } }; // packages/ag-charts-enterprise/src/features/annotations/scenes/collidableTextScene.ts var import_ag_charts_community50 = require("ag-charts-community"); var CollidableText = class extends import_ag_charts_community50._ModuleSupport.TransformableText { constructor() { super(...arguments); this.growCollisionBox = { top: 4, right: 4, bottom: 4, left: 4 }; } isPointInPath(pointX, pointY) { const localPoint = this.fromParentPoint(pointX, pointY); const uBBox = this.computeBBoxWithoutTransforms(); if (!uBBox) return false; return uBBox.grow(this.growCollisionBox).containsPoint(localPoint.x, localPoint.y); } }; // packages/ag-charts-enterprise/src/features/annotations/utils/lineWithText.ts var import_ag_charts_core61 = require("ag-charts-core"); function updateLineText(id, line, coords, textProperties, textNode, text2, lineWidth) { if (!text2 || !textNode || !textProperties) { line.setClipMask(id); return; } const { alignment, position } = textProperties; const numbers = getNumbers(coords, textProperties.fontSize, lineWidth); const { point, textBaseline } = positionAndAlignment(numbers, position, alignment); setProperties(textNode, text2, textProperties, point, numbers.angle, textBaseline); const { x, y, width, height } = textNode.getBBox(); const diameter = import_ag_charts_core61.Vec2.length(import_ag_charts_core61.Vec2.from(width, height)); const clipMask = { x: x + width / 2, y: y + height / 2, radius: diameter / 2 + import_ag_charts_core61.Vec2.length(numbers.offset) }; if (position === "center") { line.setClipMask(id, clipMask); } else { line.setClipMask(id); } return { clipMask, numbers }; } function updateChannelText(offsetInsideTextLabel, top, bottom, textProperties, lineWidth, textNode, text2) { if (!text2 || !textNode) return; const { alignment, position } = textProperties; const [actualTop, actualBottom] = top.y1 <= bottom.y1 ? [top, bottom] : [bottom, top]; let relativeLine = actualTop; if (position === "bottom") { relativeLine = actualBottom; } else if (position === "inside") { relativeLine = { x1: (actualTop.x1 + actualBottom.x1) / 2, y1: (actualTop.y1 + actualBottom.y1) / 2, x2: (actualTop.x2 + actualBottom.x2) / 2, y2: (actualTop.y2 + actualBottom.y2) / 2 }; } const numbers = getNumbers(relativeLine, textProperties.fontSize, lineWidth); const { point, textBaseline } = positionAndAlignment( numbers, position === "inside" ? "center" : position, alignment, offsetInsideTextLabel ); setProperties(textNode, text2, textProperties, point, numbers.angle, textBaseline); } function getNumbers(coords, fontSize, strokeWidth) { let [left, right] = import_ag_charts_core61.Vec2.from(coords); if (left.x > right.x) [left, right] = [right, left]; const normal = import_ag_charts_core61.Vec2.normalized(import_ag_charts_core61.Vec2.sub(right, left)); const angle = import_ag_charts_core61.Vec2.angle(normal); const inset = import_ag_charts_core61.Vec2.multiply(normal, DivariantHandle.HANDLE_SIZE / 2 + (fontSize ?? 14) / 2); const offset = import_ag_charts_core61.Vec2.multiply(normal, (strokeWidth ?? 2) / 2 + (fontSize ?? 14) / 3); return { left, right, normal, angle, inset, offset }; } function positionAndAlignment({ left, right, normal, angle, inset, offset }, position, alignment, offsetInsideTextLabel) { let point; if (alignment === "right") { point = import_ag_charts_core61.Vec2.sub(right, inset); } else if (alignment === "center") { point = import_ag_charts_core61.Vec2.add(left, import_ag_charts_core61.Vec2.multiply(normal, import_ag_charts_core61.Vec2.distance(left, right) / 2)); } else { point = import_ag_charts_core61.Vec2.add(left, inset); } let textBaseline = "bottom"; if (position === "bottom") { point = import_ag_charts_core61.Vec2.rotate(offset, angle + Math.PI / 2, point); textBaseline = "top"; } else if (position === "center" && !offsetInsideTextLabel) { textBaseline = "middle"; } else { point = import_ag_charts_core61.Vec2.rotate(offset, angle - Math.PI / 2, point); } return { point, textBaseline }; } function setProperties(scene, text2, textProperties, point, angle, textBaseline) { scene.setProperties({ text: text2, x: point.x, y: point.y, rotation: angle, rotationCenterX: point.x, rotationCenterY: point.y, fill: textProperties.color, fontFamily: textProperties.fontFamily, fontSize: textProperties.fontSize, fontStyle: textProperties.fontStyle, fontWeight: textProperties.fontWeight, textAlign: textProperties.alignment, textBaseline }); } // packages/ag-charts-enterprise/src/features/annotations/cross-line/crossLineScene.ts var CrossLineScene = class extends AnnotationScene { constructor() { super(); this.type = "cross-line"; this.line = new CollidableLine(); this.middle = new UnivariantHandle(); this.isHorizontal = false; this.append([this.line, this.middle]); } static is(value) { return AnnotationScene.isCheck(value, "cross-line"); } update(datum, context) { const { seriesRect } = context; this.seriesRect = seriesRect; this.isHorizontal = HorizontalLineProperties.is(datum); const axisContext = this.isHorizontal ? context.yAxis : context.xAxis; const coords = this.convertCrossLine(datum, axisContext); if (coords == null) { this.visible = false; return; } this.visible = datum.visible ?? true; if (!this.visible) return; this.updateLine(datum, coords); this.updateHandle(datum, coords); this.updateText(datum, coords); this.updateAxisLabel(datum, axisContext, coords); } updateLine(datum, coords) { const { line } = this; const { lineDashOffset, stroke: stroke3, strokeWidth, strokeOpacity } = datum; const { x1, y1, x2, y2 } = coords; line.setProperties({ x1, y1, x2, y2, lineCap: datum.getLineCap(), lineDash: datum.getLineDash(), lineDashOffset, stroke: stroke3, strokeWidth, strokeOpacity, fillOpacity: 0 }); } updateHandle(datum, coords) { const { middle } = this; const { locked, stroke: stroke3, strokeWidth, strokeOpacity } = datum; const handleStyles = { fill: datum.handle.fill, stroke: datum.handle.stroke ?? stroke3, strokeOpacity: datum.handle.strokeOpacity ?? strokeOpacity, strokeWidth: datum.handle.strokeWidth ?? strokeWidth }; const handlePosition = import_ag_charts_core62.Vec2.sub( import_ag_charts_core62.Vec4.center(coords), import_ag_charts_core62.Vec2.from(middle.handle.width / 2, middle.handle.height / 2) ); middle.gradient = this.isHorizontal ? "horizontal" : "vertical"; middle.update({ ...handleStyles, ...handlePosition }); middle.toggleLocked(locked ?? false); } updateText(datum, coords) { this.text = this.updateNode(CollidableText, this.text, !!datum.text.label); updateLineText(this.line.id, this.line, coords, datum.text, this.text, datum.text.label, datum.strokeWidth); } createAxisLabel(context) { const axisLabel3 = new AxisLabelScene(); context.attachLabel(axisLabel3); return axisLabel3; } updateAxisLabel(datum, axisContext, coords) { this.axisLabel ?? (this.axisLabel = this.createAxisLabel(axisContext)); const { axisLabel: axisLabel3, seriesRect } = this; const { direction, position } = axisContext; if (datum.axisLabel.enabled) { axisLabel3.visible = this.visible; const labelCorner = position === "left" || position === "top" ? import_ag_charts_core62.Vec4.start(coords) : import_ag_charts_core62.Vec4.end(coords); const labelPosition = direction === import_ag_charts_core62.ChartAxisDirection.X ? labelCorner.x : labelCorner.y; if (!axisContext.inRange(labelPosition)) { axisLabel3.visible = false; return; } const value = getGroupingValue(datum.value); axisLabel3.update({ ...import_ag_charts_core62.Vec2.add(labelCorner, import_ag_charts_core62.Vec2.required(seriesRect)), value, styles: datum.axisLabel, context: axisContext }); } else { axisLabel3.visible = false; } } setAxisLabelOpacity(opacity) { if (!this.axisLabel) return; this.axisLabel.opacity = opacity; } setAxisLabelVisible(visible) { if (!this.axisLabel) return; this.axisLabel.visible = visible; } toggleHandles(show) { this.middle.visible = show; this.middle.toggleHovered(this.activeHandle === "middle"); } destroy() { super.destroy(); this.axisLabel?.destroy(); } toggleActive(active) { this.toggleHandles(active); this.middle.toggleActive(active); } dragStart(datum, target, context) { const middle = HorizontalLineProperties.is(datum) ? { x: target.x, y: convert(datum.value, context.yAxis) } : { x: convert(datum.value, context.xAxis), y: target.y }; this.dragState = { offset: target, middle }; } drag(datum, target, context) { const { activeHandle, dragState } = this; if (!datum.isWriteable() || !dragState) return; if (activeHandle) { this[activeHandle].toggleDragging(true); } this.translatePoint(datum, dragState.middle, import_ag_charts_core62.Vec2.sub(target, dragState.offset), context); } translate(datum, translation, context) { if (!datum.isWriteable()) return; const vector = HorizontalLineProperties.is(datum) ? import_ag_charts_core62.Vec2.from(0, convert(datum.value, context.yAxis)) : import_ag_charts_core62.Vec2.from(convert(datum.value, context.xAxis), 0); this.translatePoint(datum, vector, translation, context); } translatePoint(datum, value, translation, context) { const isHorizontal2 = HorizontalLineProperties.is(datum); if (isHorizontal2) { translation.x = 0; } else { translation.y = 0; } const { point } = translate({ point: value }, translation, context); datum.value = isHorizontal2 ? point.y : point.x; } stopDragging() { this.middle.toggleDragging(false); } copy(datum, copiedDatum, context) { const isHorizontal2 = HorizontalLineProperties.is(datum); const axisContext = this.isHorizontal ? context.yAxis : context.xAxis; const coords = this.convertCrossLine(datum, axisContext); if (!coords) { return; } const yOffset = isHorizontal2 ? -30 : 0; const xOffset = isHorizontal2 ? 0 : -30; const point = invertCoords({ x: coords.x1 + xOffset, y: coords.y1 + yOffset }, context); copiedDatum.set({ value: isHorizontal2 ? point.y : point.x }); return copiedDatum; } getCursor() { if (this.activeHandle == null) return "pointer"; return this[this.activeHandle].getCursor(); } containsPoint(x, y) { const { middle, line, text: text2 } = this; this.activeHandle = void 0; if (middle.containsPoint(x, y)) { this.activeHandle = "middle"; return true; } return line.isPointInPath(x, y) || Boolean(text2?.containsPoint(x, y)); } getNodeAtCoords(x, y) { if (this.text?.containsPoint(x, y)) return "text"; if (this.line.isPointInPath(x, y)) return "line"; if (this.middle.containsPoint(x, y)) return "handle"; } getAnchor() { const bbox = this.computeBBoxWithoutHandles(); if (this.isHorizontal) { return { x: bbox.x + bbox.width / 2, y: bbox.y }; } return { x: bbox.x + bbox.width, y: bbox.y + bbox.height / 2, position: "right" }; } convertCrossLine(datum, context) { if (datum.value == null) return; let x1 = 0; let y1 = 0; let x2, y2; const { bounds } = context; const scaledValue = convert(datum.value, context); if (HorizontalLineProperties.is(datum)) { x2 = bounds.width; y1 = scaledValue; y2 = scaledValue; } else { x1 = scaledValue; x2 = scaledValue; y2 = bounds.height; } return { x1, y1, x2, y2 }; } }; // packages/ag-charts-enterprise/src/features/annotations/cross-line/crossLineState.ts var import_ag_charts_community52 = require("ag-charts-community"); var import_ag_charts_core63 = require("ag-charts-core"); var CrossLineStateMachine = class extends import_ag_charts_core63.StateMachine { constructor(direction, ctx) { const onClick = ({ point }) => { const isHorizontal2 = direction === "horizontal"; const datum = isHorizontal2 ? new HorizontalLineProperties() : new VerticalLineProperties(); datum.set({ value: isHorizontal2 ? point.y : point.x }); ctx.create(datum); ctx.recordAction( `Create ${isHorizontal2 ? "horizontal-line" /* HorizontalLine */ : "vertical-line" /* VerticalLine */} annotation` ); }; const actionFirstRender = () => { this.node?.toggleActive(true); ctx.showAnnotationOptions(); ctx.update(); }; super("start", { start: { click: { target: "waiting-first-render", action: onClick }, drag: { target: "waiting-first-render", action: onClick }, reset: import_ag_charts_core63.StateMachine.parent, cancel: import_ag_charts_core63.StateMachine.parent }, "waiting-first-render": { render: { target: import_ag_charts_core63.StateMachine.parent, action: actionFirstRender } } }); this.debug = import_ag_charts_core63.Debug.create(true, "annotations"); } }; __decorateClass([ (0, import_ag_charts_core63.StateMachineProperty)() ], CrossLineStateMachine.prototype, "node", 2); // packages/ag-charts-enterprise/src/features/annotations/cross-line/crossLineConfig.ts var horizontalLineConfig = { type: "horizontal-line" /* HorizontalLine */, datum: HorizontalLineProperties, scene: CrossLineScene, isDatum: HorizontalLineProperties.is, translate: (node, datum, translation, context) => { if (HorizontalLineProperties.is(datum) && CrossLineScene.is(node)) node.translate(datum, translation, context); }, copy: (node, datum, copiedDatum, context) => { if (HorizontalLineProperties.is(datum) && HorizontalLineProperties.is(copiedDatum) && CrossLineScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (HorizontalLineProperties.is(datum) && CrossLineScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new CrossLineStateMachine("horizontal", { ...ctx, create: createDatum("horizontal-line" /* HorizontalLine */) }), dragState: (ctx) => new DragStateMachine(ctx) }; var verticalLineConfig = { type: "vertical-line" /* VerticalLine */, datum: VerticalLineProperties, scene: CrossLineScene, isDatum: VerticalLineProperties.is, translate: (node, datum, translation, context) => { if (VerticalLineProperties.is(datum) && CrossLineScene.is(node)) node.translate(datum, translation, context); }, copy: (node, datum, copiedDatum, context) => { if (VerticalLineProperties.is(datum) && VerticalLineProperties.is(copiedDatum) && CrossLineScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (VerticalLineProperties.is(datum) && CrossLineScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new CrossLineStateMachine("vertical", { ...ctx, create: createDatum("vertical-line" /* VerticalLine */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/disjoint-channel/disjointChannelScene.ts var import_ag_charts_core65 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/scenes/channelScene.ts var import_ag_charts_community53 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/features/annotations/scenes/withBackgroundScene.ts var import_ag_charts_core64 = require("ag-charts-core"); var WithBackgroundScene = class { static updateBackground(datum, top, bottom, context) { const { background } = this; const { seriesRect } = context; background.path.clear(true); const bounds = import_ag_charts_core64.Vec4.from(0, 0, seriesRect.width, seriesRect.height); const points = this.getBackgroundPoints(datum, top, bottom, bounds); for (let i = 0; i < points.length; i++) { const point = points[i]; if (i === 0) { background.path.moveTo(point.x, point.y); } else { background.path.lineTo(point.x, point.y); } } background.path.closePath(); background.checkPathDirty(); const backgroundStyles = this.getBackgroundStyles?.(datum) ?? datum.background; background.fill = backgroundStyles.fill; background.fillOpacity = backgroundStyles.fillOpacity ?? 1; } }; // packages/ag-charts-enterprise/src/features/annotations/scenes/channelScene.ts var ChannelScene = class extends LinearScene { constructor() { super(...arguments); this.handles = {}; this.overflowContinuous = 2; this.topLine = new CollidableLine(); this.bottomLine = new CollidableLine(); this.background = new import_ag_charts_community53._ModuleSupport.Path({ zIndex: -1 }); this.anchor = { x: 0, y: 0 }; this.updateBackground = WithBackgroundScene.updateBackground.bind(this); } update(datum, context) { const { locked, visible } = datum; const top = convertLine(datum, context); const bottom = convertLine(datum.bottom, context); if (top == null || bottom == null) { this.visible = false; return; } else { this.visible = visible ?? true; } const topLine = this.extendLine(top, datum, context); const bottomLine = this.extendLine(bottom, datum, context); this.updateLines(datum, topLine, bottomLine, context, top, bottom); this.updateHandles(datum, top, bottom); this.updateText(datum, top, bottom); this.updateBackground(datum, topLine, bottomLine, context); this.updateAnchor(top, bottom); for (const handle3 of Object.values(this.handles)) { handle3.toggleLocked(locked ?? false); } } toggleHandles(show) { const { handles } = this; if (typeof show === "boolean") { for (const [handle3, node] of Object.entries(handles)) { node.visible = show; node.toggleHovered(this.activeHandle === handle3); } return; } for (const [handle3, visible] of Object.entries(show)) { const node = handles[handle3]; node.visible = visible ?? true; node.toggleHovered(this.activeHandle === handle3); } } toggleActive(active) { this.toggleHandles(active); for (const node of Object.values(this.handles)) { node.toggleActive(active); } } stopDragging() { const { activeHandle, handles } = this; if (activeHandle == null) return; handles[activeHandle].toggleDragging(false); } getAnchor() { return this.anchor; } getCursor() { if (this.activeHandle == null) return "pointer"; return this.handles[this.activeHandle].getCursor(); } containsPoint(x, y) { const { handles, topLine, bottomLine, text: text2 } = this; this.activeHandle = void 0; for (const [handle3, child] of Object.entries(handles)) { if (child.containsPoint(x, y)) { this.activeHandle = handle3; return true; } } return topLine.containsPoint(x, y) || bottomLine.containsPoint(x, y) || Boolean(text2?.containsPoint(x, y)); } getNodeAtCoords(x, y) { if (this.text?.containsPoint(x, y)) return "text"; if (this.topLine.containsPoint(x, y) || this.bottomLine.containsPoint(x, y)) return "line"; for (const [, child] of Object.entries(this.handles)) { if (child.containsPoint(x, y)) return "handle"; } } updateAnchor(top, bottom) { const { x, y } = import_ag_charts_community53._ModuleSupport.Transformable.toCanvasPoint( this.topLine, (top.x1 + top.x2) / 2, Math.min(top.y1, top.y2, bottom.y1, bottom.y2) ); this.anchor.x = x; this.anchor.y = y; } }; // packages/ag-charts-enterprise/src/features/annotations/disjoint-channel/disjointChannelScene.ts var DisjointChannelScene = class extends ChannelScene { constructor() { super(); this.type = "disjoint-channel"; this.handles = { topLeft: new DivariantHandle(), topRight: new DivariantHandle(), bottomLeft: new DivariantHandle(), bottomRight: new UnivariantHandle() }; this.append([this.background, this.topLine, this.bottomLine, ...Object.values(this.handles)]); } static is(value) { return AnnotationScene.isCheck(value, "disjoint-channel"); } dragHandle(datum, target, context, snapping) { const { activeHandle, handles } = this; if (activeHandle == null) return; const { offset } = handles[activeHandle].drag(target); handles[activeHandle].toggleDragging(true); if (activeHandle === "bottomRight") { offset.x = 0; } let translateVectors = []; let invertYVectors = []; let allowSnapping = snapping; switch (activeHandle) { case "topLeft": translateVectors = ["topLeft"]; invertYVectors = ["bottomLeft"]; break; case "bottomLeft": translateVectors = ["bottomLeft"]; invertYVectors = ["topLeft"]; break; case "topRight": translateVectors = ["topRight"]; invertYVectors = ["bottomRight"]; break; case "bottomRight": translateVectors = ["bottomLeft", "bottomRight"]; allowSnapping = false; break; } const top = convertLine(datum, context); const bottom = convertLine(datum.bottom, context); if (!top || !bottom) return; const vectors = { topLeft: import_ag_charts_core65.Vec4.start(top), topRight: import_ag_charts_core65.Vec4.end(top), bottomLeft: import_ag_charts_core65.Vec4.start(bottom), bottomRight: import_ag_charts_core65.Vec4.end(bottom) }; const snap = { vectors: { topLeft: vectors.topRight, bottomLeft: vectors.bottomRight, topRight: vectors.topLeft, bottomRight: vectors.bottomLeft }, angle: datum.snapToAngle }; const points = translate(vectors, offset, context, { overflowContinuous: this.overflowContinuous, translateVectors, invertYVectors, snap: allowSnapping ? snap : void 0 }); datum.start.x = points.topLeft.x; datum.start.y = points.topLeft.y; datum.end.x = points.topRight.x; datum.end.y = points.topRight.y; datum.startHeight = points.topLeft.y - points.bottomLeft.y; datum.endHeight = points.topRight.y - points.bottomRight.y; } getTranslatePointsVectors(start, end) { const { bottomLeft, bottomRight, topLeft, topRight } = this.handles; const startHeight = bottomLeft.getBBox().y - topLeft.getBBox().y; const endHeight = bottomRight.getBBox().y - topRight.getBBox().y; const bottomStart = import_ag_charts_core65.Vec2.add(start, import_ag_charts_core65.Vec2.from(0, startHeight)); const bottomEnd = import_ag_charts_core65.Vec2.add(end, import_ag_charts_core65.Vec2.from(0, endHeight)); return { start, end, bottomStart, bottomEnd }; } updateLines(datum, top, bottom) { const { topLine, bottomLine } = this; const { lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth } = datum; const lineStyles = { lineCap: datum.getLineCap(), lineDash: datum.getLineDash(), lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth }; topLine.setProperties({ ...top, ...lineStyles }); bottomLine.setProperties({ ...bottom, ...lineStyles }); } updateHandles(datum, top, bottom) { const { handles: { topLeft, topRight, bottomLeft, bottomRight } } = this; const handleStyles = { fill: datum.handle.fill, stroke: datum.handle.stroke ?? datum.stroke, strokeOpacity: datum.handle.strokeOpacity ?? datum.strokeOpacity, strokeWidth: datum.handle.strokeWidth ?? datum.strokeWidth }; topLeft.update({ ...handleStyles, ...import_ag_charts_core65.Vec4.start(top) }); topRight.update({ ...handleStyles, ...import_ag_charts_core65.Vec4.end(top) }); bottomLeft.update({ ...handleStyles, ...import_ag_charts_core65.Vec4.start(bottom) }); bottomRight.update({ ...handleStyles, ...import_ag_charts_core65.Vec2.sub(import_ag_charts_core65.Vec4.end(bottom), import_ag_charts_core65.Vec2.from(bottomRight.handle.width / 2, bottomRight.handle.height / 2)) }); } updateText(datum, top, bottom) { this.text = this.updateNode(CollidableText, this.text, !!datum.text.label); updateChannelText(false, top, bottom, datum.text, datum.strokeWidth, this.text, datum.text.label); } getBackgroundPoints(datum, top, bottom, bounds) { const isFlippedX = top.x1 > top.x2; const isFlippedY = top.y1 > top.y2; const topY = isFlippedY ? bounds.y2 : bounds.y1; const bottomY = isFlippedY ? bounds.y1 : bounds.y2; const points = import_ag_charts_core65.Vec2.from(top); if (datum.extendEnd && top.y2 === bottomY) { points.push(import_ag_charts_core65.Vec2.from(isFlippedX ? bounds.x1 : bounds.x2, isFlippedY ? bounds.y1 : bounds.y2)); } if (datum.extendEnd && bottom.y2 === topY) { points.push(import_ag_charts_core65.Vec2.from(isFlippedX ? bounds.x1 : bounds.x2, isFlippedY ? bounds.y2 : bounds.y1)); } points.push(...import_ag_charts_core65.Vec2.from(bottom).reverse()); if (datum.extendStart && bottom.y1 === bottomY) { points.push(import_ag_charts_core65.Vec2.from(isFlippedX ? bounds.x2 : bounds.x1, isFlippedY ? bounds.y1 : bounds.y2)); } if (datum.extendStart && top.y1 === topY) { points.push(import_ag_charts_core65.Vec2.from(isFlippedX ? bounds.x2 : bounds.x1, isFlippedY ? bounds.y2 : bounds.y1)); } return points; } }; // packages/ag-charts-enterprise/src/features/annotations/disjoint-channel/disjointChannelState.ts var import_ag_charts_core66 = require("ag-charts-core"); var DisjointChannelStateMachine = class extends import_ag_charts_core66.StateMachine { constructor(ctx) { const actionCreate = ({ point }) => { const datum = new DisjointChannelProperties(); datum.set({ start: point, end: point, startHeight: 0, endHeight: 0 }); ctx.create(datum); }; const actionFirstRender = () => { const { node } = this; node?.toggleActive(true); node?.toggleHandles({ topLeft: true, topRight: false, bottomLeft: false, bottomRight: false }); }; const actionEndUpdate = ({ offset, context }) => { const { datum, snapping } = this; if (!datum) return; datum.set({ end: snapPoint(offset, context, snapping, datum.start, datum.snapToAngle) }); ctx.update(); }; const actionEndFinish = () => { this.node?.toggleHandles({ topRight: true }); ctx.update(); }; const actionHeightUpdate = ({ point }) => { const { datum, node } = this; const endY = getGroupingValue(datum?.end.y); const startY = getGroupingValue(datum?.start.y); const { y: pointY } = point; if (datum == null || !(0, import_ag_charts_core66.isNumber)(startY) || !(0, import_ag_charts_core66.isNumber)(endY) || !(0, import_ag_charts_core66.isNumber)(pointY)) return; const endHeight = endY - (pointY ?? 0); const startHeight = (startY - endY) * 2 + endHeight; const bottomStart = { x: datum?.start.x, y: startY - startHeight }; const bottomEnd = { x: datum?.end.x, y: point.y }; node?.toggleHandles({ bottomLeft: true, bottomRight: true }); if (!ctx.validatePoint(bottomStart, { overflowContinuous: true }) || !ctx.validatePoint(bottomEnd, { overflowContinuous: true })) { return; } datum.set({ startHeight, endHeight }); ctx.update(); }; const actionHeightFinish = ({ point }) => { const { datum, node } = this; const endY = getGroupingValue(datum?.end.y); const startY = getGroupingValue(datum?.start.y); const { y: pointY } = point; if (datum == null || !(0, import_ag_charts_core66.isNumber)(startY) || !(0, import_ag_charts_core66.isNumber)(endY) || !(0, import_ag_charts_core66.isNumber)(pointY)) return; const endHeight = endY - (pointY ?? 0); const startHeight = (startY - endY) * 2 + endHeight; const bottomStart = { x: datum.start.x, y: startY - endHeight }; const bottomEnd = { x: datum.end.x, y: point.y }; node?.toggleHandles(true); if (!ctx.validatePoint(bottomStart, { overflowContinuous: true }) || !ctx.validatePoint(bottomEnd, { overflowContinuous: true })) { return; } datum.set({ startHeight, endHeight }); ctx.recordAction(`Create ${"disjoint-channel" /* DisjointChannel */} annotation`); ctx.showAnnotationOptions(); ctx.update(); }; const actionCancel = () => ctx.delete(); super("start", { start: { click: { target: "waiting-first-render", action: actionCreate }, drag: { target: "waiting-first-render", action: actionCreate }, reset: import_ag_charts_core66.StateMachine.parent }, "waiting-first-render": { render: { target: "end", action: actionFirstRender } }, end: { hover: actionEndUpdate, drag: actionEndUpdate, click: { target: "height", action: actionEndFinish }, dragEnd: { target: "height", action: actionEndFinish }, reset: { target: import_ag_charts_core66.StateMachine.parent, action: actionCancel }, cancel: { target: import_ag_charts_core66.StateMachine.parent, action: actionCancel } }, height: { hover: actionHeightUpdate, click: { target: import_ag_charts_core66.StateMachine.parent, action: actionHeightFinish }, drag: { target: import_ag_charts_core66.StateMachine.parent, action: actionHeightFinish }, reset: { target: import_ag_charts_core66.StateMachine.parent, action: actionCancel }, cancel: { target: import_ag_charts_core66.StateMachine.parent, action: actionCancel } } }); this.debug = import_ag_charts_core66.Debug.create(true, "annotations"); this.snapping = false; } }; __decorateClass([ (0, import_ag_charts_core66.StateMachineProperty)() ], DisjointChannelStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core66.StateMachineProperty)() ], DisjointChannelStateMachine.prototype, "node", 2); __decorateClass([ (0, import_ag_charts_core66.StateMachineProperty)() ], DisjointChannelStateMachine.prototype, "snapping", 2); // packages/ag-charts-enterprise/src/features/annotations/disjoint-channel/disjointChannelConfig.ts var disjointChannelConfig = { type: "disjoint-channel" /* DisjointChannel */, datum: DisjointChannelProperties, scene: DisjointChannelScene, isDatum: DisjointChannelProperties.is, translate: (node, datum, transition, context) => { if (DisjointChannelProperties.is(datum) && DisjointChannelScene.is(node)) { node.translate(datum, transition, context); } }, copy: (node, datum, copiedDatum, context) => { if (DisjointChannelProperties.is(datum) && DisjointChannelProperties.is(copiedDatum) && DisjointChannelScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (DisjointChannelProperties.is(datum) && DisjointChannelScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new DisjointChannelStateMachine({ ...ctx, create: createDatum("disjoint-channel" /* DisjointChannel */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement-trend-based/fibonacciRetracementTrendBasedScene.ts var import_ag_charts_core69 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/scenes/fibonacciScene.ts var import_ag_charts_community54 = require("ag-charts-community"); var import_ag_charts_core67 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/utils/fibonacci.ts var FIBONACCI_RETRACEMENT_RATIOS = [0, 23.6, 38.2, 50, 61.8, 78.6, 100]; var FIBONACCI_EXTENSION_RATIOS = [161.8, 261.8, 361.8, 423.6]; var FIBONACCI_RATIOS = [...FIBONACCI_RETRACEMENT_RATIOS, ...FIBONACCI_EXTENSION_RATIOS]; var FIBONACCI_RATIOS_MAP = { 10: FIBONACCI_RATIOS, 6: FIBONACCI_RETRACEMENT_RATIOS, 4: FIBONACCI_RETRACEMENT_RATIOS.filter((r) => r !== 78.6 && r !== 23.6) }; var FIBONACCI_RANGE_LABEL_PADDING = 10; function getFibonacciCoords(coords1, coords2) { const { x2, y1, y2 } = coords1; const trendLineVerticalDistance = y1 - y2; if (coords2 == null) { return { x1: x2, x2, y1: y2 - trendLineVerticalDistance, y2 }; } return { x1: coords2.x1, x2: coords2.x2, y1: coords2.y2 - trendLineVerticalDistance, y2: coords2.y2 }; } function createFibonacciRangesData({ x1, y1, x2, y2 }, context, reverse, yZero, bands = 10) { const verticalDistance = y1 - y2; const direction = reverse ? -1 : 1; let startY = yZero; const data = []; for (const [index, ratio8] of FIBONACCI_RATIOS_MAP[bands].entries()) { const endY = yZero + verticalDistance * (ratio8 / 100) * direction; const yDatumVal = context.yAxis.scaleInvert(endY); data.push({ id: index, x1, x2, y1: startY, y2: endY, tag: ratio8 == 100 ? 0 /* OneLine */ : 1 /* HorizontalLine */, label: { x1: Math.min(x1, x2) - FIBONACCI_RANGE_LABEL_PADDING, x2, y1: endY, y2: endY, text: `${(ratio8 / 100).toFixed(3)} (${yDatumVal.toFixed(2)})` } }); startY = endY; } return data; } // packages/ag-charts-enterprise/src/features/annotations/scenes/fibonacciScene.ts var FibonacciScene = class extends AnnotationScene { constructor() { super(); this.trendLine = new CollidableLine(); this.rangeFillsGroup = new import_ag_charts_community54._ModuleSupport.Group({ name: `${this.id}-range-fills` }); this.rangeFillsGroupSelection = import_ag_charts_community54._ModuleSupport.Selection.select(this.rangeFillsGroup, import_ag_charts_community54._ModuleSupport.Range); this.rangeStrokesGroup = new import_ag_charts_community54._ModuleSupport.Group({ name: `${this.id}-range-strokes` }); this.rangeStrokesGroupSelection = import_ag_charts_community54._ModuleSupport.Selection.select(this.rangeStrokesGroup, CollidableLine); this.labelsGroup = new import_ag_charts_community54._ModuleSupport.Group({ name: `${this.id}-ranges-labels` }); this.labelsGroupSelection = import_ag_charts_community54._ModuleSupport.Selection.select(this.labelsGroup, CollidableText); this.anchor = { x: 0, y: 0, position: "above" }; this.append([this.trendLine, this.rangeFillsGroup, this.rangeStrokesGroup, this.labelsGroup]); } update(datum, context) { let coords = convertLine(datum, context); if (coords == null) { this.visible = false; return; } coords = import_ag_charts_core67.Vec4.round(coords); this.visible = datum.visible ?? true; if (!this.visible) return; this.updateLine(datum, coords, this.trendLine); this.updateHandles(datum, coords); this.updateAnchor(datum, coords, context); const { reverse } = datum; const extendedCoords = this.extendLine(coords, datum, context); const yZero = reverse ? extendedCoords.y1 : extendedCoords.y2; const yOne = reverse ? extendedCoords.y2 : extendedCoords.y1; const data = createFibonacciRangesData(extendedCoords, context, datum.reverse, yZero, datum.bands); this.updateRanges(datum, data, context); const oneLinePoints = { ...extendedCoords, y1: yOne, y2: yOne }; this.updateText(datum, oneLinePoints); } extendLine({ x1, y1, x2, y2 }, datum, context) { const linePoints = { x1, y1, x2, y2 }; if (!datum.extendStart && !datum.extendEnd) { return linePoints; } const { x, width } = context.xAxis.bounds; if (datum.extendEnd) { linePoints[x1 > x2 ? "x1" : "x2"] = x + width; } if (datum.extendStart) { linePoints[x1 > x2 ? "x2" : "x1"] = x; } return linePoints; } updateLine(datum, coords, line) { if (!coords || !line) { return; } const { lineDashOffset, strokeWidth, strokeOpacity, stroke: stroke3 } = datum; line.setProperties({ ...coords, lineCap: datum.getLineCap(), lineDash: [3, 4], lineDashOffset, strokeWidth, strokeOpacity, fillOpacity: 0, stroke: stroke3 }); } updateRangeStrokes(datum) { const { lineDashOffset, strokeWidth, strokeOpacity, strokes, rangeStroke, isMultiColor } = datum; this.rangeStrokesGroupSelection.each((line, { x1, x2, y2, tag }, index) => { const y = y2; const color7 = isMultiColor ? strokes[index % strokes.length] : rangeStroke; line.setProperties({ x1, x2, y1: y, y2: y, stroke: color7, strokeOpacity, strokeWidth, lineCap: datum.getLineCap(), lineDash: datum.getLineDash(), lineDashOffset, tag }); }); } updateRanges(datum, data, context) { const getDatumId = (d) => d.id; this.rangeFillsGroupSelection.update(data, void 0, getDatumId); this.rangeStrokesGroupSelection.update(data, void 0, getDatumId); this.labelsGroupSelection.update(data, void 0, getDatumId); this.updateRangeFills(datum); this.updateRangeStrokes(datum); this.updateRangeLabels(datum, context); } updateRangeFills(datum) { const { lineDashOffset, strokeWidth, strokeOpacity, strokes: colors, rangeStroke, showFill, isMultiColor } = datum; this.rangeFillsGroupSelection.each((range2, { x1, x2, y1, y2 }, index) => { const color7 = isMultiColor ? colors[index % colors.length] : rangeStroke; if (!showFill) { range2.visible = false; return; } range2.setProperties({ x1, x2, y1, y2, startLine: false, endLine: false, stroke: color7, strokeOpacity, fill: color7, fillOpacity: (strokeOpacity ?? 1) * 0.15, strokeWidth, lineCap: datum.getLineCap(), lineDash: datum.getLineDash(), lineDashOffset, visible: true }); }); } updateRangeLabels(trendLineProperties, { xAxis }) { const { rangeStrokesGroupSelection } = this; const { strokes: colors, strokeWidth, rangeStroke, isMultiColor, label: { fontFamily, fontSize, fontStyle, fontWeight, color: color7 } } = trendLineProperties; const labelProperties = { fontFamily, fontSize, fontStyle, fontWeight }; const withinBounds = this.checkWithinBounds(xAxis, labelProperties, this.labelsGroupSelection.at(0)); this.labelsGroupSelection.each((textNode, datum, index) => { const textColor = color7 ?? (isMultiColor ? colors[index % colors.length] : rangeStroke); const line = rangeStrokesGroupSelection.at(index); if (!line) { return; } const { text: text2, ...coords } = datum.label; if (withinBounds) { textNode.setProperties({ ...labelProperties, text: text2, x: coords.x1, y: coords.y1, textBaseline: "middle", textAlign: "end", fill: textColor }); updateLineText(textNode.id, line, coords); } else { const textProperties = { ...labelProperties, label: text2, position: "center", alignment: "left", color: textColor }; updateLineText(textNode.id, line, coords, textProperties, textNode, text2, strokeWidth); } }); } checkWithinBounds(xAxis, fontOptions, textNode) { if (!textNode) { return false; } const { text: text2, ...coords } = textNode.datum.label; textNode.setProperties({ ...fontOptions, text: text2, x: coords.x1, y: coords.y1, textBaseline: "middle", textAlign: "end" }); const { x } = textNode.getBBox(); return x >= xAxis.bounds.x && x <= xAxis.bounds.x + xAxis.bounds.width; } updateText(datum, coords) { const oneLine = this.rangeStrokesGroupSelection.selectByTag(0 /* OneLine */)[0]; if (!oneLine) { return; } const { text: textProperties, strokeWidth } = datum; this.text = this.updateNode(CollidableText, this.text, !!textProperties.label); updateLineText(oneLine.id, oneLine, coords, textProperties, this.text, textProperties.label, strokeWidth); } updateAnchor(_datum, coords, _context, _bbox) { const point = import_ag_charts_core67.Vec4.topCenter(coords); import_ag_charts_core67.Vec2.apply(this.anchor, import_ag_charts_community54._ModuleSupport.Transformable.toCanvasPoint(this.trendLine, point.x, point.y)); } containsPoint(x, y) { const { trendLine, rangeStrokesGroupSelection, text: text2 } = this; let isInStrokePath = false; rangeStrokesGroupSelection.each((line) => isInStrokePath || (isInStrokePath = line.isPointInPath(x, y))); return isInStrokePath || trendLine.isPointInPath(x, y) || Boolean(text2?.containsPoint(x, y)); } getNodeAtCoords(x, y) { if (this.text?.containsPoint(x, y)) return "text"; if (this.trendLine.isPointInPath(x, y)) return "line"; } getHandleStyles(datum) { return { fill: datum.handle.fill, stroke: datum.handle.stroke ?? datum.stroke, strokeOpacity: datum.handle.strokeOpacity ?? datum.strokeOpacity, strokeWidth: datum.handle.strokeWidth ?? datum.strokeWidth }; } drag(datum, target, context, snapping) { if (!datum.isWriteable()) return; if (this.activeHandle) { this.dragHandle(datum, target, context, snapping); } else { this.dragAll(datum, target, context); } } getAnchor() { return this.anchor; } getCursor() { return "pointer"; } }; // packages/ag-charts-enterprise/src/features/annotations/utils/validation.ts var import_ag_charts_community55 = require("ag-charts-community"); var import_ag_charts_core68 = require("ag-charts-core"); var { ContinuousScale: ContinuousScale3 } = import_ag_charts_community55._ModuleSupport; function validateDatumPoint(context, point, options = { overflowContinuous: false }, warningPrefix) { if (point.x == null || point.y == null) { if (warningPrefix) { import_ag_charts_core68.Logger.warnOnce(`${warningPrefix}requires both an [x] and [y] property, ignoring.`); } return false; } const { xAxis, yAxis } = context; const continuousX = options.overflowContinuous && ContinuousScale3.is(xAxis.scale); const continuousY = options.overflowContinuous && ContinuousScale3.is(yAxis.scale); const validX = continuousX || validateDatumPointDirection(point.x, xAxis); const validY = continuousY || validateDatumPointDirection(point.y, yAxis); if (validX && validY) return true; if (warningPrefix) { let text2 = "x & y domains"; if (validX) text2 = "y domain"; if (validY) text2 = "x domain"; const xValue = getGroupingValue(point.x); const yValue = getGroupingValue(point.y); import_ag_charts_core68.Logger.warnOnce(`${warningPrefix}is outside the ${text2}, ignoring. - x: [${xValue}], y: ${yValue}]`); } return false; } function validateDatumPointDirection(d, context) { const { domain } = context.scale; const value = getGroupingValue(d); if (domain && value != null && context.continuous) { return value >= domain[0] && value <= domain.at(-1); } return true; } // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement-trend-based/fibonacciRetracementTrendBasedScene.ts var FibonacciRetracementTrendBasedScene = class extends FibonacciScene { constructor() { super(); this.type = "fibonacci-retracement-trend-based"; this.endRetracementLine = new CollidableLine(); this.start = new DivariantHandle(); this.end = new DivariantHandle(); this.endRetracement = new DivariantHandle(); this.append([this.endRetracementLine, this.start, this.end, this.endRetracement]); } static is(value) { return AnnotationScene.isCheck(value, "fibonacci-retracement-trend-based"); } update(datum, context) { let { coords1, coords2 } = this.getCoords(datum, context); if (coords1 == null || coords2 == null) { this.visible = false; return; } coords1 = import_ag_charts_core69.Vec4.round(coords1); coords2 = import_ag_charts_core69.Vec4.round(coords2); this.visible = datum.visible ?? true; if (!this.visible) return; if (datum.endRetracement.x == void 0 || datum.endRetracement.y == void 0) { coords2 = void 0; } this.updateLine(datum, coords1, this.trendLine); this.updateLine(datum, coords2, this.endRetracementLine); this.updateHandles(datum, coords1, coords2); this.updateAnchor(datum, coords2 ?? coords1, context); const { reverse, bands } = datum; const coords = getFibonacciCoords(coords1, coords2); const extendedCoords = this.extendLine(coords, datum, context); const yZero = extendedCoords.y2; const yOne = extendedCoords.y1; const data = coords2 ? createFibonacciRangesData(extendedCoords, context, reverse, yZero, bands) : []; this.updateRanges(datum, data, context); const oneLinePoints = { ...extendedCoords, y1: yOne, y2: yOne }; this.updateText(datum, oneLinePoints); } containsPoint(x, y) { const { start, end, endRetracement, endRetracementLine } = this; this.activeHandle = void 0; if (start.containsPoint(x, y)) { this.activeHandle = "start"; return true; } if (end.containsPoint(x, y)) { this.activeHandle = "end"; return true; } if (endRetracement.containsPoint(x, y)) { this.activeHandle = "endRetracement"; return true; } return endRetracementLine.isPointInPath(x, y) || super.containsPoint(x, y); } getNodeAtCoords(x, y) { if (this.start.containsPoint(x, y) || this.end.containsPoint(x, y) || this.endRetracement.containsPoint(x, y)) return "handle"; if (this.endRetracementLine.isPointInPath(x, y)) return "line"; return super.getNodeAtCoords(x, y); } dragStart(datum, target, context) { this.dragState = { offset: target, ...getDragStartState({ start: datum.start, end: datum.end, endRetracement: datum.endRetracement }, context) }; } stopDragging() { this.start.toggleDragging(false); this.end.toggleDragging(false); this.endRetracement.toggleDragging(false); } dragAll(datum, target, context) { const { dragState } = this; if (!dragState) return; this.translatePoints({ datum, start: dragState.start, end: dragState.end, endRetracement: dragState.endRetracement, translation: import_ag_charts_core69.Vec2.sub(target, dragState.offset), context }); } dragHandle(datum, target, context, snapping) { const { activeHandle, dragState } = this; if (!activeHandle || !dragState) return; this[activeHandle].toggleDragging(true); const point = snapping ? this.snapToAngle(datum, target, context) : invertCoords(this[activeHandle].drag(target).point, context); if (!point || !validateDatumPoint(context, point)) return; datum[activeHandle].x = point.x; datum[activeHandle].y = point.y; } snapToAngle(datum, coords, context) { const { activeHandle } = this; const handles = ["start", "end", "endRetracement"]; if (!activeHandle) return; const index = (handles.indexOf(activeHandle) + 1) % handles.length; const fixedHandle = handles[index]; this[activeHandle].toggleDragging(true); const fixed = convertPoint(datum[fixedHandle], context); return invertCoords(snapToAngle(coords, fixed, datum.snapToAngle), context); } translatePoints({ datum, start, end, endRetracement, translation, context }) { const points = translate({ start, end, endRetracement }, translation, context, { overflowContinuous: 2 }); datum.start.x = points.start.x; datum.end.x = points.end.x; datum.endRetracement.x = points.endRetracement.x; datum.start.y = points.start.y; datum.end.y = points.end.y; datum.endRetracement.y = points.endRetracement.y; } translate(datum, translation, context) { this.translatePoints({ datum, start: convertPoint(datum.start, context), end: convertPoint(datum.end, context), endRetracement: convertPoint(datum.endRetracement, context), translation, context }); } copy(datum, copiedDatum, context) { const { coords1, coords2 } = this.getCoords(datum, context); if (!coords1 || !coords2) { return; } const bbox = this.computeBBoxWithoutHandles(); this.translatePoints({ datum: copiedDatum, start: import_ag_charts_core69.Vec4.start(coords1), end: import_ag_charts_core69.Vec4.end(coords1), endRetracement: import_ag_charts_core69.Vec4.end(coords2), translation: { x: -bbox.width / 2, y: -bbox.height / 2 }, context }); return copiedDatum; } getCoords(datum, context) { return { coords1: convertLine(datum, context), coords2: convertLine({ start: datum.end, end: datum.endRetracement }, context) }; } toggleHandles(show) { if (typeof show === "boolean") { this.start.visible = show; this.end.visible = show; this.endRetracement.visible = show; } else { for (const [handle3, visible] of (0, import_ag_charts_core69.entries)(show)) { this[handle3].visible = visible; } } this.start.toggleHovered(this.activeHandle === "start"); this.end.toggleHovered(this.activeHandle === "end"); this.endRetracement.toggleHovered(this.activeHandle === "endRetracement"); } toggleActive(active) { this.toggleHandles(active); this.start.toggleActive(active); this.end.toggleActive(active); this.endRetracement.toggleActive(active); } updateHandles(datum, coords1, coords2, bbox) { this.start.update({ ...this.getHandleStyles(datum), ...this.getHandleCoords(datum, coords1, "start") }); this.end.update({ ...this.getHandleStyles(datum), ...this.getHandleCoords(datum, coords1, "end", bbox) }); if (coords2) { this.endRetracement.update({ ...this.getHandleStyles(datum), ...this.getHandleCoords(datum, coords2, "endRetracement", bbox) }); } this.start.toggleLocked(datum.locked ?? false); this.end.toggleLocked(datum.locked ?? false); this.endRetracement.toggleLocked(datum.locked ?? false); } getHandleCoords(_datum, coords, handle3, _bbox) { return handle3 === "start" ? import_ag_charts_core69.Vec4.start(coords) : import_ag_charts_core69.Vec4.end(coords); } }; // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement-trend-based/fibonacciRetracementTrendBasedState.ts var import_ag_charts_core70 = require("ag-charts-core"); var FibonacciRetracementTrendBasedStateMachine = class extends import_ag_charts_core70.StateMachine { constructor(ctx) { const actionCreate = ({ point }) => { const datum = this.createDatum(); datum.set({ start: point, end: point }); ctx.create(datum); }; const actionFirstRender = () => { const { node } = this; node?.toggleActive(true); node?.toggleHandles({ start: true, end: false, endRetracement: false }); }; const actionEndUpdate = ({ offset, context }) => { const { datum, snapping } = this; if (!datum) return; datum.set({ end: snapPoint(offset, context, snapping, datum.start, datum.snapToAngle) }); ctx.update(); }; const actionEndFinish = () => { const { datum } = this; if (!datum) return; datum.endRetracement.x = datum.end.x; datum.endRetracement.y = datum.end.y; this.node?.toggleHandles({ end: true }); ctx.update(); }; const actionEndRetracementUpdate = ({ offset, context }) => { const { datum, snapping } = this; if (!datum) return; datum.set({ endRetracement: snapPoint(offset, context, snapping, datum.end, datum.snapToAngle) }); ctx.update(); }; const actionEndRetracementFinish = () => { this.node?.toggleHandles({ endRetracement: true }); ctx.update(); }; const actionCancel = () => ctx.delete(); const onExitEnd = () => { ctx.showAnnotationOptions(); ctx.recordAction(`Create ${this.datum?.type} annotation`); }; super("start", { start: { click: { target: "waiting-first-render", action: actionCreate }, drag: { target: "waiting-first-render", action: actionCreate }, reset: import_ag_charts_core70.StateMachine.parent }, "waiting-first-render": { render: { target: "end", action: actionFirstRender } }, end: { hover: actionEndUpdate, click: { target: "endRetracement", action: actionEndFinish }, drag: actionEndUpdate, dragEnd: { target: "endRetracement", action: actionEndFinish }, reset: { target: import_ag_charts_core70.StateMachine.parent, action: actionCancel }, cancel: { target: import_ag_charts_core70.StateMachine.parent, action: actionCancel }, onExit: onExitEnd }, endRetracement: { hover: actionEndRetracementUpdate, click: { target: import_ag_charts_core70.StateMachine.parent, action: actionEndRetracementFinish }, drag: { target: import_ag_charts_core70.StateMachine.parent, action: actionEndRetracementFinish }, reset: { target: import_ag_charts_core70.StateMachine.parent, action: actionCancel }, cancel: { target: import_ag_charts_core70.StateMachine.parent, action: actionCancel } } }); this.debug = import_ag_charts_core70.Debug.create(true, "annotations"); this.snapping = false; } createDatum() { return new FibonacciRetracementTrendBasedProperties(); } }; __decorateClass([ (0, import_ag_charts_core70.StateMachineProperty)() ], FibonacciRetracementTrendBasedStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core70.StateMachineProperty)() ], FibonacciRetracementTrendBasedStateMachine.prototype, "node", 2); __decorateClass([ (0, import_ag_charts_core70.StateMachineProperty)() ], FibonacciRetracementTrendBasedStateMachine.prototype, "snapping", 2); // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement-trend-based/fibonacciRetracementTrendBasedConfig.ts var fibonacciRetracementTrendBasedConfig = { type: "fibonacci-retracement-trend-based" /* FibonacciRetracementTrendBased */, datum: FibonacciRetracementTrendBasedProperties, scene: FibonacciRetracementTrendBasedScene, isDatum: FibonacciRetracementTrendBasedProperties.is, translate: (node, datum, transition, context) => { if (FibonacciRetracementTrendBasedProperties.is(datum) && FibonacciRetracementTrendBasedScene.is(node)) node.translate(datum, transition, context); }, copy: (node, datum, copiedDatum, context) => { if (FibonacciRetracementTrendBasedProperties.is(datum) && FibonacciRetracementTrendBasedProperties.is(copiedDatum) && FibonacciRetracementTrendBasedScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (FibonacciRetracementTrendBasedProperties.is(datum) && FibonacciRetracementTrendBasedScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new FibonacciRetracementTrendBasedStateMachine({ ...ctx, create: createDatum("fibonacci-retracement-trend-based" /* FibonacciRetracementTrendBased */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement/fibonacciRetracementScene.ts var import_ag_charts_core71 = require("ag-charts-core"); var FibonacciRetracementScene = class extends FibonacciScene { constructor() { super(); this.type = "fibonacci-retracement"; this.start = new DivariantHandle(); this.end = new DivariantHandle(); this.append([this.start, this.end]); } static is(value) { return AnnotationScene.isCheck(value, "fibonacci-retracement"); } containsPoint(x, y) { const { start, end } = this; this.activeHandle = void 0; if (start.containsPoint(x, y)) { this.activeHandle = "start"; return true; } if (end.containsPoint(x, y)) { this.activeHandle = "end"; return true; } return super.containsPoint(x, y); } getNodeAtCoords(x, y) { if (this.start.containsPoint(x, y) || this.end.containsPoint(x, y)) return "handle"; return super.getNodeAtCoords(x, y); } dragStart(datum, target, context) { this.dragState = { offset: target, ...getDragStartState({ start: datum.start, end: datum.end }, context) }; } stopDragging() { this.start.toggleDragging(false); this.end.toggleDragging(false); } dragAll(datum, target, context) { const { dragState } = this; if (!dragState) return; this.translatePoints({ datum, start: dragState.start, end: dragState.end, translation: import_ag_charts_core71.Vec2.sub(target, dragState.offset), context }); } dragHandle(datum, target, context, snapping) { const { activeHandle, dragState } = this; if (!activeHandle || !dragState) return; this[activeHandle].toggleDragging(true); const point = snapping ? this.snapToAngle(datum, target, context) : invertCoords(this[activeHandle].drag(target).point, context); if (!point || !validateDatumPoint(context, point)) return; datum[activeHandle].x = point.x; datum[activeHandle].y = point.y; } snapToAngle(datum, coords, context) { const { activeHandle } = this; const handles = ["start", "end"]; const fixedHandle = handles.find((handle3) => handle3 !== activeHandle); if (!activeHandle || !fixedHandle) return; this[activeHandle].toggleDragging(true); const fixed = convertPoint(datum[fixedHandle], context); return invertCoords(snapToAngle(coords, fixed, datum.snapToAngle), context); } translatePoints({ datum, start, end, translation, context }) { const points = translate({ start, end }, translation, context, { overflowContinuous: 1 }); datum.start.x = points.start.x; datum.end.x = points.end.x; datum.start.y = points.start.y; datum.end.y = points.end.y; } translate(datum, translation, context) { this.translatePoints({ datum, start: convertPoint(datum.start, context), end: convertPoint(datum.end, context), translation, context }); } copy(datum, copiedDatum, context) { const coords = convertLine(datum, context); if (!coords) { return; } const bbox = this.computeBBoxWithoutHandles(); this.translatePoints({ datum: copiedDatum, start: { x: coords.x1, y: coords.y1 }, end: { x: coords.x2, y: coords.y2 }, translation: { x: -bbox.width / 2, y: -bbox.height / 2 }, context }); return copiedDatum; } toggleHandles(show) { if (typeof show === "boolean") { this.start.visible = show; this.end.visible = show; } else { for (const [handle3, visible] of (0, import_ag_charts_core71.entries)(show)) { this[handle3].visible = visible; } } this.start.toggleHovered(this.activeHandle === "start"); this.end.toggleHovered(this.activeHandle === "end"); } toggleActive(active) { this.toggleHandles(active); this.start.toggleActive(active); this.end.toggleActive(active); } updateHandles(datum, coords, _coords2, bbox) { this.start.update({ ...this.getHandleStyles(datum), ...this.getHandleCoords(datum, coords, "start") }); this.end.update({ ...this.getHandleStyles(datum), ...this.getHandleCoords(datum, coords, "end", bbox) }); this.start.toggleLocked(datum.locked ?? false); this.end.toggleLocked(datum.locked ?? false); } getHandleCoords(_datum, coords, handle3, _bbox) { return handle3 === "start" ? import_ag_charts_core71.Vec4.start(coords) : import_ag_charts_core71.Vec4.end(coords); } }; // packages/ag-charts-enterprise/src/features/annotations/line/lineState.ts var import_ag_charts_core72 = require("ag-charts-core"); var LineTypeStateMachine = class extends import_ag_charts_core72.StateMachine { constructor(ctx) { const actionCreate = ({ point }) => { const datum = this.createDatum(); datum.set({ start: point, end: point }); ctx.create(datum); }; const actionFirstRender = () => { const { node } = this; node?.toggleActive(true); node?.toggleHandles({ start: true, end: false }); }; const actionEndUpdate = ({ offset, context }) => { const { datum, snapping } = this; if (!datum) return; datum.set({ end: snapPoint(offset, context, snapping, datum.start, datum.snapToAngle) }); ctx.update(); }; const actionEndFinish = () => { this.node?.toggleHandles({ end: true }); ctx.update(); }; const actionCancel = () => ctx.delete(); const onExitEnd = () => { ctx.showAnnotationOptions(); ctx.recordAction(`Create ${this.datum?.type} annotation`); }; super("start", { start: { click: { target: "waiting-first-render", action: actionCreate }, drag: { target: "waiting-first-render", action: actionCreate }, reset: import_ag_charts_core72.StateMachine.parent }, "waiting-first-render": { render: { target: "end", action: actionFirstRender } }, end: { hover: actionEndUpdate, click: { target: import_ag_charts_core72.StateMachine.parent, action: actionEndFinish }, drag: actionEndUpdate, dragEnd: { target: import_ag_charts_core72.StateMachine.parent, action: actionEndFinish }, reset: { target: import_ag_charts_core72.StateMachine.parent, action: actionCancel }, cancel: { target: import_ag_charts_core72.StateMachine.parent, action: actionCancel }, onExit: onExitEnd } }); this.debug = import_ag_charts_core72.Debug.create(true, "annotations"); this.snapping = false; } }; __decorateClass([ (0, import_ag_charts_core72.StateMachineProperty)() ], LineTypeStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core72.StateMachineProperty)() ], LineTypeStateMachine.prototype, "node", 2); __decorateClass([ (0, import_ag_charts_core72.StateMachineProperty)() ], LineTypeStateMachine.prototype, "snapping", 2); var ArrowStateMachine = class extends LineTypeStateMachine { createDatum() { return new ArrowProperties(); } }; var LineStateMachine = class extends LineTypeStateMachine { createDatum() { return new LineProperties(); } }; // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement/fibonacciRetracementState.ts var FibonacciRetracementStateMachine = class extends LineTypeStateMachine { createDatum() { return new FibonacciRetracementProperties(); } }; // packages/ag-charts-enterprise/src/features/annotations/fibonacci-retracement/fibonacciRetracementConfig.ts var fibonacciRetracementConfig = { type: "fibonacci-retracement" /* FibonacciRetracement */, datum: FibonacciRetracementProperties, scene: FibonacciRetracementScene, isDatum: FibonacciRetracementProperties.is, translate: (node, datum, transition, context) => { if (FibonacciRetracementProperties.is(datum) && FibonacciRetracementScene.is(node)) node.translate(datum, transition, context); }, copy: (node, datum, copiedDatum, context) => { if (FibonacciRetracementProperties.is(datum) && FibonacciRetracementProperties.is(copiedDatum) && FibonacciRetracementScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (FibonacciRetracementProperties.is(datum) && FibonacciRetracementScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new FibonacciRetracementStateMachine({ ...ctx, create: createDatum("fibonacci-retracement" /* FibonacciRetracement */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/line/lineScene.ts var import_ag_charts_community57 = require("ag-charts-community"); var import_ag_charts_core74 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/scenes/capScene.ts var import_ag_charts_community56 = require("ag-charts-community"); var import_ag_charts_core73 = require("ag-charts-core"); var CapScene = class extends import_ag_charts_community56._ModuleSupport.Group { }; var ArrowCapScene = class extends CapScene { constructor() { super(); this.type = "arrow"; this.path = new import_ag_charts_community56._ModuleSupport.Path(); this.armLength = 6; this.append([this.path]); } update(options) { const { path } = this; const { x, y, angle, ...rest } = options; const origin = import_ag_charts_core73.Vec2.from(x, y); const offsetAngle = 3 * Math.PI / 4; const armLength = this.armLength + (options.strokeWidth ?? 0) * 2; const leftEnd = import_ag_charts_core73.Vec2.rotate(import_ag_charts_core73.Vec2.from(0, armLength), angle + offsetAngle, origin); const rightEnd = import_ag_charts_core73.Vec2.rotate(import_ag_charts_core73.Vec2.from(armLength, 0), angle - offsetAngle, origin); path.setProperties(rest); path.fillOpacity = 0; path.path.clear(); path.path.moveTo(leftEnd.x, leftEnd.y); path.path.lineTo(origin.x, origin.y); path.path.lineTo(rightEnd.x, rightEnd.y); } }; // packages/ag-charts-enterprise/src/features/annotations/line/lineScene.ts var { Transformable: Transformable2 } = import_ag_charts_community57._ModuleSupport; var LineScene = class extends StartEndScene { constructor() { super(); this.type = "line"; this.line = new CollidableLine(); this.append([this.line, this.start, this.end]); } static is(value) { return AnnotationScene.isCheck(value, "line"); } update(datum, context) { let coords = convertLine(datum, context); if (coords == null) { this.visible = false; return; } coords = import_ag_charts_core74.Vec4.round(coords); this.visible = datum.visible ?? true; if (!this.visible) return; this.updateLine(datum, coords, context); this.updateHandles(datum, coords); this.updateText(datum, coords); this.updateCaps(datum, coords); this.updateAnchor(datum, coords, context); } updateLine(datum, coords, context) { const { line } = this; const { lineDashOffset, stroke: stroke3, strokeWidth, strokeOpacity } = datum; const linePoints = this.extendLine(coords, datum, context); line.setProperties({ ...linePoints, lineCap: datum.getLineCap(), lineDash: datum.getLineDash(), lineDashOffset, stroke: stroke3, strokeWidth, strokeOpacity, fillOpacity: 0 }); } updateText(datum, coords) { this.text = this.updateNode(CollidableText, this.text, !!datum.text.label); updateLineText(this.line.id, this.line, coords, datum.text, this.text, datum.text.label, datum.strokeWidth); } updateCaps(datum, coords) { if (!datum.startCap && this.startCap) { this.startCap.remove(); this.startCap = void 0; } if (!datum.endCap && this.endCap) { this.endCap.remove(); this.endCap = void 0; } if (!datum.startCap && !datum.endCap) return; const { stroke: stroke3, strokeWidth, strokeOpacity } = datum; const [start, end] = import_ag_charts_core74.Vec2.from(coords); const angle = import_ag_charts_core74.Vec2.angle(import_ag_charts_core74.Vec2.sub(end, start)); if (datum.startCap) { if (this.startCap && this.startCap.type !== datum.startCap) { this.startCap.remove(); this.startCap = void 0; } if (this.startCap == null) { this.startCap = new ArrowCapScene(); this.append([this.startCap]); } this.startCap.update({ x: start.x, y: start.y, angle: angle - Math.PI, stroke: stroke3, strokeWidth, strokeOpacity }); } if (datum.endCap) { if (this.endCap && this.endCap.type !== datum.endCap) { this.endCap.remove(); this.endCap = void 0; } if (this.endCap == null) { this.endCap = new ArrowCapScene(); this.append([this.endCap]); } this.endCap.update({ x: end.x, y: end.y, angle, stroke: stroke3, strokeWidth, strokeOpacity }); } } updateAnchor(_datum, coords, _context, _bbox) { const point = import_ag_charts_core74.Vec4.topCenter(coords); import_ag_charts_core74.Vec2.apply(this.anchor, Transformable2.toCanvasPoint(this.line, point.x, point.y)); } containsPoint(x, y) { const { line, text: text2 } = this; return super.containsPoint(x, y) || line.isPointInPath(x, y) || Boolean(text2?.containsPoint(x, y)); } getNodeAtCoords(x, y) { if (this.text?.containsPoint(x, y)) return "text"; if (this.line.isPointInPath(x, y)) return "line"; return super.getNodeAtCoords(x, y); } getHandleCoords(_datum, coords, handle3, _bbox) { const { startCap, endCap } = this; let [startPoint, endPoint] = import_ag_charts_core74.Vec2.from(coords); const angle = import_ag_charts_core74.Vec2.angle(import_ag_charts_core74.Vec2.sub(endPoint, startPoint)); if (startCap) { startPoint = import_ag_charts_core74.Vec2.rotate(import_ag_charts_core74.Vec2.from(0, -DivariantHandle.HANDLE_SIZE / 2), angle, startPoint); } if (endCap) { endPoint = import_ag_charts_core74.Vec2.rotate(import_ag_charts_core74.Vec2.from(0, DivariantHandle.HANDLE_SIZE / 2), angle, endPoint); } return handle3 === "start" ? startPoint : endPoint; } getHandleStyles(datum) { return { fill: datum.handle.fill, stroke: datum.handle.stroke ?? datum.stroke, strokeOpacity: datum.handle.strokeOpacity ?? datum.strokeOpacity, strokeWidth: datum.handle.strokeWidth ?? datum.strokeWidth }; } }; // packages/ag-charts-enterprise/src/features/annotations/line/lineConfig.ts var lineConfig = { type: "line" /* Line */, datum: LineProperties, scene: LineScene, isDatum: LineProperties.is, translate: (node, datum, transition, context) => { if (LineProperties.is(datum) && LineScene.is(node)) node.translate(datum, transition, context); }, copy: (node, datum, copiedDatum, context) => { if (LineProperties.is(datum) && LineProperties.is(copiedDatum) && LineScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (LineProperties.is(datum) && LineScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new LineStateMachine({ ...ctx, create: createDatum("line" /* Line */) }), dragState: (ctx) => new DragStateMachine(ctx) }; var arrowConfig = { type: "arrow" /* Arrow */, datum: ArrowProperties, scene: LineScene, isDatum: ArrowProperties.is, translate: (node, datum, transition, context) => { if (ArrowProperties.is(datum) && LineScene.is(node)) node.translate(datum, transition, context); }, copy: (node, datum, copiedDatum, context) => { if (ArrowProperties.is(datum) && ArrowProperties.is(copiedDatum) && LineScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (ArrowProperties.is(datum) && LineScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new ArrowStateMachine({ ...ctx, create: createDatum("arrow" /* Arrow */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/measurer/measurerScene.ts var import_ag_charts_community60 = require("ag-charts-community"); var import_ag_charts_core76 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/measurer/measurerStatisticsScene.ts var import_ag_charts_community59 = require("ag-charts-community"); var import_ag_charts_core75 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/annotations/utils/layout.ts var import_ag_charts_community58 = require("ag-charts-community"); function layoutScenesRow(scenes, startX = 0, gap = 0) { let x = startX; for (const scene of scenes) { if (Array.isArray(scene)) { for (const scene_ of scene) { layoutSetX(scene_, x); } x += import_ag_charts_community58._ModuleSupport.Group.computeChildrenBBox(scene).width + gap; } else { layoutSetX(scene, x); x += scene.getBBox().width + gap; } } } function layoutScenesColumn(scenes, startY = 0, gap = 0) { let y = startY; for (const scene of scenes) { if (Array.isArray(scene)) { for (const scene_ of scene) { layoutSetY(scene_, y); } y += import_ag_charts_community58._ModuleSupport.Group.computeChildrenBBox(scene).height + gap; } else { layoutSetY(scene, y); y += scene.getBBox().height + gap; } } } function layoutSetX(scene, x) { if ("x1" in scene) { scene.x2 = x + (scene.x2 - scene.x1); scene.x1 = x; } else { scene.x = x; } } function layoutSetY(scene, y) { if ("y1" in scene) { scene.y2 = y + (scene.y2 - scene.y1); scene.y1 = y; } else { scene.y = y; } } function layoutAddX(scene, x) { if ("x1" in scene) { scene.x1 += x; scene.x2 += x; } else { scene.x += x; } } function layoutAddY(scene, y) { if ("y1" in scene) { scene.y1 += y; scene.y2 += y; } else { scene.y += y; } } // packages/ag-charts-enterprise/src/features/annotations/measurer/measurerStatisticsScene.ts var MeasurerStatisticsScene = class extends import_ag_charts_community59._ModuleSupport.Group { constructor() { super(); this.name = "MeasurerStatisticsScene"; this.background = new import_ag_charts_community59._ModuleSupport.Rect(); this.dateRangeBarsText = new import_ag_charts_community59._ModuleSupport.Text(); this.dateRangeDivider = new import_ag_charts_community59._ModuleSupport.Line(); this.dateRangeValueText = new import_ag_charts_community59._ModuleSupport.Text(); this.priceRangeValueText = new import_ag_charts_community59._ModuleSupport.Text(); this.priceRangeDivider = new import_ag_charts_community59._ModuleSupport.Line(); this.priceRangePercentageText = new import_ag_charts_community59._ModuleSupport.Text(); this.volumeText = new import_ag_charts_community59._ModuleSupport.Text(); this.volumeFormatter = new Intl.NumberFormat("en-US", { notation: "compact", minimumFractionDigits: 2, maximumFractionDigits: 2 }); this.append([ this.background, this.dateRangeBarsText, this.dateRangeDivider, this.dateRangeValueText, this.priceRangeValueText, this.priceRangeDivider, this.priceRangePercentageText, this.volumeText ]); } update(datum, stats, anchor, coords, context, verticalDirection, localeManager) { this.verticalDirection = verticalDirection; const scenes = this.updateStatistics(datum, stats, anchor, localeManager); const bbox = import_ag_charts_community59._ModuleSupport.Group.computeChildrenBBox(scenes.flat()); const padding2 = 10; bbox.grow(padding2); this.updateBackground(datum, bbox, padding2); this.reposition(scenes, padding2, context); this.checkVisibility(datum, context, coords); } checkVisibility(datum, context, coords) { const bounds = import_ag_charts_core75.Vec4.from(context.seriesRect); this.visible = import_ag_charts_core75.Vec4.collides(coords, bounds) && (datum.visible ?? true); } updateStatistics(datum, stats, anchor, localeManager) { const { dateRangeBarsText, dateRangeDivider, dateRangeValueText, priceRangeValueText, priceRangeDivider, priceRangePercentageText, volumeText } = this; const horizontalGap = 8; const verticalGap = 6; const dividerLineHeight = datum.statistics.fontSize + 3; const dividerLineOffset = -2; const textStyles = this.getTextStyles(datum); const dividerLineStyles = { ...this.getDividerStyles(datum), x1: 0, y1: 0, x2: 0, y2: dividerLineHeight }; const dateScenes = [dateRangeBarsText, dateRangeDivider, dateRangeValueText]; const priceScenes = [priceRangeValueText, priceRangeDivider, priceRangePercentageText]; const scenes = []; if (stats.priceRange) { priceRangeValueText.setProperties({ ...textStyles, text: this.formatPriceRangeValue(stats.priceRange.value, localeManager) }); priceRangeDivider.setProperties(dividerLineStyles); priceRangePercentageText.setProperties({ ...textStyles, text: this.formatPriceRangePercentage(stats.priceRange.percentage, localeManager) }); layoutScenesRow(priceScenes, anchor.x, horizontalGap); scenes.push(priceScenes); } if (stats.dateRange) { dateRangeBarsText.setProperties({ ...textStyles, text: this.formatDateRangeBars(stats.dateRange.bars, localeManager) }); dateRangeDivider.setProperties(dividerLineStyles); dateRangeValueText.setProperties({ ...textStyles, text: this.formatDateRangeValue(stats.dateRange.value) }); layoutScenesRow(dateScenes, anchor.x, horizontalGap); scenes.push(dateScenes); } if (stats.volume == null) { volumeText.visible = false; } else { volumeText.setProperties({ ...textStyles, x: anchor.x, text: this.formatVolume(stats.volume, localeManager), visible: true }); scenes.push(volumeText); } layoutScenesColumn(scenes, anchor.y, verticalGap); priceRangeDivider.y1 += dividerLineOffset; priceRangeDivider.y2 += dividerLineOffset; dateRangeDivider.y1 += dividerLineOffset; dateRangeDivider.y2 += dividerLineOffset; return scenes; } updateBackground(datum, bbox, padding2) { const styles = this.getBackgroundStyles(datum); this.background.setProperties({ ...styles, ...bbox, x: bbox.x - bbox.width / 2 + padding2, y: bbox.y }); } reposition(scenes, padding2, context) { const { width, height } = context.seriesRect; const background = import_ag_charts_core75.Vec4.from(this.background.getBBox()); let offsetX = 0; if (background.x1 < 0) offsetX = -background.x1; if (background.x2 > width) offsetX = width - background.x2; const offsetY = Math.min(padding2, height - background.y2); for (const scene of scenes) { if (Array.isArray(scene)) { const rowWidth = import_ag_charts_community59._ModuleSupport.Group.computeChildrenBBox(scene).width; for (const scene_ of scene) { layoutAddX(scene_, offsetX - rowWidth / 2); layoutAddY(scene_, offsetY); } } else { layoutAddX(scene, offsetX - scene.getBBox().width / 2); layoutAddY(scene, offsetY); } } this.background.x += offsetX; this.background.y += offsetY; } getTextStyles(datum) { return { fill: datum.statistics.color, fontFamily: datum.statistics.fontFamily, fontSize: datum.statistics.fontSize, fontStyle: datum.statistics.fontStyle, fontWeight: datum.statistics.fontWeight, textBaseline: "top" }; } getDividerStyles(datum) { return { stroke: datum.statistics.divider.stroke, strokeOpacity: datum.statistics.divider.strokeOpacity, strokeWidth: datum.statistics.divider.strokeWidth }; } getBackgroundStyles(datum) { return { fill: datum.statistics.fill, stroke: datum.statistics.stroke, strokeOpacity: datum.statistics.strokeOpacity, strokeWidth: datum.statistics.strokeWidth, cornerRadius: 4 }; } formatDateRangeBars(bars, localeManager) { return localeManager?.t("measurerDateRangeBars", { value: bars }) ?? `${bars}`; } formatDateRangeValue(time) { const range2 = []; const sign = time >= 0 ? "" : "-"; time = Math.abs(time); const MINUTE = 1e3 * 60; const HOUR = MINUTE * 60; const DAY2 = HOUR * 24; const minutes = Math.floor(time / MINUTE); const hours = Math.floor(time / HOUR); const days = Math.floor(time / DAY2); const remainderHours = hours % (DAY2 / HOUR); const remainderMinutes = minutes % (HOUR / MINUTE); if (days >= 1) range2.push(`${days}d`); if (hours >= 1 && (time < DAY2 || remainderHours !== 0)) range2.push(`${remainderHours}h`); if (time < HOUR || remainderMinutes !== 0) range2.push(`${remainderMinutes}m`); range2[0] = `${sign}${range2[0]}`; return range2.join(" "); } formatPriceRangeValue(value, localeManager) { return localeManager?.t("measurerPriceRangeValue", { value: Number(value.toFixed(2)) }) ?? `${value}`; } formatPriceRangePercentage(percentage, localeManager) { return localeManager?.t("measurerPriceRangePercent", { value: percentage }) ?? `${percentage}`; } formatVolume(volume, localeManager) { const volumeString = Number.isNaN(volume) ? "" : this.volumeFormatter.format(volume); return localeManager?.t("measurerVolume", { value: volumeString }) ?? volumeString; } }; var QuickMeasurerStatisticsScene = class extends MeasurerStatisticsScene { getDirectionStyles(datum) { return this.verticalDirection === "down" ? datum.down.statistics : datum.up.statistics; } getTextStyles(datum) { const styles = this.getDirectionStyles(datum); return { ...super.getTextStyles(datum), fill: styles.color, fontFamily: styles.fontFamily, fontSize: styles.fontSize, fontStyle: styles.fontStyle, fontWeight: styles.fontWeight }; } getDividerStyles(datum) { const styles = this.getDirectionStyles(datum); return { stroke: styles.divider.stroke, strokeOpacity: styles.divider.strokeOpacity, strokeWidth: styles.divider.strokeWidth }; } getBackgroundStyles(datum) { const styles = this.getDirectionStyles(datum); return { ...super.getBackgroundStyles(datum), fill: styles.fill, stroke: styles.stroke, strokeOpacity: styles.strokeOpacity, strokeWidth: styles.strokeWidth }; } }; // packages/ag-charts-enterprise/src/features/annotations/measurer/measurerScene.ts var MeasurerScene = class extends StartEndScene { constructor() { super(); this.type = "measurer"; this.horizontalLine = new CollidableLine(); this.verticalLine = new CollidableLine(); // These four bounding lines are named after the way they are drawn, e.g. the horizontalStartLine is a horizontal // line that is only shown when the measurer has the 'vertical' direction. this.horizontalStartLine = new CollidableLine(); this.horizontalEndLine = new CollidableLine(); this.verticalStartLine = new CollidableLine(); this.verticalEndLine = new CollidableLine(); this.horizontalEndCap = new ArrowCapScene(); this.verticalEndCap = new ArrowCapScene(); this.background = new import_ag_charts_community60._ModuleSupport.Path({ zIndex: -1 }); this.updateBackground = WithBackgroundScene.updateBackground.bind(this); this.statistics = this.createStatisticsScene(); this.statistics.zIndex = 1; this.append([ this.background, this.verticalStartLine, this.verticalEndLine, this.horizontalStartLine, this.horizontalEndLine, this.horizontalLine, this.verticalLine, this.horizontalEndCap, this.verticalEndCap, this.start, this.end, this.statistics ]); } static is(value) { return AnnotationScene.isCheck(value, "measurer"); } createStatisticsScene() { return new MeasurerStatisticsScene(); } update(datum, context) { const coords = convertLine(datum, context); if (coords == null) { this.visible = false; return; } this.visible = datum.visible ?? true; if (!this.visible) return; const extended = this.extendPerpendicular(coords, datum, context); const verticalStart = { ...extended, y2: extended.y1 }; const verticalEnd = { ...extended, y1: extended.y2 }; this.verticalDirection = coords.y1 < coords.y2 ? "down" : "up"; this.updateVisibilities(datum); this.updateLines(datum, coords); this.updateHandles(datum, coords); this.updateText(datum, coords); this.updateCaps(datum, coords); this.updateBoundingLines(datum, extended); this.updateBackground(datum, verticalStart, verticalEnd, context); this.updateStatistics(datum, coords, context); this.updateAnchor(datum, coords, context); } extendPerpendicular(coords, datum, context) { const extended = { x1: Math.min(coords.x1, coords.x2), x2: Math.max(coords.x1, coords.x2), y1: Math.min(coords.y1, coords.y2), y2: Math.max(coords.y1, coords.y2) }; const [start, end] = import_ag_charts_core76.Vec2.from(context.yAxis.bounds); if (DateRangeProperties.is(datum)) { if (datum.extendAbove) extended.y1 = start.y; if (datum.extendBelow) extended.y2 = end.y; } else if (PriceRangeProperties.is(datum)) { if (datum.extendLeft) extended.x1 = start.x; if (datum.extendRight) extended.x2 = end.x; } return extended; } updateVisibilities(datum) { const { horizontalStartLine, horizontalEndLine, horizontalEndCap, verticalStartLine, verticalEndLine, verticalEndCap } = this; const { direction } = datum; verticalStartLine.visible = direction !== "vertical"; verticalEndLine.visible = direction !== "vertical"; horizontalEndCap.visible = direction !== "vertical"; horizontalStartLine.visible = direction !== "horizontal"; horizontalEndLine.visible = direction !== "horizontal"; verticalEndCap.visible = direction !== "horizontal"; } updateLines(datum, coords) { const { horizontalLine, verticalLine } = this; const { direction } = datum; const { x1, y1, x2, y2 } = coords; const center = import_ag_charts_core76.Vec2.round(import_ag_charts_core76.Vec4.center(coords), 0); const lineStyles = this.getLineStyles(datum); if (direction !== "vertical") { horizontalLine.setProperties({ ...lineStyles, x1, x2, y1: center.y, y2: center.y }); } if (direction !== "horizontal") { verticalLine.setProperties({ ...lineStyles, x1: center.x, x2: center.x, y1, y2 }); } } updateText(datum, coords) { const { direction } = datum; const center = import_ag_charts_core76.Vec2.round(import_ag_charts_core76.Vec4.center(coords), 0); let line; const textCoords = { ...coords }; if (direction === "vertical") { line = this.verticalLine; textCoords.x1 = center.x; textCoords.x2 = center.x; } else { line = this.horizontalLine; textCoords.y1 = center.y; textCoords.y2 = center.y; } this.text = this.updateNode(CollidableText, this.text, !!datum.text.label); const { id } = line; const clip = updateLineText(id, line, textCoords, datum.text, this.text, datum.text.label, datum.strokeWidth); let verticalClipMask; if (direction === "both" && clip && this.text) { const textBBox = import_ag_charts_core76.Vec4.from(this.text.getBBox()); const { offset } = clip.numbers; const crossesVerticalLine = textBBox.x1 <= center.x + offset.x && textBBox.x2 >= center.x - offset.x; if (crossesVerticalLine) { verticalClipMask = { x: center.x, y: clip.clipMask.y, radius: this.text.getBBox().height / 2 + import_ag_charts_core76.Vec2.length(offset) }; } } this.verticalLine.setClipMask(id, verticalClipMask); } updateCaps(datum, coords) { const { horizontalEndCap, verticalEndCap } = this; const { direction } = datum; const { x1, y1, x2, y2 } = coords; const center = import_ag_charts_core76.Vec2.round(import_ag_charts_core76.Vec4.center(coords), 0); const { stroke: stroke3, strokeWidth, strokeOpacity } = this.getLineStyles(datum); const capStyles = { stroke: stroke3, strokeWidth, strokeOpacity }; if (direction !== "vertical") { const angle = x1 <= x2 ? 0 : Math.PI; let x = x2; if (direction === "horizontal") { x += x1 <= x2 ? -2 : 2; } horizontalEndCap.update({ ...capStyles, x, y: center.y, angle }); } if (direction !== "horizontal") { const angle = y1 <= y2 ? Math.PI / 2 : Math.PI / -2; let y = y2; if (direction === "vertical") { y += y1 <= y2 ? -2 : 2; } verticalEndCap.update({ ...capStyles, x: center.x, y, angle }); } } updateBoundingLines(datum, extendedCoords) { const { verticalStartLine, verticalEndLine, horizontalStartLine, horizontalEndLine } = this; const { direction } = datum; const { x1, y1, x2, y2 } = extendedCoords; const lineStyles = this.getLineStyles(datum); if (direction === "horizontal") { verticalStartLine.setProperties({ ...lineStyles, x1, y1, x2: x1, y2 }); verticalEndLine.setProperties({ ...lineStyles, x1: x2, y1, x2, y2 }); } if (direction === "vertical") { horizontalStartLine.setProperties({ ...lineStyles, x1, y1, x2, y2: y1 }); horizontalEndLine.setProperties({ ...lineStyles, x1, y1: y2, x2, y2 }); } } updateStatistics(datum, coords, context) { const point = import_ag_charts_core76.Vec2.add(import_ag_charts_core76.Vec4.bottomCenter(coords), import_ag_charts_core76.Vec2.from(0, 10)); const statistics = { volume: this.getVolume(datum) }; if (datum.hasPriceRange) { statistics.priceRange = { percentage: this.getPriceRangePercentage(datum), value: this.getPriceRangeValue(datum) }; } if (datum.hasDateRange) { statistics.dateRange = { bars: this.getDateRangeBars(coords, context), value: this.getDateRangeValue(datum) }; } this.statistics.update(datum, statistics, point, coords, context, this.verticalDirection, datum.localeManager); } updateAnchor(_datum, coords, _context, _bbox) { const point = import_ag_charts_core76.Vec4.topCenter(coords); import_ag_charts_core76.Vec2.apply(this.anchor, import_ag_charts_community60._ModuleSupport.Transformable.toCanvasPoint(this.horizontalLine, point.x, point.y)); } getBackgroundPoints(_datum, verticalStart, verticalEnd, _bounds) { const [startStart, startEnd] = import_ag_charts_core76.Vec2.from(verticalStart); const [endStart, endEnd] = import_ag_charts_core76.Vec2.from(verticalEnd); return [startStart, startEnd, endEnd, endStart]; } getLineStyles(datum) { const { lineDashOffset, stroke: stroke3, strokeWidth, strokeOpacity } = datum; return { lineCap: datum.getLineCap(), lineDash: datum.getLineDash(), lineDashOffset, stroke: stroke3, strokeWidth, strokeOpacity, fillOpacity: 0 }; } getBackgroundStyles(datum) { const { background } = datum; return { fill: background.fill, fillOpacity: background.fillOpacity }; } getHandleStyles(datum) { return { fill: datum.handle.fill, stroke: datum.handle.stroke ?? datum.stroke, strokeOpacity: datum.handle.strokeOpacity ?? datum.strokeOpacity, strokeWidth: datum.handle.strokeWidth ?? datum.strokeWidth }; } containsPoint(x, y) { const { horizontalLine, text: text2, verticalLine, horizontalStartLine, horizontalEndLine, verticalStartLine, verticalEndLine } = this; return super.containsPoint(x, y) || horizontalLine.isPointInPath(x, y) || verticalLine.isPointInPath(x, y) || horizontalStartLine.visible && horizontalStartLine.isPointInPath(x, y) || horizontalEndLine.visible && horizontalEndLine.isPointInPath(x, y) || verticalStartLine.visible && verticalStartLine.isPointInPath(x, y) || verticalEndLine.visible && verticalEndLine.isPointInPath(x, y) || Boolean(text2?.containsPoint(x, y)); } getNodeAtCoords(x, y) { if (this.text?.containsPoint(x, y)) return "text"; if (this.start.containsPoint(x, y) || this.end.containsPoint(x, y)) return "handle"; return "line"; } getDateRangeBars(coords, context) { const { step } = context.xAxis.scale; const sign = coords.x1 <= coords.x2 ? 1 : -1; return step ? Math.round(import_ag_charts_core76.Vec4.width(coords) / step) * sign : 0; } getDateRangeValue(datum) { const start = getGroupingValue(datum.start.x); const end = getGroupingValue(datum.end.x); if (!(0, import_ag_charts_core76.isDate)(start) || !(0, import_ag_charts_core76.isDate)(end)) { throw new Error("Can not create a date range measurement of non-date x-axis."); } return end.getTime() - start.getTime(); } getPriceRangePercentage(datum) { if (datum.start.y == null || datum.end.y == null) { throw new Error("Can not create a price range measurement of a non-numeric y-axis"); } const endY = getGroupingValue(datum.end.y); const startY = getGroupingValue(datum.start.y); if (!(0, import_ag_charts_core76.isNumber)(endY) || !(0, import_ag_charts_core76.isNumber)(startY)) { throw new Error("Can not create a price range measurement of a non-numeric y-axis"); } return (endY - startY) / startY; } getPriceRangeValue(datum) { if (datum.start.y == null || datum.end.y == null) { throw new Error("Can not create a price range measurement of a non-numeric y-axis"); } const endY = getGroupingValue(datum.end.y); const startY = getGroupingValue(datum.start.y); if (!(0, import_ag_charts_core76.isNumber)(endY) || !(0, import_ag_charts_core76.isNumber)(startY)) { throw new Error("Can not create a price range measurement of a non-numeric y-axis"); } return endY - startY; } getVolume(datum) { return datum.getVolume(datum.start.x, datum.end.x); } }; var QuickMeasurerScene = class extends MeasurerScene { constructor() { super(...arguments); this.type = "quick-measurer"; } static is(value) { return AnnotationScene.isCheck(value, "quick-measurer"); } createStatisticsScene() { return new QuickMeasurerStatisticsScene(); } getDirectionStyles(datum) { return this.verticalDirection === "down" ? datum.down : datum.up; } getLineStyles(datum) { const styles = this.getDirectionStyles(datum); return { ...super.getLineStyles(datum), stroke: styles.stroke, strokeWidth: styles.strokeWidth, strokeOpacity: styles.strokeOpacity }; } getBackgroundStyles(datum) { const styles = this.getDirectionStyles(datum); return { fill: styles.fill, fillOpacity: styles.fillOpacity }; } getHandleStyles(datum) { const styles = this.getDirectionStyles(datum); return { fill: styles.handle.fill, stroke: styles.handle.stroke ?? styles.stroke, strokeOpacity: styles.handle.strokeOpacity ?? styles.strokeOpacity, strokeWidth: styles.handle.strokeWidth ?? styles.strokeWidth }; } }; // packages/ag-charts-enterprise/src/features/annotations/measurer/measurerState.ts var import_ag_charts_core77 = require("ag-charts-core"); var MeasurerTypeStateMachine = class extends import_ag_charts_core77.StateMachine { constructor(ctx) { const actionCreate = ({ point }) => { const datum = this.createDatum(); datum.set({ start: point, end: point }); ctx.create(datum); }; const actionEndUpdate = ({ point }) => { const { datum, node } = this; datum?.set({ end: point }); node?.toggleActive(true); node?.toggleHandles({ end: false }); ctx.update(); }; const actionEndFinish = () => { this.node?.toggleHandles({ end: true }); }; const actionCancel = () => ctx.delete(); const onExitEnd = () => { ctx.showAnnotationOptions(); ctx.recordAction(`Create ${this.node?.type} annotation`); }; super("start", { start: { reset: import_ag_charts_core77.StateMachine.parent, click: { target: "end", action: actionCreate }, drag: { target: "end", action: actionCreate } }, end: { hover: actionEndUpdate, drag: actionEndUpdate, click: { target: import_ag_charts_core77.StateMachine.parent, action: actionEndFinish }, dragEnd: { target: import_ag_charts_core77.StateMachine.parent, action: actionEndFinish }, reset: { target: import_ag_charts_core77.StateMachine.parent, action: actionCancel }, cancel: { target: import_ag_charts_core77.StateMachine.parent, action: actionCancel }, onExit: onExitEnd } }); this.debug = import_ag_charts_core77.Debug.create(true, "annotations"); } }; __decorateClass([ (0, import_ag_charts_core77.StateMachineProperty)() ], MeasurerTypeStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core77.StateMachineProperty)() ], MeasurerTypeStateMachine.prototype, "node", 2); var DateRangeStateMachine = class extends MeasurerTypeStateMachine { createDatum() { return new DateRangeProperties(); } }; var PriceRangeStateMachine = class extends MeasurerTypeStateMachine { createDatum() { return new PriceRangeProperties(); } }; var DatePriceRangeStateMachine = class extends MeasurerTypeStateMachine { createDatum() { return new DatePriceRangeProperties(); } }; var QuickDatePriceRangeStateMachine = class extends MeasurerTypeStateMachine { createDatum() { return new QuickDatePriceRangeProperties(); } }; // packages/ag-charts-enterprise/src/features/annotations/measurer/measurerConfig.ts var dateRangeConfig = { type: "date-range" /* DateRange */, datum: DateRangeProperties, scene: MeasurerScene, isDatum: DateRangeProperties.is, translate: (node, datum, translation, context) => { if (DateRangeProperties.is(datum) && MeasurerScene.is(node)) { node.translate(datum, translation, context); } }, copy: (node, datum, copiedDatum, context) => { if (DateRangeProperties.is(datum) && DateRangeProperties.is(copiedDatum) && MeasurerScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (DateRangeProperties.is(datum) && MeasurerScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new DateRangeStateMachine({ ...ctx, create: createDatum("date-range" /* DateRange */) }), dragState: (ctx) => new DragStateMachine(ctx) }; var priceRangeConfig = { type: "price-range" /* PriceRange */, datum: PriceRangeProperties, scene: MeasurerScene, isDatum: PriceRangeProperties.is, translate: (node, datum, translation, context) => { if (PriceRangeProperties.is(datum) && MeasurerScene.is(node)) { node.translate(datum, translation, context); } }, copy: (node, datum, copiedDatum, context) => { if (PriceRangeProperties.is(datum) && PriceRangeProperties.is(copiedDatum) && MeasurerScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (PriceRangeProperties.is(datum) && MeasurerScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new PriceRangeStateMachine({ ...ctx, create: createDatum("date-range" /* DateRange */) }), dragState: (ctx) => new DragStateMachine(ctx) }; var datePriceRangeConfig = { type: "date-price-range" /* DatePriceRange */, datum: DatePriceRangeProperties, scene: MeasurerScene, isDatum: DatePriceRangeProperties.is, translate: (node, datum, translation, context) => { if (DatePriceRangeProperties.is(datum) && MeasurerScene.is(node)) { node.translate(datum, translation, context); } }, copy: (node, datum, copiedDatum, context) => { if (DatePriceRangeProperties.is(datum) && DatePriceRangeProperties.is(copiedDatum) && MeasurerScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (DatePriceRangeProperties.is(datum) && MeasurerScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new DatePriceRangeStateMachine({ ...ctx, create: createDatum("date-range" /* DateRange */) }), dragState: (ctx) => new DragStateMachine(ctx) }; var quickDatePriceRangeConfig = { type: "quick-date-price-range" /* QuickDatePriceRange */, datum: QuickDatePriceRangeProperties, scene: QuickMeasurerScene, isDatum: QuickDatePriceRangeProperties.is, translate: (node, datum, translation, context) => { if (QuickDatePriceRangeProperties.is(datum) && QuickMeasurerScene.is(node)) { node.translate(datum, translation, context); } }, copy: (node, datum, copiedDatum, context) => { if (QuickDatePriceRangeProperties.is(datum) && QuickDatePriceRangeProperties.is(copiedDatum) && QuickMeasurerScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (QuickDatePriceRangeProperties.is(datum) && QuickMeasurerScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new QuickDatePriceRangeStateMachine({ ...ctx, create: createDatum("quick-date-price-range" /* QuickDatePriceRange */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/note/noteScene.ts var import_ag_charts_community61 = require("ag-charts-community"); var import_ag_charts_core78 = require("ag-charts-core"); var NoteScene = class extends TextualPointScene { constructor() { super(); this.type = "note" /* Note */; this.shape = new import_ag_charts_community61._ModuleSupport.Rect(); this.iconBackground = new import_ag_charts_community61._ModuleSupport.TranslatableSvgPath( "M22 1.83333C22 0.820811 21.1792 0 20.1667 0H1.83333C0.820811 0 0 0.82081 0 1.83333V13.9868C0 14.9994 0.820811 15.8202 1.83333 15.8202L5.88971 15.8202C6.44575 15.8202 6.97175 16.0725 7.31971 16.5062L9.57006 19.3112C10.304 20.2259 11.6962 20.2259 12.4301 19.3112L14.6804 16.5062C15.0284 16.0725 15.5544 15.8202 16.1104 15.8202L20.1667 15.8202C21.1792 15.8202 22 14.9994 22 13.9868V1.83333Z" ); this.iconLines = new import_ag_charts_community61._ModuleSupport.TranslatableSvgPath( "M17.1114 5.75C17.1114 6.16421 16.7756 6.5 16.3614 6.5H5.63916C5.22495 6.5 4.88916 6.16421 4.88916 5.75V5.75C4.88916 5.33579 5.22495 5 5.63916 5H16.3614C16.7756 5 17.1114 5.33579 17.1114 5.75V5.75ZM17.1114 9.25C17.1114 9.66421 16.7756 10 16.3614 10H5.63916C5.22495 10 4.88916 9.66421 4.88916 9.25V9.25C4.88916 8.83579 5.22495 8.5 5.63916 8.5H16.3614C16.7756 8.5 17.1114 8.83579 17.1114 9.25V9.25Z" ); this.active = false; this.shape.visible = false; this.label.visible = false; this.iconBackground.fillShadow = new import_ag_charts_community61._ModuleSupport.DropShadow(); this.append([this.shape, this.label, this.iconBackground, this.iconLines, this.handle]); } static is(value) { return AnnotationScene.isCheck(value, "note" /* Note */); } update(datum, context) { this.updateIcon(datum, context); super.update(datum, context); } getTextBBox(datum, coords, context) { const bbox = super.getTextBBox(datum, coords, context); bbox.x -= datum.width / 2; bbox.x = (0, import_ag_charts_core78.clamp)(0, bbox.x, context.seriesRect.width - datum.width); const padding2 = datum.getPadding().top; const topY = bbox.y - LABEL_OFFSET - padding2 * 2; const bottomY = bbox.y + DivariantHandle.HANDLE_SIZE + padding2 * 2; if (topY - bbox.height - TOOLBAR_OFFSET < 0) { bbox.y = bottomY; datum.position = "top"; } else { bbox.y = topY + padding2; datum.position = "bottom"; } return bbox; } updateLabel(datum, bbox) { const labelVisibility = datum.visible === false ? false : this.label.visible; super.updateLabel(datum, bbox); this.label.visible = labelVisibility; this.label.text = (0, import_ag_charts_core78.wrapText)(datum.text, { maxWidth: 200, font: datum, textWrap: "always", avoidOrphans: false }); } updateShape(datum, bbox) { const { shape } = this; shape.fill = datum.background.fill; shape.fillOpacity = datum.background.fillOpacity ?? 1; shape.stroke = datum.background.stroke; shape.strokeOpacity = datum.background.strokeOpacity ?? 1; shape.strokeWidth = datum.background.strokeWidth ?? 1; shape.cornerRadius = 4; const padding2 = datum.getPadding().top; const isPositionTop = datum.position === "top"; shape.x = bbox.x - padding2; shape.width = datum.width + padding2 * 2; shape.height = bbox.height + padding2 * 2; shape.y = bbox.y + (isPositionTop ? 0 : -bbox.height) - padding2; } updateIcon(datum, context) { const { active, iconBackground, iconLines } = this; const { x, y } = convertPoint(datum, context); iconBackground.translationX = x - ICON_WIDTH / 2; iconBackground.translationY = y - ICON_HEIGHT; iconLines.translationX = iconBackground.translationX; iconLines.translationY = iconBackground.translationY; iconBackground.fill = datum.fill; iconBackground.fillOpacity = datum.fillOpacity ?? 1; iconBackground.stroke = datum.stroke; iconBackground.strokeOpacity = datum.strokeOpacity ?? 1; iconBackground.strokeWidth = datum.strokeWidth ?? 1; iconLines.fill = datum.stroke; if (active) { iconBackground.fillShadow.color = datum.fill ?? "rgba(0, 0, 0, 0.22)"; } else { iconBackground.fillShadow.color = "rgba(0, 0, 0, 0.22)"; } } updateAnchor(datum, bbox, context) { const padding2 = datum.getPadding().top; const isPositionTop = datum.position === "top"; const direction = isPositionTop ? 1 : -1; return { x: bbox.x + context.seriesRect.x + datum.width / 2, y: bbox.y + context.seriesRect.y + direction * (bbox.height + padding2), position: isPositionTop ? "below" : "above" }; } getLabelCoords(datum, bbox) { const isPositionTop = datum.position === "top"; const padding2 = datum.getPadding().top + (0, import_ag_charts_core78.calcLineHeight)(datum.fontSize, ANNOTATION_TEXT_LINE_HEIGHT) / 2; return { x: bbox.x, y: bbox.y + (isPositionTop ? padding2 / 2 : 0) }; } getTextBaseline(datum) { return datum.position === "top" ? "middle" : datum.position; } getHandleCoords(_datum, coords, _bbox) { return { x: coords.x, y: coords.y + DivariantHandle.HANDLE_SIZE / 2 + 4 }; } getHandleStyles(datum) { return { fill: datum.handle.fill, stroke: datum.handle.stroke ?? datum.fill, strokeOpacity: datum.handle.strokeOpacity, strokeWidth: datum.handle.strokeWidth }; } toggleHovered(hovered, active, readOnly) { super.toggleHovered(hovered, active, readOnly); const visible = hovered || active && !readOnly; this.label.visible = visible; this.shape.visible = visible; this.zIndex = visible ? import_ag_charts_core78.ZIndexMap.CHART_ANNOTATION_FOCUSED : import_ag_charts_core78.ZIndexMap.CHART_ANNOTATION; } toggleActive(active) { super.toggleActive(active); this.label.visible = active; this.shape.visible = active; this.active = active; } containsPoint(x, y) { if (this.shape.visible && this.shape.containsPoint(x, y)) return true; if (this.iconBackground.containsPoint(x, y)) return true; return super.containsPoint(x, y); } }; // packages/ag-charts-enterprise/src/features/annotations/note/noteState.ts var NoteStateMachine = class extends TextualPointStateMachine { createDatum() { return new NoteProperties(); } }; // packages/ag-charts-enterprise/src/features/annotations/note/noteConfig.ts var noteConfig = { type: "note" /* Note */, datum: NoteProperties, scene: NoteScene, isDatum: NoteProperties.is, translate: (node, datum, transition, context) => { if (NoteProperties.is(datum) && NoteScene.is(node)) node.translate(datum, transition, context); }, copy: (node, datum, copiedDatum, context) => { if (NoteProperties.is(datum) && NoteProperties.is(copiedDatum) && NoteScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (NoteProperties.is(datum) && NoteScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new NoteStateMachine({ ...ctx, create: createDatum("note" /* Note */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/parallel-channel/parallelChannelScene.ts var import_ag_charts_core79 = require("ag-charts-core"); var ParallelChannelScene = class extends ChannelScene { constructor() { super(); this.type = "parallel-channel"; this.handles = { topLeft: new DivariantHandle(), topMiddle: new UnivariantHandle(), topRight: new DivariantHandle(), bottomLeft: new DivariantHandle(), bottomMiddle: new UnivariantHandle(), bottomRight: new DivariantHandle() }; this.middleLine = new CollidableLine(); this.append([this.background, this.topLine, this.middleLine, this.bottomLine, ...Object.values(this.handles)]); } static is(value) { return AnnotationScene.isCheck(value, "parallel-channel"); } dragHandle(datum, target, context, snapping) { const { activeHandle, handles } = this; if (activeHandle == null) return; const { offset } = handles[activeHandle].drag(target); handles[activeHandle].toggleDragging(true); if (activeHandle === "topMiddle" || activeHandle === "bottomMiddle") { offset.x = 0; } let translateVectors = []; let allowSnapping = snapping; switch (activeHandle) { case "topLeft": case "bottomLeft": translateVectors = ["topLeft", "bottomLeft"]; break; case "topMiddle": translateVectors = ["topLeft", "topRight"]; offset.y -= UnivariantHandle.HANDLE_SIZE / 2; allowSnapping = false; break; case "topRight": case "bottomRight": translateVectors = ["topRight", "bottomRight"]; break; case "bottomMiddle": translateVectors = ["bottomLeft", "bottomRight"]; offset.y -= UnivariantHandle.HANDLE_SIZE / 2; allowSnapping = false; break; } const top = convertLine(datum, context); const bottom = convertLine(datum.bottom, context); if (!top || !bottom) return; const vectors = { topLeft: import_ag_charts_core79.Vec4.start(top), topRight: import_ag_charts_core79.Vec4.end(top), bottomLeft: import_ag_charts_core79.Vec4.start(bottom), bottomRight: import_ag_charts_core79.Vec4.end(bottom) }; const snap = { vectors: { topLeft: vectors.topRight, bottomLeft: vectors.bottomRight, topRight: vectors.topLeft, bottomRight: vectors.bottomLeft }, angle: datum.snapToAngle }; const points = translate(vectors, offset, context, { overflowContinuous: this.overflowContinuous, translateVectors, snap: allowSnapping ? snap : void 0 }); datum.start.x = points.topLeft.x; datum.start.y = points.topLeft.y; datum.end.x = points.topRight.x; datum.end.y = points.topRight.y; datum.height = points.topLeft.y - points.bottomLeft.y; } getTranslatePointsVectors(start, end) { const { bottomLeft, topLeft } = this.handles; const height = bottomLeft.getBBox().y - topLeft.getBBox().y; const bottomStart = import_ag_charts_core79.Vec2.add(start, import_ag_charts_core79.Vec2.from(0, height)); const bottomEnd = import_ag_charts_core79.Vec2.add(end, import_ag_charts_core79.Vec2.from(0, height)); return { start, end, bottomStart, bottomEnd }; } containsPoint(x, y) { return super.containsPoint(x, y) || this.middleLine.visible && this.middleLine.strokeWidth > 0 && this.middleLine.containsPoint(x, y); } getNodeAtCoords(x, y) { if (this.middleLine.visible && this.middleLine.strokeWidth > 0 && this.middleLine.containsPoint(x, y)) return "line"; return super.getNodeAtCoords(x, y); } updateLines(datum, top, bottom, context, naturalTop, naturalBottom) { const { topLine, middleLine, bottomLine } = this; const { lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth } = datum; const lineDash = datum.getLineDash(); const lineStyles = { lineCap: datum.getLineCap(), lineDash, lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth }; topLine.setProperties({ ...top, ...lineStyles }); bottomLine.setProperties({ ...bottom, ...lineStyles }); const middlePoints = this.extendLine( { x1: naturalTop.x1, y1: naturalBottom.y1 + (naturalTop.y1 - naturalBottom.y1) / 2, x2: naturalTop.x2, y2: naturalBottom.y2 + (naturalTop.y2 - naturalBottom.y2) / 2 }, datum, context ); middleLine.setProperties({ ...middlePoints, lineDash: datum.middle.lineDash ?? lineDash, lineDashOffset: datum.middle.lineDashOffset ?? lineDashOffset, stroke: datum.middle.stroke ?? stroke3, strokeOpacity: datum.middle.strokeOpacity ?? strokeOpacity, strokeWidth: datum.middle.strokeWidth ?? strokeWidth, visible: datum.middle.visible ?? true }); } updateHandles(datum, top, bottom) { const { handles: { topLeft, topMiddle, topRight, bottomLeft, bottomMiddle, bottomRight } } = this; const handleStyles = { fill: datum.handle.fill, stroke: datum.handle.stroke ?? datum.stroke, strokeOpacity: datum.handle.strokeOpacity ?? datum.strokeOpacity, strokeWidth: datum.handle.strokeWidth ?? datum.strokeWidth }; topLeft.update({ ...handleStyles, ...import_ag_charts_core79.Vec4.start(top) }); topRight.update({ ...handleStyles, ...import_ag_charts_core79.Vec4.end(top) }); bottomLeft.update({ ...handleStyles, ...import_ag_charts_core79.Vec4.start(bottom) }); bottomRight.update({ ...handleStyles, ...import_ag_charts_core79.Vec4.end(bottom) }); topMiddle.update({ ...handleStyles, ...import_ag_charts_core79.Vec2.sub(import_ag_charts_core79.Vec4.center(top), import_ag_charts_core79.Vec2.from(topMiddle.handle.width / 2, topMiddle.handle.height / 2)) }); bottomMiddle.update({ ...handleStyles, ...import_ag_charts_core79.Vec2.sub(import_ag_charts_core79.Vec4.center(bottom), import_ag_charts_core79.Vec2.from(bottomMiddle.handle.width / 2, bottomMiddle.handle.height / 2)) }); } updateText(datum, top, bottom) { this.text = this.updateNode(CollidableText, this.text, !!datum.text.label); updateChannelText(true, top, bottom, datum.text, datum.strokeWidth, this.text, datum.text.label); } getBackgroundPoints(datum, top, bottom, bounds) { const isFlippedX = top.x1 > top.x2; const isFlippedY = top.y1 > top.y2; const outOfBoundsStart = top.x1 !== bottom.x1 && top.y1 !== bottom.y1; const outOfBoundsEnd = top.x2 !== bottom.x2 && top.y2 !== bottom.y2; const points = import_ag_charts_core79.Vec2.from(top); if (datum.extendEnd && outOfBoundsEnd) { points.push(import_ag_charts_core79.Vec2.from(isFlippedX ? bounds.x1 : bounds.x2, isFlippedY ? bounds.y1 : bounds.y2)); } points.push(...import_ag_charts_core79.Vec2.from(bottom).reverse()); if (datum.extendStart && outOfBoundsStart) { points.push(import_ag_charts_core79.Vec2.from(isFlippedX ? bounds.x2 : bounds.x1, isFlippedY ? bounds.y2 : bounds.y1)); } return points; } }; // packages/ag-charts-enterprise/src/features/annotations/parallel-channel/parallelChannelState.ts var import_ag_charts_core80 = require("ag-charts-core"); var ParallelChannelStateMachine = class extends import_ag_charts_core80.StateMachine { constructor(ctx) { const actionCreate = ({ point }) => { const datum = new ParallelChannelProperties(); datum.set({ start: point, end: point, height: 0 }); ctx.create(datum); }; const actionFirstRender = () => { const { node } = this; node?.toggleActive(true); node?.toggleHandles({ topLeft: true, topMiddle: false, topRight: false, bottomLeft: false, bottomMiddle: false, bottomRight: false }); }; const actionEndUpdate = ({ offset, context }) => { const { datum, snapping } = this; if (!datum) return; datum.set({ end: snapPoint(offset, context, snapping, datum.start, datum.snapToAngle) }); ctx.update(); }; const actionEndFinish = () => { this.node?.toggleHandles({ topRight: true }); ctx.update(); }; const actionHeightUpdate = ({ point }) => { const { datum, node } = this; const endY = getGroupingValue(datum?.end.y); const startY = getGroupingValue(datum?.start.y); const { y: pointY } = point; if (datum == null || !(0, import_ag_charts_core80.isNumber)(startY) || !(0, import_ag_charts_core80.isNumber)(endY) || !(0, import_ag_charts_core80.isNumber)(pointY)) return; const height = endY - (pointY ?? 0); const bottomStartY = startY - height; node?.toggleHandles({ bottomLeft: true, bottomRight: true }); if (!ctx.validatePoint({ x: datum.start.x, y: bottomStartY }, { overflowContinuous: true }) || !ctx.validatePoint({ x: datum.end.x, y: point.y }, { overflowContinuous: true })) { return; } datum.set({ height }); ctx.update(); }; const actionHeightFinish = ({ point }) => { const { datum, node } = this; const endY = getGroupingValue(datum?.end.y); const startY = getGroupingValue(datum?.start.y); const { y: pointY } = point; if (datum == null || !(0, import_ag_charts_core80.isNumber)(startY) || !(0, import_ag_charts_core80.isNumber)(endY) || !(0, import_ag_charts_core80.isNumber)(pointY)) return; const height = endY - (pointY ?? 0); const bottomStartY = startY - height; node?.toggleHandles(true); if (!ctx.validatePoint({ x: datum.start.x, y: bottomStartY }, { overflowContinuous: true }) || !ctx.validatePoint({ x: datum.end.x, y: point.y }, { overflowContinuous: true })) { return; } datum.set({ height }); ctx.recordAction(`Create ${"parallel-channel" /* ParallelChannel */} annotation`); ctx.showAnnotationOptions(); ctx.update(); }; const actionCancel = () => ctx.delete(); super("start", { start: { click: { target: "waiting-first-render", action: actionCreate }, drag: { target: "waiting-first-render", action: actionCreate }, reset: import_ag_charts_core80.StateMachine.parent }, "waiting-first-render": { render: { target: "end", action: actionFirstRender } }, end: { hover: actionEndUpdate, drag: actionEndUpdate, click: { target: "height", action: actionEndFinish }, dragEnd: { target: "height", action: actionEndFinish }, reset: { target: import_ag_charts_core80.StateMachine.parent, action: actionCancel }, cancel: { target: import_ag_charts_core80.StateMachine.parent, action: actionCancel } }, height: { hover: actionHeightUpdate, click: { target: import_ag_charts_core80.StateMachine.parent, action: actionHeightFinish }, drag: { target: import_ag_charts_core80.StateMachine.parent, action: actionHeightFinish }, reset: { target: import_ag_charts_core80.StateMachine.parent, action: actionCancel }, cancel: { target: import_ag_charts_core80.StateMachine.parent, action: actionCancel } } }); this.debug = import_ag_charts_core80.Debug.create(true, "annotations"); this.snapping = false; } }; __decorateClass([ (0, import_ag_charts_core80.StateMachineProperty)() ], ParallelChannelStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core80.StateMachineProperty)() ], ParallelChannelStateMachine.prototype, "node", 2); __decorateClass([ (0, import_ag_charts_core80.StateMachineProperty)() ], ParallelChannelStateMachine.prototype, "snapping", 2); // packages/ag-charts-enterprise/src/features/annotations/parallel-channel/parallelChannelConfig.ts var parallelChannelConfig = { type: "parallel-channel" /* ParallelChannel */, datum: ParallelChannelProperties, scene: ParallelChannelScene, isDatum: ParallelChannelProperties.is, translate: (node, datum, transition, context) => { if (ParallelChannelProperties.is(datum) && ParallelChannelScene.is(node)) { node.translate(datum, transition, context); } }, copy: (node, datum, copiedDatum, context) => { if (ParallelChannelProperties.is(datum) && ParallelChannelProperties.is(copiedDatum) && ParallelChannelScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (ParallelChannelProperties.is(datum) && ParallelChannelScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new ParallelChannelStateMachine({ ...ctx, create: createDatum("parallel-channel" /* ParallelChannel */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/text/textScene.ts var TextScene = class extends TextualPointScene { constructor() { super(); this.type = "text" /* Text */; this.append([this.label, this.handle]); } static is(value) { return AnnotationScene.isCheck(value, "text" /* Text */); } getHandleCoords(_datum, point) { const halfSize = DivariantHandle.HANDLE_SIZE / 2; return { x: point.x + halfSize, y: point.y + 2 + halfSize }; } }; // packages/ag-charts-enterprise/src/features/annotations/text/textState.ts var TextStateMachine = class extends TextualPointStateMachine { createDatum() { return new TextProperties(); } }; // packages/ag-charts-enterprise/src/features/annotations/text/textConfig.ts var textConfig = { type: "text" /* Text */, datum: TextProperties, scene: TextScene, isDatum: TextProperties.is, translate: (node, datum, transition, context) => { if (TextProperties.is(datum) && TextScene.is(node)) node.translate(datum, transition, context); }, copy: (node, datum, copiedDatum, context) => { if (TextProperties.is(datum) && TextProperties.is(copiedDatum) && TextScene.is(node)) { return node.copy(datum, copiedDatum, context); } }, update: (node, datum, context) => { if (TextProperties.is(datum) && TextScene.is(node)) { node.update(datum, context); } }, createState: (ctx, { createDatum }) => new TextStateMachine({ ...ctx, create: createDatum("text" /* Text */) }), dragState: (ctx) => new DragStateMachine(ctx) }; // packages/ag-charts-enterprise/src/features/annotations/annotationsConfig.ts var annotationConfigs = { // Lines [lineConfig.type]: lineConfig, [horizontalLineConfig.type]: horizontalLineConfig, [verticalLineConfig.type]: verticalLineConfig, // Channels [parallelChannelConfig.type]: parallelChannelConfig, [disjointChannelConfig.type]: disjointChannelConfig, // Fibonaccis [fibonacciRetracementConfig.type]: fibonacciRetracementConfig, [fibonacciRetracementTrendBasedConfig.type]: fibonacciRetracementTrendBasedConfig, // Texts [calloutConfig.type]: calloutConfig, [commentConfig.type]: commentConfig, [noteConfig.type]: noteConfig, [textConfig.type]: textConfig, // Shapes [arrowConfig.type]: arrowConfig, [arrowUpConfig.type]: arrowUpConfig, [arrowDownConfig.type]: arrowDownConfig, // Measurers [dateRangeConfig.type]: dateRangeConfig, [priceRangeConfig.type]: priceRangeConfig, [datePriceRangeConfig.type]: datePriceRangeConfig, [quickDatePriceRangeConfig.type]: quickDatePriceRangeConfig }; function getTypedDatum(datum) { for (const { isDatum } of Object.values(annotationConfigs)) { if (isDatum(datum)) { return datum; } } } // packages/ag-charts-enterprise/src/features/annotations/annotationsStateMachine.ts var import_ag_charts_community62 = require("ag-charts-community"); var import_ag_charts_core81 = require("ag-charts-core"); var AnnotationsStateMachine = class extends import_ag_charts_core81.ParallelStateMachine { constructor(ctx) { super( new SnappingStateMachine((snapping) => { this.snapping = snapping; }), new UpdateMachine(() => { this.node = this.active == null ? void 0 : ctx.node(this.active); }), new AnnotationsMainStateMachine(ctx, (index) => { this.active = index; this.datum = this.active == null ? void 0 : ctx.datum(this.active); this.node = this.active == null ? void 0 : ctx.node(this.active); }) ); this.snapping = false; } // TODO: remove this leak getActive() { return this.active; } // TODO: remove this leak isActive(index) { return index === this.active; } }; __decorateClass([ (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsStateMachine.prototype, "snapping", 2); __decorateClass([ (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsStateMachine.prototype, "node", 2); var SnappingStateMachine = class extends import_ag_charts_core81.StateMachine { constructor(setSnapping) { super("idle" /* Idle */, { ["idle" /* Idle */]: { hover: ({ shiftKey }) => setSnapping(shiftKey), keyDown: ({ shiftKey }) => setSnapping(shiftKey), keyUp: ({ shiftKey }) => setSnapping(shiftKey), click: ({ shiftKey }) => setSnapping(shiftKey), drag: ({ shiftKey }) => setSnapping(shiftKey) }, ["dragging" /* Dragging */]: {}, ["translating" /* Translating */]: {}, ["text-input" /* TextInput */]: {} }); } }; var UpdateMachine = class extends import_ag_charts_core81.StateMachine { constructor(update) { super("idle" /* Idle */, { ["idle" /* Idle */]: { onEnter: update, render: update }, ["dragging" /* Dragging */]: { onEnter: update, render: update }, ["translating" /* Translating */]: { onEnter: update, render: update }, ["text-input" /* TextInput */]: { render: update } }); } }; var AnnotationsMainStateMachine = class extends import_ag_charts_core81.StateMachine { constructor(ctx, setActive) { const createDatum = (type) => (datum) => { ctx.create(type, datum); this.active = ctx.selectLast(); }; const deleteDatum = () => { if (this.active != null) ctx.delete(this.active); this.active = void 0; ctx.select(); }; const stateMachineHelpers = { createDatum }; const createStateMachineContext = { ...ctx, delete: deleteDatum, showTextInput: () => { if (this.active != null) ctx.showTextInput(this.active); }, deselect: () => { const prevActive = this.active; this.active = void 0; this.hovered = void 0; ctx.select(this.active, prevActive); }, showAnnotationOptions: () => { if (this.active != null) ctx.showAnnotationOptions(this.active); } }; const createStateMachines = Object.fromEntries( Object.entries(annotationConfigs).map(([type, config]) => [ type, config.createState(createStateMachineContext, stateMachineHelpers) ]) ); const dragStateMachines = Object.fromEntries( Object.entries(annotationConfigs).map(([type, config]) => [ type, config.dragState(ctx, stateMachineHelpers) ]) ); const actionColor = ({ colorPickerType, colorOpacity, color: color7, opacity, isMultiColor }) => { if (!this.datum) return; if (colorPickerType === "text-color") { ctx.updateTextInputColor(color7); } setColor(this.datum, colorPickerType, colorOpacity, color7, opacity, isMultiColor); ctx.update(); }; const actionFontSize = (fontSize) => { const { datum, node } = this; if (!datum || !node) return; if (isTextType(datum)) { datum.fontSize = fontSize; ctx.updateTextInputFontSize(fontSize); } else if (hasLineText(datum)) { datum.text.fontSize = fontSize; } ctx.update(); }; const actionLineStyle = (lineStyle) => { const { datum, node } = this; if (!datum || !node || !hasLineStyle(datum)) return; setLineStyle(datum, lineStyle); ctx.update(); }; const actionUpdateTextInputBBox = (bbox) => { const { node } = this; if (!node || !("setTextInputBBox" in node)) return; node.setTextInputBBox(bbox); ctx.update(); }; const actionSaveText = ({ textInputValue, bbox }) => { const { datum } = this; if (bbox != null && textInputValue != null && textInputValue.length > 0) { if (!isTextType(datum)) { return; } const wrappedText = maybeWrapText(datum, textInputValue, bbox.width); datum.set({ text: wrappedText }); ctx.update(); ctx.recordAction(`Change ${datum.type} annotation text`); } else { ctx.delete(this.active); ctx.recordAction(`Delete ${datum?.type} annotation`); } }; const actionCancel = () => { ctx.updateTextInputBBox(void 0); }; const guardActive = () => this.active != null; const guardCopied = () => this.copied != null; const guardActiveHasLineText = () => { const { active, datum } = this; if (active == null) return false; if (!datum) return false; return hasLineText(datum) && datum.isWriteable(); }; const guardActiveNotEphemeral = () => this.active != null && !isEphemeralType(this.datum); const guardHovered = () => this.hovered != null; super("idle" /* Idle */, { ["idle" /* Idle */]: { onEnter: () => { ctx.select(this.active, this.active); if (this.hoverCoords) { this.hovered = ctx.hoverAtCoords(this.hoverCoords, this.active, this.hovered); } }, hover: ({ offset }) => { this.hovered = ctx.hoverAtCoords(offset, this.active, this.hovered); this.hoverCoords = offset; }, translate: { guard: guardActive, target: "translating" /* Translating */, action: ({ translation }) => { ctx.startInteracting(); ctx.translate(this.active, translation); ctx.update(); } }, copy: { guard: guardActiveNotEphemeral, action: () => { this.copied = ctx.copy(this.active); } }, cut: { guard: guardActiveNotEphemeral, action: () => { this.copied = ctx.copy(this.active); deleteDatum(); } }, paste: { guard: guardCopied, action: () => { ctx.paste(this.copied); } }, selectLast: () => { const previousActive = this.active; this.active = ctx.selectLast(); ctx.select(this.active, previousActive); }, click: [ { guard: () => { const { active, hovered, datum } = this; if (active == null || hovered !== active) return false; if (!datum) return false; return isTextType(datum) && datum.isWriteable(); }, target: "text-input" /* TextInput */ }, { action: () => { const prevActive = this.active; this.active = this.hovered; ctx.select(this.active, prevActive); } } ], dblclick: { guard: guardActiveHasLineText, action: ({ offset }) => { const nodeAtCoords = ctx.getNodeAtCoords(offset, this.active) === "text" ? "text" : "line"; ctx.showAnnotationSettings(this.active, void 0, nodeAtCoords); } }, dragStart: [ { guard: guardHovered, target: "dragging" /* Dragging */, action: () => { const prevActive = this.active; this.active = this.hovered; ctx.select(this.active, prevActive); ctx.startInteracting(); } }, { action: () => { const prevActive = this.active; this.active = this.hovered; ctx.select(this.active, prevActive); } } ], color: { guard: guardActive, action: actionColor }, fontSize: { guard: guardActive, action: actionFontSize }, lineProps: { guard: guardActive, action: (props) => { const datum = getTypedDatum(this.datum); datum?.set(props); ctx.update(); ctx.recordAction( `Change ${datum?.type} ${Object.entries(props).map(([key, value]) => `${key} to ${value}`).join(", ")}` ); } }, lineStyle: { guard: guardActive, action: actionLineStyle }, lineText: { guard: guardActive, action: (props) => { const datum = getTypedDatum(this.datum); if (!hasLineText(datum)) return; if (isChannelType(datum) && props.position === "center") { props.position = "inside"; } datum.text.set(props); ctx.update(); } }, updateTextInputBBox: { guard: guardActive, action: actionUpdateTextInputBBox }, toolbarPressSettings: { guard: guardActiveHasLineText, action: (sourceEvent) => { ctx.showAnnotationSettings(this.active, sourceEvent); } }, reset: () => { if (this.active != null) { this.node?.toggleActive(false); } this.hovered = void 0; this.active = void 0; ctx.select(this.active, this.active); ctx.resetToIdle(); }, delete: () => { if (this.active == null) return; ctx.delete(this.active); if (isEphemeralType(this.datum)) return; ctx.recordAction(`Delete ${this.datum?.type} annotation`); }, deleteAll: () => { ctx.deleteAll(); }, ...createStateMachines }, ["dragging" /* Dragging */]: { onEnter: (_, data) => { if (this.active == null) return; const type = ctx.getAnnotationType(this.active); if (!type) return; this.transitionRoot(type); this.transitionRoot("dragStart", data); }, ...dragStateMachines }, ["translating" /* Translating */]: { onEnter: () => { }, translate: { guard: guardActive, target: "translating" /* Translating */, action: ({ translation }) => { ctx.startInteracting(); ctx.translate(this.active, translation); ctx.update(); } }, translateEnd: { guard: guardActive, target: "idle" /* Idle */ }, onExit: () => { ctx.stopInteracting(); ctx.update(); ctx.recordAction("Translate annotation"); } }, ["text-input" /* TextInput */]: { onEnter: () => { if (this.active == null) return; const datum = getTypedDatum(this.datum); if (!datum || !("getTextInputCoords" in datum)) return; ctx.startInteracting(); ctx.showTextInput(this.active); datum.visible = false; ctx.update(); }, updateTextInputBBox: { guard: guardActive, action: actionUpdateTextInputBBox }, resize: { target: "idle" /* Idle */, action: actionSaveText }, click: { target: "idle" /* Idle */, action: actionSaveText }, drag: { target: "idle" /* Idle */, action: actionSaveText }, textInput: [ { guard: guardCancelAndExit, target: "idle" /* Idle */, action: actionCancel }, { guard: guardSaveAndExit, target: "idle" /* Idle */, action: actionSaveText } ], color: { guard: guardActive, action: actionColor }, fontSize: { guard: guardActive, action: actionFontSize }, cancel: { target: "idle" /* Idle */, action: actionCancel }, onExit: () => { ctx.stopInteracting(); ctx.hideTextInput(); const wasActive = this.active; this.active = this.hovered = void 0; ctx.select(this.active, wasActive); if (wasActive == null) return; const datum = ctx.datum(wasActive); const node = ctx.node(wasActive); if (!datum || !node) return; datum.visible = true; } } }); this.setActive = setActive; this.debug = import_ag_charts_core81.Debug.create(true, "annotations"); this.snapping = false; } }; __decorateClass([ (0, import_ag_charts_core81.ActionOnSet)({ changeValue(newValue) { this.setActive(newValue); } }), (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsMainStateMachine.prototype, "active", 2); __decorateClass([ (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsMainStateMachine.prototype, "hovered", 2); __decorateClass([ (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsMainStateMachine.prototype, "hoverCoords", 2); __decorateClass([ (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsMainStateMachine.prototype, "copied", 2); __decorateClass([ (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsMainStateMachine.prototype, "snapping", 2); __decorateClass([ (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsMainStateMachine.prototype, "datum", 2); __decorateClass([ (0, import_ag_charts_core81.StateMachineProperty)() ], AnnotationsMainStateMachine.prototype, "node", 2); // packages/ag-charts-enterprise/src/features/annotations/annotationsToolbar.ts var import_ag_charts_community63 = require("ag-charts-community"); var import_ag_charts_core82 = require("ag-charts-core"); var { LayoutElement, Menu: Menu2 } = import_ag_charts_community63._ModuleSupport; var AnnotationsToolbarButtonProperties = class extends ToolbarButtonProperties { }; __decorateClass([ import_ag_charts_core82.Property ], AnnotationsToolbarButtonProperties.prototype, "value", 2); var AnnotationsToolbar = class extends import_ag_charts_core82.BaseProperties { constructor(ctx) { super(); this.ctx = ctx; this.enabled = true; this.padding = 20; this.buttons = new import_ag_charts_core82.PropertiesArray(AnnotationsToolbarButtonProperties); this.events = new import_ag_charts_core82.EventEmitter(); this.annotationMenu = new Menu2(this.ctx, "annotations"); this.cleanup = new import_ag_charts_core82.CleanupRegistry(); this.toolbar = ctx.sharedToolbar.getSharedToolbar("annotations"); const onKeyDown = this.onKeyDown.bind(this); this.toolbar.addListener("keydown", onKeyDown); this.cleanup.register( this.toolbar.addToolbarListener("button-pressed", this.onToolbarButtonPress.bind(this)), ctx.layoutManager.registerElement(LayoutElement.ToolbarLeft, this.onLayoutStart.bind(this)), () => { this.toolbar.removeListener("keydown", onKeyDown); this.toolbar.destroy(); } ); } destroy() { this.cleanup.flush(); } toggleClearButtonEnabled(enabled) { const index = this.buttons.findIndex((button) => button.value === "clear"); this.toolbar.toggleButtonEnabledByIndex(index, enabled); } resetButtonIcons() { for (const [index, button] of this.buttons.entries()) { switch (button.value) { case "line-menu": this.updateButtonByIndex(index, { icon: "trend-line-drawing", value: "line-menu" }); break; case "fibonacci-menu": this.updateButtonByIndex(index, { icon: "fibonacci-retracement-drawing", value: "fibonacci-menu" }); break; case "text-menu": this.updateButtonByIndex(index, { icon: "text-annotation", value: "text-menu" }); break; case "shape-menu": this.updateButtonByIndex(index, { icon: "arrow-drawing", value: "shape-menu" }); break; case "measurer-menu": this.updateButtonByIndex(index, { icon: "measurer-drawing", value: "measurer-menu" }); break; } } } hideOverlays() { this.annotationMenu.hide(); } clearActiveButton() { this.toolbar.clearActiveButton(); } onLayoutStart(ctx) { if (!this.enabled) return; this.toolbar.updateButtons(this.buttons); this.toolbar.layout(ctx.layoutBox, this.padding); } refreshButtonsEnabled(enabled) { for (const [index, button] of this.buttons.entries()) { if (!button) continue; this.toolbar.toggleButtonEnabledByIndex(index, enabled); } } onToolbarButtonPress({ event, button, buttonBounds, buttonWidget }) { const axisScale = this.ctx.axisManager.getAxisContext(import_ag_charts_core82.ChartAxisDirection.Y)[0].scale; switch (button.value) { case "clear": this.events.emit("pressed-clear", null); break; case "line-menu": this.onToolbarButtonPressShowMenu( event, buttonBounds, buttonWidget, button.value, "toolbarAnnotationsLineAnnotations", LINE_ANNOTATION_ITEMS.filter((item) => item.visible ? item.visible(axisScale) : true) ); break; case "fibonacci-menu": this.onToolbarButtonPressShowMenu( event, buttonBounds, buttonWidget, button.value, "toolbarAnnotationsFibonacciAnnotations", FIBONACCI_ANNOTATION_ITEMS ); break; case "text-menu": this.onToolbarButtonPressShowMenu( event, buttonBounds, buttonWidget, button.value, "toolbarAnnotationsTextAnnotations", TEXT_ANNOTATION_ITEMS ); break; case "shape-menu": this.onToolbarButtonPressShowMenu( event, buttonBounds, buttonWidget, button.value, "toolbarAnnotationsShapeAnnotations", SHAPE_ANNOTATION_ITEMS ); break; case "measurer-menu": this.onToolbarButtonPressShowMenu( event, buttonBounds, buttonWidget, button.value, "toolbarAnnotationsMeasurerAnnotations", MEASURER_ANNOTATION_ITEMS ); break; } } onToolbarButtonPressShowMenu(event, buttonBounds, controller, menu, ariaLabel, items) { this.events.emit("pressed-show-menu", null); const index = this.buttons.findIndex((button) => button.value === menu); this.toolbar.toggleActiveButtonByIndex(index); this.annotationMenu.setAnchor({ x: buttonBounds.x + buttonBounds.width + 6, y: buttonBounds.y }); this.annotationMenu.show(controller, { items, ariaLabel: this.ctx.localeManager.t(ariaLabel), class: "ag-charts-annotations__toolbar-menu", sourceEvent: event.sourceEvent, onPress: this.onButtonPressMenuCreateAnnotation.bind(this, menu) }); } onButtonPressMenuCreateAnnotation(menu, item) { const index = this.buttons.findIndex((button) => button.value === menu); this.updateButtonByIndex(index, { icon: item.icon }); this.events.emit("pressed-create-annotation", { annotation: item.value }); this.annotationMenu.hide(); } onKeyDown({ sourceEvent }) { if (sourceEvent.key === "Escape") { this.events.emit("cancel-create-annotation", null); } } updateButtonByIndex(index, change) { const button = this.buttons.at(index); if (!button) return; button.set({ ...button.toJson(), ...change, value: change.value ?? button.value }); this.toolbar.updateButtonByIndex(index, { ...button.toJson() }); } }; __decorateClass([ import_ag_charts_core82.Property, (0, import_ag_charts_core82.ActionOnSet)({ changeValue(enabled) { this.toolbar?.setHidden(!enabled); } }) ], AnnotationsToolbar.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core82.Property ], AnnotationsToolbar.prototype, "padding", 2); __decorateClass([ import_ag_charts_core82.Property ], AnnotationsToolbar.prototype, "buttons", 2); // packages/ag-charts-enterprise/src/features/annotations/axisButton.ts var import_ag_charts_community64 = require("ag-charts-community"); var import_ag_charts_core83 = require("ag-charts-core"); var { InteractionState } = import_ag_charts_community64._ModuleSupport; var DEFAULT_ANNOTATION_AXIS_BUTTON_CLASS = `ag-charts-annotations__axis-button`; var AxisButton = class extends import_ag_charts_core83.AbstractModuleInstance { constructor(ctx, axisCtx, onButtonClick, seriesRect) { super(); this.ctx = ctx; this.axisCtx = axisCtx; this.onButtonClick = onButtonClick; this.seriesRect = seriesRect; this.enabled = true; this.snap = false; this.padding = 0; this.button = this.setup(); this.toggleVisibility(false); this.updateButtonElement(); this.snap = Boolean(axisCtx.scale.bandwidth); ctx.domManager.addEventListener("focusin", ({ target }) => { const htmlTarget = target instanceof HTMLElement ? target : void 0; const isSeriesAreaChild = htmlTarget && ctx.domManager.contains(htmlTarget, "series-area"); if (!isSeriesAreaChild && htmlTarget !== this.button.getElement()) this.hide(); }); this.cleanup.register( ctx.widgets.seriesWidget.addListener("drag-move", (e) => this.onMouseDrag(e)), ctx.widgets.seriesWidget.addListener("mousemove", (e) => this.onMouseMove(e)), ctx.widgets.seriesWidget.addListener("mouseleave", () => this.onMouseLeave()), ctx.widgets.seriesDragInterpreter?.events.on("click", (e) => this.onClick(e)), ctx.eventsHub.on("series:focus-change", () => this.onKeyPress()), ctx.eventsHub.on("zoom:pan-start", () => this.hide()), ctx.eventsHub.on("zoom:change-complete", () => this.hide()), () => this.destroyElements(), () => this.button.destroy() ); } update(seriesRect, padding2) { this.seriesRect = seriesRect; this.padding = padding2; } setup() { const button = new import_ag_charts_community64._Widget.ButtonWidget(); button.addClass(DEFAULT_ANNOTATION_AXIS_BUTTON_CLASS); button.setTabIndex(-1); button.setAriaLabel(this.ctx.localeManager.t("ariaLabelAddHorizontalLine")); this.ctx.widgets.seriesWidget.getElement().appendChild(button.getElement()); return button; } destroyElements() { this.ctx.domManager.removeChild("canvas-overlay", DEFAULT_ANNOTATION_AXIS_BUTTON_CLASS); } onMouseMove(e) { if (this.ctx.interactionManager.isState(InteractionState.Clickable)) this.show(e); } onMouseDrag(e) { if (this.ctx.interactionManager.isState(InteractionState.AnnotationsMoveable)) this.show(e); } onMouseLeave() { if (this.ctx.interactionManager.isState(InteractionState.Clickable)) this.hide(); } onClick(e) { if (this.ctx.interactionManager.isState(InteractionState.Clickable) && e.device === "touch") this.show(e); } show(event) { const { sourceEvent, currentX: x, currentY: y } = event; if (!(this.enabled && this.ctx.widgets.seriesWidget.getElement().contains(sourceEvent.target))) { this.hide(); return; } this.toggleVisibility(true); const buttonCoords = this.getButtonCoordinates({ x, y }); this.coords = { x: buttonCoords.x + this.button.clientWidth / 2, y: buttonCoords.y + this.button.clientHeight / 2 }; this.updatePosition(buttonCoords); } hide() { this.toggleVisibility(false); } onKeyPress() { if (this.snap && this.ctx.interactionManager.isState(InteractionState.Default)) return; this.hide(); } getButtonCoordinates({ x, y }) { const { axisCtx: { direction, position }, seriesRect, snap, axisCtx, padding: padding2 } = this; const { clientWidth: buttonWidth, clientHeight: buttonHeight } = this.button; const [minY, maxY] = [0, seriesRect.height]; const [minX, maxX] = [0, seriesRect.width]; if (snap) { x = convert(invert(x - seriesRect.x, axisCtx), axisCtx) + seriesRect.x; y = convert(invert(y - seriesRect.y, axisCtx), axisCtx) + seriesRect.y; } if (direction === import_ag_charts_core83.ChartAxisDirection.X) { const crosshairLabelPadding = 5; const offset = buttonHeight - Math.max(0, padding2 - crosshairLabelPadding); x = x - buttonWidth / 2; y = position === "top" ? minY - buttonHeight + offset : maxY - offset; } else { const crosshairLabelPadding = 9; const offset = buttonWidth - Math.max(0, padding2 - crosshairLabelPadding); x = position === "left" ? minX - buttonWidth + offset : maxX - offset; y = y - buttonHeight / 2; } return { x, y }; } toggleVisibility(visible) { const { button } = this; if (button == null) return; const isVisible = this.enabled && visible; this.toggleClass("-hidden", !isVisible); } toggleClass(name, include) { this.button.toggleClass(`${DEFAULT_ANNOTATION_AXIS_BUTTON_CLASS}-${name}`, include); } updatePosition({ x, y }) { this.button.getElement().style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`; } updateButtonElement() { const { button } = this; button.addListener("click", () => this.onButtonClick(this.coords)); button.addListener("touchend", () => this.onButtonClick(this.coords)); button.addListener("drag-start", () => { }); button.setInnerHTML( `` ); } }; __decorateClass([ import_ag_charts_core83.Property ], AxisButton.prototype, "enabled", 2); // packages/ag-charts-enterprise/src/features/annotations/settings-dialog/settingsDialog.ts var import_ag_charts_community66 = require("ag-charts-community"); var import_ag_charts_core85 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/components/dialog/dialog.ts var import_ag_charts_community65 = require("ag-charts-community"); var import_ag_charts_core84 = require("ag-charts-core"); var { DraggablePopover, NativeWidget } = import_ag_charts_community65._ModuleSupport; var _Dialog = class _Dialog extends DraggablePopover { constructor(ctx, id) { super(ctx, id); this.dragHandleDraggingClass = "ag-charts-dialog__drag-handle--dragging"; this.colorPicker = new ColorPicker(this.ctx, { detached: true }); this.cleanup.register(ctx.eventsHub.on("layout:complete", this.onLayoutComplete.bind(this))); } showWithChildren(children, options) { const popover = super.showWithChildren(children, options); popover.classList.add("ag-charts-dialog"); popover.setAttribute("role", "dialog"); popover.addEventListener("mousedown", (event) => { if (event.target.classList?.contains("ag-charts-dialog__color-picker-button")) return; this.colorPicker.hide(); }); popover.addEventListener("keydown", this.onKeyDown.bind(this)); (0, import_ag_charts_core84.getWindow)().requestAnimationFrame(() => this.reposition()); this.colorPicker.attachTo(this); return popover; } updatePosition(position) { super.updatePosition(position); const { anchor, fallbackAnchor } = this.getColorPickerAnchors() ?? {}; if (!anchor) return; this.colorPicker.setAnchor(anchor, fallbackAnchor); } /************** * Containers * **************/ createTabs(tablistLabel, initial, tabs) { const element = (0, import_ag_charts_core84.createElement)("div", "ag-charts-dialog__tabs"); const tabButtonIds = (0, import_ag_charts_core84.mapValues)(tabs, () => (0, import_ag_charts_core84.createElementId)()); const tabPanelIds = (0, import_ag_charts_core84.mapValues)(tabs, () => (0, import_ag_charts_core84.createElementId)()); for (const [key, tab] of (0, import_ag_charts_core84.entries)(tabs)) { (0, import_ag_charts_core84.setAttributes)(tab.panel, { id: tabPanelIds[key], role: "tabpanel", "aria-labelledby": tabButtonIds[key] }); } const onPressTab = (active) => { for (const [key, tab] of (0, import_ag_charts_core84.entries)(tabs)) { tab.panel.classList.toggle("ag-charts-dialog__tab-panel--active", key === active); tabButtons[key].classList.toggle("ag-charts-dialog__tab-button--active", key === active); (0, import_ag_charts_core84.setAttribute)(tabButtons[key], "aria-selected", key === active); if (key === active) tab.onShow?.(); } }; const header = new NativeWidget((0, import_ag_charts_core84.createElement)("div", "ag-charts-dialog__header")); header.addListener("drag-start", (event) => { const { sourceEvent } = event; if (sourceEvent.target instanceof Element && sourceEvent.target.classList.contains("ag-charts-dialog__header")) { this.onDragStart(event); } }); header.addListener("drag-move", (event) => this.onDragMove(event)); header.addListener("drag-end", () => this.onDragEnd()); const dragHandle = new DragHandleWidget(); this.setDragHandle(dragHandle); const tabButtons = (0, import_ag_charts_core84.mapValues)( tabs, (tab, key) => (0, import_ag_charts_core84.createButton)( { label: this.ctx.localeManager.t(tab.label), onPress: () => onPressTab(key) }, { id: tabButtonIds[key], class: "ag-charts-dialog__tab-button", role: "tab", "aria-controls": tabPanelIds[key] } ) ); const tabList = (0, import_ag_charts_core84.createElement)("div", "ag-charts-dialog__tab-list"); (0, import_ag_charts_core84.setAttributes)(tabList, { role: "tablist", "aria-label": this.ctx.localeManager.t(tablistLabel) }); tabList.append(...Object.values(tabButtons)); const closeButton = this.createHeaderCloseButton(); header.getElement().append(dragHandle.getElement(), tabList, closeButton); element.append(header.getElement(), ...Object.values(tabs).map((t) => t.panel)); onPressTab(initial); (0, import_ag_charts_core84.initRovingTabIndex)({ orientation: "horizontal", buttons: Object.values(tabButtons) }); return { tabs: element, initialFocus: tabButtons[initial] }; } createTabPanel() { return (0, import_ag_charts_core84.createElement)("div", "ag-charts-dialog__tab-panel"); } /********** * Inputs * **********/ createInputGroupLine() { return (0, import_ag_charts_core84.createElement)("div", "ag-charts-dialog__input-group-line"); } createRadioGroup({ label, options, value, onChange }) { const group = this.createInputGroup(label); (0, import_ag_charts_core84.setAttributes)(group, { role: "radiogroup", tabindex: -1, "aria-label": this.ctx.localeManager.t(label) }); const activeClass = "ag-charts-dialog__button--active"; const buttons = []; for (const button of options) { const { icon, altText: altTextKey } = button; const altText = this.ctx.localeManager.t(altTextKey); const buttonEl = (0, import_ag_charts_core84.createButton)( { icon, altText, onPress: () => { for (const b of Array.from(group.children)) { b.classList.remove(activeClass); b.ariaChecked = "false"; } buttonEl.classList.add(activeClass); buttonEl.ariaChecked = "true"; onChange(button.value); } }, { "aria-checked": button.value === value, class: "ag-charts-dialog__button", role: "radio", title: altText } ); if (button.value === value) { buttonEl.classList.add(activeClass); } group.appendChild(buttonEl); buttons.push(buttonEl); } (0, import_ag_charts_core84.initRovingTabIndex)({ orientation: "horizontal", buttons }); return group; } createSelect({ altText, label, options, value, onChange }) { const group = this.createInputGroup(label); const altTextT = this.ctx.localeManager.t(altText); const select = (0, import_ag_charts_core84.createSelect)( { value, options, onChange }, { class: "ag-charts-dialog__select", "aria-label": altTextT, title: altTextT } ); group.append(select); return group; } createTextArea({ placeholder, value, onChange }) { const placeholderT = placeholder ? this.ctx.localeManager.t(placeholder) : void 0; return (0, import_ag_charts_core84.createTextArea)({ value, onChange }, { placeholder: placeholderT }); } createCheckbox({ label, checked, onChange }) { const id = (0, import_ag_charts_core84.createElementId)(); const group = this.createInputGroup(label, { for: id }); const checkbox = (0, import_ag_charts_core84.createCheckbox)( { checked, onChange }, { class: "ag-charts-dialog__checkbox", role: "switch", id } ); group.append(checkbox); return group; } createColorPicker({ color: color7, opacity, label, altText, onChange, onChangeHide, isMultiColor, hasMultiColorOption }) { const group = this.createInputGroup(label); const altTextT = this.ctx.localeManager.t(altText); const colorEl = (0, import_ag_charts_core84.createButton)( { label: altTextT, onPress: (event) => { const { anchor, fallbackAnchor } = this.getColorPickerAnchors(colorEl) ?? {}; this.colorPicker.show({ anchor, fallbackAnchor, color: color7, opacity, isMultiColor, hasMultiColorOption, sourceEvent: event, onChange: (newColorOpacity, newColor, newOpacity, newIsMultiColor) => { colorEl.style.setProperty("--color", newColorOpacity); colorEl.classList.toggle( "ag-charts-dialog__color-picker-button--multi-color", newIsMultiColor ); onChange(newColorOpacity, newColor, newOpacity, newIsMultiColor); }, onChangeHide }); } }, { "aria-label": altTextT, tabindex: 0, class: "ag-charts-dialog__color-picker-button", title: altTextT } ); if (isMultiColor) { colorEl.classList.toggle("ag-charts-dialog__color-picker-button--multi-color"); } else if (color7) { const hex = import_ag_charts_core84.Color.fromString(color7); const hexWithOpacity = new import_ag_charts_core84.Color(hex.r, hex.g, hex.b, opacity); colorEl.style.setProperty("--color", hexWithOpacity.toHexString()); } group.append(colorEl); this.hideFns.push(() => { this.colorPicker.hide(); }); return group; } /*********** * Private * ***********/ createHeaderCloseButton() { return (0, import_ag_charts_core84.createButton)( { icon: "close", altText: this.ctx.localeManager.t("iconAltTextClose"), onPress: () => this.hide() }, { class: "ag-charts-dialog__close-button" } ); } createInputGroup(label, options) { const group = (0, import_ag_charts_core84.createElement)("div", "ag-charts-dialog__input-group"); const labelEl = (0, import_ag_charts_core84.createElement)("label", "ag-charts-dialog__input-group-label"); labelEl.innerText = this.ctx.localeManager.t(label); (0, import_ag_charts_core84.setAttribute)(labelEl, "for", options?.for); group.appendChild(labelEl); return group; } onLayoutComplete(event) { this.seriesRect = event.series.paddedRect; this.reposition(); } onKeyDown(event) { if (event.altKey || event.ctrlKey || event.metaKey || event.isComposing || event.key !== "Escape") return; this.hide(); } reposition() { const { seriesRect, ctx } = this; const popover = this.getPopoverElement(); if (!seriesRect || !popover) return; const clientRect = ctx.domManager.getBoundingClientRect(); const outerOffset = import_ag_charts_core84.Vec2.from(0, seriesRect.y); const outerSize = import_ag_charts_core84.Vec2.from(clientRect.width, seriesRect.height); const popoverSize = import_ag_charts_core84.Vec2.from(popover); const halfWidth = import_ag_charts_core84.Vec2.from(0.5, 1); let position; if (seriesRect.width > 1e3) { const bottomCenter = import_ag_charts_core84.Vec2.sub( import_ag_charts_core84.Vec2.add(outerOffset, import_ag_charts_core84.Vec2.multiply(outerSize, halfWidth)), import_ag_charts_core84.Vec2.multiply(popoverSize, halfWidth) ); position = import_ag_charts_core84.Vec2.sub(bottomCenter, import_ag_charts_core84.Vec2.from(0, _Dialog.offset)); } else { const bottomRight = import_ag_charts_core84.Vec2.sub(import_ag_charts_core84.Vec2.add(outerOffset, outerSize), popoverSize); position = import_ag_charts_core84.Vec2.sub(bottomRight, _Dialog.offset); } this.updatePosition(position); } getColorPickerAnchors(element) { if (element) this.colorPickerAnchorElement = element; if (!this.colorPickerAnchorElement) return; const rect = this.colorPickerAnchorElement.getBoundingClientRect(); const canvasRect = this.ctx.domManager.getBoundingClientRect(); const topLeft = import_ag_charts_core84.Vec2.sub(import_ag_charts_core84.Vec2.from(rect.x, rect.y), import_ag_charts_core84.Vec2.from(canvasRect.left, canvasRect.top)); const anchor = import_ag_charts_core84.Vec2.add(topLeft, import_ag_charts_core84.Vec2.from(0, rect.height + 5)); const fallbackAnchor = import_ag_charts_core84.Vec2.sub(topLeft, import_ag_charts_core84.Vec2.from(0, 5)); return { anchor, fallbackAnchor }; } }; _Dialog.offset = 60; var Dialog = _Dialog; var DragHandleWidget = class extends NativeWidget { constructor() { super((0, import_ag_charts_core84.createElement)("div", "ag-charts-dialog__drag-handle")); const icon = new NativeWidget((0, import_ag_charts_core84.createElement)("span", (0, import_ag_charts_core84.getIconClassNames)("drag-handle"))); icon.setAriaHidden(true); this.addChild(icon); } }; // packages/ag-charts-enterprise/src/features/annotations/settings-dialog/settingsDialog.ts var AnnotationSettingsDialog = class extends Dialog { constructor(ctx) { super(ctx, "settings"); this.events = new import_ag_charts_core85.EventEmitter(); this.hideFns.push(() => this.events.emit("hidden", null)); } show(datum, options) { const lineTab = this.createLinearLineTab(datum, options); const textTab = this.createLinearTextTab(datum, options); let lineLabel = "dialogHeaderLine"; if (isChannelType(datum)) { lineLabel = "dialogHeaderChannel"; } else if (isFibonacciType(datum)) { lineLabel = "dialogHeaderFibonacciRange"; } else if (datum.type === "date-range" /* DateRange */) { lineLabel = "dialogHeaderDateRange"; } else if (datum.type === "price-range" /* PriceRange */) { lineLabel = "dialogHeaderPriceRange"; } else if (datum.type === "date-price-range" /* DatePriceRange */) { lineLabel = "dialogHeaderDatePriceRange"; } const { tabs, initialFocus } = this.createTabs("ariaLabelSettingsTabBar", options.initialSelectedTab, { line: { label: lineLabel, panel: lineTab }, text: { label: "dialogHeaderText", panel: textTab.panel, onShow: textTab.onShow } }); options.initialFocus = initialFocus; const popover = this.showWithChildren([tabs], options); popover.classList.add("ag-charts-dialog--annotation-settings"); } createLinearLineTab(datum, options) { const panel = this.createTabPanel(); const groupOne = this.createInputGroupLine(); const groupTwo = this.createInputGroupLine(); const hasMultiColorOption = "isMultiColor" in datum; const lineColorPicker = this.createColorPickerInput( "line-color", datum.getDefaultColor("line-color"), datum.getDefaultOpacity("line-color"), hasMultiColorOption ? datum.isMultiColor : false, hasMultiColorOption, options.onChangeLineColor, options.onChangeHideLineColor ); const strokeWidth = this.createStrokeWidthSelect(datum.strokeWidth ?? 2, options.onChangeLineStyleWidth); const lineStyle = this.createLineStyleRadioGroup(datum.lineStyle ?? "solid", options.onChangeLineStyleType); groupOne.append(lineColorPicker); if ("background" in datum) { const fillColorPicker = this.createColorPickerInput( "fill-color", datum.getDefaultColor("fill-color"), datum.getDefaultOpacity("fill-color"), false, false, options.onChangeFillColor, options.onChangeHideFillColor ); groupOne.append(fillColorPicker); groupTwo.append(strokeWidth); } else if ("showFill" in datum) { groupOne.append( this.createCheckbox({ label: "dialogInputShowFill", checked: datum.showFill ?? true, onChange: (showFill) => options.onChangeLine({ showFill }) }) ); groupTwo.append(strokeWidth); } else { groupOne.append(strokeWidth); } groupTwo.append(lineStyle); panel.append(groupOne, groupTwo); if ("bands" in datum) { panel.append( this.createFibonacciRatioSelect(datum.bands ?? 10, (bands) => options.onChangeLine({ bands })) ); } if ("extendStart" in datum && "extendEnd" in datum) { panel.append( this.createCheckbox({ label: isChannelType(datum) ? "dialogInputExtendChannelStart" : "dialogInputExtendLineStart", checked: datum.extendStart ?? false, onChange: (extendStart) => options.onChangeLine({ extendStart }) }), this.createCheckbox({ label: isChannelType(datum) ? "dialogInputExtendChannelEnd" : "dialogInputExtendLineEnd", checked: datum.extendEnd ?? false, onChange: (extendEnd) => options.onChangeLine({ extendEnd }) }) ); } if ("extendAbove" in datum && "extendBelow" in datum) { panel.append( this.createCheckbox({ label: "dialogInputExtendAbove", checked: datum.extendAbove ?? false, onChange: (extendAbove) => options.onChangeLine({ extendAbove }) }), this.createCheckbox({ label: "dialogInputExtendBelow", checked: datum.extendBelow ?? false, onChange: (extendBelow) => options.onChangeLine({ extendBelow }) }) ); } if ("extendLeft" in datum && "extendRight" in datum) { panel.append( this.createCheckbox({ label: "dialogInputExtendLeft", checked: datum.extendLeft ?? false, onChange: (extendLeft) => options.onChangeLine({ extendLeft }) }), this.createCheckbox({ label: "dialogInputExtendRight", checked: datum.extendRight ?? false, onChange: (extendRight) => options.onChangeLine({ extendRight }) }) ); } if ("reverse" in datum && "showFill" in datum) { panel.append( this.createCheckbox({ label: "dialogInputReverse", checked: datum.reverse ?? false, onChange: (reverse) => options.onChangeLine({ reverse }) }) ); } return panel; } createLinearTextTab(datum, options) { const panel = this.createTabPanel(); const textArea = this.createTextArea({ placeholder: "inputTextareaPlaceholder", value: datum.text.label, onChange: (value) => options.onChangeText({ label: value }) }); const fontSize = this.createFontSizeSelect(datum.text.fontSize, options.onChangeTextFontSize); const colorPicker = this.createColorPickerInput( "text-color", datum.text.color, 1, false, false, options.onChangeTextColor, options.onChangeHideTextColor ); const textPosition = datum.text.position === "inside" ? "center" : datum.text.position; const position = this.createPositionRadioGroup( textPosition ?? "top", (value) => options.onChangeText({ position: value }) ); const alignment = this.createAlignmentRadioGroup( datum.text.alignment ?? "center", (value) => options.onChangeText({ alignment: value }) ); const inputGroupLine = this.createInputGroupLine(); inputGroupLine.append(fontSize, colorPicker, position, alignment); panel.append(textArea, inputGroupLine); return { panel, onShow: () => (0, import_ag_charts_core85.focusCursorAtEnd)(textArea) }; } createColorPickerInput(colorType, color7, opacity, isMultiColor, hasMultiColorOption, onChange, onChangeHide) { const label = colorType === "fill-color" ? "dialogInputFillColorPicker" : "dialogInputColorPicker"; const altText = colorType === "fill-color" ? "dialogInputFillColorPickerAltText" : "dialogInputColorPickerAltText"; return this.createColorPicker({ label, altText, color: color7, opacity, isMultiColor, hasMultiColorOption, onChange, onChangeHide }); } createStrokeWidthSelect(strokeWidth, onChange) { return this.createSelect({ label: "dialogInputStrokeWidth", altText: "dialogInputStrokeWidthAltText", options: LINE_STROKE_WIDTH_ITEMS.map(({ label, value }) => ({ label, value: `${value}` })), value: String(strokeWidth), onChange: (value) => onChange(Number(value)) }); } createFibonacciRatioSelect(bands, onChange) { return this.createSelect({ label: "dialogInputFibonacciBands", altText: "dialogInputFibonacciBandsAltText", options: FIBONACCI_RATIO_ITEMS.map(({ label, value }) => ({ label, value: `${value}` })), value: String(bands), onChange: (value) => onChange(Number(value)) }); } createLineStyleRadioGroup(lineStyle, onChange) { return this.createRadioGroup({ label: "dialogInputLineStyle", options: [ { icon: "line-style-solid", altText: "iconAltTextLineStyleSolid", value: "solid" }, { icon: "line-style-dashed", altText: "iconAltTextLineStyleDashed", value: "dashed" }, { icon: "line-style-dotted", altText: "iconAltTextLineStyleDotted", value: "dotted" } ], value: lineStyle, onChange }); } createFontSizeSelect(fontSize, onChange) { return this.createSelect({ label: "dialogInputFontSize", altText: "dialogInputFontSizeAltText", options: TEXT_SIZE_ITEMS.map(({ label, value }) => ({ label, value: String(value) })), value: String(fontSize), onChange: (value) => onChange(Number(value)) }); } createPositionRadioGroup(position, onChange) { return this.createRadioGroup({ label: "dialogInputPosition", options: [ { icon: "position-top", altText: "iconAltTextPositionTop", value: "top" }, { icon: "position-center", altText: "iconAltTextPositionCenter", value: "center" }, { icon: "position-bottom", altText: "iconAltTextPositionBottom", value: "bottom" } ], value: position, onChange }); } createAlignmentRadioGroup(alignment, onChange) { return this.createRadioGroup({ label: "dialogInputAlign", options: [ { icon: "align-left", altText: "iconAltTextAlignLeft", value: "left" }, { icon: "align-center", altText: "iconAltTextAlignCenter", value: "center" }, { icon: "align-right", altText: "iconAltTextAlignRight", value: "right" } ], value: alignment, onChange }); } }; // packages/ag-charts-enterprise/src/features/annotations/utils/axis.ts function calculateAxisLabelPadding(axisLayout) { return axisLayout.gridPadding + axisLayout.seriesAreaPadding + axisLayout.tickSize + axisLayout.label.spacing; } // packages/ag-charts-enterprise/src/features/annotations/utils/update.ts function updateAnnotation(node, datum, context) { for (const { update } of Object.values(annotationConfigs)) { update(node, datum, context); } } // packages/ag-charts-enterprise/src/features/annotations/annotations.ts var { InteractionState: InteractionState2, keyProperty, valueProperty, Selection: Selection3, BBox: BBox3 } = import_ag_charts_community67._ModuleSupport; var _Annotations = class _Annotations extends import_ag_charts_core86.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.toolbar = new AnnotationsToolbar(this.ctx); this.optionsToolbar = new AnnotationOptionsToolbar(this.ctx, () => { const active = this.state.getActive(); if (active == null) return; return getTypedDatum(this.annotationData.at(active)); }); this.axesButtons = new AxesButtons(); this.enabled = true; this.snap = false; // Hidden options for use with measurer statistics this.data = void 0; this.xKey = void 0; this.volumeKey = void 0; this.annotationData = new import_ag_charts_core86.PropertiesArray( _Annotations.createAnnotationDatum ); this.defaults = new AnnotationDefaults(); this.container = new import_ag_charts_community67._ModuleSupport.Group({ name: "static-annotations" }); this.annotations = new Selection3( this.container, this.createAnnotationScene.bind(this) ); this.settingsDialog = new AnnotationSettingsDialog(this.ctx); this.textInput = new TextInput(this.ctx); this.postUpdateFns = []; this.state = this.setupStateMachine(); this.setupListeners(); this.setupDOM(); this.ctx.historyManager.addMementoOriginator(ctx.annotationManager); this.ctx.historyManager.addMementoOriginator(this.defaults); this.textInput.setKeyDownHandler(this.onTextInput.bind(this)); this.cleanup.register(() => { this.clear(); this.xAxis?.button?.destroy(); this.yAxis?.button?.destroy(); this.textInput.destroy(); }); } setupStateMachine() { const { ctx } = this; return new AnnotationsStateMachine({ resetToIdle: () => { ctx.domManager.updateCursor("annotations"); this.popAnnotationState(InteractionState2.Annotations); this.hideOverlays(); this.optionsToolbar.hide(); this.deleteEphemeralAnnotations(); this.update(); }, hoverAtCoords: (coords, active, previousHovered) => { let hovered; this.annotations.each((annotation, datum, index) => { if (!datum.isHoverable()) return; const contains = annotation.containsPoint(coords.x, coords.y); if (contains) hovered ?? (hovered = index); annotation.toggleHovered(contains, active === index, datum.readOnly); }); if (hovered != null) { ctx.tooltipManager.suppressTooltip("annotations"); } else if (!this.isAnnotationState()) { ctx.tooltipManager.unsuppressTooltip("annotations"); } if (hovered == null || !this.annotationData.at(hovered)?.readOnly) { this.ctx.domManager.updateCursor( "annotations", hovered == null ? void 0 : this.annotations.at(hovered)?.getCursor() ); } if (hovered !== previousHovered) { this.update(); } return hovered; }, getNodeAtCoords: (coords, active) => { const node = this.annotations.at(active); if (!node) { return; } return node.getNodeAtCoords(coords.x, coords.y); }, translate: (index, translation) => { const node = this.annotations.at(index); const datum = getTypedDatum(this.annotationData.at(index)); if (!node || !datum) { return; } return this.translateNode(node, datum, translation); }, copy: (index) => { const node = this.annotations.at(index); const datum = getTypedDatum(this.annotationData.at(index)); if (!node || !datum) { return; } return this.createAnnotationDatumCopy(node, datum); }, paste: (datum) => { this.createAnnotation(datum.type, datum, false); this.postUpdateFns.push(() => { this.state.transitionAsync("selectLast"); this.state.transitionAsync("copy"); }); }, select: (index, previous) => { const { annotations, optionsToolbar: optionsToolbar2, toolbar: toolbar2 } = this; this.hideOverlays(); toolbar2.clearActiveButton(); toolbar2.resetButtonIcons(); const selectedNode = index == null ? null : annotations.at(index); const previousNode = previous == null ? null : annotations.at(previous); const selectedDatum = index == null ? null : this.annotationData.at(index); if (previousNode === selectedNode && selectedNode != null) { return; } previousNode?.toggleActive(false); optionsToolbar2.hide(); if (selectedNode && !selectedDatum?.readOnly) { this.pushAnnotationState(InteractionState2.AnnotationsSelected); selectedNode.toggleActive(true); if (!isEphemeralType(selectedDatum)) { optionsToolbar2.updateButtons(this.annotationData.at(index)); this.postUpdateFns.push(() => { optionsToolbar2.show(); optionsToolbar2.setAnchorScene(selectedNode); }); } } else { this.popAnnotationState(InteractionState2.AnnotationsSelected); this.popAnnotationState(InteractionState2.Annotations); } if (!isEphemeralType(selectedDatum)) { this.deleteEphemeralAnnotations(); } this.update(); }, selectLast: () => { this.pushAnnotationState(InteractionState2.AnnotationsSelected); return this.annotationData.length - 1; }, startInteracting: () => { this.pushAnnotationState(InteractionState2.Annotations); }, stopInteracting: () => { this.popAnnotationState(InteractionState2.Annotations); }, create: (type, datum) => { this.createAnnotation(type, datum); }, delete: (index) => { this.annotationData.splice(index, 1); }, deleteAll: () => { const readOnly = this.annotationData.filter((datum) => { if (datum.readOnly === true) return datum; }); this.annotationData.splice(0, this.annotationData.length); for (const datum of readOnly) { this.annotationData.push(datum); } }, validatePoint: (point, options) => { const context = this.getAnnotationContext(); return context ? validateDatumPoint(context, point, options) : true; }, getAnnotationType: (index) => { return stringToAnnotationType(this.annotationData[index].type); }, datum: (index) => { return this.annotationData.at(index); }, node: (index) => { return this.annotations.at(index); }, recordAction: (label) => { this.recordActionAfterNextUpdate(label); }, update: () => { this.postUpdateFns.push(() => { const active = this.state.getActive(); const node = active == null ? null : this.annotations.at(active); if (node == null) return; this.optionsToolbar.setAnchorScene(node); }); this.update(); }, showTextInput: (active) => { const datum = getTypedDatum(this.annotationData.at(active)); const node = this.annotations.at(active); if (!node || !datum || !("getTextInputCoords" in datum) || !("getTextPosition" in datum)) return; const styles = { color: datum.color, fontFamily: datum.fontFamily, fontSize: datum.fontSize, fontStyle: datum.fontStyle, fontWeight: datum.fontWeight, placeholderColor: datum.getPlaceholderColor() }; const context = this.getAnnotationContext(); const getTextInputCoords = (height) => import_ag_charts_core86.Vec2.add(datum.getTextInputCoords(context, height), import_ag_charts_core86.Vec2.required(this.seriesRect)); const getTextPosition = () => datum.getTextPosition(); this.textInput.show({ styles, layout: { getTextInputCoords, getTextPosition, alignment: datum.alignment, textAlign: datum.textAlign, width: datum.width }, text: datum.text, placeholderText: datum.placeholderText, onChange: (_text, bbox) => { this.state.transition("updateTextInputBBox", bbox); } }); this.ctx.domManager.updateCursor("annotations"); }, hideTextInput: () => { this.textInput.hide(); }, updateTextInputColor: (color7) => { this.textInput.updateColor(color7); }, updateTextInputFontSize: (fontSize) => { const bbox = this.textInput.updateFontSize(fontSize); this.state.transition("updateTextInputBBox", bbox); }, updateTextInputBBox: (bbox) => { this.state.transition("updateTextInputBBox", bbox); }, showAnnotationOptions: (active) => { const node = this.annotations.at(active); if (!node || isEphemeralType(this.annotationData.at(active))) return; this.optionsToolbar.updateButtons(this.annotationData.at(active)); this.optionsToolbar.show(); this.optionsToolbar.setAnchorScene(node); }, showAnnotationSettings: (active, sourceEvent, initialTab = "line") => { const datum = this.annotationData.at(active); if (!isLineType(datum) && !isChannelType(datum) && !isMeasurerType(datum)) return; if (isEphemeralType(datum)) return; const onChangeColor = (colorType) => (colorOpacity, color7, opacity, isMultiColor) => { this.setColorAndDefault(datum.type, colorType, colorOpacity, color7, opacity, isMultiColor); this.optionsToolbar.updateColorPickerColor(colorType, color7, opacity, isMultiColor); }; const onChangeHideColor = (colorType) => () => { this.recordActionAfterNextUpdate( `Change ${datum.type} ${colorType} to ${datum.getDefaultColor(colorType)}`, ["annotations", "defaults"] ); this.update(); }; const options = { initialSelectedTab: initialTab, ariaLabel: this.ctx.localeManager.t("ariaLabelAnnotationSettingsDialog"), sourceEvent, onChangeLine: (props) => { this.state.transition("lineProps", props); if (props.bands != null) this.defaults.setDefaultFibonacciOptions(datum.type, "bands", props.bands); if (props.reverse != null) this.defaults.setDefaultFibonacciOptions(datum.type, "reverse", props.reverse); if (props.showFill != null) this.defaults.setDefaultFibonacciOptions(datum.type, "showFill", props.showFill); }, onChangeText: (props) => { this.state.transition("lineText", props); if (props.alignment) this.defaults.setDefaultLineTextAlignment(datum.type, props.alignment); if (props.position) this.defaults.setDefaultLineTextPosition(datum.type, props.position); this.recordActionAfterNextUpdate( `Change ${datum.type} text ${Object.keys(props).map((key) => `${key} to ${props[key]}`).join(", ")}` ); }, onChangeFillColor: onChangeColor("fill-color"), onChangeHideFillColor: onChangeHideColor("fill-color"), onChangeLineColor: onChangeColor("line-color"), onChangeHideLineColor: onChangeHideColor("line-color"), onChangeLineStyleType: (lineStyleType) => { this.setLineStyleTypeAndDefault(datum.type, lineStyleType); this.optionsToolbar.updateLineStyleType( LINE_STYLE_TYPE_ITEMS.find((item) => item.value === lineStyleType) ?? LINE_STYLE_TYPE_ITEMS[0] ); }, onChangeLineStyleWidth: (strokeWidth) => { this.setLineStyleWidthAndDefault(datum.type, strokeWidth); this.optionsToolbar.updateStrokeWidth({ strokeWidth, value: strokeWidth, label: String(strokeWidth) }); }, onChangeTextColor: onChangeColor("text-color"), onChangeHideTextColor: onChangeHideColor("text-color"), onChangeTextFontSize: (fontSize) => { this.setFontSizeAndDefault(datum.type, fontSize); } }; this.settingsDialog.show(datum, options); } }); } setupListeners() { const { ctx, optionsToolbar: optionsToolbar2, settingsDialog, toolbar: toolbar2 } = this; const { seriesWidget, seriesDragInterpreter, chartWidget } = ctx.widgets; if (seriesDragInterpreter) { this.cleanup.register( // Interactions seriesDragInterpreter.events.on("click", this.hoverTouchPreHandler.bind(this)), seriesDragInterpreter.events.on("drag-start", this.hoverTouchPreHandler.bind(this)), seriesDragInterpreter.events.on("drag-move", this.dragMoveTouchPreHandler.bind(this)), seriesDragInterpreter.events.on("mousemove", this.onHover.bind(this)), seriesDragInterpreter.events.on("click", this.onClick.bind(this)), seriesDragInterpreter.events.on("dblclick", this.onDoubleClick.bind(this)), seriesDragInterpreter.events.on("drag-start", this.onDragStart.bind(this)), seriesDragInterpreter.events.on("drag-move", this.onDrag.bind(this)), seriesDragInterpreter.events.on("drag-end", this.onDragEnd.bind(this)) ); } this.cleanup.register( // Interactions seriesWidget.addListener("keydown", this.onKeyDown.bind(this)), seriesWidget.addListener("keyup", this.onKeyUp.bind(this)), chartWidget.addListener("click", this.onCancel.bind(this)), // Services ctx.eventsHub.on("annotations:restore", this.onRestoreAnnotations.bind(this)), ctx.eventsHub.on("layout:complete", this.onLayoutComplete.bind(this)), ctx.updateService.addListener("pre-scene-render", this.onPreRender.bind(this)), ctx.eventsHub.on("zoom:change-complete", () => this.onResize()), ctx.eventsHub.on("dom:resize", () => this.onResize()), // Toolbar toolbar2.events.on("cancel-create-annotation", () => { this.cancel(); this.reset(); this.update(); }), toolbar2.events.on("pressed-create-annotation", ({ annotation }) => { this.cancel(); this.pushAnnotationState(InteractionState2.Annotations); this.state.transition(annotation); this.update(); }), toolbar2.events.on("pressed-clear", () => { this.clear(); this.recordActionAfterNextUpdate("Clear all"); }), toolbar2.events.on("pressed-show-menu", () => { this.cancel(); this.reset(); }), toolbar2.events.on("pressed-unrelated", () => { this.reset(); }), // Annotation Options Toolbar optionsToolbar2.events.on("pressed-delete", () => { this.cancel(); this.delete(); this.reset(); }), optionsToolbar2.events.on("pressed-settings", ({ sourceEvent }) => { this.state.transition("toolbarPressSettings", sourceEvent); }), optionsToolbar2.events.on("pressed-lock", ({ locked }) => { this.recordActionAfterNextUpdate(locked ? "Locked" : "Unlocked"); this.update(); }), optionsToolbar2.events.on("hid-overlays", () => { this.settingsDialog.hide(); }), optionsToolbar2.events.on("saved-color", ({ type, colorPickerType, color: color7 }) => { this.recordActionAfterNextUpdate(`Change ${type} ${colorPickerType} to ${color7}`, [ "annotations", "defaults" ]); }), optionsToolbar2.events.on( "updated-color", ({ type, colorPickerType, colorOpacity, color: color7, opacity, isMultiColor }) => { this.setColorAndDefault(type, colorPickerType, colorOpacity, color7, opacity, isMultiColor); } ), optionsToolbar2.events.on("updated-font-size", ({ type, fontSize }) => { this.setFontSizeAndDefault(type, fontSize); }), optionsToolbar2.events.on("updated-line-style", ({ type, lineStyleType }) => { this.setLineStyleTypeAndDefault(type, lineStyleType); }), optionsToolbar2.events.on("updated-line-width", ({ type, strokeWidth }) => { this.setLineStyleWidthAndDefault(type, strokeWidth); }), // Settings Dialog settingsDialog.events.on("hidden", () => { this.optionsToolbar.clearActiveButton(); }) ); } setupDOM() { const { ctx, toolbar: toolbar2, optionsToolbar: optionsToolbar2 } = this; this.cleanup.register(ctx.annotationManager.attachNode(this.container), () => { ctx.domManager.removeStyles(DEFAULT_ANNOTATION_AXIS_BUTTON_CLASS); toolbar2.destroy(); optionsToolbar2.destroy(); }); } async processData(dataController) { if (!this.enabled || this.data == null || this.xKey == null || this.volumeKey == null) return; const props = [ keyProperty(this.xKey, void 0, { id: "date" }), valueProperty(this.volumeKey, "number", { id: "volume" }) ]; const dataSet = import_ag_charts_community67._ModuleSupport.DataSet.wrap(this.data) ?? import_ag_charts_community67._ModuleSupport.DataSet.empty(); const { dataModel, processedData } = await dataController.request("annotations", dataSet, { props }); this.dataModel = dataModel; this.processedData = processedData; } /** * Create an annotation scene within the `this.annotations` scene selection. This method is automatically called by * the selection when a new scene is required. */ createAnnotationScene(datum) { if (datum.type in annotationConfigs) { return new annotationConfigs[datum.type].scene(); } throw new Error( `AG Charts - Cannot create annotation scene of type [${datum.type}], expected one of [${Object.keys(annotationConfigs)}], ignoring.` ); } /** * Create an annotation datum within the `this.annotationData` properties array. It is created as an instance * of `AnnotationProperties` from the given config for its type. This method is only called when annotations * are added from the initial state. */ static createAnnotationDatum(params) { if (params.type in annotationConfigs) { return new annotationConfigs[params.type].datum().set(params); } throw new Error( `AG Charts - Cannot create annotation datum of unknown type [${params.type}], expected one of [${Object.keys(annotationConfigs)}], ignoring.` ); } /** * Append an annotation datum to `this.annotationData`, applying default styles. This method is called when a user * interacts with the chart to draw their own annotations. */ createAnnotation(type, datum, applyDefaults = true) { this.annotationData.push(datum); if (applyDefaults) { const styles = this.ctx.annotationManager.getAnnotationTypeStyles(type); if (styles) datum.set(styles); this.defaults.applyDefaults(datum); } this.injectDatumDependencies(datum); this.update(); } injectDatumDependencies(datum) { if ("setLocaleManager" in datum) { datum.setLocaleManager(this.ctx.localeManager); } if ("getVolume" in datum) { datum.getVolume = this.getDatumRangeVolume.bind(this); } } getDatumRangeVolume(fromPoint, toPoint) { const { dataModel, processedData } = this; let from = getGroupingValue(fromPoint); let to = getGroupingValue(toPoint); if (!(0, import_ag_charts_core86.isValidDate)(from) || !(0, import_ag_charts_core86.isValidDate)(to) || !dataModel || !processedData || this.volumeKey == null) return; if (from > to) { [from, to] = [to, from]; } const dateValues = dataModel.resolveKeysById({ id: "annotations" }, "date", processedData); const volumeValues = dataModel.resolveColumnById({ id: "annotations" }, "volume", processedData); let sum = 0; for (let datumIndex = 0; datumIndex < processedData.input.count; datumIndex++) { const key = dateValues[datumIndex]; if ((0, import_ag_charts_core86.isValidDate)(key) && key >= from && key <= to) { sum += volumeValues[datumIndex]; } } return sum; } translateNode(node, datum, translation) { const config = this.getAnnotationConfig(datum); const context = this.getAnnotationContext(); if (!context) { return; } config.translate(node, datum, translation, context); } createAnnotationDatumCopy(node, datum) { const config = this.getAnnotationConfig(datum); const newDatum = new config.datum(); newDatum.set(datum.toJson()); const context = this.getAnnotationContext(); if (!context) { return; } return config.copy(node, datum, newDatum, context); } getAnnotationConfig(datum) { if (datum.type in annotationConfigs) { return annotationConfigs[datum.type]; } throw new Error( `AG Charts - Cannot get annotation config of unknown type [${datum.type}], expected one of [${Object.keys(annotationConfigs)}], ignoring.` ); } onRestoreAnnotations(event) { if (!this.enabled) return; this.clear(); this.annotationData.set(event.annotations); this.postUpdateFns.push(() => { this.ctx.annotationManager.fireChangedEvent(); }); this.update(); } onLayoutComplete(event) { if (!this.enabled) return; const seriesRect = event.series.paddedRect; this.seriesRect = seriesRect; this.container.setClipRect(seriesRect); this.xAxis = this.getAxis(event.axes[import_ag_charts_core86.ChartAxisDirection.X], seriesRect, this.xAxis?.button); this.yAxis = this.getAxis(event.axes[import_ag_charts_core86.ChartAxisDirection.Y], seriesRect, this.yAxis?.button); if (this.showAnnotations()) { this.animateAnnotations({ from: 0, to: 1, phase: "trailing" }); } else { this.animateAnnotations({ from: 1, to: 0, phase: "remove" }); } } showAnnotations() { if (!this.yAxis || !this.xAxis) { return false; } const hasData = this.ctx.chartService.series.some((s) => s.hasData); const seriesIds = this.yAxis.context.seriesIds(); const anyBoundSeriesVisible = seriesIds.some((id) => { const series = this.ctx.chartService.series.find((s) => s.id === id); return series?.visible; }); return hasData && anyBoundSeriesVisible; } animateAnnotations({ from, to, phase }) { const { annotations } = this; this.ctx.animationManager?.animate({ from, to, id: "chart-annotations", phase, groupId: "opacity", onUpdate(value) { annotations.each((node) => { node.opacity = value; if ("setAxisLabelOpacity" in node) { node.setAxisLabelOpacity(value); } }); }, onStop() { annotations.each((node) => { node.opacity = to; if ("setAxisLabelOpacity" in node) { node.setAxisLabelOpacity(to); } }); } }); } onPreRender() { if (!this.enabled) return; this.updateAnnotations(); this.state.transition("render"); } getAxis(axisLayout, seriesRect, button) { const axisCtx = this.ctx.axisManager.getAxisContext(axisLayout.direction)[0]; const { position: axisPosition = "bottom", direction } = axisCtx; const padding2 = axisLayout.gridPadding + axisLayout.seriesAreaPadding; const bounds = new BBox3(0, 0, seriesRect.width, seriesRect.height).grow(padding2, axisPosition); const lineDirection = direction === import_ag_charts_core86.ChartAxisDirection.X ? "vertical" : "horizontal"; const { axesButtons, snap } = this; const buttonEnabled = this.enabled && axesButtons.enabled && (axesButtons.axes === "xy" || axesButtons.axes === direction); if (buttonEnabled) { button ?? (button = new AxisButton( this.ctx, { ...axisCtx, snapToGroup: snap }, (coords) => this.onAxisButtonClick(coords, lineDirection), seriesRect )); const axisLabelPadding = calculateAxisLabelPadding(axisLayout); button.update(seriesRect, axisLabelPadding); } else { button?.destroy(); button = void 0; } return { layout: axisLayout, context: axisCtx, bounds, button }; } recordActionAfterNextUpdate(label, types = ["annotations"]) { const { defaults, ctx: { annotationManager, historyManager } } = this; const originators = types.map((type) => type === "defaults" ? defaults : annotationManager); this.postUpdateFns.push(() => { historyManager.record(label, ...originators); annotationManager.fireChangedEvent(); }); } setColorAndDefault(datumType, colorPickerType, colorOpacity, color7, opacity, isMultiColor) { this.state.transition("color", { colorPickerType, colorOpacity, color: color7, opacity, isMultiColor }); this.defaults.setDefaultColor(datumType, colorPickerType, colorOpacity, color7, opacity, isMultiColor); } setFontSizeAndDefault(datumType, fontSize) { this.state.transition("fontSize", fontSize); this.defaults.setDefaultFontSize(datumType, fontSize); this.recordActionAfterNextUpdate(`Change ${datumType} font size to ${fontSize}`, ["annotations", "defaults"]); } setLineStyleTypeAndDefault(datumType, styleType) { this.state.transition("lineStyle", { type: styleType }); this.defaults.setDefaultLineStyleType(datumType, styleType); this.recordActionAfterNextUpdate(`Change ${datumType} line style to ${styleType}`, ["annotations", "defaults"]); } setLineStyleWidthAndDefault(datumType, strokeWidth) { this.state.transition("lineStyle", { strokeWidth }); this.defaults.setDefaultLineStyleWidth(datumType, strokeWidth); this.recordActionAfterNextUpdate(`Change ${datumType} stroke width to ${strokeWidth}`, [ "annotations", "defaults" ]); } updateAnnotations() { const { annotationData, annotations, seriesRect, ctx: { annotationManager } } = this; const context = this.getAnnotationContext(); if (!seriesRect || !context) return; annotationManager.updateData(annotationData.toJson()); const showAnnotations = this.showAnnotations(); this.toolbar.refreshButtonsEnabled(showAnnotations); this.toolbar.toggleClearButtonEnabled(annotationData.length > 0 && showAnnotations); annotations.update(annotationData ?? [], void 0, (datum) => datum.id).each((node, datum) => { if (!showAnnotations) { node.visible = false; if ("setAxisLabelVisible" in node) { node.setAxisLabelVisible(false); } return; } if ("setAxisLabelVisible" in node) { node.setAxisLabelVisible(true); } this.injectDatumDependencies(datum); updateAnnotation(node, datum, context); }); for (const fn of this.postUpdateFns) { fn(); } this.postUpdateFns = []; } getAnnotationContext() { const { seriesRect, xAxis, yAxis, snap } = this; if (!(seriesRect && xAxis && yAxis)) { return; } return { seriesRect, xAxis: { ...xAxis.context, bounds: xAxis.bounds, labelPadding: calculateAxisLabelPadding(xAxis.layout), snapToGroup: snap }, yAxis: { ...yAxis.context, bounds: yAxis.bounds, labelPadding: calculateAxisLabelPadding(xAxis.layout), snapToGroup: snap } }; } onHover(event) { const { state } = this; const context = this.getAnnotationContext(); if (!context) return; const shiftKey = event.sourceEvent.shiftKey; const offset = import_ag_charts_core86.Vec2.from(event); const point = invertCoords(offset, context); state.transition("hover", { offset, point, shiftKey, context }); } onClick(event) { const { state } = this; const context = this.getAnnotationContext(); if (!context) return; const shiftKey = event.sourceEvent.shiftKey; const point = invertCoords(import_ag_charts_core86.Vec2.from(event), context); const textInputValue = this.textInput.getValue(); const bbox = this.textInput.getBBox(); state.transition("click", { point, shiftKey, textInputValue, bbox }); } onDoubleClick(event) { const { state } = this; const context = this.getAnnotationContext(); if (!context) return; const offset = import_ag_charts_core86.Vec2.from(event); state.transition("dblclick", { offset }); } onAxisButtonClick(coords, direction) { this.cancel(); this.reset(); const context = this.getAnnotationContext(); if (!this.annotationData || !context) return; const { state } = this; this.pushAnnotationState(InteractionState2.Annotations); const isHorizontal2 = direction === "horizontal"; state.transition(isHorizontal2 ? "horizontal-line" /* HorizontalLine */ : "vertical-line" /* VerticalLine */); this.optionsToolbar.hide(); if (!coords) { return; } const point = invertCoords(coords, context); if (!validateDatumPoint(context, point)) { return; } state.transition("click", { point, shiftKey: false }); this.update(); } onResize() { const textInputValue = this.textInput.getValue(); const bbox = this.textInput.getBBox(); this.state.transition("resize", { textInputValue, bbox }); } hoverTouchPreHandler(event) { if (event.device === "touch") { this.onHover(event); } } dragMoveTouchPreHandler(event) { if (event.device === "touch" && this.ctx.interactionManager.isState(InteractionState2.AnnotationsSelected)) { event.sourceEvent.preventDefault(); } } onDragStart(event) { if (!this.ctx.interactionManager.isState(InteractionState2.AnnotationsDraggable)) return; const context = this.getAnnotationContext(); if (!context) return; const offset = import_ag_charts_core86.Vec2.from(event); const point = invertCoords(offset, context); const textInputValue = this.textInput.getValue(); const bbox = this.textInput.getBBox(); this.state.transition("dragStart", { context, offset, point, textInputValue, bbox }); } onDrag(event) { if (!this.ctx.interactionManager.isState(InteractionState2.AnnotationsDraggable)) return; const context = this.getAnnotationContext(); if (!context) return; const offset = import_ag_charts_core86.Vec2.from(event); const point = invertCoords(offset, context); const shiftKey = event.sourceEvent.shiftKey; const textInputValue = this.textInput.getValue(); const bbox = this.textInput.getBBox(); this.state.transition("drag", { context, offset, point, shiftKey, textInputValue, bbox }); } onDragEnd() { this.state.transition("dragEnd"); } onCancel(widgetEvent) { const { sourceEvent } = widgetEvent ?? {}; if (sourceEvent?.currentTarget !== sourceEvent?.target) return; this.cancel(); this.reset(); } onDelete() { if (this.textInput.isVisible()) return; this.cancel(); this.delete(); this.reset(); this.update(); } onTextInput(event) { const { state } = this; const context = this.getAnnotationContext(); if (!context) return; const { key, shiftKey } = event; const textInputValue = this.textInput.getValue(); const bbox = this.textInput.getBBox(); state.transition("textInput", { key, shiftKey, textInputValue, bbox, context }); } onKeyDown(event) { const { state } = this; const context = this.getAnnotationContext(); if (!context) { return; } const { sourceEvent } = event; const { shiftKey, ctrlKey, metaKey } = sourceEvent; const ctrlMeta = ctrlKey || metaKey; const ctrlShift = ctrlKey || shiftKey; state.transition("keyDown", { shiftKey, context }); const translation = { x: 0, y: 0 }; const xStep = Math.max(context?.xAxis.scale.bandwidth ?? 0, ctrlShift ? 10 : 1); const yStep = Math.max(context?.yAxis.scale.bandwidth ?? 0, ctrlShift ? 10 : 1); switch (sourceEvent.key) { case "ArrowDown": translation.y = yStep; break; case "ArrowUp": translation.y = -yStep; break; case "ArrowLeft": translation.x = -xStep; break; case "ArrowRight": translation.x = xStep; break; case "Escape": this.onCancel(); return; case "Backspace": case "Delete": this.onDelete(); return; } if (translation.x || translation.y) { state.transition("translate", { translation }); sourceEvent.stopPropagation(); sourceEvent.preventDefault(); } if (!ctrlMeta) { return; } switch (sourceEvent.key) { case "c": state.transition("copy"); return; case "x": state.transition("cut"); this.recordActionAfterNextUpdate("Cut annotation"); return; case "v": state.transition("paste"); this.recordActionAfterNextUpdate("Paste annotation"); return; } } onKeyUp(event) { const { shiftKey } = event.sourceEvent; const context = this.getAnnotationContext(); if (!context) { return; } this.state.transition("keyUp", { shiftKey, context }); this.state.transition("translateEnd"); } clear() { this.cancel(); this.deleteAll(); this.reset(); } reset() { this.state.transition("reset"); } cancel() { this.state.transition("cancel"); } delete() { this.state.transition("delete"); } deleteAll() { this.state.transition("deleteAll"); } deleteEphemeralAnnotations() { let deletedEphemeral = false; for (const [index, datum] of this.annotationData.entries()) { if (isEphemeralType(datum)) { this.annotationData.splice(index, 1); deletedEphemeral = true; } } if (deletedEphemeral) { this.recordActionAfterNextUpdate("Delete ephemeral annotations"); } } hideOverlays() { this.settingsDialog.hide(); this.toolbar.hideOverlays(); this.optionsToolbar.hideOverlays(); } pushAnnotationState(state) { this.ctx.interactionManager.pushState(state); this.ctx.tooltipManager.suppressTooltip("annotations"); } popAnnotationState(state) { this.ctx.interactionManager.popState(state); this.ctx.tooltipManager.unsuppressTooltip("annotations"); } isAnnotationState() { return this.ctx.interactionManager.isState(InteractionState2.Annotations) || this.ctx.interactionManager.isState(InteractionState2.AnnotationsSelected); } update(status = import_ag_charts_core86.ChartUpdateType.PRE_SCENE_RENDER) { this.ctx.updateService.update(status); } }; __decorateClass([ import_ag_charts_core86.Property ], _Annotations.prototype, "toolbar", 2); __decorateClass([ import_ag_charts_core86.Property ], _Annotations.prototype, "optionsToolbar", 2); __decorateClass([ import_ag_charts_core86.Property ], _Annotations.prototype, "axesButtons", 2); __decorateClass([ import_ag_charts_core86.Property, (0, import_ag_charts_core86.ObserveChanges)((target, value) => { const enabled = value ?? true; target.toolbar.enabled = enabled; target.optionsToolbar.enabled = enabled; target.axesButtons.enabled = enabled; }) ], _Annotations.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core86.Property ], _Annotations.prototype, "snap", 2); var Annotations = _Annotations; // packages/ag-charts-enterprise/src/features/annotations/annotationsTheme.ts var import_ag_charts_community68 = require("ag-charts-community"); var ThemeSymbols = __toESM(require("ag-charts-core")); var import_ag_charts_core87 = require("ag-charts-core"); var stroke = { stroke: { $ref: "foregroundColor" }, strokeOpacity: 1, strokeWidth: 2 }; var handle = { fill: ThemeSymbols.DEFAULT_ANNOTATION_HANDLE_FILL, strokeOpacity: 1, strokeWidth: 2 }; var font = { color: { $ref: "chartBackgroundColor" }, fontSize: { $rem: import_ag_charts_core87.FONT_SIZE_RATIO.LARGE }, fontFamily: { $ref: "fontFamily" } }; var axisLabel = { ...font, enabled: true, fill: { $ref: "foregroundColor" }, fontSize: { $ref: "fontSize" } }; var text = { ...font, textAlign: "left" }; var lineText = { ...font, position: "top", alignment: "center", color: { $ref: "textColor" } }; var channelText = { ...font, position: "top", alignment: "center", color: { $ref: "textColor" } }; var measurerStatistics = { ...font, fontSize: { $ref: "fontSize" }, color: ThemeSymbols.DEFAULT_ANNOTATION_STATISTICS_COLOR, fill: ThemeSymbols.DEFAULT_ANNOTATION_STATISTICS_FILL, stroke: ThemeSymbols.DEFAULT_ANNOTATION_STATISTICS_STROKE, strokeWidth: 1, divider: { stroke: ThemeSymbols.DEFAULT_ANNOTATION_STATISTICS_DIVIDER_STROKE, strokeWidth: 1, strokeOpacity: 0.5 } }; var measurer = { ...stroke, background: { fill: { $ref: "foregroundColor" }, fillOpacity: 0.075 }, handle: { ...handle }, text: { ...lineText }, statistics: { ...measurerStatistics } }; var toolbar = { buttons: { $shallowSimple: [ { icon: "text-annotation", tooltip: "toolbarAnnotationsTextAnnotations", value: "text-menu" }, { icon: "trend-line-drawing", tooltip: "toolbarAnnotationsLineAnnotations", value: "line-menu" }, { icon: "arrow-drawing", tooltip: "toolbarAnnotationsShapeAnnotations", value: "shape-menu" }, { icon: "delete", tooltip: "toolbarAnnotationsClearAll", value: "clear" } ] }, padding: { $ref: "chartPadding" } }; var optionsToolbar = { buttons: { $shallowSimple: [ { icon: "text-annotation", tooltip: "toolbarAnnotationsTextColor", value: "text-color" }, { icon: "line-color", tooltip: "toolbarAnnotationsLineColor", value: "line-color" }, { icon: "fill-color", tooltip: "toolbarAnnotationsFillColor", value: "fill-color" }, { tooltip: "toolbarAnnotationsTextSize", value: "text-size" }, { tooltip: "toolbarAnnotationsLineStrokeWidth", value: "line-stroke-width" }, { icon: "line-style-solid", tooltip: "toolbarAnnotationsLineStyle", value: "line-style-type" }, { icon: "settings", tooltip: "toolbarAnnotationsSettings", value: "settings" }, { icon: "unlocked", tooltip: "toolbarAnnotationsLock", ariaLabel: "toolbarAnnotationsLock", checkedOverrides: { icon: "locked", tooltip: "toolbarAnnotationsUnlock" }, value: "lock" }, { icon: "delete", tooltip: "toolbarAnnotationsDelete", value: "delete" } ] } }; var annotationsTheme = { enabled: false, // Lines line: { ...stroke, handle: { ...handle }, text: { ...lineText } }, "horizontal-line": { ...stroke, handle: { ...handle }, axisLabel: { ...axisLabel }, text: { ...lineText } }, "vertical-line": { ...stroke, handle: { ...handle }, axisLabel: { ...axisLabel }, text: { ...lineText } }, // Channels "disjoint-channel": { ...stroke, background: { fill: { $ref: "foregroundColor" }, fillOpacity: 0.075 }, handle: { ...handle }, text: { ...channelText } }, "parallel-channel": { ...stroke, middle: { lineDash: [6, 5], strokeWidth: 1 }, background: { fill: { $ref: "foregroundColor" }, fillOpacity: 0.075 }, handle: { ...handle }, text: { ...channelText } }, // Fibonnaccis "fibonacci-retracement": { ...stroke, strokes: ThemeSymbols.DEFAULT_FIBONACCI_STROKES, rangeStroke: { $ref: "foregroundColor" }, handle: { ...handle }, text: { ...lineText, position: "center" }, label: { ...font, color: void 0, fontSize: { $rem: import_ag_charts_core87.FONT_SIZE_RATIO.SMALLER } } }, "fibonacci-retracement-trend-based": { ...stroke, strokes: ThemeSymbols.DEFAULT_FIBONACCI_STROKES, rangeStroke: { $ref: "foregroundColor" }, handle: { ...handle }, text: { ...lineText, position: "center" }, label: { ...font, color: void 0, fontSize: { $rem: import_ag_charts_core87.FONT_SIZE_RATIO.SMALLER } } }, // Texts callout: { ...stroke, ...text, color: { $ref: "textColor" }, handle: { ...handle }, fill: { $ref: "foregroundColor" }, fillOpacity: 0.075 }, comment: { ...text, fontWeight: 700, handle: { ...handle }, fill: { $ref: "foregroundColor" } }, note: { ...text, color: ThemeSymbols.DEFAULT_TEXTBOX_COLOR, fill: ThemeSymbols.DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR, stroke: { $ref: "chartBackgroundColor" }, strokeWidth: 1, strokeOpacity: 1, handle: { ...handle }, background: { fill: ThemeSymbols.DEFAULT_TEXTBOX_FILL, stroke: ThemeSymbols.DEFAULT_TEXTBOX_STROKE, strokeWidth: 1 } }, text: { ...text, color: { $ref: "textColor" }, handle: { ...handle } }, // Shapes arrow: { ...stroke, handle: { ...handle }, text: { ...lineText } }, "arrow-up": { fill: { $palette: "up.fill" }, handle: { ...handle, stroke: { $ref: "foregroundColor" } } }, "arrow-down": { fill: { $palette: "down.fill" }, handle: { ...handle, stroke: { $ref: "foregroundColor" } } }, // Measurers "date-range": { ...measurer }, "price-range": { ...measurer }, "date-price-range": { ...measurer }, "quick-date-price-range": { up: { ...stroke, fill: ThemeSymbols.DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL, fillOpacity: 0.2, handle: { ...handle }, statistics: { ...measurerStatistics, color: "#fff", fill: ThemeSymbols.DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL, strokeWidth: 0, divider: { stroke: "#fff", strokeWidth: 1, strokeOpacity: 0.5 } } }, down: { ...stroke, stroke: ThemeSymbols.DEFAULT_ANNOTATION_STATISTICS_DOWN_STROKE, fill: ThemeSymbols.DEFAULT_ANNOTATION_STATISTICS_DOWN_FILL, fillOpacity: 0.2, handle: { ...handle, stroke: ThemeSymbols.DEFAULT_ANNOTATION_STATISTICS_DOWN_STROKE }, statistics: { ...measurerStatistics, color: "#fff", fill: ThemeSymbols.DEFAULT_ANNOTATION_STATISTICS_DOWN_FILL, strokeWidth: 0, divider: { stroke: "#fff", strokeWidth: 1, strokeOpacity: 0.5 } } } }, axesButtons: {}, // Toolbars toolbar, optionsToolbar }; // packages/ag-charts-enterprise/src/features/annotations/annotationsModule.ts var AnnotationsModule = { type: "plugin", name: "annotations", chartType: "cartesian", enterprise: true, version: import_ag_charts_community69.VERSION, options: import_ag_charts_community69._ModuleSupport.annotationOptionsDef, themeTemplate: annotationsTheme, create: (ctx) => new Annotations(ctx), patchContext: (ctx) => { if (ctx.sharedToolbar) return; ctx.sharedToolbar = new SharedToolbar(ctx); ctx.cleanup.register(() => ctx.sharedToolbar.destroy()); } }; // packages/ag-charts-enterprise/src/features/band-highlight/bandHighlightModule.ts var import_ag_charts_community71 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/features/band-highlight/bandHighlight.ts var import_ag_charts_community70 = require("ag-charts-community"); var import_ag_charts_core89 = require("ag-charts-core"); var { Range, TranslatableGroup, BBox: BBox4, FillGradientDefaults, FillImageDefaults, FillPatternDefaults, getShapeFill, InteractionState: InteractionState3 } = import_ag_charts_community70._ModuleSupport; var BandHighlight = class extends import_ag_charts_core89.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.id = (0, import_ag_charts_core89.createId)(this); this.enabled = false; this.stroke = "rgb(195, 195, 195)"; this.lineDash = [6, 3]; this.lineDashOffset = 0; this.strokeWidth = 1; this.strokeOpacity = 1; this.fill = "#c16068"; this.fillOpacity = 1; this.fillGradientDefaults = new FillGradientDefaults(); this.fillPatternDefaults = new FillPatternDefaults(); this.fillImageDefaults = new FillImageDefaults(); this.bounds = new BBox4(0, 0, 0, 0); this.bandHighlightGroup = new TranslatableGroup({ name: "bandHighlight", zIndex: import_ag_charts_core89.ZIndexMap.AXIS_BAND_HIGHLIGHT }); this.rangeNode = this.bandHighlightGroup.appendChild(new Range()); this.activeAxisHighlight = void 0; this.axisCtx = ctx.parent; this.hideBand(); ctx.domManager.addEventListener("focusin", ({ target }) => { const isSeriesAreaChild = target instanceof HTMLElement && ctx.domManager.contains(target, "series-area"); if (this.bandHighlightGroup.visible && !isSeriesAreaChild) { this.hideBand(); this.ctx.updateService.update(import_ag_charts_core89.ChartUpdateType.SCENE_RENDER); } }); const { widgets: { seriesWidget, seriesDragInterpreter }, animationManager, eventsHub } = ctx; this.cleanup.register( ctx.scene.attachNode(this.bandHighlightGroup), seriesWidget.addListener("mousemove", (event) => this.onHoverLikeEvent(event)), seriesWidget.addListener("mouseleave", () => this.clearAllHighlight()), animationManager.addListener("animation-start", () => this.clearAllHighlight()), eventsHub.on("layout:complete", (event) => this.layout(event)), eventsHub.on("series:focus-change", () => this.onKeyPress()), eventsHub.on("zoom:pan-start", () => this.clearAllHighlight()), eventsHub.on("zoom:change-complete", () => this.clearAllHighlight()), eventsHub.on("dom:resize", () => this.clearAllHighlight()), eventsHub.on("axis:change", () => this.axisChange()) ); if (seriesDragInterpreter) { this.cleanup.register( seriesDragInterpreter.events.on("drag-move", (event) => this.onHoverLikeEvent(event)), seriesDragInterpreter.events.on("click", (event) => this.onClick(event)) ); } } axisChange() { this.onHighlightChange(); } isHover(event) { return event.type === "mousemove" || event.type === "click" || event.device === "touch" && this.ctx.chartService.touch.dragAction === "hover"; } onClick(event) { if (event.device === "touch") { this.onHoverLikeEvent(event); } } clearAllHighlight() { if (!this.ctx.interactionManager.isState(InteractionState3.Clickable)) return; this.onHighlightChange(); } onKeyPress() { if (this.ctx.interactionManager.isState(InteractionState3.Default)) { this.onHighlightChange(); } } onHoverLikeEvent(event) { const requiredState = this.isHover(event) ? InteractionState3.Clickable : InteractionState3.AnnotationsMoveable; if (!this.ctx.interactionManager.isState(requiredState)) return; this.handleHoverHighlight(event); } handleHoverHighlight(event) { if (!event) return; const { currentX: x, currentY: y } = event; this.onHighlightChange(this.axisCtx.pickBand({ x, y })); } layout({ series: { rect, visible }, axes }) { if (!visible || !axes || !this.enabled) return; const { position: axisPosition = "left", axisId } = this.axisCtx; const axisLayout = axes[axisId]; if (!axisLayout) return; this.axisLayout = axisLayout; this.bounds = rect.clone().grow(axisLayout.gridPadding, axisPosition); const { bandHighlightGroup, bounds } = this; bandHighlightGroup.translationX = Math.round(bounds.x); bandHighlightGroup.translationY = Math.round(bounds.y); this.updateBand(); } updateBand() { const { rangeNode: node, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, fill, fillOpacity, fillGradientDefaults: fillGradientDefaults3, fillPatternDefaults: fillPatternDefaults3, fillImageDefaults: fillImageDefaults3, lineDashOffset, axisLayout } = this; if (!axisLayout) return; node.stroke = stroke3; node.strokeWidth = strokeWidth; node.strokeOpacity = strokeOpacity; node.lineDash = lineDash; node.lineDashOffset = lineDashOffset; node.fill = getShapeFill(fill, fillGradientDefaults3, fillPatternDefaults3, fillImageDefaults3); node.fillOpacity = fillOpacity; node.startLine = true; node.endLine = true; } isVertical() { return this.axisCtx.direction === import_ag_charts_core89.ChartAxisDirection.X; } onHighlightChange(axisBandDatum) { if (!this.enabled) return; this.activeAxisHighlight = axisBandDatum; if (this.activeAxisHighlight) { this.showBand(); } else { this.hideBand(); } this.ctx.updateService.update(import_ag_charts_core89.ChartUpdateType.SCENE_RENDER); } updateBandPosition() { const { rangeNode, bounds } = this; const { band } = this.activeAxisHighlight ?? {}; if (band == void 0) { this.hideBand(); return; } let r0 = Math.min(...band); let r1 = Math.max(...band); if (r1 - r0 < 1) { const mid = (r0 + r1) / 2; r0 = mid - 0.5; r1 = mid + 0.5; } if (this.isVertical()) { rangeNode.y1 = 0; rangeNode.y2 = bounds.height; rangeNode.x1 = r0; rangeNode.x2 = r1; rangeNode.horizontal = true; } else { rangeNode.y1 = r0; rangeNode.y2 = r1; rangeNode.x1 = 0; rangeNode.x2 = bounds.width; rangeNode.horizontal = false; } } showBand() { this.updateBandPosition(); this.bandHighlightGroup.visible = true; } hideBand() { this.bandHighlightGroup.visible = false; } }; BandHighlight.className = "BandHighlight"; __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "fill", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "fillGradientDefaults", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "fillPatternDefaults", 2); __decorateClass([ import_ag_charts_core89.Property ], BandHighlight.prototype, "fillImageDefaults", 2); // packages/ag-charts-enterprise/src/features/band-highlight/bandHighlightModule.ts var BandHighlightModule = { type: "axis:plugin", name: "bandHighlight", chartType: "cartesian", axisTypes: ["category", "ordinal-time", "unit-time", "grouped-category"], enterprise: true, version: import_ag_charts_community71.VERSION, themeTemplate: { enabled: false, strokeWidth: 0, lineDash: [], fill: { $foregroundBackgroundMix: 0.05 } }, create: (ctx) => new BandHighlight(ctx) }; // packages/ag-charts-enterprise/src/features/chart-toolbar/chartToolbarModule.ts var import_ag_charts_community73 = require("ag-charts-community"); var import_ag_charts_core91 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/chart-toolbar/chartToolbar.ts var import_ag_charts_community72 = require("ag-charts-community"); var import_ag_charts_core90 = require("ag-charts-core"); var { LayoutElement: LayoutElement2, Menu: Menu3 } = import_ag_charts_community72._ModuleSupport; var menuItems = [ { label: "toolbarSeriesTypeOHLC", icon: "ohlc-series", value: "ohlc" }, { label: "toolbarSeriesTypeCandles", icon: "candlestick-series", value: "candlestick" }, { label: "toolbarSeriesTypeHollowCandles", icon: "hollow-candlestick-series", value: "hollow-candlestick" }, { label: "toolbarSeriesTypeLine", icon: "line-series", value: "line" }, { label: "toolbarSeriesTypeStepLine", icon: "step-line-series", value: "step-line" }, { label: "toolbarSeriesTypeHLC", icon: "hlc-series", value: "hlc" }, { label: "toolbarSeriesTypeHighLow", icon: "high-low-series", value: "high-low" } ]; var ChartToolbar = class extends import_ag_charts_core90.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.enabled = false; this.menu = new Menu3(this.ctx, "chart-toolbar"); this.toolbar = ctx.sharedToolbar.getSharedToolbar("chartToolbar"); this.cleanup.register( this.toolbar.addToolbarListener("button-pressed", this.onButtonPressed.bind(this)), ctx.layoutManager.registerElement(LayoutElement2.ToolbarLeft, this.onLayoutStart.bind(this)), () => this.toolbar.destroy() ); } onLayoutStart(ctx) { if (!this.enabled) return; this.updateButton(); this.toolbar.layout(ctx.layoutBox); } onButtonPressed({ event, buttonBounds, buttonWidget }) { this.menu.setAnchor({ x: buttonBounds.x + buttonBounds.width + 6, y: buttonBounds.y }); this.menu.show(buttonWidget, { items: menuItems, menuItemRole: "menuitemradio", ariaLabel: this.ctx.localeManager.t("toolbarSeriesTypeDropdown"), class: "ag-charts-chart-toolbar__menu", value: this.getChartType(), sourceEvent: event.sourceEvent, onPress: (item) => { this.setChartType(item.value); this.hidePopover(); }, onHide: () => { this.toolbar.clearActiveButton(); } }); this.toolbar.toggleActiveButtonByIndex(0); } updateButton() { const chartType = this.getChartType(); const icon = menuItems.find((item) => item.value === chartType)?.icon; if (icon != null) { this.toolbar.updateButtons([{ icon, tooltip: "toolbarSeriesTypeDropdown", value: "menu" }]); } } hidePopover() { this.toolbar.clearActiveButton(); this.menu.hide(); } setChartType(chartType) { const options = { chartType }; this.ctx.chartService.publicApi?.updateDelta(options).catch((e) => import_ag_charts_core90.Logger.error(e)); } getChartType() { const chartType = this.ctx.chartService.publicApi?.getOptions()?.chartType; if (chartType == null || !menuItems.some((item) => item.value === chartType)) { return "candlestick"; } return chartType; } }; __decorateClass([ import_ag_charts_core90.Property, (0, import_ag_charts_core90.ActionOnSet)({ changeValue(enabled) { this.toolbar?.setHidden(!enabled); } }) ], ChartToolbar.prototype, "enabled", 2); // packages/ag-charts-enterprise/src/features/chart-toolbar/chartToolbarModule.ts var ChartToolbarModule = { type: "plugin", name: "chartToolbar", chartType: "cartesian", enterprise: true, version: import_ag_charts_community73.VERSION, options: { enabled: import_ag_charts_core91.boolean }, create: (ctx) => new ChartToolbar(ctx), patchContext: (ctx) => { if (ctx.sharedToolbar) return; ctx.sharedToolbar = new SharedToolbar(ctx); ctx.cleanup.register(() => ctx.sharedToolbar.destroy()); } }; // packages/ag-charts-enterprise/src/features/context-menu/contextMenuModule.ts var import_ag_charts_community75 = require("ag-charts-community"); var import_ag_charts_core94 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/context-menu/contextMenu.ts var import_ag_charts_community74 = require("ag-charts-community"); var import_ag_charts_core93 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/context-menu/contextMenuItem.ts var import_ag_charts_core92 = require("ag-charts-core"); function showsFor(showOn, showing) { if (showOn === "always") return true; if (showOn === "series-area") return showing === "series-area" || showing === "series-node"; return showOn === showing; } function appendItem(showing, item, result) { let mustShow = true; if (item.type === "separator") { const last = result.at(-1); mustShow = last !== void 0 && last.type !== "separator"; } mustShow && (mustShow = showsFor(item.showOn ?? "always", showing)); if (mustShow) { const menuItem = new ContextMenuItem(item); result.push(menuItem); return menuItem; } } function appendBuiltinItem(showing, registry, keyword, result) { if (registry.isVisible(keyword)) { appendItem(showing, registry.builtins.items[keyword], result); } } function expandBuiltin(showing, registry, keyword, result) { const { builtins } = registry; if ((0, import_ag_charts_core92.isKeyOf)(keyword, builtins.lists)) { for (const childKeyword of builtins.lists[keyword]) { appendBuiltinItem(showing, registry, childKeyword, result); } } else { appendBuiltinItem(showing, registry, keyword, result); } } function expandBuiltinLists(showing, items, registry) { const unfiltered = []; const { builtins } = registry; for (const it of items) { if (typeof it === "string" && (0, import_ag_charts_core92.isKeyOf)(it, builtins.lists)) { for (const listItem of builtins.lists[it]) { unfiltered.push(listItem); } } else { unfiltered.push(it); } } return unfiltered.filter((it) => { if (typeof it === "string") { const showOn = registry.builtins.items[it].showOn ?? "always"; return registry.isVisible(it) && showsFor(showOn, showing); } else { return showsFor(it.showOn ?? "always", showing); } }); } function expandItems(showing, registry, items, result) { for (const item of items) { if (typeof item === "string") { expandBuiltin(showing, registry, item, result); } else { const menuItem = appendItem(showing, item, result); if (item.items && menuItem && item.items.length > 0) { expandItems(showing, registry, item.items, menuItem.items); } } } if (result.at(-1)?.type === "separator") { result.pop(); } } var ContextMenuItem = class { constructor(options) { this.type = "action"; this.showOn = "always"; this.label = ""; this.iconUrl = void 0; this.enabled = true; this.items = []; this.action = void 0; if (options) this.setOptions(options); this.items = []; } setField(key, that, value) { that[key] = value; } setOptions(options) { let key; for (key in options) { if (options[key] !== void 0) { this.setField(key, this, options[key]); } } } }; // packages/ag-charts-enterprise/src/features/context-menu/contextMenuStyles.ts var DEFAULT_CONTEXT_MENU_CLASS = "ag-charts-context-menu"; // packages/ag-charts-enterprise/src/features/context-menu/contextMenu.ts var { ContextMenuRegistry } = import_ag_charts_community74._ModuleSupport; var moduleId2 = "context-menu"; var DATUM_KEYS = [ "angleKey", "calloutLabelKey", "colorKey", "labelKey", "radiusKey", "sectorLabelKey", "sizeKey", "xKey", "yKey" ]; var ContextMenu = class extends import_ag_charts_core93.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.enabled = true; this.darkTheme = false; this.items = ["defaults"]; // State this.pickedNode = void 0; this.showEvent = void 0; this.x = 0; this.y = 0; this.collapsingSubMenus = 0; this.menuWidget = new import_ag_charts_community74._Widget.MenuWidget(); this.interactionManager = ctx.interactionManager; this.element = ctx.domManager.addChild("canvas-overlay", moduleId2); this.element.classList.add(DEFAULT_CONTEXT_MENU_CLASS); this.element.style.display = "none"; this.element.addEventListener("contextmenu", (event) => event.preventDefault()); this.element.addEventListener("focusout", ({ relatedTarget }) => { if (this.collapsingSubMenus > 0) return; if (relatedTarget == null || relatedTarget instanceof Node && !this.element.contains(relatedTarget)) { this.hide(); } }); this.cleanup.register( () => this.element.remove(), () => this.menuWidget.destroy(), ctx.eventsHub.on("dom:hidden", () => this.hide()), this.menuWidget.addListener("collapse-widget", () => this.onCollapse()) ); this.menuWidget.addClass(`${DEFAULT_CONTEXT_MENU_CLASS}__menu`); if (typeof MutationObserver !== "undefined") { const observer = new MutationObserver(() => { if (this.element.contains(this.menuWidget.getElement())) { this.reposition(); } }); observer.observe(this.element, { childList: true }); this.mutationObserver = observer; this.cleanup.register(() => observer.disconnect()); } this.ctx.contextMenuRegistry.builtins.items["download"].action = () => { const title = ctx.chartService.title; let fileName = "image"; if (title?.enabled) { fileName = title.node.getPlainText().replace(/\.+/, ""); } this.ctx.chartService.publicApi?.download({ fileName }).catch((e) => { import_ag_charts_core93.Logger.error("Unable to download chart", e); }); }; this.cleanup.register(this.ctx.eventsHub.on("context-menu:complete", (e) => this.onContext(e))); } makeGetItemsParams(event) { const { showOn } = event; const { context } = this.ctx.chartService; const defaultItems = expandBuiltinLists(showOn, this.items, this.ctx.contextMenuRegistry); switch (showOn) { case "always": case "series-area": return { showOn, context, defaultItems }; case "series-node": { if (this.pickedNode == null) throw new Error(`this.pickedNode is null`); const params = { showOn, context, seriesId: this.pickedNode.series.id, datum: this.pickedNode.datum, defaultItems }; for (const k of DATUM_KEYS) { if (this.pickedNode[k] !== void 0) { params[k] = this.pickedNode[k]; } } return params; } case "legend-item": if (this.pickedLegendItem == null) throw new Error(`this.pickedLegendItem is null`); const { itemId, seriesId, label, enabled } = this.pickedLegendItem; const text2 = (0, import_ag_charts_core93.toPlainText)(label.text); if (typeof itemId !== "string") { throw new Error(`unexpected itemId type: [${typeof itemId}] (expected [string])`); } return { showOn, context, itemId, seriesId, text: text2, visible: enabled, defaultItems }; default: return showOn; } } expandItemsOptions(event) { const result = []; let items; if (this.getItems) { const cbParams = this.makeGetItemsParams(event); items = this.getItems(cbParams); } items ?? (items = this.items); expandItems(event.showOn, this.ctx.contextMenuRegistry, items, result); return result; } onContext(event) { if (!this.enabled) return; event.widgetEvent.sourceEvent.preventDefault(); this.showEvent = event.widgetEvent.sourceEvent; this.x = event.x; this.y = event.y; this.pickedNode = void 0; this.pickedLegendItem = void 0; if (ContextMenuRegistry.check("series-node", event)) { this.pickedNode = event.context.pickedNode; } else if (ContextMenuRegistry.check("legend-item", event)) { this.pickedLegendItem = event.context.legendItem; } const expandedItems = this.expandItemsOptions(event); if (expandedItems.length === 0) return; this.show(event.widgetEvent, expandedItems); } show(widgetEvent, expandedItems) { const { sourceEvent } = widgetEvent; this.interactionManager.pushState(import_ag_charts_community74._ModuleSupport.InteractionState.ContextMenu); this.element.style.display = "block"; const overrideFocusVisible = sourceEvent.pointerType === "touch" ? false : void 0; if (overrideFocusVisible !== void 0) { this.ctx.chartService.overrideFocusVisible(overrideFocusVisible); } this.createMenu(expandedItems); this.element.appendChild(this.menuWidget.getElement()); this.menuWidget.expand({ sourceEvent, overrideFocusVisible }); } hide() { this.menuWidget.collapse(); } onCollapse() { this.interactionManager.popState(import_ag_charts_community74._ModuleSupport.InteractionState.ContextMenu); this.menuWidget.getElement().remove(); this.element.style.display = "none"; } onSubMenuExpand(button, menu) { const bounds = button.getBounds(); button.setFocusOverride(true); button.getElement().insertAdjacentElement("afterend", menu.getElement()); menu.getElement().style.position = "absolute"; const canvasRect = this.ctx.domManager.getBoundingClientRect(); const buttonClientRect = button.getBoundingClientRect(); const remainingSpaceOnRight = canvasRect.right - buttonClientRect.right; const remainingSpaceOnLeft = buttonClientRect.left - canvasRect.left; const { offsetWidth: menuOffsetWidth, offsetHeight: menuOffsetHeight } = menu.getElement(); let y = bounds.y; if (canvasRect.height > menuOffsetHeight) { const remainingSpaceOnBottom = canvasRect.bottom - buttonClientRect.top; if (remainingSpaceOnBottom < menuOffsetHeight) { y -= menuOffsetHeight - remainingSpaceOnBottom; } } if (remainingSpaceOnRight >= menuOffsetWidth) { menu.setBounds({ x: bounds.x + bounds.width, y }); } else { const x = bounds.x - menuOffsetWidth; const leftDelta = remainingSpaceOnLeft + x; if (leftDelta >= 0) { menu.setBounds({ x, y }); } else { menu.setBounds({ x: x - leftDelta, y }); } } } onSubMenuCollapse(button, menu) { button.setFocusOverride(void 0); this.collapsingSubMenus++; menu.remove(); this.collapsingSubMenus--; } createMenu(expandedItems) { const { menuWidget } = this; menuWidget.clear(); menuWidget.setTabIndex(-1); this.createMenuItems(menuWidget, expandedItems); } createMenuItems(menuWidget, expandedItems) { for (const item of expandedItems) { switch (item.type) { case "separator": { const sep = menuWidget.addSeparator(); sep.classList.add(`${DEFAULT_CONTEXT_MENU_CLASS}__divider`); break; } case "action": { if (item.items.length === 0) { const btn = new import_ag_charts_community74._Widget.MenuItemWidget(); this.initButtonElement(btn, item); menuWidget.addChild(btn); } else { const { subMenuButton, subMenu } = menuWidget.addSubMenu(); subMenu.addClass(`${DEFAULT_CONTEXT_MENU_CLASS}__menu`); subMenu.addListener("expand-widget", () => this.onSubMenuExpand(subMenuButton, subMenu)); subMenu.addListener("collapse-widget", () => this.onSubMenuCollapse(subMenuButton, subMenu)); this.initButtonElement(subMenuButton, item); this.createMenuItems(subMenu, item.items); } break; } default: throw new Error("unhandled case"); } } } createButtonOnClick(showOn, callback4) { if (ContextMenuRegistry.checkCallback("legend-item", showOn, callback4)) { return (widgetEvent) => { const event = widgetEvent.sourceEvent; if (this.pickedLegendItem) { const { seriesId, itemId, label } = this.pickedLegendItem; const { chartService: chart } = this.ctx; if (typeof itemId !== "string") { import_ag_charts_core93.Logger.error(`unexpected itemId type: [${typeof itemId}] (expected [string])`); return; } const series = chart.series.find((s) => s.id === seriesId); const callers = [series?.properties, chart]; const apiEvent = { type: "contextmenu", seriesId, itemId, text: (0, import_ag_charts_core93.toPlainText)(label.text), event }; (0, import_ag_charts_core93.callWithContext)(callers, callback4, apiEvent); this.hide(); } else { import_ag_charts_core93.Logger.error("legend item not found"); } }; } else if (ContextMenuRegistry.checkCallback("series-area", showOn, callback4)) { return () => { const caller = this.ctx.chartService; const apiEvent = { type: "seriesContextMenuAction", event: this.showEvent }; (0, import_ag_charts_core93.callWithContext)(caller, callback4, apiEvent); this.hide(); }; } else if (ContextMenuRegistry.checkCallback("series-node", showOn, callback4)) { return () => { const { showEvent } = this; const { chartService: chart } = this.ctx; const pickedNode = this.pickedNode; const callers = [pickedNode?.series.properties, chart]; const apiEvent = pickedNode?.series.createNodeContextMenuActionEvent(showEvent, pickedNode); if (apiEvent) { (0, import_ag_charts_core93.callWithContext)(callers, callback4, apiEvent); } else { import_ag_charts_core93.Logger.error("series node not found"); } this.hide(); }; } return () => { const caller = this.ctx.chartService; const apiEvent = { type: "contextMenuEvent", event: this.showEvent }; (0, import_ag_charts_core93.callWithContext)(caller, callback4, apiEvent); this.hide(); }; } initTableCells(elem) { const cellIcon = (0, import_ag_charts_core93.createElement)("div"); const cellLabel = (0, import_ag_charts_core93.createElement)("div"); const cellArrow = (0, import_ag_charts_core93.createElement)("div"); cellIcon.classList.toggle(`${DEFAULT_CONTEXT_MENU_CLASS}__icon`, true); cellLabel.classList.toggle(`${DEFAULT_CONTEXT_MENU_CLASS}__cell`, true); cellArrow.classList.toggle(`${DEFAULT_CONTEXT_MENU_CLASS}__cell`, true); cellIcon.ariaHidden = "true"; cellLabel.role = "presentation"; cellArrow.ariaHidden = "true"; elem.append(cellIcon, cellLabel, cellArrow); return { cellIcon, cellLabel, cellArrow }; } initButtonElement(button, item) { button.addClass(`${DEFAULT_CONTEXT_MENU_CLASS}__item`); button.setEnabled(item.enabled); const label = this.ctx.localeManager.t(item.label); const cellPaddingClass = `${DEFAULT_CONTEXT_MENU_CLASS}__cellpadding`; const { cellIcon, cellLabel, cellArrow } = this.initTableCells(button.getElement()); cellLabel.textContent = label; cellLabel.classList.add(cellPaddingClass); if (item.iconUrl != null) { const img = (0, import_ag_charts_core93.createElement)("img"); img.src = item.iconUrl; cellIcon.append(img); cellIcon.classList.add(cellPaddingClass); } if (item.items.length > 0) { const span = (0, import_ag_charts_core93.createElement)("span", (0, import_ag_charts_core93.getIconClassNames)("chevron-right")); cellArrow.append(span); cellArrow.classList.add(cellPaddingClass); } const { showOn, action } = item; if (action != null) { button.addListener("click", this.createButtonOnClick(showOn, action)); } if (item.items.length === 0) { button.addListener("mouseleave", () => button.setFocusOverride(false)); button.addListener("mouseenter", () => button.setFocusOverride(void 0)); } } reposition() { let { x, y } = this; this.element.style.top = "unset"; this.element.style.bottom = "unset"; const canvasRect = this.ctx.domManager.getBoundingClientRect(); const { offsetWidth: width, offsetHeight: height } = this.element; x = (0, import_ag_charts_core93.clamp)(0, x, canvasRect.width - width); y = (0, import_ag_charts_core93.clamp)(0, y, canvasRect.height - height); this.element.style.left = `${x}px`; this.element.style.top = `calc(${y}px - 0.5em)`; } destroy() { super.destroy(); this.mutationObserver?.disconnect(); this.ctx.domManager.removeStyles(moduleId2); this.ctx.domManager.removeChild("canvas-overlay", moduleId2); } }; __decorateClass([ import_ag_charts_core93.Property ], ContextMenu.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core93.Property ], ContextMenu.prototype, "darkTheme", 2); __decorateClass([ import_ag_charts_core93.Property ], ContextMenu.prototype, "items", 2); __decorateClass([ import_ag_charts_core93.Property ], ContextMenu.prototype, "getItems", 2); // packages/ag-charts-enterprise/src/features/context-menu/contextMenuModule.ts var ContextMenuModule = { type: "plugin", name: "contextMenu", enterprise: true, version: import_ag_charts_community75.VERSION, options: { enabled: import_ag_charts_core94.boolean, items: import_ag_charts_core94.contextMenuItemsArray, getItems: (0, import_ag_charts_core94.callbackOf)(import_ag_charts_core94.contextMenuItemsArray, "a menu items array") }, themeTemplate: { enabled: true, darkTheme: import_ag_charts_core94.IS_DARK_THEME }, create: (ctx) => new ContextMenu(ctx) }; ContextMenuModule.options.darkTheme = (0, import_ag_charts_core94.undocumented)(import_ag_charts_core94.boolean); // packages/ag-charts-enterprise/src/features/crosshair/crosshairModule.ts var import_ag_charts_community78 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/features/crosshair/crosshair.ts var import_ag_charts_community77 = require("ag-charts-community"); var import_ag_charts_core96 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/utils/datum.ts function readDatum(nodeDatum) { if (typeof nodeDatum?.datum === "object") { return nodeDatum.datum; } return null; } // packages/ag-charts-enterprise/src/features/crosshair/crosshairLabel.ts var import_ag_charts_community76 = require("ag-charts-community"); var import_ag_charts_core95 = require("ag-charts-core"); var { FormatManager } = import_ag_charts_community76._ModuleSupport; var DEFAULT_LABEL_CLASS = "ag-charts-crosshair-label"; var CrosshairLabelProperties = class extends import_ag_charts_core95.BaseProperties { constructor() { super(...arguments); this.enabled = true; this.xOffset = 0; this.yOffset = 0; this.format = void 0; this.renderer = void 0; this._cachedFormatter = void 0; } formatValue(callWithContext3, type, value, params) { const { formatter, format } = this; const { domain, boundSeries } = params; let result; if (formatter != null) { const fractionDigits = params.type === "number" ? params.fractionDigits : void 0; const unit = params.type === "date" ? params.unit : void 0; const step = params.type === "date" ? params.step : void 0; result = callWithContext3(formatter, { value, domain, fractionDigits, unit, step, boundSeries }); } if (format != null) { let cachedFormatter = this._cachedFormatter; if (cachedFormatter?.type !== type || cachedFormatter?.format !== format) { cachedFormatter = { type, format, formatter: FormatManager.getFormatter(type, format) }; this._cachedFormatter = cachedFormatter; } result ?? (result = cachedFormatter.formatter?.(value)); } return result == null ? void 0 : String(result); } }; __decorateClass([ import_ag_charts_core95.Property ], CrosshairLabelProperties.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core95.Property ], CrosshairLabelProperties.prototype, "xOffset", 2); __decorateClass([ import_ag_charts_core95.Property ], CrosshairLabelProperties.prototype, "yOffset", 2); __decorateClass([ import_ag_charts_core95.Property ], CrosshairLabelProperties.prototype, "formatter", 2); __decorateClass([ import_ag_charts_core95.Property ], CrosshairLabelProperties.prototype, "format", 2); __decorateClass([ import_ag_charts_core95.Property ], CrosshairLabelProperties.prototype, "renderer", 2); var CrosshairLabel = class extends CrosshairLabelProperties { constructor(domManager, key, axisId) { super(); this.domManager = domManager; this.id = (0, import_ag_charts_core95.createId)(this); this.element = domManager.addChild("canvas-overlay", `crosshair-label-${this.id}`); this.element.classList.add(DEFAULT_LABEL_CLASS); (0, import_ag_charts_core95.setAttribute)(this.element, "aria-hidden", true); this.element.dataset.key = key; this.element.dataset.axisId = axisId; } show(meta) { const { element } = this; const left = meta.x + this.xOffset; const top = meta.y + this.yOffset; element.style.top = `${Math.round(top)}px`; element.style.left = `${Math.round(left)}px`; this.toggle(true); } setLabelHtml({ html, styles }) { if (html !== void 0) { this.element.innerHTML = html; } if (styles !== void 0) { const styleElement = this.element.children[0] ?? this.element; Object.assign(styleElement.style, styles); } } getBBox() { const { element } = this; return new import_ag_charts_community76._ModuleSupport.BBox( element.clientLeft, element.clientTop, element.clientWidth, element.clientHeight ); } toggle(visible) { this.element.classList.toggle(`ag-charts-crosshair-label--hidden`, !visible); } destroy() { this.domManager.removeChild("canvas-overlay", `crosshair-label-${this.id}`); } toLabelHtml(input, defaults) { if (typeof input === "string") { return { html: input, styles: {} }; } defaults = defaults ?? {}; const { text: text2 = defaults.text ?? "", color: color7 = defaults.color, backgroundColor = defaults.backgroundColor, opacity = defaults.opacity ?? 1 } = input; const styles = { opacity, "background-color": backgroundColor?.toLowerCase(), color: color7 }; return { html: `
${text2}
`, styles }; } }; CrosshairLabel.className = "CrosshairLabel"; // packages/ag-charts-enterprise/src/features/crosshair/crosshair.ts var { Group: Group5, TranslatableGroup: TranslatableGroup2, Line: Line4, BBox: BBox5, InteractionState: InteractionState4 } = import_ag_charts_community77._ModuleSupport; var Crosshair = class extends import_ag_charts_core96.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.id = (0, import_ag_charts_core96.createId)(this); this.enabled = false; this.stroke = "rgb(195, 195, 195)"; this.lineDash = [6, 3]; this.lineDashOffset = 0; this.strokeWidth = 1; this.strokeOpacity = 1; this.snap = true; this.label = new CrosshairLabelProperties(); this.seriesRect = new BBox5(0, 0, 0, 0); this.bounds = new BBox5(0, 0, 0, 0); this.crosshairGroup = new TranslatableGroup2({ name: "crosshairs", zIndex: import_ag_charts_core96.ZIndexMap.SERIES_CROSSHAIR }); this.lineGroup = this.crosshairGroup.appendChild( new Group5({ name: `${this.id}-crosshair-lines`, zIndex: import_ag_charts_core96.ZIndexMap.SERIES_CROSSHAIR }) ); this.lineGroupSelection = import_ag_charts_community77._ModuleSupport.Selection.select(this.lineGroup, Line4, false); this.activeHighlight = void 0; this.axisCtx = ctx.parent; this.labels = {}; this.hideCrosshairs(); ctx.domManager.addEventListener("focusin", ({ target }) => { if (this.checkInteractionState()) return; const isSeriesAreaChild = target instanceof HTMLElement && ctx.domManager.contains(target, "series-area"); if (this.crosshairGroup.visible && !isSeriesAreaChild) { this.hideCrosshairs(); this.ctx.updateService.update(import_ag_charts_core96.ChartUpdateType.SCENE_RENDER); } }); const { seriesDragInterpreter } = ctx.widgets; this.cleanup.register( ctx.scene.attachNode(this.crosshairGroup), ctx.widgets.seriesWidget.addListener("mousemove", (event) => this.onMouseHoverLike(event)), ctx.widgets.seriesWidget.addListener("mouseleave", () => this.onMouseOut()), ctx.eventsHub.on("series:focus-change", () => this.onKeyPress()), ctx.eventsHub.on("zoom:pan-start", () => this.onMouseOut()), ctx.eventsHub.on("zoom:change-complete", () => this.onMouseOut()), ctx.eventsHub.on("highlight:change", (event) => this.onHighlightChange(event)), ctx.eventsHub.on("layout:complete", (event) => this.layout(event)), () => { for (const label of Object.values(this.labels)) { label.destroy(); } } ); if (seriesDragInterpreter) { this.cleanup.register( seriesDragInterpreter.events.on("drag-move", (event) => this.onMouseHoverLike(event)), seriesDragInterpreter.events.on("click", (event) => this.onClick(event)) ); } } checkInteractionState() { return this.ctx.interactionManager.isState(InteractionState4.Frozen); } layout({ series: { rect, visible }, axes }) { if (!visible || !axes || !this.enabled) return; this.seriesRect = rect; const { position: axisPosition = "left", axisId } = this.axisCtx; const axisLayout = axes[axisId]; if (!axisLayout) return; this.axisLayout = axisLayout; this.bounds = rect.clone().grow(axisLayout.gridPadding + axisLayout.seriesAreaPadding, axisPosition); const { crosshairGroup, bounds } = this; crosshairGroup.translationX = Math.round(bounds.x); crosshairGroup.translationY = Math.round(bounds.y); const crosshairKeys = ["pointer", ...this.axisCtx.seriesKeyProperties()]; this.updateSelections(crosshairKeys); this.updateLines(); this.updateLabels(crosshairKeys); this.refreshPositions(); } updateSelections(data) { this.lineGroupSelection.update(data, void 0, (key) => key); } updateLabels(keys) { const { labels, ctx } = this; for (const key of keys) { if (this.label.enabled) { labels[key] ?? (labels[key] = new CrosshairLabel(ctx.domManager, key, this.axisCtx.axisId)); } if (labels[key]) { this.updateLabel(labels[key]); } } } updateLabel(label) { const { enabled, xOffset, yOffset, format, renderer } = this.label; label.enabled = enabled; label.xOffset = xOffset; label.yOffset = yOffset; label.format = format; label.renderer = renderer; } updateLines() { const { lineGroupSelection, bounds, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, axisLayout } = this; if (!axisLayout) return; const isVertical = this.isVertical(); lineGroupSelection.each((line) => { line.stroke = stroke3; line.strokeWidth = strokeWidth; line.strokeOpacity = strokeOpacity; line.lineDash = lineDash; line.lineDashOffset = lineDashOffset; line.y1 = 0; line.y2 = isVertical ? bounds.height : 0; line.x1 = 0; line.x2 = isVertical ? 0 : bounds.width; }); } isVertical() { return this.axisCtx.direction === import_ag_charts_core96.ChartAxisDirection.X; } isHover(event) { return event.type === "mousemove" || event.type === "click" || event.device === "touch" && this.ctx.chartService.touch.dragAction === "hover"; } formatValue(value) { return (0, import_ag_charts_core96.toPlainText)(this.axisCtx.formatScaleValue(value, "crosshair", this.label)); } onClick(event) { if (event.device === "touch") { this.onMouseHoverLike(event); } } onMouseHoverLike(event) { if (!this.enabled || this.snap) return; const requiredState = this.isHover(event) ? InteractionState4.Clickable : InteractionState4.AnnotationsMoveable; if (!this.ctx.interactionManager.isState(requiredState)) return; this.updatePositions(this.getData(event)); this.crosshairGroup.visible = true; this.ctx.updateService.update(import_ag_charts_core96.ChartUpdateType.SCENE_RENDER); } onMouseOut() { if (!this.ctx.interactionManager.isState(InteractionState4.Clickable)) return; this.hideCrosshairs(); this.ctx.updateService.update(import_ag_charts_core96.ChartUpdateType.SCENE_RENDER); } onKeyPress() { if (this.enabled && !this.snap && this.ctx.interactionManager.isState(InteractionState4.Default)) { this.hideCrosshairs(); } } onHighlightChange(event) { if (!this.enabled) return; const { crosshairGroup, axisCtx } = this; const { datum, series } = event.currentHighlight ?? {}; const hasCrosshair = datum && (series?.axes.x?.id === axisCtx.axisId || series?.axes.y?.id === axisCtx.axisId); this.activeHighlight = hasCrosshair ? event.currentHighlight : void 0; if (!this.activeHighlight) { this.hideCrosshairs(); } else if (this.snap) { const activeHighlightData = this.getActiveHighlightData(this.activeHighlight); this.updatePositions(activeHighlightData); crosshairGroup.visible = true; } } isInRange(value) { return this.axisCtx.inRange(value); } refreshPositions() { if (this.activeHighlight) { this.updatePositions(this.getActiveHighlightData(this.activeHighlight)); } } updatePositions(data) { const { seriesRect, lineGroupSelection } = this; lineGroupSelection.each((line, key) => { const lineData = data[key]; if (!lineData) { line.visible = false; this.hideLabel(key); return; } line.visible = true; const { value, position } = lineData; let x = 0; let y = 0; if (this.isVertical()) { x = position; line.x = Math.round(x); } else { y = position; line.y = Math.round(y); } if (this.label.enabled) { this.showLabel(x + seriesRect.x, y + seriesRect.y, value, key); } else { this.hideLabel(key); } }); } getData(event) { const { axisCtx } = this; const key = "pointer"; const { xKey = "", yKey = "" } = this.activeHighlight ?? {}; const { currentX, currentY } = event; const datum = readDatum(this.activeHighlight); const isVertical = this.isVertical(); const position = isVertical ? currentX : currentY; let value = datum?.[isVertical ? xKey : yKey] ?? ""; if (axisCtx.continuous) { value = axisCtx.scaleInvert(position); } return { [key]: { position, value } }; } getActiveHighlightData(activeHighlight) { const { axisCtx } = this; const { series, xKey = "", aggregatedValue, cumulativeValue, midPoint } = activeHighlight; const datum = readDatum(activeHighlight); const seriesKeyProperties = series.getKeyProperties(axisCtx.direction); const halfBandwidth = (axisCtx.scale.bandwidth ?? 0) / 2; const matchingAxisId = series.axes[axisCtx.direction]?.id === axisCtx.axisId; const isYKey = seriesKeyProperties.includes("yKey") && matchingAxisId; const isXKey = seriesKeyProperties.includes("xKey") && matchingAxisId; const datumValue = aggregatedValue ?? cumulativeValue; if (isYKey && datumValue !== void 0) { const position = axisCtx.scale.convert(datumValue) + halfBandwidth; const isInRange = this.isInRange(position); return isInRange ? { yKey: { value: datumValue, position } } : {}; } if (isXKey) { const position = (this.isVertical() ? midPoint?.x : midPoint?.y) ?? 0; const value = axisCtx.continuous ? axisCtx.scaleInvert(position) : datum?.[xKey]; return this.isInRange(position) ? { xKey: { value, position } } : {}; } const activeHighlightData = {}; for (const key of seriesKeyProperties) { const keyValue = series.properties[key]; const value = datum?.[keyValue]; const position = axisCtx.scale.convert(value) + halfBandwidth; const isInRange = this.isInRange(position); if (isInRange) { activeHighlightData[key] = { value, position }; } } return activeHighlightData; } getLabelHtml(value, label) { const fractionDigits = this.axisLayout?.label?.fractionDigits ?? 0; const defaults = { text: this.formatValue(value) }; if (this.label.renderer) { return label.toLabelHtml(this.label.renderer({ value, fractionDigits }), defaults); } return label.toLabelHtml(defaults); } showLabel(x, y, value, key) { if (!this.axisLayout) return; const { bounds } = this; const label = this.labels[key]; const html = this.getLabelHtml(value, label); label.setLabelHtml(html); const { width, height } = label.getBBox(); const axisPosition = this.axisCtx.position; let padding2 = this.axisLayout.label.spacing + this.axisLayout.tickSize; if (this.axisCtx.direction === import_ag_charts_core96.ChartAxisDirection.X) { padding2 -= 4; label.show({ x: x - width / 2, y: axisPosition === "bottom" ? bounds.y + bounds.height + padding2 : bounds.y - height - padding2 }); } else { padding2 -= 8; label.show({ x: axisPosition === "right" ? bounds.x + bounds.width + padding2 : bounds.x - width - padding2, y: y - height / 2 }); } } hideCrosshairs() { this.crosshairGroup.visible = false; for (const key of Object.keys(this.labels)) { this.hideLabel(key); } } hideLabel(key) { this.labels[key]?.toggle(false); } }; Crosshair.className = "Crosshair"; __decorateClass([ import_ag_charts_core96.Property ], Crosshair.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core96.Property ], Crosshair.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core96.Property ], Crosshair.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core96.Property ], Crosshair.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core96.Property ], Crosshair.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core96.Property ], Crosshair.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core96.Property ], Crosshair.prototype, "snap", 2); __decorateClass([ import_ag_charts_core96.Property ], Crosshair.prototype, "label", 2); // packages/ag-charts-enterprise/src/features/crosshair/crosshairModule.ts var CrosshairModule = { type: "axis:plugin", name: "crosshair", chartType: "cartesian", enterprise: true, version: import_ag_charts_community78.VERSION, themeTemplate: { enabled: { $if: [ { $or: [ { $eq: [{ $path: "../type" }, "number"] }, { $eq: [{ $path: "../type" }, "log"] }, { $eq: [{ $path: "../type" }, "time"] }, { $eq: [{ $path: "../type" }, "unit-time"] }, { $eq: [{ $path: "../type" }, "ordinal-time"] } ] }, true, false ] }, snap: true, stroke: { $ref: "subtleTextColor" }, strokeWidth: 1, strokeOpacity: 1, lineDash: [5, 6], lineDashOffset: 0, label: { enabled: true } }, create: (ctx) => new Crosshair(ctx) }; // packages/ag-charts-enterprise/src/features/data-source/dataSourceModule.ts var import_ag_charts_community80 = require("ag-charts-community"); var import_ag_charts_core98 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/data-source/dataSource.ts var import_ag_charts_community79 = require("ag-charts-community"); var import_ag_charts_core97 = require("ag-charts-core"); var DataSource = class extends import_ag_charts_core97.AbstractModuleInstance { constructor(ctx) { super(); this.enabled = true; this.getData = () => Promise.resolve(); this.dataService = ctx.dataService; let dirty = false; this.cleanup.register( ctx.eventsHub.on("data:load", () => { dirty = true; }), ctx.eventsHub.on("layout:complete", () => { if (dirty) { ctx.zoomManager.updateZoom({ source: "data-update", sourceDetail: "dataSource" }); } }) ); } updateCallback(enabled, getData) { if (!this.dataService) return; if (enabled && getData != null) { this.dataService.updateCallback(getData); } else { this.dataService.clearCallback(); } } }; __decorateClass([ (0, import_ag_charts_core97.ActionOnSet)({ newValue(enabled) { this.updateCallback(enabled, this.getData); } }), import_ag_charts_core97.Property ], DataSource.prototype, "enabled", 2); __decorateClass([ (0, import_ag_charts_core97.ActionOnSet)({ newValue(getData) { this.updateCallback(this.enabled, getData); } }), import_ag_charts_core97.Property ], DataSource.prototype, "getData", 2); __decorateClass([ (0, import_ag_charts_core97.ActionOnSet)({ newValue(requestThrottle) { this.dataService.requestThrottle = requestThrottle; } }) ], DataSource.prototype, "requestThrottle", 2); __decorateClass([ (0, import_ag_charts_core97.ActionOnSet)({ newValue(updateThrottle) { this.dataService.dispatchThrottle = updateThrottle; } }) ], DataSource.prototype, "updateThrottle", 2); __decorateClass([ (0, import_ag_charts_core97.ActionOnSet)({ newValue(updateDuringInteraction) { this.dataService.dispatchOnlyLatest = !updateDuringInteraction; } }) ], DataSource.prototype, "updateDuringInteraction", 2); // packages/ag-charts-enterprise/src/features/data-source/dataSourceModule.ts var DataSourceModule = { type: "plugin", name: "dataSource", enterprise: true, version: import_ag_charts_community80.VERSION, options: { getData: import_ag_charts_core98.callback, requestThrottle: (0, import_ag_charts_core98.undocumented)(import_ag_charts_core98.positiveNumber), updateThrottle: (0, import_ag_charts_core98.undocumented)(import_ag_charts_core98.positiveNumber), updateDuringInteraction: (0, import_ag_charts_core98.undocumented)(import_ag_charts_core98.boolean) }, create: (ctx) => new DataSource(ctx) }; // packages/ag-charts-enterprise/src/features/error-bar/errorBarModule.ts var import_ag_charts_community84 = require("ag-charts-community"); var import_ag_charts_core102 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/error-bar/errorBar.ts var import_ag_charts_community83 = require("ag-charts-community"); var import_ag_charts_core101 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/error-bar/errorBarNode.ts var import_ag_charts_community81 = require("ag-charts-community"); var import_ag_charts_core99 = require("ag-charts-core"); var { BBox: BBox6 } = import_ag_charts_community81._ModuleSupport; var HierarchicalBBox = class { constructor(components) { this.components = components; this.union = BBox6.merge(components); } containsPoint(x, y) { if (!this.union.containsPoint(x, y)) { return false; } for (const bbox of this.components) { if (bbox.containsPoint(x, y)) { return true; } } return false; } }; var ErrorBarNode = class extends import_ag_charts_community81._ModuleSupport.Group { constructor() { super(); this.capLength = Number.NaN; this._datum = void 0; this.whiskerPath = new import_ag_charts_community81._ModuleSupport.Path(); this.capsPath = new import_ag_charts_community81._ModuleSupport.Path(); this.bboxes = new HierarchicalBBox([]); this.append([this.whiskerPath, this.capsPath]); } get datum() { return this._datum; } set datum(datum) { this._datum = datum; } calculateCapLength(capsTheme, capDefaults) { const { lengthRatio = 1, length } = capsTheme; const { lengthRatioMultiplier, lengthMax } = capDefaults; const desiredLength = length ?? lengthRatio * lengthRatioMultiplier; return Math.min(desiredLength, lengthMax); } getItemStylerParams(options, style, highlighted, highlightState) { const { datum } = this; if (datum == null || options.itemStyler == null) return; const { xLowerKey, xUpperKey, yLowerKey, yUpperKey } = options; return { ...style, datum: datum.datum, seriesId: datum.series.id, xKey: datum.xKey, yKey: datum.yKey, xLowerKey, xUpperKey, yLowerKey, yUpperKey, highlighted, highlightState }; } formatStyles(style, options, caller, highlighted, highlightState) { let { cap: capsStyle, ...whiskerStyle } = style; const params = this.getItemStylerParams(options, style, highlighted, highlightState); if (params != null && options.itemStyler != null) { const result = caller.callWithContext(options.itemStyler, params); whiskerStyle = (0, import_ag_charts_core99.mergeDefaults)(result, whiskerStyle); capsStyle = (0, import_ag_charts_core99.mergeDefaults)(result?.cap, result, capsStyle); } return { whiskerStyle, capsStyle }; } applyStyling(target, source) { (0, import_ag_charts_core99.partialAssign)( ["visible", "stroke", "strokeWidth", "strokeOpacity", "lineDash", "lineDashOffset"], target, source ); } update(style, formatters, caller, highlighted, highlightState) { if (this.datum === void 0) { return; } const { whiskerStyle, capsStyle } = this.formatStyles(style, formatters, caller, highlighted, highlightState); const { xBar, yBar, capDefaults } = this.datum; const whisker = this.whiskerPath; this.applyStyling(whisker, whiskerStyle); whisker.path.clear(true); if (yBar !== void 0) { whisker.path.moveTo(yBar.lowerPoint.x, yBar.lowerPoint.y); whisker.path.lineTo(yBar.upperPoint.x, yBar.upperPoint.y); } if (xBar !== void 0) { whisker.path.moveTo(xBar.lowerPoint.x, xBar.lowerPoint.y); whisker.path.lineTo(xBar.upperPoint.x, xBar.upperPoint.y); } whisker.path.closePath(); this.capLength = this.calculateCapLength(capsStyle ?? {}, capDefaults); const capOffset = this.capLength / 2; const caps = this.capsPath; this.applyStyling(caps, capsStyle); caps.path.clear(true); if (yBar !== void 0) { caps.path.moveTo(yBar.lowerPoint.x - capOffset, yBar.lowerPoint.y); caps.path.lineTo(yBar.lowerPoint.x + capOffset, yBar.lowerPoint.y); caps.path.moveTo(yBar.upperPoint.x - capOffset, yBar.upperPoint.y); caps.path.lineTo(yBar.upperPoint.x + capOffset, yBar.upperPoint.y); } if (xBar !== void 0) { caps.path.moveTo(xBar.lowerPoint.x, xBar.lowerPoint.y - capOffset); caps.path.lineTo(xBar.lowerPoint.x, xBar.lowerPoint.y + capOffset); caps.path.moveTo(xBar.upperPoint.x, xBar.upperPoint.y - capOffset); caps.path.lineTo(xBar.upperPoint.x, xBar.upperPoint.y + capOffset); } caps.path.closePath(); } updateBBoxes() { const { capLength, whiskerPath: whisker, capsPath: caps } = this; const { yBar, xBar } = this.datum ?? {}; const capOffset = capLength / 2; const components = []; if (yBar !== void 0) { const whiskerHeight = yBar.lowerPoint.y - yBar.upperPoint.y; components.push( new BBox6(yBar.lowerPoint.x, yBar.upperPoint.y, whisker.strokeWidth, whiskerHeight), new BBox6(yBar.lowerPoint.x - capOffset, yBar.lowerPoint.y, capLength, caps.strokeWidth), new BBox6(yBar.upperPoint.x - capOffset, yBar.upperPoint.y, capLength, caps.strokeWidth) ); } if (xBar !== void 0) { const whiskerWidth = xBar.upperPoint.x - xBar.lowerPoint.x; components.push( new BBox6(xBar.lowerPoint.x, xBar.upperPoint.y, whiskerWidth, whisker.strokeWidth), new BBox6(xBar.lowerPoint.x, xBar.lowerPoint.y - capOffset, caps.strokeWidth, capLength), new BBox6(xBar.upperPoint.x, xBar.upperPoint.y - capOffset, caps.strokeWidth, capLength) ); } this.bboxes.components = components; this.bboxes.union = BBox6.merge(components); } containsPoint(x, y) { return this.bboxes.containsPoint(x, y); } pickNode(x, y) { return this.containsPoint(x, y) ? this : void 0; } nearestSquared(x, y, maxDistance) { const { bboxes } = this; if (bboxes.union.distanceSquared(x, y) > maxDistance) { return { nearest: void 0, distanceSquared: Infinity }; } const { distanceSquared } = (0, import_ag_charts_core99.nearestSquared)(x, y, bboxes.components); return { nearest: this, distanceSquared }; } }; var ErrorBarGroup = class extends import_ag_charts_community81._ModuleSupport.Group { nearestSquared(x, y) { const { nearest, distanceSquared } = (0, import_ag_charts_core99.nearestSquaredInContainer)(x, y, { children: this.children() }); if (nearest !== void 0 && !Number.isNaN(distanceSquared)) { return { datum: nearest.datum, distanceSquared }; } } }; // packages/ag-charts-enterprise/src/features/error-bar/errorBarProperties.ts var import_ag_charts_community82 = require("ag-charts-community"); var import_ag_charts_core100 = require("ag-charts-core"); var ErrorBarCap = class extends import_ag_charts_core100.BaseProperties { }; __decorateClass([ import_ag_charts_core100.Property ], ErrorBarCap.prototype, "visible", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarCap.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarCap.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarCap.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarCap.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarCap.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarCap.prototype, "length", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarCap.prototype, "lengthRatio", 2); var ErrorBarProperties = class extends import_ag_charts_core100.BaseProperties { constructor() { super(...arguments); this.visible = true; this.stroke = "black"; this.strokeWidth = 1; this.strokeOpacity = 1; this.cap = new ErrorBarCap(); } }; __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "yLowerKey", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "yLowerName", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "yUpperKey", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "yUpperName", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "xLowerKey", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "xLowerName", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "xUpperKey", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "xUpperName", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "visible", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core100.Property ], ErrorBarProperties.prototype, "cap", 2); // packages/ag-charts-enterprise/src/features/error-bar/errorBar.ts var { fixNumericExtent, groupAccumulativeValueProperty, valueProperty: valueProperty2 } = import_ag_charts_community83._ModuleSupport; var ErrorBars = class _ErrorBars extends import_ag_charts_core101.AbstractModuleInstance { constructor(ctx) { super(); this.properties = new ErrorBarProperties(); const series = ctx.series; const { annotationGroup, annotationSelections } = series; this.cartesianSeries = series; this.groupNode = new ErrorBarGroup({ name: `${annotationGroup.id}-errorBars` }); annotationGroup.appendChild(this.groupNode); this.selection = import_ag_charts_community83._ModuleSupport.Selection.select(this.groupNode, () => this.errorBarFactory()); annotationSelections.add(this.selection); series.addEventListener("seriesVisibilityChange", (e) => this.onToggleSeriesItem(e)); this.cleanup.register( series.events.on("data-processed", (e) => this.onDataProcessed(e)), series.events.on("data-update", (e) => this.onDataUpdate(e)), ctx.eventsHub.on("highlight:change", (event) => this.onHighlightChange(event)), () => this.groupNode.remove(), () => annotationSelections.delete(this.selection) ); } hasErrorBars() { const { xLowerKey, xUpperKey, yLowerKey, yUpperKey } = this.properties; return (0, import_ag_charts_core101.isDefined)(xLowerKey) && (0, import_ag_charts_core101.isDefined)(xUpperKey) || (0, import_ag_charts_core101.isDefined)(yLowerKey) && (0, import_ag_charts_core101.isDefined)(yUpperKey); } isStacked() { const stackCount = this.cartesianSeries.seriesGrouping?.stackCount; return stackCount == null ? false : stackCount > 0; } getUnstackPropertyDefinition(opts) { const props = []; const { xLowerKey, xUpperKey, yLowerKey, yUpperKey, xErrorsID, yErrorsID } = this.getMaybeFlippedKeys(); const { xScaleType, yScaleType } = opts; if (yLowerKey != null && yUpperKey != null) { props.push( valueProperty2(yLowerKey, yScaleType, { id: `${yErrorsID}-lower` }), valueProperty2(yUpperKey, yScaleType, { id: `${yErrorsID}-upper` }) ); } if (xLowerKey != null && xUpperKey != null) { props.push( valueProperty2(xLowerKey, xScaleType, { id: `${xErrorsID}-lower` }), valueProperty2(xUpperKey, xScaleType, { id: `${xErrorsID}-upper` }) ); } return props; } getStackPropertyDefinition(opts) { const props = []; const { cartesianSeries } = this; const { xLowerKey, xUpperKey, yLowerKey, yUpperKey, xErrorsID, yErrorsID } = this.getMaybeFlippedKeys(); const { xScaleType, yScaleType } = opts; const groupIndex = cartesianSeries.seriesGrouping?.groupIndex ?? cartesianSeries.id; const groupOpts = { invalidValue: null, missingValue: 0, separateNegative: true, ...cartesianSeries.visible ? {} : { forceValue: 0 } }; const makeErrorProperty = (key, id, type, scaleType) => { return groupAccumulativeValueProperty( key, "normal", { id: `${id}-${type}`, groupId: `errorGroup-${groupIndex}-${type}`, ...groupOpts }, scaleType ); }; const pushErrorProperties = (lowerKey, upperKey, id, scaleType) => { props.push( ...makeErrorProperty(lowerKey, id, "lower", scaleType), ...makeErrorProperty(upperKey, id, "upper", scaleType) ); }; if (yLowerKey != null && yUpperKey != null) { pushErrorProperties(yLowerKey, yUpperKey, yErrorsID, yScaleType); } if (xLowerKey != null && xUpperKey != null) { pushErrorProperties(xLowerKey, xUpperKey, xErrorsID, xScaleType); } return props; } getPropertyDefinitions(opts) { if (this.isStacked()) { return this.getStackPropertyDefinition(opts); } else { return this.getUnstackPropertyDefinition(opts); } } onDataProcessed(event) { this.dataModel = event.dataModel; this.processedData = event.processedData; } getDomain(direction) { const { xLowerKey, xUpperKey, xErrorsID, yLowerKey, yUpperKey, yErrorsID } = this.getMaybeFlippedKeys(); const hasAxisErrors = direction === import_ag_charts_core101.ChartAxisDirection.X ? (0, import_ag_charts_core101.isDefined)(xLowerKey) && (0, import_ag_charts_core101.isDefined)(xUpperKey) : (0, import_ag_charts_core101.isDefined)(yLowerKey) && (0, import_ag_charts_core101.isDefined)(yUpperKey); if (hasAxisErrors) { const { dataModel, processedData, cartesianSeries: series } = this; if (dataModel != null && processedData != null) { const id = { x: xErrorsID, y: yErrorsID }[direction]; const lowerDomain = dataModel.getDomain(series, `${id}-lower`, "value", processedData).domain; const upperDomain = dataModel.getDomain(series, `${id}-upper`, "value", processedData).domain; const domain = [Math.min(...lowerDomain, ...upperDomain), Math.max(...lowerDomain, ...upperDomain)]; return fixNumericExtent(domain); } } return []; } onDataUpdate(event) { this.dataModel = event.dataModel; this.processedData = event.processedData; if ((0, import_ag_charts_core101.isDefined)(event.dataModel) && (0, import_ag_charts_core101.isDefined)(event.processedData)) { this.createNodeData(); this.update(); } } getNodeData() { return this.hasErrorBars() ? this.cartesianSeries.contextNodeData?.nodeData : void 0; } createNodeData() { const nodeData = this.getNodeData(); const xScale = this.cartesianSeries.axes[import_ag_charts_core101.ChartAxisDirection.X]?.scale; const yScale = this.cartesianSeries.axes[import_ag_charts_core101.ChartAxisDirection.Y]?.scale; if (!xScale || !yScale || !nodeData) { return; } for (let i = 0; i < nodeData.length; i++) { const { midPoint, xLower, xUpper, yLower, yUpper } = this.getDatum(nodeData, i); if (midPoint != null) { let xBar, yBar; if ((0, import_ag_charts_core101.isDefined)(xLower) && (0, import_ag_charts_core101.isDefined)(xUpper)) { xBar = { lowerPoint: { x: this.convert(xScale, xLower), y: midPoint.y }, upperPoint: { x: this.convert(xScale, xUpper), y: midPoint.y } }; } if ((0, import_ag_charts_core101.isDefined)(yLower) && (0, import_ag_charts_core101.isDefined)(yUpper)) { yBar = { lowerPoint: { x: midPoint.x, y: this.convert(yScale, yLower) }, upperPoint: { x: midPoint.x, y: this.convert(yScale, yUpper) } }; } nodeData[i].xBar = xBar; nodeData[i].yBar = yBar; } } } getMaybeFlippedKeys() { let { xLowerKey, xUpperKey, yLowerKey, yUpperKey } = this.properties; let [xErrorsID, yErrorsID] = ["xValue-errors", "yValue-errors"]; if (this.cartesianSeries.shouldFlipXY()) { [xLowerKey, yLowerKey] = [yLowerKey, xLowerKey]; [xUpperKey, yUpperKey] = [yUpperKey, xUpperKey]; [xErrorsID, yErrorsID] = [yErrorsID, xErrorsID]; } return { xLowerKey, xUpperKey, xErrorsID, yLowerKey, yUpperKey, yErrorsID }; } static getDatumKey(nodeDatum, key, offset) { if (key == null) { return; } const datum = readDatum(nodeDatum); const value = datum?.[key]; if (value == null) { return; } if (typeof value !== "number") { import_ag_charts_core101.Logger.warnOnce(`Found [${key}] error value of type ${typeof value}. Expected number type`); return; } return value + offset; } getDatum(nodeData, datumIndex) { const { xLowerKey, xUpperKey, yLowerKey, yUpperKey } = this.getMaybeFlippedKeys(); const datum = nodeData[datumIndex]; const d = datum.cumulativeValue == null || !this.isStacked() ? 0 : datum.cumulativeValue - datum.yValue; const [xOffset, yOffset] = this.cartesianSeries.shouldFlipXY() ? [d, 0] : [0, d]; return { midPoint: datum.midPoint, xLower: _ErrorBars.getDatumKey(datum, xLowerKey, xOffset), xUpper: _ErrorBars.getDatumKey(datum, xUpperKey, xOffset), yLower: _ErrorBars.getDatumKey(datum, yLowerKey, yOffset), yUpper: _ErrorBars.getDatumKey(datum, yUpperKey, yOffset) }; } convert(scale, value) { const offset = (scale.bandwidth ?? 0) / 2; return scale.convert(value) + offset; } update() { const nodeData = this.getNodeData(); if (nodeData != null) { this.selection.update(nodeData); this.selection.each((node, datum, i) => this.updateNode(node, datum, i)); } } updateNode(node, datum, _index) { node.datum = datum; node.update(this.getDefaultStyle(), this.properties, this.cartesianSeries, false, "none"); node.updateBBoxes(); } pickNodeExact(point) { const { x, y } = point; const node = this.groupNode.pickNode(x, y); if (node != null) { return { datum: node.datum, distanceSquared: 0 }; } } pickNodeNearest(point) { return this.groupNode.nearestSquared(point.x, point.y); } pickNodeMainAxisFirst(point, majorDirection) { let closestDatum; let closestDistance = [Infinity, Infinity]; const referencePoints = [point.x, point.y]; if (majorDirection === import_ag_charts_core101.ChartAxisDirection.Y) { referencePoints.reverse(); } for (const child of this.groupNode.children()) { const childBBox = child.getBBox(); const childReferencePoints = [childBBox.x + childBBox.width / 2, childBBox.y + childBBox.height / 2]; if (majorDirection === import_ag_charts_core101.ChartAxisDirection.Y) { childReferencePoints.reverse(); } const childDistances = []; for (let i = 0; i < referencePoints.length; i++) { childDistances.push(Math.abs(referencePoints[i] - childReferencePoints[i])); } if (childDistances[0] < closestDistance[0] || childDistances[0] == closestDistance[0] && childDistances[1] < closestDistance[1]) { closestDatum = child.datum; closestDistance = childDistances; } } if (closestDatum) { return { datum: closestDatum, distanceSquared: Math.pow(closestDistance[0], 2) + Math.pow(closestDistance[1], 2) }; } } getTooltipParams() { const { xLowerKey, xUpperKey, yLowerKey, yUpperKey, xLowerName = xLowerKey, xUpperName = xUpperKey, yLowerName = yLowerKey, yUpperName = yUpperKey } = this.properties; return { xLowerKey, xLowerName, xUpperKey, xUpperName, yLowerKey, yLowerName, yUpperKey, yUpperName }; } onToggleSeriesItem(event) { this.groupNode.visible = event.visible; } makeStyle(baseStyle) { return { visible: baseStyle.visible, lineDash: baseStyle.lineDash, lineDashOffset: baseStyle.lineDashOffset, stroke: baseStyle.stroke, strokeWidth: baseStyle.strokeWidth, strokeOpacity: baseStyle.strokeOpacity, cap: (0, import_ag_charts_core101.mergeDefaults)(this.properties.cap, baseStyle) }; } getDefaultStyle() { return this.makeStyle(this.getWhiskerProperties()); } getHighlightStyle() { return this.makeStyle(this.getWhiskerProperties()); } restyleHighlightChange(highlightChange, style, highlighted) { const nodeData = this.getNodeData(); if (nodeData == null) return; for (let i = 0; i < nodeData.length; i++) { if (highlightChange === nodeData[i]) { this.selection.at(i)?.update( style, this.properties, this.cartesianSeries, highlighted, highlighted ? "highlighted-item" : "unhighlighted-item" ); break; } } } onHighlightChange(event) { const { previousHighlight, currentHighlight } = event; if (currentHighlight?.series === this.cartesianSeries) { this.restyleHighlightChange(currentHighlight, this.getHighlightStyle(), true); } if (previousHighlight?.series === this.cartesianSeries) { this.restyleHighlightChange(previousHighlight, this.getDefaultStyle(), false); } this.groupNode.opacity = this.cartesianSeries.getOpacity(); } errorBarFactory() { return new ErrorBarNode(); } getWhiskerProperties() { const { stroke: stroke3, strokeWidth, visible, strokeOpacity, lineDash, lineDashOffset } = this.properties; return { stroke: stroke3, strokeWidth, visible, strokeOpacity, lineDash, lineDashOffset }; } }; // packages/ag-charts-enterprise/src/features/error-bar/errorBarModule.ts var ErrorBarsModule = { type: "series:plugin", name: "errorBar", chartType: "cartesian", seriesTypes: ["bar", "line", "scatter"], enterprise: true, version: import_ag_charts_community84.VERSION, options: import_ag_charts_core102.errorBarOptionsDefs, themeTemplate: { visible: true, stroke: { $ref: "foregroundColor" }, strokeWidth: 1, strokeOpacity: 1, cap: { lengthRatio: { $if: [{ $eq: [{ $path: "../../type" }, "bar"] }, 0.3, 1] } } }, create: (ctx) => new ErrorBars(ctx) }; // packages/ag-charts-enterprise/src/features/flash-on-update/flashOnUpdateModule.ts var import_ag_charts_community86 = require("ag-charts-community"); var import_ag_charts_core104 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/flash-on-update/flashOnUpdate.ts var import_ag_charts_community85 = require("ag-charts-community"); var import_ag_charts_core103 = require("ag-charts-core"); function findPrimaryCategoryAxisContext(ctx) { for (const dir of [import_ag_charts_core103.ChartAxisDirection.X, import_ag_charts_core103.ChartAxisDirection.Y]) { for (const axisCtx of ctx.axisManager.getAxisContext(dir)) { if (import_ag_charts_community85._ModuleSupport.BandScale.is(axisCtx.scale)) { return axisCtx; } } } } var FlashOnUpdate = class extends import_ag_charts_core103.BaseProperties { constructor(ctx) { super(); this.ctx = ctx; this.enabled = false; this.item = "chart"; this.color = "#cfeeff"; this.opacity = 1; this.flashDuration = 100; this.fadeDuration = 900; this.cleanup = new import_ag_charts_core103.CleanupRegistry(); this.element = this.ctx.domManager.addChild("canvas-background", "flashOnUpdate"); this.element.role = "presentation"; let firstUpdate = true; const onDataUpdate = (ev) => { if (firstUpdate) { firstUpdate = false; } else { this.onDataUpdate(ev); } }; this.cleanup.register( this.ctx.eventsHub.on("data:update", onDataUpdate), this.ctx.eventsHub.on("datamodel:diff", (e) => this.onDataModelDiff(e)) ); } destroy() { this.ctx.domManager.removeChild("canvas-background", "flashOnUpdate"); this.cleanup.flush(); } clearFlash() { this.element.innerHTML = ""; clearTimeout(this.animationTimeout); this.animationTimeout = void 0; } flashElem(el) { const { flashDuration, fadeDuration } = this; const duration = flashDuration + fadeDuration; el.animate( [ { background: this.color, offset: 0 }, { background: this.color, offset: flashDuration / duration }, { background: "transparent", offset: 1 } ], { duration, easing: "ease-out" } ); } flashCategoryBands(diff8) { const axisCtx = findPrimaryCategoryAxisContext(this.ctx); if (!axisCtx) return; this.clearFlash(); const flashBounds = this.computeCategoryFlashBounds(axisCtx, diff8); for (const bounds of flashBounds) { const e = (0, import_ag_charts_core103.createElement)("div"); (0, import_ag_charts_core103.setAttribute)(e, "role", "presentation"); (0, import_ag_charts_core103.setElementStyle)(e, "position", "absolute"); (0, import_ag_charts_core103.setElementBBox)(e, bounds); this.element.appendChild(e); this.flashElem(e); } const duration = this.flashDuration + this.fadeDuration; this.animationTimeout = setTimeout(() => this.clearFlash(), duration); } computeCategories(diff8) { const result = /* @__PURE__ */ new Set(); for (const seriesId of Object.keys(diff8)) { for (const key of ["updated", "added", "moved"]) { for (const value of diff8[seriesId][key]) { result.add(value); } } } return result; } computeCategoryFlashBounds(axisCtx, diff8) { const seriesBounds = this.ctx.widgets.seriesWidget.getBounds(); const makeBox = axisCtx.direction === import_ag_charts_core103.ChartAxisDirection.X ? ([start, end]) => { return { x: seriesBounds.x + start, y: seriesBounds.y, width: end - start, height: seriesBounds.height }; } : ([start, end]) => { return { x: seriesBounds.x, y: seriesBounds.y + start, width: seriesBounds.width, height: end - start }; }; const result = []; const categories = this.computeCategories(diff8); for (const c of categories) { const measurements = axisCtx.measureBand(c); if (measurements?.band) { result.push(makeBox(measurements.band)); } } return result; } onDataUpdate(ev) { if (!this.enabled || this.item !== "chart" || !ev) return; this.flashElem(this.ctx.widgets.containerWidget.getElement()); } onDataModelDiff(ev) { if (!this.enabled || this.item !== "category") return; this.flashCategoryBands(ev.diff); } }; FlashOnUpdate.className = "FlashOnUpdate"; __decorateClass([ import_ag_charts_core103.Property ], FlashOnUpdate.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core103.Property ], FlashOnUpdate.prototype, "item", 2); __decorateClass([ import_ag_charts_core103.Property ], FlashOnUpdate.prototype, "color", 2); __decorateClass([ import_ag_charts_core103.Property ], FlashOnUpdate.prototype, "opacity", 2); __decorateClass([ import_ag_charts_core103.Property ], FlashOnUpdate.prototype, "flashDuration", 2); __decorateClass([ import_ag_charts_core103.Property ], FlashOnUpdate.prototype, "fadeDuration", 2); // packages/ag-charts-enterprise/src/features/flash-on-update/flashOnUpdateModule.ts var FlashOnUpdateModule = { type: "plugin", name: "flashOnUpdate", enterprise: true, version: import_ag_charts_community86.VERSION, options: { enabled: import_ag_charts_core104.boolean, item: (0, import_ag_charts_core104.strictUnion)()("chart", "category"), color: import_ag_charts_core104.color, opacity: import_ag_charts_core104.ratio, flashDuration: import_ag_charts_core104.positiveNumber, fadeDuration: import_ag_charts_core104.positiveNumber }, themeTemplate: { enabled: false, item: "chart", color: "#cfeeff", opacity: 1, flashDuration: 100, fadeDuration: 900 }, create: (ctx) => new FlashOnUpdate(ctx) }; // packages/ag-charts-enterprise/src/features/navigator/navigatorModule.ts var import_ag_charts_community138 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/features/navigator/navigator.ts var import_ag_charts_community93 = require("ag-charts-community"); var import_ag_charts_core111 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/navigator/miniChart.ts var import_ag_charts_community88 = require("ag-charts-community"); var import_ag_charts_core106 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/navigator/shapes/miniChartGroup.ts var import_ag_charts_community87 = require("ag-charts-community"); var import_ag_charts_core105 = require("ag-charts-core"); var { TranslatableGroup: TranslatableGroup3 } = import_ag_charts_community87._ModuleSupport; var MiniChartGroup = class extends TranslatableGroup3 { constructor() { super(...arguments); this.inset = 0; this.cornerRadius = 0; } applyClip(ctx, clipRect) { const { cornerRadius, inset } = this; const { x, y, width, height } = clipRect; const Path2DCtor = (0, import_ag_charts_core105.getPath2D)(); const path = new Path2DCtor(); path.roundRect(x + inset, y + inset, width - 2 * inset, height - 2 * inset, cornerRadius); ctx.clip(path); } }; __decorateClass([ (0, import_ag_charts_core105.SceneChangeDetection)() ], MiniChartGroup.prototype, "inset", 2); __decorateClass([ (0, import_ag_charts_core105.SceneChangeDetection)() ], MiniChartGroup.prototype, "cornerRadius", 2); // packages/ag-charts-enterprise/src/features/navigator/miniChart.ts var { CategoryAxis, Group: Group6, BBox: BBox7, stackCartesianSeries } = import_ag_charts_community88._ModuleSupport; var MiniChartPadding = class { constructor() { this.top = 0; this.bottom = 0; } }; __decorateClass([ import_ag_charts_core106.Property ], MiniChartPadding.prototype, "top", 2); __decorateClass([ import_ag_charts_core106.Property ], MiniChartPadding.prototype, "bottom", 2); var MiniChart = class extends import_ag_charts_core106.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.enabled = false; this.padding = new MiniChartPadding(); this.root = new Group6({ name: "root" }); this.seriesRoot = this.root.appendChild( new MiniChartGroup({ name: "Series-root", zIndex: import_ag_charts_core106.ZIndexMap.SERIES_LAYER, renderToOffscreenCanvas: true }) ); this.axisGridGroup = this.root.appendChild(new Group6({ name: "Axes-Grids", zIndex: import_ag_charts_core106.ZIndexMap.AXIS_GRID })); this.axisGroup = this.root.appendChild(new Group6({ name: "Axes-Grids", zIndex: import_ag_charts_core106.ZIndexMap.AXIS_GRID })); this.axisLabelGroup = this.root.appendChild(new Group6({ name: "Axes-Labels", zIndex: import_ag_charts_core106.ZIndexMap.SERIES_LABEL })); this.axisCrosslineRangeGroup = this.root.appendChild( new Group6({ name: "Axes-Crosslines-Range", zIndex: import_ag_charts_core106.ZIndexMap.SERIES_CROSSLINE_RANGE }) ); this.axisCrosslineLineGroup = this.root.appendChild( new Group6({ name: "Axes-Crosslines-Line", zIndex: import_ag_charts_core106.ZIndexMap.SERIES_CROSSLINE_LINE }) ); this.axisCrosslineLabelGroup = this.root.appendChild( new Group6({ name: "Axes-Crosslines-Label", zIndex: import_ag_charts_core106.ZIndexMap.SERIES_LABEL }) ); this.data = []; this._destroyed = false; this.miniChartAnimationPhase = "initial"; // Should be available after the first layout. this.seriesRect = void 0; this.axes = new import_ag_charts_community88._ModuleSupport.ChartAxes(); this.series = []; this.cleanup.register(this.ctx.eventsHub.on("data:update", (data) => this.updateData(data))); } destroy() { if (this._destroyed) { return; } super.destroy(); this.destroySeries(this.series); this.axes.destroy(); this._destroyed = true; } onSeriesChange(newValue, oldValue) { const seriesToDestroy = oldValue?.filter((series) => !newValue.includes(series)) ?? []; this.destroySeries(seriesToDestroy); for (const series of newValue) { if (oldValue?.includes(series)) continue; series.attachSeries(this.seriesRoot, this.seriesRoot, void 0); series.chart = {}; Object.defineProperty(series.chart, "mode", { get: () => "standalone" }); Object.defineProperty(series.chart, "isMiniChart", { get: () => true }); Object.defineProperty(series.chart, "flashOnUpdateEnabled", { get: () => false }); Object.defineProperty(series.chart, "seriesRect", { get: () => this.seriesRect }); series.resetAnimation(this.miniChartAnimationPhase === "initial" ? "initial" : "disabled"); } this.seriesRect = void 0; } destroySeries(allSeries) { if (allSeries) { for (const series of allSeries) { series.destroy(); series.detachSeries(this.seriesRoot, this.seriesRoot, void 0); series.chart = void 0; } } } assignSeriesToAxes() { for (const axis of this.axes) { axis.boundSeries = this.series.filter((s) => { const seriesAxis = s.axes[axis.direction]; return seriesAxis === axis; }); } } assignAxesToSeries() { const directionToAxesMap = {}; for (const axis of this.axes) { const direction = axis.direction; const directionAxes = directionToAxesMap[direction] ?? (directionToAxesMap[direction] = []); directionAxes.push(axis); } for (const series of this.series) { for (const direction of series.directions) { const seriesAxisId = series.getKeyAxis(direction) ?? direction; const newAxis = this.axes.findById(seriesAxisId); if (!newAxis) { import_ag_charts_core106.Logger.warnOnce( `no matching axis for direction [${direction}] and id [${seriesAxisId}]; check series and axes configuration.` ); return; } series.axes[direction] = newAxis; } } } updateData(data) { for (const s of this.series) { s.setChartData(data); } if (this.miniChartAnimationPhase === "initial") { this.ctx.animationManager.onBatchStop(() => { this.miniChartAnimationPhase = "ready"; for (const s of this.series) { s.resetAnimation("disabled"); } }); } } async processData(dataController) { if (this.series.some((s) => s.canHaveAxes)) { this.assignAxesToSeries(); this.assignSeriesToAxes(); } await Promise.all( this.series.map(async (s) => { s.resetDatumCallbackCache(); return s.processData(dataController); }) ); for (const axis of this.axes) { axis.processData(); } } computeAxisPadding() { const padding2 = new import_ag_charts_core106.Padding(); if (!this.enabled) { return padding2; } for (const { position, thickness, line, label } of this.axes) { if (position == null) continue; let size; if (thickness) { size = thickness; } else { size = (line.enabled ? line.width : 0) + (label.enabled ? (0, import_ag_charts_core106.calcLineHeight)(label.fontSize ?? 0) + label.spacing : 0); } padding2[position] = Math.ceil(size); } return padding2; } async layout(width, height) { var _a; const { padding: padding2 } = this; const animated = this.seriesRect != null; const seriesRect = new BBox7(0, 0, width, height - (padding2.top + padding2.bottom)); const resized = this.seriesRect?.width !== width || this.seriesRect?.height !== height; this.seriesRect = seriesRect; this.seriesRoot.translationY = padding2.top; this.seriesRoot.setClipRectCanvasSpace(new BBox7(0, -padding2.top, width, height)); for (const axis of this.axes) { const { position = "left" } = axis; switch (position) { case "top": case "bottom": axis.range = [0, seriesRect.width]; axis.gridLength = seriesRect.height; break; case "right": case "left": { const isCategoryAxis = axis instanceof CategoryAxis; axis.range = isCategoryAxis ? [0, seriesRect.height] : [seriesRect.height, 0]; axis.gridLength = seriesRect.width; break; } } axis.gridPadding = 0; axis.translation.x = 0; axis.translation.y = 0; if (position === "right") { axis.translation.x = width; } else if (position === "bottom") { axis.translation.y = height; } if (!animated) { axis.resetAnimation("initial"); } if (axis.crossLines) { for (const crossLine of axis.crossLines) { if (crossLine instanceof import_ag_charts_community88._ModuleSupport.CartesianCrossLine) { crossLine.position = axis.position ?? "top"; (_a = crossLine.label).parallel ?? (_a.parallel = axis.label?.parallel); } } } axis.calculateLayout(); axis.update(); } if (resized) { stackCartesianSeries(this.series); } await Promise.all(this.series.map(async (series) => series.update({ seriesRect }))); } }; __decorateClass([ import_ag_charts_core106.Property ], MiniChart.prototype, "enabled", 2); __decorateClass([ (0, import_ag_charts_core106.ProxyProperty)(["seriesRoot", "inset"]) ], MiniChart.prototype, "inset", 2); __decorateClass([ (0, import_ag_charts_core106.ProxyProperty)(["seriesRoot", "cornerRadius"]) ], MiniChart.prototype, "cornerRadius", 2); __decorateClass([ (0, import_ag_charts_core106.ActionOnSet)({ changeValue(newValue, oldValue = new import_ag_charts_community88._ModuleSupport.ChartAxes()) { const axisNodes = { axisNode: this.axisGroup, gridNode: this.axisGridGroup, labelNode: this.axisLabelGroup, crossLineLineNode: this.axisCrosslineLineGroup, crossLineRangeNode: this.axisCrosslineRangeGroup, crossLineLabelNode: this.axisCrosslineLabelGroup }; for (const axis of oldValue) { if (newValue.includes(axis)) continue; axis.detachAxis(); axis.destroy(); } for (const axis of newValue) { if (oldValue?.includes(axis)) continue; axis.attachAxis(axisNodes); } } }) ], MiniChart.prototype, "axes", 2); __decorateClass([ (0, import_ag_charts_core106.ActionOnSet)({ changeValue(newValue, oldValue) { this.onSeriesChange(newValue, oldValue); } }) ], MiniChart.prototype, "series", 2); // packages/ag-charts-enterprise/src/features/navigator/navigatorDOMProxy.ts var import_ag_charts_community89 = require("ag-charts-community"); var import_ag_charts_core107 = require("ag-charts-core"); var { SliderWidget } = import_ag_charts_community89._ModuleSupport; var NavigatorDOMProxy = class { constructor(ctx, sliderHandlers) { this.ctx = ctx; this.sliderHandlers = sliderHandlers; this._min = 0; this._max = 1; this.minRange = 1e-3; this.dragStartX = 0; this.ctx = ctx; this.toolbar = ctx.proxyInteractionService.createProxyContainer({ type: "toolbar", domManagerId: `navigator-toolbar`, classList: ["ag-charts-proxy-navigator-toolbar"], orientation: "vertical", ariaLabel: { id: "ariaLabelNavigator" } }); this.sliders = [ ctx.proxyInteractionService.createProxyElement({ type: "slider", domIndex: 1, ariaLabel: { id: "ariaLabelNavigatorMinimum" }, parent: this.toolbar, cursor: "ew-resize" }), ctx.proxyInteractionService.createProxyElement({ type: "slider", domIndex: -Infinity, ariaLabel: { id: "ariaLabelNavigatorRange" }, parent: this.toolbar, cursor: "grab" }), ctx.proxyInteractionService.createProxyElement({ type: "slider", domIndex: 2, ariaLabel: { id: "ariaLabelNavigatorMaximum" }, parent: this.toolbar, cursor: "ew-resize" }) ]; for (const [index, key] of ["min", "pan", "max"].entries()) { const slider = this.sliders[index]; slider.step = SliderWidget.STEP_HUNDRETH; slider.keyboardStep = SliderWidget.STEP_ONE; slider.orientation = "horizontal"; slider.setPreventsDefault(false); slider.addListener("drag-start", (ev) => this.onDragStart(index, ev, key)); slider.addListener("drag-move", (ev) => this.onDrag(slider, ev, key)); slider.addListener("drag-end", () => this.updateSliderRatios()); slider.addListener("contextmenu", (ev) => this.onContextMenu(slider, ev)); } this.sliders[0].addListener("change", () => this.onMinSliderChange()); this.sliders[1].addListener("change", () => this.onPanSliderChange()); this.sliders[2].addListener("change", () => this.onMaxSliderChange()); this.updateSliderRatios(); this.updateVisibility(false); } destroy() { this.toolbar.destroy(); } updateVisibility(visible) { this.toolbar.setHidden(!visible); } updateZoom() { const { _min: min, _max: max } = this; if (min == null || max == null) return; this.ctx.zoomManager.updateZoom( { source: "user-interaction", sourceDetail: "navigatorDOM" }, { x: { min, max } } ); } updateBounds(bounds) { this.toolbar.setBounds(bounds); } updateSliderBounds(sliderIndex, bounds) { this.sliders[sliderIndex].setBounds(bounds); } updateMinMax(min, max) { this._min = min; this._max = max; this.updateSliderRatios(); } updateSliderRatios() { let { _min: min, _max: max } = this; min = Math.round(min * 100) / 100; max = Math.round(max * 100) / 100; const panAria = this.ctx.localeManager.t("ariaValuePanRange", { min, max }); this.sliders[0].setValueRatio(min); this.sliders[1].setValueRatio(min, { ariaValueText: panAria }); this.sliders[2].setValueRatio(max); } toCanvasOffsets(event) { return { offsetX: this.dragStartX + event.originDeltaX }; } moveToFront(index) { if (index === 1) return; const frontSlider = this.sliders[index]; const otherSlider = this.sliders[2 - index]; this.toolbar.moveChild(otherSlider, frontSlider.domIndex - 1); } onDragStart(index, event, key) { const slider = this.sliders[index]; const toolbarLeft = this.toolbar.cssLeft(); const sliderLeft = slider.cssLeft(); this.dragStartX = toolbarLeft + sliderLeft + event.offsetX; this.moveToFront(index); event.sourceEvent.preventDefault(); this.sliderHandlers.onDragStart(key, this.toCanvasOffsets(event)); } onDrag(_slider, event, key) { event.sourceEvent.preventDefault(); this.sliderHandlers.onDrag(key, this.toCanvasOffsets(event)); } onContextMenu(slider, widgetEvent) { const { offsetX, offsetY } = widgetEvent; const { x: toolbarX, y: toolbarY } = this.toolbar.getBounds(); const { x: sliderX, y: sliderY } = slider.getBounds(); const canvasX = offsetX + toolbarX + sliderX; const canvasY = offsetY + toolbarY + sliderY; this.ctx.contextMenuRegistry.dispatchContext("always", { widgetEvent, canvasX, canvasY }, void 0); } onPanSliderChange() { const ratio8 = this.sliders[1].getValueRatio(); const span = this._max - this._min; this._min = (0, import_ag_charts_core107.clamp)(0, ratio8, 1 - span); this._max = this._min + span; this.updateZoom(); } onMinSliderChange() { this._min = this.sliders[0].clampValueRatio(0, this._max - this.minRange); this.updateZoom(); } onMaxSliderChange() { this._max = this.sliders[2].clampValueRatio(this._min + this.minRange, 1); this.updateZoom(); } }; // packages/ag-charts-enterprise/src/features/navigator/shapes/rangeHandle.ts var import_ag_charts_community90 = require("ag-charts-community"); var import_ag_charts_core108 = require("ag-charts-core"); var { BBox: BBox8, ExtendedPath2D } = import_ag_charts_community90._ModuleSupport; var RangeHandle = class extends import_ag_charts_community90._ModuleSupport.Path { constructor() { super(...arguments); this.zIndex = 3; this.centerX = 0; this.centerY = 0; this.width = 8; this.height = 16; this.cornerRadius = 4; this.grip = true; this.gripPath = new ExtendedPath2D(); } setCenter(x, y) { this.dirtyPath = true; if (this.centerX !== x || this.centerY !== y) { this.centerX = x; this.centerY = y; this.markDirty("center"); } } static align(minHandle, maxHandle, x, y, width, height, min, max, pixelAlign) { const minHandleX = minHandle.align(x + width * min) + pixelAlign; const maxHandleX = minHandleX + minHandle.align(x + width * min, width * (max - min)) - 2 * pixelAlign; const handleY = minHandle.align(y + height / 2); minHandle.setCenter(minHandleX, handleY); maxHandle.setCenter(maxHandleX, handleY); } computeBBox() { const { centerX, centerY, width, height } = this; const x = centerX - width / 2; const y = centerY - height / 2; return new BBox8(x, y, width, height); } isPointInPath(x, y) { const bbox = this.getBBox(); return bbox.containsPoint(x, y); } updatePath() { const { centerX, centerY, path, gripPath, strokeWidth, cornerRadius, grip } = this; const pixelAlign = strokeWidth / 2; const pixelRatio = this.layerManager?.canvas?.pixelRatio ?? 1; path.clear(); gripPath.clear(); const halfWidth = Math.floor(this.width / 2 * pixelRatio) / pixelRatio; const halfHeight = Math.floor(this.height / 2 * pixelRatio) / pixelRatio; path.roundRect( centerX - halfWidth + pixelAlign, centerY - halfHeight + pixelAlign, 2 * (halfWidth - pixelAlign), 2 * (halfHeight - pixelAlign), cornerRadius ); const gripSpacing = 3; if (grip) { for (let x = -0.5; x <= 0.5; x += 1) { for (let y = -1; y <= 1; y += 1) { gripPath.arc(centerX + x * gripSpacing, centerY + y * gripSpacing, 1, 0, 2 * Math.PI); gripPath.closePath(); } } } } renderFill(ctx, path) { const { stroke: stroke3 } = this; super.renderFill(ctx, path); ctx.fillStyle = typeof stroke3 === "string" ? stroke3 : "black"; ctx.fill(this.gripPath.getPath2D()); } }; RangeHandle.className = "RangeHandle"; __decorateClass([ import_ag_charts_core108.Property, (0, import_ag_charts_core108.SceneChangeDetection)() ], RangeHandle.prototype, "width", 2); __decorateClass([ import_ag_charts_core108.Property, (0, import_ag_charts_core108.SceneChangeDetection)() ], RangeHandle.prototype, "height", 2); __decorateClass([ import_ag_charts_core108.Property, (0, import_ag_charts_core108.SceneChangeDetection)() ], RangeHandle.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core108.Property, (0, import_ag_charts_core108.SceneChangeDetection)() ], RangeHandle.prototype, "grip", 2); // packages/ag-charts-enterprise/src/features/navigator/shapes/rangeMask.ts var import_ag_charts_community91 = require("ag-charts-community"); var import_ag_charts_core109 = require("ag-charts-core"); var { Path: Path6, BBox: BBox9, ExtendedPath2D: ExtendedPath2D2, clippedRoundRect } = import_ag_charts_community91._ModuleSupport; var RangeMask = class extends Path6 { constructor() { super(...arguments); this.cornerRadius = 4; this.zIndex = 2; this.x = 0; this.y = 0; this.width = 200; this.height = 30; this.min = 0; this.max = 1; this.visiblePath = new ExtendedPath2D2(); } layout(x, y, width, height, min, max) { min = Number.isNaN(min) ? this.min : min; max = Number.isNaN(max) ? this.max : max; if (x !== this.x || y !== this.y || width !== this.width || this.height !== height || min !== this.min || max !== this.max) { this.x = x; this.y = y; this.width = width; this.height = height; this.min = min; this.max = max; this.dirtyPath = true; this.markDirty("RangeMask.layout"); } } computeBBox() { const { x, y, width, height } = this; return new BBox9(x, y, width, height); } computeVisibleRangeBBox() { const { x, y, width, height, min, max } = this; const minX = x + width * min; const maxX = x + width * max; return new BBox9(minX, y, maxX - minX, height); } updatePath() { const { path, visiblePath, x, y, width, height, min, max, strokeWidth, cornerRadius } = this; const pixelAlign = strokeWidth / 2; path.clear(); visiblePath.clear(); const ax = this.align(x) + pixelAlign; const ay = this.align(y) + pixelAlign; const aw = this.align(x, width) - 2 * pixelAlign; const ah = this.align(y, height) - 2 * pixelAlign; const minX = this.align(x + width * min) + pixelAlign; const maxX = minX + this.align(x + width * min, width * (max - min)) - 2 * pixelAlign; const cornerRadiusParams = { topLeft: cornerRadius, topRight: cornerRadius, bottomRight: cornerRadius, bottomLeft: cornerRadius }; const drawRect = (p, x0, x1) => { if (x1 - x0 < 1) return; const bbox = new BBox9(x0, ay, x1 - x0, ah); clippedRoundRect(p, ax, ay, aw, ah, cornerRadiusParams, bbox); }; drawRect(path, ax, minX); drawRect(path, maxX, aw + ax); drawRect(visiblePath, minX, maxX); } renderStroke(ctx, path) { super.renderStroke(ctx, path); super.renderStroke(ctx, this.visiblePath.getPath2D()); } }; RangeMask.className = "RangeMask"; __decorateClass([ import_ag_charts_core109.Property, (0, import_ag_charts_core109.SceneChangeDetection)() ], RangeMask.prototype, "cornerRadius", 2); // packages/ag-charts-enterprise/src/features/navigator/shapes/rangeSelector.ts var import_ag_charts_community92 = require("ag-charts-community"); var import_ag_charts_core110 = require("ag-charts-core"); var RangeSelector = class extends import_ag_charts_community92._ModuleSupport.Group { constructor(children) { super({ name: "rangeSelectorGroup", zIndex: import_ag_charts_core110.ZIndexMap.NAVIGATOR }); this.x = 0; this.y = 0; this.width = 200; this.height = 30; this.lOffset = 0; this.rOffset = 0; this.background = this.appendChild( new import_ag_charts_community92._ModuleSupport.TranslatableGroup({ name: "navigator-background", zIndex: 1 }) ); this.append(children); } layout(x, y, width, height, lOffset, rOffset) { this.x = x; this.y = y; this.width = width; this.height = height; this.lOffset = lOffset; this.rOffset = rOffset; this.background.translationX = x; this.background.translationY = y; this.markDirty("RangeSelector"); } updateBackground(oldGroup, newGroup) { if (oldGroup != null) { oldGroup.remove(); } if (newGroup != null) { this.background.appendChild(newGroup); } this.markDirty("RangeSelector"); } computeBBox() { const { x, y, width, height, lOffset, rOffset } = this; return new import_ag_charts_community92._ModuleSupport.BBox(x - lOffset, y, width + (lOffset + rOffset), height); } }; // packages/ag-charts-enterprise/src/features/navigator/navigator.ts var Navigator = class extends import_ag_charts_core111.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.enabled = false; this.mask = new RangeMask(); this.minHandle = new RangeHandle(); this.maxHandle = new RangeHandle(); this.maskVisibleRange = { id: "navigator-mask-visible-range", getBBox: () => this.mask.computeVisibleRangeBBox(), toCanvasBBox: () => this.mask.computeVisibleRangeBBox(), fromCanvasPoint: (x, y) => ({ x, y }) }; this.height = 30; this.cornerRadius = 0; this.spacing = 10; this.x = 0; this.y = 0; this.width = 0; this.rangeSelector = new RangeSelector([this.mask, this.minHandle, this.maxHandle]); this.cleanup.register( ctx.scene.attachNode(this.rangeSelector), ctx.eventsHub.on("locale:change", () => this.updateZoom()), ctx.layoutManager.registerElement(import_ag_charts_community93._ModuleSupport.LayoutElement.Navigator, (e) => this.onLayoutStart(e)), ctx.eventsHub.on("layout:complete", (e) => this.onLayoutComplete(e)), ctx.eventsHub.on("zoom:change-complete", (event) => this.onZoomChange(event)) ); this.domProxy = new NavigatorDOMProxy(ctx, this); this.updateGroupVisibility(); this.miniChart = new MiniChart(ctx); } updateBackground(oldGroup, newGroup) { this.rangeSelector?.updateBackground(oldGroup, newGroup); } updateGroupVisibility() { const { enabled } = this; if (this.rangeSelector == null || enabled === this.rangeSelector.visible) return; this.rangeSelector.visible = enabled; this.domProxy.updateVisibility(enabled); if (enabled) { this.updateZoom(); } else { this.ctx.zoomManager.updateZoom( { source: "chart-update", sourceDetail: "navigator" }, { x: { min: 0, max: 1 } } ); } } onLayoutStart({ layoutBox }) { if (this.enabled) { const navigatorTotalHeight = this.height + this.spacing; layoutBox.shrink(navigatorTotalHeight, "bottom"); this.y = layoutBox.y + layoutBox.height + this.spacing; } else { this.y = 0; } if (this.enabled && this.miniChart) { const { top, bottom } = this.miniChart.computeAxisPadding(); layoutBox.shrink(top + bottom, "bottom"); this.y -= bottom; this.miniChart.inset = this.mask.strokeWidth / 2; this.miniChart.cornerRadius = this.mask.cornerRadius; } } onLayoutComplete(opts) { const { x, width } = opts.series.rect; const { y, height } = this; this.domProxy.updateVisibility(this.enabled); if (this.enabled) { const { _min: min, _max: max } = this.domProxy; this.layoutNodes(x, y, width, height, min, max); this.domProxy.updateBounds({ x, y, width, height }); } this.x = x; this.width = width; this.miniChart?.layout(width, height).catch((e) => import_ag_charts_core111.Logger.error(e)); } canDrag() { return this.enabled && this.ctx.interactionManager.isState(import_ag_charts_community93._ModuleSupport.InteractionState.ZoomDraggable); } onDragStart(dragging, { offsetX }) { if (!this.canDrag()) return; if (dragging === "pan") { this.panStart = (offsetX - this.x) / this.width - this.domProxy._min; } this.ctx.zoomManager.fireZoomPanStartEvent("navigator"); } onDrag(dragging, { offsetX }) { if (!this.canDrag()) return; const { panStart, x, width } = this; const { minRange } = this.domProxy; let { _min: min, _max: max } = this.domProxy; const ratio8 = (offsetX - x) / width; if (dragging === "min") { min = (0, import_ag_charts_core111.clamp)(0, ratio8, max - minRange); } else if (dragging === "max") { max = (0, import_ag_charts_core111.clamp)(min + minRange, ratio8, 1); } else if (dragging === "pan" && panStart != null) { const span = max - min; min = (0, import_ag_charts_core111.clamp)(0, ratio8 - panStart, 1 - span); max = min + span; } this.domProxy._min = min; this.domProxy._max = max; this.updateZoom(); } onZoomChange(event) { const { x: xZoom } = event; if (!xZoom) return; const { x, y, width, height } = this; const { min, max } = xZoom; this.domProxy.updateMinMax(min, max); this.layoutNodes(x, y, width, height, min, max); } layoutNodes(x, y, width, height, min, max) { const { rangeSelector, mask, minHandle, maxHandle } = this; mask.layout(x, y, width, height, min, max); rangeSelector.layout(x, y, width, height, minHandle.width / 2, maxHandle.width / 2); RangeHandle.align(minHandle, maxHandle, x, y, width, height, min, max, mask.strokeWidth / 2); if (min + (max - min) / 2 < 0.5) { minHandle.zIndex = 3; maxHandle.zIndex = 4; } else { minHandle.zIndex = 4; maxHandle.zIndex = 3; } for (const [index, node] of [minHandle, this.maskVisibleRange, maxHandle].entries()) { const bbox = node.getBBox(); const tbox = { x: bbox.x - x, y: bbox.y - y, height: bbox.height, width: bbox.width }; this.domProxy.updateSliderBounds(index, tbox); } } updateZoom() { if (!this.enabled) return; this.domProxy.updateZoom(); } async processData(dataController) { return this.miniChart?.processData(dataController); } }; __decorateClass([ (0, import_ag_charts_core111.ObserveChanges)((target, value, oldValue) => { target.updateBackground(oldValue?.root, value?.root); }) ], Navigator.prototype, "miniChart", 2); __decorateClass([ import_ag_charts_core111.Property, (0, import_ag_charts_core111.ObserveChanges)((target, value) => { target.ctx.zoomManager.setNavigatorEnabled(Boolean(value)); target.updateGroupVisibility(); }) ], Navigator.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core111.Property ], Navigator.prototype, "height", 2); __decorateClass([ import_ag_charts_core111.Property, (0, import_ag_charts_core111.ObserveChanges)((target, value) => { target.mask.cornerRadius = value; }) ], Navigator.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core111.Property ], Navigator.prototype, "spacing", 2); // packages/ag-charts-enterprise/src/features/navigator/navigatorOptionsDefs.ts var import_ag_charts_community136 = require("ag-charts-community"); var import_ag_charts_core156 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/box-plot/boxPlotModule.ts var import_ag_charts_community98 = require("ag-charts-community"); var import_ag_charts_core117 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/box-plot/boxPlotSeries.ts var import_ag_charts_community96 = require("ag-charts-community"); var import_ag_charts_core114 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/box-plot/blotPlotUtil.ts function prepareBoxPlotFromTo(isVertical) { const from = isVertical ? { scalingX: 1, scalingY: 0 } : { scalingX: 0, scalingY: 1 }; const to = { scalingX: 1, scalingY: 1 }; return { from, to }; } function resetBoxPlotSelectionsScalingCenterFn(isVertical) { return (_node, datum) => { if (isVertical) { return { scalingCenterY: datum.scaledValues.medianValue }; } return { scalingCenterX: datum.scaledValues.medianValue }; }; } // packages/ag-charts-enterprise/src/series/box-plot/boxPlotNode.ts var import_ag_charts_community94 = require("ag-charts-community"); var import_ag_charts_core112 = require("ag-charts-core"); var { Path: Path7, Scalable, ExtendedPath2D: ExtendedPath2D3, BBox: BBox10, clippedRoundRect: baseClippedRoundRect } = import_ag_charts_community94._ModuleSupport; var BoxPlotNode = class extends Scalable(Path7) { constructor() { super(...arguments); this.wickPath = new ExtendedPath2D3(); this.horizontal = false; this.center = 0; this.thickness = 0; this.min = 0; this.q1 = 0; this.median = 0; this.q3 = 0; this.max = 0; this.cornerRadius = 0; this.crisp = false; this.strokeAlignment = 0; this.wickStroke = void 0; this.wickStrokeWidth = void 0; this.wickStrokeOpacity = void 0; this.capLengthRatio = 1; this.wickStrokeAlignment = 0; } computeBBox() { const { horizontal, center, thickness, min, max } = this; return horizontal ? new BBox10(Math.min(min, max), center - thickness / 2, Math.abs(max - min), thickness) : new BBox10(center - thickness / 2, Math.min(min, max), thickness, Math.abs(max - min)); } computeDefaultGradientFillBBox() { const { horizontal, center, thickness, q1, q3 } = this; return horizontal ? new BBox10(Math.min(q1, q3), center - thickness / 2, Math.abs(q3 - q1), thickness) : new BBox10(center - thickness / 2, Math.min(q1, q3), thickness, Math.abs(q3 - q1)); } isPointInPath(x, y) { return this.getBBox().containsPoint(x, y); } distanceSquared(x, y) { return this.getBBox().distanceSquared(x, y); } get midPoint() { return this.horizontal ? { x: (this.min + this.max) / 2, y: this.center } : { x: this.center, y: (this.min + this.max) / 2 }; } alignedCoordinates() { const { thickness, crisp } = this; let { center, min, q1, median, q3, max } = this; let x0 = center - thickness / 2; let x1 = center + thickness / 2; if (crisp && thickness > 1) { min = this.align(min); q1 = this.align(q1); median = this.align(median); q3 = this.align(q3); max = min + this.align(min, max - min); const halfWidth = this.align(thickness / 2); center = this.align(center); x0 = center - halfWidth; x1 = center + halfWidth; } return { center, x0, x1, min, max, q1, median, q3 }; } updatePath() { const { path, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, wickStroke, wickStrokeWidth, wickStrokeOpacity, wickLineDash, wickLineDashOffset, strokeAlignment, cornerRadius, capLengthRatio, horizontal } = this; const { center, x0, x1, min, max, q1, median, q3 } = this.alignedCoordinates(); const pixelRatio = this.layerManager?.canvas.pixelRatio ?? 1; const wickStrokeAlignment = this.wickStrokeAlignment > 0 ? pixelRatio / this.wickStrokeAlignment / 2 % 1 : 0; this.path.clear(); this.wickPath.clear(); const needsWickPath = wickStroke != null && wickStroke !== stroke3 || wickStrokeWidth != null && wickStrokeWidth !== strokeWidth || wickStrokeOpacity != null && wickStrokeOpacity !== strokeOpacity || wickLineDash != null && wickLineDash !== lineDash || wickLineDashOffset != null && wickLineDashOffset !== lineDashOffset; const wickPath = needsWickPath ? this.wickPath : path; if (Math.abs(x1 - x0) <= 3) { moveTo(wickPath, horizontal, center, min); lineTo(wickPath, horizontal, center, max); return; } const wickTop = Math.min(min, max); const wickBottom = Math.max(min, max); const boxTop = Math.min(q1, q3); const boxBottom = Math.max(q1, q3); const capX0 = center - Math.abs((x1 - x0) * capLengthRatio) / 2; const capX1 = center + Math.abs((x1 - x0) * capLengthRatio) / 2; moveTo(wickPath, horizontal, capX0, wickTop - wickStrokeAlignment); lineTo(wickPath, horizontal, capX1, wickTop - wickStrokeAlignment); moveTo(wickPath, horizontal, center - wickStrokeAlignment, wickTop - wickStrokeAlignment); lineTo(wickPath, horizontal, center - wickStrokeAlignment, boxTop + strokeWidth / 2); moveTo(wickPath, horizontal, center - wickStrokeAlignment, wickBottom + wickStrokeAlignment); lineTo(wickPath, horizontal, center - wickStrokeAlignment, boxBottom - strokeWidth / 2); moveTo(wickPath, horizontal, capX0, wickBottom + wickStrokeAlignment); lineTo(wickPath, horizontal, capX1, wickBottom + wickStrokeAlignment); const horizontalBoxStrokeAdjustment = strokeWidth / 2 + strokeAlignment; const verticalBoxStrokeAdjustment = strokeWidth / 2 - strokeAlignment; const rectHeight = boxBottom - boxTop - 2 * verticalBoxStrokeAdjustment; if (rectHeight > 0) { const rectX = x0 + horizontalBoxStrokeAdjustment; const rectY = boxTop + verticalBoxStrokeAdjustment; const rectWidth = x1 - x0 - 2 * horizontalBoxStrokeAdjustment; const cornerRadii = { topLeft: cornerRadius, topRight: cornerRadius, bottomRight: cornerRadius, bottomLeft: cornerRadius }; clippedRoundRect2( path, horizontal, rectX, rectY, rectWidth, rectHeight, cornerRadii, new BBox10(rectX, rectY, rectWidth, median - rectY) ); clippedRoundRect2( path, horizontal, rectX, rectY, rectWidth, rectHeight, cornerRadii, new BBox10(rectX, median, rectWidth, rectY + rectHeight - median) ); } else { const boxMid = (boxTop + boxBottom) / 2; moveTo(path, horizontal, x0, boxMid); lineTo(path, horizontal, x1, boxMid); } } drawPath(ctx) { super.drawPath(ctx); const { wickPath } = this; if (wickPath.isEmpty()) return; const { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, wickStroke = stroke3, wickStrokeWidth = strokeWidth, wickStrokeOpacity = strokeOpacity, wickLineDash = lineDash, wickLineDashOffset = lineDashOffset } = this; if (wickStrokeWidth === 0) return; ctx.globalAlpha *= wickStrokeOpacity; if (typeof wickStroke === "string") { ctx.strokeStyle = wickStroke; } ctx.lineWidth = wickStrokeWidth; if (wickLineDash != null) { ctx.setLineDash([...wickLineDash]); } ctx.lineDashOffset = wickLineDashOffset; ctx.stroke(wickPath.getPath2D()); } }; __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "horizontal", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "center", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "thickness", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "min", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "q1", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "median", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "q3", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "max", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "cornerRadius", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "crisp", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "strokeAlignment", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "wickStroke", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "wickStrokeWidth", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "wickStrokeOpacity", 2); __decorateClass([ (0, import_ag_charts_core112.SceneArrayChangeDetection)() ], BoxPlotNode.prototype, "wickLineDash", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "wickLineDashOffset", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "capLengthRatio", 2); __decorateClass([ (0, import_ag_charts_core112.SceneChangeDetection)() ], BoxPlotNode.prototype, "wickStrokeAlignment", 2); function moveTo(path, horizontal, x, y) { if (horizontal) { path.moveTo(y, x); } else { path.moveTo(x, y); } } function lineTo(path, horizontal, x, y) { if (horizontal) { path.lineTo(y, x); } else { path.lineTo(x, y); } } function clippedRoundRect2(path, horizontal, x, y, width, height, cornerRadii, clipBBox) { if (horizontal) { baseClippedRoundRect( // eslint-disable-next-line sonarjs/arguments-order path, y, x, height, width, cornerRadii, clipBBox == null ? void 0 : new BBox10(clipBBox.y, clipBBox.x, clipBBox.height, clipBBox.width) ); } else { baseClippedRoundRect(path, x, y, width, height, cornerRadii, clipBBox); } } // packages/ag-charts-enterprise/src/series/box-plot/boxPlotSeriesProperties.ts var import_ag_charts_community95 = require("ag-charts-community"); var import_ag_charts_core113 = require("ag-charts-core"); var { AbstractBarSeriesProperties, makeSeriesTooltip } = import_ag_charts_community95._ModuleSupport; var BoxPlotSeriesCap = class extends import_ag_charts_core113.BaseProperties { constructor() { super(...arguments); this.lengthRatio = 0.5; } }; __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesCap.prototype, "lengthRatio", 2); var BoxPlotSeriesWhisker = class extends import_ag_charts_core113.BaseProperties { }; __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesWhisker.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesWhisker.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesWhisker.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesWhisker.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesWhisker.prototype, "lineDashOffset", 2); var BoxPlotSeriesProperties = class extends AbstractBarSeriesProperties { constructor() { super(...arguments); this.fill = "#c16068"; this.fillOpacity = 1; this.stroke = "#333"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.cornerRadius = 0; this.cap = new BoxPlotSeriesCap(); this.whisker = new BoxPlotSeriesWhisker(); this.tooltip = makeSeriesTooltip(); } toJson() { const { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; const properties = super.toJson(); properties.whisker = (0, import_ag_charts_core113.mergeDefaults)(properties.whisker, { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }); return properties; } }; __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "xKey", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "minKey", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "q1Key", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "medianKey", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "q3Key", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "maxKey", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "xName", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "yName", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "minName", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "q1Name", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "medianName", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "q3Name", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "maxName", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "styler", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "cap", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "whisker", 2); __decorateClass([ import_ag_charts_core113.Property ], BoxPlotSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/box-plot/boxPlotSeries.ts var { fixNumericExtent: fixNumericExtent2, keyProperty: keyProperty2, SeriesNodePickMode, SMALLEST_KEY_INTERVAL, valueProperty: valueProperty3, diff, animationValidation, computeBarFocusBounds, createDatumId, HighlightState, motion, getItemStyles, calculateSegments, toHighlightString, processedDataIsAnimatable, upsertNodeDatum } = import_ag_charts_community96._ModuleSupport; var BoxPlotSeriesNodeEvent = class extends import_ag_charts_community96._ModuleSupport.SeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); this.xKey = series.properties.xKey; this.minKey = series.properties.minKey; this.q1Key = series.properties.q1Key; this.medianKey = series.properties.medianKey; this.q3Key = series.properties.q3Key; this.maxKey = series.properties.maxKey; } }; var BoxPlotSeries = class extends import_ag_charts_community96._ModuleSupport.AbstractBarSeries { constructor(moduleCtx) { super({ moduleCtx, pickModes: [SeriesNodePickMode.NEAREST_NODE, SeriesNodePickMode.EXACT_SHAPE_MATCH], propertyKeys: { x: ["xKey"], y: ["medianKey", "q1Key", "q3Key", "minKey", "maxKey"] }, propertyNames: { x: ["xName"], y: ["medianName", "q1Name", "q3Name", "minName", "maxName"] }, categoryKey: "xValue", pathsPerSeries: [] }); this.properties = new BoxPlotSeriesProperties(); this.NodeEvent = BoxPlotSeriesNodeEvent; } async processData(dataController) { if (!this.visible) return; const { xKey, minKey, q1Key, medianKey, q3Key, maxKey } = this.properties; const animationEnabled = !this.ctx.animationManager.isSkipped(); const xScale = this.getCategoryAxis()?.scale; const yScale = this.getValueAxis()?.scale; const { isContinuousX, xScaleType, yScaleType } = this.getScaleInformation({ xScale, yScale }); const extraProps = []; if (this.needsDataModelDiff() && this.processedData) { extraProps.push(diff(this.id, this.processedData)); } if (animationEnabled) { extraProps.push(animationValidation()); } const allowNullKey = this.properties.allowNullKeys ?? false; const { processedData } = await this.requestDataModel(dataController, this.data, { props: [ keyProperty2(xKey, xScaleType, { id: `xValue`, allowNullKey }), valueProperty3(minKey, yScaleType, { id: `minValue` }), valueProperty3(q1Key, yScaleType, { id: `q1Value` }), valueProperty3(medianKey, yScaleType, { id: `medianValue` }), valueProperty3(q3Key, yScaleType, { id: `q3Value` }), valueProperty3(maxKey, yScaleType, { id: `maxValue` }), ...isContinuousX ? [SMALLEST_KEY_INTERVAL] : [], ...extraProps ] }); this.smallestDataInterval = processedData.reduced?.smallestKeyInterval; this.animationState.transition("updateData"); } getSeriesDomain(direction) { const { processedData, dataModel } = this; if (!(processedData && dataModel)) return { domain: [] }; if (direction !== this.getBarDirection()) { const { index, def } = dataModel.resolveProcessedDataDefById(this, `xValue`); const keys = processedData.domain.keys[index]; if (def.type === "key" && def.valueType === "category") { const sortMetadata = dataModel.getKeySortMetadata(this, "xValue", processedData); return { domain: keys, sortMetadata }; } return { domain: this.padBandExtent(keys) }; } const yExtent = this.domainForClippedRange(direction, ["minValue", "maxValue"], "xValue"); return { domain: fixNumericExtent2(yExtent) }; } getSeriesRange(_direction, visibleRange) { return this.domainForVisibleRange(import_ag_charts_core114.ChartAxisDirection.Y, ["maxValue", "minValue"], "xValue", visibleRange); } /** * Creates the shared context for datum creation. * Caches expensive lookups and computations that are constant across all datums. */ createNodeDatumContext(xAxis, yAxis) { const { dataModel, processedData, contextNodeData } = this; if (!dataModel || !processedData) return void 0; const canIncrementallyUpdate = contextNodeData?.nodeData != null && processedData.changeDescription != null; const animationEnabled = !this.ctx.animationManager.isSkipped(); const { groupOffset, barOffset, barWidth } = this.getBarDimensions(); return { xAxis, yAxis, rawData: processedData.dataSources.get(this.id)?.data ?? [], xValues: dataModel.resolveKeysById(this, "xValue", processedData), minValues: dataModel.resolveColumnById(this, "minValue", processedData), q1Values: dataModel.resolveColumnById(this, "q1Value", processedData), medianValues: dataModel.resolveColumnById(this, "medianValue", processedData), q3Values: dataModel.resolveColumnById(this, "q3Value", processedData), maxValues: dataModel.resolveColumnById(this, "maxValue", processedData), xScale: xAxis.scale, yScale: yAxis.scale, groupOffset, barOffset, barWidth, isVertical: this.isVertical(), xKey: this.properties.xKey, animationEnabled, canIncrementallyUpdate, nodes: canIncrementallyUpdate ? contextNodeData.nodeData : [], nodeIndex: 0 }; } /** * Validates box plot values and checks ordering constraints. * Returns true if values are valid (all numbers, min <= q1 <= median <= q3 <= max). */ validateBoxPlotValues(minValue, q1Value, medianValue, q3Value, maxValue) { return [minValue, q1Value, medianValue, q3Value, maxValue].every((value) => typeof value === "number") && minValue <= q1Value && q1Value <= medianValue && medianValue <= q3Value && q3Value <= maxValue; } /** * Computes scaled values for a single datum. * Populates the scratch object to avoid allocations. */ computeScaledValues(ctx, scratch, datumIndex) { const x = ctx.xScale.convert(ctx.xValues[datumIndex]); if (!Number.isFinite(x)) return false; scratch.xValue = x + ctx.groupOffset + ctx.barOffset + ctx.barWidth / 2; scratch.minValue = ctx.yScale.convert(ctx.minValues[datumIndex]); scratch.q1Value = ctx.yScale.convert(ctx.q1Values[datumIndex]); scratch.medianValue = ctx.yScale.convert(ctx.medianValues[datumIndex]); scratch.q3Value = ctx.yScale.convert(ctx.q3Values[datumIndex]); scratch.maxValue = ctx.yScale.convert(ctx.maxValues[datumIndex]); return true; } /** * Creates a skeleton BoxPlotNodeDatum with minimal required fields. * The node will be populated by updateNodeDatum. */ createSkeletonNodeDatum(ctx, params) { return { series: this, datum: params.datum, datumIndex: params.datumIndex, xKey: ctx.xKey, bandwidth: ctx.barWidth, scaledValues: { xValue: 0, minValue: 0, q1Value: 0, medianValue: 0, q3Value: 0, maxValue: 0 }, midPoint: { x: 0, y: 0 }, focusRect: { x: 0, y: 0, width: 0, height: 0 } }; } /** * Updates an existing BoxPlotNodeDatum in-place. * This is more efficient than recreating the entire node when only data values change. */ updateNodeDatum(ctx, node, params) { const { isVertical, barWidth } = ctx; const scaledValues = params.scaledValues; const mutableNode = node; mutableNode.datum = params.datum; mutableNode.datumIndex = params.datumIndex; mutableNode.bandwidth = barWidth; const mutableScaledValues = mutableNode.scaledValues; mutableScaledValues.xValue = scaledValues.xValue; mutableScaledValues.minValue = scaledValues.minValue; mutableScaledValues.q1Value = scaledValues.q1Value; mutableScaledValues.medianValue = scaledValues.medianValue; mutableScaledValues.q3Value = scaledValues.q3Value; mutableScaledValues.maxValue = scaledValues.maxValue; const height = Math.abs(scaledValues.q3Value - scaledValues.q1Value); const midX = scaledValues.xValue; const midY = Math.min(scaledValues.q3Value, scaledValues.q1Value) + height / 2; const midPointX = isVertical ? midX : midY; const midPointY = isVertical ? midY : midX; if (mutableNode.midPoint) { mutableNode.midPoint.x = midPointX; mutableNode.midPoint.y = midPointY; } else { mutableNode.midPoint = { x: midPointX, y: midPointY }; } const focusRect = mutableNode.focusRect; if (isVertical) { focusRect.x = midPointX - barWidth / 2; focusRect.y = scaledValues.minValue; focusRect.width = barWidth; focusRect.height = scaledValues.maxValue - scaledValues.minValue; } else { focusRect.x = scaledValues.minValue; focusRect.y = midPointY - barWidth / 2; focusRect.width = scaledValues.maxValue - scaledValues.minValue; focusRect.height = barWidth; } } /** * Creates a BoxPlotNodeDatum for a single data point. * Creates a skeleton node and uses updateNodeDatum to populate it. */ createNodeDatum(ctx, params) { const node = this.createSkeletonNodeDatum(ctx, params); this.updateNodeDatum(ctx, node, params); return node; } /** * Initialize the result object shell before populating node data. */ initializeResult(ctx) { return { itemId: this.properties.xKey, nodeData: ctx.nodes, labelData: [], scales: this.calculateScaling(), visible: this.visible, // Set by assembleResult() groupScale: void 0, styles: void 0, segments: void 0 }; } /** * Populate node data by iterating over raw data. */ populateNodeData(ctx) { const scaledValuesScratch = { xValue: 0, minValue: 0, q1Value: 0, medianValue: 0, q3Value: 0, maxValue: 0 }; const paramsScratch = { datumIndex: 0, datum: void 0, scaledValues: scaledValuesScratch }; for (let datumIndex = 0; datumIndex < ctx.rawData.length; datumIndex++) { const datum = ctx.rawData[datumIndex]; const xValue = ctx.xValues[datumIndex]; if (xValue === void 0 && !this.properties.allowNullKeys) continue; const minValue = ctx.minValues[datumIndex]; const q1Value = ctx.q1Values[datumIndex]; const medianValue = ctx.medianValues[datumIndex]; const q3Value = ctx.q3Values[datumIndex]; const maxValue = ctx.maxValues[datumIndex]; if (!this.validateBoxPlotValues(minValue, q1Value, medianValue, q3Value, maxValue)) { continue; } if (!this.computeScaledValues(ctx, scaledValuesScratch, datumIndex)) { continue; } paramsScratch.datumIndex = datumIndex; paramsScratch.datum = datum; upsertNodeDatum( ctx, paramsScratch, (c, p) => this.createNodeDatum(c, p), (c, n, p) => this.updateNodeDatum(c, n, p) ); } } /** * Finalize node data by trimming excess nodes. */ finalizeNodeData(ctx) { if (ctx.canIncrementallyUpdate && ctx.nodeIndex < ctx.nodes.length) { ctx.nodes.length = ctx.nodeIndex; } } /** * Assemble the final result with computed fields. */ assembleResult(ctx, result) { const segments = calculateSegments( this.properties.segmentation, ctx.xAxis, ctx.yAxis, this.chart.seriesRect, this.ctx.scene ); result.groupScale = this.getScaling(this.ctx.seriesStateManager.getGroupScale(this)); result.styles = getItemStyles(this.getItemStyle.bind(this)); result.segments = segments; return result; } legendItemSymbol() { const { fill, stroke: stroke3, strokeWidth, fillOpacity, strokeOpacity, lineDash, lineDashOffset } = this.getStyle( false, HighlightState.None ); return { marker: { fill: (0, import_ag_charts_core114.deepClone)(fill), fillOpacity, stroke: stroke3, strokeOpacity, strokeWidth, lineDash, lineDashOffset } }; } getLegendData(legendType) { const { id: seriesId, ctx: { legendManager }, visible } = this; const { xKey, yName, showInLegend, legendItemName } = this.properties; if (!xKey || legendType !== "category") { return []; } return [ { legendType: "category", id: seriesId, itemId: seriesId, seriesId, enabled: visible && legendManager.getItemEnabled({ seriesId, itemId: seriesId }), label: { text: legendItemName ?? yName ?? seriesId }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend } ]; } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, properties } = this; const { xKey, xName, yName, medianKey, medianName, q1Key, q1Name, q3Key, q3Name, minKey, minName, maxKey, maxName, legendItemName, tooltip } = properties; const xAxis = this.getCategoryAxis(); const yAxis = this.getValueAxis(); if (!dataModel || !processedData || !xAxis || !yAxis) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const xValue = dataModel.resolveKeysById(this, `xValue`, processedData)[datumIndex]; const minValue = dataModel.resolveColumnById(this, `minValue`, processedData)[datumIndex]; const q1Value = dataModel.resolveColumnById(this, `q1Value`, processedData)[datumIndex]; const medianValue = dataModel.resolveColumnById(this, `medianValue`, processedData)[datumIndex]; const q3Value = dataModel.resolveColumnById(this, `q3Value`, processedData)[datumIndex]; const maxValue = dataModel.resolveColumnById(this, `maxValue`, processedData)[datumIndex]; const allowNullKeys = this.properties.allowNullKeys ?? false; if (xValue === void 0 && !allowNullKeys) return; const format = this.getItemStyle(datumIndex, false); const data = [ { label: minName, fallbackLabel: minKey, value: this.getAxisValueText(yAxis, "tooltip", minValue, datum, minKey, legendItemName), missing: import_ag_charts_community96._ModuleSupport.isTooltipValueMissing(minValue) }, { label: q1Name, fallbackLabel: q1Key, value: this.getAxisValueText(yAxis, "tooltip", q1Value, datum, q1Key, legendItemName), missing: import_ag_charts_community96._ModuleSupport.isTooltipValueMissing(q1Value) }, { label: medianName, fallbackLabel: medianKey, value: this.getAxisValueText(yAxis, "tooltip", medianValue, datum, medianKey, legendItemName), missing: import_ag_charts_community96._ModuleSupport.isTooltipValueMissing(medianValue) }, { label: q3Name, fallbackLabel: q3Key, value: this.getAxisValueText(yAxis, "tooltip", q3Value, datum, q3Key, legendItemName), missing: import_ag_charts_community96._ModuleSupport.isTooltipValueMissing(q3Value) }, { label: maxName, fallbackLabel: maxKey, value: this.getAxisValueText(yAxis, "tooltip", maxValue, datum, maxKey, legendItemName), missing: import_ag_charts_community96._ModuleSupport.isTooltipValueMissing(maxValue) } ]; return this.formatTooltipWithContext( tooltip, { heading: this.getAxisValueText(xAxis, "tooltip", xValue, datum, xKey, legendItemName), title: legendItemName ?? yName, symbol: this.legendItemSymbol(), data }, { seriesId, datum, title: yName, xKey, xName, yName, medianKey, medianName, q1Key, q1Name, q3Key, q3Name, minKey, minName, maxKey, maxName, ...format } ); } animateEmptyUpdateReady({ datumSelection }) { const isVertical = this.isVertical(); const { from, to } = prepareBoxPlotFromTo(isVertical); motion.resetMotion([datumSelection], resetBoxPlotSelectionsScalingCenterFn(isVertical)); motion.staticFromToMotion(this.id, "datums", this.ctx.animationManager, [datumSelection], from, to, { phase: "initial" }); } isLabelEnabled() { return false; } updateDatumSelection(opts) { const data = opts.nodeData ?? []; if (!processedDataIsAnimatable(this.processedData)) { return opts.datumSelection.update(data); } return opts.datumSelection.update(data, void 0, (datum) => createDatumId(datum.datumIndex)); } makeStylerParams(highlightStateEnum) { const { id: seriesId } = this; const { cornerRadius, cap: { lengthRatio }, fill, fillOpacity, lineDash, lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth, maxKey, maxName, medianKey, medianName, minKey, minName, q1Key, q1Name, q3Key, q3Name, whisker: { lineDash: whiskerLineDash, lineDashOffset: whiskerLineDashOffset, stroke: whiskerStroke, strokeOpacity: whiskerStrokeOpacity, strokeWidth: whiskerStrokeWidth }, xKey, xName, yName } = this.properties; const highlightState = toHighlightString(highlightStateEnum ?? HighlightState.None); return { cap: { lengthRatio }, cornerRadius, fill, fillOpacity, highlightState, lineDash, lineDashOffset, maxKey, maxName: maxName ?? maxKey, medianKey, medianName: medianName ?? medianKey, minKey, minName: minName ?? minKey, q1Key, q1Name: q1Name ?? q1Key, q3Key, q3Name: q3Name ?? q3Key, seriesId, stroke: stroke3, strokeOpacity, strokeWidth, whisker: { lineDash: whiskerLineDash ?? lineDash, lineDashOffset: whiskerLineDashOffset ?? lineDashOffset, stroke: whiskerStroke ?? stroke3, strokeOpacity: whiskerStrokeOpacity ?? strokeOpacity, strokeWidth: whiskerStrokeWidth ?? strokeWidth }, xKey, xName: xName ?? xKey, yName }; } getStyle(ignoreStylerCallback, highlightState) { const { cap, cornerRadius, fill, fillOpacity, lineDash, lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth, styler, whisker } = this.properties; let stylerResult = {}; if (!ignoreStylerCallback && styler) { const stylerParams = this.makeStylerParams(highlightState); stylerResult = this.ctx.optionsGraphService.resolvePartial( ["series", `${this.declarationOrder}`], this.cachedCallWithContext(styler, stylerParams) ?? {}, { pick: false } ) ?? {}; } return { cornerRadius: stylerResult.cornerRadius ?? cornerRadius, fill: stylerResult.fill ?? fill, fillOpacity: stylerResult.fillOpacity ?? fillOpacity, lineDash: stylerResult.lineDash ?? lineDash, lineDashOffset: stylerResult.lineDashOffset ?? lineDashOffset, opacity: 1, stroke: stylerResult.stroke ?? stroke3, strokeOpacity: stylerResult.strokeOpacity ?? strokeOpacity, strokeWidth: stylerResult.strokeWidth ?? strokeWidth, cap: { lengthRatio: stylerResult.cap?.lengthRatio ?? cap.lengthRatio }, whisker: { lineDash: stylerResult.whisker?.lineDash ?? whisker.lineDash, lineDashOffset: stylerResult.whisker?.lineDashOffset ?? whisker.lineDashOffset, stroke: stylerResult.whisker?.stroke ?? whisker.stroke, strokeOpacity: stylerResult.whisker?.strokeOpacity ?? whisker.strokeOpacity, strokeWidth: stylerResult.whisker?.strokeWidth ?? whisker.strokeWidth } }; } getItemStyle(datumIndex, isHighlight, highlightState) { const { properties } = this; const { itemStyler } = properties; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex, highlightState); let style = (0, import_ag_charts_core114.mergeDefaults)(highlightStyle, this.getStyle(datumIndex === void 0, highlightState)); if (itemStyler != null && datumIndex != null) { const overrides = this.cachedDatumCallback( createDatumId(datumIndex, isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(datumIndex, isHighlight, style); return this.ctx.optionsGraphService.resolvePartial( ["series", `${this.declarationOrder}`], this.callWithContext(itemStyler, params) ); } ); if (overrides) { style = (0, import_ag_charts_core114.mergeDefaults)(overrides, style); } } const { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = style; style.whisker = (0, import_ag_charts_core114.mergeDefaults)(style.whisker, { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }); return style; } makeItemStylerParams(datumIndex, isHighlight, style) { const { id: seriesId } = this; const { xKey, minKey, q1Key, medianKey, q3Key, maxKey } = this.properties; const datum = this.processedData?.dataSources.get(seriesId)?.data[datumIndex]; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightStateString = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum, xKey, minKey, q1Key, medianKey, q3Key, maxKey, highlightState: highlightStateString, ...style, fill }; } updateDatumStyles({ datumSelection, isHighlight }) { const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); datumSelection.each((_, nodeDatum) => { const highlightState = this.getHighlightState(highlightedDatum, isHighlight, nodeDatum.datumIndex); nodeDatum.style = this.getItemStyle(nodeDatum.datumIndex, isHighlight, highlightState); }); } updateDatumNodes({ datumSelection, isHighlight }) { const { contextNodeData, properties } = this; if (!contextNodeData) { return; } const isVertical = this.isVertical(); const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); const fillBBox = this.getShapeFillBBox(); const strokeAlignment = this.getStyle(false, HighlightState.None).strokeWidth / 2; const wickStrokeAlignment = properties.whisker.strokeWidth ?? properties.strokeWidth; datumSelection.each((boxPlotNode, nodeDatum) => { const style = nodeDatum.style ?? contextNodeData.styles[this.getHighlightState(highlightedDatum, isHighlight, nodeDatum.datumIndex)]; boxPlotNode.setFillProperties(style.fill, fillBBox); const nodeOpacity = style.opacity ?? 1; const whiskerOpacity = style.whisker?.strokeOpacity ?? style.strokeOpacity; boxPlotNode.fill = style.fill; boxPlotNode.fillOpacity = style.fillOpacity * nodeOpacity; boxPlotNode.stroke = style.stroke; boxPlotNode.strokeWidth = style.strokeWidth; boxPlotNode.strokeOpacity = style.strokeOpacity * nodeOpacity; boxPlotNode.lineDash = style.lineDash; boxPlotNode.lineDashOffset = style.lineDashOffset; boxPlotNode.wickStroke = style.whisker.stroke; boxPlotNode.wickStrokeWidth = style.whisker.strokeWidth; boxPlotNode.wickStrokeOpacity = whiskerOpacity * nodeOpacity; boxPlotNode.wickLineDash = style.whisker.lineDash; boxPlotNode.wickLineDashOffset = style.whisker.lineDashOffset; boxPlotNode.cornerRadius = style.cornerRadius; boxPlotNode.crisp = true; boxPlotNode.horizontal = !isVertical; boxPlotNode.center = nodeDatum.scaledValues.xValue; boxPlotNode.thickness = nodeDatum.bandwidth; boxPlotNode.min = nodeDatum.scaledValues.minValue; boxPlotNode.q1 = nodeDatum.scaledValues.q1Value; boxPlotNode.median = nodeDatum.scaledValues.medianValue; boxPlotNode.q3 = nodeDatum.scaledValues.q3Value; boxPlotNode.max = nodeDatum.scaledValues.maxValue; boxPlotNode.capLengthRatio = style.cap.lengthRatio; boxPlotNode.strokeAlignment = strokeAlignment; boxPlotNode.wickStrokeAlignment = wickStrokeAlignment; }); } updateLabelNodes() { } updateLabelSelection(opts) { const { labelData, labelSelection } = opts; return labelSelection.update(labelData); } nodeFactory() { return new BoxPlotNode(); } computeFocusBounds({ datumIndex }) { return computeBarFocusBounds(this, this.contextNodeData?.nodeData[datumIndex].focusRect); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.styler != null; } }; BoxPlotSeries.className = "BoxPlotSeries"; BoxPlotSeries.type = "box-plot"; // packages/ag-charts-enterprise/src/series/box-plot/boxPlotSeriesOptionsDef.ts var import_ag_charts_community97 = require("ag-charts-community"); var import_ag_charts_core115 = require("ag-charts-core"); var { boxPlotSeriesThemeableOptionsDef } = import_ag_charts_community97._ModuleSupport; var boxPlotSeriesOptionsDef = { ...import_ag_charts_core115.commonSeriesOptionsDefs, ...boxPlotSeriesThemeableOptionsDef, type: (0, import_ag_charts_core115.required)((0, import_ag_charts_core115.constant)("box-plot")), xKey: (0, import_ag_charts_core115.required)(import_ag_charts_core115.string), minKey: (0, import_ag_charts_core115.required)(import_ag_charts_core115.string), q1Key: (0, import_ag_charts_core115.required)(import_ag_charts_core115.string), medianKey: (0, import_ag_charts_core115.required)(import_ag_charts_core115.string), q3Key: (0, import_ag_charts_core115.required)(import_ag_charts_core115.string), maxKey: (0, import_ag_charts_core115.required)(import_ag_charts_core115.string), xKeyAxis: import_ag_charts_core115.string, yKeyAxis: import_ag_charts_core115.string, xName: import_ag_charts_core115.string, yName: import_ag_charts_core115.string, minName: import_ag_charts_core115.string, q1Name: import_ag_charts_core115.string, medianName: import_ag_charts_core115.string, q3Name: import_ag_charts_core115.string, maxName: import_ag_charts_core115.string, grouped: import_ag_charts_core115.boolean, legendItemName: import_ag_charts_core115.string, segmentation: import_ag_charts_core115.shapeSegmentation, width: import_ag_charts_core115.positiveNumberNonZero, widthRatio: import_ag_charts_core115.ratio }; // packages/ag-charts-enterprise/src/series/box-plot/boxPlotThemes.ts var import_ag_charts_core116 = require("ag-charts-core"); var BOX_PLOT_SERIES_THEME = { series: { direction: "vertical", fill: { $applySwitch: [ { $path: "type" }, { $if: [ { $or: [ { $isGradient: { $palette: "fill" } }, { $isPattern: { $palette: "fill" } }, { $isImage: { $palette: "fill" } } ] }, { $palette: "fill" }, { $mix: [import_ag_charts_core116.SAFE_FILL_OPERATION, { $ref: "chartBackgroundColor" }, 0.7] } ] }, ["gradient", import_ag_charts_core116.FILL_GRADIENT_LINEAR_DEFAULTS], ["image", import_ag_charts_core116.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core116.FILL_PATTERN_DEFAULTS] ] }, stroke: { $palette: "stroke" }, strokeWidth: 2, fillOpacity: 1, strokeOpacity: 1, lineDash: void 0, lineDashOffset: 0, highlight: { unhighlightedItem: { opacity: 0.5 }, unhighlightedSeries: { opacity: 0.1 } }, segmentation: import_ag_charts_core116.SEGMENTATION_DEFAULTS }, axes: { [import_ag_charts_core116.CARTESIAN_AXIS_TYPE.NUMBER]: { crosshair: { snap: false } }, [import_ag_charts_core116.CARTESIAN_AXIS_TYPE.CATEGORY]: { groupPaddingInner: 0.2, crosshair: { enabled: false, snap: false } } } }; // packages/ag-charts-enterprise/src/series/box-plot/boxPlotModule.ts var { predictCartesianNonPrimitiveAxis } = import_ag_charts_community98._ModuleSupport; var BoxPlotSeriesModule = { type: "series", name: "box-plot", chartType: "cartesian", enterprise: true, groupable: true, version: import_ag_charts_community98.VERSION, dependencies: [import_ag_charts_community98.CartesianChartModule], options: boxPlotSeriesOptionsDef, matchingKeys: ["xKey", "lowKey", "q1Key", "medianKey", "q3Key", "highKey", "outlierKey", "normalizedTo"], predictAxis: predictCartesianNonPrimitiveAxis, defaultAxes: import_ag_charts_core117.DIRECTION_SWAP_AXES, axisKeys: { [import_ag_charts_core117.ChartAxisDirection.X]: "xKeyAxis", [import_ag_charts_core117.ChartAxisDirection.Y]: "yKeyAxis" }, axisKeysFlipped: { [import_ag_charts_core117.ChartAxisDirection.X]: "yKeyAxis", [import_ag_charts_core117.ChartAxisDirection.Y]: "xKeyAxis" }, themeTemplate: BOX_PLOT_SERIES_THEME, create: (ctx) => new BoxPlotSeries(ctx) }; // packages/ag-charts-enterprise/src/series/candlestick/candlestickModule.ts var import_ag_charts_community108 = require("ag-charts-community"); var import_ag_charts_core127 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/candlestick/candlestickSeries.ts var import_ag_charts_community105 = require("ag-charts-community"); var import_ag_charts_core124 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/ohlc/ohlcSeriesBase.ts var import_ag_charts_community101 = require("ag-charts-community"); var import_ag_charts_core120 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/ohlc/ohlcAggregation.ts var import_ag_charts_community99 = require("ag-charts-community"); var import_ag_charts_core118 = require("ag-charts-core"); function aggregateOhlcData(scale, xValues, highValues, lowValues, domainInput, smallestKeyInterval, xNeedsValueOf, yNeedsValueOf) { const [d0, d1] = (0, import_ag_charts_core118.aggregationDomain)(scale, domainInput); return (0, import_ag_charts_core118.computeExtremesAggregation)([d0, d1], xValues, highValues, lowValues, { smallestKeyInterval, xNeedsValueOf, yNeedsValueOf }); } var memoizedAggregateOhlcData = (0, import_ag_charts_core118.simpleMemorize2)(aggregateOhlcData); function aggregateOhlcDataFromDataModel(scale, dataModel, processedData, series, existingFilters) { const xValues = dataModel.resolveKeysById(series, "xValue", processedData); const highValues = dataModel.resolveColumnById(series, "highValue", processedData); const lowValues = dataModel.resolveColumnById(series, "lowValue", processedData); const domainInput = dataModel.getDomain(series, "xValue", "key", processedData); const xNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "xValue", processedData); const yNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "highValue", processedData) ?? dataModel.resolveColumnNeedsValueOf(series, "lowValue", processedData); if (existingFilters) { const [d0, d1] = (0, import_ag_charts_core118.aggregationDomain)(scale, domainInput); return (0, import_ag_charts_core118.computeExtremesAggregation)([d0, d1], xValues, highValues, lowValues, { smallestKeyInterval: processedData.reduced?.smallestKeyInterval, xNeedsValueOf, yNeedsValueOf, existingFilters }); } return memoizedAggregateOhlcData( scale, xValues, highValues, lowValues, domainInput, processedData.reduced?.smallestKeyInterval, xNeedsValueOf, yNeedsValueOf ); } function aggregateOhlcDataFromDataModelPartial(scale, dataModel, processedData, series, targetRange, existingFilters) { const xValues = dataModel.resolveKeysById(series, "xValue", processedData); const highValues = dataModel.resolveColumnById(series, "highValue", processedData); const lowValues = dataModel.resolveColumnById(series, "lowValue", processedData); const domainInput = dataModel.getDomain(series, "xValue", "key", processedData); const xNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "xValue", processedData); const yNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "highValue", processedData) ?? dataModel.resolveColumnNeedsValueOf(series, "lowValue", processedData); const [d0, d1] = (0, import_ag_charts_core118.aggregationDomain)(scale, domainInput); return (0, import_ag_charts_core118.computeExtremesAggregationPartial)([d0, d1], xValues, highValues, lowValues, { smallestKeyInterval: processedData.reduced?.smallestKeyInterval, targetRange, xNeedsValueOf, yNeedsValueOf, existingFilters }); } // packages/ag-charts-enterprise/src/series/ohlc/ohlcNode.ts var import_ag_charts_community100 = require("ag-charts-community"); var import_ag_charts_core119 = require("ag-charts-core"); var { Path: Path8, BBox: BBox11 } = import_ag_charts_community100._ModuleSupport; var OhlcBaseNode = class extends Path8 { constructor() { super(...arguments); this.centerX = 0; this.y = 0; this.width = 0; this.height = 0; this.yOpen = 0; this.yClose = 0; this.crisp = false; } /** * High-performance static property setter that bypasses the decorator system entirely. * Writes directly to backing fields (__propertyName) to avoid: * - Decorator setter chains and equality checks * - Multiple onChangeDetection calls per property * - Object.keys() iteration in assignIfNotStrictlyEqual * - Object allocation overhead * * A single markDirty() call at the end ensures the scene graph is properly invalidated. * WARNING: Only use for hot paths where performance is critical and properties don't need * individual change detection (e.g., when updating many nodes in a loop). */ setStaticProperties(centerX, width, y, height, yOpen, yClose, crisp) { this.__centerX = centerX; this.__width = width; this.__y = y; this.__height = height; this.__yOpen = yOpen; this.__yClose = yClose; this.__crisp = crisp; this.dirtyPath = true; this.markDirty(); } computeBBox() { const { __centerX: centerX, __y: y, __width: width, __height: height } = this; return new BBox11(centerX - width / 2, y, width, height); } isPointInPath(x, y) { return this.getBBox().containsPoint(x, y); } distanceSquared(x, y) { return this.getBBox().distanceSquared(x, y); } get midPoint() { return { x: this.__centerX, y: this.__y + this.__height / 2 }; } alignedCoordinates() { const { __y: y, __width: width, __height: height, __crisp: crisp } = this; let { __centerX: centerX, __yOpen: yOpen, __yClose: yClose } = this; let x0 = centerX - width / 2; let x1 = centerX + width / 2; let y0 = y; let y1 = y + height; if (crisp && width > 1) { centerX = this.align(centerX); if (yOpen <= yClose) { const h = this.align(yOpen, yClose - yOpen); yOpen = this.align(yOpen); yClose = yOpen + h; } else { const h = this.align(yClose, yOpen - yClose); yClose = this.align(yClose); yOpen = yClose + h; } const halfWidth = this.align(width / 2); x0 = centerX - halfWidth; x1 = centerX + halfWidth; y0 = this.align(y); y1 = y0 + this.align(y0, height); } return { centerX, x0, x1, y0, y1, yOpen, yClose }; } executeStroke(ctx, path) { const { __width: width, strokeWidth } = this; if (width < strokeWidth) { ctx.lineWidth = width; } super.executeStroke(ctx, path); } }; __decorateClass([ (0, import_ag_charts_core119.DeclaredSceneChangeDetection)() ], OhlcBaseNode.prototype, "centerX", 2); __decorateClass([ (0, import_ag_charts_core119.DeclaredSceneChangeDetection)() ], OhlcBaseNode.prototype, "y", 2); __decorateClass([ (0, import_ag_charts_core119.DeclaredSceneChangeDetection)() ], OhlcBaseNode.prototype, "width", 2); __decorateClass([ (0, import_ag_charts_core119.DeclaredSceneChangeDetection)() ], OhlcBaseNode.prototype, "height", 2); __decorateClass([ (0, import_ag_charts_core119.DeclaredSceneChangeDetection)() ], OhlcBaseNode.prototype, "yOpen", 2); __decorateClass([ (0, import_ag_charts_core119.DeclaredSceneChangeDetection)() ], OhlcBaseNode.prototype, "yClose", 2); __decorateClass([ (0, import_ag_charts_core119.DeclaredSceneChangeDetection)() ], OhlcBaseNode.prototype, "crisp", 2); var OhlcNode = class extends OhlcBaseNode { constructor() { super(...arguments); this.strokeAlignment = 0; } updatePath() { const { path } = this; const { centerX, x0, x1, y0, y1, yOpen, yClose } = this.alignedCoordinates(); const pixelRatio = this.layerManager?.canvas.pixelRatio ?? 1; const strokeAlignment = this.__strokeAlignment > 0 ? pixelRatio / this.__strokeAlignment / 2 % 1 : 0; path.clear(); path.moveTo(centerX - strokeAlignment, y0); path.lineTo(centerX - strokeAlignment, y1); if (Math.abs(x1 - x0) > 1) { path.moveTo(x0, yOpen - strokeAlignment); path.lineTo(centerX - strokeAlignment, yOpen - strokeAlignment); path.moveTo(centerX - strokeAlignment, yClose - strokeAlignment); path.lineTo(x1, yClose - strokeAlignment); } } }; __decorateClass([ (0, import_ag_charts_core119.DeclaredSceneChangeDetection)() ], OhlcNode.prototype, "strokeAlignment", 2); // packages/ag-charts-enterprise/src/series/ohlc/ohlcSeriesBase.ts var OPEN = import_ag_charts_core120.AGGREGATION_INDEX_X_MIN; var HIGH = import_ag_charts_core120.AGGREGATION_INDEX_Y_MAX; var LOW = import_ag_charts_core120.AGGREGATION_INDEX_Y_MIN; var CLOSE = import_ag_charts_core120.AGGREGATION_INDEX_X_MAX; var SPAN = import_ag_charts_core120.AGGREGATION_SPAN; var { AggregationManager, fixNumericExtent: fixNumericExtent3, keyProperty: keyProperty3, createDatumId: createDatumId2, SeriesNodePickMode: SeriesNodePickMode2, SMALLEST_KEY_INTERVAL: SMALLEST_KEY_INTERVAL2, valueProperty: valueProperty4, diff: diff2, animationValidation: animationValidation2, computeBarFocusBounds: computeBarFocusBounds2, visibleRangeIndices, BandScale, processedDataIsAnimatable: processedDataIsAnimatable2, getItemStylesPerItemId } = import_ag_charts_community101._ModuleSupport; var OhlcSeriesNodeEvent = class extends import_ag_charts_community101._ModuleSupport.SeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); this.xKey = series.properties.xKey; this.openKey = series.properties.openKey; this.closeKey = series.properties.closeKey; this.highKey = series.properties.highKey; this.lowKey = series.properties.lowKey; } }; function resetOhlcSelectionsDirect(selections) { for (const selection of selections) { const nodes = selection.nodes(); selection.batchedUpdate(function resetOhlcNodes() { for (const node of nodes) { const datum = node.datum; if (datum == null) continue; node.setStaticProperties( datum.centerX, datum.width, datum.y, datum.height, datum.yOpen, datum.yClose, datum.crisp ); } selection.cleanup(); }); } } var OhlcSeriesBase = class extends import_ag_charts_community101._ModuleSupport.AbstractBarSeries { constructor(moduleCtx) { super({ moduleCtx, pickModes: [SeriesNodePickMode2.AXIS_ALIGNED, SeriesNodePickMode2.EXACT_SHAPE_MATCH], propertyKeys: { x: ["xKey"], y: ["lowKey", "highKey", "openKey", "closeKey"] }, propertyNames: { x: ["xName"], y: ["lowName", "highName", "openName", "closeName"] }, categoryKey: "xValue", pathsPerSeries: [] }); this.NodeEvent = OhlcSeriesNodeEvent; this.aggregationManager = new AggregationManager(); } async processData(dataController) { if (!this.visible) return; const { xKey, openKey, closeKey, highKey, lowKey } = this.properties; const animationEnabled = !this.ctx.animationManager.isSkipped(); const xScale = this.getCategoryAxis()?.scale; const yScale = this.getValueAxis()?.scale; const { isContinuousX, xScaleType, yScaleType } = this.getScaleInformation({ xScale, yScale }); const extraProps = []; if (this.needsDataModelDiff() && this.processedData) { extraProps.push(diff2(this.id, this.processedData)); } if (animationEnabled) { extraProps.push(animationValidation2()); } if (openKey) { extraProps.push( valueProperty4(openKey, yScaleType, { id: `openValue`, invalidValue: void 0, missingValue: void 0 }) ); } const allowNullKey = this.properties.allowNullKeys ?? false; const { dataModel, processedData } = await this.requestDataModel(dataController, this.data, { props: [ keyProperty3(xKey, xScaleType, { id: `xValue`, allowNullKey }), valueProperty4(closeKey, yScaleType, { id: `closeValue` }), valueProperty4(highKey, yScaleType, { id: `highValue` }), valueProperty4(lowKey, yScaleType, { id: `lowValue` }), ...isContinuousX ? [SMALLEST_KEY_INTERVAL2] : [], ...extraProps ] }); this.smallestDataInterval = processedData.reduced?.smallestKeyInterval; this.aggregateData(dataModel, processedData); this.animationState.transition("updateData"); } aggregateData(dataModel, processedData) { this.aggregationManager.markStale(processedData.input.count); if (processedData.type !== "ungrouped") return; if (processedDataIsAnimatable2(processedData)) return; const xAxis = this.axes[import_ag_charts_core120.ChartAxisDirection.X]; if (xAxis == null) return; const targetRange = this.estimateTargetRange(); this.aggregationManager.aggregate({ computePartial: (existingFilters) => aggregateOhlcDataFromDataModelPartial( xAxis.scale.type, dataModel, processedData, this, targetRange, existingFilters ), computeFull: (existingFilters) => aggregateOhlcDataFromDataModel(xAxis.scale.type, dataModel, processedData, this, existingFilters), targetRange }); const filters = this.aggregationManager.filters; if (filters && filters.length > 0) { import_ag_charts_core120.DebugMetrics.record( `${this.type}:aggregation`, filters.map((f) => f.maxRange) ); } } estimateTargetRange() { const xAxis = this.axes[import_ag_charts_core120.ChartAxisDirection.X]; if (!xAxis) return -1; const [r0, r1] = xAxis.scale.range; return Math.abs(r1 - r0); } getSeriesDomain(direction) { const { processedData, dataModel } = this; if (!(processedData && dataModel)) return { domain: [] }; if (direction !== this.getBarDirection()) { const { def } = dataModel.resolveProcessedDataDefById(this, `xValue`); const keys = dataModel.getDomain(this, `xValue`, "key", processedData); if (def.type === "key" && def.valueType === "category") { return keys; } return { domain: this.padBandExtent(keys.domain) }; } const yExtent = this.domainForClippedRange(direction, ["highValue", "lowValue"], "xValue"); return { domain: fixNumericExtent3(yExtent) }; } getSeriesRange(_direction, visibleRange) { return this.domainForVisibleRange(import_ag_charts_core120.ChartAxisDirection.Y, ["highValue", "lowValue"], "xValue", visibleRange); } getZoomRangeFittingItems(xVisibleRange, yVisibleRange, minVisibleItems) { return this.zoomFittingVisibleItems( "xValue", ["highValue", "lowValue"], xVisibleRange, yVisibleRange, minVisibleItems ); } getVisibleItems(xVisibleRange, yVisibleRange, minVisibleItems) { return this.countVisibleItems( "xValue", ["highValue", "lowValue"], xVisibleRange, yVisibleRange, minVisibleItems ); } /** * Creates shared context for node datum creation/update operations. * This context is instantiated once and reused across all datum operations * to minimize memory allocations. Only caches values that are expensive to * compute - cheap property lookups use `this` directly. */ buildDatumContext(xAxis, yAxis) { const { dataModel, processedData } = this; if (!dataModel || !processedData) return void 0; const rawData = processedData.dataSources.get(this.id)?.data ?? []; if (rawData.length === 0) return void 0; const xScale = xAxis.scale; const yScale = yAxis.scale; const applyWidthOffset = BandScale.is(xScale); const [r0, r1] = xScale.range; const range2 = Math.abs(r1 - r0); this.aggregationManager.ensureLevelForRange(range2); const dataAggregationFilter = this.aggregationManager.getFilterForRange(range2); const crisp = dataAggregationFilter == null; const canIncrementallyUpdate = this.contextNodeData?.nodeData != null && (processedData.changeDescription != null || !processedDataIsAnimatable2(processedData) || dataAggregationFilter != null); const { groupOffset, barWidth } = this.getBarDimensions(); return { rawData, xValues: dataModel.resolveKeysById(this, "xValue", processedData), openValues: dataModel.resolveColumnById(this, "openValue", processedData), closeValues: dataModel.resolveColumnById(this, "closeValue", processedData), highValues: dataModel.resolveColumnById(this, "highValue", processedData), lowValues: dataModel.resolveColumnById(this, "lowValue", processedData), xScale, yScale, xAxis, yAxis, groupOffset, barWidth, applyWidthOffset, // TODO: replace with barOffset? crisp, xKey: this.properties.xKey, openKey: this.properties.openKey, closeKey: this.properties.closeKey, highKey: this.properties.highKey, lowKey: this.properties.lowKey, dataAggregationFilter, range: range2, nodeDatumStateScratch: { datum: void 0, xValue: void 0, openValue: 0, closeValue: 0, highValue: 0, lowValue: 0, isRising: true, itemType: "up" }, canIncrementallyUpdate, nodeIndex: 0, nodeData: canIncrementallyUpdate ? this.contextNodeData.nodeData : [] }; } /** * Validates and prepares state for a single OHLC datum. * Mutates ctx.nodeDatumStateScratch with computed values. * Returns the scratch object if valid, undefined if invalid. */ prepareOhlcNodeDatumState(ctx, datumIndex) { const xValue = ctx.xValues[datumIndex]; if (xValue === void 0 && !this.properties.allowNullKeys) { return void 0; } const openValue = ctx.openValues[datumIndex]; const closeValue = ctx.closeValues[datumIndex]; const highValue = ctx.highValues[datumIndex]; const lowValue = ctx.lowValues[datumIndex]; const validLowValue = lowValue != null && lowValue <= openValue && lowValue <= closeValue; const validHighValue = highValue != null && highValue >= openValue && highValue >= closeValue; if (!validLowValue) { import_ag_charts_core120.Logger.warnOnce( `invalid low value for key [${ctx.lowKey}] in data element, low value cannot be higher than datum open or close values` ); return void 0; } if (!validHighValue) { import_ag_charts_core120.Logger.warnOnce( `invalid high value for key [${ctx.highKey}] in data element, high value cannot be lower than datum open or close values.` ); return void 0; } const datum = ctx.rawData[datumIndex]; const isRising = closeValue > openValue; const itemType = isRising ? "up" : "down"; const scratch = ctx.nodeDatumStateScratch; scratch.datum = datum; scratch.xValue = xValue; scratch.openValue = openValue; scratch.closeValue = closeValue; scratch.highValue = highValue; scratch.lowValue = lowValue; scratch.isRising = isRising; scratch.itemType = itemType; return scratch; } /** * Creates a skeleton OhlcNodeDatum from prepared state. * Takes pre-computed positioning and state from scratch object. */ createSkeletonNodeDatum(ctx, scratch, datumIndex, centerX, width, crisp) { const xOffset = ctx.applyWidthOffset ? width / 2 : 0; const adjustedCenterX = centerX + xOffset; const yOpen = ctx.yScale.convert(scratch.openValue); const yClose = ctx.yScale.convert(scratch.closeValue); const yHigh = ctx.yScale.convert(scratch.highValue); const yLow = ctx.yScale.convert(scratch.lowValue); const y = Math.min(yHigh, yLow); const height = Math.max(yHigh, yLow) - y; return { series: this, itemType: scratch.itemType, datum: scratch.datum, datumIndex, xKey: ctx.xKey, xValue: scratch.xValue, openValue: scratch.openValue, closeValue: scratch.closeValue, highValue: scratch.highValue, lowValue: scratch.lowValue, midPoint: { x: adjustedCenterX, y: y + height / 2 }, aggregatedValue: scratch.closeValue, isRising: scratch.isRising, centerX: adjustedCenterX, width, y, height, yOpen, yClose, crisp }; } /** * Updates an existing OhlcNodeDatum in-place for value-only changes. * This is more efficient than recreating the entire node when only data values change * but the structure (insertions/removals) remains the same. */ updateNodeDatum(ctx, node, prepared, datumIndex, centerX, width, crisp) { const mutableNode = node; const xOffset = ctx.applyWidthOffset ? width / 2 : 0; const adjustedCenterX = centerX + xOffset; const yOpen = ctx.yScale.convert(prepared.openValue); const yClose = ctx.yScale.convert(prepared.closeValue); const yHigh = ctx.yScale.convert(prepared.highValue); const yLow = ctx.yScale.convert(prepared.lowValue); const y = Math.min(yHigh, yLow); const height = Math.max(yHigh, yLow) - y; mutableNode.datum = prepared.datum; mutableNode.datumIndex = datumIndex; mutableNode.itemType = prepared.itemType; mutableNode.xValue = prepared.xValue; mutableNode.openValue = prepared.openValue; mutableNode.closeValue = prepared.closeValue; mutableNode.highValue = prepared.highValue; mutableNode.lowValue = prepared.lowValue; mutableNode.aggregatedValue = prepared.closeValue; mutableNode.isRising = prepared.isRising; mutableNode.centerX = adjustedCenterX; mutableNode.width = width; mutableNode.y = y; mutableNode.height = height; mutableNode.yOpen = yOpen; mutableNode.yClose = yClose; mutableNode.crisp = crisp; const mutableMidPoint = mutableNode.midPoint; mutableMidPoint.x = adjustedCenterX; mutableMidPoint.y = y + height / 2; } /** * Handles node creation/update - reuses existing nodes when possible for incremental updates. * This method decides whether to update existing nodes in-place or create new ones. */ upsertNodeDatum(ctx, datumIndex, centerX, width, crisp) { const prepared = this.prepareOhlcNodeDatumState(ctx, datumIndex); if (!prepared) return; const canReuse = ctx.canIncrementallyUpdate && ctx.nodeIndex < ctx.nodeData.length; if (canReuse) { this.updateNodeDatum(ctx, ctx.nodeData[ctx.nodeIndex], prepared, datumIndex, centerX, width, crisp); } else { const newNode = this.createSkeletonNodeDatum(ctx, prepared, datumIndex, centerX, width, crisp); ctx.nodeData.push(newNode); } ctx.nodeIndex++; } createNodeData() { const { visible } = this; const xAxis = this.getCategoryAxis(); const yAxis = this.getValueAxis(); if (!xAxis || !yAxis) return; const ctx = this.buildDatumContext(xAxis, yAxis); const resultContext = { itemId: this.properties.xKey, nodeData: ctx?.nodeData ?? [], labelData: [], scales: this.calculateScaling(), groupScale: this.getScaling(this.ctx.seriesStateManager.getGroupScale(this)), visible: this.visible, styles: getItemStylesPerItemId(this.getItemStyle.bind(this), "up", "down") }; if (!visible || !ctx) return resultContext; const xPosition = (index) => { const x = ctx.xScale.convert(ctx.xValues[index]); if (!Number.isFinite(x)) return Number.NaN; return x + ctx.groupOffset; }; if (ctx.dataAggregationFilter == null) { const invalidData = this.processedData.invalidData?.get(this.id); let [start, end] = visibleRangeIndices(1, ctx.rawData.length, ctx.xAxis.range, (index) => { const xOffset = ctx.applyWidthOffset ? 0 : -ctx.barWidth / 2; const x = xPosition(index) + xOffset; return [x, x + ctx.barWidth]; }); if (this.processedData.input.count < 1e3) { start = 0; end = this.processedData.input.count; } for (let datumIndex = start; datumIndex < end; datumIndex += 1) { if (invalidData?.[datumIndex] === true) continue; const centerX = xPosition(datumIndex); this.upsertNodeDatum(ctx, datumIndex, centerX, ctx.barWidth, ctx.crisp); } if (ctx.canIncrementallyUpdate && ctx.nodeIndex < ctx.nodeData.length) { ctx.nodeData.length = ctx.nodeIndex; } } else { const { maxRange, indexData, midpointIndices } = ctx.dataAggregationFilter; const [start, end] = visibleRangeIndices(1, maxRange, ctx.xAxis.range, (index) => { const aggIndex = index * SPAN; const closeIndex = indexData[aggIndex + CLOSE]; const midDatumIndex = midpointIndices[index]; if (midDatumIndex === -1) return; const xOffset = ctx.applyWidthOffset ? 0 : -ctx.barWidth / 2; return [xPosition(midDatumIndex) + xOffset, xPosition(closeIndex) + xOffset + ctx.barWidth]; }); for (let i = start; i < end; i += 1) { const aggIndex = i * SPAN; const openIndex = indexData[aggIndex + OPEN]; const closeIndex = indexData[aggIndex + CLOSE]; const highIndex = indexData[aggIndex + HIGH]; const lowIndex = indexData[aggIndex + LOW]; const midDatumIndex = midpointIndices[i]; if (midDatumIndex === -1) continue; const prepared = this.prepareOhlcNodeDatumState(ctx, midDatumIndex); if (!prepared) continue; prepared.openValue = ctx.openValues[openIndex]; prepared.closeValue = ctx.closeValues[closeIndex]; prepared.highValue = ctx.highValues[highIndex]; prepared.lowValue = ctx.lowValues[lowIndex]; prepared.isRising = prepared.closeValue > prepared.openValue; prepared.itemType = prepared.isRising ? "up" : "down"; const centerX = xPosition(midDatumIndex); const width = Math.abs(xPosition(closeIndex) - xPosition(openIndex)) + ctx.barWidth; const canReuse = ctx.canIncrementallyUpdate && ctx.nodeIndex < ctx.nodeData.length; if (canReuse) { this.updateNodeDatum( ctx, ctx.nodeData[ctx.nodeIndex], prepared, midDatumIndex, centerX, width, false ); } else { const nodeDatum = this.createSkeletonNodeDatum(ctx, prepared, midDatumIndex, centerX, width, false); ctx.nodeData.push(nodeDatum); } ctx.nodeIndex++; } if (ctx.canIncrementallyUpdate && ctx.nodeIndex < ctx.nodeData.length) { ctx.nodeData.length = ctx.nodeIndex; } } return resultContext; } isVertical() { return true; } isLabelEnabled() { return false; } resetDatumAnimation(data) { resetOhlcSelectionsDirect([data.datumSelection]); } updateDatumSelection(opts) { const data = opts.nodeData ?? []; if (!processedDataIsAnimatable2(this.processedData)) { return opts.datumSelection.update(data); } return opts.datumSelection.update(data, void 0, (datum) => createDatumId2(datum.xValue)); } updateLabelNodes(_opts) { } updateLabelSelection(opts) { const { labelData, labelSelection } = opts; return labelSelection.update(labelData); } getItemStyle(datumIndex, isHighlight, highlightState, itemType = "up") { const { properties, dataModel, processedData } = this; const { itemStyler } = properties; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex, highlightState); const baseStyle = (0, import_ag_charts_core120.mergeDefaults)(highlightStyle, properties.getStyle(itemType)); let style = baseStyle; if (itemStyler && dataModel != null && processedData != null && datumIndex != null) { const xValue = dataModel.resolveKeysById(this, `xValue`, processedData)[datumIndex]; const overrides = this.cachedDatumCallback( createDatumId2(createDatumId2(xValue), isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(itemType, datumIndex, isHighlight, style); return this.ctx.optionsGraphService.resolvePartial( ["series", `${this.declarationOrder}`, "item", itemType], this.callWithContext(itemStyler, params) ); } ); if (overrides) { style = (0, import_ag_charts_core120.mergeDefaults)(overrides, style); } } return style; } makeItemStylerParams(itemType, datumIndex, isHighlight, style) { const { id: seriesId, properties, processedData } = this; const { xKey, openKey, closeKey, highKey, lowKey } = properties; const datum = processedData.dataSources.get(seriesId)?.data[datumIndex]; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightStateString = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const params = { seriesId, datum, itemType, xKey, openKey, closeKey, highKey, lowKey, highlightState: highlightStateString, ...style }; if ("fill" in params && "fill" in style) { params.fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; } return params; } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, properties } = this; const { xKey, xName, yName, openKey, openName, highKey, highName, lowKey, lowName, closeKey, closeName, legendItemName, tooltip } = properties; const xAxis = this.getCategoryAxis(); const yAxis = this.getValueAxis(); if (!dataModel || !processedData || !xAxis || !yAxis) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const xValue = dataModel.resolveKeysById(this, `xValue`, processedData)[datumIndex]; const openValue = dataModel.resolveColumnById(this, `openValue`, processedData)[datumIndex]; const highValue = dataModel.resolveColumnById(this, `highValue`, processedData)[datumIndex]; const lowValue = dataModel.resolveColumnById(this, `lowValue`, processedData)[datumIndex]; const closeValue = dataModel.resolveColumnById(this, `closeValue`, processedData)[datumIndex]; const allowNullKeys = this.properties.allowNullKeys ?? false; if (xValue === void 0 && !allowNullKeys) return; const itemType = closeValue >= openValue ? "up" : "down"; const item = this.properties.item[itemType]; const format = this.getItemStyle(datumIndex, false); const marker = { fill: item.fill ?? item.stroke, fillOpacity: item.fillOpacity ?? item.strokeOpacity ?? 1, stroke: item.stroke, strokeWidth: item.strokeWidth ?? 1, strokeOpacity: item.strokeOpacity ?? 1, lineDash: item.lineDash ?? [0], lineDashOffset: item.lineDashOffset ?? 0 }; return this.formatTooltipWithContext( tooltip, { heading: this.getAxisValueText(xAxis, "tooltip", xValue, datum, xKey, legendItemName), title: legendItemName, symbol: { marker }, data: [ { label: openName, fallbackLabel: openKey, value: this.getAxisValueText(yAxis, "tooltip", openValue, datum, openKey, legendItemName), missing: import_ag_charts_community101._ModuleSupport.isTooltipValueMissing(openValue) }, { label: highName, fallbackLabel: highKey, value: this.getAxisValueText(yAxis, "tooltip", highValue, datum, highKey, legendItemName), missing: import_ag_charts_community101._ModuleSupport.isTooltipValueMissing(highValue) }, { label: lowName, fallbackLabel: lowKey, value: this.getAxisValueText(yAxis, "tooltip", lowValue, datum, lowKey, legendItemName), missing: import_ag_charts_community101._ModuleSupport.isTooltipValueMissing(lowValue) }, { label: closeName, fallbackLabel: closeKey, value: this.getAxisValueText(yAxis, "tooltip", closeValue, datum, closeKey, legendItemName), missing: import_ag_charts_community101._ModuleSupport.isTooltipValueMissing(closeValue) } ] }, { seriesId, datum, title: yName, itemType, xKey, xName, yName, openKey, openName, highKey, highName, lowKey, lowName, closeKey, closeName, ...format } ); } computeFocusBounds(opts) { const nodeDatum = this.getNodeData()?.at(opts.datumIndex); if (nodeDatum == null) return; const { centerX, y, width, height } = nodeDatum; const datum = { x: centerX - width / 2, y, width, height }; return computeBarFocusBounds2(this, datum); } }; // packages/ag-charts-enterprise/src/series/candlestick/candlestickNode.ts var import_ag_charts_community102 = require("ag-charts-community"); var import_ag_charts_core121 = require("ag-charts-core"); var { ExtendedPath2D: ExtendedPath2D4, BBox: BBox12 } = import_ag_charts_community102._ModuleSupport; var CandlestickNode = class extends OhlcBaseNode { constructor() { super(...arguments); this.wickPath = new ExtendedPath2D4(); this.wickStroke = void 0; this.wickStrokeWidth = void 0; this.wickStrokeOpacity = void 0; this.wickStrokeAlignment = 0; } /** * High-performance wick property setter that bypasses the decorator system entirely. * Writes directly to backing fields (__propertyName) to avoid: * - Decorator setter chains and equality checks * - Multiple onChangeDetection calls per property * - Object.keys() iteration in assignIfNotStrictlyEqual * - Object allocation overhead * * A single markDirty() call at the end ensures the scene graph is properly invalidated. * WARNING: Only use for hot paths where performance is critical and properties don't need * individual change detection (e.g., when updating many nodes in a loop). */ setWickProperties(wickStroke, wickStrokeWidth, wickStrokeOpacity, wickLineDash, wickLineDashOffset) { this.__wickStroke = wickStroke; this.__wickStrokeWidth = wickStrokeWidth; this.__wickStrokeOpacity = wickStrokeOpacity; this.wickLineDash = wickLineDash; this.__wickLineDashOffset = wickLineDashOffset; this.dirtyPath = true; this.markDirty(); } computeDefaultGradientFillBBox() { const { __width: width, __centerX: centerX, __yOpen: yOpen, __yClose: yClose } = this; const boxTop = Math.min(yOpen, yClose); const boxBottom = Math.max(yOpen, yClose); const rectHeight = boxBottom - boxTop; const x0 = centerX - width / 2; const x1 = centerX + width / 2; return new BBox12(x0, boxTop, x1 - x0, rectHeight); } updatePath() { const { path, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, __wickStroke: wickStroke, __wickStrokeWidth: wickStrokeWidth, __wickStrokeOpacity: wickStrokeOpacity, wickLineDash, __wickLineDashOffset: wickLineDashOffset } = this; const { centerX, x0, x1, y0, y1, yOpen, yClose } = this.alignedCoordinates(); const pixelRatio = this.layerManager?.canvas.pixelRatio ?? 1; const wickStrokeAlignment = this.__wickStrokeAlignment > 0 ? pixelRatio / this.__wickStrokeAlignment / 2 % 1 : 0; this.path.clear(); this.wickPath.clear(); const needsWickPath = wickStroke != null && wickStroke !== stroke3 || wickStrokeWidth != null && wickStrokeWidth !== strokeWidth || wickStrokeOpacity != null && wickStrokeOpacity !== strokeOpacity || wickLineDash != null && wickLineDash !== lineDash || wickLineDashOffset != null && wickLineDashOffset !== lineDashOffset; const wickPath = needsWickPath ? this.wickPath : path; if (Math.abs(x1 - x0) <= 3) { wickPath.moveTo(centerX - wickStrokeAlignment, y0); wickPath.lineTo(centerX - wickStrokeAlignment, y1); return; } const boxTop = Math.min(yOpen, yClose); const boxBottom = Math.max(yOpen, yClose); const boxStrokeAdjustment = strokeWidth / 2; wickPath.moveTo(centerX - wickStrokeAlignment, y0); wickPath.lineTo(centerX - wickStrokeAlignment, boxTop + boxStrokeAdjustment); wickPath.moveTo(centerX - wickStrokeAlignment, y1); wickPath.lineTo(centerX - wickStrokeAlignment, boxBottom - boxStrokeAdjustment); const rectHeight = boxBottom - boxTop - 2 * boxStrokeAdjustment; if (rectHeight > 0) { path.rect( x0 + boxStrokeAdjustment, boxTop + boxStrokeAdjustment, x1 - x0 - 2 * boxStrokeAdjustment, rectHeight ); } else { const boxMid = (boxTop + boxBottom) / 2; path.moveTo(x0, boxMid); path.lineTo(x1, boxMid); } } drawPath(ctx) { super.drawPath(ctx); const { wickPath } = this; if (wickPath.isEmpty()) return; const { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, __wickStroke: wickStroke = stroke3, __wickStrokeWidth: wickStrokeWidth = strokeWidth, __wickStrokeOpacity: wickStrokeOpacity = strokeOpacity, wickLineDash = lineDash, __wickLineDashOffset: wickLineDashOffset = lineDashOffset } = this; if (wickStrokeWidth === 0) return; ctx.globalAlpha *= wickStrokeOpacity; if (typeof wickStroke === "string") { ctx.strokeStyle = wickStroke; } ctx.lineWidth = wickStrokeWidth; if (wickLineDash != null) { ctx.setLineDash([...wickLineDash]); } ctx.lineDashOffset = wickLineDashOffset; ctx.stroke(wickPath.getPath2D()); } }; __decorateClass([ (0, import_ag_charts_core121.DeclaredSceneChangeDetection)() ], CandlestickNode.prototype, "wickStroke", 2); __decorateClass([ (0, import_ag_charts_core121.DeclaredSceneChangeDetection)() ], CandlestickNode.prototype, "wickStrokeWidth", 2); __decorateClass([ (0, import_ag_charts_core121.DeclaredSceneChangeDetection)() ], CandlestickNode.prototype, "wickStrokeOpacity", 2); __decorateClass([ (0, import_ag_charts_core121.SceneArrayChangeDetection)() ], CandlestickNode.prototype, "wickLineDash", 2); __decorateClass([ (0, import_ag_charts_core121.DeclaredSceneChangeDetection)() ], CandlestickNode.prototype, "wickLineDashOffset", 2); __decorateClass([ (0, import_ag_charts_core121.DeclaredSceneChangeDetection)() ], CandlestickNode.prototype, "wickStrokeAlignment", 2); // packages/ag-charts-enterprise/src/series/candlestick/candlestickSeriesProperties.ts var import_ag_charts_community104 = require("ag-charts-community"); var import_ag_charts_core123 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/ohlc/ohlcSeriesProperties.ts var import_ag_charts_community103 = require("ag-charts-community"); var import_ag_charts_core122 = require("ag-charts-core"); var { AbstractBarSeriesProperties: AbstractBarSeriesProperties2, makeSeriesTooltip: makeSeriesTooltip2 } = import_ag_charts_community103._ModuleSupport; var OhlcSeriesItem = class extends import_ag_charts_core122.BaseProperties { constructor() { super(...arguments); this.stroke = "#333"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; } }; __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesItem.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesItem.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesItem.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesItem.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesItem.prototype, "lineDashOffset", 2); var OhlcSeriesItems = class extends import_ag_charts_core122.BaseProperties { constructor() { super(...arguments); this.up = new OhlcSeriesItem(); this.down = new OhlcSeriesItem(); } }; __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesItems.prototype, "up", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesItems.prototype, "down", 2); var OhlcSeriesBaseProperties = class extends AbstractBarSeriesProperties2 { }; __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "xKey", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "openKey", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "closeKey", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "highKey", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "lowKey", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "xName", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "yName", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "openName", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "closeName", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "highName", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesBaseProperties.prototype, "lowName", 2); var OhlcSeriesProperties = class extends OhlcSeriesBaseProperties { constructor() { super(...arguments); this.tooltip = makeSeriesTooltip2(); this.item = new OhlcSeriesItems(); } getStyle(itemType) { const { strokeWidth, strokeOpacity, stroke: stroke3, lineDash, lineDashOffset } = this.item[itemType]; return { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesProperties.prototype, "tooltip", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesProperties.prototype, "item", 2); __decorateClass([ import_ag_charts_core122.Property ], OhlcSeriesProperties.prototype, "itemStyler", 2); // packages/ag-charts-enterprise/src/series/candlestick/candlestickSeriesProperties.ts var { makeSeriesTooltip: makeSeriesTooltip3 } = import_ag_charts_community104._ModuleSupport; var CandlestickSeriesWick = class extends import_ag_charts_core123.BaseProperties { }; __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesWick.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesWick.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesWick.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesWick.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesWick.prototype, "lineDashOffset", 2); var CandlestickSeriesItem = class extends import_ag_charts_core123.BaseProperties { constructor() { super(...arguments); this.fill = "#c16068"; this.fillOpacity = 1; this.stroke = "#333"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.cornerRadius = 0; this.wick = new CandlestickSeriesWick(); } }; __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItem.prototype, "fill", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItem.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItem.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItem.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItem.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItem.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItem.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItem.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItem.prototype, "wick", 2); var CandlestickSeriesItems = class extends import_ag_charts_core123.BaseProperties { constructor() { super(...arguments); this.up = new CandlestickSeriesItem(); this.down = new CandlestickSeriesItem(); } }; __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItems.prototype, "up", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesItems.prototype, "down", 2); var CandlestickSeriesProperties = class extends OhlcSeriesBaseProperties { constructor() { super(...arguments); this.item = new CandlestickSeriesItems(); this.tooltip = makeSeriesTooltip3(); } getStyle(itemType) { const { fill, fillOpacity, strokeWidth, strokeOpacity, stroke: stroke3, lineDash, lineDashOffset, cornerRadius, wick } = this.item[itemType]; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, cornerRadius, opacity: 1, wick }; } }; __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesProperties.prototype, "item", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesProperties.prototype, "tooltip", 2); __decorateClass([ import_ag_charts_core123.Property ], CandlestickSeriesProperties.prototype, "itemStyler", 2); // packages/ag-charts-enterprise/src/series/candlestick/candlestickSeries.ts var CandlestickSeries = class extends OhlcSeriesBase { constructor() { super(...arguments); this.properties = new CandlestickSeriesProperties(); } nodeFactory() { const node = new CandlestickNode(); node.lineCap = "butt"; return node; } updateDatumStyles({ datumSelection, isHighlight }) { datumSelection.each((_, datum) => { datum.style = this.getItemStyle(datum.datumIndex, isHighlight, void 0, datum.itemType); }); } updateDatumNodes({ datumSelection, isHighlight }) { const { contextNodeData, properties } = this; if (!contextNodeData) { return; } const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); const { up, down } = properties.item; const fillBBox = this.getShapeFillBBox(); const series = this; datumSelection.each(function updateCandlestickNode(node, datum) { const { centerX, width, y, height, yOpen, yClose, crisp } = datum; const baseStyle = datum.isRising ? up : down; const highlightState = series.getHighlightState(highlightedDatum, isHighlight, datum.datumIndex); const style = datum.style ?? contextNodeData.styles[datum.itemType][highlightState]; node.setStaticProperties(centerX, width, y, height, yOpen, yClose, crisp); node.setStyleProperties(style, fillBBox); const styleWick = style?.wick; node.setWickProperties( styleWick?.stroke, styleWick?.strokeWidth, styleWick?.strokeOpacity, styleWick?.lineDash, styleWick?.lineDashOffset ); node.wickStrokeAlignment = baseStyle.wick.strokeWidth ?? baseStyle.strokeWidth; }); } legendItemSymbol() { const { up, down } = this.properties.item; const upColorStops = (0, import_ag_charts_core124.isGradientFill)(up.fill) ? up.fill.colorStops.map( (c) => typeof c === "string" ? c : { color: c.color, stop: c.stop == null ? void 0 : c.stop * 0.5 } ) : [ { color: (0, import_ag_charts_core124.isPatternFill)(up.fill) || (0, import_ag_charts_core124.isImageFill)(up.fill) ? up.stroke : up.fill, stop: 0 }, { color: (0, import_ag_charts_core124.isPatternFill)(up.fill) || (0, import_ag_charts_core124.isImageFill)(up.fill) ? up.stroke : up.fill, stop: 0.5 } ]; const downColorStops = (0, import_ag_charts_core124.isGradientFill)(down.fill) ? down.fill.colorStops.map( (c) => typeof c === "string" ? c : { color: c.color, stop: c.stop == null ? void 0 : c.stop * 0.5 } ) : [{ color: (0, import_ag_charts_core124.isPatternFill)(down.fill) || (0, import_ag_charts_core124.isImageFill)(down.fill) ? down.stroke : down.fill, stop: 0.5 }]; const fill = { type: "gradient", gradient: "linear", rotation: 90, colorStops: [...upColorStops, ...downColorStops], reverse: false }; const stroke3 = { type: "gradient", gradient: "linear", rotation: 90, colorStops: [ { color: up.stroke, stop: 0 }, { color: up.stroke, stop: 0.5 }, { color: down.stroke, stop: 0.5 } ], reverse: false }; return { marker: { fill, fillOpacity: up.fillOpacity, stroke: stroke3, strokeWidth: up.strokeWidth ?? 1, strokeOpacity: up.strokeOpacity ?? 1, lineDash: up.lineDash, lineDashOffset: up.lineDashOffset } }; } getLegendData(legendType) { const { id, data, visible, ctx: { legendManager } } = this; const { xKey, yName, showInLegend, legendItemName } = this.properties; if (!data?.data.length || !xKey || legendType !== "category") { return []; } return [ { legendType: "category", id, itemId: id, seriesId: id, enabled: visible && legendManager.getItemEnabled({ seriesId: id, itemId: id }), label: { text: legendItemName ?? yName ?? id }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend } ]; } hasItemStylers() { return this.properties.itemStyler != null; } }; CandlestickSeries.className = "CandleStickSeries"; CandlestickSeries.type = "candlestick"; // packages/ag-charts-enterprise/src/series/candlestick/candlestickSeriesOptionsDef.ts var import_ag_charts_community106 = require("ag-charts-community"); var import_ag_charts_core125 = require("ag-charts-core"); var { candlestickSeriesThemeableOptionsDef } = import_ag_charts_community106._ModuleSupport; var candlestickSeriesOptionsDef = { ...import_ag_charts_core125.commonSeriesOptionsDefs, ...candlestickSeriesThemeableOptionsDef, type: (0, import_ag_charts_core125.required)((0, import_ag_charts_core125.constant)("candlestick")), xKey: (0, import_ag_charts_core125.required)(import_ag_charts_core125.string), openKey: (0, import_ag_charts_core125.required)(import_ag_charts_core125.string), highKey: (0, import_ag_charts_core125.required)(import_ag_charts_core125.string), lowKey: (0, import_ag_charts_core125.required)(import_ag_charts_core125.string), closeKey: (0, import_ag_charts_core125.required)(import_ag_charts_core125.string), xName: import_ag_charts_core125.string, yName: import_ag_charts_core125.string, openName: import_ag_charts_core125.string, highName: import_ag_charts_core125.string, lowName: import_ag_charts_core125.string, closeName: import_ag_charts_core125.string, xKeyAxis: import_ag_charts_core125.string, yKeyAxis: import_ag_charts_core125.string }; candlestickSeriesOptionsDef.pickOutsideVisibleMinorAxis = (0, import_ag_charts_core125.undocumented)(import_ag_charts_core125.boolean); candlestickSeriesOptionsDef.focusPriority = (0, import_ag_charts_core125.undocumented)(import_ag_charts_core125.number); // packages/ag-charts-enterprise/src/series/candlestick/candlestickThemes.ts var import_ag_charts_community107 = require("ag-charts-community"); var import_ag_charts_core126 = require("ag-charts-core"); function itemTheme(key) { return { fill: { $applySwitch: [ { $path: "type" }, { $if: [ { $eq: [{ $palette: "type" }, "user-indexed"] }, key === "up" ? "transparent" : { $palette: "fill" }, { $palette: `${key}.fill` } ] }, ["gradient", (0, import_ag_charts_core126.FILL_GRADIENT_LINEAR_KEYED_DEFAULTS)(key)], ["image", import_ag_charts_core126.FILL_IMAGE_DEFAULTS], ["pattern", (0, import_ag_charts_core126.FILL_PATTERN_KEYED_DEFAULTS)(key)] ] }, stroke: { $if: [ { $eq: [{ $palette: "type" }, "user-indexed"] }, { $palette: "stroke" }, { $palette: `${key}.stroke` } ] } }; } var CANDLESTICK_SERIES_THEME = { series: { item: { up: itemTheme("up"), down: itemTheme("down") }, tooltip: { range: { $path: ["/tooltip/range", "nearest"] } }, highlight: import_ag_charts_core126.MULTI_SERIES_HIGHLIGHT_STYLE }, animation: { enabled: false }, axes: { [import_ag_charts_core126.CARTESIAN_AXIS_TYPE.NUMBER]: { crosshair: { snap: false } }, [import_ag_charts_core126.CARTESIAN_AXIS_TYPE.ORDINAL_TIME]: { groupPaddingInner: 0, crosshair: { enabled: true } } } }; // packages/ag-charts-enterprise/src/series/candlestick/candlestickModule.ts var { predictCartesianFinancialAxis } = import_ag_charts_community108._ModuleSupport; var CandlestickSeriesModule = { type: "series", name: "candlestick", chartType: "cartesian", enterprise: true, groupable: false, version: import_ag_charts_community108.VERSION, dependencies: [import_ag_charts_community108.CartesianChartModule], options: candlestickSeriesOptionsDef, matchingKeys: ["xKey", "lowKey", "highKey", "openKey", "closeKey", "normalizedTo"], predictAxis: predictCartesianFinancialAxis, defaultAxes: { y: { type: import_ag_charts_core127.CARTESIAN_AXIS_TYPE.NUMBER, position: import_ag_charts_core127.CARTESIAN_POSITION.LEFT }, x: { type: import_ag_charts_core127.CARTESIAN_AXIS_TYPE.ORDINAL_TIME, position: import_ag_charts_core127.CARTESIAN_POSITION.BOTTOM } }, axisKeys: { [import_ag_charts_core127.ChartAxisDirection.X]: "xKeyAxis", [import_ag_charts_core127.ChartAxisDirection.Y]: "yKeyAxis" }, themeTemplate: CANDLESTICK_SERIES_THEME, create: (ctx) => new CandlestickSeries(ctx) }; // packages/ag-charts-enterprise/src/series/heatmap/heatmapModule.ts var import_ag_charts_community113 = require("ag-charts-community"); var import_ag_charts_core134 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/heatmap/heatmapSeries.ts var import_ag_charts_community111 = require("ag-charts-community"); var import_ag_charts_core131 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/util/labelFormatter.ts var import_ag_charts_core128 = require("ag-charts-core"); function generateLabelSecondaryLabelFontSizeCandidates(label, secondaryLabel) { const { fontSize: labelFontSize, minimumFontSize: labelMinimumFontSize = labelFontSize } = label; const { fontSize: secondaryLabelFontSize, minimumFontSize: secondaryLabelMinimumFontSize = secondaryLabelFontSize } = secondaryLabel; const labelTracks = labelFontSize - labelMinimumFontSize; const secondaryLabelTracks = secondaryLabelFontSize - secondaryLabelMinimumFontSize; let currentLabelFontSize = label.fontSize; let currentSecondaryLabelFontSize = secondaryLabel.fontSize; const out = [{ labelFontSize, secondaryLabelFontSize }]; while (currentLabelFontSize > labelMinimumFontSize || currentSecondaryLabelFontSize > secondaryLabelMinimumFontSize) { const labelProgress = labelTracks > 0 ? (currentLabelFontSize - labelMinimumFontSize) / labelTracks : -1; const secondaryLabelProgress = secondaryLabelTracks > 0 ? (currentSecondaryLabelFontSize - secondaryLabelMinimumFontSize) / secondaryLabelTracks : -1; if (labelProgress > secondaryLabelProgress) { currentLabelFontSize--; } else { currentSecondaryLabelFontSize--; } out.push({ labelFontSize: currentLabelFontSize, secondaryLabelFontSize: currentSecondaryLabelFontSize }); } out.reverse(); return out; } function formatStackedLabels(labelValue, labelProps, secondaryLabelValue, secondaryLabelProps, { padding: padding2 }, sizeFittingHeight) { const { spacing = 0 } = labelProps; const widthAdjust = 2 * padding2; const heightAdjust = 2 * padding2 + spacing; const minimumHeight = (labelProps.minimumFontSize ?? labelProps.fontSize) + (secondaryLabelProps.minimumFontSize ?? secondaryLabelProps.fontSize); if (minimumHeight > sizeFittingHeight(minimumHeight + heightAdjust, false).height - heightAdjust) return; const fontSizeCandidates = generateLabelSecondaryLabelFontSizeCandidates(labelProps, secondaryLabelProps); const labelTextSizeProps = { fontFamily: labelProps.fontFamily, fontStyle: labelProps.fontStyle, fontWeight: labelProps.fontWeight }; const secondaryLabelTextSizeProps = { fontFamily: secondaryLabelProps.fontFamily, fontStyle: secondaryLabelProps.fontStyle, fontWeight: secondaryLabelProps.fontWeight }; let label; let secondaryLabel; return (0, import_ag_charts_core128.findMaxValue)(0, fontSizeCandidates.length - 1, (index) => { const { labelFontSize, secondaryLabelFontSize } = fontSizeCandidates[index]; const allowTruncation = index === 0; const labelFont = { ...labelTextSizeProps, fontSize: labelFontSize }; const secondaryLabelFont = { ...secondaryLabelTextSizeProps, fontSize: secondaryLabelFontSize }; const labelLineHeight = (0, import_ag_charts_core128.cachedTextMeasurer)(labelFont).lineHeight(); const secondaryLabelLineHeight = (0, import_ag_charts_core128.cachedTextMeasurer)(secondaryLabelFont).lineHeight(); const sizeFitting = sizeFittingHeight( labelLineHeight + secondaryLabelLineHeight + heightAdjust, allowTruncation ); const availableWidth = sizeFitting.width - widthAdjust; const availableHeight = sizeFitting.height - heightAdjust; if (labelLineHeight + secondaryLabelLineHeight > availableHeight) return; if (label?.fontSize !== labelFontSize) { label = wrapLabel( labelProps, labelValue, availableWidth, availableHeight, labelFont, labelProps.wrapping, allowTruncation ? labelProps.overflowStrategy : "hide" ); } if (label == null || label.width > availableWidth || label.height > availableHeight) return; if (secondaryLabel?.fontSize !== secondaryLabelFontSize) { secondaryLabel = wrapLabel( secondaryLabelProps, secondaryLabelValue, availableWidth, availableHeight, secondaryLabelFont, secondaryLabelProps.wrapping, allowTruncation ? secondaryLabelProps.overflowStrategy : "hide" ); } if (secondaryLabel == null) return; const totalLabelHeight = label.height + secondaryLabel.height; if (secondaryLabel.width > availableWidth || totalLabelHeight > availableHeight) return; return { width: Math.max(label.width, secondaryLabel.width), height: totalLabelHeight + spacing, meta: sizeFitting.meta, label, secondaryLabel }; }); } function formatSingleLabel(value, props, { padding: padding2 }, sizeFittingHeight) { const sizeAdjust = 2 * padding2; const minimumFontSize = Math.min(props.minimumFontSize ?? props.fontSize, props.fontSize); const textSizeProps = { fontFamily: props.fontFamily, fontStyle: props.fontStyle, fontWeight: props.fontWeight }; return (0, import_ag_charts_core128.findMaxValue)(minimumFontSize, props.fontSize, (fontSize) => { const currentFont = { ...textSizeProps, fontSize }; const measurer3 = (0, import_ag_charts_core128.cachedTextMeasurer)(currentFont); const allowTruncation = fontSize === minimumFontSize; const lineHeight = props.lineHeight ?? measurer3.lineHeight(); const sizeFitting = sizeFittingHeight(lineHeight + sizeAdjust, allowTruncation); const availableWidth = sizeFitting.width - sizeAdjust; const availableHeight = sizeFitting.height - sizeAdjust; if (lineHeight > availableHeight || availableWidth < 0) return; const lines = (0, import_ag_charts_core128.wrapLines)(value, { maxWidth: availableWidth, maxHeight: availableHeight, font: currentFont, textWrap: props.wrapping, overflow: (allowTruncation ? props.overflowStrategy : null) ?? "hide" }); if (!lines.length) return; const { width, height } = measurer3.measureLines(lines); const text2 = lines.join("\n"); return [{ width, height, text: text2, fontSize, lineHeight }, sizeFitting.meta]; }); } function hasInvalidFontSize(label) { return label?.minimumFontSize != null && label?.fontSize != null && label?.minimumFontSize > label?.fontSize; } function formatLabels(baseLabelValue, labelProps, baseSecondaryLabelValue, secondaryLabelProps, layoutParams, sizeFittingHeight) { const labelValue = labelProps.enabled ? baseLabelValue : void 0; const secondaryLabelValue = secondaryLabelProps.enabled ? baseSecondaryLabelValue : void 0; if (hasInvalidFontSize(labelProps) || hasInvalidFontSize(secondaryLabelProps)) { import_ag_charts_core128.Logger.warnOnce(`minimumFontSize should be set to a value less than or equal to the font size`); } let value; if (labelValue != null && secondaryLabelValue != null) { value = formatStackedLabels( labelValue, labelProps, secondaryLabelValue, secondaryLabelProps, layoutParams, sizeFittingHeight ); } let labelMeta; if (value == null && labelValue != null) { labelMeta = formatSingleLabel(labelValue, labelProps, layoutParams, sizeFittingHeight); } if (labelMeta != null) { const [label, meta] = labelMeta; value = { width: label.width, height: label.height, meta, label, secondaryLabel: void 0 }; } let secondaryLabelMeta; if (value == null && labelValue == null && secondaryLabelValue != null) { secondaryLabelMeta = formatSingleLabel( secondaryLabelValue, secondaryLabelProps, layoutParams, sizeFittingHeight ); } if (secondaryLabelMeta != null) { const [secondaryLabel, meta] = secondaryLabelMeta; value = { width: secondaryLabel.width, height: secondaryLabel.height, meta, label: void 0, secondaryLabel }; } return value; } function wrapLabel(props, text2, maxWidth, maxHeight, font3, textWrap, overflow) { const lines = (0, import_ag_charts_core128.wrapLines)(text2, { maxWidth, maxHeight, font: font3, textWrap, overflow }); if (!lines.length) return; const measurer3 = (0, import_ag_charts_core128.cachedTextMeasurer)(font3); const lineHeight = props.lineHeight ?? measurer3.lineHeight(); const { width } = measurer3.measureLines(lines); return { width, lineHeight, text: lines.join("\n"), height: lines.length * lineHeight, fontSize: font3.fontSize }; } // packages/ag-charts-enterprise/src/series/heatmap/heatmapSeriesProperties.ts var import_ag_charts_community110 = require("ag-charts-community"); var import_ag_charts_core130 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/util/autoSizedLabel.ts var import_ag_charts_community109 = require("ag-charts-community"); var import_ag_charts_core129 = require("ag-charts-core"); var BaseAutoSizedLabel = class extends import_ag_charts_community109._ModuleSupport.Label { constructor() { super(...arguments); this.wrapping = "on-space"; this.overflowStrategy = "ellipsis"; } }; __decorateClass([ import_ag_charts_core129.Property ], BaseAutoSizedLabel.prototype, "wrapping", 2); __decorateClass([ import_ag_charts_core129.Property ], BaseAutoSizedLabel.prototype, "overflowStrategy", 2); __decorateClass([ import_ag_charts_core129.Property ], BaseAutoSizedLabel.prototype, "lineHeight", 2); __decorateClass([ import_ag_charts_core129.Property ], BaseAutoSizedLabel.prototype, "minimumFontSize", 2); var AutoSizedLabel = class extends BaseAutoSizedLabel { constructor() { super(...arguments); this.spacing = 0; } }; __decorateClass([ import_ag_charts_core129.Property ], AutoSizedLabel.prototype, "spacing", 2); var AutoSizedSecondaryLabel = class extends BaseAutoSizedLabel { }; // packages/ag-charts-enterprise/src/series/heatmap/heatmapSeriesProperties.ts var { CartesianSeriesProperties, makeSeriesTooltip: makeSeriesTooltip4 } = import_ag_charts_community110._ModuleSupport; var HeatmapSeriesProperties = class extends CartesianSeriesProperties { constructor() { super(...arguments); this.colorRange = ["black", "black"]; this.stroke = "black"; this.strokeOpacity = 1; this.strokeWidth = 0; this.textAlign = "center"; this.verticalAlign = "middle"; this.itemPadding = 0; this.label = new AutoSizedLabel(); this.tooltip = makeSeriesTooltip4(); } }; __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "title", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "xKey", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "yKey", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "colorKey", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "xName", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "yName", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "colorName", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "colorRange", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "textAlign", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "verticalAlign", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "itemPadding", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core130.Property ], HeatmapSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/heatmap/heatmapSeries.ts var { SeriesNodePickMode: SeriesNodePickMode3, computeBarFocusBounds: computeBarFocusBounds3, getMissCount, valueProperty: valueProperty5, DEFAULT_CARTESIAN_DIRECTION_KEYS, DEFAULT_CARTESIAN_DIRECTION_NAMES, createDatumId: createDatumId3, ColorScale, Rect, PointerEvents, addHitTestersToQuadtree, findQuadtreeMatch, updateLabelNode, upsertNodeDatum: upsertNodeDatum2 } = import_ag_charts_community111._ModuleSupport; var HeatmapSeriesNodeEvent = class extends import_ag_charts_community111._ModuleSupport.CartesianSeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); this.colorKey = series.properties.colorKey; } }; var textAlignFactors = { left: -0.5, center: 0, right: -0.5 }; var verticalAlignFactors = { top: -0.5, middle: 0, bottom: -0.5 }; var HeatmapSeries = class extends import_ag_charts_community111._ModuleSupport.CartesianSeries { constructor(moduleCtx) { super({ moduleCtx, propertyKeys: { ...DEFAULT_CARTESIAN_DIRECTION_KEYS, color: ["colorKey"] }, propertyNames: { ...DEFAULT_CARTESIAN_DIRECTION_NAMES, color: ["colorName"] }, categoryKey: void 0, pickModes: [SeriesNodePickMode3.NEAREST_NODE, SeriesNodePickMode3.EXACT_SHAPE_MATCH], pathsPerSeries: [] }); this.properties = new HeatmapSeriesProperties(); this.NodeEvent = HeatmapSeriesNodeEvent; this.colorScale = new ColorScale(); } async processData(dataController) { const xAxis = this.axes[import_ag_charts_core131.ChartAxisDirection.X]; const yAxis = this.axes[import_ag_charts_core131.ChartAxisDirection.Y]; if (!xAxis || !yAxis) { return; } const { xKey, yKey, colorRange, colorKey } = this.properties; const xScale = this.axes[import_ag_charts_core131.ChartAxisDirection.X]?.scale; const yScale = this.axes[import_ag_charts_core131.ChartAxisDirection.Y]?.scale; const { xScaleType, yScaleType } = this.getScaleInformation({ xScale, yScale }); const colorScaleType = this.colorScale.type; const allowNullKey = this.properties.allowNullKeys ?? false; const { dataModel, processedData } = await this.requestDataModel(dataController, this.data, { props: [ valueProperty5(xKey, xScaleType, { id: "xValue", allowNullKey }), valueProperty5(yKey, yScaleType, { id: "yValue", allowNullKey }), ...colorKey ? [valueProperty5(colorKey, colorScaleType, { id: "colorValue", invalidValue: void 0 })] : [] ] }); if (this.isColorScaleValid()) { const colorKeyIdx = dataModel.resolveProcessedDataIndexById(this, "colorValue"); const rawDomain = processedData.domain.values[colorKeyIdx].filter((v) => v != null); const domain = (0, import_ag_charts_core131.extent)(rawDomain); this.colorScale.domain = domain ?? []; if (domain?.length && domain[0] === domain[1]) { const midIndex = Math.floor(colorRange.length / 2); this.colorScale.range = [colorRange[midIndex], colorRange[midIndex]]; } else { this.colorScale.range = colorRange; } this.colorScale.update(); } } isColorScaleValid() { const { colorKey } = this.properties; if (!colorKey) { return false; } const { dataModel, processedData } = this; if (!dataModel || !processedData) { return false; } const colorDataIdx = dataModel.resolveProcessedDataIndexById(this, "colorValue"); const dataCount = processedData.input.count; const missCount = getMissCount(this, processedData.defs.values[colorDataIdx].missing); const colorKeyIdx = dataModel.resolveProcessedDataIndexById(this, "colorValue"); const actualCount = processedData.domain.values[colorKeyIdx].filter((v) => v != null).length; const colorDataMissing = dataCount === 0 || dataCount === missCount || actualCount === 0; return !colorDataMissing; } xCoordinateRange(xValue, pixelSize) { const xScale = this.axes[import_ag_charts_core131.ChartAxisDirection.X].scale; const xOffset = pixelSize * (xScale.bandwidth ?? 0) / 2; const x = xScale.convert(xValue) + xOffset; const width = pixelSize * (xScale.bandwidth ?? 10); return [x, x + width]; } yCoordinateRange(yValues, pixelSize) { const yScale = this.axes[import_ag_charts_core131.ChartAxisDirection.Y].scale; const yOffset = pixelSize * (yScale.bandwidth ?? 0) / 2; const y = yScale.convert(yValues[0]) + yOffset; const height = pixelSize * (yScale.bandwidth ?? 10); return [y, y + height]; } getSeriesDomain(direction) { const { dataModel, processedData } = this; if (!dataModel || !processedData) return { domain: [] }; if (direction === import_ag_charts_core131.ChartAxisDirection.X) { const domain = dataModel.getDomain(this, `xValue`, "value", processedData).domain; return { domain }; } else { const domain = dataModel.getDomain(this, `yValue`, "value", processedData).domain; return { domain }; } } getSeriesRange() { return [Number.NaN, Number.NaN]; } /** * Template method hook: Validates preconditions for createNodeData. * Overrides base to add heatmap-specific category axis validation. */ validateCreateNodeDataPreconditions() { const result = super.validateCreateNodeDataPreconditions(); if (!result) return void 0; const { xAxis, yAxis } = result; if (xAxis.type !== "category" || yAxis.type !== "category") { import_ag_charts_core131.Logger.warnOnce( `Heatmap series expected axes to have "category" type, but received "${xAxis.type}" and "${yAxis.type}" instead.` ); return void 0; } return result; } /** * Template method hook: Iterates over data and creates/updates node datums. */ populateNodeData(ctx) { for (const [datumIndex, datum] of ctx.rawData.entries()) { const nodeDatum = upsertNodeDatum2( ctx, { datumIndex, datum }, (c, p) => this.createNodeDatum(c, p.datumIndex, p.datum), (c, n, p) => this.updateNodeDatum(c, n, p.datumIndex, p.datum) ); if (nodeDatum) { const labelDatum = this.createLabelDatum(ctx, datumIndex, datum, nodeDatum); if (labelDatum) { ctx.labels.push(labelDatum); } } } } /** * Template method hook: Creates the result object shell. */ initializeResult(ctx) { return { itemId: this.properties.yKey ?? this.id, nodeData: ctx.nodes, labelData: ctx.labels, scales: this.calculateScaling(), visible: this.visible }; } /** * Template method hook: Creates the shared context for datum creation. * Caches expensive lookups and computations that are constant across all datums. */ createNodeDatumContext(xAxis, yAxis) { const { dataModel, processedData, contextNodeData } = this; if (!dataModel || !processedData) return void 0; const { xKey, xName, yKey, yName, colorKey, colorName, textAlign, verticalAlign, itemPadding } = this.properties; const xScale = xAxis.scale; const yScale = yAxis.scale; const xValues = dataModel.resolveColumnById(this, `xValue`, processedData); const yValues = dataModel.resolveColumnById(this, `yValue`, processedData); const colorValues = colorKey ? dataModel.resolveColumnById(this, `colorValue`, processedData) : void 0; const colorDomain = colorKey ? dataModel.getDomain(this, "colorValue", "value", processedData).domain : []; const width = xScale.bandwidth ?? 10; const height = yScale.bandwidth ?? 10; const rawData = processedData.dataSources.get(this.id)?.data ?? []; const canIncrementallyUpdate = contextNodeData?.nodeData != null && processedData.changeDescription != null; return { // Base context fields xAxis, yAxis, xScale, yScale, rawData, xValues, xKey, yKey, xName, yName, animationEnabled: !this.ctx.animationManager.isSkipped(), canIncrementallyUpdate, nodes: canIncrementallyUpdate ? contextNodeData.nodeData : [], nodeIndex: 0, // Heatmap-specific positioning xOffset: (xScale.bandwidth ?? 0) / 2, yOffset: (yScale.bandwidth ?? 0) / 2, width, height, textAlignFactor: (width - 2 * itemPadding) * textAlignFactors[textAlign], verticalAlignFactor: (height - 2 * itemPadding) * verticalAlignFactors[verticalAlign], // Heatmap-specific data yValues, colorKey, colorName, colorValues, colorDomain, itemPadding, // Label support - labels are always rebuilt from scratch (not incrementally updated) labels: [], labelIndex: 0 }; } /** * Creates a skeleton HeatmapNodeDatum with minimal required fields. * The node will be populated by updateNodeDatum. */ createSkeletonNodeDatum(ctx, datumIndex, datum) { const { xKey, yKey, width, height, colorValues } = ctx; const xDatum = ctx.xValues[datumIndex]; const yDatum = ctx.yValues[datumIndex]; const colorValue = colorValues?.[datumIndex]; return { series: this, datumIndex, yKey, xKey, xValue: xDatum, yValue: yDatum, colorValue, datum, point: { x: 0, y: 0, size: 0 }, width, height, midPoint: { x: 0, y: 0 }, missing: colorValues != null && colorValue == null, style: {} }; } /** * Updates an existing HeatmapNodeDatum in-place. */ updateNodeDatum(ctx, node, datumIndex, datum) { const { xScale, yScale, xOffset, yOffset, width, height, xKey, yKey, colorValues } = ctx; const mutableNode = node; const xDatum = ctx.xValues[datumIndex]; const yDatum = ctx.yValues[datumIndex]; const x = xScale.convert(xDatum) + xOffset; const y = yScale.convert(yDatum) + yOffset; if (!Number.isFinite(x) || !Number.isFinite(y)) return; const colorValue = colorValues?.[datumIndex]; mutableNode.datumIndex = datumIndex; mutableNode.datum = datum; mutableNode.yKey = yKey; mutableNode.xKey = xKey; mutableNode.xValue = xDatum; mutableNode.yValue = yDatum; mutableNode.colorValue = colorValue; mutableNode.width = width; mutableNode.height = height; mutableNode.missing = colorValues != null && colorValue == null; const mutablePoint = mutableNode.point; mutablePoint.x = x; mutablePoint.y = y; mutablePoint.size = 0; mutableNode.midPoint.x = x; mutableNode.midPoint.y = y; mutableNode.style = this.getItemStyle({ datumIndex, datum, colorValue }, false); } /** * Creates a HeatmapNodeDatum for a single data point. * Returns undefined for invalid data points (e.g., null/undefined keys when not allowed). */ createNodeDatum(ctx, datumIndex, datum) { const { xScale, yScale, xOffset, yOffset } = ctx; const xDatum = ctx.xValues[datumIndex]; const yDatum = ctx.yValues[datumIndex]; const x = xScale.convert(xDatum) + xOffset; const y = yScale.convert(yDatum) + yOffset; if (!Number.isFinite(x) || !Number.isFinite(y)) { return void 0; } const node = this.createSkeletonNodeDatum(ctx, datumIndex, datum); this.updateNodeDatum(ctx, node, datumIndex, datum); return node; } createLabelDatum(ctx, datumIndex, datum, nodeDatum) { const { label } = this.properties; const { width, height, textAlignFactor, verticalAlignFactor, itemPadding, colorKey, colorName, colorDomain, xKey, yKey, xName, yName } = ctx; const colorValue = ctx.colorValues?.[datumIndex]; const labelText = label.enabled && colorValue != null ? this.getLabelText( colorValue, datum, colorKey, "color", colorDomain, label, { value: colorValue, datum, colorKey, colorName, xKey, yKey, xName, yName } ) : void 0; const sizeFittingHeight = () => ({ width, height, meta: null }); const labels = formatLabels( (0, import_ag_charts_core131.toPlainText)(labelText), this.properties.label, void 0, this.properties.label, { padding: itemPadding }, sizeFittingHeight ); if (labels?.label == null) { return void 0; } const { text: text2, fontSize, lineHeight, height: labelHeight } = labels.label; const { fontStyle, fontFamily, fontWeight, color: color7 } = this.properties.label; const { textAlign, verticalAlign } = this.properties; const lx = nodeDatum.point.x + textAlignFactor * (width - 2 * itemPadding); const ly = nodeDatum.point.y + verticalAlignFactor * (height - 2 * itemPadding) - (labels.height - labelHeight) * 0.5; return { series: this, datum, datumIndex, text: text2, fontSize, lineHeight, fontStyle, fontFamily, fontWeight, color: color7, textAlign, textBaseline: verticalAlign, x: lx, y: ly, style: nodeDatum.style }; } nodeFactory() { return new Rect(); } update(params) { this.ctx.animationManager.skipCurrentBatch(); return super.update(params); } updateDatumSelection(opts) { const { nodeData, datumSelection } = opts; const data = nodeData ?? []; return datumSelection.update(data); } getItemStyle({ datumIndex, datum, colorValue }, isHighlight, highlightState) { const { properties } = this; const { itemStyler, stroke: stroke3, strokeWidth, strokeOpacity } = properties; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex, highlightState); const style = (0, import_ag_charts_core131.mergeDefaults)(highlightStyle, { fill: this.isColorScaleValid() && colorValue != null ? this.colorScale.convert(colorValue) : "transparent", fillOpacity: 1, stroke: stroke3, strokeWidth, strokeOpacity, opacity: 1 }); let overrides; if (itemStyler != null && datumIndex != null) { overrides = this.cachedDatumCallback(createDatumId3(datumIndex, isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(datum, datumIndex, isHighlight, style); return this.callWithContext(itemStyler, params); }); } return overrides ? (0, import_ag_charts_core131.mergeDefaults)(overrides, style) : style; } makeItemStylerParams(datum, datumIndex, isHighlight, style) { const { id: seriesId, properties } = this; const { xKey, yKey } = properties; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum, xKey, yKey, highlightState, ...style, fill }; } updateDatumStyles({ datumSelection, isHighlight }) { const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); datumSelection.each((_, nodeDatum) => { const highlightState = this.getHighlightState(activeHighlight, isHighlight, nodeDatum.datumIndex); nodeDatum.style = this.getItemStyle(nodeDatum, isHighlight, highlightState); }); } updateDatumNodes({ datumSelection }) { const xAxis = this.axes[import_ag_charts_core131.ChartAxisDirection.X]; const [visibleMin, visibleMax] = xAxis?.visibleRange ?? []; const isZoomed = visibleMin !== 0 || visibleMax !== 1; const crisp = !isZoomed; datumSelection.each((rect, nodeDatum) => { const { point, width, height, style } = nodeDatum; rect.setStyleProperties(style); rect.crisp = crisp; rect.x = Math.floor(point.x - width / 2); rect.y = Math.floor(point.y - height / 2); rect.width = Math.ceil(width); rect.height = Math.ceil(height); }); } updateLabelSelection(opts) { const { labelData, labelSelection } = opts; const { enabled } = this.properties.label; const data = enabled ? labelData : []; return labelSelection.update(data); } updateLabelNodes(opts) { const { isHighlight = false } = opts; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); opts.labelSelection.each((text2, datum) => { text2.pointerEvents = PointerEvents.None; text2.text = datum.text; text2.fillOpacity = this.getHighlightStyle(isHighlight, datum.datumIndex)?.opacity ?? 1; updateLabelNode( this, text2, this.properties, this.properties.label, datum, isHighlight, activeHighlight ); }); } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, axes, properties, colorScale, ctx } = this; const { formatManager } = ctx; const { xKey, xName, yKey, yName, colorKey, colorName, colorRange, title, legendItemName, tooltip } = properties; const xAxis = axes[import_ag_charts_core131.ChartAxisDirection.X]; const yAxis = axes[import_ag_charts_core131.ChartAxisDirection.Y]; if (!dataModel || !processedData || !xAxis || !yAxis) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const xValue = dataModel.resolveColumnById(this, `xValue`, processedData)[datumIndex]; const yValue = dataModel.resolveColumnById(this, `yValue`, processedData)[datumIndex]; const colorValue = colorKey != null && this.isColorScaleValid() ? dataModel.resolveColumnById(this, `colorValue`, processedData)[datumIndex] : void 0; const allowNullKeys = this.properties.allowNullKeys ?? false; if (xValue === void 0 && !allowNullKeys) return; const data = []; let fill; if (colorValue == null) { fill = colorRange[0]; } else { fill = colorScale.convert(colorValue); const domain = dataModel.getDomain(this, `colorValue`, "value", processedData).domain; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: colorValue, datum, seriesId, legendItemName, key: colorKey, source: "tooltip", property: "color", domain, boundSeries: this.getFormatterContext("color"), fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: colorName, fallbackLabel: colorKey, value: content ?? (0, import_ag_charts_core131.formatValue)(colorValue) }); } data.push( { label: xName, fallbackLabel: xKey, value: this.getAxisValueText(xAxis, "tooltip", xValue, datum, xKey, legendItemName) }, { label: yName, fallbackLabel: yKey, value: this.getAxisValueText(yAxis, "tooltip", yValue, datum, yKey, legendItemName) } ); const format = this.getItemStyle({ datumIndex, datum, colorValue }, false); if (format.fill != null) { fill = format.fill; } const symbol = fill == null ? void 0 : { marker: { shape: "square", fill, fillOpacity: 1, stroke: void 0, strokeWidth: 0, strokeOpacity: 1, lineDash: [0], lineDashOffset: 0 } }; return this.formatTooltipWithContext( tooltip, { title: title ?? legendItemName, symbol, data }, { seriesId, datum, title, xKey, xName, yKey, yName, colorKey, colorName, ...format } ); } getLegendData(legendType) { if (legendType !== "gradient" || !this.isColorScaleValid() || !this.dataModel) { return []; } return [ { legendType: "gradient", enabled: this.visible, seriesId: this.id, series: this.getFormatterContext("color"), colorDomain: this.colorScale.domain, colorRange: this.colorScale.range } ]; } isLabelEnabled() { return this.properties.label.enabled && Boolean(this.properties.colorKey); } getBandScalePadding() { return { inner: 0, outer: 0 }; } computeFocusBounds({ datumIndex }) { const datum = this.contextNodeData?.nodeData[datumIndex]; if (datum === void 0) return void 0; const { width, height, midPoint } = datum; const focusRect = { x: midPoint.x - width / 2, y: midPoint.y - height / 2, width, height }; return computeBarFocusBounds3(this, focusRect); } initQuadTree(quadtree) { addHitTestersToQuadtree(quadtree, this.datumNodesIter()); } pickNodesExactShape(point) { const item = findQuadtreeMatch(this, point); return item != null && item.distance <= 0 ? [item.datum] : []; } pickNodeClosestDatum(point) { return findQuadtreeMatch(this, point); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.label.itemStyler != null || this.isColorScaleValid(); } }; HeatmapSeries.className = "HeatmapSeries"; HeatmapSeries.type = "heatmap"; // packages/ag-charts-enterprise/src/series/heatmap/heatmapSeriesOptionsDef.ts var import_ag_charts_community112 = require("ag-charts-community"); var import_ag_charts_core132 = require("ag-charts-core"); var { heatmapSeriesThemeableOptionsDef } = import_ag_charts_community112._ModuleSupport; var heatmapSeriesOptionsDef = { ...(0, import_ag_charts_core132.without)(heatmapSeriesThemeableOptionsDef, ["showInLegend"]), ...(0, import_ag_charts_core132.without)(import_ag_charts_core132.commonSeriesOptionsDefs, ["showInLegend"]), type: (0, import_ag_charts_core132.required)((0, import_ag_charts_core132.constant)("heatmap")), xKey: (0, import_ag_charts_core132.required)(import_ag_charts_core132.string), yKey: (0, import_ag_charts_core132.required)(import_ag_charts_core132.string), xKeyAxis: import_ag_charts_core132.string, yKeyAxis: import_ag_charts_core132.string, colorKey: import_ag_charts_core132.string, xName: import_ag_charts_core132.string, yName: import_ag_charts_core132.string, colorName: import_ag_charts_core132.string, colorRange: (0, import_ag_charts_core132.arrayOf)(import_ag_charts_core132.color) }; // packages/ag-charts-enterprise/src/series/heatmap/heatmapThemes.ts var import_ag_charts_core133 = require("ag-charts-core"); var HEATMAP_SERIES_THEME = { series: { stroke: { $if: [ { $eq: [{ $palette: "type" }, "inbuilt"] }, { $ref: "chartBackgroundColor" }, { $path: ["/0", { $palette: "stroke" }, { $palette: "strokes" }] } ] }, strokeWidth: { $isUserOption: ["./stroke", 2, void 0] }, label: { ...import_ag_charts_core133.LABEL_BOXING_DEFAULTS, enabled: false, color: { $ref: "textColor" }, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, wrapping: "on-space", overflowStrategy: "ellipsis" }, itemPadding: 3, highlight: { unhighlightedItem: { opacity: 0.6 } } }, gradientLegend: { enabled: true } }; HEATMAP_SERIES_THEME.series.colorRange = { $if: [{ $eq: [{ $palette: "type" }, "inbuilt"] }, { $palette: "divergingColors" }, import_ag_charts_core133.SAFE_RANGE2_OPERATION] }; // packages/ag-charts-enterprise/src/series/heatmap/heatmapModule.ts var HeatmapSeriesModule = { type: "series", name: "heatmap", chartType: "cartesian", enterprise: true, version: import_ag_charts_community113.VERSION, dependencies: [import_ag_charts_community113.CartesianChartModule], options: heatmapSeriesOptionsDef, defaultAxes: { y: { type: import_ag_charts_core134.CARTESIAN_AXIS_TYPE.CATEGORY, position: import_ag_charts_core134.CARTESIAN_POSITION.LEFT }, x: { type: import_ag_charts_core134.CARTESIAN_AXIS_TYPE.CATEGORY, position: import_ag_charts_core134.CARTESIAN_POSITION.BOTTOM } }, axisKeys: { [import_ag_charts_core134.ChartAxisDirection.X]: "xKeyAxis", [import_ag_charts_core134.ChartAxisDirection.Y]: "yKeyAxis" }, themeTemplate: HEATMAP_SERIES_THEME, create: (ctx) => new HeatmapSeries(ctx) }; // packages/ag-charts-enterprise/src/series/ohlc/ohlcModule.ts var import_ag_charts_community116 = require("ag-charts-community"); var import_ag_charts_core136 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/ohlc/ohlcSeries.ts var import_ag_charts_community114 = require("ag-charts-community"); var OhlcSeries = class extends OhlcSeriesBase { constructor() { super(...arguments); this.properties = new OhlcSeriesProperties(); } nodeFactory() { const node = new OhlcNode(); node.lineCap = "square"; return node; } updateDatumStyles({ datumSelection, isHighlight }) { datumSelection.each((_, datum) => { datum.style = this.getItemStyle(datum.datumIndex, isHighlight, void 0, datum.itemType); }); } updateDatumNodes({ datumSelection, isHighlight }) { const { contextNodeData, properties } = this; if (!contextNodeData) { return; } const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); const { up, down } = properties.item; const series = this; datumSelection.each(function updateOhlcNode(node, datum) { const { centerX, width, y, height, yOpen, yClose, crisp } = datum; const baseStyle = datum.isRising ? up : down; node.setStaticProperties(centerX, width, y, height, yOpen, yClose, crisp); const style = datum.style ?? contextNodeData.styles[datum.itemType][series.getHighlightState(highlightedDatum, isHighlight, datum.datumIndex)]; node.setStyleProperties(style); node.strokeAlignment = baseStyle.strokeWidth; }); } getLegendData(legendType) { const { id, data, ctx: { legendManager }, visible } = this; const { xKey, yName, item: { up, down }, showInLegend, legendItemName } = this.properties; if (!data?.data.length || !xKey || legendType !== "category") { return []; } const fill = { type: "gradient", gradient: "linear", colorSpace: "rgb", colorStops: [ { color: up.stroke, stop: 0 }, { color: up.stroke, stop: 0.5 }, { color: down.stroke, stop: 0.5 } ], rotation: 90 }; return [ { legendType: "category", id, itemId: id, seriesId: id, enabled: visible && legendManager.getItemEnabled({ seriesId: id, itemId: id }), label: { text: legendItemName ?? yName ?? id }, symbol: { marker: { fill, fillOpacity: up.strokeOpacity, stroke: void 0, strokeWidth: 0, strokeOpacity: 1, lineDash: [0], lineDashOffset: 0 } }, legendItemName, hideInLegend: !showInLegend } ]; } hasItemStylers() { return this.properties.itemStyler != null; } }; OhlcSeries.className = "ohlc"; OhlcSeries.type = "ohlc"; // packages/ag-charts-enterprise/src/series/ohlc/ohlcSeriesOptionsDef.ts var import_ag_charts_community115 = require("ag-charts-community"); var import_ag_charts_core135 = require("ag-charts-core"); var { ohlcSeriesThemeableOptionsDef } = import_ag_charts_community115._ModuleSupport; var ohlcSeriesOptionsDef = { ...import_ag_charts_core135.commonSeriesOptionsDefs, ...ohlcSeriesThemeableOptionsDef, type: (0, import_ag_charts_core135.required)((0, import_ag_charts_core135.constant)("ohlc")), xKey: (0, import_ag_charts_core135.required)(import_ag_charts_core135.string), openKey: (0, import_ag_charts_core135.required)(import_ag_charts_core135.string), highKey: (0, import_ag_charts_core135.required)(import_ag_charts_core135.string), lowKey: (0, import_ag_charts_core135.required)(import_ag_charts_core135.string), closeKey: (0, import_ag_charts_core135.required)(import_ag_charts_core135.string), xKeyAxis: import_ag_charts_core135.string, yKeyAxis: import_ag_charts_core135.string, xName: import_ag_charts_core135.string, yName: import_ag_charts_core135.string, openName: import_ag_charts_core135.string, highName: import_ag_charts_core135.string, lowName: import_ag_charts_core135.string, closeName: import_ag_charts_core135.string }; ohlcSeriesOptionsDef.pickOutsideVisibleMinorAxis = (0, import_ag_charts_core135.undocumented)(import_ag_charts_core135.boolean); ohlcSeriesOptionsDef.focusPriority = (0, import_ag_charts_core135.undocumented)(import_ag_charts_core135.number); // packages/ag-charts-enterprise/src/series/ohlc/ohlcModule.ts var { predictCartesianFinancialAxis: predictCartesianFinancialAxis2 } = import_ag_charts_community116._ModuleSupport; var themeTemplate = { animation: { enabled: false }, series: { item: { up: { stroke: { $if: [ { $eq: [{ $palette: "type" }, "user-indexed"] }, { $palette: "stroke" }, { $palette: "up.stroke" } ] } }, down: { stroke: { $if: [ { $eq: [{ $palette: "type" }, "user-indexed"] }, { $palette: "stroke" }, { $palette: "down.stroke" } ] } } }, tooltip: { range: { $path: ["/tooltip/range", "nearest"] } }, highlight: import_ag_charts_core136.MULTI_SERIES_HIGHLIGHT_STYLE }, axes: { [import_ag_charts_core136.CARTESIAN_AXIS_TYPE.NUMBER]: { crosshair: { snap: false } }, [import_ag_charts_core136.CARTESIAN_AXIS_TYPE.ORDINAL_TIME]: { groupPaddingInner: 0, crosshair: { enabled: true } } } }; var OhlcSeriesModule = { type: "series", name: "ohlc", chartType: "cartesian", enterprise: true, version: import_ag_charts_community116.VERSION, dependencies: [import_ag_charts_community116.CartesianChartModule], options: ohlcSeriesOptionsDef, matchingKeys: ["xKey", "lowKey", "highKey", "openKey", "closeKey", "normalizedTo"], predictAxis: predictCartesianFinancialAxis2, defaultAxes: { y: { type: import_ag_charts_core136.CARTESIAN_AXIS_TYPE.NUMBER, position: import_ag_charts_core136.CARTESIAN_POSITION.LEFT }, x: { type: import_ag_charts_core136.CARTESIAN_AXIS_TYPE.ORDINAL_TIME, position: import_ag_charts_core136.CARTESIAN_POSITION.BOTTOM } }, axisKeys: { [import_ag_charts_core136.ChartAxisDirection.X]: "xKeyAxis", [import_ag_charts_core136.ChartAxisDirection.Y]: "yKeyAxis" }, themeTemplate, create: (ctx) => new OhlcSeries(ctx) }; // packages/ag-charts-enterprise/src/series/range-area/rangeAreaModule.ts var import_ag_charts_community124 = require("ag-charts-community"); var import_ag_charts_core144 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/range-area/rangeArea.ts var import_ag_charts_community121 = require("ag-charts-community"); var import_ag_charts_core141 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/range-area/rangeAreaAggregation.ts var import_ag_charts_community117 = require("ag-charts-community"); var import_ag_charts_core137 = require("ag-charts-core"); function aggregateRangeAreaData(scale, xValues, highValues, lowValues, domainInput, smallestKeyInterval, xNeedsValueOf, yNeedsValueOf) { const [d0, d1] = (0, import_ag_charts_core137.aggregationDomain)(scale, domainInput); return (0, import_ag_charts_core137.computeExtremesAggregation)([d0, d1], xValues, highValues, lowValues, { smallestKeyInterval, xNeedsValueOf, yNeedsValueOf }); } var memoizedAggregateRangeAreaData = (0, import_ag_charts_core137.simpleMemorize2)(aggregateRangeAreaData); function aggregateRangeAreaDataFromDataModel(scale, dataModel, processedData, series, existingFilters) { const xValues = dataModel.resolveKeysById(series, "xValue", processedData); const highValues = dataModel.resolveColumnById(series, "yHighValue", processedData); const lowValues = dataModel.resolveColumnById(series, "yLowValue", processedData); const domainInput = dataModel.getDomain(series, "xValue", "key", processedData); const xNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "xValue", processedData); const yNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "yHighValue", processedData) ?? dataModel.resolveColumnNeedsValueOf(series, "yLowValue", processedData); if (existingFilters) { const [d0, d1] = (0, import_ag_charts_core137.aggregationDomain)(scale, domainInput); return (0, import_ag_charts_core137.computeExtremesAggregation)([d0, d1], xValues, highValues, lowValues, { smallestKeyInterval: processedData.reduced?.smallestKeyInterval, xNeedsValueOf, yNeedsValueOf, existingFilters }); } return memoizedAggregateRangeAreaData( scale, xValues, highValues, lowValues, domainInput, processedData.reduced?.smallestKeyInterval, xNeedsValueOf, yNeedsValueOf ); } function aggregateRangeAreaDataFromDataModelPartial(scale, dataModel, processedData, series, targetRange, existingFilters) { const xValues = dataModel.resolveKeysById(series, "xValue", processedData); const highValues = dataModel.resolveColumnById(series, "yHighValue", processedData); const lowValues = dataModel.resolveColumnById(series, "yLowValue", processedData); const domainInput = dataModel.getDomain(series, "xValue", "key", processedData); const xNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "xValue", processedData); const yNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "yHighValue", processedData) ?? dataModel.resolveColumnNeedsValueOf(series, "yLowValue", processedData); const [d0, d1] = (0, import_ag_charts_core137.aggregationDomain)(scale, domainInput); return (0, import_ag_charts_core137.computeExtremesAggregationPartial)([d0, d1], xValues, highValues, lowValues, { smallestKeyInterval: processedData.reduced?.smallestKeyInterval, targetRange, xNeedsValueOf, yNeedsValueOf, existingFilters }); } // packages/ag-charts-enterprise/src/series/range-area/rangeAreaIntersection.ts var import_ag_charts_community118 = require("ag-charts-community"); var import_ag_charts_core138 = require("ag-charts-core"); function getYValueAtX({ span }, x) { switch (span.type) { case "linear": case "step": case "multi-line": { const t = (x - span.x0) / (span.x1 - span.x0); return span.y0 + t * (span.y1 - span.y0); } case "cubic": { const { cp0x, cp0y, cp1x, cp1y, cp2x, cp2y, cp3x, cp3y } = span; let t = 0.5; const tolerance = 1e-6; for (let i = 0; i < 10; i++) { const mt2 = 1 - t; const xt = mt2 * mt2 * mt2 * cp0x + 3 * mt2 * mt2 * t * cp1x + 3 * mt2 * t * t * cp2x + t * t * t * cp3x; const fx = xt - x; if (Math.abs(fx) < tolerance) break; const dxdt = 3 * mt2 * mt2 * (cp1x - cp0x) + 6 * mt2 * t * (cp2x - cp1x) + 3 * t * t * (cp3x - cp2x); if (Math.abs(dxdt) < 1e-12) break; t = t - fx / dxdt; t = Math.max(0, Math.min(1, t)); } const mt = 1 - t; return mt * mt * mt * cp0y + 3 * mt * mt * t * cp1y + 3 * mt * t * t * cp2y + t * t * t * cp3y; } } } function findSpanForX(spans, x, startIndex = 0) { for (let i = startIndex; i < spans.length; i++) { const span = spans[i]; const [start, end] = (0, import_ag_charts_core138.spanRange)(span.span); if (x >= start.x && x <= end.x) { return { span, index: i }; } if (x < start.x) { break; } } return { span: null, index: startIndex }; } function checkForIntersection(highSpans, lowSpans, x, wasInverted, spanIndex) { const high = findSpanForX(highSpans, x, spanIndex); const low = findSpanForX(lowSpans, x, spanIndex); if (!high.span || !low.span) { return { intersection: null, spanIndex: high.index, isInverted: wasInverted }; } const highY = getYValueAtX(high.span, x); const lowY = getYValueAtX(low.span, x); const isInverted = highY > lowY; const intersection = wasInverted === isInverted ? null : { x, y: highY }; return { intersection, spanIndex: high.index, isInverted }; } function findRangeAreaIntersections(highSpans, lowSpans, minX, maxX, initiallyInverted = false) { if (highSpans.length === 0 || lowSpans.length === 0) return []; const intersections = []; let wasInverted = initiallyInverted; let spanIndex = 0; for (let x = minX; x <= maxX; x += 0.5) { const result = checkForIntersection(highSpans, lowSpans, x, wasInverted, spanIndex); if (result.intersection) { intersections.push(result.intersection.x); } spanIndex = result.spanIndex; wasInverted = result.isInverted; } return intersections; } function calculateIntersectionSegments(intersections, seriesRect, chartSize, startsInverted, style = {}) { const horizontalMargin = Math.max(seriesRect.x, chartSize.width - (seriesRect.x + seriesRect.width)); const verticalMargin = Math.max(seriesRect.y, chartSize.height - (seriesRect.y + seriesRect.height)); const result = []; const createClipRect = (x0, x1) => ({ x0, y0: -verticalMargin, x1, y1: seriesRect.height + verticalMargin }); if (startsInverted) { result.push({ clipRect: createClipRect(-horizontalMargin, intersections[0] ?? seriesRect.width + horizontalMargin), ...style }); } const startIndex = startsInverted ? 1 : 0; for (let i = startIndex; i < intersections.length; i += 2) { result.push({ clipRect: createClipRect(intersections[i], intersections[i + 1] ?? seriesRect.width + horizontalMargin), ...style }); } return result; } // packages/ag-charts-enterprise/src/series/range-area/rangeAreaProperties.ts var import_ag_charts_community119 = require("ag-charts-community"); var import_ag_charts_core139 = require("ag-charts-core"); var { CartesianSeriesProperties: CartesianSeriesProperties2, SeriesMarker, makeSeriesTooltip: makeSeriesTooltip5, DropShadow, Label: Label2 } = import_ag_charts_community119._ModuleSupport; var RangeAreaSeriesLabel = class extends Label2 { constructor() { super(...arguments); this.placement = "outside"; this.spacing = 0; } }; __decorateClass([ import_ag_charts_core139.Property ], RangeAreaSeriesLabel.prototype, "placement", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaSeriesLabel.prototype, "spacing", 2); var RangeAreaInvertedStyle = class { constructor() { this.enabled = false; this.fillOpacity = 1; } }; __decorateClass([ import_ag_charts_core139.Property ], RangeAreaInvertedStyle.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaInvertedStyle.prototype, "fill", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaInvertedStyle.prototype, "fillOpacity", 2); var RangeAreaLineStyle = class extends import_ag_charts_core139.BaseProperties { constructor() { super(...arguments); this.stroke = "#99CCFF"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.marker = new SeriesMarker(); } }; __decorateClass([ import_ag_charts_core139.Property ], RangeAreaLineStyle.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaLineStyle.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaLineStyle.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaLineStyle.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaLineStyle.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaLineStyle.prototype, "marker", 2); var RangeAreaItemProperties = class extends import_ag_charts_core139.BaseProperties { constructor() { super(...arguments); this.low = new RangeAreaLineStyle(); this.high = new RangeAreaLineStyle(); } }; __decorateClass([ import_ag_charts_core139.Property ], RangeAreaItemProperties.prototype, "low", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaItemProperties.prototype, "high", 2); var SharedRangeAreaMarker = class extends import_ag_charts_core139.BaseProperties { }; __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "shape", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "size", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "fill", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core139.Property ], SharedRangeAreaMarker.prototype, "itemStyler", 2); var RangeAreaProperties = class extends CartesianSeriesProperties2 { constructor() { super(...arguments); this.fill = "#99CCFF"; this.fillOpacity = 1; this.stroke = "#99CCFF"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.interpolation = new import_ag_charts_core139.InterpolationProperties(); this.item = new RangeAreaItemProperties(); this.invertedStyle = new RangeAreaInvertedStyle(); this.shadow = new DropShadow().set({ enabled: false }); this.marker = new SharedRangeAreaMarker(); this.label = new RangeAreaSeriesLabel(); this.tooltip = makeSeriesTooltip5(); this.connectMissingData = false; } }; __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "xKey", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "yLowKey", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "yHighKey", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "xName", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "yName", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "yLowName", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "yHighName", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "interpolation", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "styler", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "item", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "invertedStyle", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "shadow", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "marker", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "tooltip", 2); __decorateClass([ import_ag_charts_core139.Property ], RangeAreaProperties.prototype, "connectMissingData", 2); // packages/ag-charts-enterprise/src/series/range-area/rangeAreaUtil.ts var import_ag_charts_community120 = require("ag-charts-community"); var import_ag_charts_core140 = require("ag-charts-core"); var { CollapseMode, pairUpSpans, prepareAreaFillAnimationFns, plotInterpolatedLinePathStroke, prepareLinePathPropertyAnimation } = import_ag_charts_community120._ModuleSupport; function prepareRangeAreaPathStrokeAnimationFns(status, highSpans, lowSpans, visibleToggleMode) { const removePhaseFn = (ratio8, path) => { plotInterpolatedLinePathStroke(ratio8, path, highSpans.removed); plotInterpolatedLinePathStroke(ratio8, path, lowSpans.removed); }; const updatePhaseFn = (ratio8, path) => { plotInterpolatedLinePathStroke(ratio8, path, highSpans.moved); plotInterpolatedLinePathStroke(ratio8, path, lowSpans.moved); }; const addPhaseFn = (ratio8, path) => { plotInterpolatedLinePathStroke(ratio8, path, highSpans.added); plotInterpolatedLinePathStroke(ratio8, path, lowSpans.added); }; const pathProperties = prepareLinePathPropertyAnimation(status, visibleToggleMode); return { status, path: { addPhaseFn, updatePhaseFn, removePhaseFn }, pathProperties }; } function prepareRangeAreaPathAnimation(newData, oldData, diff8) { const isCategoryBased = newData.scales.x?.type === "category"; const wasCategoryBased = oldData.scales.x?.type === "category"; if (isCategoryBased !== wasCategoryBased || !(0, import_ag_charts_core140.isScaleValid)(newData.scales.x) || !(0, import_ag_charts_core140.isScaleValid)(oldData.scales.x)) { return; } let status = "updated"; if (oldData.visible && !newData.visible) { status = "removed"; } else if (!oldData.visible && newData.visible) { status = "added"; } const fillSpans = pairUpSpans( { scales: newData.scales, data: newData.fillData.spans }, { scales: oldData.scales, data: oldData.fillData.spans }, CollapseMode.Split ); if (fillSpans == null) return; const fillPhantomSpans = pairUpSpans( { scales: newData.scales, data: newData.fillData.phantomSpans }, { scales: oldData.scales, data: oldData.fillData.phantomSpans }, CollapseMode.Split ); if (fillPhantomSpans == null) return; const highStrokeSpans = pairUpSpans( { scales: newData.scales, data: newData.highStrokeData.spans }, { scales: oldData.scales, data: oldData.highStrokeData.spans }, CollapseMode.Split ); if (highStrokeSpans == null) return; const lowStrokeSpans = pairUpSpans( { scales: newData.scales, data: newData.lowStrokeData.spans }, { scales: oldData.scales, data: oldData.lowStrokeData.spans }, CollapseMode.Split ); if (lowStrokeSpans == null) return; const fadeMode = "fade"; const fill = prepareAreaFillAnimationFns(status, fillSpans, fillPhantomSpans, fadeMode); const stroke3 = prepareRangeAreaPathStrokeAnimationFns(status, highStrokeSpans, lowStrokeSpans, fadeMode); const hasMotion = (diff8?.changed ?? true) || !(0, import_ag_charts_core140.areScalingEqual)(newData.scales.x, oldData.scales.x) || !(0, import_ag_charts_core140.areScalingEqual)(newData.scales.y, oldData.scales.y) || status !== "updated"; return { status, fill, stroke: stroke3, hasMotion }; } // packages/ag-charts-enterprise/src/series/range-area/rangeArea.ts var HIGH2 = import_ag_charts_core141.AGGREGATION_INDEX_Y_MAX; var LOW2 = import_ag_charts_core141.AGGREGATION_INDEX_Y_MIN; var SPAN2 = import_ag_charts_core141.AGGREGATION_SPAN; var { valueProperty: valueProperty6, keyProperty: keyProperty4, updateLabelNode: updateLabelNode2, fixNumericExtent: fixNumericExtent4, buildResetPathFn, resetLabelFn, resetMarkerFn, resetMarkerPositionFn, pathSwipeInAnimation, resetMotion, markerSwipeScaleInAnimation, seriesLabelFadeInAnimation, animationValidation: animationValidation3, diff: diff3, updateClipPath, computeMarkerFocusBounds, plotAreaPathFill, plotLinePathStroke, interpolatePoints, pathFadeInAnimation, markerFadeInAnimation, fromToMotion, pathMotion, PointerEvents: PointerEvents2, Marker, BBox: BBox13, processedDataIsAnimatable: processedDataIsAnimatable3, markerEnabled, getMarkerStyles, calculateSegments: calculateSegments2, toHighlightString: toHighlightString2, HighlightState: HighlightState2, AggregationManager: AggregationManager2, resetMarkerSelectionsDirect, createDatumId: createDatumId4, visibleRangeIndices: visibleRangeIndices2 } = import_ag_charts_community121._ModuleSupport; var RangeAreaSeriesNodeEvent = class extends import_ag_charts_community121._ModuleSupport.SeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); this.xKey = series.properties.xKey; this.yLowKey = series.properties.yLowKey; this.yHighKey = series.properties.yHighKey; } }; var RangeAreaSeries = class extends import_ag_charts_community121._ModuleSupport.CartesianSeries { constructor(moduleCtx) { super({ moduleCtx, pathsPerSeries: ["fill", "lowStroke", "highStroke"], pickModes: [import_ag_charts_community121._ModuleSupport.SeriesNodePickMode.AXIS_ALIGNED], propertyKeys: { [import_ag_charts_core141.ChartAxisDirection.X]: ["xKey"], [import_ag_charts_core141.ChartAxisDirection.Y]: ["yLowKey", "yHighKey"] }, propertyNames: { [import_ag_charts_core141.ChartAxisDirection.X]: ["xName"], [import_ag_charts_core141.ChartAxisDirection.Y]: ["yLowName", "yHighName", "yName"] }, categoryKey: "xValue", animationResetFns: { path: buildResetPathFn({ getVisible: () => this.visible, getOpacity: () => this.getOpacity() }), label: resetLabelFn, datum: (node, datum) => ({ ...resetMarkerFn(node), ...resetMarkerPositionFn(node, datum) }) }, clipFocusBox: false }); this.properties = new RangeAreaProperties(); this.NodeEvent = RangeAreaSeriesNodeEvent; this.aggregationManager = new AggregationManager2(); } renderToOffscreenCanvas() { const hasMarkers = (this.contextNodeData?.nodeData?.length ?? 0) > 0; return hasMarkers && this.getDrawingMode(false) === "cutout" || super.renderToOffscreenCanvas(); } async processData(dataController) { const { xKey, yLowKey, yHighKey } = this.properties; const xScale = this.axes[import_ag_charts_core141.ChartAxisDirection.X]?.scale; const yScale = this.axes[import_ag_charts_core141.ChartAxisDirection.Y]?.scale; const { xScaleType, yScaleType } = this.getScaleInformation({ xScale, yScale }); const extraProps = []; const animationEnabled = !this.ctx.animationManager.isSkipped(); if (this.needsDataModelDiff() && this.processedData) { extraProps.push(diff3(this.id, this.processedData)); } if (animationEnabled) { extraProps.push(animationValidation3()); } const allowNullKey = this.properties.allowNullKeys ?? false; const { dataModel, processedData } = await this.requestDataModel(dataController, this.data, { props: [ keyProperty4(xKey, xScaleType, { id: `xValue`, allowNullKey }), valueProperty6(yLowKey, yScaleType, { id: `yLowValue` }), valueProperty6(yHighKey, yScaleType, { id: `yHighValue` }), ...extraProps ] }); this.aggregateData(dataModel, processedData); this.animationState.transition("updateData"); } aggregateData(dataModel, processedData) { this.aggregationManager.markStale(processedData.input.count); if (processedData.type !== "ungrouped") return; if (processedDataIsAnimatable3(processedData)) return; const xAxis = this.axes[import_ag_charts_core141.ChartAxisDirection.X]; if (xAxis == null) return; const targetRange = this.estimateTargetRange(); this.aggregationManager.aggregate({ computePartial: (existingFilters) => aggregateRangeAreaDataFromDataModelPartial( xAxis.scale.type, dataModel, processedData, this, targetRange, existingFilters ), computeFull: (existingFilters) => aggregateRangeAreaDataFromDataModel(xAxis.scale.type, dataModel, processedData, this, existingFilters), targetRange }); const filters = this.aggregationManager.filters; if (filters && filters.length > 0) { import_ag_charts_core141.DebugMetrics.record( `${this.type}:aggregation`, filters.map((f) => f.maxRange) ); } } estimateTargetRange() { const xAxis = this.axes[import_ag_charts_core141.ChartAxisDirection.X]; if (xAxis?.scale?.range) { const [r0, r1] = xAxis.scale.range; return Math.abs(r1 - r0); } return this.ctx.scene?.canvas?.width ?? 800; } /** * Creates the context object for efficient node datum creation. * Caches expensive-to-compute values that are reused across all datum iterations. */ createNodeDatumContext(xAxis, yAxis) { const { dataModel, processedData } = this; if (!dataModel || !processedData) return void 0; const rawData = processedData.dataSources.get(this.id)?.data ?? []; const xScale = xAxis.scale; const yScale = yAxis.scale; const xAxisRange = xAxis.range; const [r0, r1] = xScale.range; const range2 = Math.abs(r1 - r0); this.aggregationManager.ensureLevelForRange(range2); const dataAggregationFilter = this.aggregationManager.getFilterForRange(range2); const existingNodes = this.contextNodeData?.nodeData; const animationEnabled = !this.ctx.animationManager.isSkipped(); const canIncrementallyUpdate = existingNodes != null && (processedData.changeDescription != null || !processedDataIsAnimatable3(processedData) || dataAggregationFilter != null); return { xAxis, yAxis, rawData, xValues: dataModel.resolveKeysById(this, "xValue", processedData), yHighValues: dataModel.resolveColumnById(this, "yHighValue", processedData), yLowValues: dataModel.resolveColumnById(this, "yLowValue", processedData), xScale, yScale, xAxisRange, xOffset: (xScale.bandwidth ?? 0) / 2, dataAggregationFilter, range: range2, labelsEnabled: this.properties.label.enabled, animationEnabled, canIncrementallyUpdate, xKey: this.properties.xKey, yLowKey: this.properties.yLowKey, yHighKey: this.properties.yHighKey, item: this.properties.item, yDomain: this.getSeriesDomain(import_ag_charts_core141.ChartAxisDirection.Y).domain, connectMissingData: this.properties.connectMissingData, interpolation: this.properties.interpolation, nodes: canIncrementallyUpdate ? existingNodes : [], labelData: [], spanPoints: [], nodeIndex: 0 }; } xCoordinateRange(xValue) { const x = this.axes[import_ag_charts_core141.ChartAxisDirection.X].scale.convert(xValue); return [x, x]; } yCoordinateRange(yValues) { const y = this.axes[import_ag_charts_core141.ChartAxisDirection.Y].scale.convert(yValues[0]); return [y, y]; } getSeriesDomain(direction) { const { processedData, dataModel } = this; if (!(processedData && dataModel)) return { domain: [] }; const { domain: { keys: [keys] } } = processedData; if (direction === import_ag_charts_core141.ChartAxisDirection.X) { const keyDef = dataModel.resolveProcessedDataDefById(this, `xValue`); if (keyDef?.def.type === "key" && keyDef.def.valueType === "category") { const sortMetadata = dataModel.getKeySortMetadata(this, "xValue", processedData); return { domain: keys, sortMetadata }; } return { domain: fixNumericExtent4((0, import_ag_charts_core141.extent)(keys)) }; } else { const yExtent = this.domainForClippedRange(import_ag_charts_core141.ChartAxisDirection.Y, ["yHighValue", "yLowValue"], "xValue"); const fixedYExtent = (0, import_ag_charts_core141.findMinMax)(yExtent); return { domain: fixNumericExtent4(fixedYExtent) }; } } getSeriesRange(_direction, visibleRange) { return this.domainForVisibleRange(import_ag_charts_core141.ChartAxisDirection.Y, ["yHighValue", "yLowValue"], "xValue", visibleRange); } /** * Processes a single datum and updates the context's marker, label, and span arrays. * Uses the scratch object to avoid per-iteration allocations. * * @param yHighValueOverride - Optional override for yHighValue, used in aggregation mode * when the extreme values come from different data points * @param yLowValueOverride - Optional override for yLowValue, used in aggregation mode */ handleDatumPoint(ctx, scratch, datumIndex, yHighValueOverride, yLowValueOverride) { scratch.xValue = ctx.xValues[datumIndex]; if (scratch.xValue === void 0 && !this.properties.allowNullKeys) return; scratch.datum = ctx.rawData[datumIndex]; scratch.yHighValue = yHighValueOverride ?? ctx.yHighValues[datumIndex]; scratch.yLowValue = yLowValueOverride ?? ctx.yLowValues[datumIndex]; const currentSpanPoints = ctx.spanPoints.at(-1); if (Number.isFinite(scratch.yHighValue) && Number.isFinite(scratch.yLowValue)) { scratch.inverted = scratch.yLowValue > scratch.yHighValue; scratch.x = ctx.xScale.convert(scratch.xValue) + ctx.xOffset; if (!Number.isFinite(scratch.x)) return; scratch.yHighCoordinate = ctx.yScale.convert(scratch.yHighValue); scratch.yLowCoordinate = ctx.yScale.convert(scratch.yLowValue); this.upsertMarkerDatum(ctx, scratch, datumIndex, "high", scratch.yHighValue, scratch.yHighCoordinate); this.upsertMarkerDatum(ctx, scratch, datumIndex, "low", scratch.yLowValue, scratch.yLowCoordinate); const spanPoint = { high: { point: { x: scratch.x, y: scratch.yHighCoordinate }, xDatum: scratch.xValue, yDatum: scratch.yHighValue }, low: { point: { x: scratch.x, y: scratch.yLowCoordinate }, xDatum: scratch.xValue, yDatum: scratch.yLowValue } }; if (Array.isArray(currentSpanPoints)) { currentSpanPoints.push(spanPoint); } else if (currentSpanPoints == null) { ctx.spanPoints.push([spanPoint]); } else { currentSpanPoints.skip += 1; ctx.spanPoints.push([spanPoint]); } } else if (!ctx.connectMissingData) { if (Array.isArray(currentSpanPoints) || currentSpanPoints == null) { ctx.spanPoints.push({ skip: 0 }); } else { currentSpanPoints.skip += 1; } } } /** * Creates or updates marker datum for a single boundary (high or low). * Supports incremental updates by reusing existing marker data objects when possible. */ upsertMarkerDatum(ctx, scratch, datumIndex, itemType, yValue, y) { const { size } = ctx.item[itemType].marker; const canReuseNode = ctx.canIncrementallyUpdate && ctx.nodeIndex < ctx.nodes.length; if (canReuseNode) { const existingNode = ctx.nodes[ctx.nodeIndex]; existingNode.index = datumIndex; existingNode.itemType = itemType; existingNode.datum = scratch.datum; existingNode.datumIndex = datumIndex; existingNode.midPoint = { x: scratch.x, y }; existingNode.yHighValue = scratch.yHighValue; existingNode.yLowValue = scratch.yLowValue; existingNode.xValue = scratch.xValue; existingNode.point = { x: scratch.x, y, size }; } else { ctx.nodes.push({ index: datumIndex, series: this, itemType, datum: scratch.datum, datumIndex, midPoint: { x: scratch.x, y }, yHighValue: scratch.yHighValue, yLowValue: scratch.yLowValue, xValue: scratch.xValue, xKey: ctx.xKey, yLowKey: ctx.yLowKey, yHighKey: ctx.yHighKey, point: { x: scratch.x, y, size }, enabled: true }); } ctx.nodeIndex++; if (ctx.labelsEnabled) { const labelDatum = this.createLabelData({ datumIndex, point: { x: scratch.x, y }, value: yValue, yLowValue: scratch.yLowValue, yHighValue: scratch.yHighValue, itemType, inverted: scratch.inverted, datum: scratch.datum, series: this }); ctx.labelData.push(labelDatum); } } populateNodeData(ctx) { const { processedData } = this; if (!processedData) return; const scratch = { datum: void 0, xValue: void 0, yHighValue: 0, yLowValue: 0, x: 0, yHighCoordinate: 0, yLowCoordinate: 0, inverted: false }; const xPosition = (index) => ctx.xScale.convert(ctx.xValues[index]) + ctx.xOffset; if (processedData.input.count < 1e3 || ctx.dataAggregationFilter == null) { let [start, end] = visibleRangeIndices2(1, ctx.xValues.length, ctx.xAxisRange, (index) => { const x = xPosition(index); return [x, x]; }); if (processedData.input.count < 1e3) { start = 0; end = processedData.input.count; } start = Math.max(start - 1, 0); end = Math.min(end + 1, ctx.xValues.length); for (let datumIndex = start; datumIndex < end; datumIndex += 1) { this.handleDatumPoint(ctx, scratch, datumIndex); } } else { const { maxRange, indexData, midpointIndices } = ctx.dataAggregationFilter; const [start, end] = visibleRangeIndices2(1, maxRange, ctx.xAxisRange, (index) => { const midDatumIndex = midpointIndices[index]; if (midDatumIndex === import_ag_charts_core141.AGGREGATION_INDEX_UNSET) return; return [xPosition(midDatumIndex), xPosition(midDatumIndex)]; }); for (let bucketIndex = start; bucketIndex < end; bucketIndex += 1) { const midIndex = midpointIndices[bucketIndex]; if (midIndex === import_ag_charts_core141.AGGREGATION_INDEX_UNSET) continue; const aggIndex = bucketIndex * SPAN2; const yHighDatumIndex = indexData[aggIndex + HIGH2]; const yLowDatumIndex = indexData[aggIndex + LOW2]; this.handleDatumPoint( ctx, scratch, yHighDatumIndex, ctx.yHighValues[yHighDatumIndex], ctx.yLowValues[yLowDatumIndex] ); } } } finalizeNodeData(ctx) { if (ctx.canIncrementallyUpdate && ctx.nodeIndex < ctx.nodes.length) { ctx.nodes.length = ctx.nodeIndex; } } initializeResult(ctx) { return { itemId: `${ctx.yLowKey}-${ctx.yHighKey}`, labelData: ctx.labelData, nodeData: ctx.nodes, fillData: { itemType: "high", spans: [], phantomSpans: [] }, highStrokeData: { itemType: "high", spans: [] }, lowStrokeData: { itemType: "low", spans: [] }, scales: this.calculateScaling(), visible: this.visible, styles: { low: this.getLowOrHighMarkerStyles("low"), high: this.getLowOrHighMarkerStyles("high") }, segments: void 0, intersectionSegments: void 0 }; } assembleResult(ctx, result) { const xAxis = this.axes[import_ag_charts_core141.ChartAxisDirection.X]; const yAxis = this.axes[import_ag_charts_core141.ChartAxisDirection.Y]; if (!xAxis || !yAxis || !this.chart?.seriesRect) return result; const highSpans = ctx.spanPoints.flatMap((p) => { if (!Array.isArray(p)) return []; const highPoints = p.map((d) => d.high); return interpolatePoints(highPoints, ctx.interpolation); }); const lowSpans = ctx.spanPoints.flatMap((p) => { if (!Array.isArray(p)) return []; const lowPoints = p.map((d) => d.low); return interpolatePoints(lowPoints, ctx.interpolation); }); const segments = calculateSegments2( this.properties.segmentation, xAxis, yAxis, this.chart.seriesRect, this.ctx.scene, false ); let intersectionSegments = void 0; if (this.properties.invertedStyle.enabled) { const startsInverted = ctx.yHighValues[0] < ctx.yLowValues[0]; const intersectionXValues = findRangeAreaIntersections( highSpans, lowSpans, ctx.xScale.range[0], ctx.xScale.range[1], startsInverted ); intersectionSegments = calculateIntersectionSegments( intersectionXValues, this.chart.seriesRect, this.ctx.scene, startsInverted, this.properties.invertedStyle ); } result.fillData = { itemType: "high", spans: highSpans, phantomSpans: lowSpans }; result.highStrokeData = { itemType: "high", spans: highSpans }; result.lowStrokeData = { itemType: "low", spans: lowSpans }; result.segments = segments; result.intersectionSegments = intersectionSegments; return result; } getLowOrHighMarkerStyles(lowOrHigh) { const { fill, fillOpacity, item } = this.properties; const line = item[lowOrHigh]; const { stroke: stroke3, strokeWidth, strokeOpacity } = line; const inheritedStyles = { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity }; return getMarkerStyles(this, line, line.marker, inheritedStyles); } createLabelData({ datumIndex, point, value, itemType, inverted, datum, series }) { const { xKey, yLowKey, yHighKey, xName, yName, yLowName, yHighName, legendItemName, label } = this.properties; const { placement } = label; const spacing = label.spacing + (typeof label.padding === "number" ? label.padding : 0); let actualItemId = itemType; if (inverted) { actualItemId = itemType === "low" ? "high" : "low"; } const direction = placement === "outside" && actualItemId === "high" || placement === "inside" && actualItemId === "low" ? -1 : 1; const yDomain = this.getSeriesDomain(import_ag_charts_core141.ChartAxisDirection.Y).domain; return { x: point.x, y: point.y + spacing * direction, series, itemType, datum, datumIndex, text: this.getLabelText( value, datum, itemType === "high" ? yHighKey : yLowKey, "y", yDomain, label, { value, datum, itemType, xKey, yLowKey, yHighKey, xName, yLowName, yHighName, yName, legendItemName } ), textAlign: "center", textBaseline: direction === -1 ? "bottom" : "top" }; } isPathOrSelectionDirty() { const { low, high } = this.properties.item; return low.marker.isDirty() || high.marker.isDirty(); } strokewidthChange() { const itemStrokeWidthChange = (lowOrHigh) => { const unhighlightedStrokeWidth = this.properties.item[lowOrHigh].strokeWidth ?? 0; const highlightedSeriesStrokeWidth = this.properties.highlight.highlightedSeries.item?.[lowOrHigh]?.strokeWidth ?? unhighlightedStrokeWidth; const highlightedItemStrokeWidth = this.properties.highlight.highlightedItem.item?.[lowOrHigh]?.strokeWidth ?? unhighlightedStrokeWidth; return unhighlightedStrokeWidth > highlightedItemStrokeWidth || highlightedSeriesStrokeWidth > highlightedItemStrokeWidth; }; return itemStrokeWidthChange("low") || itemStrokeWidthChange("high"); } updatePathNodes(opts) { const { visible } = opts; const [fillPath, lowStrokePath, highStrokePath] = opts.paths; const segments = this.contextNodeData?.segments; const highlightDatum = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightState(highlightDatum, false); const highlightStyle = this.getHighlightStyle(); const { item, fill, fillOpacity, opacity } = (0, import_ag_charts_core141.mergeDefaults)(highlightStyle, this.getStyle(highlightState)); lowStrokePath.setProperties({ datum: segments, segments, fill: void 0, lineCap: "round", lineJoin: "round", pointerEvents: PointerEvents2.None, stroke: item.low.stroke, strokeWidth: item.low.strokeWidth, strokeOpacity: item.low.strokeOpacity, lineDash: item.low.lineDash, lineDashOffset: item.low.lineDashOffset, opacity, visible }); highStrokePath.setProperties({ segments, fill: void 0, lineCap: "round", lineJoin: "round", pointerEvents: PointerEvents2.None, stroke: item.high.stroke, strokeWidth: item.high.strokeWidth, strokeOpacity: item.high.strokeOpacity, lineDash: item.high.lineDash, lineDashOffset: item.high.lineDashOffset, opacity, visible }); const fillBBox = this.getShapeFillBBox(); fillPath.setFillProperties(fill, fillBBox); fillPath.setStyleProperties({ stroke: void 0, fill, fillOpacity, opacity }, fillBBox); const fillSegments = this.contextNodeData?.intersectionSegments ?? segments; fillPath.setProperties({ segments: fillSegments, pointerEvents: PointerEvents2.None, lineJoin: "round", fillShadow: this.properties.shadow, opacity, visible }); fillPath.datum = fillSegments; updateClipPath(this, fillPath); updateClipPath(this, lowStrokePath); updateClipPath(this, highStrokePath); } updatePaths(opts) { this.updateAreaPaths(opts.paths, opts.contextData); } updateAreaPaths(paths, contextData) { for (const path of paths) { path.visible = contextData.visible; } if (contextData.visible) { this.updateFillPath(paths, contextData); this.updateStrokePath(paths, contextData); } else { for (const path of paths) { path.path.clear(); path.markDirty("RangeArea"); } } } updateFillPath(paths, contextData) { const [fill] = paths; fill.path.clear(); plotAreaPathFill(fill, contextData.fillData); fill.markDirty("RangeArea"); } updateStrokePath(paths, contextData) { const [, lowStroke, highStroke] = paths; lowStroke.path.clear(); highStroke.path.clear(); plotLinePathStroke(lowStroke, contextData.lowStrokeData.spans); plotLinePathStroke(highStroke, contextData.highStrokeData.spans); lowStroke.markDirty("RangeArea"); highStroke.markDirty("RangeArea"); } resetDatumAnimation(data) { resetMarkerSelectionsDirect([data.datumSelection]); } updateDatumSelection(opts) { const { nodeData, datumSelection } = opts; const { processedData, axes, properties } = this; const rules = properties.styler ? this.getStylerMarkerOptions().item : properties.item; const { low, high } = rules; const markersEnabled = markerEnabled(processedData.input.count, axes[import_ag_charts_core141.ChartAxisDirection.X].scale, { enabled: low.marker.enabled || high.marker.enabled }); if (properties.item.low.marker.isDirty() || properties.item.high.marker.isDirty()) { datumSelection.clear(); datumSelection.cleanup(); } let resolvedNodeData; if (markersEnabled) { if (low.marker.enabled && high.marker.enabled) { resolvedNodeData = nodeData; } else { resolvedNodeData = []; for (const datum of nodeData) { if (rules[datum.itemType].marker.enabled) { resolvedNodeData.push(datum); } } } } else { resolvedNodeData = []; } if (!processedDataIsAnimatable3(this.processedData)) { return datumSelection.update(resolvedNodeData); } return datumSelection.update( resolvedNodeData, void 0, (datum) => createDatumId4(datum.xValue, datum.itemType) ); } updateDatumStyles({ datumSelection, isHighlight }) { const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); datumSelection.each((_, datum) => { const highlightState = this.getHighlightState(highlightedDatum, isHighlight, datum.datumIndex); const stylerStyle = this.getStyle(highlightState); const { fill, fillOpacity, item } = stylerStyle; const { stroke: stroke3, strokeWidth, strokeOpacity } = item[datum.itemType]; const { marker } = this.properties.item[datum.itemType]; const params = this.makeItemStylerParams(datum.itemType); datum.style = this.getMarkerStyle( marker, datum, params, { isHighlight, highlightState, resolveMarkerSubPath: ["item", datum.itemType, "marker"] }, stylerStyle.item[datum.itemType].marker, { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity } ); }); } updateDatumNodes(opts) { const { contextNodeData } = this; if (!contextNodeData) { return; } const { datumSelection, isHighlight } = opts; const fillBBox = this.getShapeFillBBox(); const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); const drawingMode = this.getDrawingMode(isHighlight, opts.drawingMode); datumSelection.each((node, datum) => { const { itemType } = datum; const style = datum.style ?? contextNodeData.styles[itemType][this.getHighlightState(highlightedDatum, isHighlight, datum.datumIndex)]; this.applyMarkerStyle(style, node, datum.point, fillBBox); node.drawingMode = drawingMode; }); if (!isHighlight) { this.properties.item.low.marker.markClean(); this.properties.item.high.marker.markClean(); } } updateLabelSelection(opts) { const { labelData, labelSelection } = opts; return labelSelection.update(labelData, (text2) => { text2.pointerEvents = PointerEvents2.None; }); } updateLabelNodes(opts) { const params = { xKey: this.properties.xKey, xName: this.properties.xName ?? this.properties.xKey, yName: this.properties.yName, yLowKey: this.properties.yLowKey, yLowName: this.properties.yLowName ?? this.properties.yLowKey, yHighKey: this.properties.yHighKey, yHighName: this.properties.yHighName ?? this.properties.yHighKey, legendItemName: this.properties.legendItemName }; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const { isHighlight = false, labelSelection } = opts; labelSelection.each((textNode, datum) => { textNode.fillOpacity = this.getHighlightStyle(isHighlight, datum.datumIndex).opacity ?? 1; updateLabelNode2(this, textNode, params, this.properties.label, datum, isHighlight, activeHighlight); }); } getHighlightLabelData(labelData, highlightedItem) { if (!labelData?.length) return []; return labelData.filter((labelDatum) => labelDatum.datum === highlightedItem.datum); } getHighlightData(nodeData, highlightedItem) { const highlightItems = nodeData.filter((nodeDatum) => nodeDatum.datum === highlightedItem.datum).map((nodeDatum) => ({ ...nodeDatum })); return highlightItems.length > 0 ? highlightItems : void 0; } getStyle(highlightState) { return this.getStylerCouple(highlightState)[0]; } getStylerMarkerOptions() { return this.getStylerCouple()[1]; } getStylerCouple(highlightState) { const { fill, fillOpacity, item, styler } = this.properties; let stylerResult = {}; if (styler) { const stylerParams = this.makeStylerParams(highlightState); stylerResult = this.ctx.optionsGraphService.resolvePartial( ["series", `${this.declarationOrder}`], this.cachedCallWithContext(styler, stylerParams) ?? {}, { pick: false } ) ?? {}; } const markerOpts = { item: { low: { marker: { enabled: false } }, high: { marker: { enabled: false } } } }; const makeItemResult = (lowOrHigh) => { const stylerItem = stylerResult.item?.[lowOrHigh]; const { lineDash, lineDashOffset, marker, stroke: stroke3, strokeOpacity, strokeWidth } = item[lowOrHigh]; markerOpts.item[lowOrHigh].marker.enabled = stylerItem?.marker?.enabled ?? marker.enabled; return { marker: { fill: stylerItem?.marker?.fill ?? marker.fill ?? fill, fillOpacity: stylerItem?.marker?.fillOpacity ?? marker.fillOpacity, shape: stylerItem?.marker?.shape ?? marker.shape, size: stylerItem?.marker?.size ?? marker.size, lineDash: stylerItem?.marker?.lineDash ?? marker.lineDash, lineDashOffset: stylerItem?.marker?.lineDashOffset ?? marker.lineDashOffset, stroke: stylerItem?.marker?.stroke ?? marker.stroke ?? stroke3, strokeOpacity: stylerItem?.marker?.strokeOpacity ?? marker.strokeOpacity, strokeWidth: stylerItem?.marker?.strokeWidth ?? marker.strokeWidth }, lineDash: stylerItem?.lineDash ?? lineDash, lineDashOffset: stylerItem?.lineDashOffset ?? lineDashOffset, stroke: stylerItem?.stroke ?? stroke3, strokeOpacity: stylerItem?.strokeOpacity ?? strokeOpacity, strokeWidth: stylerItem?.strokeWidth ?? strokeWidth }; }; const style = { fill: stylerResult.fill ?? fill, fillOpacity: stylerResult.fillOpacity ?? fillOpacity, opacity: 1, topLevel: { lineDash: this.properties.lineDash, lineDashOffset: this.properties.lineDashOffset, marker: this.properties.marker, stroke: this.properties.stroke, strokeOpacity: this.properties.strokeOpacity, strokeWidth: this.properties.strokeWidth }, item: { low: makeItemResult("low"), high: makeItemResult("high") } }; return [style, markerOpts]; } makeStylerParams(highlightStateEnum) { const { id: seriesId } = this; const { fill, fillOpacity, item, xKey, yHighKey, yLowKey } = this.properties; const highlightState = toHighlightString2(highlightStateEnum ?? HighlightState2.None); const makeItemParam = (lowOrHigh) => { const { lineDash, lineDashOffset, marker, stroke: stroke3, strokeOpacity, strokeWidth } = item[lowOrHigh]; return { marker: { fill: marker.fill ?? fill, fillOpacity: marker.fillOpacity, size: marker.size, shape: marker.shape, stroke: marker.stroke ?? stroke3, strokeOpacity: marker.strokeOpacity, strokeWidth: marker.strokeWidth, lineDash: marker.lineDash, lineDashOffset: marker.lineDashOffset }, lineDash, lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth }; }; return { item: { low: makeItemParam("low"), high: makeItemParam("high") }, fill, fillOpacity, highlightState, seriesId, xKey, yLowKey, yHighKey }; } makeItemStylerParams(itemType) { const { xKey, yLowKey, yHighKey } = this.properties; return { xKey, yLowKey, yHighKey, itemType }; } getTooltipContent(datumIndex, removeThisDatum) { const itemType = removeThisDatum?.itemType ?? "high"; const { id: seriesId, dataModel, processedData, axes, properties } = this; const { xName, yName, yLowKey, yLowName, xKey, yHighKey, yHighName, tooltip, legendItemName } = properties; const xAxis = axes[import_ag_charts_core141.ChartAxisDirection.X]; const yAxis = axes[import_ag_charts_core141.ChartAxisDirection.Y]; if (!dataModel || !processedData || !xAxis || !yAxis) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const xValue = dataModel.resolveKeysById(this, `xValue`, processedData)[datumIndex]; const yHighValue = dataModel.resolveColumnById(this, `yHighValue`, processedData)[datumIndex]; const yLowValue = dataModel.resolveColumnById(this, `yLowValue`, processedData)[datumIndex]; const allowNullKeys = this.properties.allowNullKeys ?? false; if (xValue === void 0 && !allowNullKeys) return; const stylerStyle = this.getStyle(); const params = this.makeItemStylerParams(itemType); const format = this.getMarkerStyle( this.properties.item[itemType].marker, { datumIndex, datum }, params, { isHighlight: false, resolveMarkerSubPath: ["item", itemType, "marker"] }, stylerStyle.item[itemType].marker ); const value = `${this.getAxisValueText(yAxis, "tooltip", yLowValue, datum, yLowKey, legendItemName)} - ${this.getAxisValueText(yAxis, "tooltip", yHighValue, datum, yHighKey, legendItemName)}`; return this.formatTooltipWithContext( tooltip, { heading: this.getAxisValueText(xAxis, "tooltip", xValue, datum, xKey, legendItemName), symbol: this.legendItemSymbol(), data: [ { label: yName, fallbackLabel: `${yLowName ?? yLowKey} - ${yHighName ?? yHighKey}`, value, missing: import_ag_charts_community121._ModuleSupport.isTooltipValueMissing(yHighValue) && import_ag_charts_community121._ModuleSupport.isTooltipValueMissing(yLowValue) } ] }, { seriesId, datum, title: yName, itemType, xName, yName, yLowKey, yLowName, xKey, yHighKey, yHighName, legendItemName, ...format } ); } legendItemSymbol() { const { fill, topLevel } = this.getStyle(); const { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, marker } = topLevel; const markerStyle = { shape: marker.shape, fill: marker.fill ?? fill, stroke: marker.stroke ?? stroke3, fillOpacity: marker.fillOpacity, strokeOpacity: marker.strokeOpacity, strokeWidth: marker.strokeWidth, lineDash: marker.lineDash, lineDashOffset: marker.lineDashOffset }; return { marker: markerStyle, line: { enabled: true, stroke: stroke3, strokeOpacity, strokeWidth, lineDash } }; } getLegendData(legendType) { if (legendType !== "category") { return []; } const { id: seriesId, visible } = this; const { yLowKey, yHighKey, yName, yLowName, yHighName, legendItemName, showInLegend } = this.properties; const legendItemText = legendItemName ?? yName ?? `${yLowName ?? yLowKey} - ${yHighName ?? yHighKey}`; const itemId = `${yLowKey}-${yHighKey}`; return [ { legendType: "category", id: seriesId, itemId, seriesId, enabled: visible, label: { text: `${legendItemText}` }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend } ]; } isLabelEnabled() { return this.properties.label.enabled; } nodeFactory() { return new Marker(); } animateEmptyUpdateReady(animationData) { const { datumSelection, labelSelection, contextData, paths } = animationData; const { animationManager } = this.ctx; this.updateAreaPaths(paths, contextData); pathSwipeInAnimation(this, animationManager, ...paths); resetMotion([datumSelection], resetMarkerPositionFn); markerSwipeScaleInAnimation( this, animationManager, { ...this.getAnimationDrawingModes(), phase: "initial" }, datumSelection ); seriesLabelFadeInAnimation(this, "labels", animationManager, labelSelection, this.highlightLabelSelection); } animateReadyResize(animationData) { const { contextData, paths } = animationData; this.updateAreaPaths(paths, contextData); super.animateReadyResize(animationData); } animateWaitingUpdateReady(animationData) { const { animationManager } = this.ctx; const { datumSelection, labelSelection, contextData, paths, previousContextData } = animationData; const [fill, lowStroke, highStroke] = paths; if (fill == null && lowStroke == null && highStroke == null) return; this.resetDatumAnimation(animationData); this.resetLabelAnimation(animationData); const update = () => { this.resetPathAnimation(animationData); this.updateAreaPaths(paths, contextData); }; const skip = () => { animationManager.skipCurrentBatch(); update(); }; if (contextData == null || previousContextData == null) { update(); markerFadeInAnimation(this, animationManager, "added", this.getAnimationDrawingModes(), datumSelection); pathFadeInAnimation(this, "fill_path_properties", animationManager, "add", fill); pathFadeInAnimation(this, "low_stroke_path_properties", animationManager, "add", lowStroke); pathFadeInAnimation(this, "high_stroke_path_properties", animationManager, "add", highStroke); seriesLabelFadeInAnimation(this, "labels", animationManager, labelSelection, this.highlightLabelSelection); return; } const fns = prepareRangeAreaPathAnimation( contextData, previousContextData, this.processedData?.reduced?.diff?.[this.id] ); if (fns === void 0) { skip(); return; } else if (fns.status === "no-op") { return; } fromToMotion(this.id, "fill_path_properties", animationManager, [fill], fns.fill.pathProperties); fromToMotion(this.id, "low_stroke_path_properties", animationManager, [lowStroke], fns.stroke.pathProperties); fromToMotion(this.id, "high_stroke_path_properties", animationManager, [highStroke], fns.stroke.pathProperties); if (fns.status === "added") { this.updateAreaPaths(paths, contextData); } else if (fns.status === "removed") { this.updateAreaPaths(paths, previousContextData); } else { pathMotion(this.id, "fill_path_update", animationManager, [fill], fns.fill.path); pathMotion(this.id, "low_stroke_path_update", animationManager, [lowStroke], fns.stroke.path); pathMotion(this.id, "high_stroke_path_update", animationManager, [highStroke], fns.stroke.path); } if (fns.hasMotion) { markerFadeInAnimation(this, animationManager, void 0, this.getAnimationDrawingModes(), datumSelection); seriesLabelFadeInAnimation(this, "labels", animationManager, labelSelection, this.highlightLabelSelection); } this.ctx.animationManager.animate({ id: this.id, groupId: "reset_after_animation", phase: "trailing", from: {}, to: {}, onComplete: () => this.updateAreaPaths(paths, contextData) }); } getFormattedMarkerStyle(datum) { const stylerStyle = this.getStyle(); const params = this.makeItemStylerParams(datum.itemType); return this.getMarkerStyle( this.properties.item[datum.itemType].marker, datum, params, { isHighlight: true, resolveMarkerSubPath: ["item", datum.itemType, "marker"] }, void 0, stylerStyle ); } getMarkerStyle(marker, datum, params, opts, defaultOverrideStyle, inheritedStyle) { true; marker.itemStyler = this.properties.marker.itemStyler; return super.getMarkerStyle(marker, datum, params, opts, defaultOverrideStyle, inheritedStyle); } computeFocusBounds(opts) { const hiBox = computeMarkerFocusBounds(this, opts); const loBox = computeMarkerFocusBounds(this, { ...opts, datumIndex: opts.datumIndex + 1 }); if (hiBox && loBox) { return BBox13.merge([hiBox, loBox]); } return void 0; } isDatumEnabled(nodeData, datumIndex) { return datumIndex % 2 === 0 && super.isDatumEnabled(nodeData, datumIndex); } hasItemStylers() { return this.properties.styler != null || this.properties.marker.itemStyler != null || this.properties.label.itemStyler != null; } }; RangeAreaSeries.className = "RangeAreaSeries"; RangeAreaSeries.type = "range-area"; // packages/ag-charts-enterprise/src/series/range-area/rangeAreaSeriesOptionsDef.ts var import_ag_charts_community122 = require("ag-charts-community"); var import_ag_charts_core142 = require("ag-charts-core"); var { rangeAreaSeriesThemeableOptionsDef } = import_ag_charts_community122._ModuleSupport; var rangeAreaSeriesOptionsDef = { ...import_ag_charts_core142.commonSeriesOptionsDefs, ...rangeAreaSeriesThemeableOptionsDef, type: (0, import_ag_charts_core142.required)((0, import_ag_charts_core142.constant)("range-area")), xKey: (0, import_ag_charts_core142.required)(import_ag_charts_core142.string), yLowKey: (0, import_ag_charts_core142.required)(import_ag_charts_core142.string), yHighKey: (0, import_ag_charts_core142.required)(import_ag_charts_core142.string), xKeyAxis: import_ag_charts_core142.string, yKeyAxis: import_ag_charts_core142.string, xName: import_ag_charts_core142.string, yName: import_ag_charts_core142.string, yLowName: import_ag_charts_core142.string, yHighName: import_ag_charts_core142.string, legendItemName: import_ag_charts_core142.string, segmentation: import_ag_charts_core142.shapeSegmentation, invertedStyle: { enabled: import_ag_charts_core142.boolean, ...import_ag_charts_core142.fillOptionsDef } }; rangeAreaSeriesOptionsDef.pickOutsideVisibleMinorAxis = (0, import_ag_charts_core142.undocumented)(import_ag_charts_core142.boolean); rangeAreaSeriesOptionsDef.focusPriority = (0, import_ag_charts_core142.undocumented)(import_ag_charts_core142.number); // packages/ag-charts-enterprise/src/series/range-area/rangeAreaThemes.ts var import_ag_charts_community123 = require("ag-charts-community"); var import_ag_charts_core143 = require("ag-charts-core"); var RANGE_AREA_ITEM = { lineDash: { $path: "/series/$index/lineDash" }, lineDashOffset: { $path: "/series/$index/lineDashOffset" }, stroke: { $path: ["/series/$index/stroke", { $palette: "stroke" }] }, strokeOpacity: { $path: "/series/$index/strokeOpacity" }, strokeWidth: { $path: ["/series/$index/strokeWidth", 1] }, marker: { enabled: { $path: "/series/$index/marker/enabled" }, fill: { $isUserOption: [ "/series/$index/marker/fill", { $if: [ { $or: [ { $isGradient: { $path: "/series/$index/marker/fill" } }, { $isImage: { $path: "/series/$index/marker/fill" } }, { $isPattern: { $path: "/series/$index/marker/fill" } } ] }, { $merge: [ { $path: "/series/$index/marker/fill" }, { $applySwitch: [ { $path: "type" }, void 0, // default case shouldn't be hit because of $if ["gradient", import_ag_charts_core143.FILL_GRADIENT_RADIAL_REVERSED_DEFAULTS], ["image", import_ag_charts_core143.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core143.FILL_PATTERN_DEFAULTS] ] } ] }, { $isUserOption: [ "/series/$index/marker/fill", { $path: "/series/$index/marker/fill" }, { $palette: "fill" } ] } ] }, { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, ["gradient", import_ag_charts_core143.FILL_GRADIENT_RADIAL_REVERSED_DEFAULTS], ["image", import_ag_charts_core143.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core143.FILL_PATTERN_DEFAULTS] ] } ] }, fillOpacity: { $path: "/series/$index/marker/fillOpacity" }, lineDash: { $path: "/series/$index/marker/lineDash" }, lineDashOffset: { $path: "/series/$index/marker/lineDashOffset" }, shape: { $path: "/series/$index/marker/shape" }, size: { $path: ["/series/$index/marker/size", 6] }, stroke: { $path: ["/series/$index/marker/stroke", { $palette: "stroke" }] }, strokeOpacity: { $path: "/series/$index/marker/strokeOpacity" }, strokeWidth: { $path: ["/series/$index/marker/strokeWidth", 2] } } }; var RANGE_AREA_SERIES_THEME = { series: { fill: { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, ["gradient", import_ag_charts_core143.FILL_GRADIENT_LINEAR_DEFAULTS], ["pattern", import_ag_charts_core143.FILL_PATTERN_DEFAULTS] ] }, fillOpacity: 0.7, stroke: { $palette: "stroke" }, strokeWidth: 1, marker: { enabled: false, fill: { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, ["gradient", import_ag_charts_core143.FILL_GRADIENT_RADIAL_REVERSED_DEFAULTS], ["image", import_ag_charts_core143.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core143.FILL_PATTERN_DEFAULTS] ] }, shape: "circle", stroke: { $palette: "stroke" }, size: 6, strokeWidth: 2 }, nodeClickRange: "nearest", item: { low: RANGE_AREA_ITEM, high: RANGE_AREA_ITEM }, label: { ...import_ag_charts_core143.LABEL_BOXING_DEFAULTS, enabled: false, placement: "outside", padding: { $isUserOption: ["./spacing", 0, 10] }, // compatibility with old `padding` property (now named `spacing`). fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" } }, interpolation: { type: "linear" }, tooltip: { range: { $path: ["/tooltip/range", "nearest"] } }, highlight: import_ag_charts_core143.MARKER_SERIES_HIGHLIGHT_STYLE, segmentation: import_ag_charts_core143.SEGMENTATION_DEFAULTS, invertedStyle: { enabled: false, fill: { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, // @todo(AG-14792) should be { $path: '../fill' } to inherit from series.fill ["gradient", import_ag_charts_core143.FILL_GRADIENT_LINEAR_DEFAULTS], ["image", import_ag_charts_core143.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core143.FILL_PATTERN_DEFAULTS] ] }, fillOpacity: { $path: "../fillOpacity" } } }, axes: { [import_ag_charts_core143.CARTESIAN_AXIS_TYPE.NUMBER]: { crosshair: { enabled: true } } } }; // packages/ag-charts-enterprise/src/series/range-area/rangeAreaModule.ts var { predictCartesianNonPrimitiveAxis: predictCartesianNonPrimitiveAxis2 } = import_ag_charts_community124._ModuleSupport; var RangeAreaSeriesModule = { type: "series", name: "range-area", chartType: "cartesian", enterprise: true, version: import_ag_charts_community124.VERSION, dependencies: [import_ag_charts_community124.CartesianChartModule], options: rangeAreaSeriesOptionsDef, matchingKeys: ["xKey", "yLowKey", "yHighKey", "normalizedTo"], predictAxis: predictCartesianNonPrimitiveAxis2, defaultAxes: { y: { type: import_ag_charts_core144.CARTESIAN_AXIS_TYPE.NUMBER, position: import_ag_charts_core144.CARTESIAN_POSITION.LEFT }, x: { type: import_ag_charts_core144.CARTESIAN_AXIS_TYPE.CATEGORY, position: import_ag_charts_core144.CARTESIAN_POSITION.BOTTOM } }, axisKeys: { [import_ag_charts_core144.ChartAxisDirection.X]: "xKeyAxis", [import_ag_charts_core144.ChartAxisDirection.Y]: "yKeyAxis" }, themeTemplate: RANGE_AREA_SERIES_THEME, create: (ctx) => new RangeAreaSeries(ctx) }; // packages/ag-charts-enterprise/src/series/range-bar/rangeBarModule.ts var import_ag_charts_community130 = require("ag-charts-community"); var import_ag_charts_core150 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/range-bar/rangeBarSeries.ts var import_ag_charts_community127 = require("ag-charts-community"); var import_ag_charts_core147 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/range-bar/rangeBarAggregation.ts var import_ag_charts_community125 = require("ag-charts-community"); var import_ag_charts_core145 = require("ag-charts-core"); function aggregateRangeBarData(scale, xValues, highValues, lowValues, domainInput, smallestKeyInterval, xNeedsValueOf, yNeedsValueOf) { const [d0, d1] = (0, import_ag_charts_core145.aggregationDomain)(scale, domainInput); return (0, import_ag_charts_core145.computeExtremesAggregation)([d0, d1], xValues, highValues, lowValues, { smallestKeyInterval, xNeedsValueOf, yNeedsValueOf }); } var memoizedAggregateRangeBarData = (0, import_ag_charts_core145.simpleMemorize2)(aggregateRangeBarData); function aggregateRangeBarDataFromDataModel(scale, dataModel, processedData, series, existingFilters) { const xValues = dataModel.resolveKeysById(series, "xValue", processedData); const highValues = dataModel.resolveColumnById(series, "yHighValue", processedData); const lowValues = dataModel.resolveColumnById(series, "yLowValue", processedData); const domainInput = dataModel.getDomain(series, "xValue", "key", processedData); const xNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "xValue", processedData); const yNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "yHighValue", processedData) ?? dataModel.resolveColumnNeedsValueOf(series, "yLowValue", processedData); if (existingFilters) { const [d0, d1] = (0, import_ag_charts_core145.aggregationDomain)(scale, domainInput); return (0, import_ag_charts_core145.computeExtremesAggregation)([d0, d1], xValues, highValues, lowValues, { smallestKeyInterval: processedData.reduced?.smallestKeyInterval, xNeedsValueOf, yNeedsValueOf, existingFilters }); } return memoizedAggregateRangeBarData( scale, xValues, highValues, lowValues, domainInput, processedData.reduced?.smallestKeyInterval, xNeedsValueOf, yNeedsValueOf ); } function aggregateRangeBarDataFromDataModelPartial(scale, dataModel, processedData, series, targetRange, existingFilters) { const xValues = dataModel.resolveKeysById(series, "xValue", processedData); const highValues = dataModel.resolveColumnById(series, "yHighValue", processedData); const lowValues = dataModel.resolveColumnById(series, "yLowValue", processedData); const domainInput = dataModel.getDomain(series, "xValue", "key", processedData); const xNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "xValue", processedData); const yNeedsValueOf = dataModel.resolveColumnNeedsValueOf(series, "yHighValue", processedData) ?? dataModel.resolveColumnNeedsValueOf(series, "yLowValue", processedData); const [d0, d1] = (0, import_ag_charts_core145.aggregationDomain)(scale, domainInput); return (0, import_ag_charts_core145.computeExtremesAggregationPartial)([d0, d1], xValues, highValues, lowValues, { smallestKeyInterval: processedData.reduced?.smallestKeyInterval, targetRange, xNeedsValueOf, yNeedsValueOf, existingFilters }); } // packages/ag-charts-enterprise/src/series/range-bar/rangeBarProperties.ts var import_ag_charts_community126 = require("ag-charts-community"); var import_ag_charts_core146 = require("ag-charts-core"); var { AbstractBarSeriesProperties: AbstractBarSeriesProperties3, makeSeriesTooltip: makeSeriesTooltip6, DropShadow: DropShadow2, Label: Label3 } = import_ag_charts_community126._ModuleSupport; var RangeBarSeriesLabel = class extends Label3 { constructor() { super(...arguments); this.placement = "inside"; this.spacing = 0; } }; __decorateClass([ import_ag_charts_core146.Property ], RangeBarSeriesLabel.prototype, "placement", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarSeriesLabel.prototype, "spacing", 2); var RangeBarProperties = class extends AbstractBarSeriesProperties3 { constructor() { super(...arguments); this.fill = "#99CCFF"; this.fillOpacity = 1; this.stroke = "#99CCFF"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.cornerRadius = 0; this.shadow = new DropShadow2().set({ enabled: false }); this.label = new RangeBarSeriesLabel(); this.tooltip = makeSeriesTooltip6(); } }; __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "xKey", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "yLowKey", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "yHighKey", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "xName", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "yName", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "yLowName", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "yHighName", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "styler", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "shadow", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core146.Property ], RangeBarProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/range-bar/rangeBarSeries.ts var { SeriesNodePickMode: SeriesNodePickMode4, valueProperty: valueProperty7, keyProperty: keyProperty5, checkCrisp, updateLabelNode: updateLabelNode3, SMALLEST_KEY_INTERVAL: SMALLEST_KEY_INTERVAL3, LARGEST_KEY_INTERVAL, diff: diff4, prepareBarAnimationFunctions, midpointStartingBarPosition, resetBarSelectionsFn, resetBarSelectionsDirect, fixNumericExtent: fixNumericExtent5, seriesLabelFadeInAnimation: seriesLabelFadeInAnimation2, resetLabelFn: resetLabelFn2, animationValidation: animationValidation4, computeBarFocusBounds: computeBarFocusBounds4, visibleRangeIndices: visibleRangeIndices3, createDatumId: createDatumId5, Rect: Rect2, PointerEvents: PointerEvents3, motion: motion2, processedDataIsAnimatable: processedDataIsAnimatable4, getItemStyles: getItemStyles2, calculateSegments: calculateSegments3, toHighlightString: toHighlightString3, HighlightState: HighlightState3, AggregationManager: AggregationManager3, upsertNodeDatum: upsertNodeDatum3 } = import_ag_charts_community127._ModuleSupport; var RangeBarSeriesNodeEvent = class extends import_ag_charts_community127._ModuleSupport.SeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); this.xKey = series.properties.xKey; this.yLowKey = series.properties.yLowKey; this.yHighKey = series.properties.yHighKey; } }; var RangeBarSeries = class extends import_ag_charts_community127._ModuleSupport.AbstractBarSeries { constructor(moduleCtx) { super({ moduleCtx, pickModes: [SeriesNodePickMode4.AXIS_ALIGNED, SeriesNodePickMode4.EXACT_SHAPE_MATCH], propertyKeys: { x: ["xKey"], y: ["yLowKey", "yHighKey"] }, propertyNames: { x: ["xName"], y: ["yLowName", "yHighName", "yName"] }, categoryKey: "xValue", datumSelectionGarbageCollection: false, animationResetFns: { datum: resetBarSelectionsFn, label: resetLabelFn2 } }); this.properties = new RangeBarProperties(); this.aggregationManager = new AggregationManager3(); this.NodeEvent = RangeBarSeriesNodeEvent; } async processData(dataController) { const { xKey, yLowKey, yHighKey } = this.properties; const xScale = this.getCategoryAxis()?.scale; const yScale = this.getValueAxis()?.scale; const { isContinuousX, xScaleType, yScaleType } = this.getScaleInformation({ xScale, yScale }); const extraProps = []; if (this.needsDataModelDiff() && this.processedData) { extraProps.push(diff4(this.id, this.processedData)); } if (!this.ctx.animationManager.isSkipped()) { extraProps.push(animationValidation4()); } const visibleProps = this.visible ? {} : { forceValue: 0 }; const allowNullKey = this.properties.allowNullKeys ?? false; const { dataModel, processedData } = await this.requestDataModel(dataController, this.data, { props: [ keyProperty5(xKey, xScaleType, { id: "xValue", allowNullKey }), valueProperty7(yLowKey, yScaleType, { id: `yLowValue`, invalidValue: null, ...visibleProps }), valueProperty7(yHighKey, yScaleType, { id: `yHighValue`, invalidValue: null, ...visibleProps }), ...isContinuousX ? [SMALLEST_KEY_INTERVAL3, LARGEST_KEY_INTERVAL] : [], ...extraProps ], groupByKeys: false }); this.smallestDataInterval = processedData.reduced?.smallestKeyInterval; this.largestDataInterval = processedData.reduced?.largestKeyInterval; this.aggregateData(dataModel, processedData); this.animationState.transition("updateData"); } aggregateData(dataModel, processedData) { this.aggregationManager.markStale(processedData.input.count); if (processedData.type !== "ungrouped") return; if (processedDataIsAnimatable4(processedData)) return; const xAxis = this.axes[import_ag_charts_core147.ChartAxisDirection.X]; if (xAxis == null) return; const targetRange = this.estimateTargetRange(); this.aggregationManager.aggregate({ computePartial: (existingFilters) => aggregateRangeBarDataFromDataModelPartial( xAxis.scale.type, dataModel, processedData, this, targetRange, existingFilters ), computeFull: (existingFilters) => aggregateRangeBarDataFromDataModel(xAxis.scale.type, dataModel, processedData, this, existingFilters), targetRange }); const filters = this.aggregationManager.filters; if (filters && filters.length > 0) { import_ag_charts_core147.DebugMetrics.record( `${this.type}:aggregation`, filters.map((f) => f.maxRange) ); } } estimateTargetRange() { const xAxis = this.axes[import_ag_charts_core147.ChartAxisDirection.X]; if (xAxis?.scale == null) return 0; const [r0, r1] = xAxis.scale.range; return Math.abs(r1 - r0); } getSeriesDomain(direction) { const { processedData, dataModel } = this; if (!processedData || !dataModel) return { domain: [] }; const { keys: [keys] } = processedData.domain; if (direction === this.getCategoryDirection()) { const keyDef = dataModel.resolveProcessedDataDefById(this, `xValue`); if (keyDef?.def.type === "key" && keyDef?.def.valueType === "category") { const sortMetadata = dataModel.getKeySortMetadata(this, "xValue", processedData); return { domain: keys, sortMetadata }; } return { domain: this.padBandExtent(keys) }; } else { const yExtent = this.domainForClippedRange(direction, ["yHighValue", "yLowValue"], "xValue"); const fixedYExtent = (0, import_ag_charts_core147.findMinMax)(yExtent); return { domain: fixNumericExtent5(fixedYExtent) }; } } getSeriesRange(_direction, visibleRange) { return this.domainForVisibleRange(import_ag_charts_core147.ChartAxisDirection.Y, ["yHighValue", "yLowValue"], "xValue", visibleRange); } /** * Creates shared context for node datum creation/update operations. * This context is instantiated once and reused across all datum operations * to minimize memory allocations. Only caches values that are expensive to * compute - cheap property lookups use `this` directly. */ createNodeDatumContext(xAxis, yAxis) { const { dataModel, processedData } = this; if (!dataModel || !processedData) return void 0; const rawData = processedData.dataSources?.get(this.id)?.data; if (rawData == null) return void 0; const xScale = xAxis.scale; const yScale = yAxis.scale; const barAlongX = this.getBarDirection() === import_ag_charts_core147.ChartAxisDirection.X; const crisp = checkCrisp( xAxis?.scale, xAxis?.visibleRange, this.smallestDataInterval, this.largestDataInterval ); const [r0, r1] = xScale.range; const range2 = Math.abs(r1 - r0); this.aggregationManager.ensureLevelForRange(range2); const dataAggregationFilter = this.aggregationManager.getFilterForRange(range2); const animationEnabled = !this.ctx.animationManager.isSkipped(); const canIncrementallyUpdate = this.contextNodeData?.nodeData != null && (processedData.changeDescription != null || !processedDataIsAnimatable4(processedData) || dataAggregationFilter != null); const { groupOffset, barOffset, barWidth } = this.getBarDimensions(); return { xAxis, yAxis, rawData, xValues: dataModel.resolveKeysById(this, `xValue`, processedData), yLowValues: dataModel.resolveColumnById(this, `yLowValue`, processedData), yHighValues: dataModel.resolveColumnById(this, `yHighValue`, processedData), xScale, yScale, groupOffset, barOffset, barWidth, barAlongX, crisp, dataAggregationFilter, animationEnabled, xKey: this.properties.xKey, yLowKey: this.properties.yLowKey, yHighKey: this.properties.yHighKey, labelEnabled: this.properties.label.enabled, labelPlacement: this.properties.label.placement, labelPadding: (this.properties.label.spacing + (typeof this.properties.label.padding === "number" ? this.properties.label.padding : 0)) * (this.properties.label.placement === "outside" ? 1 : -1), canIncrementallyUpdate, nodes: canIncrementallyUpdate ? this.contextNodeData.nodeData : [], nodeIndex: 0 }; } /** * Validates and prepares state needed for node creation/update. * Returns undefined if datum should be skipped. */ prepareNodeDatumState(ctx, scratch, datumIndex) { const datum = ctx.rawData[datumIndex]; const xValue = ctx.xValues[datumIndex]; if (xValue === void 0 && !this.properties.allowNullKeys) return void 0; const rawLowValue = ctx.yLowValues[datumIndex]; const rawHighValue = ctx.yHighValues[datumIndex]; if (!Number.isFinite(rawLowValue?.valueOf()) || !Number.isFinite(rawHighValue?.valueOf())) return void 0; const [yLowValue, yHighValue] = rawLowValue < rawHighValue ? [rawLowValue, rawHighValue] : [rawHighValue, rawLowValue]; scratch.datum = datum; scratch.xValue = xValue; scratch.yLowValue = yLowValue; scratch.yHighValue = yHighValue; scratch.rawLowValue = rawLowValue; scratch.rawHighValue = rawHighValue; return scratch; } /** * Creates a minimal skeleton node - actual values set by updateNodeDatum. */ createSkeletonNodeDatum(ctx, params) { const scratch = params.nodeDatumScratch; return { index: params.groupedDataIndex, series: this, datum: scratch.datum, datumIndex: params.datumIndex, xValue: scratch.xValue, yLowValue: 0, // Will be updated by updateNodeDatum yHighValue: 0, // Will be updated by updateNodeDatum yLowKey: ctx.yLowKey, yHighKey: ctx.yHighKey, xKey: ctx.xKey, x: 0, // Will be updated by updateNodeDatum y: 0, // Will be updated by updateNodeDatum width: 0, // Will be updated by updateNodeDatum height: 0, // Will be updated by updateNodeDatum midPoint: { x: 0, y: 0 }, // Will be updated by updateNodeDatum crisp: params.crisp, labels: [] // Will be updated by updateNodeDatum }; } /** * Creates a new node: skeleton + update. */ createNodeDatum(ctx, params, _itemId, strokeWidth) { const prepared = this.prepareNodeDatumState(ctx, params.nodeDatumScratch, params.datumIndex); if (!prepared) return void 0; const nodeData = this.createSkeletonNodeDatum(ctx, params); this.updateNodeDatum(ctx, nodeData, params, strokeWidth, prepared); return nodeData; } /** * Updates node properties in-place. * Shared by both create (skeleton + update) and incremental update paths. */ updateNodeDatum(ctx, node, params, strokeWidth, prepared) { prepared ?? (prepared = this.prepareNodeDatumState(ctx, params.nodeDatumScratch, params.datumIndex)); if (!prepared) return; const mutableNode = node; mutableNode.index = params.groupedDataIndex; mutableNode.datum = prepared.datum; mutableNode.datumIndex = params.datumIndex; mutableNode.xValue = prepared.xValue; mutableNode.yLowValue = prepared.rawLowValue; mutableNode.yHighValue = prepared.rawHighValue; mutableNode.crisp = params.crisp; const y = Math.round(ctx.yScale.convert(params.yHigh)); const bottomY = Math.round(ctx.yScale.convert(params.yLow)); const height = Math.max(strokeWidth, Math.abs(bottomY - y)); const rect = { x: ctx.barAlongX ? Math.min(y, bottomY) : params.x, y: ctx.barAlongX ? params.x : Math.min(y, bottomY), width: ctx.barAlongX ? height : params.width, height: ctx.barAlongX ? params.width : height }; mutableNode.x = rect.x; mutableNode.y = rect.y; mutableNode.width = rect.width; mutableNode.height = rect.height; const mutableMidPoint = mutableNode.midPoint; mutableMidPoint.x = rect.x + rect.width / 2; mutableMidPoint.y = rect.y + rect.height / 2; const existingClipBBox = mutableNode.clipBBox; if (existingClipBBox) { existingClipBBox.x = rect.x; existingClipBBox.y = rect.y; existingClipBBox.width = rect.width; existingClipBBox.height = rect.height; } const labelParams = params.labelParamsScratch; labelParams.labels = mutableNode.labels; labelParams.datumIndex = params.datumIndex; labelParams.rectX = rect.x; labelParams.rectY = rect.y; labelParams.rectWidth = rect.width; labelParams.rectHeight = rect.height; labelParams.yLowValue = prepared.yLowValue; labelParams.yHighValue = prepared.yHighValue; labelParams.datum = prepared.datum; this.updateLabelData(ctx, labelParams); } /** * Creates node data using aggregation filters for large datasets. */ createNodeDataWithAggregation(ctx, xPosition, nodeDatumParamsScratch, itemId, strokeWidth, dataAggregationFilter) { const { maxRange, indexData, midpointIndices } = dataAggregationFilter; const [start, end] = visibleRangeIndices3(1, maxRange, ctx.xAxis.range, (index) => { const aggIndex = index * import_ag_charts_core147.AGGREGATION_SPAN; const xMaxIndex = indexData[aggIndex + import_ag_charts_core147.AGGREGATION_INDEX_X_MAX]; const midDatumIndex = midpointIndices[index]; if (midDatumIndex === -1) return; return [xPosition(midDatumIndex), xPosition(xMaxIndex) + ctx.barWidth]; }); for (let i = start; i < end; i += 1) { const aggIndex = i * import_ag_charts_core147.AGGREGATION_SPAN; const xMinIndex = indexData[aggIndex + import_ag_charts_core147.AGGREGATION_INDEX_X_MIN]; const xMaxIndex = indexData[aggIndex + import_ag_charts_core147.AGGREGATION_INDEX_X_MAX]; const yMinIndex = indexData[aggIndex + import_ag_charts_core147.AGGREGATION_INDEX_Y_MIN]; const yMaxIndex = indexData[aggIndex + import_ag_charts_core147.AGGREGATION_INDEX_Y_MAX]; const midDatumIndex = midpointIndices[i]; if (midDatumIndex === -1) continue; const xValue = ctx.xValues[midDatumIndex]; if (xValue === void 0 && !this.properties.allowNullKeys) continue; nodeDatumParamsScratch.datumIndex = midDatumIndex; nodeDatumParamsScratch.groupedDataIndex = 0; nodeDatumParamsScratch.x = xPosition(midDatumIndex); nodeDatumParamsScratch.width = Math.abs(xPosition(xMinIndex) - xPosition(xMaxIndex)) + ctx.barWidth; nodeDatumParamsScratch.yLow = ctx.yLowValues[yMinIndex]; nodeDatumParamsScratch.yHigh = ctx.yHighValues[yMaxIndex]; nodeDatumParamsScratch.crisp = false; upsertNodeDatum3( ctx, nodeDatumParamsScratch, (c, p) => this.createNodeDatum(c, p, itemId, strokeWidth), (c, n, p) => this.updateNodeDatum(c, n, p, strokeWidth) ); } } /** * Creates node data for simple (ungrouped) data processing. */ createNodeDataSimple(ctx, xPosition, nodeDatumParamsScratch, itemId, strokeWidth, processedData) { const invalidData = processedData.invalidData?.get(this.id); let [start, end] = this.visibleRangeIndices("xValue", ctx.xAxis.range); if (processedData.input.count < 1e3) { start = 0; end = processedData.input.count; } for (let datumIndex = start; datumIndex < end; datumIndex += 1) { if (invalidData?.[datumIndex] === true) continue; nodeDatumParamsScratch.datumIndex = datumIndex; nodeDatumParamsScratch.groupedDataIndex = 0; nodeDatumParamsScratch.x = xPosition(datumIndex); nodeDatumParamsScratch.width = ctx.barWidth; nodeDatumParamsScratch.yLow = ctx.yLowValues[datumIndex]; nodeDatumParamsScratch.yHigh = ctx.yHighValues[datumIndex]; nodeDatumParamsScratch.crisp = ctx.crisp; upsertNodeDatum3( ctx, nodeDatumParamsScratch, (c, p) => this.createNodeDatum(c, p, itemId, strokeWidth), (c, n, p) => this.updateNodeDatum(c, n, p, strokeWidth) ); } } /** * Creates node data for grouped data processing. */ createNodeDataGrouped(ctx, xPosition, nodeDatumParamsScratch, itemId, strokeWidth) { const processedData = this.processedData; for (const { datumIndex, groupIndex: groupDataIndex } of this.dataModel.forEachGroupDatum( this, processedData )) { nodeDatumParamsScratch.datumIndex = datumIndex; nodeDatumParamsScratch.groupedDataIndex = groupDataIndex; nodeDatumParamsScratch.x = xPosition(datumIndex); nodeDatumParamsScratch.width = ctx.barWidth; nodeDatumParamsScratch.yLow = ctx.yLowValues[datumIndex]; nodeDatumParamsScratch.yHigh = ctx.yHighValues[datumIndex]; nodeDatumParamsScratch.crisp = ctx.crisp; upsertNodeDatum3( ctx, nodeDatumParamsScratch, (c, p) => this.createNodeDatum(c, p, itemId, strokeWidth), (c, n, p) => this.updateNodeDatum(c, n, p, strokeWidth) ); } } populateNodeData(ctx) { const { processedData } = this; if (!processedData) return; const { yLowKey, yHighKey, strokeWidth } = this.properties; const itemId = `${yLowKey}-${yHighKey}`; const xPosition = (datumIndex) => { const x = ctx.xScale.convert(ctx.xValues[datumIndex]); if (!Number.isFinite(x)) return Number.NaN; return Math.round(x) + ctx.groupOffset + ctx.barOffset; }; const nodeDatumParamsScratch = { nodeDatumScratch: { datum: void 0, xValue: void 0, yLowValue: 0, yHighValue: 0, rawLowValue: void 0, rawHighValue: void 0 }, labelParamsScratch: { labels: [], datumIndex: 0, rectX: 0, rectY: 0, rectWidth: 0, rectHeight: 0, yLowValue: 0, yHighValue: 0, datum: void 0 }, datumIndex: 0, groupedDataIndex: 0, x: 0, width: 0, yLow: 0, yHigh: 0, crisp: false }; if (ctx.dataAggregationFilter != null) { this.createNodeDataWithAggregation( ctx, xPosition, nodeDatumParamsScratch, itemId, strokeWidth, ctx.dataAggregationFilter ); } else if (processedData.type === "ungrouped") { this.createNodeDataSimple(ctx, xPosition, nodeDatumParamsScratch, itemId, strokeWidth, processedData); } else { this.createNodeDataGrouped(ctx, xPosition, nodeDatumParamsScratch, itemId, strokeWidth); } } finalizeNodeData(ctx) { if (ctx.canIncrementallyUpdate && ctx.nodeIndex < ctx.nodes.length) { ctx.nodes.length = ctx.nodeIndex; } } initializeResult(ctx) { const { yLowKey, yHighKey } = this.properties; const itemId = `${yLowKey}-${yHighKey}`; const xAxis = this.getCategoryAxis(); const yAxis = this.getValueAxis(); const segments = xAxis && yAxis && this.chart?.seriesRect ? calculateSegments3(this.properties.segmentation, xAxis, yAxis, this.chart.seriesRect, this.ctx.scene) : void 0; return { itemId, nodeData: ctx.nodes, labelData: [], scales: this.calculateScaling(), groupScale: this.getScaling(this.ctx.seriesStateManager.getGroupScale(this)), visible: this.visible, styles: getItemStyles2(this.getItemStyle.bind(this)), segments }; } assembleResult(ctx, result) { for (const node of ctx.nodes) { result.labelData.push(...node.labels); } return result; } /** * Updates existing label data in place or creates new labels if needed. * This avoids array allocations during incremental updates. * Uses positional params (no destructuring) for performance in hot path. */ updateLabelData(ctx, params) { const labels = params.labels; if (!ctx.labelEnabled) { if (labels.length > 0) { labels.length = 0; } return; } const { xKey, yLowKey, yHighKey, xName, yLowName, yHighName, yName, legendItemName, label } = this.properties; const barAlongX = ctx.barAlongX; const placement = ctx.labelPlacement; const labelPadding = ctx.labelPadding; const rectX = params.rectX; const rectY = params.rectY; const rectWidth = params.rectWidth; const rectHeight = params.rectHeight; const yLowX = rectX + (barAlongX ? -labelPadding : rectWidth / 2); const yLowY = rectY + (barAlongX ? rectHeight / 2 : rectHeight + labelPadding); let yLowTextAlign; if (placement === "outside") { yLowTextAlign = barAlongX ? "right" : "center"; } else { yLowTextAlign = barAlongX ? "left" : "center"; } let yLowTextBaseline; if (placement === "outside") { yLowTextBaseline = barAlongX ? "middle" : "top"; } else { yLowTextBaseline = barAlongX ? "middle" : "bottom"; } const yHighX = rectX + (barAlongX ? rectWidth + labelPadding : rectWidth / 2); const yHighY = rectY + (barAlongX ? rectHeight / 2 : -labelPadding); let yHighTextAlign; if (placement === "outside") { yHighTextAlign = barAlongX ? "left" : "center"; } else { yHighTextAlign = barAlongX ? "right" : "center"; } let yHighTextBaseline; if (placement === "outside") { yHighTextBaseline = barAlongX ? "middle" : "bottom"; } else { yHighTextBaseline = barAlongX ? "middle" : "top"; } const datum = params.datum; const yLowValue = params.yLowValue; const yHighValue = params.yHighValue; const datumIndex = params.datumIndex; const labelTextParams = { datum, xKey, yLowKey, yHighKey, xName, yLowName, yHighName, yName, legendItemName }; const yDomain = this.getSeriesDomain(import_ag_charts_core147.ChartAxisDirection.Y).domain; const yLowText = this.getLabelText( yLowValue, datum, yLowKey, "y", yDomain, label, { itemType: "low", value: yLowValue, ...labelTextParams } ); const yHighText = this.getLabelText( yHighValue, datum, yHighKey, "y", yDomain, label, { itemType: "high", value: yHighValue, ...labelTextParams } ); if (labels.length > 0 && labels[0].itemType === "low") { const yLowLabel = labels[0]; yLowLabel.datumIndex = datumIndex; yLowLabel.x = yLowX; yLowLabel.y = yLowY; yLowLabel.textAlign = yLowTextAlign; yLowLabel.textBaseline = yLowTextBaseline; yLowLabel.text = yLowText; yLowLabel.datum = datum; } else { labels[0] = { datumIndex, x: yLowX, y: yLowY, textAlign: yLowTextAlign, textBaseline: yLowTextBaseline, text: yLowText, itemType: "low", datum, series: this }; } if (labels.length > 1 && labels[1].itemType === "high") { const yHighLabel = labels[1]; yHighLabel.datumIndex = datumIndex; yHighLabel.x = yHighX; yHighLabel.y = yHighY; yHighLabel.textAlign = yHighTextAlign; yHighLabel.textBaseline = yHighTextBaseline; yHighLabel.text = yHighText; yHighLabel.datum = datum; } else { labels[1] = { datumIndex, x: yHighX, y: yHighY, textAlign: yHighTextAlign, textBaseline: yHighTextBaseline, text: yHighText, itemType: "high", datum, series: this }; } labels.length = 2; } nodeFactory() { return new Rect2(); } getStyle(ignoreStylerCallback, highlightState) { const { cornerRadius, fill, fillOpacity, lineDash, lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth, styler } = this.properties; let stylerResult = {}; if (!ignoreStylerCallback && styler) { const stylerParams = this.makeStylerParams(highlightState); stylerResult = this.ctx.optionsGraphService.resolvePartial( ["series", `${this.declarationOrder}`], this.cachedCallWithContext(styler, stylerParams) ?? {}, { pick: false } ) ?? {}; } return { cornerRadius: stylerResult.cornerRadius ?? cornerRadius, fill: stylerResult.fill ?? fill, fillOpacity: stylerResult.fillOpacity ?? fillOpacity, lineDash: stylerResult.lineDash ?? lineDash, lineDashOffset: stylerResult.lineDashOffset ?? lineDashOffset, opacity: 1, stroke: stylerResult.stroke ?? stroke3, strokeOpacity: stylerResult.strokeOpacity ?? strokeOpacity, strokeWidth: stylerResult.strokeWidth ?? strokeWidth }; } makeStylerParams(highlightStateEnum) { const { id: seriesId } = this; const { cornerRadius, fill, fillOpacity, lineDash, lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth, xKey, yLowKey, yHighKey } = this.properties; const highlightState = toHighlightString3(highlightStateEnum ?? HighlightState3.None); return { cornerRadius, fill, fillOpacity, highlightState, lineDash, lineDashOffset, seriesId, stroke: stroke3, strokeOpacity, strokeWidth, xKey, yLowKey, yHighKey }; } updateDatumSelection(opts) { const { nodeData, datumSelection } = opts; const data = nodeData ?? []; if (!processedDataIsAnimatable4(this.processedData)) { return datumSelection.update(data); } return datumSelection.update(data, void 0, (datum) => this.getDatumId(datum)); } getItemStyle(datumIndex, isHighlight, highlightState) { const { properties, dataModel, processedData } = this; const { itemStyler } = properties; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex, highlightState); let style = (0, import_ag_charts_core147.mergeDefaults)(highlightStyle, this.getStyle(datumIndex === void 0, highlightState)); if (itemStyler && dataModel != null && processedData != null && datumIndex != null) { const xValue = dataModel.resolveKeysById(this, `xValue`, processedData)[datumIndex]; const overrides = this.cachedDatumCallback( createDatumId5(this.getDatumId({ xValue }), isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(datumIndex, isHighlight, style); return this.callWithContext(itemStyler, params); } ); if (overrides) { style = (0, import_ag_charts_core147.mergeDefaults)(overrides, style); } } return style; } makeItemStylerParams(datumIndex, isHighlight, style) { const { id: seriesId, properties, processedData } = this; const { xKey, yHighKey, yLowKey } = properties; const datum = processedData.dataSources.get(seriesId)?.data[datumIndex]; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightStateString = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum, xKey, yHighKey, yLowKey, highlightState: highlightStateString, ...style, fill }; } updateDatumStyles(opts) { const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); opts.datumSelection.each((node, datum) => { if (!opts.datumSelection.isGarbage(node)) { const highlightState = this.getHighlightState(highlightedDatum, opts.isHighlight, datum.datumIndex); datum.style = this.getItemStyle(datum.datumIndex, opts.isHighlight, highlightState); } }); } updateDatumNodes({ datumSelection, isHighlight }) { const { contextNodeData } = this; if (!contextNodeData) { return; } const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); const categoryAlongX = this.getCategoryDirection() === import_ag_charts_core147.ChartAxisDirection.X; const fillBBox = this.getShapeFillBBox(); const series = this; datumSelection.each(function updateRangeBarNode(rect, datum) { const style = datum.style ?? contextNodeData.styles[series.getHighlightState(highlightedDatum, isHighlight, datum.datumIndex)]; rect.setStyleProperties(style, fillBBox); rect.setStaticProperties( "overlay", style.cornerRadius ?? 0, style.cornerRadius ?? 0, style.cornerRadius ?? 0, style.cornerRadius ?? 0, categoryAlongX ? datum.width > 0 : datum.height > 0, datum.crisp, void 0 ); }); } updateLabelSelection(opts) { const labelData = this.properties.label.enabled ? opts.labelData : []; return opts.labelSelection.update(labelData, (text2) => { text2.pointerEvents = PointerEvents3.None; }); } updateLabelNodes(opts) { const { isHighlight = false } = opts; const params = { xKey: this.properties.xKey, xName: this.properties.xName ?? this.properties.xKey, yName: this.properties.yName, yLowKey: this.properties.yLowKey, yLowName: this.properties.yLowName ?? this.properties.yLowKey, yHighKey: this.properties.yHighKey, yHighName: this.properties.yHighName ?? this.properties.yHighKey, legendItemName: this.properties.legendItemName }; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); opts.labelSelection.each((textNode, datum) => { textNode.fillOpacity = this.getHighlightStyle(isHighlight, datum?.datumIndex).opacity ?? 1; updateLabelNode3(this, textNode, params, this.properties.label, datum, isHighlight, activeHighlight); }); } getHighlightLabelData(labelData, highlightedItem) { if (highlightedItem.labels?.length) { return highlightedItem.labels; } return super.getHighlightLabelData(labelData, highlightedItem); } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, properties } = this; const { xKey, xName, yName, yLowKey, yHighKey, yLowName, yHighName, tooltip, legendItemName } = properties; const xAxis = this.getCategoryAxis(); const yAxis = this.getValueAxis(); if (!dataModel || !processedData || !xAxis || !yAxis) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const xValue = dataModel.resolveKeysById(this, `xValue`, processedData)[datumIndex]; const yHighValue = dataModel.resolveColumnById(this, `yHighValue`, processedData)[datumIndex]; const yLowValue = dataModel.resolveColumnById(this, `yLowValue`, processedData)[datumIndex]; const allowNullKeys = this.properties.allowNullKeys ?? false; if (xValue === void 0 && !allowNullKeys) return; const format = this.getItemStyle(datumIndex, false); const value = `${this.getAxisValueText(yAxis, "tooltip", yLowValue, datum, yLowKey, legendItemName)} - ${this.getAxisValueText(yAxis, "tooltip", yHighValue, datum, yHighKey, legendItemName)}`; return this.formatTooltipWithContext( tooltip, { heading: this.getAxisValueText(xAxis, "tooltip", xValue, datum, xKey, legendItemName), symbol: this.legendItemSymbol(), data: [ { label: yName, fallbackLabel: `${yLowName ?? yLowKey} - ${yHighName ?? yHighKey}`, value, missing: import_ag_charts_community127._ModuleSupport.isTooltipValueMissing(yHighValue) && import_ag_charts_community127._ModuleSupport.isTooltipValueMissing(yLowValue) } ] }, { seriesId, datum, title: yName, xKey, xName, yName, yLowKey, yHighKey, yLowName, yHighName, legendItemName, ...format } ); } legendItemSymbol() { const { fill, stroke: stroke3, strokeWidth, fillOpacity, strokeOpacity, lineDash, lineDashOffset } = this.getStyle( false, HighlightState3.None ); return { marker: { fill, stroke: stroke3, fillOpacity, strokeOpacity, strokeWidth, lineDash, lineDashOffset } }; } getLegendData(legendType) { if (legendType !== "category") { return []; } const { id: seriesId, visible } = this; const { yName, yLowName, yHighName, yLowKey, yHighKey, legendItemName, showInLegend } = this.properties; const legendItemText = legendItemName ?? yName ?? `${yLowName ?? yLowKey} - ${yHighName ?? yHighKey}`; const itemId = `${yLowKey}-${yHighKey}`; return [ { legendType: "category", id: seriesId, itemId, seriesId, enabled: visible, label: { text: `${legendItemText}` }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend } ]; } resetDatumAnimation(data) { resetBarSelectionsDirect([data.datumSelection]); } animateEmptyUpdateReady({ datumSelection, labelSelection }) { const fns = prepareBarAnimationFunctions(midpointStartingBarPosition(this.isVertical(), "normal"), "unknown"); motion2.fromToMotion(this.id, "datums", this.ctx.animationManager, [datumSelection], fns); seriesLabelFadeInAnimation2( this, "labels", this.ctx.animationManager, labelSelection, this.highlightLabelSelection ); } animateWaitingUpdateReady(data) { const { datumSelection: datumSelections, labelSelection, contextData, previousContextData } = data; const dataDiff = import_ag_charts_community127._ModuleSupport.calculateDataDiff( this.id, datumSelections, this.getDatumId.bind(this), contextData, previousContextData, this.processedData, this.processedDataUpdated ); this.ctx.animationManager.stopByAnimationGroupId(this.id); const mode = previousContextData == null ? "fade" : "normal"; const fns = prepareBarAnimationFunctions(midpointStartingBarPosition(this.isVertical(), mode), "added"); motion2.fromToMotion( this.id, "datums", this.ctx.animationManager, [datumSelections], fns, (_, datum) => this.getDatumId(datum), dataDiff ); if (dataDiff?.changed || !(0, import_ag_charts_core147.areScalingEqual)(contextData.groupScale, previousContextData?.groupScale)) { seriesLabelFadeInAnimation2( this, "labels", this.ctx.animationManager, labelSelection, this.highlightLabelSelection ); } } getDatumId(datum) { return `${datum.xValue}`; } isLabelEnabled() { return this.properties.label.enabled; } computeFocusBounds({ datumIndex }) { return computeBarFocusBounds4(this, this.contextNodeData?.nodeData[datumIndex]); } hasItemStylers() { return this.properties.styler != null || this.properties.itemStyler != null || this.properties.label.itemStyler != null; } }; RangeBarSeries.className = "RangeBarSeries"; RangeBarSeries.type = "range-bar"; // packages/ag-charts-enterprise/src/series/range-bar/rangeBarSeriesOptionsDef.ts var import_ag_charts_community128 = require("ag-charts-community"); var import_ag_charts_core148 = require("ag-charts-core"); var { rangeBarSeriesThemeableOptionsDef } = import_ag_charts_community128._ModuleSupport; var rangeBarSeriesOptionsDef = { ...import_ag_charts_core148.commonSeriesOptionsDefs, ...rangeBarSeriesThemeableOptionsDef, type: (0, import_ag_charts_core148.required)((0, import_ag_charts_core148.constant)("range-bar")), xKey: (0, import_ag_charts_core148.required)(import_ag_charts_core148.string), yLowKey: (0, import_ag_charts_core148.required)(import_ag_charts_core148.string), yHighKey: (0, import_ag_charts_core148.required)(import_ag_charts_core148.string), xKeyAxis: import_ag_charts_core148.string, yKeyAxis: import_ag_charts_core148.string, xName: import_ag_charts_core148.string, yName: import_ag_charts_core148.string, yLowName: import_ag_charts_core148.string, yHighName: import_ag_charts_core148.string, legendItemName: import_ag_charts_core148.string, segmentation: import_ag_charts_core148.shapeSegmentation, width: import_ag_charts_core148.positiveNumberNonZero, widthRatio: import_ag_charts_core148.ratio }; rangeBarSeriesOptionsDef.pickOutsideVisibleMinorAxis = (0, import_ag_charts_core148.undocumented)(import_ag_charts_core148.boolean); rangeBarSeriesOptionsDef.focusPriority = (0, import_ag_charts_core148.undocumented)(import_ag_charts_core148.number); // packages/ag-charts-enterprise/src/series/range-bar/rangeBarThemes.ts var import_ag_charts_community129 = require("ag-charts-community"); var import_ag_charts_core149 = require("ag-charts-core"); var RANGE_BAR_SERIES_THEME = { series: { direction: "vertical", fill: { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, ["gradient", import_ag_charts_core149.FILL_GRADIENT_LINEAR_DEFAULTS], ["image", import_ag_charts_core149.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core149.FILL_PATTERN_DEFAULTS] ] }, stroke: { $palette: "stroke" }, strokeWidth: { $isUserOption: ["./stroke", 2, 0] }, label: { ...import_ag_charts_core149.LABEL_BOXING_DEFAULTS, enabled: false, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "chartBackgroundColor" }, placement: "inside", padding: { $isUserOption: ["./spacing", 0, 6] } // compatibility with old `padding` property (now named `spacing`). }, highlight: import_ag_charts_core149.MULTI_SERIES_HIGHLIGHT_STYLE, segmentation: import_ag_charts_core149.SEGMENTATION_DEFAULTS }, axes: { [import_ag_charts_core149.CARTESIAN_AXIS_TYPE.NUMBER]: { crosshair: { enabled: true } } } }; // packages/ag-charts-enterprise/src/series/range-bar/rangeBarModule.ts var { predictCartesianNonPrimitiveAxis: predictCartesianNonPrimitiveAxis3 } = import_ag_charts_community130._ModuleSupport; var RangeBarSeriesModule = { type: "series", name: "range-bar", chartType: "cartesian", enterprise: true, groupable: true, version: import_ag_charts_community130.VERSION, dependencies: [import_ag_charts_community130.CartesianChartModule], options: rangeBarSeriesOptionsDef, matchingKeys: ["xKey", "yLowKey", "yHighKey", "normalizedTo"], predictAxis: predictCartesianNonPrimitiveAxis3, defaultAxes: import_ag_charts_core150.DIRECTION_SWAP_AXES, axisKeys: { [import_ag_charts_core150.ChartAxisDirection.X]: "xKeyAxis", [import_ag_charts_core150.ChartAxisDirection.Y]: "yKeyAxis" }, axisKeysFlipped: { [import_ag_charts_core150.ChartAxisDirection.X]: "yKeyAxis", [import_ag_charts_core150.ChartAxisDirection.Y]: "xKeyAxis" }, themeTemplate: RANGE_BAR_SERIES_THEME, create: (ctx) => new RangeBarSeries(ctx) }; // packages/ag-charts-enterprise/src/series/waterfall/waterfallModule.ts var import_ag_charts_community135 = require("ag-charts-community"); var import_ag_charts_core155 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/waterfall/waterfallSeries.ts var import_ag_charts_community132 = require("ag-charts-community"); var import_ag_charts_core152 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/waterfall/waterfallSeriesProperties.ts var import_ag_charts_community131 = require("ag-charts-community"); var import_ag_charts_core151 = require("ag-charts-core"); var { AbstractBarSeriesProperties: AbstractBarSeriesProperties4, makeSeriesTooltip: makeSeriesTooltip7, DropShadow: DropShadow3, Label: Label4 } = import_ag_charts_community131._ModuleSupport; var WaterfallSeriesTotal = class extends import_ag_charts_core151.BaseProperties { }; __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesTotal.prototype, "totalType", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesTotal.prototype, "index", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesTotal.prototype, "axisLabel", 2); var WaterfallSeriesItemTooltip = class extends import_ag_charts_core151.BaseProperties { }; __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItemTooltip.prototype, "renderer", 2); var WaterfallSeriesLabel = class extends Label4 { constructor() { super(...arguments); this.placement = "outside-end"; this.spacing = 0; } }; __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesLabel.prototype, "placement", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesLabel.prototype, "spacing", 2); var WaterfallSeriesItem = class extends import_ag_charts_core151.BaseProperties { constructor() { super(...arguments); this.fill = "#c16068"; this.stroke = "#c16068"; this.fillOpacity = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.strokeWidth = 1; this.cornerRadius = 0; this.shadow = new DropShadow3().set({ enabled: false }); this.label = new WaterfallSeriesLabel(); this.tooltip = new WaterfallSeriesItemTooltip(); } }; __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "name", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "fill", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "shadow", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "label", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItem.prototype, "tooltip", 2); var WaterfallSeriesConnectorLine = class extends import_ag_charts_core151.BaseProperties { constructor() { super(...arguments); this.enabled = true; this.stroke = "black"; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.strokeWidth = 2; } }; __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesConnectorLine.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesConnectorLine.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesConnectorLine.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesConnectorLine.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesConnectorLine.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesConnectorLine.prototype, "strokeWidth", 2); var WaterfallSeriesItems = class extends import_ag_charts_core151.BaseProperties { constructor() { super(...arguments); this.positive = new WaterfallSeriesItem(); this.negative = new WaterfallSeriesItem(); this.total = new WaterfallSeriesItem(); } }; __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItems.prototype, "positive", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItems.prototype, "negative", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesItems.prototype, "total", 2); var WaterfallSeriesProperties = class extends AbstractBarSeriesProperties4 { constructor() { super(...arguments); this.item = new WaterfallSeriesItems(); this.totals = new import_ag_charts_core151.PropertiesArray(WaterfallSeriesTotal); this.line = new WaterfallSeriesConnectorLine(); this.tooltip = makeSeriesTooltip7(); } getStyle(itemType) { const { fillOpacity, strokeWidth, strokeOpacity, fill, stroke: stroke3, lineDash, lineDashOffset, cornerRadius } = this.item[itemType === "subtotal" ? "total" : itemType]; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, cornerRadius, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesProperties.prototype, "xKey", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesProperties.prototype, "yKey", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesProperties.prototype, "xName", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesProperties.prototype, "yName", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesProperties.prototype, "item", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesProperties.prototype, "totals", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesProperties.prototype, "line", 2); __decorateClass([ import_ag_charts_core151.Property ], WaterfallSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/waterfall/waterfallSeries.ts var { adjustLabelPlacement, SeriesNodePickMode: SeriesNodePickMode5, fixNumericExtent: fixNumericExtent6, valueProperty: valueProperty8, keyProperty: keyProperty6, accumulativeValueProperty, trailingAccumulatedValueProperty, createDatumId: createDatumId6, checkCrisp: checkCrisp2, updateLabelNode: updateLabelNode4, prepareBarAnimationFunctions: prepareBarAnimationFunctions2, collapsedStartingBarPosition, resetBarSelectionsDirect: resetBarSelectionsDirect2, resetBarSelectionsFn: resetBarSelectionsFn2, seriesLabelFadeInAnimation: seriesLabelFadeInAnimation3, resetLabelFn: resetLabelFn3, animationValidation: animationValidation5, DEFAULT_CARTESIAN_DIRECTION_KEYS: DEFAULT_CARTESIAN_DIRECTION_KEYS2, DEFAULT_CARTESIAN_DIRECTION_NAMES: DEFAULT_CARTESIAN_DIRECTION_NAMES2, computeBarFocusBounds: computeBarFocusBounds5, Rect: Rect3, motion: motion3, getItemStylesPerItemId: getItemStylesPerItemId2, DataSet, processedDataIsAnimatable: processedDataIsAnimatable5, upsertNodeDatum: upsertNodeDatum4 } = import_ag_charts_community132._ModuleSupport; var WaterfallSeries = class extends import_ag_charts_community132._ModuleSupport.AbstractBarSeries { constructor(moduleCtx) { super({ moduleCtx, propertyKeys: DEFAULT_CARTESIAN_DIRECTION_KEYS2, propertyNames: DEFAULT_CARTESIAN_DIRECTION_NAMES2, categoryKey: void 0, pickModes: [SeriesNodePickMode5.NEAREST_NODE, SeriesNodePickMode5.EXACT_SHAPE_MATCH], pathsPerSeries: ["connector"], pathsZIndexSubOrderOffset: [-1, -1], animationResetFns: { datum: resetBarSelectionsFn2, label: resetLabelFn3 } }); this.properties = new WaterfallSeriesProperties(); this.seriesItemTypes = /* @__PURE__ */ new Set(["positive", "negative", "total"]); } async processData(dataController) { const { xKey, yKey, totals } = this.properties; const { data } = this; if (!this.visible) return; const positiveNumber11 = (v) => (0, import_ag_charts_core152.isContinuous)(v) && Number(v) >= 0; const negativeNumber = (v) => (0, import_ag_charts_core152.isContinuous)(v) && Number(v) >= 0; const totalTypeValue = (v) => v === "total" || v === "subtotal"; const propertyDefinition = { missingValue: void 0, invalidValue: void 0 }; const dataWithTotals = []; const totalsMap = totals.reduce((result, total) => { const totalsAtIndex = result.get(total.index); if (totalsAtIndex) { totalsAtIndex.push(total); } else { result.set(total.index, [total]); } return result; }, /* @__PURE__ */ new Map()); for (const [i, datum] of data?.data.entries() ?? []) { dataWithTotals.push(datum); const totalsAtIndex = totalsMap.get(i); if (totalsAtIndex) { for (const total of totalsAtIndex) { dataWithTotals.push({ ...total.toJson(), [xKey]: total.axisLabel }); } } } const extraProps = []; if (!this.ctx.animationManager.isSkipped()) { extraProps.push(animationValidation5()); } const xScale = this.getCategoryAxis()?.scale; const yScale = this.getValueAxis()?.scale; const { isContinuousX, xScaleType, yScaleType } = this.getScaleInformation({ xScale, yScale }); const allowNullKey = this.properties.allowNullKeys ?? false; const { processedData } = await this.requestDataModel( dataController, DataSet.wrap(dataWithTotals), { props: [ keyProperty6(xKey, xScaleType, { id: `xValue`, allowNullKey }), accumulativeValueProperty(yKey, yScaleType, { ...propertyDefinition, id: `yCurrent` }), accumulativeValueProperty(yKey, yScaleType, { ...propertyDefinition, missingValue: 0, id: `yCurrentTotal` }), accumulativeValueProperty(yKey, yScaleType, { ...propertyDefinition, id: `yCurrentPositive`, validation: positiveNumber11 }), accumulativeValueProperty(yKey, yScaleType, { ...propertyDefinition, id: `yCurrentNegative`, validation: negativeNumber }), trailingAccumulatedValueProperty(yKey, yScaleType, { ...propertyDefinition, id: `yPrevious` }), valueProperty8(yKey, yScaleType, { id: `yRaw` }), // Raw value pass-through. valueProperty8("totalType", "category", { id: `totalTypeValue`, missingValue: void 0, validation: totalTypeValue }), ...isContinuousX ? [import_ag_charts_community132._ModuleSupport.SMALLEST_KEY_INTERVAL, import_ag_charts_community132._ModuleSupport.LARGEST_KEY_INTERVAL] : [], ...extraProps ] } ); this.smallestDataInterval = processedData.reduced?.smallestKeyInterval; this.largestDataInterval = processedData.reduced?.largestKeyInterval; this.updateSeriesItemTypes(); this.animationState.transition("updateData"); } getSeriesDomain(direction) { const { processedData, dataModel } = this; if (!processedData || !dataModel) return { domain: [] }; const { keys: [keys], values } = processedData.domain; if (direction === this.getCategoryDirection()) { const keyDef = dataModel.resolveProcessedDataDefById(this, `xValue`); if (keyDef?.def.type === "key" && keyDef?.def.valueType === "category") { const sortMetadata = dataModel.getKeySortMetadata(this, "xValue", processedData); return { domain: keys, sortMetadata }; } const isDirectionY = direction === import_ag_charts_core152.ChartAxisDirection.Y; const isReversed = this.getCategoryAxis().isReversed(); return { domain: this.padBandExtent(keys, isReversed !== isDirectionY) }; } else { const yCurrIndex = dataModel.resolveProcessedDataIndexById(this, "yCurrent"); const yExtent = values[yCurrIndex]; const fixedYExtent = [Math.min(0, yExtent[0]), Math.max(0, yExtent[1])]; return { domain: fixNumericExtent6(fixedYExtent) }; } } getSeriesRange() { return [Number.NaN, Number.NaN]; } populateNodeData(ctx) { let trailingSubtotal = 0; const paramsScratch = { datumIndex: 0, datum: void 0, xDatum: void 0, value: void 0, cumulativeValue: void 0, trailingValue: void 0, datumType: void 0 }; for (const [datumIndex, datum] of ctx.rawData.entries()) { const datumType = ctx.totalTypeValues[datumIndex]; const isSubtotal = this.isSubtotal(datumType); const isTotal = this.isTotal(datumType); const isTotalOrSubtotal = isTotal || isSubtotal; const xDatum = ctx.xValues[datumIndex]; if (xDatum === void 0 && !this.properties.allowNullKeys) continue; const rawValue = ctx.yRawValues[datumIndex]; const { cumulativeValue, trailingValue } = this.computeWaterfallValues( ctx, datumIndex, isTotal, isSubtotal, trailingSubtotal ); if (isTotalOrSubtotal) { trailingSubtotal = cumulativeValue ?? 0; } const value = this.computeDisplayValue(isTotal, isSubtotal, rawValue, cumulativeValue, trailingValue); paramsScratch.datumIndex = datumIndex; paramsScratch.datum = datum; paramsScratch.xDatum = xDatum; paramsScratch.value = value; paramsScratch.cumulativeValue = cumulativeValue; paramsScratch.trailingValue = trailingValue; paramsScratch.datumType = datumType; const nodeDatum = upsertNodeDatum4( ctx, paramsScratch, (c, p) => this.createNodeDatum(c, p), (c, n, p) => this.updateNodeDatum(c, n, p) ); if (nodeDatum) { const pathPoint = this.createPointDatum( ctx, nodeDatum, cumulativeValue, trailingValue, isTotalOrSubtotal ); ctx.pointData.push(pathPoint); } } } finalizeNodeData(ctx) { if (ctx.nodeIndex < ctx.nodes.length) { ctx.nodes.length = ctx.nodeIndex; } } initializeResult(ctx) { return { itemId: this.properties.yKey, nodeData: ctx.nodes, labelData: ctx.nodes, pointData: [], scales: this.calculateScaling(), groupScale: this.getScaling(this.ctx.seriesStateManager.getGroupScale(this)), visible: this.visible, styles: getItemStylesPerItemId2(this.getItemStyle.bind(this), "total", "subtotal", "positive", "negative") }; } assembleResult(ctx, result) { const connectorLinesEnabled = this.properties.line.enabled; if (ctx.yCurrValues != null && connectorLinesEnabled) { result.pointData = ctx.pointData; } return result; } createNodeDatumContext(xAxis, yAxis) { const { dataModel, processedData } = this; if (!dataModel || !processedData || processedData.type !== "ungrouped") return void 0; const categoryAxis = this.getCategoryAxis(); const valueAxis = this.getValueAxis(); if (!categoryAxis || !valueAxis) return void 0; const xScale = xAxis.scale; const yScale = yAxis.scale; const xValues = dataModel.resolveKeysById(this, `xValue`, processedData); const yRawValues = dataModel.resolveColumnById(this, `yRaw`, processedData); const totalTypeValues = dataModel.resolveColumnById( this, `totalTypeValue`, processedData ); const yCurrValues = dataModel.resolveColumnById(this, "yCurrent", processedData); const yPrevValues = dataModel.resolveColumnById(this, "yPrevious", processedData); const yCurrTotalValues = dataModel.resolveColumnById(this, "yCurrentTotal", processedData); const rawData = processedData.dataSources.get(this.id)?.data ?? []; const { xKey, yKey, xName, yName, line } = this.properties; const { contextNodeData } = this; const animationEnabled = !this.ctx.animationManager.isSkipped(); const canIncrementallyUpdate = contextNodeData?.nodeData != null && processedData.changeDescription != null; const { barWidth } = this.getBarDimensions(); return { xAxis, yAxis, xScale, yScale, categoryAxis, valueAxis, barAlongX: this.getBarDirection() === import_ag_charts_core152.ChartAxisDirection.X, barWidth, categoryAxisReversed: categoryAxis.isReversed(), valueAxisReversed: valueAxis.isReversed(), crisp: checkCrisp2( categoryAxis.scale, categoryAxis.visibleRange, this.smallestDataInterval, this.largestDataInterval ), animationEnabled, xKey, yKey, xName, yName, lineStrokeWidth: line.strokeWidth, yDomain: this.getSeriesDomain(import_ag_charts_core152.ChartAxisDirection.Y).domain, xValues, rawData, yRawValues, totalTypeValues, yCurrValues, yPrevValues, yCurrTotalValues, canIncrementallyUpdate, nodes: canIncrementallyUpdate ? contextNodeData.nodeData : [], nodeIndex: 0, pointData: [] }; } computeWaterfallValues(ctx, datumIndex, isTotal, isSubtotal, trailingSubtotal) { if (isTotal || isSubtotal) { return { cumulativeValue: ctx.yCurrTotalValues[datumIndex], trailingValue: isSubtotal ? trailingSubtotal : 0 }; } return { cumulativeValue: ctx.yCurrValues[datumIndex], trailingValue: ctx.yPrevValues[datumIndex] }; } computeDisplayValue(isTotal, isSubtotal, rawValue, cumulativeValue, trailingValue) { if (isTotal) { return cumulativeValue; } if (isSubtotal) { return (cumulativeValue ?? 0) - (trailingValue ?? 0); } return rawValue; } /** * Creates a skeleton WaterfallNodeDatum with minimal required fields. * The node will be populated by updateNodeDatum. */ createSkeletonNodeDatum(ctx, params) { const { xKey, yKey, crisp } = ctx; const { datumIndex, datum, xDatum, value, cumulativeValue, datumType } = params; const isPositive = (value ?? 0) >= 0; const seriesItemType = this.getSeriesItemType(isPositive, datumType); return { index: datumIndex, series: this, itemType: seriesItemType, datum, datumIndex, cumulativeValue: cumulativeValue ?? 0, xValue: xDatum, yValue: value, yKey, xKey, x: 0, y: 0, width: 0, height: 0, midPoint: { x: 0, y: 0 }, crisp, label: { text: "", x: 0, y: 0, textAlign: "center", textBaseline: "middle" } }; } /** * Updates an existing WaterfallNodeDatum in-place. * This is more efficient than recreating the entire node when only data values change. */ updateNodeDatum(ctx, node, params) { const { xScale, yScale, barAlongX, barWidth, valueAxisReversed, xKey, yKey, xName, yName, yDomain, crisp } = ctx; const { datumIndex, datum, xDatum, value, cumulativeValue, trailingValue, datumType } = params; const mutableNode = node; const x = Math.round(xScale.convert(xDatum)); if (!Number.isFinite(x)) return; const isPositive = (value ?? 0) >= 0; const seriesItemType = this.getSeriesItemType(isPositive, datumType); const { strokeWidth, label } = this.getItemConfig(seriesItemType); const currY = Math.round(yScale.convert(cumulativeValue)); const trailY = Math.round(yScale.convert(trailingValue)); const y = isPositive ? currY : trailY; const bottomY = isPositive ? trailY : currY; const barHeight = Math.max(strokeWidth, Math.abs(bottomY - y)); const rectX = barAlongX ? Math.min(y, bottomY) : x; const rectY = barAlongX ? x : Math.min(y, bottomY); const rectWidth = barAlongX ? barHeight : barWidth; const rectHeight = barAlongX ? barWidth : barHeight; mutableNode.index = datumIndex; mutableNode.itemType = seriesItemType; mutableNode.datum = datum; mutableNode.datumIndex = datumIndex; mutableNode.cumulativeValue = cumulativeValue ?? 0; mutableNode.xValue = xDatum; mutableNode.yValue = value; mutableNode.x = rectX; mutableNode.y = rectY; mutableNode.width = rectWidth; mutableNode.height = rectHeight; mutableNode.crisp = crisp; if (mutableNode.midPoint) { mutableNode.midPoint.x = rectX + rectWidth / 2; mutableNode.midPoint.y = rectY + rectHeight / 2; } else { mutableNode.midPoint = { x: rectX + rectWidth / 2, y: rectY + rectHeight / 2 }; } if (label.enabled) { const itemType = seriesItemType === "subtotal" ? "total" : seriesItemType; const labelText = this.getLabelText( value, datum, yKey, "y", yDomain, label, { itemType, value, datum, xKey, yKey, xName, yName } ); const spacing = label.spacing + (typeof label.padding === "number" ? label.padding : 0); const labelPlacement = adjustLabelPlacement({ isUpward: (value ?? -1) >= 0 !== valueAxisReversed, isVertical: !barAlongX, placement: label.placement, spacing, rect: { x: rectX, y: rectY, width: rectWidth, height: rectHeight } }); mutableNode.label.text = labelText; mutableNode.label.x = labelPlacement.x; mutableNode.label.y = labelPlacement.y; mutableNode.label.textAlign = labelPlacement.textAlign; mutableNode.label.textBaseline = labelPlacement.textBaseline; } else { mutableNode.label.text = ""; } } /** * Creates a WaterfallNodeDatum for a single data point. * Creates a skeleton node and uses updateNodeDatum to populate it. */ createNodeDatum(ctx, params) { const node = this.createSkeletonNodeDatum(ctx, params); this.updateNodeDatum(ctx, node, params); return node; } createPointDatum(ctx, nodeDatum, cumulativeValue, trailingValue, isTotalOrSubtotal) { const { yScale, barAlongX, categoryAxisReversed, lineStrokeWidth } = ctx; const currY = Math.round(yScale.convert(cumulativeValue)); const trailY = Math.round(yScale.convert(trailingValue)); const pointY = isTotalOrSubtotal ? currY : trailY; const pixelAlignmentOffset = Math.floor(lineStrokeWidth) % 2 / 2; const startY = categoryAxisReversed ? currY : pointY; const stopY = categoryAxisReversed ? pointY : currY; const rect = { x: nodeDatum.x, y: nodeDatum.y, width: nodeDatum.width, height: nodeDatum.height }; let startCoordinates; let stopCoordinates; if (barAlongX) { startCoordinates = { x: startY + pixelAlignmentOffset, y: rect.y }; stopCoordinates = { x: stopY + pixelAlignmentOffset, y: rect.y + rect.height }; } else { startCoordinates = { x: rect.x, y: startY + pixelAlignmentOffset }; stopCoordinates = { x: rect.x + rect.width, y: stopY + pixelAlignmentOffset }; } return { // lineTo x: categoryAxisReversed ? stopCoordinates.x : startCoordinates.x, y: categoryAxisReversed ? stopCoordinates.y : startCoordinates.y, // moveTo x2: categoryAxisReversed ? startCoordinates.x : stopCoordinates.x, y2: categoryAxisReversed ? startCoordinates.y : stopCoordinates.y, size: 0 }; } updateSeriesItemTypes() { const { dataModel, seriesItemTypes, processedData } = this; if (!dataModel || !processedData) { return; } seriesItemTypes.clear(); const yPositiveIndex = dataModel.resolveProcessedDataIndexById(this, "yCurrentPositive"); const yNegativeIndex = dataModel.resolveProcessedDataIndexById(this, "yCurrentNegative"); const totalTypeIndex = dataModel.resolveProcessedDataIndexById(this, `totalTypeValue`); const positiveDomain = processedData.domain.values[yPositiveIndex] ?? []; const negativeDomain = processedData.domain.values[yNegativeIndex] ?? []; if (positiveDomain.length > 0) { seriesItemTypes.add("positive"); } if (negativeDomain.length > 0) { seriesItemTypes.add("negative"); } const itemTypes = processedData?.domain.values[totalTypeIndex]; if (!itemTypes) { return; } for (const type of itemTypes) { if (type === "total" || type === "subtotal") { seriesItemTypes.add("total"); } } } isSubtotal(datumType) { return datumType === "subtotal"; } isTotal(datumType) { return datumType === "total"; } nodeFactory() { return new Rect3(); } getSeriesItemType(isPositive, datumType) { return datumType ?? (isPositive ? "positive" : "negative"); } getItemConfig(seriesItemType) { switch (seriesItemType) { case "positive": { return this.properties.item.positive; } case "negative": { return this.properties.item.negative; } case "subtotal": case "total": { return this.properties.item.total; } } } updateDatumSelection(opts) { const { nodeData, datumSelection } = opts; const data = nodeData ?? []; if (!processedDataIsAnimatable5(this.processedData)) { return datumSelection.update(data); } return datumSelection.update(data, void 0, (datum) => createDatumId6(datum.datumIndex)); } getItemStyle(nodeDatum, isHighlight, highlightState, itemType = "total") { const { properties } = this; const { datumIndex = 0, datum } = nodeDatum ?? {}; const propertyItemId = itemType === "subtotal" ? "total" : itemType; const item = properties.item[propertyItemId]; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex, highlightState); const baseStyle = (0, import_ag_charts_core152.mergeDefaults)(highlightStyle, properties.getStyle(itemType)); const { itemStyler } = item; let style = baseStyle; if (itemStyler != null && nodeDatum != null) { const overrides = this.cachedDatumCallback( createDatumId6(datumIndex, isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(itemType, datumIndex, datum, isHighlight, style); return this.ctx.optionsGraphService.resolvePartial( ["series", `${this.declarationOrder}`, "item", propertyItemId], this.callWithContext(itemStyler, params) ); } ); if (overrides) { style = (0, import_ag_charts_core152.mergeDefaults)(overrides, style); } } return style; } makeItemStylerParams(itemType, datumIndex, datum, isHighlight, style) { const { id: seriesId, properties } = this; const { xKey, yKey } = properties; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightStateString = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, itemType, datum, xKey, yKey, highlightState: highlightStateString, ...style, fill }; } updateDatumStyles({ datumSelection, isHighlight }) { datumSelection.each((_, datum) => { datum.style = this.getItemStyle(datum, isHighlight, void 0, datum.itemType); }); } updateDatumNodes({ datumSelection, isHighlight }) { const { contextNodeData } = this; if (!contextNodeData) { return; } const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); const categoryAlongX = this.getCategoryDirection() === import_ag_charts_core152.ChartAxisDirection.X; const fillBBox = this.getShapeFillBBox(); datumSelection.each((rect, datum) => { const style = datum.style ?? contextNodeData.styles[datum.itemType][this.getHighlightState(highlightedDatum, isHighlight, datum.datumIndex)]; rect.setStyleProperties(style, fillBBox); rect.cornerRadius = style.cornerRadius ?? 0; rect.visible = categoryAlongX ? datum.width > 0 : datum.height > 0; rect.crisp = datum.crisp; }); } updateLabelSelection(opts) { const { labelData, labelSelection } = opts; if (labelData.length === 0) { return labelSelection.update([]); } const data = labelData.filter((labelDatum) => { const { label } = this.getItemConfig(labelDatum.itemType); return label.enabled; }); return labelSelection.update(data); } updateLabelNodes({ labelSelection, isHighlight }) { const params = { itemType: "positive", xKey: this.properties.xKey, xName: this.properties.xName ?? this.properties.xName, yKey: this.properties.yKey, yName: this.properties.yName ?? this.properties.yName }; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); labelSelection.each((textNode, datum) => { params.itemType = datum.itemType; const styleOpacity = this.getHighlightStyle(isHighlight, datum.datumIndex)?.opacity ?? 1; textNode.visible = true; textNode.fillOpacity = styleOpacity; const label = this.getItemConfig(datum.itemType).label; updateLabelNode4(this, textNode, params, label, datum.label, isHighlight, activeHighlight); }); } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, properties } = this; const { xKey, xName, yKey, yName, tooltip, legendItemName } = properties; const xAxis = this.getCategoryAxis(); const yAxis = this.getValueAxis(); if (!dataModel || !processedData || !xAxis || !yAxis) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const xValue = dataModel.resolveKeysById(this, `xValue`, processedData)[datumIndex]; const yValue = dataModel.resolveColumnById(this, `yRaw`, processedData)[datumIndex]; const yCurrTotalValues = dataModel.resolveColumnById(this, "yCurrentTotal", processedData); const totalTypeValues = dataModel.resolveColumnById( this, `totalTypeValue`, processedData ); const allowNullKeys = this.properties.allowNullKeys ?? false; if (xValue === void 0 && !allowNullKeys) return; const datumType = totalTypeValues[datumIndex]; const isPositive = (yValue ?? 0) >= 0; const seriesItemType = this.getSeriesItemType(isPositive, datumType); let total; if (this.isTotal(datumType)) { total = yCurrTotalValues[datumIndex]; } else if (this.isSubtotal(datumType)) { total = yCurrTotalValues[datumIndex]; for (let previousIndex = datumIndex - 1; previousIndex >= 0; previousIndex -= 1) { if (this.isSubtotal(totalTypeValues[previousIndex])) { total = total - yCurrTotalValues[previousIndex]; break; } } } else { total = yValue; } const nodeDatum = this.contextNodeData?.nodeData?.[datumIndex]; const format = this.getItemStyle(nodeDatum, false, void 0, nodeDatum?.itemType); return this.formatTooltipWithContext( tooltip, { heading: this.getAxisValueText(xAxis, "tooltip", xValue, datum, xKey, legendItemName), symbol: this.legendItemSymbol(seriesItemType), data: [ { label: yName, fallbackLabel: yKey, value: this.getAxisValueText(yAxis, "tooltip", total, datum, yKey, legendItemName), missing: import_ag_charts_community132._ModuleSupport.isTooltipValueMissing(total) } ] }, { seriesId, datum, title: yName, itemType: seriesItemType, xKey, xName, yKey, yName, ...format } ); } legendItemSymbol(item) { const { fill, stroke: stroke3, fillOpacity, strokeOpacity, strokeWidth, lineDash, lineDashOffset } = this.getItemConfig(item); return { marker: { fill, stroke: stroke3, fillOpacity, strokeOpacity, strokeWidth, lineDash, lineDashOffset } }; } getLegendData(legendType) { if (legendType !== "category") { return []; } const { id, seriesItemTypes } = this; const legendData = []; const capitalise = (text2) => text2.charAt(0).toUpperCase() + text2.substring(1); const { showInLegend } = this.properties; for (const item of seriesItemTypes) { const { name } = this.getItemConfig(item); legendData.push({ legendType: "category", id, itemId: createDatumId6(item), seriesId: id, enabled: true, label: { text: name ?? capitalise(item) }, symbol: this.legendItemSymbol(item), hideInLegend: !showInLegend, isFixed: true }); } return legendData; } toggleSeriesItem() { } resetDatumAnimation(data) { resetBarSelectionsDirect2([data.datumSelection]); } animateEmptyUpdateReady(opts) { const { datumSelection, labelSelection, contextData } = opts; const fns = prepareBarAnimationFunctions2( collapsedStartingBarPosition(this.isVertical(), this.axes, "normal"), "unknown" ); motion3.fromToMotion(this.id, "datums", this.ctx.animationManager, [datumSelection], fns); seriesLabelFadeInAnimation3(this, "labels", this.ctx.animationManager, labelSelection); const { pointData } = contextData; if (!pointData) return; if (this.isVertical()) { this.animateConnectorLinesVertical(opts); } else { this.animateConnectorLinesHorizontal(opts); } } animateConnectorLinesHorizontal(opts) { const { pointData = [] } = opts.contextData; const [lineNode] = opts.paths; const { path: linePath } = lineNode; this.updateLineNode(lineNode); const valueAxis = this.getValueAxis(); const valueAxisReversed = valueAxis?.isReversed(); const compare = valueAxisReversed ? (v, v2) => v < v2 : (v, v2) => v > v2; const startX = valueAxis?.scale.convert(0); const endX = pointData.reduce( (end, point) => { if (compare(point.x, end)) { end = point.x; } return end; }, valueAxisReversed ? Infinity : 0 ); const scale = (value, start1, end1, start2, end2) => { return (value - start1) / (end1 - start1) * (end2 - start2) + start2; }; this.ctx.animationManager.animate({ id: `${this.id}_connectors`, groupId: this.id, phase: "initial", from: startX, to: endX, ease: import_ag_charts_core152.easeOut, collapsable: false, onUpdate(pointX) { linePath.clear(true); for (const [index, point] of pointData.entries()) { const x = scale(pointX, startX, endX, startX, point.x); const x2 = scale(pointX, startX, endX, startX, point.x2); if (index !== 0) { linePath.lineTo(x, point.y); } linePath.moveTo(x2, point.y2); } lineNode.checkPathDirty(); }, onStop: () => this.resetConnectorLinesPath(opts) }); } animateConnectorLinesVertical(opts) { const { pointData = [] } = opts.contextData; const [lineNode] = opts.paths; const { path: linePath } = lineNode; this.updateLineNode(lineNode); const valueAxis = this.getValueAxis(); const valueAxisReversed = valueAxis?.isReversed(); const compare = valueAxisReversed ? (v, v2) => v > v2 : (v, v2) => v < v2; const startY = valueAxis?.scale.convert(0); const endY = pointData.reduce( (end, point) => { if (compare(point.y, end)) { end = point.y; } return end; }, valueAxisReversed ? 0 : Infinity ); const scale = (value, start1, end1, start2, end2) => { return (value - start1) / (end1 - start1) * (end2 - start2) + start2; }; this.ctx.animationManager.animate({ id: `${this.id}_connectors`, groupId: this.id, phase: "initial", from: startY, to: endY, ease: import_ag_charts_core152.easeOut, collapsable: false, onUpdate(pointY) { linePath.clear(true); for (const [index, point] of pointData.entries()) { const y = scale(pointY, startY, endY, startY, point.y); const y2 = scale(pointY, startY, endY, startY, point.y2); if (index !== 0) { linePath.lineTo(point.x, y); } linePath.moveTo(point.x2, y2); } lineNode.checkPathDirty(); }, onStop: () => this.resetConnectorLinesPath(opts) }); } animateReadyResize(data) { super.animateReadyResize(data); this.resetConnectorLinesPath(data); } updatePaths(opts) { this.resetConnectorLinesPath({ contextData: opts.contextData, paths: opts.paths }); } resetConnectorLinesPath({ contextData, paths }) { if (paths.length === 0) { return; } const [lineNode] = paths; this.updateLineNode(lineNode); const { path: linePath } = lineNode; linePath.clear(true); const { pointData } = contextData; if (!pointData) { return; } for (const [index, point] of pointData.entries()) { if (index !== 0) { linePath.lineTo(point.x, point.y); } linePath.moveTo(point.x2, point.y2); } lineNode.checkPathDirty(); } updateLineNode(lineNode) { const { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this.properties.line; lineNode.setProperties({ fill: void 0, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, lineJoin: "round", pointerEvents: import_ag_charts_community132._ModuleSupport.PointerEvents.None }); } isLabelEnabled() { const { positive, negative, total } = this.properties.item; return positive.label.enabled || negative.label.enabled || total.label.enabled; } computeFocusBounds({ datumIndex }) { return computeBarFocusBounds5(this, this.contextNodeData?.nodeData[datumIndex]); } hasItemStylers() { const { positive, negative, total } = this.properties.item; return positive.itemStyler != null || positive.label.itemStyler != null || negative.itemStyler != null || negative.label.itemStyler != null || total.itemStyler != null || total.label.itemStyler != null; } }; WaterfallSeries.className = "WaterfallSeries"; WaterfallSeries.type = "waterfall"; // packages/ag-charts-enterprise/src/series/waterfall/waterfallSeriesOptionsDef.ts var import_ag_charts_community133 = require("ag-charts-community"); var import_ag_charts_core153 = require("ag-charts-core"); var { waterfallSeriesThemeableOptionsDef } = import_ag_charts_community133._ModuleSupport; var waterfallSeriesOptionsDef = { ...waterfallSeriesThemeableOptionsDef, ...import_ag_charts_core153.commonSeriesOptionsDefs, type: (0, import_ag_charts_core153.required)((0, import_ag_charts_core153.constant)("waterfall")), xKey: (0, import_ag_charts_core153.required)(import_ag_charts_core153.string), yKey: (0, import_ag_charts_core153.required)(import_ag_charts_core153.string), xKeyAxis: import_ag_charts_core153.string, yKeyAxis: import_ag_charts_core153.string, xName: import_ag_charts_core153.string, yName: import_ag_charts_core153.string, totals: (0, import_ag_charts_core153.arrayOfDefs)( { totalType: (0, import_ag_charts_core153.required)((0, import_ag_charts_core153.union)("total", "subtotal")), index: (0, import_ag_charts_core153.required)(import_ag_charts_core153.positiveNumber), axisLabel: (0, import_ag_charts_core153.required)(import_ag_charts_core153.string) }, "a total definition options array" ), width: import_ag_charts_core153.positiveNumberNonZero }; // packages/ag-charts-enterprise/src/series/waterfall/waterfallThemes.ts var import_ag_charts_community134 = require("ag-charts-community"); var import_ag_charts_core154 = require("ag-charts-core"); function itemTheme2(key, index) { return { fill: { $applySwitch: [ { $path: "type" }, { $if: [ { $eq: [{ $palette: "type" }, "user-indexed"] }, { $path: [`/${index}`, { $palette: "fill" }, { $palette: "fills" }] }, { $palette: `${key}.fill` } ] }, ["gradient", (0, import_ag_charts_core154.FILL_GRADIENT_LINEAR_KEYED_DEFAULTS)(key)], ["image", import_ag_charts_core154.FILL_IMAGE_DEFAULTS], ["pattern", (0, import_ag_charts_core154.FILL_PATTERN_KEYED_DEFAULTS)(key)] ] }, stroke: { $palette: `${key}.stroke` }, strokeWidth: { $isUserOption: ["./stroke", 2, 0] }, label: { ...import_ag_charts_core154.LABEL_BOXING_DEFAULTS, enabled: false, fontStyle: void 0, fontWeight: { $ref: "fontWeight" }, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, color: { $ref: "textColor" }, formatter: void 0, placement: "outside-end", padding: { $isUserOption: ["./spacing", 0, 6] } // compatibility with old `padding` property (now named `spacing`). } }; } var WATERFALL_SERIES_THEME = { series: { item: { positive: itemTheme2("altUp", 0), negative: itemTheme2("altDown", 1), total: itemTheme2("neutral", 2) }, line: { stroke: { $palette: "neutral.stroke" }, strokeOpacity: 1, lineDash: [0], lineDashOffset: 0, strokeWidth: 2 }, highlight: import_ag_charts_core154.SINGLE_SERIES_HIGHLIGHT_STYLE }, legend: { enabled: true, toggleSeries: false } }; // packages/ag-charts-enterprise/src/series/waterfall/waterfallModule.ts var WaterfallSeriesModule = { type: "series", name: "waterfall", chartType: "cartesian", enterprise: true, solo: true, version: import_ag_charts_community135.VERSION, dependencies: [import_ag_charts_community135.CartesianChartModule], options: waterfallSeriesOptionsDef, defaultAxes: import_ag_charts_core155.DIRECTION_SWAP_AXES, axisKeys: { [import_ag_charts_core155.ChartAxisDirection.X]: "xKeyAxis", [import_ag_charts_core155.ChartAxisDirection.Y]: "yKeyAxis" }, axisKeysFlipped: { [import_ag_charts_core155.ChartAxisDirection.X]: "yKeyAxis", [import_ag_charts_core155.ChartAxisDirection.Y]: "xKeyAxis" }, themeTemplate: WATERFALL_SERIES_THEME, create: (ctx) => new WaterfallSeries(ctx) }; // packages/ag-charts-enterprise/src/features/navigator/navigatorOptionsDefs.ts var navigatorHandleOptionsDef = { width: import_ag_charts_core156.positiveNumber, height: import_ag_charts_core156.positiveNumber, grip: import_ag_charts_core156.boolean, fill: import_ag_charts_core156.color, stroke: import_ag_charts_core156.color, strokeWidth: import_ag_charts_core156.positiveNumber, cornerRadius: import_ag_charts_core156.positiveNumber }; var commonIgnoredMiniChartProperties = [ "cursor", "highlightStyle", "listeners", "nodeClickRange", "showInLegend", "showInMiniChart", "tooltip", "visible", "xName", "yName" ]; var barIgnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "errorBar", "label", "legendItemName" ]; var boxPlotIngnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "direction", "legendItemName", "minName", "q1Name", "medianName", "q3Name", "maxName" ]; var bubbleIgnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "title", "label", "labelKey", "labelName", "sizeName" ]; var heatmapIgnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "title", "label", "colorName", "textAlign", "verticalAlign", "itemPadding", "colorRange" ]; var histogramIgnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "label" ]; var lineIgnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "errorBar", "title", "label" ]; var rangeAreaIgnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "label", "yLowName", "yHighName" ]; var rangeBarIgnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "direction", "label", "yLowName", "yHighName" ]; var scatterIgnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "errorBar", "title", "label", "labelKey", "labelName" ]; var waterfallIgnoredMiniChartProperties = [ ...commonIgnoredMiniChartProperties, "direction" ]; var navigatorOptionsDef = { enabled: import_ag_charts_core156.boolean, height: import_ag_charts_core156.positiveNumber, spacing: import_ag_charts_core156.positiveNumber, cornerRadius: import_ag_charts_core156.number, mask: { fill: import_ag_charts_core156.color, fillOpacity: import_ag_charts_core156.ratio, stroke: import_ag_charts_core156.color, strokeWidth: import_ag_charts_core156.positiveNumber }, minHandle: navigatorHandleOptionsDef, maxHandle: navigatorHandleOptionsDef, miniChart: { enabled: import_ag_charts_core156.boolean, padding: { top: import_ag_charts_core156.positiveNumber, bottom: import_ag_charts_core156.positiveNumber }, label: { enabled: import_ag_charts_core156.boolean, avoidCollisions: import_ag_charts_core156.boolean, spacing: import_ag_charts_core156.positiveNumber, format: import_ag_charts_core156.numberFormatValidator, formatter: (0, import_ag_charts_core156.callbackOf)(import_ag_charts_core156.textOrSegments), interval: { minSpacing: import_ag_charts_core156.positiveNumber, maxSpacing: import_ag_charts_core156.positiveNumber, values: import_ag_charts_core156.array, step: import_ag_charts_core156.number }, ...import_ag_charts_core156.fontOptionsDef }, series: (0, import_ag_charts_core156.arrayOfDefs)( (0, import_ag_charts_core156.typeUnion)( { area: (0, import_ag_charts_core156.without)(import_ag_charts_community136.AreaSeriesModule.options, [...commonIgnoredMiniChartProperties, "type"]), bar: (0, import_ag_charts_core156.without)(import_ag_charts_community136.BarSeriesModule.options, [...barIgnoredMiniChartProperties, "type"]), "box-plot": (0, import_ag_charts_core156.without)(BoxPlotSeriesModule.options, [...boxPlotIngnoredMiniChartProperties, "type"]), bubble: (0, import_ag_charts_core156.without)(import_ag_charts_community136.BubbleSeriesModule.options, [...bubbleIgnoredMiniChartProperties, "type"]), candlestick: (0, import_ag_charts_core156.without)(CandlestickSeriesModule.options, [ ...commonIgnoredMiniChartProperties, "type" ]), heatmap: (0, import_ag_charts_core156.without)(HeatmapSeriesModule.options, [...heatmapIgnoredMiniChartProperties, "type"]), histogram: (0, import_ag_charts_core156.without)(import_ag_charts_community136.HistogramSeriesModule.options, [...histogramIgnoredMiniChartProperties, "type"]), line: (0, import_ag_charts_core156.without)(import_ag_charts_community136.LineSeriesModule.options, [...lineIgnoredMiniChartProperties, "type"]), ohlc: (0, import_ag_charts_core156.without)(OhlcSeriesModule.options, [...commonIgnoredMiniChartProperties, "type"]), "range-area": (0, import_ag_charts_core156.without)(RangeAreaSeriesModule.options, [ ...rangeAreaIgnoredMiniChartProperties, "type" ]), "range-bar": (0, import_ag_charts_core156.without)(RangeBarSeriesModule.options, [...rangeBarIgnoredMiniChartProperties, "type"]), scatter: (0, import_ag_charts_core156.without)(import_ag_charts_community136.ScatterSeriesModule.options, [...scatterIgnoredMiniChartProperties, "type"]), waterfall: (0, import_ag_charts_core156.without)(WaterfallSeriesModule.options, [...waterfallIgnoredMiniChartProperties, "type"]) }, "miniChart series options" ) ) } }; // packages/ag-charts-enterprise/src/features/navigator/navigatorTheme.ts var import_ag_charts_community137 = require("ag-charts-community"); var import_ag_charts_core157 = require("ag-charts-core"); var validMiniChartSeriesTypes = [ "area", "bar", "bubble", "candlestick", "heatmap", "histogram", "line", "ohlc", "range-area", "range-bar", "scatter", "waterfall" ]; var priceVolumePresetIgnoredMiniChartProperties = [ "itemStyler", "simpleItemStyler", "direction", "fill", "fillGradientDefaults", "fillPatternDefaults", "fillImageDefaults", "fillOpacity", "shadow", "focusPriority", "highlight", "lineDash", "lineDashOffset", "strokeWidth" ]; function miniChartSeriesTheme(seriesPath, typePath) { return { $merge: [ { $switch: [ typePath, {}, [ ["area", "line", "range-area"], { marker: { enabled: { $isUserOption: [ "/series/$index/marker/enabled", { $path: ["/series/$index/marker/enabled", false] }, false ] } } } ] ] }, { $omit: [ { $switch: [ typePath, commonIgnoredMiniChartProperties, ["bar", barIgnoredMiniChartProperties], ["box-plot", boxPlotIngnoredMiniChartProperties], ["bubble", bubbleIgnoredMiniChartProperties], ["heatmap", heatmapIgnoredMiniChartProperties], ["histogram", histogramIgnoredMiniChartProperties], [ "line", [...lineIgnoredMiniChartProperties, ...priceVolumePresetIgnoredMiniChartProperties] ], ["range-area", rangeAreaIgnoredMiniChartProperties], ["range-bar", rangeBarIgnoredMiniChartProperties], ["scatter", scatterIgnoredMiniChartProperties], ["waterfall", waterfallIgnoredMiniChartProperties] ] }, seriesPath ] } ] }; } var NAVIGATOR_THEME = { enabled: false, height: { $if: [{ $path: "./miniChart/enabled" }, 40, 18] }, cornerRadius: 4, mask: { fill: { $ref: "foregroundColor" }, fillOpacity: 0.1, stroke: { $ref: "borderColor" }, strokeWidth: 1 }, minHandle: { fill: { $ref: "chartBackgroundColor" }, stroke: { $ref: "borderColor" }, strokeWidth: 1, width: 12, height: 24, cornerRadius: 4 }, maxHandle: { fill: { $ref: "chartBackgroundColor" }, stroke: { $ref: "borderColor" }, strokeWidth: 1, width: 12, height: 24, cornerRadius: 4 }, miniChart: { enabled: false, label: { color: { $ref: "textColor" }, fontSize: { $rem: import_ag_charts_core157.FONT_SIZE_RATIO.SMALLER }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, spacing: 5 }, padding: { top: 0, bottom: 0 }, series: { $apply: [ miniChartSeriesTheme( { $path: "/series/$index" }, { $path: [ "/navigator/miniChart/series/$index/type", { $path: ["type", { $path: "/series/$index/type" }] } ] } ), { // TODO: this should be a $switch but switches can not resolve the case value yet $if: [ { $or: validMiniChartSeriesTypes.map((type) => ({ $eq: [{ $path: "/series/0/type" }, type] })) }, { $map: [ miniChartSeriesTheme({ $value: "$1" }, { $path: "/series/$index/type" }), { $path: "/series" } ] }, void 0 ] } ] } } }; // packages/ag-charts-enterprise/src/features/navigator/navigatorModule.ts var NavigatorModule = { type: "plugin", name: "navigator", chartType: "cartesian", enterprise: true, version: import_ag_charts_community138.VERSION, // removable: false, // Toggling this module causes zoom state flakiness. options: navigatorOptionsDef, themeTemplate: NAVIGATOR_THEME, create: (ctx) => new Navigator(ctx) }; // packages/ag-charts-enterprise/src/features/scrollbar/scrollbarModule.ts var import_ag_charts_community141 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/features/scrollbar/scrollbar.ts var import_ag_charts_community140 = require("ag-charts-community"); var import_ag_charts_core160 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/scrollbar/scrollbarDOMProxy.ts var import_ag_charts_community139 = require("ag-charts-community"); var import_ag_charts_core158 = require("ag-charts-core"); var { SliderWidget: SliderWidget2 } = import_ag_charts_community139._ModuleSupport; var STEP_REPEAT_DELAY_MS = 400; var STEP_REPEAT_INTERVAL_MS = 50; var StepRepeater = class { constructor(applyStep) { this.applyStep = applyStep; } start(target) { this.setTarget(target); this.run(STEP_REPEAT_DELAY_MS); } updateTarget(target) { this.setTarget(target); if (!this.isActive()) { this.run(STEP_REPEAT_DELAY_MS); } } stop(resetTarget = true) { this.clearTimer(); if (resetTarget) { this.target = void 0; } } setTarget(target) { this.target = (0, import_ag_charts_core158.clamp)(0, target, 1); } run(delay) { if (this.target == null) { this.stop(); return; } const finished = this.applyStep(this.target); if (finished) { this.stop(); return; } this.schedule(delay); } schedule(delay) { if (this.isActive()) return; this.timer = setTimeout(() => { this.timer = void 0; this.run(STEP_REPEAT_INTERVAL_MS); }, delay); } clearTimer() { if (this.timer != null) { clearTimeout(this.timer); this.timer = void 0; } } isActive() { return this.timer != null; } }; var ScrollbarState = class { constructor() { this.min = 0; this.span = 1; this.thumbSpan = 1; } update(min, max, thumbSpan = this.thumbSpan) { const span = (0, import_ag_charts_core158.clamp)(0, max - min, 1); this.span = span; this.thumbSpan = (0, import_ag_charts_core158.clamp)(0, thumbSpan, 1); this.min = this.clampMin(min, span); } clampMin(min, span = this.span) { return (0, import_ag_charts_core158.clamp)(0, min, 1 - span); } getThumbBounds(min = this.min, span = this.thumbSpan) { const start = this.clampMin(min, span); return { start, end: start + span }; } isWithinThumb(ratio8) { const { start, end } = this.getThumbBounds(); return ratio8 >= start && ratio8 <= end; } getJumpRange(ratio8) { if (!this.canScroll()) return; let min = this.clampMin(ratio8 - this.thumbSpan / 2, this.thumbSpan); min = this.clampMin(min); return { min, max: min + this.span }; } getStepRange(ratio8) { if (!this.canScroll()) return; const cursor = (0, import_ag_charts_core158.clamp)(0, ratio8, 1); const { start, end } = this.getThumbBounds(); if (cursor >= start && cursor <= end) return; const movingLeft = cursor < start; const distance = movingLeft ? start - cursor : cursor - end; const step = Math.min(this.span, distance); const nextMin = this.clampMin(this.min + (movingLeft ? -step : step)); return { min: nextMin, max: nextMin + this.span }; } canScroll() { return this.span > 0 && this.span < 1; } }; var ScrollbarDOMProxy = class { constructor(ctx, orientation, onChange, onHoverChange) { this.ctx = ctx; this.orientation = orientation; this.onChange = onChange; this.onHoverChange = onHoverChange; this.dragStartRatio = 0; this.interactionMode = "none"; this.state = new ScrollbarState(); this.repeater = new StepRepeater((target) => this.applyStepToward(target)); this.container = ctx.proxyInteractionService.createProxyContainer({ type: "group", domManagerId: `scrollbar-${orientation}`, classList: ["ag-charts-proxy-scrollbar", `ag-charts-proxy-scrollbar-${orientation}`], ariaLabel: void 0, role: "presentation" }); const ariaLabelId = orientation === "horizontal" ? "ariaLabelScrollbarHorizontal" : "ariaLabelScrollbarVertical"; this.slider = ctx.proxyInteractionService.createProxyElement({ type: "slider", domIndex: 0, tabIndex: 0, ariaLabel: { id: ariaLabelId }, role: "slider", parent: this.container, classList: ["ag-charts-proxy-scrollbar-slider"] }); const element = this.slider.getElement(); element.ariaValueMin = "0"; element.ariaValueMax = "100"; this.slider.step = SliderWidget2.STEP_HUNDRETH; this.slider.keyboardStep = SliderWidget2.STEP_ONE; this.slider.orientation = orientation; this.slider.setPreventsDefault(false); this.slider.addListener("change", () => this.onSliderChange()); this.slider.addListener("keydown", (ev) => this.onSliderKeyDown(ev)); this.slider.addListener("drag-start", (ev) => this.onDragStart(ev)); this.slider.addListener("drag-move", (ev) => this.onDragMove(ev)); this.slider.addListener("drag-end", (ev) => this.onDragEnd(ev)); this.slider.addListener("mouseenter", (event) => this.handleHoverEvent(event)); this.slider.addListener("mousemove", (event) => this.handleHoverEvent(event)); this.slider.addListener("mouseleave", () => this.onMouseLeave()); this.thumbFocus = ctx.proxyInteractionService.createProxyElement({ type: "region", parent: this.container, classList: ["ag-charts-proxy-scrollbar-thumb-focus"], role: "presentation" }); this.thumbFocus.setAriaHidden(true); this.thumbFocus.setPointerEvents("none"); } destroy() { this.interactionBounds = void 0; this.repeater.stop(); this.container.destroy(); } updateBounds(bounds) { this.interactionBounds = void 0; this.container.setBounds(bounds); this.slider.setBounds({ x: 0, y: 0, width: bounds.width, height: bounds.height }); } updateVisibility(visible) { this.container.setHidden(!visible); } updateMinMax(min, max, thumbSpan = this.state.thumbSpan, options) { this.state.update(min, max, thumbSpan); const aria = this.ctx.localeManager.t("ariaValuePanRange", { min: Math.round(min * 100) / 100, max: Math.round(max * 100) / 100 }); const element = this.slider.getElement(); element.ariaValueText = aria; const shouldUpdateSlider = !options?.skipSliderUpdate || Math.abs(this.slider.getValueRatio() - min) > 1e-9; if (shouldUpdateSlider) { this.slider.setValueRatio(min, { ariaValueText: aria }); } } updateThumbBounds(thumb, track, cornerRadius) { const radius = Math.max(0, cornerRadius ?? 0); this.thumbFocus.getElement().style.borderRadius = `${radius}px`; this.thumbFocus.setBounds({ x: thumb.x - track.x, y: thumb.y - track.y, width: thumb.width, height: thumb.height }); } update(min, max, options) { this.onChange(min, max); this.updateMinMax(min, max, void 0, options); } onSliderChange() { const min = this.state.clampMin(this.slider.getValueRatio()); const max = min + this.state.span; this.update(min, max, { skipSliderUpdate: true }); } onSliderKeyDown(event) { const { code } = event.sourceEvent; const isVertical = this.orientation === "vertical"; const decrement = isVertical && code === "ArrowUp" || !isVertical && code === "ArrowLeft"; const increment = isVertical && code === "ArrowDown" || !isVertical && code === "ArrowRight"; if (!decrement && !increment) return; event.sourceEvent.preventDefault(); const element = this.slider.getElement(); element.step = this.slider.keyboardStep?.attributeValue ?? "1"; if (decrement) { element.stepDown(); } else if (increment) { element.stepUp(); } this.onSliderChange(); } onDragMove(event) { event.sourceEvent.preventDefault(); if (this.interactionMode === "drag") { const { isHorizontal: isHorizontal2, size, start } = this.getInteractionBounds() ?? {}; if (start == null || size == null) return; const delta3 = (isHorizontal2 ? event.originDeltaX : event.originDeltaY) / size; const min = this.state.clampMin(this.dragStartRatio + delta3); const max = min + this.state.span; this.update(min, max); return; } if (this.interactionMode !== "step") return; const pointer = this.getPointerInfo(event); if (pointer == null || !Number.isFinite(pointer.ratio)) return; const { ratio: ratio8, inCrossBounds } = pointer; if (!inCrossBounds) { this.repeater.stop(); return; } this.repeater.updateTarget(ratio8); } onDragEnd(event) { event.sourceEvent.preventDefault(); this.interactionBounds = void 0; this.setInteraction("none"); this.onHoverChange(false); } onDragStart(event) { event.sourceEvent.preventDefault(); this.interactionBounds = void 0; const click = this.getClickInfo(event); if (!click?.inBounds) return; if (click.inThumb) { this.dragStartRatio = this.slider.getValueRatio(); this.setInteraction("drag"); return; } if (event.sourceEvent.shiftKey) { this.jumpTo(click.ratio); this.setInteraction("none"); return; } this.beginStepRepeat(click.ratio); } onMouseLeave() { this.onHoverChange(false); } getClickInfo(event) { const ratio8 = this.getPointerRatio(event); if (ratio8 == null) return; const inBounds = ratio8 >= 0 && ratio8 <= 1; if (!inBounds) return { ratio: 0, inBounds: false, inThumb: false }; return { ratio: ratio8, inBounds: true, inThumb: this.isWithinThumb(ratio8) }; } getPointerRatio(event) { return this.getPointerInfo(event)?.ratio; } getPointerInfo(event) { if (event.device === "keyboard") return; const { isHorizontal: isHorizontal2, size, start, crossStart, crossSize } = this.getInteractionBounds(); const pos = isHorizontal2 ? event.clientX : event.clientY; const crossPos = isHorizontal2 ? event.clientY : event.clientX; const ratio8 = (pos - start) / size; const inCrossBounds = crossPos >= crossStart && crossPos <= crossStart + crossSize; return { ratio: ratio8, inCrossBounds }; } jumpTo(ratio8) { const next = this.state.getJumpRange(ratio8); if (!next) return; this.update(next.min, next.max); } applyStepToward(target) { const next = this.state.getStepRange(target); if (!next) return true; this.update(next.min, next.max); return false; } beginStepRepeat(ratio8) { this.setInteraction("step"); this.repeater.start(ratio8); } setInteraction(mode) { this.interactionMode = mode; if (mode !== "step") { this.repeater.stop(); } } getInteractionBounds() { if (this.interactionBounds) { return this.interactionBounds; } const { width, height, left, top } = this.container.getBoundingClientRect(); const isHorizontal2 = this.orientation === "horizontal"; const size = isHorizontal2 ? width : height; const start = isHorizontal2 ? left : top; const crossStart = isHorizontal2 ? top : left; const crossSize = isHorizontal2 ? height : width; this.interactionBounds = { isHorizontal: isHorizontal2, size, start, crossStart, crossSize }; return this.interactionBounds; } isWithinThumb(ratio8) { return this.state.isWithinThumb(ratio8); } handleHoverEvent(event) { if (this.interactionMode === "drag") return; const pointer = this.getPointerInfo(event); if (!pointer) { this.onHoverChange(false); return; } const hovered = this.isWithinThumb(pointer.ratio); this.onHoverChange(hovered); } }; // packages/ag-charts-enterprise/src/features/scrollbar/scrollbarProperties.ts var import_ag_charts_core159 = require("ag-charts-core"); var ScrollbarTrack = class extends import_ag_charts_core159.ChangeDetectableProperties { constructor() { super(...arguments); this.enabled = false; this.fillOpacity = 1; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.cornerRadius = 0; this.opacity = 1; } }; __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarTrack.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarTrack.prototype, "fill", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarTrack.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarTrack.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarTrack.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarTrack.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core159.Property ], ScrollbarTrack.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core159.Property ], ScrollbarTrack.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core159.Property ], ScrollbarTrack.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core159.Property ], ScrollbarTrack.prototype, "opacity", 2); var ScrollbarThumbHoverStyle = class extends import_ag_charts_core159.ChangeDetectableProperties { }; __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarThumbHoverStyle.prototype, "fill", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarThumbHoverStyle.prototype, "stroke", 2); var ScrollbarThumb = class extends ScrollbarTrack { constructor() { super(...arguments); this.minSize = 20; this.hoverStyle = new ScrollbarThumbHoverStyle(); } }; __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarThumb.prototype, "minSize", 2); __decorateClass([ import_ag_charts_core159.Property ], ScrollbarThumb.prototype, "hoverStyle", 2); var ScrollbarProperties = class extends import_ag_charts_core159.ChangeDetectableProperties { constructor() { super(...arguments); this.enabled = false; this.thickness = 12; this.spacing = 4; this.tickSpacing = 0; this.placement = "outer"; this.visible = "auto"; this.track = new ScrollbarTrack(); this.thumb = new ScrollbarThumb(); } }; __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarProperties.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarProperties.prototype, "thickness", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarProperties.prototype, "tickSpacing", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarProperties.prototype, "placement", 2); __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], ScrollbarProperties.prototype, "visible", 2); __decorateClass([ import_ag_charts_core159.Property ], ScrollbarProperties.prototype, "track", 2); __decorateClass([ import_ag_charts_core159.Property ], ScrollbarProperties.prototype, "thumb", 2); var HorizontalScrollbarProperties = class extends ScrollbarProperties { }; __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], HorizontalScrollbarProperties.prototype, "position", 2); var VerticalScrollbarProperties = class extends ScrollbarProperties { }; __decorateClass([ import_ag_charts_core159.Property, (0, import_ag_charts_core159.SceneChangeDetection)() ], VerticalScrollbarProperties.prototype, "position", 2); // packages/ag-charts-enterprise/src/features/scrollbar/scrollbar.ts var { BBox: BBox14, Group: Group7, Rect: Rect4, LayoutElement: LayoutElement3, InteractionState: InteractionState5 } = import_ag_charts_community140._ModuleSupport; var Scrollbar = class extends import_ag_charts_core160.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.track = new ScrollbarTrack(); this.thumb = new ScrollbarThumb(); this.horizontal = new HorizontalScrollbarProperties(); this.vertical = new VerticalScrollbarProperties(); this.state = { horizontal: this.createOrientationState("horizontal"), vertical: this.createOrientationState("vertical") }; this.cleanup.register( ctx.scene.attachNode(this.state.horizontal.group), ctx.scene.attachNode(this.state.vertical.group), ctx.layoutManager.registerElement(LayoutElement3.Scrollbar, (e) => this.onLayoutStart(e)), ctx.eventsHub.on("layout:complete", (e) => this.onLayoutComplete(e)), ctx.eventsHub.on("zoom:change-complete", () => this.updateThumbs()) ); } createOrientationState(orientation) { const group = new Group7({ name: `scrollbar-${orientation}`, zIndex: import_ag_charts_core160.ZIndexMap.NAVIGATOR }); const track = new Rect4(); const thumb = new Rect4(); group.append(track); group.append(thumb); const dom = new ScrollbarDOMProxy( this.ctx, orientation, (min, max) => this.handleUserChange(orientation, min, max), (hovered) => this.handleHoverChange(orientation, hovered) ); const properties = this.resolveProperties(orientation); return { orientation, group, track, thumb, dom, properties, position: this.getDefaultPosition(orientation), positionHasAxis: false, hovered: false }; } resolveProperties(orientation) { return orientation === "horizontal" ? this.horizontal : this.vertical; } getDefaultPosition(orientation) { return orientation === "horizontal" ? "bottom" : "left"; } resolveAxis(orientation, configuredPosition) { const direction = orientation === "horizontal" ? import_ag_charts_core160.ChartAxisDirection.X : import_ag_charts_core160.ChartAxisDirection.Y; const contexts = this.ctx.axisManager.getAxisContext(direction); if (contexts.length === 0) { return { position: this.getDefaultPosition(orientation), positionHasAxis: false }; } if (configuredPosition == null) { const axis2 = contexts[0]; return { axis: axis2, position: axis2.position ?? this.getDefaultPosition(orientation), positionHasAxis: true }; } const axis = contexts.find((ctx) => ctx.position === configuredPosition); if (axis) { return { axis, position: configuredPosition, positionHasAxis: true }; } return { axis: contexts[0], position: configuredPosition, positionHasAxis: false }; } onLayoutStart({ scrollbars, layoutBox }) { for (const orientation of ["horizontal", "vertical"]) { const state = this.state[orientation]; const properties = this.resolveProperties(orientation); const { min, max } = this.getZoomRange(state.orientation); const span = (0, import_ag_charts_core160.clamp)(0, max - min, 1); const { axis: { axisId } = {}, position, positionHasAxis } = this.resolveAxis(orientation, properties.position); state.properties = properties; state.axisId = axisId; state.position = position; state.positionHasAxis = positionHasAxis; const show = this.updateVisibility(state, span); if (!show || axisId == null) continue; const { thickness, spacing, placement, tickSpacing } = properties; if (positionHasAxis) { scrollbars[axisId] = { enabled: show, thickness, spacing, tickSpacing, placement }; } else { layoutBox.shrink(spacing + thickness, position); } this.updateStyles(state); } } onLayoutComplete(event) { this.seriesRect = event.series.rect; for (const orientation of ["horizontal", "vertical"]) { const state = this.state[orientation]; const { properties: { enabled, visible } } = state; if (!enabled || visible === "never") { continue; } const layoutRect = this.getLayoutRect(state, orientation, event); state.layoutRect = layoutRect; if (!layoutRect) continue; this.updateTrack(state, layoutRect); this.updateThumb(state, layoutRect); } } getLayoutRect(state, orientation, event) { const { properties: { thickness, spacing }, position, positionHasAxis } = state; const axisLayout = state.axisId ? event.axes[state.axisId] : void 0; if (!axisLayout) return; const { x, y, width, height } = event.series.rect; const isHorizontal2 = orientation === "horizontal"; if (!positionHasAxis) { if (isHorizontal2) { const coord2 = position === "bottom" ? y + height + spacing : y - spacing - thickness; return new BBox14(x, coord2, width, thickness); } else { const coord2 = position === "right" ? x + width + spacing : x - spacing - thickness; return new BBox14(coord2, y, thickness, height); } } const { scrollbar: scrollbarLayout, translation } = axisLayout; if (!scrollbarLayout?.enabled) return; const coord = isHorizontal2 ? translation.y + scrollbarLayout.offset : translation.x + scrollbarLayout.offset; return isHorizontal2 ? new BBox14(x, coord, width, thickness) : new BBox14(coord, y, thickness, height); } updateStyles({ track, thumb, properties, hovered }) { track.setStyleProperties(properties.track); track.cornerRadius = properties.track.cornerRadius ?? 0; track.opacity = properties.track.opacity ?? 1; thumb.setStyleProperties(properties.thumb); thumb.cornerRadius = properties.thumb.cornerRadius ?? 0; thumb.opacity = properties.thumb.opacity ?? 1; const hoverStyle = properties.thumb.hoverStyle; thumb.fill = hovered ? hoverStyle?.fill ?? properties.thumb.fill : properties.thumb.fill; thumb.stroke = hovered ? hoverStyle?.stroke ?? properties.thumb.stroke : properties.thumb.stroke; } updateTrack(state, bounds) { state.track.x = bounds.x; state.track.y = bounds.y; state.track.width = bounds.width; state.track.height = bounds.height; state.dom.updateBounds(bounds); } updateThumb(state, track) { const { min, max } = this.getZoomRange(state.orientation); const span = (0, import_ag_charts_core160.clamp)(0, max - min, 1); const show = this.updateVisibility(state, span); if (!show || track.width <= 0 || track.height <= 0) { return; } const minSize = state.properties.thumb.minSize ?? 0; let thumbSpan; if (state.orientation === "horizontal") { const thumbWidth = Math.min(Math.max(minSize, track.width * span), track.width); const start = (0, import_ag_charts_core160.clamp)(track.x, track.x + track.width * min, track.x + track.width - thumbWidth); state.thumb.x = start; state.thumb.y = track.y; state.thumb.width = thumbWidth; state.thumb.height = track.height; thumbSpan = (0, import_ag_charts_core160.clamp)(0, thumbWidth / track.width, 1); } else { const thumbHeight = Math.min(Math.max(minSize, track.height * span), track.height); const start = (0, import_ag_charts_core160.clamp)(track.y, track.y + track.height * min, track.y + track.height - thumbHeight); state.thumb.x = track.x; state.thumb.y = start; state.thumb.width = track.width; state.thumb.height = thumbHeight; thumbSpan = (0, import_ag_charts_core160.clamp)(0, thumbHeight / track.height, 1); } state.dom.updateThumbBounds(state.thumb, track, state.properties.thumb.cornerRadius); state.dom.updateMinMax(min, max, thumbSpan); } updateThumbs() { if (!this.seriesRect) return; for (const orientation of ["horizontal", "vertical"]) { const state = this.state[orientation]; const layoutRect = state.layoutRect; if (!layoutRect || !state.properties.enabled || state.properties.visible === "never") continue; const trackBounds = orientation === "horizontal" ? new BBox14(this.seriesRect.x, layoutRect.y, this.seriesRect.width, state.properties.thickness) : new BBox14(layoutRect.x, this.seriesRect.y, state.properties.thickness, this.seriesRect.height); this.updateThumb(state, trackBounds); } } updateVisibility(state, span) { const show = state.properties.enabled && state.axisId != null && state.properties.visible !== "never" && (state.properties.visible === "always" || span < 1); state.group.visible = show; state.track.visible = show; state.thumb.visible = show; state.dom.updateVisibility(show); return show; } getZoomRange(orientation) { const zoom = this.ctx.zoomManager.getZoom(); const isHorizontal2 = orientation === "horizontal"; const range2 = isHorizontal2 ? zoom?.x : zoom?.y; if (!isHorizontal2 && range2 != null) { return { min: 1 - (range2.max ?? 1), max: 1 - (range2.min ?? 0) }; } return { min: range2?.min ?? 0, max: range2?.max ?? 1 }; } handleUserChange(orientation, min, max) { if (!this.ctx.interactionManager.isState(InteractionState5.ZoomDraggable)) return; const isHorizontal2 = orientation === "horizontal"; if (!isHorizontal2) { [min, max] = [1 - max, 1 - min]; } const zoom = isHorizontal2 ? { x: { min, max } } : { y: { min, max } }; this.ctx.zoomManager.updateZoom( { source: "user-interaction", sourceDetail: "scrollbar" }, zoom ); } handleHoverChange(orientation, hovered) { const state = this.state[orientation]; const nextHovered = hovered && state.group.visible; if (state.hovered === nextHovered) return; state.hovered = nextHovered; this.updateStyles(state); this.ctx.updateService.update(import_ag_charts_core160.ChartUpdateType.SCENE_RENDER); } destroy() { super.destroy(); this.state.horizontal.dom.destroy(); this.state.vertical.dom.destroy(); } }; __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "thickness", 2); __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "tickSpacing", 2); __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "placement", 2); __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "visible", 2); __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "track", 2); __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "thumb", 2); __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "horizontal", 2); __decorateClass([ import_ag_charts_core160.Property ], Scrollbar.prototype, "vertical", 2); // packages/ag-charts-enterprise/src/features/scrollbar/scrollbarOptionsDefs.ts var import_ag_charts_core161 = require("ag-charts-core"); var scrollbarTrackOptionsDef = { ...import_ag_charts_core161.fillOptionsDef, ...import_ag_charts_core161.strokeOptionsDef, ...import_ag_charts_core161.lineDashOptionsDef, cornerRadius: import_ag_charts_core161.positiveNumber, opacity: import_ag_charts_core161.ratio }; var scrollbarThumbOptionsDef = { ...scrollbarTrackOptionsDef, minSize: import_ag_charts_core161.positiveNumber, hoverStyle: { fill: import_ag_charts_core161.fillOptionsDef.fill, stroke: import_ag_charts_core161.strokeOptionsDef.stroke } }; var scrollbarBaseOptionsDef = { enabled: import_ag_charts_core161.boolean, thickness: import_ag_charts_core161.positiveNumber, spacing: import_ag_charts_core161.positiveNumber, tickSpacing: import_ag_charts_core161.positiveNumber, visible: (0, import_ag_charts_core161.union)("auto", "always", "never"), placement: (0, import_ag_charts_core161.union)("outer", "inner"), track: scrollbarTrackOptionsDef, thumb: scrollbarThumbOptionsDef }; var scrollbarHorizontalOrientationOptionsDef = { ...scrollbarBaseOptionsDef, position: (0, import_ag_charts_core161.union)("top", "bottom") }; var scrollbarVerticalOrientationOptionsDef = { ...scrollbarBaseOptionsDef, position: (0, import_ag_charts_core161.union)("left", "right") }; var scrollbarOptionsDef = { enabled: import_ag_charts_core161.boolean, thickness: import_ag_charts_core161.positiveNumber, spacing: import_ag_charts_core161.positiveNumber, tickSpacing: import_ag_charts_core161.positiveNumber, visible: (0, import_ag_charts_core161.union)("auto", "always", "never"), placement: (0, import_ag_charts_core161.union)("outer", "inner"), track: scrollbarTrackOptionsDef, thumb: scrollbarThumbOptionsDef, horizontal: scrollbarHorizontalOrientationOptionsDef, vertical: scrollbarVerticalOrientationOptionsDef }; // packages/ag-charts-enterprise/src/features/scrollbar/scrollbarTheme.ts var SCROLLBAR_ORIENTATION_THEME = { enabled: { $path: "../enabled" }, thickness: { $path: "../thickness" }, spacing: { $path: "../spacing" }, tickSpacing: { $path: "../tickSpacing" }, placement: { $path: "../placement" }, visible: { $path: "../visible" }, track: { fill: { $path: "../../track/fill" }, stroke: { $path: "../../track/stroke" }, fillOpacity: { $path: "../../track/fillOpacity" }, strokeWidth: { $path: "../../track/strokeWidth" }, lineDash: { $path: "../../track/lineDash" }, lineDashOffset: { $path: "../../track/lineDashOffset" }, opacity: { $path: "../../track/opacity" }, cornerRadius: { $path: "../../track/cornerRadius" } }, thumb: { fill: { $path: "../../thumb/fill" }, stroke: { $path: "../../thumb/stroke" }, fillOpacity: { $path: "../../thumb/fillOpacity" }, strokeWidth: { $path: "../../thumb/strokeWidth" }, lineDash: { $path: "../../thumb/lineDash" }, lineDashOffset: { $path: "../../thumb/lineDashOffset" }, opacity: { $path: "../../thumb/opacity" }, cornerRadius: { $path: "../../thumb/cornerRadius" }, minSize: { $path: "../../thumb/minSize" }, hoverStyle: { fill: { $path: "../../../thumb/hoverStyle/fill" }, stroke: { $path: "../../../thumb/hoverStyle/stroke" } } } }; var SCROLLBAR_THEME = { enabled: false, thickness: 12, spacing: 16, tickSpacing: 0, placement: "outer", visible: "auto", track: { fill: { $foregroundBackgroundMix: 0.03 }, stroke: { $foregroundBackgroundMix: 0.177 }, strokeWidth: 1, lineDash: [0], lineDashOffset: 0, opacity: 1, cornerRadius: 6 }, thumb: { fill: { $foregroundBackgroundMix: 0.125 }, stroke: { $foregroundBackgroundMix: 0.364 }, strokeWidth: 1, lineDash: [0], lineDashOffset: 0, opacity: 1, cornerRadius: 6, minSize: 20, hoverStyle: { fill: { $mix: [{ $path: "../fill" }, { $ref: "foregroundColor" }, 0.075] }, stroke: { $mix: [{ $path: "../stroke" }, { $ref: "foregroundColor" }, 0.075] } } }, vertical: SCROLLBAR_ORIENTATION_THEME, horizontal: SCROLLBAR_ORIENTATION_THEME }; // packages/ag-charts-enterprise/src/features/scrollbar/scrollbarModule.ts var ScrollbarModule = { type: "plugin", name: "scrollbar", chartType: "cartesian", enterprise: true, version: import_ag_charts_community141.VERSION, options: scrollbarOptionsDef, themeTemplate: SCROLLBAR_THEME, create: (ctx) => new Scrollbar(ctx) }; // packages/ag-charts-enterprise/src/features/ranges/rangesModule.ts var import_ag_charts_community143 = require("ag-charts-community"); var import_ag_charts_core164 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/ranges/ranges.ts var import_ag_charts_community142 = require("ag-charts-community"); var import_ag_charts_core163 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/ranges/rangesButtonProperties.ts var import_ag_charts_core162 = require("ag-charts-core"); var RangesButtonProperties = class extends ToolbarButtonProperties { }; __decorateClass([ import_ag_charts_core162.Property ], RangesButtonProperties.prototype, "value", 2); // packages/ag-charts-enterprise/src/features/ranges/ranges.ts var { userInteraction, LayoutElement: LayoutElement4, Toolbar } = import_ag_charts_community142._ModuleSupport; var Ranges = class extends import_ag_charts_core163.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.enabled = false; this.buttons = new import_ag_charts_core163.PropertiesArray(RangesButtonProperties); this.verticalSpacing = 10; this.container = ctx.domManager.addChild("canvas-overlay", "range-buttons"); this.container.role = "presentation"; this.toolbar = new Toolbar(this.ctx, "ariaLabelRangesToolbar", "horizontal"); this.toolbar.addClass("ag-charts-range-buttons"); this.container.append(this.toolbar.getElement()); this.cleanup.register( this.toolbar.addToolbarListener("button-pressed", this.onButtonPress.bind(this)), ctx.layoutManager.registerElement(LayoutElement4.ToolbarBottom, this.onLayoutStart.bind(this)), ctx.eventsHub.on("zoom:change-complete", this.onZoomChanged.bind(this)), this.teardown.bind(this) ); } teardown() { this.toolbar.getElement().remove(); this.toolbar.destroy(); } onLayoutStart({ layoutBox }) { const { buttons, ctx, enabled, toolbar: toolbar2, verticalSpacing } = this; if (!enabled || !ctx.zoomManager.isZoomEnabled()) { toolbar2.setHidden(true); return; } toolbar2.setHidden(false); toolbar2.updateButtons(buttons); const height = toolbar2.getBounds().height; toolbar2.setBounds({ x: layoutBox.x, y: layoutBox.y + layoutBox.height - height, width: layoutBox.width, height }); layoutBox.shrink({ bottom: height + verticalSpacing }); } onZoomChanged() { this.toolbar.clearActiveButton(); } onButtonPress({ button: { index } }) { const { zoomManager } = this.ctx; const button = this.buttons.at(index); if (!button) return; const { value } = button; const sourcing = userInteraction(`zoom-range-button-${index}`); if (value == null) { zoomManager.resetZoom(sourcing); } else if (typeof value === "number") { zoomManager.extendToEnd(sourcing, import_ag_charts_core163.ChartAxisDirection.X, value); } else if (Array.isArray(value)) { zoomManager.updateWith(sourcing, import_ag_charts_core163.ChartAxisDirection.X, () => value); } else if (typeof value === "function") { zoomManager.updateWith(sourcing, import_ag_charts_core163.ChartAxisDirection.X, value); } this.toolbar.toggleActiveButtonByIndex(index); } }; __decorateClass([ import_ag_charts_core163.Property ], Ranges.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core163.Property ], Ranges.prototype, "buttons", 2); // packages/ag-charts-enterprise/src/features/ranges/rangesModule.ts var DAY = 1e3 * 60 * 60 * 24; var MONTH = DAY * 30; var YEAR = DAY * 365; var RangesModule = { type: "plugin", name: "ranges", chartType: "cartesian", enterprise: true, version: import_ag_charts_community143.VERSION, options: { enabled: import_ag_charts_core164.boolean, buttons: (0, import_ag_charts_core164.arrayOfDefs)( { ...import_ag_charts_core164.toolbarButtonOptionsDefs, value: (0, import_ag_charts_core164.or)(import_ag_charts_core164.number, (0, import_ag_charts_core164.and)((0, import_ag_charts_core164.arrayOf)((0, import_ag_charts_core164.or)(import_ag_charts_core164.number, import_ag_charts_core164.date)), (0, import_ag_charts_core164.arrayLength)(2, 2)), import_ag_charts_core164.callback) }, "range button options array" ) }, themeTemplate: { enabled: false, buttons: { $shallowSimple: [ { label: "toolbarRange1Month", ariaLabel: "toolbarRange1MonthAria", value: MONTH }, { label: "toolbarRange3Months", ariaLabel: "toolbarRange3MonthsAria", value: 3 * MONTH }, { label: "toolbarRange6Months", ariaLabel: "toolbarRange6MonthsAria", value: 6 * MONTH }, { label: "toolbarRangeYearToDate", ariaLabel: "toolbarRangeYearToDateAria", value: (_start, end) => [ (/* @__PURE__ */ new Date(`${new Date(end).getFullYear()}-01-01`)).getTime(), void 0 ] }, { label: "toolbarRange1Year", ariaLabel: "toolbarRange1YearAria", value: YEAR }, { label: "toolbarRangeAll", ariaLabel: "toolbarRangeAllAria", value: void 0 // Reset zoom } ] } }, create: (ctx) => new Ranges(ctx) }; // packages/ag-charts-enterprise/src/features/status-bar/statusBarModule.ts var import_ag_charts_community145 = require("ag-charts-community"); var import_ag_charts_core166 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/status-bar/statusBar.ts var import_ag_charts_community144 = require("ag-charts-community"); var import_ag_charts_core165 = require("ag-charts-core"); var { LayoutElement: LayoutElement5, Group: Group8, Label: Label5, Rect: Rect5, Text } = import_ag_charts_community144._ModuleSupport; var chartConfigurations = { ohlc: 2 /* Open */ | 4 /* Close */ | 8 /* Low */ | 16 /* High */ | 32 /* Volume */, candlestick: 2 /* Open */ | 4 /* Close */ | 8 /* Low */ | 16 /* High */ | 32 /* Volume */, "hollow-candlestick": 2 /* Open */ | 4 /* Close */ | 8 /* Low */ | 16 /* High */ | 32 /* Volume */, line: 64 /* UnlabelledClose */ | 32 /* Volume */, "step-line": 64 /* UnlabelledClose */ | 32 /* Volume */, hlc: 128 /* NeutralClose */ | 8 /* Low */ | 16 /* High */ | 32 /* Volume */, "high-low": 512 /* NeutralLow */ | 256 /* NeutralHigh */ | 32 /* Volume */ }; var itemIdMap = { up: "positive", down: "negative" }; var neutralColorMap = { hlc: "altNeutral" }; var StatusBarBackground = class extends import_ag_charts_core165.BaseProperties { constructor() { super(...arguments); this.fill = "black"; this.fillOpacity = 1; } }; __decorateClass([ import_ag_charts_core165.Property ], StatusBarBackground.prototype, "fill", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBarBackground.prototype, "fillOpacity", 2); var StatusBar = class extends import_ag_charts_core165.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.enabled = false; this.openKey = void 0; this.highKey = void 0; this.lowKey = void 0; this.closeKey = void 0; this.volumeKey = void 0; this.title = new Label5(); this.positive = new Label5(); this.negative = new Label5(); this.neutral = new Label5(); this.altNeutral = new Label5(); this.background = new StatusBarBackground(); this.layoutStyle = "block"; this.id = "status-bar"; this.layer = new Group8({ name: "StatusBar", zIndex: import_ag_charts_core165.ZIndexMap.STATUS_BAR }); this.labelGroup = this.layer.appendChild(new import_ag_charts_community144._ModuleSupport.TranslatableGroup()); this.backgroundNode = this.labelGroup.appendChild(new Rect5()); this.labels = [ { label: "O", configuration: 2 /* Open */, title: this.labelGroup.appendChild(new Text()), value: this.labelGroup.appendChild(new Text()), id: "openValue", key: "openKey", domain: void 0, formatter: new Intl.NumberFormat("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }, { label: "H", configuration: 16 /* High */, title: this.labelGroup.appendChild(new Text()), value: this.labelGroup.appendChild(new Text()), id: "highValue", key: "highKey", domain: void 0, formatter: new Intl.NumberFormat("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }, { label: "H", configuration: 256 /* NeutralHigh */, title: this.labelGroup.appendChild(new Text()), value: this.labelGroup.appendChild(new Text()), style: "neutral", id: "highValue", key: "highKey", domain: void 0, formatter: new Intl.NumberFormat("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }, { label: "L", configuration: 8 /* Low */, title: this.labelGroup.appendChild(new Text()), value: this.labelGroup.appendChild(new Text()), id: "lowValue", key: "lowKey", domain: void 0, formatter: new Intl.NumberFormat("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }, { label: "L", configuration: 512 /* NeutralLow */, title: this.labelGroup.appendChild(new Text()), value: this.labelGroup.appendChild(new Text()), style: "neutral", id: "lowValue", key: "lowKey", domain: void 0, formatter: new Intl.NumberFormat("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }, { label: "C", configuration: 4 /* Close */, title: this.labelGroup.appendChild(new Text()), value: this.labelGroup.appendChild(new Text()), id: "closeValue", key: "closeKey", domain: void 0, formatter: new Intl.NumberFormat("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }, { label: "C", configuration: 128 /* NeutralClose */, title: this.labelGroup.appendChild(new Text()), value: this.labelGroup.appendChild(new Text()), id: "closeValue", key: "closeKey", style: "neutral", domain: void 0, formatter: new Intl.NumberFormat("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }) }, { label: "", configuration: 64 /* UnlabelledClose */, title: this.labelGroup.appendChild(new Text()), value: this.labelGroup.appendChild(new Text()), style: "neutral", id: "closeValue", key: "closeKey", domain: void 0, formatter: new Intl.NumberFormat("en-US", { notation: "compact", minimumFractionDigits: 2, maximumFractionDigits: 2 }) }, { label: "Vol", configuration: 32 /* Volume */, title: this.labelGroup.appendChild(new Text()), value: this.labelGroup.appendChild(new Text()), id: "volumeValue", key: "volumeKey", domain: void 0, formatter: new Intl.NumberFormat("en-US", { notation: "compact", minimumFractionDigits: 2, maximumFractionDigits: 2 }) } ]; this.highlightManager = ctx.highlightManager; this.labelGroup.visible = false; this.cleanup.register( ctx.scene.attachNode(this.layer), ctx.layoutManager.registerElement(LayoutElement5.Overlay, (e) => this.startPerformLayout(e)), ctx.eventsHub.on("layout:complete", (e) => this.onLayoutComplete(e)), ctx.eventsHub.on("highlight:change", () => this.updateHighlight()), ctx.eventsHub.on("data:update", (data) => { this.chartData = data; }) ); } updateDomainsFromSeries() { if (!this.enabled) return; const series = this.ctx.chartService.series; if (series.length === 0) return; let priceDomain; let volumeDomain; for (const s of series) { const domainResult = s.getDomain(import_ag_charts_core165.ChartAxisDirection.Y); const yDomain = domainResult?.domain; if (!Array.isArray(yDomain) || yDomain.length < 2) continue; if (s.type === "bar") { volumeDomain = [yDomain[0], yDomain.at(-1)]; } else { priceDomain = [yDomain[0], yDomain.at(-1)]; } } for (const label of this.labels) { const key = this[label.key]; if (key == null) { label.domain = void 0; continue; } label.domain = label.key === "volumeKey" ? volumeDomain : priceDomain; } } startPerformLayout({ layoutBox }) { this.labelGroup.translationX = 0; this.labelGroup.translationY = 0; if (!this.enabled) { this.labelGroup.visible = false; return; } this.updateDomainsFromSeries(); const innerSpacing = 4; const outerSpacing = 12; const spacingAbove = 0; const spacingBelow = 8; this.labelGroup.translationY = layoutBox.y + spacingAbove; const maxFontSize = Math.max(this.title.fontSize, this.positive.fontSize, this.negative.fontSize); const lineHeight = (0, import_ag_charts_core165.calcLineHeight)(maxFontSize); const labelConfigurations = chartConfigurations[this.getChartType()] ?? 0; let left = 0; let offsetTop; let textVAlign = "alphabetic"; if (this.layoutStyle === "block") { layoutBox.shrink(spacingAbove + lineHeight + spacingBelow, "top"); offsetTop = maxFontSize + (lineHeight - maxFontSize) / 2; } else { const { title } = this.ctx.chartService; textVAlign = "top"; offsetTop = spacingAbove + title.padding; if (title.enabled) { const titleBox = title.node.getBBox(); left = titleBox.x + titleBox.width + outerSpacing; } else { left = title.padding; } } for (const { label, configuration, title, value, domain, formatter } of this.labels) { if (domain == null || (labelConfigurations & configuration) === 0) { title.visible = false; value.visible = false; continue; } const positiveTextMeasurer = (0, import_ag_charts_core165.cachedTextMeasurer)(this.positive); const negativeTextMeasurer = (0, import_ag_charts_core165.cachedTextMeasurer)(this.negative); const maxValueWidth = Math.max( positiveTextMeasurer.textWidth(formatter.format(domain[0])), positiveTextMeasurer.textWidth(formatter.format(domain[1])), negativeTextMeasurer.textWidth(formatter.format(domain[0])), negativeTextMeasurer.textWidth(formatter.format(domain[1])) ); title.visible = true; value.visible = true; const titleMetrics = (0, import_ag_charts_core165.cachedTextMeasurer)(this.title).measureLines(label); title.setFont(this.title); title.fill = this.title.color; title.text = label; title.textBaseline = textVAlign; title.y = offsetTop; title.x = left; left += titleMetrics.width + innerSpacing; value.textBaseline = textVAlign; value.y = offsetTop; value.x = left; left += maxValueWidth + outerSpacing; } this.backgroundNode.x = 0; this.backgroundNode.y = 0; this.backgroundNode.width = left - outerSpacing; this.backgroundNode.height = lineHeight + spacingAbove + spacingBelow; this.backgroundNode.fill = this.background.fill; this.backgroundNode.fillOpacity = this.background.fillOpacity; } onLayoutComplete(opts) { this.labelGroup.translationX = opts.series.rect.x; this.updateHighlight(); } updateHighlight() { if (!this.enabled) return; const activeHighlight = this.highlightManager.getActiveHighlight(); const datum = activeHighlight?.datum ?? this.chartData?.data?.at(-1); if (datum == null) { this.labelGroup.visible = false; return; } this.labelGroup.visible = true; const itemId = activeHighlight?.itemId; let baseStyle = itemId == null ? void 0 : itemIdMap[itemId]; if (baseStyle == null && this.openKey != null && this.closeKey != null) { if (datum[this.openKey] < datum[this.closeKey]) { baseStyle = "positive"; } else { baseStyle = "negative"; } } for (const { domain, value, key, formatter, style } of this.labels) { if (domain == null) continue; let labelStyle = style ?? baseStyle ?? "neutral"; if (labelStyle === "neutral") { labelStyle = neutralColorMap[this.getChartType()] ?? labelStyle; } const datumKey = this[key]; const datumValue = datumKey == null ? void 0 : datum?.[datumKey]; value.setFont(this[labelStyle]); value.fill = this[labelStyle].color; value.text = typeof datumValue === "number" ? formatter.format(datumValue) : ""; } } getChartType() { let chartType = this.ctx.chartService.publicApi?.getOptions()?.chartType; if (chartType == null || chartConfigurations[chartType] == null) { chartType = "candlestick"; } return chartType; } }; __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "openKey", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "highKey", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "lowKey", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "closeKey", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "volumeKey", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "title", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "positive", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "negative", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "neutral", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "altNeutral", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "background", 2); __decorateClass([ import_ag_charts_core165.Property ], StatusBar.prototype, "layoutStyle", 2); // packages/ag-charts-enterprise/src/features/status-bar/statusBarModule.ts var StatusBarModule = { type: "plugin", name: "statusBar", chartType: "cartesian", enterprise: true, version: import_ag_charts_community145.VERSION, themeTemplate: { enabled: false, layoutStyle: import_ag_charts_core166.DEFAULT_CAPTION_LAYOUT_STYLE, title: { color: { $ref: "textColor" }, fontFamily: { $ref: "fontFamily" }, fontSize: { $ref: "fontSize" }, fontWeight: { $ref: "fontWeight" } }, positive: { color: { $palette: "up.stroke" }, fontFamily: { $ref: "fontFamily" }, fontSize: { $ref: "fontSize" }, fontWeight: { $ref: "fontWeight" } }, negative: { color: { $palette: "down.stroke" }, fontFamily: { $ref: "fontFamily" }, fontSize: { $ref: "fontSize" }, fontWeight: { $ref: "fontWeight" } }, neutral: { color: { $palette: "neutral.stroke" }, fontFamily: { $ref: "fontFamily" }, fontSize: { $ref: "fontSize" }, fontWeight: { $ref: "fontWeight" } }, background: { fill: { $ref: "chartBackgroundColor" }, fillOpacity: 0.5 }, altNeutral: { color: "gray", fontFamily: { $ref: "fontFamily" }, fontSize: { $ref: "fontSize" }, fontWeight: { $ref: "fontWeight" } } }, create: (ctx) => new StatusBar(ctx) }; // packages/ag-charts-enterprise/src/features/sync/syncModule.ts var import_ag_charts_community147 = require("ag-charts-community"); var import_ag_charts_core168 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/sync/chartSync.ts var import_ag_charts_community146 = require("ag-charts-community"); var import_ag_charts_core167 = require("ag-charts-core"); var { CartesianAxis, ContinuousScale: ContinuousScale4, TimeScale, UnitTimeScale, TooltipManager } = import_ag_charts_community146._ModuleSupport; var debug = import_ag_charts_core167.Debug.create("sync"); function getDirectionKeys(series, primary, secondary) { const primaryKeys = series.getKeys(primary); const secondaryKeys = series.getKeys(secondary); if (series.shouldFlipXY?.()) { return [secondaryKeys, primaryKeys]; } return [primaryKeys, secondaryKeys]; } function syncedDirections(axes = "x") { switch (axes) { case "x": return [import_ag_charts_core167.ChartAxisDirection.X]; case "y": return [import_ag_charts_core167.ChartAxisDirection.Y]; case "xy": return [import_ag_charts_core167.ChartAxisDirection.X, import_ag_charts_core167.ChartAxisDirection.Y]; } } function domainChanged(scale, a, b) { if (TimeScale.is(scale) || UnitTimeScale.is(scale)) { return !(0, import_ag_charts_core167.arraysEqual)( a.map((x) => x?.valueOf()), b.map((x) => x?.valueOf()) ); } else { return !(0, import_ag_charts_core167.arraysEqual)(a, b); } } var ChartSync = class extends import_ag_charts_core167.BaseProperties { constructor(moduleContext) { super(); this.moduleContext = moduleContext; this.enabled = false; this.axes = "x"; this.nodeInteraction = true; this.zoom = true; this.domainMode = "id"; this.domainSync = new import_ag_charts_core167.AsyncAwaitQueue(); } updateSiblings(groupId) { const { syncManager } = this.moduleContext; for (const chart of syncManager.getGroupSiblings(groupId ?? this.groupId)) { debug("ChartSync.updateSiblings()", chart.id, chart); this.updateChart(chart); } } updateChart(chart, updateType = import_ag_charts_core167.ChartUpdateType.PROCESS_DOMAIN) { debug("ChartSync.updateChart()", chart.id, import_ag_charts_core167.ChartUpdateType[updateType], chart); if (updateType === import_ag_charts_core167.ChartUpdateType.PROCESS_DOMAIN) { chart.ctx.updateService.update(updateType, { forceNodeDataRefresh: true }); } else { chart.ctx.updateService.update(updateType); } } enabledZoomSync() { const { eventsHub } = this.moduleContext; this.disableZoomSync?.(); this.disableZoomSync = eventsHub.on("zoom:change-complete", (e) => this.onZoom(e)); } onZoom(e) { const { syncManager } = this.moduleContext; for (const chart of syncManager.getGroupSiblings(this.groupId)) { const syncModule = chart.modulesManager.getModule("sync"); if (!syncModule?.zoom) continue; const zoomModule = chart.modulesManager.getModule("zoom"); if (!zoomModule) continue; const zoom = this.prepareZoomUpdate(); if (e.source !== "sync") { debug("ChartsSyncManager.enabledZoomSync()", chart.id, zoom); zoomModule.updateSyncZoom(zoom); } } } enabledNodeInteractionSync() { this.disableNodeInteractionSync?.(); const offHighlightChange = this.moduleContext.eventsHub.on( "highlight:change", this.onHighlightChange.bind(this) ); const offActiveChangeListener = this.moduleContext.eventsHub.on( "active:load-memento", this.onActiveLoadMemento.bind(this) ); this.disableNodeInteractionSync = () => { offHighlightChange(); offActiveChangeListener(); }; } onHighlightChange(event) { const { syncManager } = this.moduleContext; if (event.callerId.endsWith("-sync")) return; debug("ChartSync.onHighlightChange()", event); const series = event.currentHighlight?.series; const [mainDirection] = syncedDirections(this.axes); const secondaryDirection = mainDirection === import_ag_charts_core167.ChartAxisDirection.X ? import_ag_charts_core167.ChartAxisDirection.Y : import_ag_charts_core167.ChartAxisDirection.X; const [primaryKeys, secondaryKeys] = series ? getDirectionKeys(series, mainDirection, secondaryDirection) : []; const datum = readDatum(event.currentHighlight); let eventValue = primaryKeys?.[0] ? datum?.[primaryKeys[0]] : void 0; let valueIsDate = false; if ((0, import_ag_charts_core167.isDate)(eventValue)) { valueIsDate = true; eventValue = eventValue.getTime(); } if (!event.currentHighlight?.datum) { for (const chart of syncManager.getGroupSiblings(this.groupId)) { const syncModule = chart.modulesManager.getModule("sync"); if (!syncModule?.nodeInteraction) continue; chart.ctx.highlightManager.updateHighlight(`${chart.id}-sync`, void 0, true); chart.ctx.tooltipManager.removeTooltip(`${chart.id}-sync`, void 0, true); } return; } const useSecondaryDirectionKey = syncManager.getGroupSyncMode(this.groupId) === "multi-series"; this.findMatchingHighlightNodes( mainDirection, secondaryDirection, useSecondaryDirectionKey ? secondaryKeys : [], valueIsDate, eventValue, event ); } onActiveLoadMemento(event) { const { activeItem, chartId } = event; if (activeItem === void 0) { this.moduleContext.highlightManager.updateHighlight(`${chartId}-sync`, void 0, false); this.moduleContext.tooltipManager.removeTooltip(`${chartId}-sync`, void 0, false); for (const chart of this.moduleContext.syncManager.getGroupSiblings(this.groupId)) { chart.onSyncActiveClear(); } } } findMatchingHighlightNodes(primaryDirection, secondaryDirection, secondaryKeys, valueIsDate, eventValue, event) { const { syncManager } = this.moduleContext; debug("ChartSync.findMatchingHighlightNodes()", { mainDirection: primaryDirection, secondaryKeys }); for (const chart of syncManager.getGroupSiblings(this.groupId)) { const syncModule = chart.modulesManager.getModule("sync"); if (!syncModule?.nodeInteraction) continue; let dispatched = false; for (const axis of chart.axes) { if (!CartesianAxis.is(axis) || axis.direction !== primaryDirection) continue; const matchingNodes = chart.series.filter((s) => { if (!s.visible) return false; if (secondaryKeys.length > 0) { const [, seriesKeys] = getDirectionKeys(s, primaryDirection, secondaryDirection); return secondaryKeys.every((key) => seriesKeys.includes(key)); } return true; }).map(this.findMatchingNodes(axis, primaryDirection, valueIsDate, eventValue)).filter(import_ag_charts_core167.isDefined); if (matchingNodes.length === 1 && matchingNodes[0]?.nodeDatum !== chart.ctx.highlightManager.getActiveHighlight()) { this.dispatchHighlightUpdate(chart, matchingNodes[0].nodeDatum); dispatched = true; break; } } if (!dispatched) { debug("ChartSync.findMatchingHighlightNodes() - no matching nodes", chart.id, event); this.dispatchHighlightUpdate(chart); } } } findMatchingNodes(axis, mainDirection, valueIsDate, eventValue) { return (series) => { const seriesKeyAxis = series.getKeyAxis(axis.direction); if (seriesKeyAxis !== axis.id) return; const nodeData = series.contextNodeData?.nodeData ?? []; if (!nodeData?.length) return; const firstNode = nodeData[0]; const mainDirectionKey = `${mainDirection}Key`; if (!(0, import_ag_charts_core167.isObjectWithStringProperty)(firstNode, mainDirectionKey)) return; const valueKey = firstNode[mainDirectionKey]; const nodeDatum = nodeData.find((datum) => { const nodeValue = datum.datum[valueKey]; return valueIsDate ? nodeValue.getTime() === eventValue : nodeValue === eventValue; }); return nodeDatum ? { series, nodeDatum } : null; }; } dispatchHighlightUpdate(chart, nodeDatum) { debug("ChartSync.dispatchHighlightUpdate()", chart.id, nodeDatum); const delayed = nodeDatum == null; chart.ctx.highlightManager.updateHighlight(`${chart.id}-sync`, nodeDatum, delayed); const tooltipEnabled = nodeDatum?.series.tooltipEnabled ?? chart.tooltip.enabled; if (nodeDatum && tooltipEnabled) { const bbox = chart.seriesAreaBoundingBox; const canvasX = bbox.x + (nodeDatum.midPoint?.x ?? nodeDatum.point?.x ?? 0); const canvasY = bbox.y + (nodeDatum.midPoint?.y ?? nodeDatum.point?.y ?? 0); const tooltipMeta = TooltipManager.makeTooltipMeta( { type: "pointermove", canvasX, canvasY }, nodeDatum.series, nodeDatum, void 0 ); chart.ctx.tooltipManager.updateTooltip( `${chart.id}-sync`, tooltipMeta, chart.getTooltipContent(nodeDatum.series, nodeDatum.datumIndex, nodeDatum, "tooltip") ); } else { chart.ctx.tooltipManager.removeTooltip(`${chart.id}-sync`, void 0, true); } this.updateChart(chart, import_ag_charts_core167.ChartUpdateType.SERIES_UPDATE); } async getSyncedDomain(axis) { if (!CartesianAxis.is(axis) || this.axes !== "xy" && this.axes !== axis.direction) { return; } const { groupState, directionDomains, idDomains, positionDomains } = this.updateDomainState(axis); this.validateAxis(axis, groupState); await this.waitForDomainsToBeReady(); if (this.domainMode === "position") { return this.calculateDerivedDomain(axis, positionDomains); } if (this.domainMode === "direction") { return this.calculateDerivedDomain(axis, directionDomains); } return this.calculateDerivedDomain(axis, idDomains); } updateDomainState(axis) { var _a, _b, _c, _d, _e; const { syncManager } = this.moduleContext; const chartId = syncManager.getChart().id; const axisId = axis.id; const groupState = syncManager.getGroupState(this.groupId); if (!groupState) throw new Error("AG Charts - no GroupState for groupId: " + this.groupId); const domainsByDirection = groupState.domains ?? (groupState.domains = {}); const directionDomains = domainsByDirection[_a = axis.direction] ?? (domainsByDirection[_a] = { derived: [], sources: {}, dirty: true }); const chartDirectionDomains = (_b = directionDomains.sources)[chartId] ?? (_b[chartId] = {}); chartDirectionDomains[axisId] = axis.dataDomain.domain; directionDomains.dirty = true; const domainsById = groupState.domainsById ?? (groupState.domainsById = {}); const idDomains = domainsById[axisId] ?? (domainsById[axisId] = { derived: [], sources: {}, dirty: true }); const chartIdDomains = (_c = idDomains.sources)[chartId] ?? (_c[chartId] = {}); chartIdDomains[axisId] = axis.dataDomain.domain; idDomains.dirty = true; const domainsByPosition = groupState.domainsByPosition ?? (groupState.domainsByPosition = {}); const positionDomains = domainsByPosition[_d = axis.position] ?? (domainsByPosition[_d] = { derived: [], sources: {}, dirty: true }); const chartPositionDomains = (_e = positionDomains.sources)[chartId] ?? (_e[chartId] = {}); chartPositionDomains[axisId] = axis.dataDomain.domain; positionDomains.dirty = true; return { groupState, directionDomains, idDomains, positionDomains }; } validateAxis(axis, groupState) { const multiSeries = this.moduleContext.syncManager.getGroupSyncMode(this.groupId) === "multi-series"; if (!syncedDirections(this.axes).includes(axis.direction)) return; if (multiSeries) { this.validateMultiSeries(axis, groupState); } else { this.validateSingleSeries(axis, groupState); } } validateMultiSeries(axis, groupState) { const { min, max, nice, reverse } = axis; const matchingKeys = new Set(axis.boundSeries.flatMap((s) => s.getKeys(axis.direction))); for (const member of groupState.members) { const { axes, modulesManager } = member; const syncModule = modulesManager.getModule("sync"); const memberSyncDirections = syncedDirections(syncModule?.axes); const keyMatchedAxes = axes.filter((a) => memberSyncDirections.includes(a.direction)).filter((a) => a.boundSeries.some((s) => s.getKeys(a.direction).some((k) => matchingKeys.has(k)))); if (keyMatchedAxes.length === 0) continue; const [firstAxis] = keyMatchedAxes; if (firstAxis.min !== min || firstAxis.max !== max || firstAxis.nice !== nice || firstAxis.reverse !== reverse) { import_ag_charts_core167.Logger.warnOnce( "To allow synchronization, ensure that all synchronized axes with matching keys have matching min, max, nice, and reverse properties." ); this.enabled = false; return; } } } validateSingleSeries(axis, groupState) { const members = groupState.members; const [{ axes: syncAxes }] = members; const { direction, min, max, nice, reverse } = axis; for (const nextAxis of syncAxes) { if (direction !== nextAxis.direction) continue; if (nice !== nextAxis.nice || reverse !== nextAxis.reverse || min !== nextAxis.min && ((0, import_ag_charts_core167.isFiniteNumber)(min) || (0, import_ag_charts_core167.isFiniteNumber)(nextAxis.min)) || max !== nextAxis.max && ((0, import_ag_charts_core167.isFiniteNumber)(max) || (0, import_ag_charts_core167.isFiniteNumber)(nextAxis.max))) { import_ag_charts_core167.Logger.warnOnce( "To allow synchronization, ensure that all charts have matching min, max, nice, and reverse properties on the synchronized axes." ); this.enabled = false; return; } } } calculateDerivedDomain(axis, domains) { if (!domains.dirty) return domains.derived; let previousDerived = domains.derived; const newDerivedBySource = Object.values(domains.sources).map((d) => Object.values(d)); let newDerived; if (ContinuousScale4.is(axis.scale)) { newDerived = newDerivedBySource.flat(2); } else { newDerived = newDerivedBySource.flat().toSorted((a, b) => a.length > b.length ? -1 : 1).flat(); } domains.derived = (0, import_ag_charts_core167.unique)(newDerived); if (ContinuousScale4.is(axis.scale)) { previousDerived = (0, import_ag_charts_core167.findMinMax)(previousDerived); domains.derived = (0, import_ag_charts_core167.findMinMax)(domains.derived); } domains.dirty = false; if (domainChanged(axis.scale, previousDerived, domains.derived)) { debug(axis.id, "updated", { before: previousDerived, after: domains.derived }); this.updateSiblings(); } return domains.derived; } removeAxis(axis) { if (!CartesianAxis.is(axis) || this.axes !== "xy" && this.axes !== axis.direction) { return; } const { syncManager } = this.moduleContext; const syncGroup = syncManager.getGroupState(this.groupId); const chartId = syncManager.getChart().id; const axisId = axis.id; delete syncGroup?.domains?.[axis.direction]?.sources?.[chartId]?.[axisId]; delete syncGroup?.domainsByPosition?.[axis.position]?.sources?.[chartId]?.[axisId]; delete syncGroup?.domainsById?.[axisId]?.sources?.[chartId]?.[axisId]; } async waitForDomainsToBeReady() { const { syncManager } = this.moduleContext; let count = 0; while (syncManager.getGroupMembers(this.groupId).some((c) => c.syncStatus === "init")) { debug("ChartSync.waitForDomainsToBeReady() - waiting for all domains to be calculated", this.groupId); await this.domainSync.waitForCompletion(); count++; } if (count > 0) { debug("ChartSync.waitForDomainsToBeReady() - waited for", count, "iterations"); } this.domainSync.notify(); } prepareZoomUpdate() { const { zoomManager } = this.moduleContext; const zoom = zoomManager.getZoom(); if (this.axes === "x") { delete zoom?.y; } else if (this.axes === "y") { delete zoom?.x; } return (0, import_ag_charts_core167.definedZoomState)(zoom); } onEnabledChange() { const { syncManager, highlightManager } = this.moduleContext; if (this.enabled) { syncManager.subscribe(this.groupId); highlightManager.unhighlightDelay = 0; } else { syncManager.unsubscribe(this.groupId); highlightManager.unhighlightDelay = 100; } this.updateSiblings(); this.onNodeInteractionChange(); this.onZoomChange(); } onGroupIdChange(newValue, oldValue) { if (!this.enabled || newValue === oldValue) return; const { syncManager } = this.moduleContext; syncManager.unsubscribe(oldValue); syncManager.subscribe(newValue); this.updateSiblings(oldValue); this.updateSiblings(newValue); } onAxesChange() { if (!this.enabled) return; const { syncManager } = this.moduleContext; this.updateChart(syncManager.getChart()); } onNodeInteractionChange() { if (this.enabled && this.nodeInteraction) { this.enabledNodeInteractionSync(); } else { this.disableNodeInteractionSync?.(); } } onZoomChange() { if (this.enabled && this.zoom) { this.enabledZoomSync(); } else { this.disableZoomSync?.(); } } destroy() { const { syncManager } = this.moduleContext; syncManager.unsubscribe(this.groupId); this.updateSiblings(); this.disableZoomSync?.(); } }; ChartSync.className = "Sync"; __decorateClass([ import_ag_charts_core167.Property, (0, import_ag_charts_core167.ObserveChanges)((target) => target.onEnabledChange()) ], ChartSync.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core167.Property, (0, import_ag_charts_core167.ObserveChanges)((target, newValue, oldValue) => target.onGroupIdChange(newValue, oldValue)) ], ChartSync.prototype, "groupId", 2); __decorateClass([ import_ag_charts_core167.Property, (0, import_ag_charts_core167.ObserveChanges)((target) => target.onAxesChange()) ], ChartSync.prototype, "axes", 2); __decorateClass([ import_ag_charts_core167.Property, (0, import_ag_charts_core167.ObserveChanges)((target) => target.onNodeInteractionChange()) ], ChartSync.prototype, "nodeInteraction", 2); __decorateClass([ import_ag_charts_core167.Property, (0, import_ag_charts_core167.ObserveChanges)((target) => target.onZoomChange()) ], ChartSync.prototype, "zoom", 2); __decorateClass([ import_ag_charts_core167.Property, (0, import_ag_charts_core167.ObserveChanges)((target) => target.onAxesChange()) ], ChartSync.prototype, "domainMode", 2); // packages/ag-charts-enterprise/src/features/sync/syncModule.ts var SyncModule = { type: "plugin", name: "sync", chartType: "cartesian", enterprise: true, version: import_ag_charts_community147.VERSION, options: { enabled: import_ag_charts_core168.boolean, groupId: import_ag_charts_core168.string, axes: (0, import_ag_charts_core168.union)("x", "y", "xy"), nodeInteraction: import_ag_charts_core168.boolean, zoom: import_ag_charts_core168.boolean }, themeTemplate: { enabled: false }, create: (ctx) => new ChartSync(ctx) }; // packages/ag-charts-enterprise/src/features/zoom/zoomModule.ts var import_ag_charts_community159 = require("ag-charts-community"); var import_ag_charts_core183 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/zoom/zoom.ts var import_ag_charts_community158 = require("ag-charts-community"); var import_ag_charts_core182 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/zoom/scenes/zoomRect.ts var import_ag_charts_community148 = require("ag-charts-community"); var import_ag_charts_core169 = require("ag-charts-core"); var VALID_COLOR = "#2196f3"; var INVALID_COLOR = "#8a8a8a"; var ZoomRect = class extends import_ag_charts_community148._ModuleSupport.Rect { constructor() { super(); this.fill = VALID_COLOR; this.fillOpacity = 0.2; this.zIndex = import_ag_charts_core169.ZIndexMap.ZOOM_SELECTION; } updateValid() { this.fill = VALID_COLOR; } updateInvalid() { this.fill = INVALID_COLOR; } }; ZoomRect.className = "ZoomRect"; // packages/ag-charts-enterprise/src/features/zoom/zoomAutoScale.ts var import_ag_charts_community149 = require("ag-charts-community"); var import_ag_charts_core170 = require("ag-charts-core"); var ZoomAutoScalingProperties = class extends import_ag_charts_core170.BaseProperties { constructor() { super(); this.enabled = false; this.padding = 0; } }; __decorateClass([ import_ag_charts_core170.Property ], ZoomAutoScalingProperties.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core170.Property ], ZoomAutoScalingProperties.prototype, "padding", 2); var ZoomAutoScaler = class { constructor(properties, zoomManager, deps, eventsHub, eventsCleanup) { this.properties = properties; this.zoomManager = zoomManager; this.deps = deps; this.manuallyAdjusted = false; eventsCleanup.register( eventsHub.on("zoom:save-memento", (e) => this.onSaveMemento(e)), eventsHub.on("zoom:load-memento", (e) => this.onLoadMemento(e)), eventsHub.on("zoom:change-request", (e) => this.onChangeRequest(e)) ); } get enabled() { return this.deps.enabled && this.properties.enabled && !this.manuallyAdjusted; } onManualAdjustment(direction) { if (direction === import_ag_charts_core170.ChartAxisDirection.Y) { this.manuallyAdjusted = true; } } onChangeRequest(event) { const hasYAxisChange = this.hasYAxisChange(event); if (event.sourceDetail === "scrollbar" && hasYAxisChange) { this.manuallyAdjusted = true; } if (event.isReset && hasYAxisChange) { this.manuallyAdjusted = false; } if (this.enabled) { const constrainedZoom = this.autoScaleYZoom(event.state); if (constrainedZoom) { event.constrainChanges(constrainedZoom); } } } hasYAxisChange(event) { for (const id of event.changedAxes) { if (event.state[id]?.direction === import_ag_charts_core170.ChartAxisDirection.Y) { return true; } } return false; } onSaveMemento(event) { event.memento.autoScaledAxes = this.enabled ? ["y"] : void 0; } onLoadMemento(event) { const { zoom, memento, navigatorModule, zoomModule } = event; if (!navigatorModule || zoomModule) { let yAutoScale = memento?.autoScaledAxes?.includes("y"); if (memento?.rangeY) { yAutoScale ?? (yAutoScale = false); zoom.y = this.zoomManager.rangeToRatioDirection(import_ag_charts_core170.ChartAxisDirection.Y, memento.rangeY) ?? { min: 0, max: 1 }; } else if (memento?.ratioY) { yAutoScale ?? (yAutoScale = false); zoom.y = { min: memento.ratioY.start ?? 0, max: memento.ratioY.end ?? 1 }; } else { yAutoScale ?? (yAutoScale = true); const autoZoomY = yAutoScale ? this.getAutoScaleYZoom(zoom.x) : void 0; zoom.y = autoZoomY ?? { min: 0, max: 1 }; } if (yAutoScale != void 0) { this.manuallyAdjusted = !yAutoScale; } } } getAutoScaleYZoom(zoomX) { if (!this.enabled) return; const { padding: padding2 } = this.properties; let yZoom; if (this.deps.enableIndependentAxes) { yZoom = this.primaryAxisZoom(import_ag_charts_core170.ChartAxisDirection.Y, zoomX, { padding: padding2 }); } else { yZoom = this.combinedAxisZoom(import_ag_charts_core170.ChartAxisDirection.Y, zoomX, { padding: padding2 }); } if (zoomX.min === 0 && zoomX.max === 1) { return yZoom == null ? void 0 : { min: 0, max: 1 }; } else { return yZoom; } } autoScaleYZoom(changes) { const zoom = this.zoomManager.getZoom(); if (zoom && changes) { const state = this.zoomManager.getAxisZooms(); for (const dir of [import_ag_charts_core170.ChartAxisDirection.X, import_ag_charts_core170.ChartAxisDirection.Y]) { for (const id of (0, import_ag_charts_core170.strictObjectKeys)(changes)) { if (state[id]?.direction === dir) { zoom[dir] = changes[id]; break; } } } } if (zoom?.x == null) return; const zoomY = this.getAutoScaleYZoom(zoom.x); if (zoomY == null || (0, import_ag_charts_core170.objectsEqual)(zoom.y, zoomY)) return; return this.zoomManager.toCoreZoomState({ x: zoom.x, y: zoomY }); } zoomBounds(xAxis, yAxis, zoom, padding2) { const xScale = xAxis.scale; const xScaleRange = xScale.range; xScale.range = [0, 1]; const yScale = yAxis.scale; const yScaleRange = yScale.range; yScale.range = [0, 1]; let min = 1; let minPadding = false; let max = 0; let maxPadding = false; for (const series of yAxis.boundSeries) { if (!series.visible) continue; const { connectsToYAxis } = series; const yValues = series.getRange(import_ag_charts_core170.ChartAxisDirection.Y, [zoom.min, zoom.max]); for (const yValue of yValues) { const y = yScale.convert(yValue); if (!Number.isFinite(y)) continue; if (y < min) { min = y; minPadding = !connectsToYAxis || yValue < 0; } if (y > max) { max = y; maxPadding = !connectsToYAxis || yValue > 0; } } } if ((0, import_ag_charts_core170.isFiniteNumber)(yAxis.min)) { min = 0; } if ((0, import_ag_charts_core170.isFiniteNumber)(yAxis.max)) { max = 1; } xScale.range = xScaleRange; yScale.range = yScaleRange; if (min >= max) return; const totalPadding = (minPadding ? padding2 : 0) + (maxPadding ? padding2 : 0); const paddedDelta = Math.min((max - min) * (1 + totalPadding), 1); if (paddedDelta <= 0) return; if (minPadding && maxPadding) { const mid = (max + min) / 2; min = mid - paddedDelta / 2; max = mid + paddedDelta / 2; } else if (!minPadding && maxPadding) { max = min + paddedDelta; } else if (minPadding && !maxPadding) { min = max - paddedDelta; } if (min < 0) { max += -min; min = 0; } else if (max > 1) { min -= max - 1; max = 1; } return { min, max }; } primaryAxisZoom(direction, zoom, { padding: padding2 = 0 } = {}) { const crossDirection = direction === import_ag_charts_core170.ChartAxisDirection.X ? import_ag_charts_core170.ChartAxisDirection.Y : import_ag_charts_core170.ChartAxisDirection.X; const xAxis = this.zoomManager.getPrimaryAxis(crossDirection); const yAxis = this.zoomManager.getPrimaryAxis(direction); if (xAxis == null || yAxis == null) return; return this.zoomBounds(xAxis, yAxis, zoom, padding2); } combinedAxisZoom(direction, zoom, { padding: padding2 = 0 } = {}) { const axes = this.zoomManager.getAxes(); const crossDirection = direction === import_ag_charts_core170.ChartAxisDirection.X ? import_ag_charts_core170.ChartAxisDirection.Y : import_ag_charts_core170.ChartAxisDirection.X; const seriesXAxes = /* @__PURE__ */ new Map(); for (const xAxis of axes) { if (xAxis.direction !== crossDirection) continue; for (const series of xAxis.boundSeries) { seriesXAxes.set(series, xAxis); } } let min = 1; let max = 0; for (const yAxis of axes) { if (yAxis.direction !== direction) continue; for (const series of yAxis.boundSeries) { const xAxis = seriesXAxes.get(series); if (xAxis == null) continue; const bounds = this.zoomBounds(xAxis, yAxis, zoom, padding2); if (bounds == null) return; min = Math.min(min, bounds.min); max = Math.max(max, bounds.max); } } const delta3 = 1e-6; if (min < delta3) min = 0; if (max > 1 - delta3) max = 1; if (min > max) return; return { min, max }; } }; // packages/ag-charts-enterprise/src/features/zoom/zoomAxisDragger.ts var import_ag_charts_core172 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/features/zoom/zoomUtils.ts var import_ag_charts_community150 = require("ag-charts-community"); var import_ag_charts_core171 = require("ag-charts-core"); var UNIT_SIZE = import_ag_charts_core171.UNIT_MAX - import_ag_charts_core171.UNIT_MIN; var DEFAULT_ANCHOR_POINT_X = "end"; var DEFAULT_ANCHOR_POINT_Y = "middle"; var ZOOM_VALID_CHECK_DEBOUNCE = 300; var constrain = (value, min = import_ag_charts_core171.UNIT_MIN, max = import_ag_charts_core171.UNIT_MAX) => (0, import_ag_charts_core171.clamp)(min, value, max); function dx(zoom) { return zoom.x.max - zoom.x.min; } function dy(zoom) { return zoom.y.max - zoom.y.min; } function isZoomRangeEqual(left, right) { return (0, import_ag_charts_core171.isNumberEqual)(left.min, right.min) && (0, import_ag_charts_core171.isNumberEqual)(left.max, right.max); } function isZoomEqual(left, right) { return isZoomRangeEqual(left.x, right.x) && isZoomRangeEqual(left.y, right.y); } function isMaxZoom(zoom) { return isZoomEqual(zoom, (0, import_ag_charts_core171.definedZoomState)()); } function pointToRatio(bbox, x, y) { if (!bbox) return { x: 0, y: 0 }; const constrainedX = constrain(x - bbox.x, 0, bbox.x + bbox.width); const constrainedY = constrain(y - bbox.y, 0, bbox.y + bbox.height); const rx = 1 / bbox.width * constrainedX; const ry = 1 - 1 / bbox.height * constrainedY; return { x: constrain(rx), y: constrain(ry) }; } function translateZoom(zoom, x, y) { return { x: { min: zoom.x.min + x, max: zoom.x.max + x }, y: { min: zoom.y.min + y, max: zoom.y.max + y } }; } function scaleZoom(zoom, sx, sy) { return { x: { min: zoom.x.min, max: zoom.x.min + dx(zoom) * sx }, y: { min: zoom.y.min, max: zoom.y.min + dy(zoom) * sy } }; } function scaleZoomCenter(zoom, sx, sy) { const dx_ = dx(zoom); const dy_ = dy(zoom); const cx = zoom.x.min + dx_ / 2; const cy = zoom.y.min + dy_ / 2; return { x: { min: cx - dx_ * sx / 2, max: cx + dx_ * sx / 2 }, y: { min: cy - dy_ * sy / 2, max: cy + dy_ * sy / 2 } }; } function scaleZoomAxisWithAnchor(newState, oldState, anchor, origin) { const { min, max } = oldState; const center = min + (max - min) / 2; const diff8 = newState.max - newState.min; switch (anchor) { case "start": return { min, max: oldState.min + diff8 }; case "end": return { min: oldState.max - diff8, max }; case "middle": return { min: center - diff8 / 2, max: center + diff8 / 2 }; case "pointer": return scaleZoomAxisWithPoint(newState, oldState, origin ?? center); default: return { min, max }; } } function scaleZoomAxisWithPoint(newState, oldState, origin) { const newDelta = newState.max - newState.min; const oldDelta = oldState.max - oldState.min; const scaledOrigin = origin * (1 - (oldDelta - newDelta)); const translation = origin - scaledOrigin; const min = newState.min + translation; const max = newState.max + translation; return { min, max }; } function multiplyZoom(zoom, nx, ny) { return { x: { min: zoom.x.min * nx, max: zoom.x.max * nx }, y: { min: zoom.y.min * ny, max: zoom.y.max * ny } }; } function constrainZoom(zoom) { return { x: constrainAxis(zoom.x), y: constrainAxis(zoom.y) }; } function constrainAxis(axis) { const size = axis.max - axis.min; let min = axis.max > import_ag_charts_core171.UNIT_MAX ? import_ag_charts_core171.UNIT_MAX - size : axis.min; let max = axis.min < import_ag_charts_core171.UNIT_MIN ? size : axis.max; min = Math.max(import_ag_charts_core171.UNIT_MIN, min); max = Math.min(import_ag_charts_core171.UNIT_MAX, max); return { min, max }; } function canResetZoom(zoomManager) { const current = zoomManager.getCoreZoom(); const restore = zoomManager.getRestoredZoom(); return (0, import_ag_charts_core171.jsonDiff)(current, restore) != null; } // packages/ag-charts-enterprise/src/features/zoom/zoomAxisDragger.ts var ZoomAxisDragger = class { update(event, direction, anchor, bbox, zoom, axisZoom) { this.oldZoom ?? (this.oldZoom = (0, import_ag_charts_core172.definedZoomState)( direction === import_ag_charts_core172.ChartAxisDirection.X ? { ...zoom, x: axisZoom } : { ...zoom, y: axisZoom } )); this.updateCoords(event.offsetX, event.offsetY); return this.updateZoom(direction, anchor, bbox); } stop() { this.coords = void 0; this.oldZoom = void 0; } updateCoords(x, y) { if (this.coords) { this.coords.x2 = x; this.coords.y2 = y; } else { this.coords = { x1: x, y1: y, x2: x, y2: y }; } } updateZoom(direction, anchor, bbox) { const { coords, oldZoom } = this; let newZoom = (0, import_ag_charts_core172.definedZoomState)(oldZoom); if (!coords || !oldZoom) { if (direction === import_ag_charts_core172.ChartAxisDirection.X) return newZoom.x; return newZoom.y; } const origin = pointToRatio(bbox, coords.x1, coords.y1); const target = pointToRatio(bbox, coords.x2, coords.y2); if (direction === import_ag_charts_core172.ChartAxisDirection.X) { const scaleX = (target.x - origin.x) * dx(oldZoom); newZoom.x.max += scaleX; newZoom.x = scaleZoomAxisWithAnchor(newZoom.x, oldZoom.x, anchor, origin.x); newZoom = constrainZoom(newZoom); return newZoom.x; } const scaleY = (target.y - origin.y) * dy(oldZoom); newZoom.y.max -= scaleY; newZoom.y = scaleZoomAxisWithAnchor(newZoom.y, oldZoom.y, anchor, origin.y); newZoom = constrainZoom(newZoom); return newZoom.y; } }; // packages/ag-charts-enterprise/src/features/zoom/zoomContextMenu.ts var import_ag_charts_community151 = require("ag-charts-community"); var import_ag_charts_core173 = require("ag-charts-core"); var { userInteraction: userInteraction2 } = import_ag_charts_community151._ModuleSupport; var ZoomContextMenu = class { constructor(eventsHub, contextMenuRegistry, zoomManager, getModuleProperties, getRect, updateZoom, isZoomValid) { this.eventsHub = eventsHub; this.contextMenuRegistry = contextMenuRegistry; this.zoomManager = zoomManager; this.getModuleProperties = getModuleProperties; this.getRect = getRect; this.updateZoom = updateZoom; this.isZoomValid = isZoomValid; } registerActions(enabled) { const { contextMenuRegistry } = this; const action = enabled ? "show" : "hide"; contextMenuRegistry.toggle("zoom-to-cursor", action); contextMenuRegistry.toggle("pan-to-cursor", action); contextMenuRegistry.toggle("reset-zoom", action); if (!enabled) { return; } contextMenuRegistry.builtins.items["zoom-to-cursor"].action = this.onZoomToHere.bind(this); contextMenuRegistry.builtins.items["pan-to-cursor"].action = this.onPanToHere.bind(this); contextMenuRegistry.builtins.items["reset-zoom"].action = this.onResetZoom.bind(this); const shouldEnableZoomToHere = (event) => { const rect = this.getRect(); if (!rect) return true; const origin = pointToRatio(rect, event.x, event.y); return this.iterateFindNextZoomAtPoint(origin) != null; }; const shouldEnablePanToHere = () => { return !isMaxZoom((0, import_ag_charts_core173.definedZoomState)(this.zoomManager.getZoom())); }; const removeListener = this.eventsHub.on("context-menu:setup", (event) => { contextMenuRegistry.builtins.items["zoom-to-cursor"].enabled = shouldEnableZoomToHere(event); contextMenuRegistry.builtins.items["pan-to-cursor"].enabled = shouldEnablePanToHere(); contextMenuRegistry.builtins.items["reset-zoom"].enabled = canResetZoom(this.zoomManager); }); return () => { removeListener(); contextMenuRegistry.toggle("zoom-to-cursor", "hide"); contextMenuRegistry.toggle("pan-to-cursor", "hide"); contextMenuRegistry.toggle("reset-zoom", "hide"); }; } computeOrigin(event) { const rect = this.getRect(); const { enabled } = this.getModuleProperties(); if (!enabled || !rect || !event?.target || !(event instanceof MouseEvent)) return; const relativeRect = { x: 0, y: 0, width: rect.width, height: rect.height }; return pointToRatio(relativeRect, event.offsetX, event.offsetY); } onZoomToHere({ event }) { const origin = this.computeOrigin(event); if (!origin) return; const zoom = this.iterateFindNextZoomAtPoint(origin); if (zoom == null) return; this.updateZoom(userInteraction2("contextmenu-zoom-to-cursor"), zoom); } onPanToHere({ event }) { const origin = this.computeOrigin(event); if (!origin) return; const zoom = (0, import_ag_charts_core173.definedZoomState)(this.zoomManager.getZoom()); const scaleX = dx(zoom); const scaleY = dy(zoom); const scaledOriginX = origin.x * scaleX; const scaledOriginY = origin.y * scaleY; const halfSize = UNIT_SIZE / 2; let newZoom = { x: { min: origin.x - halfSize, max: origin.x + halfSize }, y: { min: origin.y - halfSize, max: origin.y + halfSize } }; newZoom = scaleZoomCenter(newZoom, scaleX, scaleY); newZoom = translateZoom(newZoom, zoom.x.min - origin.x + scaledOriginX, zoom.y.min - origin.y + scaledOriginY); this.updateZoom(userInteraction2("contextmenu-pan-to-cursor"), constrainZoom(newZoom)); } onResetZoom(_actionEvent) { this.zoomManager.resetZoom(userInteraction2("contextmenu-reset")); } iterateFindNextZoomAtPoint(origin) { const { scrollingStep } = this.getModuleProperties(); for (let i = scrollingStep; i <= 1 - scrollingStep; i += scrollingStep) { const zoom = this.getNextZoomAtPoint(origin, i); if (this.isZoomValid(zoom)) { return zoom; } } } getNextZoomAtPoint(origin, step) { const { isScalingX, isScalingY } = this.getModuleProperties(); const zoom = (0, import_ag_charts_core173.definedZoomState)(this.zoomManager.getZoom()); const scaledOriginX = origin.x * dx(zoom); const scaledOriginY = origin.y * dy(zoom); const halfSize = UNIT_SIZE / 2; let newZoom = { x: { min: origin.x - halfSize, max: origin.x + halfSize }, y: { min: origin.y - halfSize, max: origin.y + halfSize } }; newZoom = scaleZoomCenter( newZoom, isScalingX ? dx(zoom) * step : UNIT_SIZE, isScalingY ? dy(zoom) * step : UNIT_SIZE ); newZoom = translateZoom(newZoom, zoom.x.min - origin.x + scaledOriginX, zoom.y.min - origin.y + scaledOriginY); return constrainZoom(newZoom); } }; // packages/ag-charts-enterprise/src/features/zoom/zoomDOMProxy.ts var import_ag_charts_community152 = require("ag-charts-community"); var import_ag_charts_core174 = require("ag-charts-core"); var ZoomDOMProxy = class { constructor(axesHandlers) { this.axesHandlers = axesHandlers; this.axes = []; this.overlappingAxisIds = /* @__PURE__ */ new Set(); } destroy() { for (const a of this.axes) { a.div.destroy(); } } update(enabled, enableAxisDragging, enableAxisScrolling, ctx, seriesRect) { this.seriesRect = seriesRect; const disabled = !enabled || !enableAxisDragging && !enableAxisScrolling; for (const ax of this.axes) { ax.div.setHidden(disabled); } if (disabled) return; const { X, Y } = import_ag_charts_core174.ChartAxisDirection; const axesCtx = [...ctx.axisManager.getAxisContext(X), ...ctx.axisManager.getAxisContext(Y)]; const { removed, added } = this.diffAxisIds(axesCtx); if (removed.length > 0) { this.axes = this.axes.filter((entry) => { if (removed.includes(entry.axisId)) { entry.div.destroy(); this.overlappingAxisIds.delete(entry.axisId); if (this.hoveredAxisId === entry.axisId) this.hoveredAxisId = void 0; if (this.activeAxisId === entry.axisId) this.activeAxisId = void 0; return false; } return true; }); } for (const newAxisCtx of added) { const { axisId, direction } = newAxisCtx; this.axes.push(this.initAxis(ctx, axisId, this.axesHandlers, direction)); } for (const axis of this.axes) { const axisCtx = axesCtx.find((ac) => ac.axisId === axis.axisId); const bbox = axisCtx.getCanvasBounds(); axis.div.setHidden((0, import_ag_charts_core174.boxEmpty)(bbox)); if (bbox == void 0) { axis.bounds = void 0; } else { axis.div.setBounds(bbox); axis.bounds = new import_ag_charts_community152._ModuleSupport.BBox(bbox.x, bbox.y, bbox.width, bbox.height); } } this.updateOverlappingAxisPointerEvents(enableAxisDragging, enableAxisScrolling); } setAxisCursor(cursor) { this.cursor = cursor; for (const axis of this.axes) { axis.div.setCursor(this.getCursor(axis.direction)); } } toggleAxisDraggingCursor(direction, enabled) { for (const axis of this.axes) { if (axis.direction !== direction) continue; axis.div.setCursor(enabled ? this.getCursor(direction) : void 0); } } updateOverlappingAxisPointerEvents(enableAxisDragging, enableAxisScrolling) { this.overlappingAxisIds.clear(); const shouldEnableInteraction = (enableAxisDragging || enableAxisScrolling) && this.seriesRect; for (const axis of this.axes) { if (!shouldEnableInteraction) { axis.div.setPointerEvents(void 0); continue; } const isOverlapping = Boolean(axis.bounds?.collidesBBox(this.seriesRect)); if (isOverlapping) { this.overlappingAxisIds.add(axis.axisId); axis.div.setPointerEvents("none"); } else { axis.div.setPointerEvents(void 0); } } this.cleanupAxisState(); } cleanupAxisState() { if (this.hoveredAxisId && !this.overlappingAxisIds.has(this.hoveredAxisId)) { this.hoveredAxisId = void 0; } if (this.activeAxisId && !this.overlappingAxisIds.has(this.activeAxisId)) { this.activeAxisId = void 0; } } pickAxisAtPoint(point) { for (const axis of this.axes) { if (!this.overlappingAxisIds.has(axis.axisId)) continue; if (axis.bounds?.containsPoint(point.canvasX, point.canvasY)) { return { axisId: axis.axisId, direction: axis.direction }; } } return void 0; } setHoveredAxis(axisId) { if (this.overlappingAxisIds.has(axisId)) { this.hoveredAxisId = axisId; } } clearHoveredAxis() { if (!this.activeAxisId) { this.hoveredAxisId = void 0; } } beginDelegatedAxisDrag(axisId) { if (!this.overlappingAxisIds.has(axisId)) return false; this.activeAxisId = axisId; this.hoveredAxisId = void 0; return true; } endDelegatedAxisDrag(axisId) { if (this.activeAxisId === axisId) { this.activeAxisId = void 0; } this.hoveredAxisId = void 0; } hasOverlappingAxes() { return this.overlappingAxisIds.size > 0; } getHoveredAxis() { if (!this.hoveredAxisId) return void 0; const axis = this.axes.find((a) => a.axisId === this.hoveredAxisId); return axis ? { axisId: axis.axisId, direction: axis.direction } : void 0; } getCursor(direction) { if (this.cursor) return this.cursor; return direction === import_ag_charts_core174.ChartAxisDirection.X ? "ew-resize" : "ns-resize"; } initAxis(ctx, axisId, handlers, direction) { const where = "afterend"; const div = ctx.proxyInteractionService.createProxyElement({ type: "region", domManagerId: axisId, where }); div.setCursor(this.getCursor(direction)); div.addListener("drag-start", (e) => { if (e.device === "touch") { e.sourceEvent.preventDefault(); } this.activeAxisId = axisId; handlers.onAxisDragStart(direction); }); div.addListener("drag-move", (event) => handlers.onAxisDragMove(axisId, direction, event)); div.addListener("drag-end", () => { this.activeAxisId = void 0; this.hoveredAxisId = void 0; handlers.onAxisDragEnd(); }); div.addListener("dblclick", () => handlers.onAxisDoubleClick(axisId, direction)); div.addListener("wheel", (event) => handlers.onAxisWheel(direction, event)); return { axisId, div, direction }; } diffAxisIds(axesCtx) { const myIds = this.axes.map((entry) => entry.axisId); const ctxIds = axesCtx.map((ctx) => ctx.axisId); const removed = myIds.filter((id) => !ctxIds.includes(id)); const added = axesCtx.filter((ac) => !myIds.includes(ac.axisId)); return { removed, added }; } }; // packages/ag-charts-enterprise/src/features/zoom/zoomOnDataChange.ts var import_ag_charts_community153 = require("ag-charts-community"); var import_ag_charts_core175 = require("ag-charts-core"); var { userInteraction: userInteraction3 } = import_ag_charts_community153._ModuleSupport; function shouldIgnoreDataUpdate(zoom) { return zoom.x.min === 0 && zoom.x.max === 1 && zoom.y.min === 0 && zoom.y.max === 1; } function shouldStickToEnd(properties, zoom) { return properties.stickToEnd && zoom.x.max === 1; } function toVisibleMinMax(axisId, domainMinMax, ratios) { const { domainMin, domainMax } = domainMinMax; const span = domainMax - domainMin; return { axisId, visibleMin: domainMin + span * ratios.min, visibleMax: domainMin + span * ratios.max }; } function fromVisibleMinMax(domainMinMax, visibleMinMax) { const { domainMin, domainMax } = domainMinMax; const { visibleMin, visibleMax } = visibleMinMax; const span = domainMax - domainMin; return { direction: "x", min: (0, import_ag_charts_core175.clamp)(0, (visibleMin - domainMin) / span, 1), max: (0, import_ag_charts_core175.clamp)(0, (visibleMax - domainMin) / span, 1) }; } var ZoomOnDataChangeProperties = class extends import_ag_charts_core175.BaseProperties { constructor() { super(...arguments); this.strategy = "preserveDomain"; // TODO(olegat): change default to 'true' this.stickToEnd = false; } }; __decorateClass([ import_ag_charts_core175.Property ], ZoomOnDataChangeProperties.prototype, "strategy", 2); __decorateClass([ import_ag_charts_core175.Property ], ZoomOnDataChangeProperties.prototype, "stickToEnd", 2); var ZoomOnDataChange = class { constructor(onConstrainChangesCallback, properties, ctx, eventsCleanup) { this.onConstrainChangesCallback = onConstrainChangesCallback; this.properties = properties; this.ctx = ctx; const onFirstDraw = () => { ctx.eventsHub.off("layout:complete", onFirstDraw); eventsCleanup.register( ctx.eventsHub.on("data:load", (e) => this.onDataLoad(e)), ctx.eventsHub.on("data:update", (e) => this.onDataUpdate(e)) ); }; eventsCleanup.register( ctx.eventsHub.on("layout:complete", onFirstDraw), ctx.eventsHub.on("zoom:change-request", (e) => this.onZoomChangeRequest(e)) ); } destroy() { } onDataLoad(_e) { this.performUpdateStrategy(); } onDataUpdate(_e) { this.performUpdateStrategy(); } onZoomChangeRequest(e) { if (e.sourceDetail === "internal-requiredWidth") { this.desiredChanges = void 0; } const changes = this.popDesiredChanges(); if (changes) { e.constrainChanges(changes); this.onConstrainChangesCallback(e); } } /** * Convert ambiguous axes-scale (number | Date | string) into a strictly numerical scale, so that we can use * interpolation to implement preserveDomain in an axes-scale agnostic way. */ computeDomainMinMax(axisId) { const ctx = this.ctx.axisManager.getAxisIdContext(axisId); if (!ctx?.continuous || ctx.scale.domain.length === 0) return; const [min, max] = ctx.scale.getDomainMinMax(); if (typeof min === "number" && typeof max === "number") { return { domainMin: min, domainMax: max }; } else if (min instanceof Date && max instanceof Date) { return { domainMin: min.getTime(), domainMax: max.getTime() }; } else { import_ag_charts_core175.Logger.error(`Unexpected range types: start (${typeof min}), end (${typeof max})`); } } popDesiredChanges() { const { desiredChanges } = this; if (!desiredChanges) return; this.desiredChanges = void 0; switch (desiredChanges.type) { case "domain": { const changes = {}; for (const entry of desiredChanges.domains) { const domainMinMax = this.computeDomainMinMax(entry.axisId); if (domainMinMax) { changes[entry.axisId] = fromVisibleMinMax(domainMinMax, entry); } } return changes; } case "stickToEnd": { const { axisId, difference } = desiredChanges; const domainMinMax = this.computeDomainMinMax(axisId); if (domainMinMax) { const visibleMinMax = { axisId, visibleMin: domainMinMax.domainMax - difference, visibleMax: domainMinMax.domainMax }; return { [axisId]: fromVisibleMinMax(domainMinMax, visibleMinMax) }; } break; } default: const unreachable = (a) => a; return unreachable(desiredChanges); } } performUpdateStrategy() { const zoom = (0, import_ag_charts_core175.definedZoomState)(this.ctx.zoomManager.getZoom()); if (shouldIgnoreDataUpdate(zoom)) { return; } else if (shouldStickToEnd(this.properties, zoom)) { return this.performStickToEnd(); } switch (this.properties.strategy) { case "reset": return this.ctx.zoomManager.resetZoom(userInteraction3("onDataChange-reset")); case "preserveRatios": return; case "preserveDomain": return this.performPreserveDomain(); default: const unreachable = (a) => a; return unreachable(this.properties.strategy); } } performPreserveDomain() { this.desiredChanges = { type: "domain", domains: [] }; const xaxes = this.ctx.zoomManager.getAxes().filter((a) => a.direction === import_ag_charts_core175.ChartAxisDirection.X); for (const { id: axisId } of xaxes) { const domainMinMax = this.computeDomainMinMax(axisId); if (domainMinMax) { const ratios = this.ctx.zoomManager.getAxisZoom(axisId); const entry = toVisibleMinMax(axisId, domainMinMax, ratios); this.desiredChanges.domains.push(entry); } } } performStickToEnd() { const axisId = this.ctx.zoomManager.getPrimaryAxisId(import_ag_charts_core175.ChartAxisDirection.X); if (!axisId) return; const domainMinMax = this.computeDomainMinMax(axisId); if (!domainMinMax) return; const ratios = this.ctx.zoomManager.getAxisZoom(axisId); if (!ratios) return; const { visibleMin, visibleMax } = toVisibleMinMax(axisId, domainMinMax, ratios); const difference = visibleMax - visibleMin; this.desiredChanges = { type: "stickToEnd", axisId, difference }; } }; // packages/ag-charts-enterprise/src/features/zoom/zoomPanner.ts var import_ag_charts_community154 = require("ag-charts-community"); var import_ag_charts_core176 = require("ag-charts-core"); var maxZoomCoords = 16; var decelerationValues = { off: 1, short: 0.01, long: 2e-3 }; var ZoomPanner = class { constructor() { this.deceleration = 1; this.zoomCoordsHistoryIndex = 0; this.coordsHistory = []; } get decelerationValue() { const { deceleration } = this; return Math.max( typeof deceleration === "number" ? deceleration : decelerationValues[deceleration] ?? 1, 1e-4 ); } addListener(_type, fn) { this.onUpdate = fn; return () => { this.onUpdate = void 0; }; } stopInteractions() { if (this.inertiaHandle != null) { cancelAnimationFrame(this.inertiaHandle); this.inertiaHandle = void 0; } } update(event) { this.updateCoords(event.currentX, event.currentY); const { x1 = 0, y1 = 0, x2 = 0, y2 = 0 } = this.coords ?? {}; this.onUpdate?.({ type: "update", deltaX: this.isPanningX() ? x1 - x2 : 0, deltaY: this.isPanningY() ? y1 - y2 : 0 }); } start(direction) { this.direction = direction; this.coordsMonitorTimeout = setInterval(this.recordCurrentZoomCoords.bind(this), 16); } stop() { const { coordsHistory } = this; let deltaX = 0; let deltaY = 0; let deltaT = 0; if (coordsHistory.length > 0) { const arrayIndex = this.zoomCoordsHistoryIndex % maxZoomCoords; let index1 = arrayIndex - 1; if (index1 < 0) index1 = coordsHistory.length - 1; let index0 = arrayIndex; if (index0 >= coordsHistory.length) index0 = 0; const coords1 = coordsHistory[index1]; const coords0 = coordsHistory[index0]; deltaX = this.isPanningX() ? coords1.x - coords0.x : 0; deltaY = this.isPanningY() ? coords1.y - coords0.y : 0; deltaT = coords1.t - coords0.t; } this.coords = void 0; this.direction = void 0; clearInterval(this.coordsMonitorTimeout); this.coordsMonitorTimeout = void 0; this.zoomCoordsHistoryIndex = 0; this.coordsHistory.length = 0; if (deltaT > 0 && this.decelerationValue < 1) { const xVelocity = deltaX / deltaT; const yVelocity = deltaY / deltaT; const velocity = Math.hypot(xVelocity, yVelocity); const angle = Math.atan2(yVelocity, xVelocity); const t0 = performance.now(); this.inertiaHandle = (0, import_ag_charts_core176.getWindow)().requestAnimationFrame((t) => { this.animateInertia(t, t, t0, velocity, angle); }); } } recordCurrentZoomCoords() { const { coords, coordsHistory, zoomCoordsHistoryIndex } = this; if (!coords) return; const { x2: x, y2: y } = coords; const t = Date.now(); coordsHistory[zoomCoordsHistoryIndex % maxZoomCoords] = { x, y, t }; this.zoomCoordsHistoryIndex += 1; } animateInertia(t, prevT, t0, velocity, angle) { const friction = 1 - this.decelerationValue; const maxS = -velocity / Math.log(friction); const s0 = velocity * (friction ** (prevT - t0) - 1) / Math.log(friction); const s1 = velocity * (friction ** (t - t0) - 1) / Math.log(friction); this.onUpdate?.({ type: "update", deltaX: this.isPanningX() ? -Math.cos(angle) * (s1 - s0) : 0, deltaY: this.isPanningY() ? -Math.sin(angle) * (s1 - s0) : 0 }); if (s1 >= maxS - 1) return; this.inertiaHandle = requestAnimationFrame((nextT) => { this.animateInertia(nextT, t, t0, velocity, angle); }); } updateCoords(x, y) { if (this.coords) { this.coords = { x1: this.coords.x2, y1: this.coords.y2, x2: x, y2: y }; } else { this.coords = { x1: x, y1: y, x2: x, y2: y }; } } isPanningX() { return this.direction == null || this.direction === import_ag_charts_core176.ChartAxisDirection.X; } isPanningY() { return this.direction == null || this.direction === import_ag_charts_core176.ChartAxisDirection.Y; } translateZooms(bbox, currentZooms, deltaX, deltaY) { const offset = pointToRatio(bbox, bbox.x + Math.abs(deltaX), bbox.y + bbox.height - Math.abs(deltaY)); const offsetX = Math.sign(deltaX) * offset.x; const offsetY = -Math.sign(deltaY) * offset.y; const newZooms = {}; for (const [axisId, currentZoom] of (0, import_ag_charts_core176.entries)(currentZooms)) { if (currentZoom == null) continue; if (currentZoom.min === import_ag_charts_core176.UNIT_MIN && currentZoom.max === import_ag_charts_core176.UNIT_MAX) { continue; } const { direction } = currentZoom; let zoom = (0, import_ag_charts_core176.definedZoomState)({ [direction]: currentZoom }); zoom = constrainZoom(translateZoom(zoom, offsetX * dx(zoom), offsetY * dy(zoom))); const { min, max } = zoom[direction]; newZooms[axisId] = { direction, min, max }; } return newZooms; } }; // packages/ag-charts-enterprise/src/features/zoom/zoomScrollPanner.ts var import_ag_charts_community155 = require("ag-charts-community"); var import_ag_charts_core177 = require("ag-charts-core"); var DELTA_SCALE = 200; var ZoomScrollPanner = class { update(event, step, bbox, zooms) { const deltaX = event.deltaX * step * DELTA_SCALE; return this.translateZooms(bbox, zooms, deltaX); } translateZooms(bbox, currentZooms, deltaX) { const newZooms = {}; const offset = pointToRatio(bbox, bbox.x + Math.abs(deltaX), 0); const offsetX = deltaX < 0 ? -offset.x : offset.x; for (const [axisId, value] of (0, import_ag_charts_core177.entries)(currentZooms)) { if (value?.direction !== import_ag_charts_core177.ChartAxisDirection.X) continue; const { direction, min, max } = value; let zoom = (0, import_ag_charts_core177.definedZoomState)({ x: { min, max } }); zoom = constrainZoom(translateZoom(zoom, offsetX * dx(zoom), 0)); newZooms[axisId] = { direction, min: zoom.x.min, max: zoom.x.max }; } return newZooms; } }; // packages/ag-charts-enterprise/src/features/zoom/zoomScroller.ts var import_ag_charts_community156 = require("ag-charts-community"); var import_ag_charts_core178 = require("ag-charts-core"); var ZoomScroller = class { updateAxes(event, props, bbox, zooms) { const sourceEvent = event.sourceEvent; const newZooms = {}; const { anchorPointX, anchorPointY, isScalingX, isScalingY, scrollingStep } = props; const origin = pointToRatio( bbox, sourceEvent.offsetX ?? sourceEvent.clientX, sourceEvent.offsetY ?? sourceEvent.clientY ); for (const [axisId, value] of (0, import_ag_charts_core178.entries)(zooms)) { if (value == null) continue; const { direction, min, max } = value; let newZoom = { min, max }; const delta3 = scrollingStep * event.deltaY * (max - min); if (direction === import_ag_charts_core178.ChartAxisDirection.X && isScalingX) { newZoom.max += delta3; newZoom = scaleZoomAxisWithAnchor(newZoom, value, anchorPointX, origin.x); } else if (direction === import_ag_charts_core178.ChartAxisDirection.Y && isScalingY) { newZoom.max += delta3; newZoom = scaleZoomAxisWithAnchor(newZoom, value, anchorPointY, origin.y); } else { continue; } if (newZoom.max < newZoom.min) continue; const constrained = constrainAxis(newZoom); newZooms[axisId] = { direction, min: constrained.min, max: constrained.max }; } return newZooms; } update(event, props, bbox, oldZoom) { const { anchorPointX, anchorPointY, isScalingX, isScalingY, scrollingStep } = props; const canvasX = event.offsetX + bbox.x; const canvasY = event.offsetY + bbox.y; const origin = pointToRatio(bbox, canvasX, canvasY); const dir = event.deltaY; let newZoom = (0, import_ag_charts_core178.definedZoomState)(oldZoom); newZoom.x.max += isScalingX ? scrollingStep * dir * dx(oldZoom) : 0; newZoom.y.max += isScalingY ? scrollingStep * dir * dy(oldZoom) : 0; if (newZoom.x.max < newZoom.x.min || newZoom.y.max < newZoom.y.min) return; if (isScalingX) { newZoom.x = scaleZoomAxisWithAnchor(newZoom.x, oldZoom.x, anchorPointX, origin.x); } if (isScalingY) { newZoom.y = scaleZoomAxisWithAnchor(newZoom.y, oldZoom.y, anchorPointY, origin.y); } newZoom = constrainZoom(newZoom); return newZoom; } updateDelta(delta3, props, oldZoom) { const { anchorPointX, anchorPointY, isScalingX, isScalingY, scrollingStep } = props; let newZoom = (0, import_ag_charts_core178.definedZoomState)(oldZoom); newZoom.x.max += isScalingX ? scrollingStep * -delta3 * dx(oldZoom) : 0; newZoom.y.max += isScalingY ? scrollingStep * -delta3 * dy(oldZoom) : 0; if (isScalingX) { newZoom.x = scaleZoomAxisWithAnchor(newZoom.x, oldZoom.x, anchorPointX); } if (isScalingY) { newZoom.y = scaleZoomAxisWithAnchor(newZoom.y, oldZoom.y, anchorPointY); } newZoom = constrainZoom(newZoom); return newZoom; } }; // packages/ag-charts-enterprise/src/features/zoom/zoomSelector.ts var import_ag_charts_core179 = require("ag-charts-core"); var ZoomSelector = class { constructor(rect, getZoom, isZoomValid) { this.rect = rect; this.getZoom = getZoom; this.isZoomValid = isZoomValid; this.rect.visible = false; } update(event, props, bbox) { const canvasX = event.currentX + (bbox?.x ?? 0); const canvasY = event.currentY + (bbox?.y ?? 0); this.rect.visible = true; this.updateCoords(canvasX, canvasY, props, bbox); this.updateRect(bbox); } stop(innerBBox, bbox, currentZoom) { let zoom = (0, import_ag_charts_core179.definedZoomState)(); if (!innerBBox || !bbox) return zoom; if (this.coords) { zoom = this.createZoomFromCoords(bbox, currentZoom); } const multiplyX = bbox.width / innerBBox.width; const multiplyY = bbox.height / innerBBox.height; zoom = constrainZoom(multiplyZoom(zoom, multiplyX, multiplyY)); this.reset(); if (this.isZoomValid(zoom)) { return zoom; } } reset() { this.coords = void 0; this.rect.visible = false; } didUpdate() { return this.rect.visible && this.rect.width > 0 && this.rect.height > 0; } updateCoords(x, y, props, bbox) { if (!this.coords) { this.coords = { x1: x, y1: y, x2: x, y2: y }; return; } const { coords } = this; coords.x2 = x; coords.y2 = y; if (!bbox) return; const { isScalingX, isScalingY, keepAspectRatio } = props; const normal = this.getNormalisedDimensions(); if (keepAspectRatio && isScalingX && isScalingY) { const aspectRatio = bbox.width / bbox.height; if (coords.y2 < coords.y1) { coords.y2 = Math.min(coords.y1 - normal.width / aspectRatio, coords.y1); } else { coords.y2 = Math.max(coords.y1 + normal.width / aspectRatio, coords.y1); } } if (!isScalingX) { coords.x1 = bbox.x; coords.x2 = bbox.x + bbox.width; } if (!isScalingY) { coords.y1 = bbox.y; coords.y2 = bbox.y + bbox.height; } } updateRect(bbox) { if (!bbox) return; const { rect } = this; const normal = this.getNormalisedDimensions(); const { width, height } = normal; let { x, y } = normal; x = Math.max(x, bbox.x); x -= Math.max(0, x + width - (bbox.x + bbox.width)); y = Math.max(y, bbox.y); y -= Math.max(0, y + height - (bbox.y + bbox.height)); rect.x = x; rect.y = y; rect.width = width; rect.height = height; const zoom = this.createZoomFromCoords(bbox, this.getZoom()); if (this.isZoomValid(zoom)) { rect.updateValid(); } else { rect.updateInvalid(); } } createZoomFromCoords(bbox, currentZoom) { const oldZoom = (0, import_ag_charts_core179.definedZoomState)(currentZoom); const normal = this.getNormalisedDimensions(); const origin = pointToRatio(bbox, normal.x, normal.y + normal.height); const xFactor = normal.width / bbox.width; const yFactor = normal.height / bbox.height; let newZoom = scaleZoom(oldZoom, xFactor, yFactor); const translateX = origin.x * dx(oldZoom); const translateY = origin.y * dy(oldZoom); newZoom = translateZoom(newZoom, translateX, translateY); newZoom = constrainZoom(newZoom); return newZoom; } getNormalisedDimensions() { const { x1 = 0, y1 = 0, x2 = 0, y2 = 0 } = this.coords ?? {}; const x = Math.min(x1, x2); const y = Math.min(y1, y2); const width = x1 <= x2 ? x2 - x1 : x1 - x2; const height = y1 <= y2 ? y2 - y1 : y1 - y2; return { x, y, width, height }; } }; // packages/ag-charts-enterprise/src/features/zoom/zoomToolbar.ts var import_ag_charts_community157 = require("ag-charts-community"); var import_ag_charts_core180 = require("ag-charts-core"); var { userInteraction: userInteraction4, NativeWidget: NativeWidget2, Toolbar: Toolbar2 } = import_ag_charts_community157._ModuleSupport; var ZoomButtonProperties = class extends ToolbarButtonProperties { }; __decorateClass([ import_ag_charts_core180.Property ], ZoomButtonProperties.prototype, "value", 2); __decorateClass([ import_ag_charts_core180.Property ], ZoomButtonProperties.prototype, "section", 2); var ZoomToolbar = class extends import_ag_charts_core180.BaseProperties { constructor(ctx, getModuleProperties, updateZoom, updateAxisZoom, resetZoom, isZoomValid) { super(); this.ctx = ctx; this.getModuleProperties = getModuleProperties; this.updateZoom = updateZoom; this.updateAxisZoom = updateAxisZoom; this.resetZoom = resetZoom; this.isZoomValid = isZoomValid; this.enabled = false; this.buttons = new import_ag_charts_core180.PropertiesArray(ZoomButtonProperties); this.visible = "hover"; this.verticalSpacing = 10; this.detectionRange = 38; this.cleanup = new import_ag_charts_core180.CleanupRegistry(); this.toggleButtonsDebounced = (0, import_ag_charts_core180.debounce)(this.toggleButtons.bind(this), ZOOM_VALID_CHECK_DEBOUNCE, { leading: true, trailing: true }); this.container = new NativeWidget2((0, import_ag_charts_core180.createElement)("div")); this.container.addClass("ag-charts-zoom-buttons"); ctx.domManager.addChild("canvas-overlay", "zoom-buttons", this.container.getElement()); this.toolbar = new Toolbar2(ctx, "ariaLabelZoomToolbar", "horizontal"); this.container.addChild(this.toolbar); this.toolbar.getElement().style.transform = `translateY(54px)`; this.toolbar.setHidden(!this.enabled); this.toggleVisibility(this.visible === "always"); this.cleanup.register( this.toolbar.addToolbarListener("button-pressed", this.onButtonPress.bind(this)), this.toolbar.addToolbarListener("button-focused", this.onButtonFocus.bind(this)), ctx.widgets.containerWidget.addListener("mousemove", this.onHover.bind(this)), ctx.widgets.containerWidget.addListener("mouseleave", this.onLeave.bind(this)), ctx.eventsHub.on("layout:complete", this.onLayoutComplete.bind(this)), this.teardown.bind(this) ); } destroy() { this.cleanup.flush(); } toggleVisibleZoomed(maxZoom) { if (this.visible !== "zoomed") return; this.toggleVisibility(!maxZoom); } teardown() { this.ctx.domManager.removeChild("canvas-overlay", "zoom-buttons"); this.container.destroy(); } onLayoutComplete(event) { if (!this.enabled) return; const { buttons, container } = this; const { rect } = event.series; for (const b of buttons) { if (b.tooltip == null && b.label == null) { const map = { "pan-end": "toolbarZoomPanEnd", "pan-left": "toolbarZoomPanLeft", "pan-right": "toolbarZoomPanRight", "pan-start": "toolbarZoomPanStart", "zoom-in": "toolbarZoomZoomIn", "zoom-out": "toolbarZoomZoomOut", reset: "toolbarZoomReset" }; b.tooltip = map[b.value]; } } this.toolbar.updateButtons(buttons); this.toggleButtonsDebounced(); const height = container.getBounds().height; container.setBounds({ y: rect.y + rect.height - height }); } onHover(event) { if (!this.enabled || this.visible !== "hover" || this.toolbar.isHidden()) return; const { container, detectionRange, ctx: { scene } } = this; const { currentY, sourceEvent: { target } } = event; const element = container.getElement(); const detectionY = element.offsetTop - detectionRange; const visible = currentY > detectionY && currentY < scene.canvas.element.offsetHeight || target === element; this.toggleVisibility(visible); } onLeave() { if (this.visible !== "hover") return; this.toggleVisibility(false); } toggleVisibility(visible, immediate = false) { const { container, toolbar: toolbar2, verticalSpacing } = this; toolbar2.toggleClass("ag-charts-zoom-buttons__toolbar--hidden", !visible); const element = toolbar2.getElement(); element.style.transitionDuration = immediate ? "0s" : ""; element.style.transform = visible ? "translateY(0)" : `translateY(${container.getBounds().height + verticalSpacing}px)`; } toggleButtons() { const zoom = (0, import_ag_charts_core180.definedZoomState)(this.ctx.zoomManager.getZoom()); if (this.previousZoom && isZoomEqual(this.previousZoom, zoom)) return; this.previousZoom = zoom; for (const [index, button] of this.buttons.entries()) { let enabled = true; switch (button?.value) { case "pan-start": enabled = zoom.x.min > import_ag_charts_core180.UNIT_MIN; break; case "pan-end": enabled = zoom.x.max < import_ag_charts_core180.UNIT_MAX; break; case "pan-left": enabled = zoom.x.min > import_ag_charts_core180.UNIT_MIN; break; case "pan-right": enabled = zoom.x.max < import_ag_charts_core180.UNIT_MAX; break; case "zoom-out": enabled = !isMaxZoom(zoom); break; case "zoom-in": enabled = this.isZoomValid( this.getNextZoomStateUnified("zoom-in", zoom, this.getModuleProperties()) ); break; case "reset": enabled = canResetZoom(this.ctx.zoomManager); break; } this.toolbar.toggleButtonEnabledByIndex(index, enabled); } } onButtonPress({ button }) { if (!this.enabled || this.toolbar.isHidden()) return; const props = this.getModuleProperties(); if (props.independentAxes && button.value !== "reset") { const axisZooms = this.ctx.zoomManager.getAxisZooms(); for (const [axisId, value] of (0, import_ag_charts_core180.entries)(axisZooms)) { if (value == null) continue; const { direction, min, max } = value; this.onButtonPressAxis(button, props, axisId, direction, { min, max }); } } else { this.onButtonPressUnified(button, props); } } onButtonFocus(_event) { this.toggleVisibility(true, true); } onButtonPressAxis(event, props, axisId, direction, zoom) { const { isScalingX, isScalingY, scrollingStep } = props; let newZoom = { ...zoom }; const delta3 = zoom.max - zoom.min; switch (event.value) { case "pan-start": newZoom.max = delta3; newZoom.min = 0; break; case "pan-end": newZoom.min = newZoom.max - delta3; newZoom.max = import_ag_charts_core180.UNIT_MAX; break; case "pan-left": newZoom.min -= delta3 * scrollingStep; newZoom.max -= delta3 * scrollingStep; break; case "pan-right": newZoom.min += delta3 * scrollingStep; newZoom.max += delta3 * scrollingStep; break; case "zoom-in": case "zoom-out": { const isDirectionX = direction === import_ag_charts_core180.ChartAxisDirection.X; const isScalingDirection = isDirectionX && isScalingX || !isDirectionX && isScalingY; let scale = event.value === "zoom-in" ? 1 - scrollingStep : 1 + scrollingStep; if (!isScalingDirection) scale = 1; const placement = isDirectionX ? this.getAnchorPointX(props) : this.getAnchorPointY(props); newZoom.max = newZoom.min + (newZoom.max - newZoom.min) * scale; newZoom = scaleZoomAxisWithAnchor(newZoom, zoom, placement); break; } } this.updateAxisZoom(userInteraction4(`zoom-button-${event.value}`), axisId, direction, constrainAxis(newZoom)); } onButtonPressUnified(event, props) { const { scrollingStep } = props; const oldZoom = (0, import_ag_charts_core180.definedZoomState)(this.ctx.zoomManager.getZoom()); let zoom = (0, import_ag_charts_core180.definedZoomState)(oldZoom); switch (event.value) { case "reset": this.resetZoom("zoom-button-reset"); return; case "pan-start": zoom.x.max = dx(zoom); zoom.x.min = 0; break; case "pan-end": zoom.x.min = import_ag_charts_core180.UNIT_MAX - dx(zoom); zoom.x.max = import_ag_charts_core180.UNIT_MAX; break; case "pan-left": zoom = translateZoom(zoom, -dx(zoom) * scrollingStep, 0); break; case "pan-right": zoom = translateZoom(zoom, dx(zoom) * scrollingStep, 0); break; case "zoom-in": case "zoom-out": { zoom = this.getNextZoomStateUnified(event.value, oldZoom, props); break; } } this.updateZoom(userInteraction4(`zoom-button-${event.value}`), constrainZoom(zoom)); } getNextZoomStateUnified(button, oldZoom, props) { const { isScalingX, isScalingY, scrollingStep } = props; const scale = button === "zoom-in" ? 1 - scrollingStep : 1 + scrollingStep; const zoom = scaleZoom(oldZoom, isScalingX ? scale : 1, isScalingY ? scale : 1); zoom.x = scaleZoomAxisWithAnchor(zoom.x, oldZoom.x, this.getAnchorPointX(props)); zoom.y = scaleZoomAxisWithAnchor(zoom.y, oldZoom.y, this.getAnchorPointY(props)); return zoom; } getAnchorPointX(props) { const anchorPointX = this.anchorPointX ?? props.anchorPointX; return anchorPointX === "pointer" ? DEFAULT_ANCHOR_POINT_X : anchorPointX; } getAnchorPointY(props) { const anchorPointY = this.anchorPointY ?? props.anchorPointY; return anchorPointY === "pointer" ? DEFAULT_ANCHOR_POINT_Y : anchorPointY; } }; __decorateClass([ import_ag_charts_core180.Property, (0, import_ag_charts_core180.ActionOnSet)({ changeValue(enabled) { this.toolbar?.setHidden(!enabled); } }) ], ZoomToolbar.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core180.Property ], ZoomToolbar.prototype, "buttons", 2); __decorateClass([ import_ag_charts_core180.Property, (0, import_ag_charts_core180.ActionOnSet)({ changeValue(visible, oldValue) { if (oldValue == null) return; const always = visible === "always"; const zoomed = visible === "zoomed" && this.previousZoom != null && !isMaxZoom(this.previousZoom); this.toggleVisibility(always || zoomed); } }) ], ZoomToolbar.prototype, "visible", 2); __decorateClass([ import_ag_charts_core180.Property ], ZoomToolbar.prototype, "anchorPointX", 2); __decorateClass([ import_ag_charts_core180.Property ], ZoomToolbar.prototype, "anchorPointY", 2); // packages/ag-charts-enterprise/src/features/zoom/zoomTwoFingers.ts var N = 1e6; function clientToNormal({ min, max }, a, Rx, Rw) { if (Rw === 0) return 0; return N * ((a - Rx) / Rw * (max - min) + min); } function solveTwoUnknowns(x1, x2, a1, a2, Rx, Rw) { [x1, x2] = [Math.min(x1, x2), Math.max(x1, x2)]; [a1, a2] = [Math.min(a1, a2), Math.max(a1, a2)]; const t1 = N * (a1 - Rx) / Rw; const t2 = N * (a2 - Rx) / Rw; const c = (a1 - Rx) / (a2 - Rx); const min = (x1 - c * x2) / (N - t1 + c * (t2 - N)); const max = (x2 + (t2 - N) * min) / t2; return { min, max }; } function isRangeOverlapping(centerA, radiusA, centerB, radiusB) { if (radiusA === 0) radiusA = 30; if (radiusB === 0) radiusB = 30; const minA = centerA - radiusA; const maxA = centerA + radiusA; const minB = centerB - radiusB; const maxB = centerB + radiusB; return !(maxA < minB || maxB < minA); } var ZoomTwoFingers = class { constructor() { this.touchStart = { origins: [ { identifier: 0, normalX: Number.NaN, normalY: Number.NaN }, { identifier: 0, normalX: Number.NaN, normalY: Number.NaN } ] }; this.initialZoom = { x: { min: 0, max: 1 }, y: { min: 0, max: 1 } }; this.previous = { a1: Number.NaN, a2: Number.NaN, b1: Number.NaN, b2: Number.NaN }; } start(event, target, zoom) { if (event.sourceEvent.targetTouches.length !== 2) return false; event.sourceEvent.preventDefault(); const targetTouches = Array.from(event.sourceEvent.targetTouches); const { x: Rx, y: Ry, width: Rw, height: Rh } = target.getBoundingClientRect(); this.initialZoom.x.min = zoom.x?.min ?? 0; this.initialZoom.x.max = zoom.x?.max ?? 1; this.initialZoom.y.min = zoom.y?.min ?? 0; this.initialZoom.y.max = zoom.y?.max ?? 1; for (const t of this.touchStart.origins) { t.identifier = 0; } this.previous.a1 = Number.NaN; this.previous.a2 = Number.NaN; this.previous.b1 = Number.NaN; this.previous.b2 = Number.NaN; for (const i of [0, 1]) { const a = targetTouches[i].clientX; const b = Ry + Rh - targetTouches[i].clientY; this.touchStart.origins[i].identifier = targetTouches[i].identifier; this.touchStart.origins[i].normalX = clientToNormal(this.initialZoom.x, a, Rx, Rw); this.touchStart.origins[i].normalY = clientToNormal(this.initialZoom.y, b, Ry, Rh); } const [tA, tB] = targetTouches; const [oA, oB] = this.touchStart.origins; const xOverlap = isRangeOverlapping(tA.clientX, tA.radiusX, tB.clientX, tB.radiusX); const yOverlap = isRangeOverlapping(tA.clientY, tA.radiusY, tB.clientY, tB.radiusY); if (yOverlap) oA.normalY = oB.normalY = (oA.normalY + oB.normalY) / 2; if (xOverlap) oA.normalX = oB.normalX = (oA.normalX + oB.normalX) / 2; return true; } update(event, target) { event.sourceEvent.preventDefault(); const targetTouches = Array.from(event.sourceEvent.targetTouches); const { x: Rx, y: Ry, width: Rw, height: Rh } = target.getBoundingClientRect(); const { origins } = this.touchStart; const touches = [0, 1].map((i) => targetTouches.find((t) => t.identifier === origins[i].identifier)); const x1 = origins[0].normalX; const x2 = origins[1].normalX; const a1 = touches[0].clientX; const a2 = touches[1].clientX; const y1 = origins[0].normalY; const y2 = origins[1].normalY; const b1 = Ry + Rh - touches[0].clientY; const b2 = Ry + Rh - touches[1].clientY; return this.twitchTolerantZoomPan4(x1, x2, a1, a2, y1, y2, b1, b2, Rx, Ry, Rw, Rh); } end(event) { const identifiers = Array.from(event.sourceEvent.targetTouches).map((t) => t.identifier); return !identifiers.includes(this.touchStart.origins[0].identifier) || !identifiers.includes(this.touchStart.origins[1].identifier); } // Small touch deltas on an axis, which can defined as one fingers moving ±1 pixel and the other not moving, can // cause the canvas to flicker between two zoompan views. // // For example, consider two fingers moving upwards slowly on the Y-axis with the following events (Y=0 is the top // of the screen): // // [0]: { finger1: { clientY: 101 }, finger2: { clientY: 201 } } // [1]: { finger1: { clientY: 101 }, finger2: { clientY: 200 } } // [2]: { finger1: { clientY: 100 }, finger2: { clientY: 200 } } // // The following transitions cause these changes to the zoompan respectively. // // [0] => [1] : yMin decreases, yMax increases // [1] => [2] : yMin increases, yMax decreases // // At highly-zoomed views, this sudden shift in yMin/yMax in the [1] => [2] transition is very noticeable. When many // of these kind of a transitions occur, the chart flickers between pan states instead of smoothly panning. Note // however that, if we didn't receive event [1], our transition would like this: // // [0] => [2] : yMin increases, yMax increases // // ... which is a smooth panning transition. Therefore to prevent flickering, we skip event [1]. twitchTolerantZoomPan4(x1, x2, a1, a2, y1, y2, b1, b2, Rx, Ry, Rw, Rh) { const { initialZoom, previous } = this; const x = twitchTolerantZoomPan2(x1, x2, a1, a2, previous, "a1", "a2", Rx, Rw, initialZoom.x); const y = twitchTolerantZoomPan2(y1, y2, b1, b2, previous, "b1", "b2", Ry, Rh, initialZoom.y); return { x, y }; } }; function twitchTolerantZoomPan2(x1, x2, a1, a2, previous, previousKey1, previousKey2, Rx, Rw, initialZoom) { if (x1 == x2) { const xn1 = clientToNormal(initialZoom, a1, Rx, Rw); const xn2 = clientToNormal(initialZoom, a2, Rx, Rw); const xavg = (xn1 + xn2) / 2; const dzoom = (x1 - xavg) / N; return { min: initialZoom.min + dzoom, max: initialZoom.max + dzoom }; } else { const a1prev = previous[previousKey1]; const a2prev = previous[previousKey2]; const dx2 = Math.abs(a1 - a1prev) + Math.abs(a2 - a2prev); if (dx2 <= 1) { a1 = a1prev; a2 = a2prev; } else { previous[previousKey1] = a1; previous[previousKey2] = a2; } return solveTwoUnknowns(x1, x2, a1, a2, Rx, Rw); } } // packages/ag-charts-enterprise/src/features/zoom/zoomWheelSequencer.ts var import_ag_charts_core181 = require("ag-charts-core"); var ZoomWheelSequencer = class { constructor() { this.isFirstWheelEvent = true; this.debouncedWheelReset = (0, import_ag_charts_core181.debounce)(() => { this.isFirstWheelEvent = true; this.wasFirstWheelEventZoomCapped = void 0; }, 100); } onWheel(event, callback4) { if (event.sourceEvent.cancelable === false) { return; } const result = callback4(); if (result === "abort") return; const isZoomCapped = result === "capped"; if (this.firstWheelEventDirection != null && this.firstWheelEventDirection !== event.deltaY < 0) { this.isFirstWheelEvent = true; } if (this.isFirstWheelEvent) { this.wasFirstWheelEventZoomCapped = isZoomCapped; this.firstWheelEventDirection = event.deltaY < 0; if (!isZoomCapped) { event.sourceEvent.preventDefault(); } } else if (this.wasFirstWheelEventZoomCapped === false) { event.sourceEvent.preventDefault(); } this.isFirstWheelEvent = false; this.debouncedWheelReset(); } }; // packages/ag-charts-enterprise/src/features/zoom/zoom.ts var { userInteraction: userInteraction5, InteractionState: InteractionState6 } = import_ag_charts_community158._ModuleSupport; var round = (value) => (0, import_ag_charts_core182.roundTo)(value, 10); var CURSOR_ID = "zoom-cursor"; var TOOLTIP_ID = "zoom-tooltip"; var Zoom = class extends import_ag_charts_core182.AbstractModuleInstance { constructor(ctx) { super(); this.ctx = ctx; this.enabled = false; this.enableAxisDragging = true; this.enableAxisScrolling = true; this.enableDoubleClickToReset = true; this.enablePanning = true; this.enableScrolling = true; this.enableSelecting = false; this.enableTwoFingerZoom = true; this.panKey = "alt"; this.axes = "x"; this.scrollingStep = UNIT_SIZE / 10; this.keepAspectRatio = false; this.minVisibleItems = 2; this.anchorPointX = DEFAULT_ANCHOR_POINT_X; this.anchorPointY = DEFAULT_ANCHOR_POINT_Y; this.autoScaling = new ZoomAutoScalingProperties(); this.axisDraggingMode = "zoom"; this.buttons = new ZoomToolbar( this.ctx, this.getModuleProperties.bind(this), this.updateZoom.bind(this), this.updateAxisZoom.bind(this), this.resetZoom.bind(this), this.isZoomValid.bind(this) ); this.onDataChange = new ZoomOnDataChangeProperties(); // Zoom methods this.axisDragger = new ZoomAxisDragger(); this.panner = new ZoomPanner(); this.scroller = new ZoomScroller(); this.scrollPanner = new ZoomScrollPanner(); this.twoFingers = new ZoomTwoFingers(); this.deceleration = "short"; // State this.dragState = 0 /* None */; this.isState = (state) => this.ctx.interactionManager.isState(state); this.destroyContextMenuActions = void 0; this.wheelSequencer = new ZoomWheelSequencer(); this.previousZoomValid = true; this.previousAxisZoomValid = { [import_ag_charts_core182.ChartAxisDirection.X]: true, [import_ag_charts_core182.ChartAxisDirection.Y]: true }; this.toggleAxisDraggingCursorsDebounced = (0, import_ag_charts_core182.debounce)( this.toggleAxisDraggingCursors.bind(this), ZOOM_VALID_CHECK_DEBOUNCE, { leading: true, trailing: true } ); const selectionRect = new ZoomRect(); this.selector = new ZoomSelector(selectionRect, this.getZoom.bind(this), this.isZoomValid.bind(this)); this.contextMenu = new ZoomContextMenu( ctx.eventsHub, ctx.contextMenuRegistry, ctx.zoomManager, this.getModuleProperties.bind(this), () => this.paddedRect, this.updateZoom.bind(this), this.isZoomValid.bind(this) ); const minVisibleItemsCallback = (event) => { if (this.minVisibleItems > 0) { const restrictions = event.stateAsDefinedZoom(); event.constrainZoom(this.constrainZoom(restrictions)); } }; this.dataChangeHandler = new ZoomOnDataChange( minVisibleItemsCallback, this.onDataChange, this.ctx, this.cleanup ); this.domProxy = new ZoomDOMProxy({ onAxisDragStart: (direction) => this.onAxisDragStart(direction), onAxisDragMove: (id, direction, event) => this.onAxisDragMove(id, direction, event), onAxisDragEnd: () => this.onAxisDragEnd(), onAxisDoubleClick: (id) => this.onAxisDoubleClick(id), onAxisWheel: (direction, event) => this.onAxisWheel(direction, event) }); if (ctx.widgets.seriesDragInterpreter) { this.cleanup.register( ctx.widgets.seriesDragInterpreter.events.on("dblclick", (event) => this.onSeriesAreaDoubleClick(event)), ctx.widgets.seriesDragInterpreter.events.on("drag-move", (event) => this.onSeriesAreaDragMove(event)), ctx.widgets.seriesDragInterpreter.events.on("drag-start", (event) => this.onSeriesAreaDragStart(event)), ctx.widgets.seriesDragInterpreter.events.on("drag-end", () => this.onSeriesAreaDragEnd()) ); } this.cleanup.register( ctx.scene.attachNode(selectionRect), ctx.eventsHub.on("series-area:hover", (event) => this.onSeriesAreaHoverEvent(event)), ctx.eventsHub.on("series-area:click", (event) => this.onSeriesAreaClickEvent(event)), ctx.eventsHub.on("series:keynav-zoom", (event) => this.onNavZoom(event)), ctx.widgets.seriesWidget.addListener("wheel", (event) => this.onWheel(event)), ctx.widgets.seriesWidget.addListener("touchstart", (event, current) => this.onTouchStart(event, current)), ctx.widgets.seriesWidget.addListener("touchmove", (event, current) => this.onTouchMove(event, current)), ctx.widgets.seriesWidget.addListener("touchend", (event) => this.onTouchEnd(event)), ctx.widgets.seriesWidget.addListener("touchcancel", (event) => this.onTouchEnd(event)), ctx.updateService.addListener("process-data", (event) => this.onProcessData(event)), ctx.eventsHub.on("layout:complete", (event) => this.onLayoutComplete(event)), ctx.eventsHub.on("zoom:change-request", (event) => this.onZoomChangeRequested(event)), ctx.eventsHub.on("zoom:pan-start", (event) => this.onZoomPanStart(event)), this.panner.addListener("update", (event) => this.onPanUpdate(event)), () => this.teardown() ); this.autoScaler = new ZoomAutoScaler(this.autoScaling, ctx.zoomManager, this, ctx.eventsHub, this.cleanup); } teardown() { this.ctx.zoomManager.setZoomModuleEnabled(false); this.buttons.destroy(); this.destroyContextMenuActions?.(); this.domProxy.destroy(); this.dataChangeHandler.destroy(); } onEnabledChange(enabled) { this.ctx.zoomManager.setZoomModuleEnabled(enabled); if (this.contextMenu) { this.destroyContextMenuActions?.(); this.destroyContextMenuActions = this.contextMenu.registerActions(enabled); } } isIgnoredTouch(event) { if (event?.device !== "touch") { return false; } if (this.ctx.chartService.touch.dragAction !== "drag") { return true; } if (this.enableSelecting) { return false; } if (!this.enablePanning) { return true; } return isMaxZoom(this.getZoom()); } onSeriesAreaDoubleClick(event) { const { enabled, enableDoubleClickToReset } = this; if (!enabled || !enableDoubleClickToReset) return; if (event?.preventZoomDblClick || !this.isState(InteractionState6.ZoomClickable)) return; this.resetZoom("zoom-seriesarea-dblclick"); } onSeriesAreaHoverEvent(event) { if (!this.shouldHandleAxisHover(event)) { this.clearHoveredAxis(); return; } const axis = this.domProxy.pickAxisAtPoint(event); if (axis) { this.domProxy.setHoveredAxis(axis.axisId); this.ctx.domManager.updateCursor(CURSOR_ID, this.domProxy.getCursor(axis.direction)); } else { this.clearHoveredAxis(); } } onSeriesAreaClickEvent(event) { if (!this.shouldHandleAxisClick(event)) return; const axis = this.domProxy.pickAxisAtPoint(event); if (axis && event.sourceEvent?.type === "dblclick") { this.onAxisDoubleClick(axis.axisId); } } shouldHandleAxisHover(event) { const { enabled, enableAxisDragging, enableAxisScrolling, dragState } = this; return enabled && (enableAxisDragging || enableAxisScrolling) && !event.consumed && !this.activeAxis && dragState === 0 /* None */ && this.domProxy.hasOverlappingAxes(); } shouldHandleAxisClick(event) { const { enabled, enableAxisDragging, enableAxisScrolling, enableDoubleClickToReset } = this; return enabled && !this.activeAxis && !event.consumed && (enableAxisDragging || enableAxisScrolling || enableDoubleClickToReset); } clearHoveredAxis() { if (this.activeAxis) return; this.domProxy.clearHoveredAxis(); if (this.dragState === 0 /* None */) { this.ctx.domManager.updateCursor(CURSOR_ID); } } tryBeginAxisDelegation(event) { const hoveredAxis = this.domProxy.getHoveredAxis(); if (!this.enabled || !this.enableAxisDragging || !hoveredAxis) { return false; } if (!this.domProxy.beginDelegatedAxisDrag(hoveredAxis.axisId)) { return false; } this.activeAxis = hoveredAxis; this.onAxisDragStart(hoveredAxis.direction); const cursor = this.dragState === 2 /* Pan */ ? "grabbing" : this.domProxy.getCursor(hoveredAxis.direction); this.ctx.domManager.updateCursor(CURSOR_ID, cursor); if (event.device === "touch") { event.sourceEvent.preventDefault(); } return true; } onSeriesAreaDragStart(event) { const { enabled, enablePanning, enableSelecting, ctx: { domManager, zoomManager } } = this; if (!enabled || !this.isState(InteractionState6.ZoomDraggable) || this.dragState !== 0 /* None */ || this.isIgnoredTouch(event)) { return; } this.panner.stopInteractions(); if (this.tryBeginAxisDelegation(event)) { return; } let newDragState = 0 /* None */; const panKeyPressed = this.isPanningKeyPressed(event.sourceEvent); if (enablePanning && (!enableSelecting || panKeyPressed)) { domManager.updateCursor(CURSOR_ID, "grabbing"); newDragState = 2 /* Pan */; this.panner.start(); } else if (enableSelecting && !panKeyPressed) { newDragState = 3 /* Select */; } if ((this.dragState = newDragState) !== 0 /* None */) { zoomManager.fireZoomPanStartEvent("zoom"); } } onSeriesAreaDragMove(event) { const { dragState, enabled, paddedRect, panner, selector, ctx: { interactionManager, tooltipManager, updateService } } = this; if (this.activeAxis) { this.onAxisDragMove(this.activeAxis.axisId, this.activeAxis.direction, event); return; } if (!enabled || !paddedRect || !this.isState(InteractionState6.ZoomDraggable) || this.isIgnoredTouch(event)) { return; } interactionManager.pushState(import_ag_charts_community158._ModuleSupport.InteractionState.ZoomDrag); if (event.device === "touch") { event.sourceEvent.preventDefault(); } switch (dragState) { case 2 /* Pan */: panner.update(event); break; case 3 /* Select */: selector.update(event, this.getModuleProperties(), paddedRect); break; case 0 /* None */: return; } tooltipManager.updateTooltip(TOOLTIP_ID); updateService.update(import_ag_charts_core182.ChartUpdateType.PERFORM_LAYOUT, { skipAnimations: true }); } onSeriesAreaDragEnd() { const { ctx: { interactionManager } } = this; if (this.activeAxis) { this.handleAxisDragEnd(); return; } interactionManager.popState(import_ag_charts_community158._ModuleSupport.InteractionState.ZoomDrag); if (!this.enabled || this.dragState === 0 /* None */) return; this.handleRegularDragEnd(); this.resetDragState(); } handleAxisDragEnd() { this.onAxisDragEnd(); this.domProxy.endDelegatedAxisDrag(this.activeAxis.axisId); this.activeAxis = void 0; this.clearHoveredAxis(); } handleRegularDragEnd() { const { panner, selector } = this; switch (this.dragState) { case 2 /* Pan */: panner.stop(); break; case 3 /* Select */: if (selector.didUpdate()) { const newZoom = selector.stop(this.seriesRect, this.paddedRect, this.getZoom()); if (newZoom) { this.updateZoom(userInteraction5("zoom-seriesarea-selector"), newZoom); } else { this.ctx.updateService.update(); } } break; } } resetDragState() { this.dragState = 0 /* None */; this.ctx.domManager.updateCursor(CURSOR_ID); this.ctx.tooltipManager.removeTooltip(TOOLTIP_ID); } onAxisDoubleClick(id) { const { enabled, enableDoubleClickToReset, ctx: { zoomManager } } = this; if (!enabled || !enableDoubleClickToReset || !this.isState(InteractionState6.ZoomClickable)) return; this.previousAxisZoomValid = { [import_ag_charts_core182.ChartAxisDirection.X]: true, [import_ag_charts_core182.ChartAxisDirection.Y]: true }; zoomManager.resetAxisZoom({ source: "user-interaction", sourceDetail: "zoom-axis-dblclick" }, id); } onAxisDragStart(direction) { const { axisDraggingMode, domProxy, enabled, enableAxisDragging, panner, ctx: { zoomManager } } = this; if (!enabled || !enableAxisDragging) return; panner.stopInteractions(); if (axisDraggingMode === "pan") { domProxy.setAxisCursor("grabbing"); this.dragState = 2 /* Pan */; this.panner.start(direction); zoomManager.fireZoomPanStartEvent("zoom"); } else { this.dragState = 1 /* Axis */; } } onAxisDragMove(axisId, direction, event) { const { anchorPointX, anchorPointY, axisDragger, dragState, enabled, enableAxisDragging, seriesRect, shouldFlipXY, ctx: { interactionManager, tooltipManager, updateService, zoomManager } } = this; if (!enabled || !enableAxisDragging || !seriesRect) return; interactionManager.pushState(import_ag_charts_community158._ModuleSupport.InteractionState.ZoomDrag); if (event.device === "touch") { event.sourceEvent.preventDefault(); } const zoom = this.getZoom(); if (dragState === 2 /* Pan */) { this.panner.update({ currentX: event.offsetX, currentY: event.offsetY }); } else { let anchor = direction === import_ag_charts_core182.ChartAxisDirection.X ? anchorPointX : anchorPointY; if (shouldFlipXY) anchor = direction === import_ag_charts_core182.ChartAxisDirection.X ? anchorPointY : anchorPointX; const axisZoom = zoomManager.getAxisZoom(axisId); const newZoom = axisDragger.update(event, direction, anchor, seriesRect, zoom, axisZoom); this.autoScaler.onManualAdjustment(direction); this.updateAxisZoom( userInteraction5("zoom-axis-drag"), axisId, direction, newZoom, { directional: true } ); } tooltipManager.updateTooltip(TOOLTIP_ID); updateService.update(import_ag_charts_core182.ChartUpdateType.PERFORM_LAYOUT, { skipAnimations: true }); } onAxisDragEnd() { const { axisDraggingMode, axisDragger, dragState, domProxy, enabled, enableAxisDragging, ctx: { domManager, interactionManager, tooltipManager } } = this; interactionManager.popState(import_ag_charts_community158._ModuleSupport.InteractionState.ZoomDrag); if (!enabled || !enableAxisDragging || dragState === 0 /* None */) return; this.dragState = 0 /* None */; if (axisDraggingMode === "pan") { domProxy.setAxisCursor("grab"); this.panner.stop(); } axisDragger.stop(); domManager.updateCursor(CURSOR_ID); tooltipManager.removeTooltip(TOOLTIP_ID); } onNavZoom(event) { const { enabled, enableScrolling, scroller } = this; const isDefaultState = this.ctx.interactionManager.isState(import_ag_charts_community158._ModuleSupport.InteractionState.Default); if (!isDefaultState || !enabled || !enableScrolling) return; event.widgetEvent.sourceEvent.preventDefault(); this.updateZoom( userInteraction5(`keyboard(${event.delta})`), scroller.updateDelta(event.delta, this.getModuleProperties(), this.getZoom()) ); } onWheel(event) { const { enabled, enablePanning, enableScrolling, paddedRect } = this; if (!enabled || !enableScrolling || !paddedRect || !this.isState(InteractionState6.ZoomWheelable)) return; const { deltaX, deltaY } = event.sourceEvent; const isHorizontalScrolling = deltaX != null && deltaY != null && Math.abs(deltaX) > Math.abs(deltaY); if (enablePanning && isHorizontalScrolling) { this.onWheelPanning(event); } else { this.onWheelScrolling(event); } } onWheelPanning(event) { const { scrollingStep, scrollPanner, seriesRect, ctx: { zoomManager } } = this; if (!seriesRect) return; event.sourceEvent.preventDefault(); const newZooms = scrollPanner.update(event, scrollingStep, seriesRect, zoomManager.getAxisZooms()); this.updateChanges(userInteraction5("zoom-seriesarea-wheel"), newZooms); } onWheelScrolling(event) { const zoom = this.getZoom(); const isZoomCapped = event.deltaY > 0 && isMaxZoom(zoom); this.wheelSequencer.onWheel(event, () => this.handleWheelScrolling(event, isZoomCapped)); } onAxisWheel(axisDirection, event) { if (!this.enableAxisScrolling) return; if (axisDirection !== import_ag_charts_core182.ChartAxisDirection.X && axisDirection !== import_ag_charts_core182.ChartAxisDirection.Y) { return; } const isScalingX = axisDirection === import_ag_charts_core182.ChartAxisDirection.X; const isScalingY = !isScalingX; const props = this.getModuleProperties({ isScalingX, isScalingY }); const zoom = this.getZoom(); const isZoomCapped = event.deltaY > 0 && zoom[axisDirection].min === import_ag_charts_core182.UNIT_MIN && zoom[axisDirection].max === import_ag_charts_core182.UNIT_MAX; this.autoScaler.onManualAdjustment(axisDirection); this.wheelSequencer.onWheel(event, () => this.handleWheelScrolling(event, isZoomCapped, props)); } handleWheelScrolling(event, isZoomCapped, props = this.getModuleProperties()) { const { enableIndependentAxes, scroller, seriesRect, ctx: { zoomManager } } = this; if (!seriesRect) return "abort"; let updated = true; const sourcing = userInteraction5("zoom-axis-wheel"); if (enableIndependentAxes === true) { const newZooms = scroller.updateAxes(event, props, seriesRect, zoomManager.getAxisZooms()); for (const [axisId, { direction, min, max }] of (0, import_ag_charts_core182.entries)(newZooms)) { const constrainedZoom = direction === import_ag_charts_core182.ChartAxisDirection.X ? this.constrainZoom({ x: { min, max }, y: { min: import_ag_charts_core182.UNIT_MAX, max: import_ag_charts_core182.UNIT_MAX } }).x : { min, max }; updated && (updated = this.updateAxisZoom(sourcing, axisId, direction, constrainedZoom)); } } else { const newZoom = scroller.update(event, props, seriesRect, this.getZoom()); if (newZoom == null) return "abort"; updated = this.updateUnifiedZoom(sourcing, newZoom, { directional: true }); } return isZoomCapped || event.deltaY < 0 && !updated ? "capped" : "uncapped"; } onTouchStart(event, current) { if (!this.enableTwoFingerZoom || this.dragState !== 0 /* None */) return; if (this.twoFingers.start(event, current, this.getZoom())) { this.dragState = 4 /* TwoFingers */; } } onTouchMove(event, current) { if (!this.enableTwoFingerZoom || this.dragState !== 4 /* TwoFingers */) return; const newZoom = this.twoFingers.update(event, current); this.updateZoom(userInteraction5("zoom-seriesarea-twofingers"), constrainZoom(newZoom)); } onTouchEnd(event) { if (!this.enableTwoFingerZoom || this.dragState !== 4 /* TwoFingers */) return; event.sourceEvent.preventDefault(); if (this.twoFingers.end(event)) { this.dragState = 0 /* None */; } } onProcessData(event) { this.shouldFlipXY = event.series.shouldFlipXY; } onLayoutComplete(event) { this.domProxy.update( this.enabled, this.enableAxisDragging, this.enableAxisScrolling, this.ctx, event.series.rect ); if (!this.enabled) return; this.seriesRect = event.series.rect; this.paddedRect = event.series.paddedRect; if (this.enableAxisDragging) { this.toggleAxisDraggingCursorsDebounced(); } } onZoomChangeRequested(event) { if (event.sourceDetail !== "zoom-seriesarea-panner") { this.panner.stopInteractions(); } const zoom = this.getZoom(); this.buttons.toggleVisibleZoomed(isMaxZoom(zoom)); } onZoomPanStart(event) { if (event.callerId === "zoom") { this.panner.stopInteractions(); } } onPanUpdate(event) { const { panner, seriesRect, ctx: { tooltipManager, zoomManager } } = this; if (!seriesRect) return; const newZooms = panner.translateZooms(seriesRect, zoomManager.getAxisZooms(), event.deltaX, event.deltaY); this.updateChanges(userInteraction5("zoom-seriesarea-panner"), newZooms); tooltipManager.updateTooltip(TOOLTIP_ID); } isPanningKeyPressed(event) { switch (this.panKey) { case "alt": return event.altKey; case "ctrl": return event.ctrlKey; case "shift": return event.shiftKey; case "meta": return event.metaKey; } } isScalingX() { if (this.axes === "xy") return true; return this.shouldFlipXY ? this.axes === "y" : this.axes === "x"; } isScalingY() { if (this.axes === "xy") return true; return this.shouldFlipXY ? this.axes === "x" : this.axes === "y"; } getAnchorPointX() { return this.shouldFlipXY ? this.anchorPointY : this.anchorPointX; } getAnchorPointY() { return this.shouldFlipXY ? this.anchorPointX : this.anchorPointY; } constrainZoom(newZoom) { return this.ctx.zoomManager.constrainZoomToItemCount(newZoom, this.minVisibleItems, this.autoScaler.enabled); } isZoomValid(newZoom, options) { const { minVisibleItems, ctx: { zoomManager } } = this; if (minVisibleItems === 0) { this.previousZoomValid = true; return true; } const zoom = this.getZoom(); const zoomedInX = round(dx(newZoom)) < round(dx(zoom)); const zoomedInY = round(dy(newZoom)) < round(dy(zoom)); if (!zoomedInX && !zoomedInY) { this.previousZoomValid = true; return true; } if (!this.previousZoomValid && options?.directional) { return false; } const includeYVisibleRange = options?.includeYVisibleRange ?? false; const autoScaleYAxis = this.autoScaler.enabled; const valid = zoomManager.isVisibleItemsCountAtLeast(newZoom, minVisibleItems, { includeYVisibleRange, autoScaleYAxis }); this.previousZoomValid = options?.directional ? valid : true; return valid; } isAxisZoomValid(direction, axisZoom, options) { const { minVisibleItems, ctx: { zoomManager } } = this; const zoom = this.getZoom(); const deltaAxis = axisZoom.max - axisZoom.min; const deltaOld = zoom[direction].max - zoom[direction].min; const newZoom = { ...zoom, [direction]: axisZoom }; if (deltaAxis >= deltaOld) { this.previousAxisZoomValid[direction] = true; return true; } if (!this.previousAxisZoomValid[direction] && options?.directional) { return false; } const opts = { includeYVisibleRange: false, autoScaleYAxis: this.autoScaler.enabled }; const valid = zoomManager.isVisibleItemsCountAtLeast(newZoom, minVisibleItems, opts); this.previousAxisZoomValid[direction] = options?.directional ? valid : true; return valid; } resetZoom(sourceDetail) { this.previousZoomValid = true; this.previousAxisZoomValid = { [import_ag_charts_core182.ChartAxisDirection.X]: true, [import_ag_charts_core182.ChartAxisDirection.Y]: true }; this.ctx.zoomManager.resetZoom({ source: "user-interaction", sourceDetail }); } updateSyncZoom(zoom) { this.updateZoom({ source: "sync", sourceDetail: "internal-updateSyncZoom" }, zoom); } updateChanges(sourcing, changes) { const partialZoom = this.ctx.zoomManager.toZoomState(changes) ?? {}; const currentZoom = (0, import_ag_charts_core182.definedZoomState)(this.ctx.zoomManager.getZoom()); this.updateZoom(sourcing, { x: partialZoom.x ?? currentZoom.x, y: partialZoom.y ?? currentZoom.y }); } updateZoom(sourcing, zoom) { if (this.enableIndependentAxes) { this.updatePrimaryAxisZooms(sourcing, zoom); } else { this.updateUnifiedZoom(sourcing, zoom); } } updateUnifiedZoom(sourcing, zoom, validOptions) { zoom = this.constrainZoom(zoom); if (!this.isZoomValid(zoom, validOptions)) { this.ctx.updateService.update(import_ag_charts_core182.ChartUpdateType.SCENE_RENDER, { skipAnimations: true }); return false; } this.ctx.zoomManager.updateZoom(sourcing, zoom); return true; } updatePrimaryAxisZooms(sourcing, zoom) { this.updatePrimaryAxisZoom(sourcing, zoom, import_ag_charts_core182.ChartAxisDirection.X); this.updatePrimaryAxisZoom(sourcing, zoom, import_ag_charts_core182.ChartAxisDirection.Y); } updatePrimaryAxisZoom(sourcing, zoom, direction) { const axisId = this.ctx.zoomManager.getPrimaryAxisId(direction); if (axisId == null) return; this.updateAxisZoom(sourcing, axisId, direction, zoom[direction]); } updateAxisZoom(sourcing, axisId, direction, axisZoom, validOptions) { const { enableIndependentAxes, ctx: { zoomManager } } = this; if (!axisZoom) return false; const zoom = this.getZoom(); if (enableIndependentAxes !== true) { zoom[direction] = axisZoom; return this.updateUnifiedZoom(sourcing, zoom, validOptions); } if (!this.isAxisZoomValid(direction, axisZoom, validOptions)) return false; const { source, sourceDetail } = sourcing; zoomManager.updateChanges({ source, sourceDetail, changes: { [axisId]: axisZoom }, isReset: false }); return true; } updateAxisCursor(opts) { if (!this.domProxy) return; const { enableAxisDragging = this.enableAxisDragging, enableAxisScrolling = this.enableAxisScrolling, axisDraggingMode = this.axisDraggingMode } = opts; if (enableAxisDragging) { this.domProxy.setAxisCursor(axisDraggingMode === "pan" ? "grab" : void 0); } else if (enableAxisScrolling) { this.domProxy.setAxisCursor("default"); } else { this.domProxy.setAxisCursor(void 0); } } toggleAxisDraggingCursors() { const { anchorPointX, anchorPointY, domProxy } = this; const zoom = this.getZoom(); let showCursorX = dx(zoom) !== UNIT_SIZE; let showCursorY = dy(zoom) !== UNIT_SIZE; if (!showCursorX) { const checkZoomX = scaleZoom(zoom, 0.999, 1); checkZoomX.x = scaleZoomAxisWithAnchor(checkZoomX.x, zoom.x, anchorPointX); showCursorX = this.isZoomValid(checkZoomX, { includeYVisibleRange: true }); } if (!showCursorY) { const checkZoomY = scaleZoom(zoom, 1, 0.999); checkZoomY.y = scaleZoomAxisWithAnchor(checkZoomY.y, zoom.y, anchorPointY); showCursorY = this.isZoomValid(checkZoomY, { includeYVisibleRange: true }); } domProxy.toggleAxisDraggingCursor(import_ag_charts_core182.ChartAxisDirection.X, showCursorX); domProxy.toggleAxisDraggingCursor(import_ag_charts_core182.ChartAxisDirection.Y, showCursorY); } getZoom() { return (0, import_ag_charts_core182.definedZoomState)(this.ctx.zoomManager.getZoom()); } getModuleProperties(overrides) { return { anchorPointX: overrides?.anchorPointX ?? this.getAnchorPointX(), anchorPointY: overrides?.anchorPointY ?? this.getAnchorPointY(), enabled: overrides?.enabled ?? this.enabled, independentAxes: overrides?.independentAxes ?? this.enableIndependentAxes === true, isScalingX: overrides?.isScalingX ?? this.isScalingX(), isScalingY: overrides?.isScalingY ?? this.isScalingY(), keepAspectRatio: overrides?.keepAspectRatio ?? this.keepAspectRatio, scrollingStep: overrides?.scrollingStep ?? this.scrollingStep }; } }; __decorateClass([ (0, import_ag_charts_core182.ActionOnSet)({ newValue(enabled) { this.onEnabledChange(enabled); } }), import_ag_charts_core182.Property ], Zoom.prototype, "enabled", 2); __decorateClass([ (0, import_ag_charts_core182.ActionOnSet)({ changeValue(newValue) { this.updateAxisCursor({ enableAxisDragging: newValue }); } }), import_ag_charts_core182.Property ], Zoom.prototype, "enableAxisDragging", 2); __decorateClass([ (0, import_ag_charts_core182.ActionOnSet)({ changeValue(newValue) { this.updateAxisCursor({ enableAxisScrolling: newValue }); } }), import_ag_charts_core182.Property ], Zoom.prototype, "enableAxisScrolling", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "enableDoubleClickToReset", 2); __decorateClass([ (0, import_ag_charts_core182.ActionOnSet)({ changeValue(newValue) { this.ctx.zoomManager.setIndependentAxes(Boolean(newValue)); } }), import_ag_charts_core182.Property ], Zoom.prototype, "enableIndependentAxes", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "enablePanning", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "enableScrolling", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "enableSelecting", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "enableTwoFingerZoom", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "panKey", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "axes", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "scrollingStep", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "keepAspectRatio", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "minVisibleItems", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "anchorPointX", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "anchorPointY", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "autoScaling", 2); __decorateClass([ (0, import_ag_charts_core182.ActionOnSet)({ changeValue(newValue) { this.updateAxisCursor({ axisDraggingMode: newValue }); } }), import_ag_charts_core182.Property ], Zoom.prototype, "axisDraggingMode", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "buttons", 2); __decorateClass([ import_ag_charts_core182.Property ], Zoom.prototype, "onDataChange", 2); __decorateClass([ (0, import_ag_charts_core182.ProxyProperty)("panner.deceleration"), import_ag_charts_core182.Property ], Zoom.prototype, "deceleration", 2); // packages/ag-charts-enterprise/src/features/zoom/zoomModule.ts var zoomAnchorPoint = (0, import_ag_charts_core183.union)("pointer", "start", "middle", "end"); var ZoomModule = { type: "plugin", name: "zoom", enterprise: true, version: import_ag_charts_community159.VERSION, options: { enabled: import_ag_charts_core183.boolean, enableAxisDragging: import_ag_charts_core183.boolean, enableAxisScrolling: import_ag_charts_core183.boolean, enableDoubleClickToReset: import_ag_charts_core183.boolean, enablePanning: import_ag_charts_core183.boolean, enableScrolling: import_ag_charts_core183.boolean, enableSelecting: import_ag_charts_core183.boolean, enableTwoFingerZoom: import_ag_charts_core183.boolean, keepAspectRatio: import_ag_charts_core183.boolean, anchorPointX: zoomAnchorPoint, anchorPointY: zoomAnchorPoint, axisDraggingMode: (0, import_ag_charts_core183.union)("pan", "zoom"), axes: (0, import_ag_charts_core183.union)("x", "y", "xy"), deceleration: (0, import_ag_charts_core183.or)((0, import_ag_charts_core183.union)("off", "short", "long"), import_ag_charts_core183.ratio), minVisibleItems: import_ag_charts_core183.positiveNumber, panKey: (0, import_ag_charts_core183.union)("alt", "ctrl", "meta", "shift"), scrollingStep: import_ag_charts_core183.ratio, autoScaling: { enabled: import_ag_charts_core183.boolean, padding: import_ag_charts_core183.ratio }, onDataChange: { strategy: (0, import_ag_charts_core183.strictUnion)()("reset", "preserveDomain", "preserveRatios"), stickToEnd: import_ag_charts_core183.boolean }, buttons: { enabled: import_ag_charts_core183.boolean, buttons: (0, import_ag_charts_core183.arrayOfDefs)( { ...import_ag_charts_core183.toolbarButtonOptionsDefs, value: (0, import_ag_charts_core183.union)("reset", "zoom-in", "zoom-out", "pan-left", "pan-right", "pan-start", "pan-end"), section: import_ag_charts_core183.string }, "zoom button options array" ), visible: (0, import_ag_charts_core183.union)("always", "zoomed", "hover") } }, themeTemplate: { enabled: false, enableAxisDragging: true, enableAxisScrolling: true, enableDoubleClickToReset: true, enablePanning: true, enableScrolling: true, enableSelecting: false, enableTwoFingerZoom: true, deceleration: "short", minVisibleItems: 2, panKey: "alt", scrollingStep: 0.1, autoScaling: { enabled: { $and: [ { $eq: [{ $path: "../axes" }, "x"] }, { $not: { $eq: [{ $path: "/series/0/direction" }, "horizontal"] } } ] }, padding: 0.05 }, onDataChange: { strategy: "preserveDomain", stickToEnd: false // TODO(olegat): change default to 'true' }, anchorPointX: "end", anchorPointY: "middle", axes: "x", buttons: { enabled: { $path: "../enabled" }, visible: "hover", buttons: { $shallowSimple: [ { icon: "zoom-out", value: "zoom-out", section: "scale" }, { icon: "zoom-in", value: "zoom-in", section: "scale" }, { icon: "pan-left", value: "pan-left", section: "pan" }, { icon: "pan-right", value: "pan-right", section: "pan" }, { icon: "reset", value: "reset", section: "reset" } ] } } }, create: (ctx) => new Zoom(ctx) }; ZoomModule.options.enableIndependentAxes = (0, import_ag_charts_core183.undocumented)(import_ag_charts_core183.boolean); ZoomModule.options.buttons.anchorPointX = (0, import_ag_charts_core183.undocumented)(zoomAnchorPoint); ZoomModule.options.buttons.anchorPointY = (0, import_ag_charts_core183.undocumented)(zoomAnchorPoint); // packages/ag-charts-enterprise/src/gradient-legend/gradientLegendModule.ts var import_ag_charts_community162 = require("ag-charts-community"); var import_ag_charts_core187 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/gradient-legend/gradientLegend.ts var import_ag_charts_community161 = require("ag-charts-community"); var import_ag_charts_core186 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/gradient-legend/axisTicks.ts var import_ag_charts_community160 = require("ag-charts-community"); var import_ag_charts_core185 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/utils/formatter.ts var import_ag_charts_core184 = require("ag-charts-core"); function formatWithContext(ctx, formatter, params) { return (0, import_ag_charts_core184.callWithContext)(ctx.chartService, formatter, params); } // packages/ag-charts-enterprise/src/gradient-legend/axisTicks.ts var { AxisInterval: AxisInterval2, AxisLabel: AxisLabel2, LinearScale: LinearScale3, BBox: BBox15, TranslatableGroup: TranslatableGroup4, Selection: Selection4, Text: Text2 } = import_ag_charts_community160._ModuleSupport; var _AxisTicks = class _AxisTicks { constructor(ctx, dataProvider) { this.ctx = ctx; this.dataProvider = dataProvider; this.id = (0, import_ag_charts_core185.createId)(this); this.axisGroup = new TranslatableGroup4({ name: `${this.id}-AxisTicks`, zIndex: import_ag_charts_core185.ZIndexMap.AXIS }); this.labelSelection = Selection4.select(this.axisGroup, Text2); this.interval = new AxisInterval2(); this.label = new AxisLabel2(); this.scale = new LinearScale3(); this.placement = "bottom"; this.translationX = 0; this.translationY = 0; this.padding = 0; } get horizontal() { return this.placement.startsWith("top") || this.placement.startsWith("bottom"); } attachAxis(axisNode) { axisNode.appendChild(this.axisGroup); } calculateLayout() { const { placement, translationX, translationY, horizontal, label } = this; function unreachable(_a) { return void 0; } let textBaseline; let textAlign; switch (placement) { case "top": case "top-right": case "top-left": textBaseline = "bottom"; textAlign = "center"; label.mirrored = false; label.parallel = true; break; case "bottom": case "bottom-right": case "bottom-left": textBaseline = "top"; textAlign = "center"; label.mirrored = false; label.parallel = true; break; case "right": case "right-top": case "right-bottom": case "left": case "left-top": case "left-bottom": textBaseline = "middle"; textAlign = "left"; label.mirrored = true; label.parallel = false; break; default: unreachable(placement); } const boxes = []; const tickGenerationResult = this.generateTicks(); const { ticks } = tickGenerationResult; this.labelSelection.update(ticks, void 0, (datum) => datum.tickId); this.axisGroup.setProperties({ translationX, translationY }); this.labelSelection.each((node, datum) => { node.fontFamily = label.fontFamily; node.fontSize = label.fontSize; node.fontStyle = label.fontStyle; node.fontWeight = label.fontWeight; node.fill = label.color; node.textBaseline = textBaseline; node.textAlign = textAlign; node.text = datum.tickLabel; node.x = horizontal ? datum.translation : 0; node.y = horizontal ? 0 : datum.translation; boxes.push(node.getBBox()); }); return boxes.length > 0 ? BBox15.merge(boxes).translate(translationX, translationY) : void 0; } tickFormatter(domain, _ticks, _primary, fractionDigits) { const { ctx } = this; const { formatManager } = ctx; const boundSeries = this.dataProvider.data.flatMap((d) => d.series); return (value, index) => { const formatParams = { type: "number", value, datum: void 0, seriesId: void 0, legendItemName: void 0, key: void 0, source: "gradient-legend", property: "color", domain, boundSeries, fractionDigits, visibleDomain: void 0 }; return this.label.formatValue((fn, params) => formatWithContext(ctx, fn, params), formatParams, index) ?? formatManager.format((fn, params) => formatWithContext(ctx, fn, params), formatParams) ?? formatManager.defaultFormat(formatParams); }; } inRange(x, tolerance = 1e-3) { const [min, max] = (0, import_ag_charts_core185.findMinMax)(this.scale.range); return x >= min - tolerance && x <= max + tolerance; } generateTicks() { const { minSpacing, maxSpacing } = this.interval; const { maxTickCount, minTickCount, tickCount } = (0, import_ag_charts_core185.estimateTickCount)( (0, import_ag_charts_core185.findRangeExtent)(this.scale.range), 1, minSpacing, maxSpacing, _AxisTicks.DefaultTickCount, _AxisTicks.DefaultMinSpacing ); const tickData = this.getTicksData({ nice: [true, true], interval: this.interval.step, tickCount, minTickCount, maxTickCount }); if (this.placement === "bottom" || this.placement === "top") { const measurer3 = (0, import_ag_charts_core185.cachedTextMeasurer)(this.label); const { domain } = this.scale; const reversed = domain[0] > domain[1]; const direction = reversed ? -1 : 1; let lastTickPosition = -Infinity * direction; tickData.ticks = tickData.ticks.filter((data) => { if (Math.sign(data.translation - lastTickPosition) !== direction) return false; const { width: labelWidth } = (0, import_ag_charts_core185.isArray)(data.tickLabel) ? (0, import_ag_charts_core185.measureTextSegments)(data.tickLabel, this.label) : measurer3.measureLines((0, import_ag_charts_core185.toTextString)(data.tickLabel)); lastTickPosition = data.translation + labelWidth * direction; return true; }); } return tickData; } getTicksData(tickParams) { const ticks = []; const domain = tickParams.nice ? this.scale.niceDomain(tickParams) : this.scale.domain; const rawTicks = this.scale.ticks(tickParams, domain)?.ticks ?? []; const fractionDigits = rawTicks.reduce((max, tick) => Math.max(max, (0, import_ag_charts_core185.countFractionDigits)(tick)), 0); const idGenerator = (0, import_ag_charts_core185.createIdsGenerator)(); const tickFormatter = this.tickFormatter(domain, rawTicks, false, fractionDigits); for (let index = 0; index < rawTicks.length; index++) { const tick = rawTicks[index]; const translation = this.scale.convert(tick); if (!this.inRange(translation)) continue; const tickLabel = tickFormatter(tick, index); if (tickLabel == null || tickLabel === "") continue; const tickId = idGenerator((0, import_ag_charts_core185.toPlainText)(tickLabel)); ticks.push({ tick, tickId, tickLabel, translation }); } return { rawTicks, fractionDigits, ticks }; } }; _AxisTicks.className = "AxisTicks"; _AxisTicks.DefaultTickCount = 5; _AxisTicks.DefaultMinSpacing = 10; var AxisTicks = _AxisTicks; // packages/ag-charts-enterprise/src/gradient-legend/gradientLegend.ts var { LayoutElement: LayoutElement6, Group: Group9, Rect: Rect6, Marker: Marker2, TranslatableGroup: TranslatableGroup5, BBox: BBox16 } = import_ag_charts_community161._ModuleSupport; var GradientBar = class extends import_ag_charts_core186.BaseProperties { constructor() { super(...arguments); this.thickness = 16; this.preferredLength = 100; } }; __decorateClass([ import_ag_charts_core186.Property ], GradientBar.prototype, "thickness", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientBar.prototype, "preferredLength", 2); var GradientLegendScale = class extends import_ag_charts_core186.BaseProperties { constructor(axisTicks) { super(); this.axisTicks = axisTicks; } }; __decorateClass([ (0, import_ag_charts_core186.ProxyProperty)("axisTicks.label") ], GradientLegendScale.prototype, "label", 2); __decorateClass([ (0, import_ag_charts_core186.ProxyProperty)("axisTicks.interval") ], GradientLegendScale.prototype, "interval", 2); __decorateClass([ (0, import_ag_charts_core186.ProxyProperty)("axisTicks.padding") ], GradientLegendScale.prototype, "padding", 2); var GradientLegend = class extends import_ag_charts_core186.BaseProperties { constructor(ctx) { super(); this.ctx = ctx; this.id = (0, import_ag_charts_core186.createId)(this); this.legendGroup = new TranslatableGroup5({ name: "legend", zIndex: import_ag_charts_core186.ZIndexMap.LEGEND }); this.containerNode = this.legendGroup.appendChild(new Rect6({ name: "legend-container" })); this.gradientRect = new Rect6(); this.arrow = new Marker2({ shape: "triangle" }); this.ticksGroup = new Group9({ name: "legend-axis-group" }); this.cleanup = new import_ag_charts_core186.CleanupRegistry(); this.enabled = false; this.position = "bottom"; this.reverseOrder = false; this.gradient = new GradientBar(); this.spacing = 20; this.border = new import_ag_charts_core186.Border(this.containerNode); this.cornerRadius = 0; this.fillOpacity = 1; this.padding = 4; this.data = []; this.highlightManager = ctx.highlightManager; this.axisTicks = new AxisTicks(ctx, this); this.axisTicks.attachAxis(this.ticksGroup); this.scale = new GradientLegendScale(this.axisTicks); this.legendGroup.append([this.gradientRect, this.arrow, this.ticksGroup]); this.cleanup.register( ctx.eventsHub.on("highlight:change", () => this.onChartHoverChange()), ctx.layoutManager.registerElement(LayoutElement6.Legend, (e) => this.onStartLayout(e)), () => this.legendGroup.remove() ); } isVertical() { const { placement } = (0, import_ag_charts_core186.expandLegendPosition)(this.position); return placement.startsWith("right") || placement.startsWith("left"); } destroy() { this.cleanup.flush(); } attachLegend(scene) { scene.appendChild(this.legendGroup); } onStartLayout({ layoutBox }) { const [data] = this.data; if (!this.enabled || !data?.enabled || data.legendType !== "gradient") { this.legendGroup.visible = false; return; } const { colorRange } = this.normalizeColorArrays(data); const { strokeWidth, padding: padding2 } = this.getContainerStyles(); const gradientRectBBox = this.updateGradientRect(layoutBox, colorRange); const axisBBox = this.updateAxis(data, gradientRectBBox) ?? new BBox16(0, 0, 0, 0); const legendBBox = BBox16.merge([gradientRectBBox, axisBBox]); legendBBox.grow(padding2).grow(strokeWidth); const { left, top } = this.getMeasurements(layoutBox, legendBBox); this.updateContainer(legendBBox); this.updateArrow(); this.legendGroup.visible = true; this.legendGroup.translationX = left; this.legendGroup.translationY = top; } normalizeColorArrays(data) { let colorDomain = data.colorDomain.slice(); const colorRange = data.colorRange.slice(); if (colorDomain.length === colorRange.length) { return { colorDomain, colorRange }; } if (colorDomain.length > colorRange.length) { colorRange.splice(colorDomain.length); } const [d0, d1] = colorDomain; const count = colorRange.length; colorDomain = colorRange.map((_, i) => { if (i === 0) { return d0; } else if (i === count - 1) { return d1; } return d0 + (d1 - d0) * i / (count - 1); }); return { colorDomain, colorRange }; } updateGradientRect(shrinkRect, colorRange) { const { gradientRect, gradient } = this; const { preferredLength, thickness } = gradient; const gradientRectBBox = new BBox16(0, 0, 0, 0); const colorCount = Math.max(colorRange.length - 1, 1); let angle; if (this.isVertical()) { angle = 0; gradientRectBBox.width = thickness; gradientRectBBox.height = Math.min(shrinkRect.height, preferredLength); } else { angle = 90; gradientRectBBox.width = Math.min(shrinkRect.width, preferredLength); gradientRectBBox.height = thickness; } gradientRect.x = gradientRectBBox.x; gradientRect.y = gradientRectBBox.y; gradientRect.width = gradientRectBBox.width; gradientRect.height = gradientRectBBox.height; gradientRect.fill = { type: "gradient", gradient: "linear", colorSpace: "oklch", colorStops: colorRange.map((color7, i) => ({ stop: i / colorCount, color: color7 })), rotation: angle }; return gradientRectBBox; } updateAxis(data, gradientRectBBox) { const { axisTicks, gradient, scale } = this; const { placement } = (0, import_ag_charts_core186.expandLegendPosition)(this.position); const vertical = this.isVertical(); const positiveAxis = this.reverseOrder !== vertical; axisTicks.placement = placement; const offset = gradient.thickness + (scale.padding ?? 0); axisTicks.translationX = vertical ? offset : gradientRectBBox.x; axisTicks.translationY = vertical ? gradientRectBBox.y : offset; axisTicks.scale.domain = positiveAxis ? data.colorDomain.slice().reverse() : data.colorDomain; axisTicks.scale.range = vertical ? [gradientRectBBox.x, gradientRectBBox.height] : [gradientRectBBox.y, gradientRectBBox.width]; return axisTicks.calculateLayout(); } updateContainer(bbox) { const containerStyles = this.getContainerStyles(); this.containerNode.setStyleProperties(containerStyles); this.containerNode.cornerRadius = containerStyles.cornerRadius; this.containerNode.x = bbox.x; this.containerNode.y = bbox.y; this.containerNode.width = bbox.width; this.containerNode.height = bbox.height; } updateArrow() { const highlighted = this.highlightManager.getActiveHighlight(); const { arrow } = this; if (highlighted?.colorValue == null) { arrow.visible = false; return; } const { scale, label } = this.axisTicks; const size = label.fontSize ?? 0; const t = scale.convert(highlighted.colorValue); let { x, y } = this.gradientRect; let rotation = Math.PI; if (this.isVertical()) { x -= size / 2; y += t; rotation /= 2; } else { x += t; y -= size / 2; } arrow.visible = true; arrow.fill = label.color; arrow.rotation = rotation; arrow.size = size; arrow.translationX = x; arrow.translationY = y; } getMeasurements(shrinkRect, legendBBox) { const unreachable = (_a) => { return void 0; }; let { x: left, y: top } = shrinkRect; const { width, height } = legendBBox; const { placement, floating, xOffset, yOffset } = (0, import_ag_charts_core186.expandLegendPosition)(this.position); const containerStyles = this.getContainerStyles(); left += containerStyles.strokeWidth + containerStyles.padding.left; top += containerStyles.strokeWidth + containerStyles.padding.top; switch (placement) { case "left": top += shrinkRect.height / 2 - height / 2; break; case "right": left += shrinkRect.width - width; top += shrinkRect.height / 2 - height / 2; break; case "top": left += shrinkRect.width / 2 - width / 2; break; case "bottom": left += shrinkRect.width / 2 - width / 2; top += shrinkRect.height - height; break; case "right-top": case "top-right": left += shrinkRect.width - width; break; case "right-bottom": case "bottom-right": left += shrinkRect.width - width; top += shrinkRect.height - height; break; case "left-bottom": case "bottom-left": top += shrinkRect.height - height; break; case "left-top": case "top-left": break; default: unreachable(placement); } if (!floating) { switch (placement) { case "left": case "left-top": case "left-bottom": shrinkRect.shrink(width + this.spacing, "left"); break; case "right": case "right-top": case "right-bottom": shrinkRect.shrink(width + this.spacing, "right"); break; case "top": case "top-left": case "top-right": shrinkRect.shrink(height + this.spacing, "top"); break; case "bottom": case "bottom-left": case "bottom-right": shrinkRect.shrink(height + this.spacing, "bottom"); break; default: unreachable(placement); } } left += xOffset; top += yOffset; return { top, left }; } getContainerStyles() { const { stroke: stroke3, strokeOpacity, strokeWidth } = this.border; const { cornerRadius, fill, fillOpacity, padding: padding2 } = this; const isPaddingNumber = typeof padding2 === "number"; return { cornerRadius, fill, fillOpacity, padding: { top: isPaddingNumber ? padding2 : padding2.top ?? 0, right: isPaddingNumber ? padding2 : padding2.right ?? 0, bottom: isPaddingNumber ? padding2 : padding2.bottom ?? 0, left: isPaddingNumber ? padding2 : padding2.left ?? 0 }, stroke: stroke3, strokeOpacity, strokeWidth: this.border.enabled ? strokeWidth : 0 }; } onChartHoverChange() { if (!this.enabled) return; this.updateArrow(); } }; GradientLegend.className = "GradientLegend"; __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "position", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "reverseOrder", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "gradient", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "border", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "fill", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "padding", 2); __decorateClass([ import_ag_charts_core186.Property ], GradientLegend.prototype, "scale", 2); // packages/ag-charts-enterprise/src/gradient-legend/gradientLegendModule.ts var GradientLegendModule = { type: "plugin", name: "gradientLegend", enterprise: true, version: import_ag_charts_community162.VERSION, // removable: 'standalone-only', options: { enabled: import_ag_charts_core187.boolean, position: import_ag_charts_core187.legendPositionValidator, spacing: import_ag_charts_core187.positiveNumber, reverseOrder: import_ag_charts_core187.boolean, border: import_ag_charts_core187.borderOptionsDef, cornerRadius: import_ag_charts_core187.number, padding: import_ag_charts_core187.padding, fill: import_ag_charts_core187.colorUnion, fillOpacity: import_ag_charts_core187.ratio, gradient: { preferredLength: import_ag_charts_core187.positiveNumber, thickness: import_ag_charts_core187.positiveNumber }, scale: { label: { ...import_ag_charts_core187.fontOptionsDef, minSpacing: import_ag_charts_core187.positiveNumber, format: import_ag_charts_core187.numberFormatValidator, formatter: import_ag_charts_core187.callback }, padding: import_ag_charts_core187.positiveNumber, interval: { step: import_ag_charts_core187.number, values: import_ag_charts_core187.array, minSpacing: (0, import_ag_charts_core187.and)(import_ag_charts_core187.positiveNumber, (0, import_ag_charts_core187.lessThan)("maxSpacing")), maxSpacing: (0, import_ag_charts_core187.and)(import_ag_charts_core187.positiveNumber, (0, import_ag_charts_core187.greaterThan)("minSpacing")) } } }, themeTemplate: { ...import_ag_charts_core187.LEGEND_CONTAINER_THEME, enabled: false, position: "bottom", spacing: 20, scale: { padding: 13, label: { color: { $ref: "textColor" }, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, minSpacing: 5 }, interval: { minSpacing: 15 } }, gradient: { preferredLength: 100, thickness: 16 }, reverseOrder: false, fill: { $applySwitch: [ { $path: "type" }, { $ref: "chartBackgroundColour" }, ["gradient", import_ag_charts_core187.FILL_GRADIENT_BLANK_DEFAULTS], ["pattern", import_ag_charts_core187.FILL_PATTERN_BLANK_DEFAULTS], ["image", import_ag_charts_core187.FILL_IMAGE_BLANK_DEFAULTS] ] } }, create: (ctx) => { const moduleInstance = new GradientLegend(ctx); moduleInstance.attachLegend(ctx.scene); return moduleInstance; } }; // packages/ag-charts-enterprise/src/series/chord/chordModule.ts var import_ag_charts_community170 = require("ag-charts-community"); var import_ag_charts_core193 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/charts/standaloneChartModule.ts var import_ag_charts_community164 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/charts/standaloneChart.ts var import_ag_charts_community163 = require("ag-charts-community"); var { Chart } = import_ag_charts_community163._ModuleSupport; var StandaloneChart = class extends Chart { getChartType() { return "standalone"; } performLayout(ctx) { const { seriesRoot, annotationRoot } = this; const seriesRect = ctx.layoutBox.clone().shrink(this.seriesArea.getPadding()); this.seriesRect = seriesRect; this.animationRect = seriesRect; for (const group of [seriesRoot, annotationRoot]) { group.translationX = Math.floor(seriesRect.x); group.translationY = Math.floor(seriesRect.y); } seriesRoot.visible = this.series[0].visible; this.ctx.layoutManager.emitLayoutComplete(ctx, { series: { visible: true, rect: seriesRect, paddedRect: ctx.layoutBox } }); } getAriaLabel() { const seriesType = this.series[0]?.type; if (seriesType == null) return ""; const caption = this.getCaptionText(); switch (seriesType) { case "radial-gauge": case "linear-gauge": { const captions = []; if (caption.length !== 0) { captions.push(caption); } for (const series of this.series) { captions.push(series.getCaptionText()); } return this.ctx.localeManager.t("ariaAnnounceGaugeChart", { caption: captions.join(". ") }); } case "treemap": case "sunburst": return this.ctx.localeManager.t("ariaAnnounceHierarchyChart", { caption }); default: { return this.ctx.localeManager.t("ariaAnnounceStandaloneChart", { caption }); } } } }; StandaloneChart.className = "StandaloneChart"; StandaloneChart.type = "standalone"; // packages/ag-charts-enterprise/src/charts/standaloneChartModule.ts var { standaloneChartOptionsDefs } = import_ag_charts_community164._ModuleSupport; var StandaloneChartModule = { type: "chart", name: "standalone", enterprise: true, version: import_ag_charts_community164.VERSION, options: standaloneChartOptionsDefs, create(options, resources) { return new StandaloneChart(options, resources); } }; // packages/ag-charts-enterprise/src/series/chord/chordSeries.ts var import_ag_charts_community168 = require("ag-charts-community"); var import_ag_charts_core191 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/flow-proportion/flowProportionSeries.ts var import_ag_charts_community165 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/series/flow-proportion/flowProportionUtil.ts var import_ag_charts_core188 = require("ag-charts-core"); function computeNodeGraph(nodes, links, includeCircularReferences) { if (!includeCircularReferences) { links = removeCircularLinks(links); } const nodeGraph = /* @__PURE__ */ new Map(); for (const datum of nodes) { const itemId = datum.datumIndex.type === 0 /* Link */ ? `link-${datum.datumIndex.index}` : `node-${datum.datumIndex.index}`; nodeGraph.set(datum.id, { itemId, datum, linksBefore: [], linksAfter: [], maxPathLengthBefore: -1, maxPathLengthAfter: -1 }); } let maxPathLength = 0; for (const [id, node] of nodeGraph.entries()) { maxPathLength = Math.max( maxPathLength, computePathLength(nodeGraph, links, node, id, -1, []) + computePathLength(nodeGraph, links, node, id, 1, []) + 1 ); } return { links, nodeGraph, maxPathLength }; } function findCircularLinks(links, link, into, stack) { const stackIndex = stack.indexOf(link); if (stackIndex !== -1) { for (let i = stackIndex; i < stack.length; i += 1) { into.add(stack[i]); } return; } stack.push(link); const { toNode } = link; for (const next of links) { if (next.fromNode === toNode) { findCircularLinks(links, next, into, stack); } } stack.pop(); } function removeCircularLinks(links) { const circularLinks = /* @__PURE__ */ new Set(); for (const link of links) { findCircularLinks(links, link, circularLinks, []); } if (circularLinks.size !== 0) { import_ag_charts_core188.Logger.warnOnce("Some links formed circular references. These will be removed from the output."); } return circularLinks.size === 0 ? links : links.filter((link) => !circularLinks.has(link)); } function computePathLength(nodeGraph, links, node, id, direction, stack) { if (stack.includes(id)) { return Infinity; } let maxPathLength = direction === -1 ? node.maxPathLengthBefore : node.maxPathLengthAfter; if (maxPathLength === -1) { maxPathLength = 0; const connectedLinks = direction === -1 ? node.linksBefore : node.linksAfter; for (const link of links) { const { fromNode, toNode } = link; const linkId = direction === -1 ? toNode.id : fromNode.id; const nextNodeId = direction === -1 ? fromNode.id : toNode.id; const nextNode = id === linkId ? nodeGraph.get(nextNodeId) : void 0; if (nextNode == null) continue; connectedLinks.push({ node: nextNode, link }); stack?.push(id); maxPathLength = Math.max( maxPathLength, computePathLength(nodeGraph, links, nextNode, nextNodeId, direction, stack) + 1 ); stack?.pop(); } if (direction === -1) { node.maxPathLengthBefore = maxPathLength; } else { node.maxPathLengthAfter = maxPathLength; } } return maxPathLength; } // packages/ag-charts-enterprise/src/series/flow-proportion/flowProportionSeries.ts var { findNodeDatumInArray, keyProperty: keyProperty7, valueProperty: valueProperty9, DataController, Group: Group10, HighlightState: HighlightState4, Selection: Selection5, Series, TransformableText } = import_ag_charts_community165._ModuleSupport; var FlowProportionSeriesNodeEvent = class extends import_ag_charts_community165._ModuleSupport.SeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); const { datumIndex } = datum; const nodeDatum = series.contextNodeData?.nodeData.find( (d) => d.datumIndex.type === datumIndex.type && d.datumIndex.index === datumIndex.index ); this.size = nodeDatum?.size; this.label = nodeDatum?.type === 1 /* Node */ ? nodeDatum?.label : void 0; } }; var FlowProportionSeries = class extends Series { constructor() { super(...arguments); this.NodeEvent = FlowProportionSeriesNodeEvent; this.nodeCount = 0; this.linkCount = 0; this.linksDataModel = void 0; this.linksProcessedData = void 0; this.nodesDataModel = void 0; this.nodesProcessedData = void 0; this.processedNodes = /* @__PURE__ */ new Map(); this.linkGroup = this.contentGroup.appendChild(new Group10({ name: "linkGroup" })); this.nodeGroup = this.contentGroup.appendChild(new Group10({ name: "nodeGroup" })); this.focusLinkGroup = this.highlightGroup.appendChild(new Group10({ name: "linkGroup" })); this.focusNodeGroup = this.highlightGroup.appendChild(new Group10({ name: "nodeGroup" })); this.highlightLinkGroup = this.highlightGroup.appendChild(new Group10({ name: "linkGroup" })); this.labelSelection = Selection5.select( this.labelGroup, TransformableText ); this.linkSelection = Selection5.select( this.linkGroup, () => this.linkFactory() ); this.nodeSelection = Selection5.select( this.nodeGroup, () => this.nodeFactory() ); this.focusLinkSelection = Selection5.select( this.focusLinkGroup, () => this.linkFactory() ); this.focusNodeSelection = Selection5.select( this.focusNodeGroup, () => this.nodeFactory() ); this.highlightLinkSelection = Selection5.select( this.highlightLinkGroup, () => this.linkFactory() ); this.highlightNodeSelection = Selection5.select( this.highlightNodeGroup, () => this.nodeFactory() ); } get nodes() { return this.properties.nodes; } async processData(dataController) { const { data, nodes } = this; if (data == null) return; const { fromKey, toKey, sizeKey, idKey, labelKey } = this.properties; const nodesDataController = new DataController( "standalone", dataController.suppressFieldDotNotation, this.ctx.eventsHub ); const nodesDataModelPromise = nodes == null ? null : nodesDataController.request( this.id, import_ag_charts_community165._ModuleSupport.DataSet.wrap(nodes) ?? import_ag_charts_community165._ModuleSupport.DataSet.empty(), { props: [ keyProperty7(idKey, void 0, { id: "idValue", includeProperty: false }), ...labelKey == null ? [] : [valueProperty9(labelKey, void 0, { id: "labelValue", includeProperty: false })] ], groupByKeys: true } ); const linksDataModelPromise = dataController.request(this.id, data, { props: [ valueProperty9(fromKey, void 0, { id: "fromValue", includeProperty: false }), valueProperty9(toKey, void 0, { id: "toValue", includeProperty: false }), ...sizeKey == null ? [] : [ valueProperty9(sizeKey, void 0, { id: "sizeValue", includeProperty: false, missingValue: 0 }) ] ], groupByKeys: false }); if (nodes != null) { nodesDataController.execute(); } const [nodesDataModel, linksDataModel] = await Promise.all([ nodesDataModelPromise ?? Promise.resolve(null), linksDataModelPromise ]); this.nodesDataModel = nodesDataModel?.dataModel; this.nodesProcessedData = nodesDataModel?.processedData; this.linksDataModel = linksDataModel?.dataModel; this.linksProcessedData = linksDataModel?.processedData; const processedNodes = /* @__PURE__ */ new Map(); if (nodesDataModel == null) { const fromIdValues = linksDataModel.dataModel.resolveColumnById( this, "fromValue", linksDataModel.processedData ); const toIdValues = linksDataModel.dataModel.resolveColumnById( this, "toValue", linksDataModel.processedData ); const createImplicitNode = (id) => { const datumIndex = processedNodes.size; const label = id; return { series: this, itemId: `node-${datumIndex}`, datum: {}, // Must be a referential object for tooltips datumIndex: { type: 1 /* Node */, index: datumIndex }, type: 1 /* Node */, index: datumIndex, linksBefore: [], linksAfter: [], id, size: 0, label, style: this.getNodeStyle( { datumIndex: { type: 1 /* Node */, index: datumIndex }, datum: {}, size: 0, label }, datumIndex, false ) }; }; const linkData = linksDataModel.processedData.dataSources.get(this.id)?.data; if (linkData) { for (const [datumIndex] of linkData.entries()) { const fromId = fromIdValues[datumIndex]; const toId = toIdValues[datumIndex]; if (fromId == null || toId == null) continue; if (!processedNodes.has(fromId)) { processedNodes.set(fromId, createImplicitNode(fromId)); } if (!processedNodes.has(toId)) { processedNodes.set(toId, createImplicitNode(toId)); } } } } else { const nodeIdValues = nodesDataModel.dataModel.resolveColumnById( this, "idValue", nodesDataModel.processedData ); const labelValues = labelKey == null ? void 0 : nodesDataModel.dataModel.resolveColumnById( this, "labelValue", nodesDataModel.processedData ); const nodeData = nodesDataModel.processedData.dataSources.get(this.id)?.data; if (nodeData) { for (const [datumIndex, datum] of nodeData.entries()) { const id = nodeIdValues[datumIndex]; const label = labelValues?.[datumIndex]; const nodeDatumIndex = { type: 1 /* Node */, index: datumIndex }; processedNodes.set(id, { series: this, itemId: `node-${datumIndex}`, datum, datumIndex: nodeDatumIndex, type: 1 /* Node */, index: datumIndex, linksBefore: [], linksAfter: [], id, size: 0, label, style: this.getNodeStyle( { datumIndex: nodeDatumIndex, datum, size: 0, label }, datumIndex, false ) }); } } } this.processedNodes = processedNodes; } findNodeDatum(itemId) { return findNodeDatumInArray(itemId, this.contextNodeData?.nodeData); } getNodeGraph(createNode, createLink, { includeCircularReferences }) { const { linksDataModel, linksProcessedData } = this; if (linksDataModel == null || linksProcessedData == null) { const { links: links2, nodeGraph: nodeGraph2, maxPathLength: maxPathLength2 } = computeNodeGraph( (/* @__PURE__ */ new Map()).values(), [], includeCircularReferences ); this.nodeCount = 0; this.linkCount = 0; return { nodeGraph: nodeGraph2, links: links2, maxPathLength: maxPathLength2 }; } const { sizeKey } = this.properties; const fromIdValues = linksDataModel.resolveColumnById(this, "fromValue", linksProcessedData); const toIdValues = linksDataModel.resolveColumnById(this, "toValue", linksProcessedData); const sizeValues = sizeKey == null ? void 0 : linksDataModel.resolveColumnById(this, "sizeValue", linksProcessedData); const nodesById = /* @__PURE__ */ new Map(); for (const datum of this.processedNodes.values()) { const node = createNode(datum); nodesById.set(datum.id, node); } const baseLinks = []; const linkData = linksProcessedData.dataSources.get(this.id)?.data; if (linkData) { for (const [datumIndex, datum] of linkData.entries()) { const fromId = fromIdValues[datumIndex]; const toId = toIdValues[datumIndex]; const size = sizeValues == null ? 1 : sizeValues[datumIndex]; const fromNode = nodesById.get(fromId); const toNode = nodesById.get(toId); if (size <= 0 || fromNode == null || toNode == null) continue; const linkNodeDatumIndex = { type: 0 /* Link */, index: datumIndex }; const link = createLink({ series: this, itemId: `link-${datumIndex}`, datum, datumIndex: linkNodeDatumIndex, type: 0 /* Link */, index: datumIndex, fromNode, toNode, size, style: this.getLinkStyle( { datum, datumIndex: linkNodeDatumIndex }, fromNode.datumIndex, false ) }); baseLinks.push(link); } } const { links, nodeGraph, maxPathLength } = computeNodeGraph( nodesById.values(), baseLinks, includeCircularReferences ); for (const node of nodeGraph.values()) { node.datum.linksBefore = node.linksBefore.map((linkedNode) => linkedNode.link); node.datum.linksAfter = node.linksAfter.map((linkedNode) => linkedNode.link); } this.nodeCount = nodeGraph.size; this.linkCount = links.length; return { nodeGraph, links, maxPathLength }; } updateSelections() { if (this.nodeDataRefresh) { this.contextNodeData = this.createNodeData(); this.nodeDataRefresh = false; } } update(opts) { const { seriesRect } = opts; const newNodeDataDependencies = { seriesRectWidth: seriesRect?.width ?? 0, seriesRectHeight: seriesRect?.height ?? 0 }; if (this._nodeDataDependencies == null || this._nodeDataDependencies.seriesRectWidth !== newNodeDataDependencies.seriesRectWidth || this._nodeDataDependencies.seriesRectHeight !== newNodeDataDependencies.seriesRectHeight) { this._nodeDataDependencies = newNodeDataDependencies; } this.updateSelections(); const nodeData = this.contextNodeData?.nodeData ?? []; const labelData = this.contextNodeData?.labelData ?? []; const highlightedDatum = this.getHighlightedDatum(); this.contentGroup.visible = this.visible; const highlightState = highlightedDatum == null ? HighlightState4.None : HighlightState4.OtherItem; this.contentGroup.opacity = this.properties.highlight.getStyle(highlightState).opacity ?? 1; this.labelSelection = this.updateLabelSelection({ labelData, labelSelection: this.labelSelection }); this.updateLabelNodes({ labelSelection: this.labelSelection }); this.linkSelection = this.updateLinkSelection({ nodeData: nodeData.filter((d) => d.type === 0 /* Link */), datumSelection: this.linkSelection }); this.updateLinkNodes({ datumSelection: this.linkSelection, isHighlight: false }); this.nodeSelection = this.updateNodeSelection({ nodeData: nodeData.filter((d) => d.type === 1 /* Node */), datumSelection: this.nodeSelection }); this.updateNodeNodes({ datumSelection: this.nodeSelection, isHighlight: false }); let focusLinkSelection; let focusNodeSelection; let highlightLinkSelection; let highlightNodeSelection; if (highlightedDatum?.type === 1 /* Node */) { focusLinkSelection = nodeData.filter((node) => { return node.type === 0 /* Link */ && (node.toNode === highlightedDatum || node.fromNode === highlightedDatum); }); focusNodeSelection = focusLinkSelection.map((link) => { return link.fromNode === highlightedDatum ? link.toNode : link.fromNode; }); focusNodeSelection.push(highlightedDatum); highlightLinkSelection = []; highlightNodeSelection = [highlightedDatum]; } else if (highlightedDatum?.type === 0 /* Link */) { focusLinkSelection = [highlightedDatum]; focusNodeSelection = [highlightedDatum.fromNode, highlightedDatum.toNode]; highlightLinkSelection = [highlightedDatum]; highlightNodeSelection = []; } else { focusLinkSelection = []; focusNodeSelection = []; highlightLinkSelection = []; highlightNodeSelection = []; } this.focusLinkSelection = this.updateLinkSelection({ nodeData: focusLinkSelection, datumSelection: this.focusLinkSelection }); this.updateLinkNodes({ datumSelection: this.focusLinkSelection, isHighlight: false }); this.focusNodeSelection = this.updateNodeSelection({ nodeData: focusNodeSelection, datumSelection: this.focusNodeSelection }); this.updateNodeNodes({ datumSelection: this.focusNodeSelection, isHighlight: false }); this.highlightLinkSelection = this.updateLinkSelection({ nodeData: highlightLinkSelection, datumSelection: this.highlightLinkSelection }); this.updateLinkNodes({ datumSelection: this.highlightLinkSelection, isHighlight: true }); this.highlightNodeSelection = this.updateNodeSelection({ nodeData: highlightNodeSelection, datumSelection: this.highlightNodeSelection }); this.updateNodeNodes({ datumSelection: this.highlightNodeSelection, isHighlight: true }); } getHighlightedDatum() { let highlightedDatum = this.ctx.highlightManager?.getActiveHighlight(); if (highlightedDatum?.series === this && highlightedDatum.type == null) { const { itemId } = highlightedDatum; const nodeData = this.contextNodeData?.nodeData ?? []; highlightedDatum = itemId == null ? void 0 : nodeData.find((node) => node.type === 1 /* Node */ && node.id === itemId); } else if (highlightedDatum?.series !== this) { highlightedDatum = void 0; } return highlightedDatum; } isLabelHighlighted(datum, activeHighlight) { if (activeHighlight == null) return false; if (activeHighlight.type === 1 /* Node */) { return activeHighlight === datum; } if (activeHighlight.type === 0 /* Link */) { return activeHighlight.fromNode === datum || activeHighlight.toNode === datum; } return false; } resetAnimation(_chartAnimationPhase) { } dataCount() { return Number.NaN; } getSeriesDomain(_direction) { return { domain: [] }; } getSeriesRange(_direction, _visibleRange) { return [Number.NaN, Number.NaN]; } legendItemSymbol(_type, nodeIndex, format = {}) { const { fills, strokes } = this.properties; const { fill = fills[nodeIndex % fills.length], fillOpacity = 1, stroke: stroke3 = strokes[nodeIndex % strokes.length], strokeWidth = 0, strokeOpacity = 1, lineDash = [0], lineDashOffset = 0 } = format; return { marker: { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } }; } getLegendData(legendType) { if (legendType !== "category") return []; const { showInLegend } = this.properties; return Array.from( this.processedNodes.values(), ({ id, label }, nodeIndex) => ({ legendType: "category", id: this.id, itemId: id, seriesId: this.id, enabled: true, label: { text: label ?? id }, symbol: this.legendItemSymbol(1 /* Node */, nodeIndex), hideInLegend: !showInLegend, isFixed: true }) ); } pickNodeClosestDatum({ x, y }) { let minDistanceSquared = Infinity; let minDatum; this.linkSelection.each((node, datum) => { const distanceSquared = node.distanceSquared(x, y); if (distanceSquared < minDistanceSquared) { minDistanceSquared = distanceSquared; minDatum = datum; } }); this.nodeSelection.each((node, datum) => { const distanceSquared = node.distanceSquared(x, y); if (distanceSquared < minDistanceSquared) { minDistanceSquared = distanceSquared; minDatum = datum; } }); return minDatum == null ? void 0 : { datum: minDatum, distance: Math.sqrt(minDistanceSquared) }; } getDatumAriaText(datum, description) { if (datum.type === 0 /* Link */) { return this.ctx.localeManager.t("ariaAnnounceFlowProportionLink", { index: datum.index + 1, count: this.linkCount, from: datum.fromNode.id, to: datum.toNode.id, size: datum.size, sizeName: this.properties.sizeName ?? this.properties.sizeKey }); } else if (datum.type === 1 /* Node */) { return this.ctx.localeManager.t("ariaAnnounceFlowProportionNode", { index: datum.index + 1, count: this.nodeCount, description }); } } pickFocus(opts) { const { datumIndexDelta: childDelta, otherIndexDelta: depthDelta } = opts; const currentNodeDatum = this.contextNodeData?.nodeData[opts.datumIndex - opts.datumIndexDelta]; let nextNodeDatum = currentNodeDatum; if (depthDelta !== 0 || childDelta === 0) return; if (currentNodeDatum?.type === 0 /* Link */) { const allLinks = Array.from(this.linkSelection, (link) => link.datum); const selfIndex = allLinks.indexOf(currentNodeDatum); const nextIndex = selfIndex + childDelta; if (nextIndex >= 0 && nextIndex < allLinks.length) { nextNodeDatum = allLinks[nextIndex]; } else if (nextIndex > 0) { nextNodeDatum = allLinks.at(-1); } else { const allNodes = Array.from(this.nodeSelection, (node) => node.datum); nextNodeDatum = allNodes.at(-1); } } else if (currentNodeDatum?.type === 1 /* Node */) { const allNodes = Array.from(this.nodeSelection, (node) => node.datum); const selfIndex = allNodes.indexOf(currentNodeDatum); const nextIndex = selfIndex + childDelta; if (nextIndex >= 0 && nextIndex < allNodes.length) { nextNodeDatum = allNodes[nextIndex]; } else if (nextIndex < 0) { nextNodeDatum = allNodes[0]; } else { const allLinks = Array.from(this.linkSelection, (link) => link.datum); nextNodeDatum = allLinks[0]; } } if (nextNodeDatum == null) return; const nodeDatum = nextNodeDatum.type === 1 /* Node */ ? Array.from(this.nodeSelection).find((n) => n.datum === nextNodeDatum) : Array.from(this.linkSelection).find((n) => n.datum === nextNodeDatum); if (nodeDatum == null) return; const bounds = this.computeFocusBounds(nodeDatum.node); if (bounds == null) return; return { datum: nodeDatum.datum, datumIndex: this.contextNodeData?.nodeData.indexOf(nodeDatum.datum) ?? 0, otherIndex: 0, bounds, clipFocusBox: true }; } getCategoryValue(_datumIndex) { return; } datumIndexForCategoryValue(_categoryValue) { return; } }; // packages/ag-charts-enterprise/src/series/chord/chordLink.ts var import_ag_charts_community166 = require("ag-charts-community"); var import_ag_charts_core189 = require("ag-charts-core"); var { Path: Path9 } = import_ag_charts_community166._ModuleSupport; function bezierControlPoints({ radius, startAngle, endAngle, tension }) { const cp0x = radius * Math.cos(startAngle); const cp0y = radius * Math.sin(startAngle); const cp3x = radius * Math.cos(endAngle); const cp3y = radius * Math.sin(endAngle); const cp1x = cp0x * tension; const cp1y = cp0y * tension; const cp2x = cp3x * tension; const cp2y = cp3y * tension; return { x: [cp0x, cp1x, cp2x, cp3x], y: [cp0y, cp1y, cp2y, cp3y] }; } var ChordLink = class extends Path9 { constructor() { super(...arguments); this.centerX = 0; this.centerY = 0; this.radius = 0; this.startAngle1 = 0; this.endAngle1 = 0; this.startAngle2 = 0; this.endAngle2 = 0; this.tension = 1; } tensionedCurveTo(cp0x, cp0y, cp1x, cp1y, cp2x, cp2y, cp3x, cp3y) { const { path, tension } = this; const scale = 1 - tension; path.cubicCurveTo( (cp1x - cp0x) * scale + cp0x, (cp1y - cp0y) * scale + cp0y, (cp2x - cp3x) * scale + cp3x, (cp2y - cp3y) * scale + cp3y, cp3x, cp3y ); } updatePath() { const { path, centerX, centerY, radius } = this; let { startAngle1, endAngle1, startAngle2, endAngle2 } = this; if (startAngle1 > startAngle2) { [startAngle1, startAngle2] = [startAngle2, startAngle1]; [endAngle1, endAngle2] = [endAngle2, endAngle1]; } path.clear(); const startX = centerX + radius * Math.cos(startAngle1); const startY = centerY + radius * Math.sin(startAngle1); path.moveTo(startX, startY); this.tensionedCurveTo( startX, startY, centerX, centerY, centerX, centerY, centerX + radius * Math.cos(endAngle2), centerY + radius * Math.sin(endAngle2) ); path.arc(centerX, centerY, radius, endAngle2, startAngle2, true); this.tensionedCurveTo( centerX + radius * Math.cos(startAngle2), centerY + radius * Math.sin(startAngle2), centerX, centerY, centerX, centerY, centerX + radius * Math.cos(endAngle1), centerY + radius * Math.sin(endAngle1) ); path.arc(centerX, centerY, radius, endAngle1, startAngle1, true); path.closePath(); } }; __decorateClass([ (0, import_ag_charts_core189.SceneChangeDetection)() ], ChordLink.prototype, "centerX", 2); __decorateClass([ (0, import_ag_charts_core189.SceneChangeDetection)() ], ChordLink.prototype, "centerY", 2); __decorateClass([ (0, import_ag_charts_core189.SceneChangeDetection)() ], ChordLink.prototype, "radius", 2); __decorateClass([ (0, import_ag_charts_core189.SceneChangeDetection)() ], ChordLink.prototype, "startAngle1", 2); __decorateClass([ (0, import_ag_charts_core189.SceneChangeDetection)() ], ChordLink.prototype, "endAngle1", 2); __decorateClass([ (0, import_ag_charts_core189.SceneChangeDetection)() ], ChordLink.prototype, "startAngle2", 2); __decorateClass([ (0, import_ag_charts_core189.SceneChangeDetection)() ], ChordLink.prototype, "endAngle2", 2); __decorateClass([ (0, import_ag_charts_core189.SceneChangeDetection)() ], ChordLink.prototype, "tension", 2); // packages/ag-charts-enterprise/src/series/chord/chordSeriesProperties.ts var import_ag_charts_community167 = require("ag-charts-community"); var import_ag_charts_core190 = require("ag-charts-core"); var { FillGradientDefaults: FillGradientDefaults2, FillPatternDefaults: FillPatternDefaults2, FillImageDefaults: FillImageDefaults2, makeSeriesTooltip: makeSeriesTooltip8, SeriesProperties, Label: Label6 } = import_ag_charts_community167._ModuleSupport; var ChordSeriesLabelProperties = class extends Label6 { constructor() { super(...arguments); this.spacing = 1; this.maxWidth = 1; } }; __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLabelProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLabelProperties.prototype, "maxWidth", 2); var ChordSeriesLinkProperties = class extends import_ag_charts_core190.BaseProperties { constructor() { super(...arguments); this.fill = void 0; this.fillOpacity = 1; this.stroke = void 0; this.strokeOpacity = 1; this.strokeWidth = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.tension = 0; } getStyle(fills, strokes, index) { const { fillOpacity, strokeWidth, strokeOpacity, lineDash, lineDashOffset, tension } = this; const fill = this.fill ?? fills[index % fills.length]; const stroke3 = this.stroke ?? strokes[index % fills.length]; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, tension }; } }; __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLinkProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLinkProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLinkProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLinkProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLinkProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLinkProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLinkProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLinkProperties.prototype, "tension", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesLinkProperties.prototype, "itemStyler", 2); var ChordSeriesNodeProperties = class extends import_ag_charts_core190.BaseProperties { constructor() { super(...arguments); this.spacing = 1; this.width = 1; this.fill = void 0; this.fillOpacity = 1; this.stroke = void 0; this.strokeOpacity = 1; this.strokeWidth = 1; this.lineDash = [0]; this.lineDashOffset = 0; } getStyle(fills, strokes, index) { const { fillOpacity, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; const fill = this.fill ?? fills[index % fills.length]; const stroke3 = this.stroke ?? strokes[index % fills.length]; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }; } }; __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "width", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesNodeProperties.prototype, "itemStyler", 2); var ChordSeriesProperties = class extends SeriesProperties { constructor() { super(...arguments); this.idKey = ""; this.idName = void 0; this.labelKey = void 0; this.labelName = void 0; this.sizeKey = void 0; this.sizeName = void 0; this.nodes = void 0; this.fillGradientDefaults = new FillGradientDefaults2(); this.fillPatternDefaults = new FillPatternDefaults2(); this.fillImageDefaults = new FillImageDefaults2(); this.fills = []; this.strokes = []; this.label = new ChordSeriesLabelProperties(); this.link = new ChordSeriesLinkProperties(); this.node = new ChordSeriesNodeProperties(); this.tooltip = makeSeriesTooltip8(); } }; __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "fromKey", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "toKey", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "idKey", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "idName", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "labelKey", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "labelName", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "sizeKey", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "sizeName", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "nodes", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "fillGradientDefaults", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "fillPatternDefaults", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "fillImageDefaults", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "fills", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "strokes", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "link", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "node", 2); __decorateClass([ import_ag_charts_core190.Property ], ChordSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/chord/chordSeries.ts var { SeriesNodePickMode: SeriesNodePickMode6, createDatumId: createDatumId7, Sector: Sector3, getShapeStyle, getLabelStyles, BBox: BBox17 } = import_ag_charts_community168._ModuleSupport; var nodeMidAngle = (node) => node.startAngle + (0, import_ag_charts_core191.angleBetween)(node.startAngle, node.endAngle) / 2; var ChordSeries = class extends FlowProportionSeries { constructor(moduleCtx) { super({ moduleCtx, pickModes: [SeriesNodePickMode6.NEAREST_NODE, SeriesNodePickMode6.EXACT_SHAPE_MATCH] }); this.properties = new ChordSeriesProperties(); } isLabelEnabled() { return (this.properties.labelKey != null || this.nodes == null) && this.properties.label.enabled; } linkFactory() { return new ChordLink(); } nodeFactory() { return new Sector3(); } createNodeData() { const { id: seriesId, _nodeDataDependencies: { seriesRectWidth, seriesRectHeight } = { seriesRectWidth: 0, seriesRectHeight: 0 }, properties } = this; const { fromKey, toKey, sizeKey, labelKey, label: { spacing: labelSpacing, maxWidth: labelMaxWidth, fontSize }, node: { width: nodeWidth, spacing: nodeSpacing } } = properties; const centerX = seriesRectWidth / 2; const centerY = seriesRectHeight / 2; let labelData = []; const { nodeGraph, links } = this.getNodeGraph( (node) => ({ ...node, centerX, centerY, innerRadius: Number.NaN, outerRadius: Number.NaN, startAngle: Number.NaN, endAngle: Number.NaN }), (link) => ({ ...link, centerX, centerY, radius: Number.NaN, startAngle1: Number.NaN, endAngle1: Number.NaN, startAngle2: Number.NaN, endAngle2: Number.NaN }), { includeCircularReferences: true } ); let totalSize = 0; for (const [id, { datum: node, linksBefore, linksAfter }] of nodeGraph.entries()) { const size = linksBefore.reduce((acc, { link }) => acc + link.size, 0) + linksAfter.reduce((acc, { link }) => acc + link.size, 0); if (size === 0) { nodeGraph.delete(id); } else { const { label } = properties; node.size = size; totalSize += node.size; const labelText = label.enabled ? this.getLabelText( node.label, node.datum, labelKey, "label", [], label, { datum: node.datum, value: node.label, fromKey, toKey, sizeKey, size: node.size } ) : void 0; node.label = (0, import_ag_charts_core191.toPlainText)(labelText); } } let labelInset = 0; if (this.isLabelEnabled()) { const measurer3 = (0, import_ag_charts_core191.cachedTextMeasurer)(this.properties.label); let maxMeasuredLabelWidth = 0; for (const { datum: node } of nodeGraph.values()) { const { id, label } = node; if (label == null) continue; const text2 = (0, import_ag_charts_core191.wrapText)(label, { maxWidth: labelMaxWidth, font: this.properties.label, textWrap: "never" }); const { width } = measurer3.measureLines(text2); maxMeasuredLabelWidth = Math.max(width, maxMeasuredLabelWidth); labelData.push({ id, text: text2, centerX, centerY, angle: Number.NaN, radius: Number.NaN, size: node.size, datumIndex: node.datumIndex, nodeDatum: node }); } labelInset = maxMeasuredLabelWidth + labelSpacing; } const nodeCount = nodeGraph.size; let radius = Math.min(seriesRectWidth, seriesRectHeight) / 2 - nodeWidth - labelInset; let spacingSweep = nodeSpacing / radius; if (labelInset !== 0 && (nodeCount * spacingSweep >= 1.5 * Math.PI || radius <= 0)) { labelData = []; radius = Math.min(seriesRectWidth, seriesRectHeight) / 2 - nodeWidth; spacingSweep = nodeSpacing / radius; } if (nodeCount * spacingSweep >= 2 * Math.PI || radius <= 0) { import_ag_charts_core191.Logger.warnOnce("There was insufficient space to display the Chord Series."); return; } const innerRadius = radius; const outerRadius = radius + nodeWidth; const sizeScale = Math.max((2 * Math.PI - nodeCount * spacingSweep) / totalSize, 0); let nodeAngle = 0; for (const { datum: node } of nodeGraph.values()) { node.innerRadius = innerRadius; node.outerRadius = outerRadius; node.startAngle = nodeAngle; node.endAngle = nodeAngle + node.size * sizeScale; nodeAngle = node.endAngle + spacingSweep; const midR = (node.innerRadius + node.outerRadius) / 2; const midAngle = nodeMidAngle(node); node.midPoint = { x: node.centerX + midR * Math.cos(midAngle), y: node.centerY + midR * Math.sin(midAngle) }; } const nodeData = []; for (const { datum: node, linksBefore, linksAfter } of nodeGraph.values()) { const midAngle = nodeMidAngle(node); const combinedLinks = [ ...linksBefore.map((l) => ({ link: l.link, distance: (0, import_ag_charts_core191.angleBetween)(nodeMidAngle(l.node.datum), midAngle), after: false })), ...linksAfter.map((l) => ({ link: l.link, distance: (0, import_ag_charts_core191.angleBetween)(nodeMidAngle(l.node.datum), midAngle), after: true })) ]; let linkAngle = node.startAngle; for (const { link, after } of combinedLinks.toSorted((a, b) => a.distance - b.distance)) { const linkSweep = link.size * sizeScale; if (after) { link.startAngle1 = linkAngle; link.endAngle1 = linkAngle + linkSweep; } else { link.startAngle2 = linkAngle; link.endAngle2 = linkAngle + linkSweep; } linkAngle += link.size * sizeScale; } nodeData.push(node); } const { tension } = this.properties.link; for (const link of links) { link.radius = radius; const outer = bezierControlPoints({ radius, startAngle: link.startAngle1, endAngle: link.endAngle2, tension }); const inner = bezierControlPoints({ radius, startAngle: link.startAngle2, endAngle: link.endAngle1, tension }); const outerX = (0, import_ag_charts_core191.evaluateBezier)(...outer.x, 0.5); const outerY = (0, import_ag_charts_core191.evaluateBezier)(...outer.y, 0.5); const innerX = (0, import_ag_charts_core191.evaluateBezier)(...inner.x, 0.5); const innerY = (0, import_ag_charts_core191.evaluateBezier)(...inner.y, 0.5); link.midPoint = { x: link.centerX + (outerX + innerX) / 2, y: link.centerY + (outerY + innerY) / 2 }; nodeData.push(link); } for (const label of labelData) { const node = nodeGraph.get(label.id)?.datum; if (node == null) continue; label.radius = outerRadius + labelSpacing; label.angle = (0, import_ag_charts_core191.normalizeAngle360)(node.startAngle + (0, import_ag_charts_core191.angleBetween)(node.startAngle, node.endAngle) / 2); label.datumIndex = node.datumIndex; label.nodeDatum = node; } labelData.sort((a, b) => a.angle - b.angle); let minAngle = Infinity; let maxAngle = -Infinity; labelData = labelData.filter((label) => { const labelHeight = (0, import_ag_charts_core191.calcLineHeight)(fontSize); const da = Math.atan2(labelHeight / 2, label.radius); const a0 = label.angle - da; const a1 = label.angle + da; if ((0, import_ag_charts_core191.isBetweenAngles)(minAngle, a0, a1)) return false; if ((0, import_ag_charts_core191.isBetweenAngles)(maxAngle, a0, a1)) return false; minAngle = Math.min(a0, minAngle); maxAngle = Math.max(a1, maxAngle); return true; }); return { itemId: seriesId, nodeData, labelData }; } updateLabelSelection(opts) { const labels = this.isLabelEnabled() ? opts.labelData : []; return opts.labelSelection.update(labels); } updateLabelNodes(opts) { const params = { toKey: this.properties.toKey, fromKey: this.properties.fromKey, sizeKey: this.properties.sizeKey, size: Number.NaN }; const activeHighlightDatum = this.getHighlightedDatum(); opts.labelSelection.each((label, labelNodeDatum) => { const { size, text: text2, centerX, centerY, radius, angle, datumIndex, nodeDatum } = labelNodeDatum; params.size = size; const isHighlight = this.isLabelHighlighted(nodeDatum, activeHighlightDatum); const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); const style = getLabelStyles( this, void 0, params, this.properties.label, isHighlight, activeHighlightDatum ); const { fontStyle, fontWeight, fontSize, fontFamily, color: fill } = style; label.visible = true; label.translationX = centerX + radius * Math.cos(angle); label.translationY = centerY + radius * Math.sin(angle); label.text = text2; label.fill = fill; label.fontStyle = fontStyle; label.fontWeight = fontWeight; label.fontSize = fontSize; label.fontFamily = fontFamily; label.textBaseline = "middle"; if (Math.cos(angle) >= 0) { label.textAlign = "left"; label.rotation = angle; } else { label.textAlign = "right"; label.rotation = angle - Math.PI; } const opacity = highlightStyle.opacity ?? 1; label.opacity = opacity; label.fillOpacity = opacity; label.setBoxing(style); }); } updateNodeSelection(opts) { return opts.datumSelection.update(opts.nodeData, void 0, (datum) => createDatumId7(datum.type, datum.id)); } getNodeStyle(nodeDatum, fromNodeDatumIndex, isHighlight) { const { properties } = this; const { fills, strokes, fillGradientDefaults: fillGradientDefaults3, fillPatternDefaults: fillPatternDefaults3, fillImageDefaults: fillImageDefaults3 } = properties; const { itemStyler } = properties.node; const highlightStyle = this.getHighlightStyle(isHighlight, nodeDatum.datumIndex); const baseStyle = (0, import_ag_charts_core191.mergeDefaults)(highlightStyle, properties.node.getStyle(fills, strokes, fromNodeDatumIndex)); let style = getShapeStyle(baseStyle, fillGradientDefaults3, fillPatternDefaults3, fillImageDefaults3); if (itemStyler != null && nodeDatum.datumIndex != null) { const overrides = this.cachedDatumCallback( createDatumId7(nodeDatum.datumIndex.index, "node", isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(nodeDatum, isHighlight, style); return this.callWithContext(itemStyler, params); } ); if (overrides) { style = getShapeStyle( (0, import_ag_charts_core191.mergeDefaults)(overrides, style), fillGradientDefaults3, fillPatternDefaults3, fillImageDefaults3 ); } } style.opacity = 1; return style; } makeItemStylerParams({ datum, datumIndex, size = 0, label }, isHighlight, style) { const { id: seriesId } = this; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum, highlightState, ...style, size, label, fill }; } updateNodeNodes(opts) { const { datumSelection, isHighlight } = opts; const fillBBox = this.getShapeFillBBox(); datumSelection.each((sector, datum) => { const { datumIndex } = datum; const style = this.getNodeStyle(datum, datumIndex.index, isHighlight); sector.setStyleProperties(style, fillBBox); sector.centerX = datum.centerX; sector.centerY = datum.centerY; sector.innerRadius = datum.innerRadius; sector.outerRadius = datum.outerRadius; sector.startAngle = datum.startAngle; sector.endAngle = datum.endAngle; sector.inset = sector.strokeWidth / 2; }); } updateLinkSelection(opts) { return opts.datumSelection.update( opts.nodeData, void 0, (datum) => createDatumId7(datum.type, datum.index, datum.fromNode.id, datum.toNode.id) ); } getLinkStyle({ datumIndex, datum }, fromNodeDatumIndex, isHighlight) { const { id: seriesId, properties } = this; const { fills, strokes, fillGradientDefaults: fillGradientDefaults3, fillPatternDefaults: fillPatternDefaults3, fillImageDefaults: fillImageDefaults3 } = properties; const { itemStyler } = properties.link; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); const baseStyle = (0, import_ag_charts_core191.mergeDefaults)( highlightStyle, properties.link.getStyle(fills, strokes, fromNodeDatumIndex.index) ); let style = getShapeStyle(baseStyle, fillGradientDefaults3, fillPatternDefaults3, fillImageDefaults3); if (itemStyler != null && datumIndex != null) { const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const overrides = this.cachedDatumCallback( createDatumId7(datumIndex.index, "link", isHighlight ? "highlight" : "node"), () => { const highlightState = this.getHighlightStateString( activeHighlight, isHighlight, fromNodeDatumIndex ); return this.callWithContext(itemStyler, { seriesId, datum, highlightState, ...style }); } ); if (overrides) { style = getShapeStyle( (0, import_ag_charts_core191.mergeDefaults)(overrides, style), fillGradientDefaults3, fillPatternDefaults3, fillImageDefaults3 ); } } style.opacity = 1; return style; } updateLinkNodes(opts) { const { datumSelection, isHighlight } = opts; const fillBBox = this.getShapeFillBBox(); datumSelection.each((link, datum) => { const fromNodeDatumIndex = datum.fromNode.datumIndex; const style = this.getLinkStyle(datum, fromNodeDatumIndex, isHighlight); link.centerX = datum.centerX; link.centerY = datum.centerY; link.radius = datum.radius; link.startAngle1 = datum.startAngle1; link.endAngle1 = datum.endAngle1; link.startAngle2 = datum.startAngle2; link.endAngle2 = datum.endAngle2; link.tension = style.tension; link.setStyleProperties(style, fillBBox); }); } getShapeFillBBox() { const width = this._nodeDataDependencies?.seriesRectWidth ?? 0; const height = this._nodeDataDependencies?.seriesRectHeight ?? 0; const size = Math.min(width, height); const x = (width - size) / 2; const y = (height - size) / 2; const bbox = new BBox17(x, y, width, height); return { series: bbox, axis: bbox }; } getTooltipContent(datumIndex) { const { id: seriesId, linksProcessedData, nodesProcessedData, properties, ctx: { formatManager } } = this; const { fromKey, toKey, sizeKey, sizeName, tooltip } = properties; const seriesDatum = this.contextNodeData?.nodeData.find( (d) => d.datumIndex.type === datumIndex.type && d.datumIndex.index === datumIndex.index ); if (seriesDatum == null) return; const nodeIndex = seriesDatum.type === 0 /* Link */ ? seriesDatum.fromNode.index : seriesDatum.index; const title = seriesDatum.type === 0 /* Link */ ? `${seriesDatum.fromNode.label} - ${seriesDatum.toNode.label}` : seriesDatum.label; const datum = datumIndex.type === 0 /* Link */ ? linksProcessedData?.dataSources.get(this.id)?.data[datumIndex.index] : nodesProcessedData?.dataSources.get(this.id)?.data[datumIndex.index]; const size = seriesDatum.size; let format; if (seriesDatum.type === 0 /* Link */) { const fromNodeDatumIndex = seriesDatum.fromNode.datumIndex; format = this.getLinkStyle({ datumIndex, datum }, fromNodeDatumIndex, false); } else { const label = seriesDatum.label; format = this.getNodeStyle({ datumIndex, datum, size, label }, datumIndex.index, false); } const data = []; if (sizeKey != null) { const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: size, datum, seriesId, legendItemName: void 0, key: sizeKey, source: "tooltip", property: "size", domain: [], boundSeries: this.getFormatterContext("size"), fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: sizeName, fallbackLabel: sizeKey, value: content ?? String(size) }); } return this.formatTooltipWithContext( tooltip, { title, symbol: this.legendItemSymbol(seriesDatum.type, nodeIndex, format), data }, { seriesId, datum, title, fromKey, toKey, sizeKey, sizeName, size, ...format } ); } computeFocusBounds(node) { return node; } hasItemStylers() { return this.properties.node.itemStyler != null || this.properties.link.itemStyler != null || this.properties.label.itemStyler != null; } }; ChordSeries.className = "ChordSeries"; ChordSeries.type = "chord"; // packages/ag-charts-enterprise/src/series/chord/chordSeriesOptionsDef.ts var import_ag_charts_community169 = require("ag-charts-community"); var import_ag_charts_core192 = require("ag-charts-core"); var { chordSeriesThemeableOptionsDef } = import_ag_charts_community169._ModuleSupport; var chordSeriesOptionsDef = { ...chordSeriesThemeableOptionsDef, ...import_ag_charts_core192.commonSeriesOptionsDefs, type: (0, import_ag_charts_core192.required)((0, import_ag_charts_core192.constant)("chord")), fromKey: (0, import_ag_charts_core192.required)(import_ag_charts_core192.string), toKey: (0, import_ag_charts_core192.required)(import_ag_charts_core192.string), sizeKey: import_ag_charts_core192.string, sizeName: import_ag_charts_core192.string }; chordSeriesOptionsDef.fillGradientDefaults = (0, import_ag_charts_core192.undocumented)(import_ag_charts_core192.fillGradientDefaults); chordSeriesOptionsDef.fillPatternDefaults = (0, import_ag_charts_core192.undocumented)(import_ag_charts_core192.fillPatternDefaults); chordSeriesOptionsDef.fillImageDefaults = (0, import_ag_charts_core192.undocumented)(import_ag_charts_core192.fillImageDefaults); // packages/ag-charts-enterprise/src/series/chord/chordModule.ts var ChordSeriesModule = { type: "series", name: "chord", chartType: "standalone", enterprise: true, solo: true, version: import_ag_charts_community170.VERSION, dependencies: [StandaloneChartModule], options: chordSeriesOptionsDef, themeTemplate: { series: { fills: { $palette: "fills" }, strokes: { $palette: "strokes" }, fillGradientDefaults: import_ag_charts_core193.FILL_GRADIENT_LINEAR_DEFAULTS, fillPatternDefaults: import_ag_charts_core193.FILL_PATTERN_DEFAULTS, fillImageDefaults: import_ag_charts_core193.FILL_IMAGE_DEFAULTS, highlight: import_ag_charts_core193.SINGLE_SERIES_HIGHLIGHT_STYLE, label: { ...import_ag_charts_core193.LABEL_BOXING_DEFAULTS, enabled: true, fontFamily: { $ref: "fontFamily" }, fontSize: { $ref: "fontSize" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" }, spacing: 5, maxWidth: 100 }, node: { spacing: 8, width: 10, strokeWidth: { $isUserOption: ["./stroke", 2, 0] } }, link: { fillOpacity: 0.5, strokeWidth: { $isUserOption: ["./stroke", 2, 0] }, tension: 0.4 } }, legend: { enabled: false, toggleSeries: false } }, create: (ctx) => new ChordSeries(ctx) }; // packages/ag-charts-enterprise/src/series/cone-funnel/coneFunnelModule.ts var import_ag_charts_community177 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/series/funnel/funnelThemes.ts var import_ag_charts_core194 = require("ag-charts-core"); var isHorizontal = { $eq: [{ $path: ["/series/0/direction", void 0] }, "horizontal"] }; var labelOptions = { $clone: { $omit: [["placement", "spacing"], { $path: "/series/0/stageLabel" }] } }; var FUNNEL_SERIES_AXES = { y: { type: { $if: [isHorizontal, import_ag_charts_core194.CARTESIAN_AXIS_TYPE.NUMBER, import_ag_charts_core194.CARTESIAN_AXIS_TYPE.CATEGORY] }, position: { $if: [ isHorizontal, import_ag_charts_core194.CARTESIAN_POSITION.LEFT, { $if: [ { $eq: [{ $path: ["/series/0/stageLabel/placement", void 0] }, "after"] }, import_ag_charts_core194.CARTESIAN_POSITION.RIGHT, import_ag_charts_core194.CARTESIAN_POSITION.LEFT ] } ] }, label: { $if: [isHorizontal, void 0, labelOptions] } }, x: { type: { $if: [isHorizontal, import_ag_charts_core194.CARTESIAN_AXIS_TYPE.CATEGORY, import_ag_charts_core194.CARTESIAN_AXIS_TYPE.NUMBER] }, position: { $if: [ isHorizontal, { $if: [ { $eq: [{ $path: ["/series/0/stageLabel/placement", void 0] }, "before"] }, import_ag_charts_core194.CARTESIAN_POSITION.TOP, import_ag_charts_core194.CARTESIAN_POSITION.BOTTOM ] }, import_ag_charts_core194.CARTESIAN_POSITION.BOTTOM ] }, label: { $if: [isHorizontal, labelOptions, void 0] } } }; var FUNNEL_SERIES_THEME = { series: { direction: "vertical", strokeWidth: { $isUserOption: ["./strokes/0", 2, 0] }, spacingRatio: 0.25, fills: { $applyCycle: [ { $size: { $path: ["./data", { $path: "/data" }] } }, [{ $path: ["/0", void 0, { $palette: "fills" }] }], { $applySwitch: [ { $path: ["/type", void 0, { $value: "$1" }] }, { $value: "$1" }, ["gradient", import_ag_charts_core194.FILL_GRADIENT_LINEAR_SINGLE_DEFAULTS], ["pattern", import_ag_charts_core194.FILL_PATTERN_SINGLE_DEFAULTS], ["image", import_ag_charts_core194.FILL_IMAGE_DEFAULTS] ] } ] }, strokes: { $applyCycle: [ { $size: { $path: ["./data", { $path: "/data" }] } }, [{ $path: ["/0", void 0, { $palette: "strokes" }] }] ] }, label: { ...import_ag_charts_core194.LABEL_BOXING_DEFAULTS, enabled: true, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "chartBackgroundColor" } }, dropOff: { enabled: true, fillOpacity: 0.2, strokeWidth: { $isUserOption: ["./stroke", 2, 0] } }, shadow: { enabled: false, color: import_ag_charts_core194.DEFAULT_SHADOW_COLOUR, xOffset: 3, yOffset: 3, blur: 5 }, highlight: { unhighlightedItem: { opacity: 0.6 } } }, axes: { [import_ag_charts_core194.CARTESIAN_AXIS_TYPE.NUMBER]: { nice: false, gridLine: { enabled: false }, crosshair: { enabled: false }, label: { enabled: false } }, [import_ag_charts_core194.CARTESIAN_AXIS_TYPE.CATEGORY]: { line: { enabled: false } } } }; // packages/ag-charts-enterprise/src/series/cone-funnel/coneFunnelSeries.ts var import_ag_charts_community175 = require("ag-charts-community"); var import_ag_charts_core198 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/funnel/baseFunnelSeries.ts var import_ag_charts_community173 = require("ag-charts-community"); var import_ag_charts_core196 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/funnel/funnelConnector.ts var import_ag_charts_community171 = require("ag-charts-community"); var import_ag_charts_core195 = require("ag-charts-core"); var { BBox: BBox18, Path: Path10 } = import_ag_charts_community171._ModuleSupport; var delta = 1e-6; function pointsEq([ax, ay], [bx, by]) { return Math.abs(ax - bx) <= delta && Math.abs(ay - by) <= delta; } var FunnelConnector = class extends Path10 { constructor() { super(...arguments); this.x0 = 0; this.y0 = 0; this.x1 = 0; this.y1 = 0; this.x2 = 0; this.y2 = 0; this.x3 = 0; this.y3 = 0; } get midPoint() { const { x0, y0, x1, y1, x2, y2, x3, y3 } = this; return { x: (x0 + x1 + x2 + x3) / 4, y: (y0 + y1 + y2 + y3) / 4 }; } distanceSquared(x, y) { if (this.containsPoint(x, y)) return 0; const { x0, y0, x1, y1, x2, y2, x3, y3 } = this; return Math.min( (0, import_ag_charts_core195.lineDistanceSquared)(x, y, x0, y0, x1, y1, Infinity), (0, import_ag_charts_core195.lineDistanceSquared)(x, y, x1, y1, x2, y2, Infinity), (0, import_ag_charts_core195.lineDistanceSquared)(x, y, x2, y2, x3, y3, Infinity), (0, import_ag_charts_core195.lineDistanceSquared)(x, y, x3, y3, x0, y0, Infinity) ); } computeBBox() { const { x0, y0, x1, y1, x2, y2, x3, y3 } = this; const x = Math.min(x0, x1, x2, x3); const width = Math.max(x0, x1, x2, x3) - x; const y = Math.min(y0, y1, y2, y3); const height = Math.max(y0, y1, y2, y3) - y; return new BBox18(x, y, width, height); } updatePath() { const { path, x0, y0, x1, y1, x2, y2, x3, y3 } = this; const points = [ [x0, y0], [x1, y1], [x2, y2], [x3, y3] ]; path.clear(); let start; let current; for (const p of points) { if (start != null && pointsEq(start, p) || current != null && pointsEq(current, p)) { continue; } const [x, y] = p; if (start == null) { path.moveTo(x, y); } else { path.lineTo(x, y); } start ?? (start = p); current = p; } path.closePath(); } }; __decorateClass([ (0, import_ag_charts_core195.SceneChangeDetection)() ], FunnelConnector.prototype, "x0", 2); __decorateClass([ (0, import_ag_charts_core195.SceneChangeDetection)() ], FunnelConnector.prototype, "y0", 2); __decorateClass([ (0, import_ag_charts_core195.SceneChangeDetection)() ], FunnelConnector.prototype, "x1", 2); __decorateClass([ (0, import_ag_charts_core195.SceneChangeDetection)() ], FunnelConnector.prototype, "y1", 2); __decorateClass([ (0, import_ag_charts_core195.SceneChangeDetection)() ], FunnelConnector.prototype, "x2", 2); __decorateClass([ (0, import_ag_charts_core195.SceneChangeDetection)() ], FunnelConnector.prototype, "y2", 2); __decorateClass([ (0, import_ag_charts_core195.SceneChangeDetection)() ], FunnelConnector.prototype, "x3", 2); __decorateClass([ (0, import_ag_charts_core195.SceneChangeDetection)() ], FunnelConnector.prototype, "y3", 2); // packages/ag-charts-enterprise/src/series/funnel/funnelUtil.ts var import_ag_charts_community172 = require("ag-charts-community"); var { NODE_UPDATE_STATE_TO_PHASE_MAPPING } = import_ag_charts_community172._ModuleSupport; function connectorStartingPosition(datum, _prevDatum, isVertical, _mode) { const { x0, y0, x1, y1, x2, y2, x3, y3, opacity } = datum; if (isVertical) { return { x0: (x0 + x3) / 2, y0: (y0 + y3) / 2, x1: (x1 + x2) / 2, y1: (y1 + y2) / 2, x2: (x1 + x2) / 2, y2: (y1 + y2) / 2, x3: (x0 + x3) / 2, y3: (y0 + y3) / 2, opacity }; } else { return { x0: (x0 + x1) / 2, y0: (y0 + y1) / 2, x1: (x0 + x1) / 2, y1: (y0 + y1) / 2, x2: (x2 + x3) / 2, y2: (y2 + y3) / 2, x3: (x2 + x3) / 2, y3: (y2 + y3) / 2, opacity }; } } function prepareConnectorAnimationFunctions(isVertical, mode) { const isRemoved = (datum) => datum == null; const fromFn = (connector, datum, status) => { if (status === "updated" && isRemoved(datum)) { status = "removed"; } else if (status === "updated" && isRemoved(connector.previousDatum)) { status = "added"; } let source; if (status === "added" && connector.previousDatum == null && mode === "fade") { source = { ...resetConnectorSelectionsFn(connector, datum), opacity: 0 }; } else if (status === "unknown" || status === "added") { source = connectorStartingPosition(datum, connector.previousDatum, isVertical, mode); } else { source = { x0: connector.x0, y0: connector.y0, x1: connector.x1, y1: connector.y1, x2: connector.x2, y2: connector.y2, x3: connector.x3, y3: connector.y3, opacity: connector.opacity }; } const phase = NODE_UPDATE_STATE_TO_PHASE_MAPPING[status]; return { ...source, phase }; }; const toFn = (connector, datum, status) => { let source; if (status === "removed" && connector.datum == null && mode === "fade") { source = { ...resetConnectorSelectionsFn(connector, datum), opacity: 0 }; } else if (status === "removed" || isRemoved(datum)) { source = connectorStartingPosition(datum, connector.previousDatum, isVertical, mode); } else { source = resetConnectorSelectionsFn(connector, datum); } return source; }; return { fromFn, toFn }; } function resetConnectorSelectionsFn(_node, datum) { const { x0, y0, x1, y1, x2, y2, x3, y3, opacity } = datum; return { x0, y0, x1, y1, x2, y2, x3, y3, opacity }; } // packages/ag-charts-enterprise/src/series/funnel/baseFunnelSeries.ts var { SeriesNodePickMode: SeriesNodePickMode7, valueProperty: valueProperty10, keyProperty: keyProperty8, updateLabelNode: updateLabelNode5, SMALLEST_KEY_INTERVAL: SMALLEST_KEY_INTERVAL4, LARGEST_KEY_INTERVAL: LARGEST_KEY_INTERVAL2, diff: diff5, fixNumericExtent: fixNumericExtent7, seriesLabelFadeInAnimation: seriesLabelFadeInAnimation4, resetMotion: resetMotion2, resetLabelFn: resetLabelFn4, animationValidation: animationValidation6, computeBarFocusBounds: computeBarFocusBounds6, Group: Group11, Selection: Selection6, PointerEvents: PointerEvents4, motion: motion4, checkCrisp: checkCrisp3, createDatumId: createDatumId8 } = import_ag_charts_community173._ModuleSupport; var FunnelSeriesNodeEvent = class extends import_ag_charts_community173._ModuleSupport.SeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); this.xKey = series.properties.stageKey; this.yKey = series.properties.valueKey; } }; var BaseFunnelSeries = class extends import_ag_charts_community173._ModuleSupport.AbstractBarSeries { constructor({ moduleCtx, animationResetFns }) { super({ moduleCtx, pickModes: [SeriesNodePickMode7.AXIS_ALIGNED, SeriesNodePickMode7.EXACT_SHAPE_MATCH], propertyKeys: { x: ["stageKey"], y: ["valueKey"] }, propertyNames: { x: [], y: [] }, categoryKey: "xValue", datumSelectionGarbageCollection: false, animationResetFns: { datum: animationResetFns.datum, label: resetLabelFn4 } }); // @ts-expect-error xKey/yKey renamed this.NodeEvent = FunnelSeriesNodeEvent; this.connectorNodeGroup = this.contentGroup.appendChild( new Group11({ name: `${this.id}-series-connectorNodes`, zIndex: import_ag_charts_core196.SeriesZIndexMap.BACKGROUND }) ); this.connectorSelection = Selection6.select( this.connectorNodeGroup, () => this.connectionFactory() ); this.connectorNodeGroup.pointerEvents = PointerEvents4.None; } get pickModeAxis() { return "main-category"; } setZIndex(zIndex) { super.setZIndex(zIndex); this.connectorNodeGroup.zIndex = [import_ag_charts_core196.SeriesZIndexMap.BACKGROUND, zIndex]; return true; } isVertical() { return !super.isVertical(); } connectionFactory() { return new FunnelConnector(); } getKeyAxis(direction) { if (direction === import_ag_charts_core196.ChartAxisDirection.X) return this.properties.xKeyAxis; if (direction === import_ag_charts_core196.ChartAxisDirection.Y) return this.properties.yKeyAxis; } async processData(dataController) { const { stageKey, valueKey } = this.properties; const { visible, id: seriesId } = this; const validation = (_value, _datum, index) => visible && this.ctx.legendManager.getItemEnabled({ seriesId, itemId: index }); const xScale = this.getCategoryAxis()?.scale; const yScale = this.getValueAxis()?.scale; const { isContinuousX, xScaleType, yScaleType } = this.getScaleInformation({ xScale, yScale }); const extraProps = []; if (this.needsDataModelDiff() && this.processedData) { extraProps.push(diff5(this.id, this.processedData)); } if (!this.ctx.animationManager.isSkipped()) { extraProps.push(animationValidation6()); } const visibleProps = this.visible ? {} : { forceValue: 0 }; const allowNullKey = this.properties.allowNullKeys ?? false; const { processedData } = await this.requestDataModel(dataController, this.data, { props: [ keyProperty8(stageKey, xScaleType, { id: "xValue", allowNullKey }), valueProperty10(valueKey, yScaleType, { id: `yValue`, ...visibleProps, validation, invalidValue: 0 }), ...isContinuousX ? [SMALLEST_KEY_INTERVAL4, LARGEST_KEY_INTERVAL2] : [], ...extraProps ], groupByKeys: false }); this.smallestDataInterval = processedData.reduced?.smallestKeyInterval; this.largestDataInterval = processedData.reduced?.largestKeyInterval; this.animationState.transition("updateData"); } getSeriesDomain(direction) { const { processedData, dataModel, id: seriesId, ctx: { legendManager } } = this; if (!processedData || !dataModel) return { domain: [] }; const { keys: [keys] } = processedData.domain; if (direction === this.getCategoryDirection()) { const keyDef = dataModel.resolveProcessedDataDefById(this, `xValue`); if (keyDef?.def.type === "key" && keyDef?.def.valueType === "category") { if (!this.hasData) return { domain: [] }; const domain = keys.filter((_key, index) => legendManager.getItemEnabled({ seriesId, itemId: index })); const sortMetadata = dataModel.getKeySortMetadata(this, "xValue", processedData); return { domain, sortMetadata }; } return { domain: this.padBandExtent(keys) }; } else { const yExtent = this.domainForClippedRange(direction, ["yValue"], "xValue"); const maxExtent = Math.max(...yExtent); const fixedYExtent = [-maxExtent, maxExtent]; return { domain: fixNumericExtent7(fixedYExtent) }; } } getSeriesRange(_direction, _visibleRange) { return [Number.NaN, Number.NaN]; } createNodeData() { const { hasData, data, dataModel, processedData, id: seriesId, ctx: { legendManager } } = this; const xAxis = this.getCategoryAxis(); const yAxis = this.getValueAxis(); if (!(hasData && data && xAxis && yAxis && dataModel && processedData?.type === "ungrouped")) { return; } const xScale = xAxis.scale; const yScale = yAxis.scale; const barAlongX = this.getBarDirection() === import_ag_charts_core196.ChartAxisDirection.X; const { stageKey, valueKey } = this.properties; const itemId = `${valueKey}`; const context = { itemId, nodeData: [], labelData: [], connectorData: [], scales: this.calculateScaling(), groupScale: this.getScaling(this.ctx.seriesStateManager.getGroupScale(this)), visible: this.visible }; const isVisible = this.visible; if (!isVisible) return context; const xValues = dataModel.resolveKeysById(this, "xValue", processedData); const yValues = dataModel.resolveColumnById(this, `yValue`, processedData); const { groupOffset, barOffset, barWidth } = this.getBarDimensions(); const crisp = checkCrisp3( xAxis?.scale, xAxis?.visibleRange, this.smallestDataInterval, this.largestDataInterval ); let previousConnection; const rawData = processedData.dataSources.get(this.id)?.data ?? []; for (const [datumIndex, datum] of rawData.entries()) { const visible = isVisible && legendManager.getItemEnabled({ seriesId, itemId: datumIndex }); const xDatum = xValues[datumIndex]; if (xDatum === void 0 && !this.properties.allowNullKeys) continue; const xConverted = xScale.convert(xDatum); if (!Number.isFinite(xConverted)) continue; const x = Math.round(xConverted) + groupOffset + barOffset; const yDatum = yValues[datumIndex]; const yNegative = Math.round(yScale.convert(-yDatum)); const yPositive = Math.round(yScale.convert(yDatum)); const style = this.getItemStyle({ datum, datumIndex }, false); const barHeight = Math.max(style.strokeWidth ?? 0, Math.abs(yPositive - yNegative)); const rect = { x: barAlongX ? Math.min(yPositive, yNegative) : x, y: barAlongX ? x : Math.min(yPositive, yNegative), width: barAlongX ? barHeight : barWidth, height: barAlongX ? barWidth : barHeight }; const nodeMidPoint = { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2 }; const labelData = this.createLabelData({ datumIndex, rect, barAlongX, yDatum, datum, visible }); const nodeDatum = { index: datumIndex, series: this, datum, datumIndex, xValue: xDatum, yValue: yDatum, xKey: stageKey, yKey: valueKey, x: rect.x, y: rect.y, width: rect.width, height: rect.height, midPoint: nodeMidPoint, crisp, label: labelData, visible }; context.nodeData.push(nodeDatum); if (labelData != null) { context.labelData.push(labelData); } if (previousConnection != null) { const prevRect = previousConnection.rect; const startNodeDatum = previousConnection.nodeDatum; const startDatumIndex = previousConnection.datumIndex; if (barAlongX) { context.connectorData.push({ datum: startNodeDatum, datumIndex: startDatumIndex, x0: prevRect.x, y0: prevRect.y + prevRect.height, x1: prevRect.x + prevRect.width, y1: prevRect.y + prevRect.height, x2: rect.x + rect.width, y2: rect.y, x3: rect.x, y3: rect.y, opacity: 1 }); } else { context.connectorData.push({ datum: startNodeDatum, datumIndex: startDatumIndex, x0: prevRect.x + prevRect.width, y0: prevRect.y, x1: rect.x, y1: rect.y, x2: rect.x, y2: rect.y + rect.height, x3: prevRect.x + prevRect.width, y3: prevRect.y + prevRect.height, opacity: 1 }); } } if (visible) { previousConnection = { itemId, rect, nodeDatum, datumIndex }; } } return context; } updateNodes(seriesHighlighted, nodeRefresh) { super.updateNodes(seriesHighlighted, nodeRefresh); const { connectorSelection } = this; const connectorData = this.contextNodeData?.connectorData ?? []; this.connectorSelection = this.updateConnectorSelection({ connectorSelection, connectorData }); this.updateConnectorNodes({ connectorSelection }); } updateDatumSelection(opts) { const { nodeData, datumSelection } = opts; const data = nodeData ?? []; return datumSelection.update(data, void 0, (datum) => this.getDatumId(datum)); } updateConnectorSelection(opts) { const { connectorData, connectorSelection } = opts; return connectorSelection.update( this.connectorEnabled() ? connectorData : [], void 0, (connector) => this.getDatumId(connector.datum) ); } updateConnectorNodes(opts) { const fillBBox = this.getShapeFillBBox(); opts.connectorSelection.each((connector, datum) => { const { fill, fillOpacity, stroke: stroke3, strokeOpacity, strokeWidth, lineDash, lineDashOffset } = this.connectorStyle(datum.datumIndex); connector.setProperties(resetConnectorSelectionsFn(connector, datum)); connector.setStyleProperties( { fill, stroke: stroke3, fillOpacity, strokeOpacity, strokeWidth, lineDash, lineDashOffset }, fillBBox ); }); } updateLabelSelection(opts) { const labelData = this.properties.label.enabled ? opts.labelData : []; return opts.labelSelection.update(labelData, (text2) => { text2.pointerEvents = PointerEvents4.None; }); } updateLabelNodes(opts) { const params = { stageKey: this.properties.stageKey, valueKey: this.properties.valueKey }; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const { isHighlight = false, labelSelection } = opts; labelSelection.each((textNode, datum) => { const highlightStyle = this.getHighlightStyle(isHighlight, datum.datumIndex); textNode.visible = datum.visible || isHighlight; textNode.fillOpacity = highlightStyle.opacity ?? 1; textNode.opacity = highlightStyle.opacity ?? 1; updateLabelNode5(this, textNode, params, this.properties.label, datum, isHighlight, activeHighlight); }); } getHighlightLabelData(_labelData, highlightedItem) { if (highlightedItem.label) { return [{ ...highlightedItem.label }]; } return void 0; } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, properties } = this; const { stageKey, valueKey, tooltip, legendItemName } = properties; const xAxis = this.getCategoryAxis(); const yAxis = this.getValueAxis(); if (!dataModel || !processedData || !xAxis || !yAxis) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const xValue = dataModel.resolveKeysById(this, "xValue", processedData)[datumIndex]; const yValue = dataModel.resolveColumnById(this, `yValue`, processedData)[datumIndex]; const allowNullKeys = this.properties.allowNullKeys ?? false; if (xValue === void 0 && !allowNullKeys) return; return this.formatTooltipWithContext( tooltip, { symbol: this.legendItemSymbol(datumIndex), data: [ { label: this.getAxisValueText(xAxis, "tooltip", xValue, datum, stageKey, legendItemName), value: this.getAxisValueText(yAxis, "tooltip", yValue, datum, valueKey, legendItemName) } ] }, { seriesId, datum, title: stageKey, stageKey, valueKey, ...this.tooltipStyle(datum, datumIndex) } ); } resetAllAnimation(data) { super.resetAllAnimation(data); resetMotion2([this.connectorSelection], resetConnectorSelectionsFn); } animateEmptyUpdateReady({ labelSelection }) { const { connectorSelection } = this; const isVertical = this.isVertical(); const mode = "normal"; const connectorFns = prepareConnectorAnimationFunctions(isVertical, mode); motion4.fromToMotion(this.id, "connectors", this.ctx.animationManager, [connectorSelection], connectorFns); seriesLabelFadeInAnimation4(this, "labels", this.ctx.animationManager, labelSelection); } animateWaitingUpdateReady(data) { const { labelSelection: labelSelections } = data; this.ctx.animationManager.stopByAnimationGroupId(this.id); seriesLabelFadeInAnimation4(this, "labels", this.ctx.animationManager, labelSelections); } getDatumId(datum) { return createDatumId8(datum.xValue); } isLabelEnabled() { return this.properties.label.enabled; } computeFocusBounds({ datumIndex }) { return computeBarFocusBounds6(this, this.contextNodeData?.nodeData[datumIndex]); } legendItemSymbol(datumIndex) { const { strokeWidth, fillOpacity, strokeOpacity, lineDash, lineDashOffset, fill, stroke: stroke3 } = this.properties.getStyle(datumIndex); return { marker: { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } }; } getLegendData(legendType) { const { id: seriesId, processedData, dataModel, ctx: { legendManager }, visible } = this; if (!dataModel || !processedData || legendType !== "category") { return []; } const { showInLegend } = this.properties; const xValues = dataModel.resolveKeysById(this, "xValue", processedData); return (processedData.dataSources.get(this.id)?.data ?? []).map((datum, datumIndex) => { const stageValue = xValues[datumIndex]; const allowNullKeys = this.properties.allowNullKeys ?? false; if (stageValue == null && !allowNullKeys) return; return { legendType: "category", id: seriesId, datum, itemId: datumIndex, seriesId, enabled: visible && legendManager.getItemEnabled({ seriesId, itemId: datumIndex }), label: { text: String(stageValue) }, symbol: this.legendItemSymbol(datumIndex), skipAnimations: true, hideInLegend: !showInLegend }; }).filter((datum) => datum != null); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.label.itemStyler != null; } }; // packages/ag-charts-enterprise/src/series/cone-funnel/coneFunnelProperties.ts var import_ag_charts_community174 = require("ag-charts-community"); var import_ag_charts_core197 = require("ag-charts-core"); var { Label: Label7, AbstractBarSeriesProperties: AbstractBarSeriesProperties5, makeSeriesTooltip: makeSeriesTooltip9, AxisLabel: AxisLabel3 } = import_ag_charts_community174._ModuleSupport; var ConeFunnelSeriesLabel = class extends Label7 { constructor() { super(...arguments); this.spacing = 0; } }; __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelSeriesLabel.prototype, "placement", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelSeriesLabel.prototype, "spacing", 2); var ConeFunnelSeriesStageLabel = class extends AxisLabel3 { }; __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelSeriesStageLabel.prototype, "placement", 2); var ConeFunnelProperties = class extends AbstractBarSeriesProperties5 { constructor() { super(...arguments); this.fills = []; this.fillOpacity = 1; this.strokes = []; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.label = new ConeFunnelSeriesLabel(); this.stageLabel = new ConeFunnelSeriesStageLabel(); this.tooltip = makeSeriesTooltip9(); } getStyle(index) { const { fills, strokes, fillOpacity, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; return { fill: fills[index], fillOpacity, stroke: strokes[index], strokeWidth, strokeOpacity, lineDash, lineDashOffset, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "stageKey", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "valueKey", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "fills", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "strokes", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "stageLabel", 2); __decorateClass([ import_ag_charts_core197.Property ], ConeFunnelProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/cone-funnel/coneFunnelUtil.ts function resetLineSelectionsFn(_node, { x, y, width, height, opacity }) { return { x1: x, y1: y, x2: x + width, y2: y + height, opacity: opacity ?? 1 }; } // packages/ag-charts-enterprise/src/series/cone-funnel/coneFunnelSeries.ts var { Line: Line5 } = import_ag_charts_community175._ModuleSupport; var ConeFunnelSeries = class extends BaseFunnelSeries { constructor(moduleCtx) { super({ moduleCtx, animationResetFns: { datum: resetLineSelectionsFn } }); this.properties = new ConeFunnelProperties(); } get hasData() { const { id: seriesId, ctx: { legendManager } } = this; const visibleItems = this.data?.data.reduce( (accum, _, datumIndex) => accum + (legendManager.getItemEnabled({ seriesId, itemId: datumIndex }) ? 1 : 0), 0 ); return visibleItems != null && visibleItems > 1; } getBandScalePadding() { return { inner: 1, outer: 0 }; } connectorEnabled() { return true; } getItemStyle({ datumIndex }, _isHighlight) { return this.properties.getStyle(datumIndex); } connectorStyle(index) { return this.properties.getStyle(index); } nodeFactory() { return new Line5(); } createLabelData({ datumIndex, rect, barAlongX, yDatum, datum, visible }) { const { stageKey, valueKey, label } = this.properties; const { spacing, placement } = label; if (!label.enabled) return; let x; let y; let textAlign; let textBaseline; if (barAlongX) { x = rect.x + rect.width / 2; textAlign = "center"; switch (placement) { case "before": y = rect.y - spacing; textBaseline = "bottom"; break; case "after": y = rect.y + rect.height + spacing; textBaseline = "top"; break; default: y = rect.y + rect.height / 2; textBaseline = "middle"; } } else { y = rect.y + rect.height / 2; textBaseline = "middle"; switch (placement) { case "before": x = rect.x - spacing; textAlign = "right"; break; case "after": x = rect.x + rect.width + spacing; textAlign = "left"; break; default: x = rect.x + rect.width / 2; textAlign = "center"; } } const yDomain = this.getSeriesDomain(import_ag_charts_core198.ChartAxisDirection.Y).domain; const text2 = this.getLabelText( yDatum, datum, valueKey, "y", yDomain, label, { itemId: valueKey, value: yDatum, datum, stageKey, valueKey } ); return { x, y, textAlign, textBaseline, text: text2, itemId: valueKey, datum, datumIndex, series: this, visible }; } updateDatumNodes(opts) { const highlightStyle = this.getHighlightStyle(opts.isHighlight); opts.datumSelection.each((line, datum) => { line.setProperties(resetLineSelectionsFn(line, datum)); line.stroke = highlightStyle?.stroke; line.strokeWidth = highlightStyle?.strokeWidth ?? 0; line.strokeOpacity = highlightStyle?.strokeOpacity ?? 1; line.lineDash = highlightStyle?.lineDash; line.lineDashOffset = highlightStyle?.lineDashOffset ?? 0; line.opacity = highlightStyle?.opacity ?? 1; }); } tooltipStyle(_datum, datumIndex) { const { fill, stroke: stroke3, fillOpacity, strokeOpacity, strokeWidth, lineDash, lineDashOffset } = this.properties.getStyle(datumIndex); return { fill, fillOpacity, stroke: stroke3, strokeOpacity, strokeWidth, lineDash, lineDashOffset }; } hasItemStylers() { return this.properties.label.itemStyler != null; } }; ConeFunnelSeries.className = "ConeFunnelSeries"; ConeFunnelSeries.type = "cone-funnel"; // packages/ag-charts-enterprise/src/series/cone-funnel/coneFunnelSeriesOptionsDef.ts var import_ag_charts_community176 = require("ag-charts-community"); var import_ag_charts_core199 = require("ag-charts-core"); var { coneFunnelSeriesThemeableOptionsDef } = import_ag_charts_community176._ModuleSupport; var coneFunnelSeriesOptionsDef = { ...(0, import_ag_charts_core199.without)(import_ag_charts_core199.commonSeriesOptionsDefs, ["showInLegend"]), ...coneFunnelSeriesThemeableOptionsDef, type: (0, import_ag_charts_core199.required)((0, import_ag_charts_core199.constant)("cone-funnel")), stageKey: (0, import_ag_charts_core199.required)(import_ag_charts_core199.string), valueKey: (0, import_ag_charts_core199.required)(import_ag_charts_core199.string) }; // packages/ag-charts-enterprise/src/series/cone-funnel/coneFunnelThemes.ts var import_ag_charts_core200 = require("ag-charts-core"); var CONE_FUNNEL_SERIES_THEME = { series: { direction: "vertical", fills: { $applyCycle: [ { $size: { $path: ["./data", { $path: "/data" }] } }, { $if: [ { $eq: [{ $palette: "type" }, "inbuilt"] }, { $palette: "secondSequentialColors" }, import_ag_charts_core200.SAFE_RANGE2_OPERATION ] }, { $applySwitch: [ { $path: ["/type", void 0, { $value: "$1" }] }, { $value: "$1" }, ["gradient", import_ag_charts_core200.FILL_GRADIENT_LINEAR_SINGLE_DEFAULTS], ["pattern", import_ag_charts_core200.FILL_PATTERN_SINGLE_DEFAULTS], ["image", import_ag_charts_core200.FILL_IMAGE_DEFAULTS] ] } ] }, strokes: { $applyCycle: [ { $size: { $path: ["./data", { $path: "/data" }] } }, { $if: [ { $eq: [{ $palette: "type" }, "inbuilt"] }, { $palette: "secondSequentialColors" }, import_ag_charts_core200.SAFE_RANGE2_OPERATION ] } ] }, strokeWidth: { $isUserOption: ["./strokes/0", 2, 0] }, label: { ...import_ag_charts_core200.LABEL_BOXING_DEFAULTS, enabled: true, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" }, placement: "before", spacing: 4 }, tooltip: { range: { $path: ["/tooltip/range", "nearest"] } }, highlight: { highlightedItem: { stroke: `rgba(0, 0, 0, 0.4)`, strokeWidth: 2 } } }, seriesArea: { padding: { top: 20, bottom: 20 } }, axes: { [import_ag_charts_core200.CARTESIAN_AXIS_TYPE.NUMBER]: { nice: false, gridLine: { enabled: false }, crosshair: { enabled: false }, label: { enabled: false } }, [import_ag_charts_core200.CARTESIAN_AXIS_TYPE.CATEGORY]: { line: { enabled: false } } } }; // packages/ag-charts-enterprise/src/series/cone-funnel/coneFunnelModule.ts var ConeFunnelSeriesModule = { type: "series", name: "cone-funnel", chartType: "cartesian", enterprise: true, solo: true, version: import_ag_charts_community177.VERSION, dependencies: [import_ag_charts_community177.CartesianChartModule], options: coneFunnelSeriesOptionsDef, defaultAxes: FUNNEL_SERIES_AXES, themeTemplate: CONE_FUNNEL_SERIES_THEME, create: (ctx) => new ConeFunnelSeries(ctx) }; // packages/ag-charts-enterprise/src/series/funnel/funnelModule.ts var import_ag_charts_community181 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/series/funnel/funnelSeries.ts var import_ag_charts_community179 = require("ag-charts-community"); var import_ag_charts_core202 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/funnel/funnelProperties.ts var import_ag_charts_community178 = require("ag-charts-community"); var import_ag_charts_core201 = require("ag-charts-core"); var { Label: Label8, DropShadow: DropShadow4, AbstractBarSeriesProperties: AbstractBarSeriesProperties6, makeSeriesTooltip: makeSeriesTooltip10, AxisLabel: AxisLabel4 } = import_ag_charts_community178._ModuleSupport; var FunnelSeriesLabel = class extends Label8 { }; var FunnelSeriesStageLabel = class extends AxisLabel4 { }; __decorateClass([ import_ag_charts_core201.Property ], FunnelSeriesStageLabel.prototype, "placement", 2); var FunnelDropOff = class extends import_ag_charts_core201.BaseProperties { constructor() { super(...arguments); this.enabled = true; this.fill = void 0; this.fillOpacity = 1; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; } getStyle() { const { fill, stroke: stroke3, fillOpacity, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core201.Property ], FunnelDropOff.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelDropOff.prototype, "fill", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelDropOff.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelDropOff.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelDropOff.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelDropOff.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelDropOff.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelDropOff.prototype, "lineDashOffset", 2); var FunnelProperties = class extends AbstractBarSeriesProperties6 { constructor() { super(...arguments); this.fills = []; this.fillOpacity = 1; this.strokes = []; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.spacingRatio = 0; this.dropOff = new FunnelDropOff(); this.shadow = new DropShadow4().set({ enabled: false }); this.label = new FunnelSeriesLabel(); this.stageLabel = new FunnelSeriesStageLabel(); this.tooltip = makeSeriesTooltip10(); } getStyle(index) { const { fills, strokes, fillOpacity, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; return { fill: fills[index], fillOpacity, stroke: strokes[index], strokeWidth, strokeOpacity, lineDash, lineDashOffset, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "stageKey", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "valueKey", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "fills", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "strokes", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "spacingRatio", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "dropOff", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "shadow", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "stageLabel", 2); __decorateClass([ import_ag_charts_core201.Property ], FunnelProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/funnel/funnelSeries.ts var { resetBarSelectionsFn: resetBarSelectionsFn3, prepareBarAnimationFunctions: prepareBarAnimationFunctions3, midpointStartingBarPosition: midpointStartingBarPosition2, createDatumId: createDatumId9, Rect: Rect7, motion: motion5 } = import_ag_charts_community179._ModuleSupport; var FunnelSeries = class extends BaseFunnelSeries { constructor(moduleCtx) { super({ moduleCtx, animationResetFns: { datum: resetBarSelectionsFn3 } }); this.properties = new FunnelProperties(); } getBandScalePadding() { return { inner: this.properties.spacingRatio, outer: 0 }; } connectorEnabled() { return this.properties.dropOff.enabled; } connectorStyle(index) { return (0, import_ag_charts_core202.mergeDefaults)(this.properties.dropOff.getStyle(), this.properties.getStyle(index)); } nodeFactory() { return new Rect7(); } createLabelData({ datumIndex, rect, yDatum, datum, visible }) { const { valueKey, stageKey, label } = this.properties; if (!label.enabled) return; const yDomain = this.getSeriesDomain(import_ag_charts_core202.ChartAxisDirection.Y).domain; const text2 = this.getLabelText( yDatum, datum, valueKey, "y", yDomain, label, { itemId: valueKey, value: yDatum, datum, stageKey, valueKey } ); return { x: rect.x + rect.width / 2, y: rect.y + rect.height / 2, textAlign: "center", textBaseline: "middle", text: text2, itemId: stageKey, datum, datumIndex, series: this, visible }; } getItemStyle({ datum, datumIndex }, isHighlight) { const { id: seriesId, properties } = this; const { stageKey, valueKey, itemStyler } = properties; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); const baseStyle = (0, import_ag_charts_core202.mergeDefaults)(highlightStyle, properties.getStyle(datumIndex)); let style = baseStyle; if (itemStyler != null) { const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const overrides = this.cachedDatumCallback( createDatumId9(datumIndex, isHighlight ? "highlight" : "node"), () => { const highlightStateString = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); return this.callWithContext(itemStyler, { seriesId, datum, highlightState: highlightStateString, stageKey, valueKey, ...style }); } ); if (overrides) { style = (0, import_ag_charts_core202.mergeDefaults)(overrides, style); } } return style; } updateDatumNodes({ datumSelection, isHighlight }) { const { contextNodeData } = this; if (!contextNodeData) { return; } const { shadow } = this.properties; const categoryAlongX = this.getCategoryDirection() === import_ag_charts_core202.ChartAxisDirection.X; const fillBBox = this.getShapeFillBBox(); datumSelection.each((rect, datum) => { const style = this.getItemStyle(datum, isHighlight); rect.setStyleProperties(style, fillBBox); rect.visible = categoryAlongX ? datum.width > 0 : datum.height > 0; rect.crisp = datum.crisp; rect.fillShadow = shadow; }); } tooltipStyle(datum, datumIndex) { return this.getItemStyle({ datum, datumIndex }, false); } animateEmptyUpdateReady(params) { super.animateEmptyUpdateReady(params); const { datumSelection } = params; const isVertical = this.isVertical(); const mode = "normal"; const barFns = prepareBarAnimationFunctions3(midpointStartingBarPosition2(isVertical, mode), "unknown"); motion5.fromToMotion(this.id, "datums", this.ctx.animationManager, [datumSelection], barFns); } animateWaitingUpdateReady(data) { super.animateWaitingUpdateReady(data); const { datumSelection: datumSelections } = data; const { processedData } = this; const dataDiff = processedData?.reduced?.diff?.[this.id]; const fns = prepareBarAnimationFunctions3(midpointStartingBarPosition2(this.isVertical(), "fade"), "added"); motion5.fromToMotion( this.id, "datums", this.ctx.animationManager, [datumSelections], fns, (_, datum) => datum.xValue, dataDiff ); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.label.itemStyler != null; } }; FunnelSeries.className = "FunnelSeries"; FunnelSeries.type = "funnel"; // packages/ag-charts-enterprise/src/series/funnel/funnelSeriesOptionsDef.ts var import_ag_charts_community180 = require("ag-charts-community"); var import_ag_charts_core203 = require("ag-charts-core"); var { funnelSeriesThemeableOptionsDef } = import_ag_charts_community180._ModuleSupport; var funnelSeriesOptionsDef = { ...funnelSeriesThemeableOptionsDef, ...(0, import_ag_charts_core203.without)(import_ag_charts_core203.commonSeriesOptionsDefs, ["showInLegend"]), type: (0, import_ag_charts_core203.required)((0, import_ag_charts_core203.constant)("funnel")), stageKey: (0, import_ag_charts_core203.required)(import_ag_charts_core203.string), valueKey: (0, import_ag_charts_core203.required)(import_ag_charts_core203.string) }; // packages/ag-charts-enterprise/src/series/funnel/funnelModule.ts var FunnelSeriesModule = { type: "series", name: "funnel", chartType: "cartesian", enterprise: true, solo: true, version: import_ag_charts_community181.VERSION, dependencies: [import_ag_charts_community181.CartesianChartModule], options: funnelSeriesOptionsDef, defaultAxes: FUNNEL_SERIES_AXES, themeTemplate: FUNNEL_SERIES_THEME, create: (ctx) => new FunnelSeries(ctx) }; // packages/ag-charts-enterprise/src/series/linear-gauge/linearGaugeModule.ts var import_ag_charts_community187 = require("ag-charts-community"); var import_ag_charts_core212 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/preset/gaugePresetModule.ts var import_ag_charts_community182 = require("ag-charts-community"); var import_ag_charts_core205 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/preset/gaugePreset.ts var import_ag_charts_core204 = require("ag-charts-core"); function tooltipOptions(opts) { const { enabled, mode, showArrow, range: range2, position, pagination, delay, wrapping, interaction, renderer, ...rest } = opts; const seriesTooltipOptions = { enabled, showArrow, range: range2, position, interaction, renderer, ...rest }; const chartTooltipOptions = { mode, pagination, delay, wrapping, ...rest }; return { chartTooltipOptions, seriesTooltipOptions }; } function radialGaugeOptions(opts) { const { animation, background, container, contextMenu, context, footnote, foreground, height, listeners, locale, minHeight, minWidth, overrideDevicePixelRatio, padding: padding2, subtitle, theme, title, width, type, cursor, nodeClickRange, tooltip: tooltipInput, value, scale = {}, startAngle, endAngle, highlight, segmentation, bar, needle, targets, outerRadius, innerRadius, outerRadiusRatio, innerRadiusRatio, cornerRadius, cornerMode, label, secondaryLabel, spacing, ...seriesRest } = opts; const hasTooltip = tooltipInput != null; const tooltip = tooltipInput ?? {}; const { chartTooltipOptions, seriesTooltipOptions } = tooltipOptions(tooltip); const seriesOpts = { ...seriesRest, type, cursor, context, nodeClickRange, value, scale, startAngle, endAngle, highlight, segmentation, bar, targets, outerRadius, innerRadius, outerRadiusRatio, innerRadiusRatio, cornerRadius, cornerMode, label, secondaryLabel, spacing }; if (hasTooltip) { seriesOpts.tooltip = seriesTooltipOptions; } if (needle != null) { seriesOpts.needle = { enabled: true, ...needle }; } return { animation, background, container, contextMenu, context, footnote, foreground, height, listeners, locale, minHeight, minWidth, overrideDevicePixelRatio, padding: padding2, subtitle, theme, title, width, ...hasTooltip ? { tooltip: chartTooltipOptions } : {}, series: [seriesOpts] }; } function linearGaugeOptions(opts) { const { animation, background, container, contextMenu, context, footnote, foreground, height, listeners, locale, minHeight, minWidth, overrideDevicePixelRatio, padding: padding2, subtitle, theme, title, width, type, cursor, nodeClickRange, tooltip: tooltipInput, value, scale = {}, direction = "vertical", thickness, highlight, segmentation, bar, targets, cornerRadius, cornerMode, label, ...seriesRest } = opts; const hasTooltip = tooltipInput != null; const tooltip = tooltipInput ?? {}; const { chartTooltipOptions, seriesTooltipOptions } = tooltipOptions(tooltip); const seriesOpts = { ...seriesRest, type, cursor, nodeClickRange, value, scale, direction, thickness, highlight, segmentation, bar, targets, cornerRadius, cornerMode, label }; if (hasTooltip) { seriesOpts.tooltip = seriesTooltipOptions; } return { animation, background, container, contextMenu, context, footnote, foreground, height, listeners, locale, minHeight, minWidth, overrideDevicePixelRatio, padding: padding2, subtitle, theme, title, width, ...hasTooltip ? { tooltip: chartTooltipOptions } : {}, series: [seriesOpts] }; } function applyThemeDefaults(opts, presetTheme) { if (presetTheme == null) return opts; const { targets: targetsTheme, ...gaugeTheme } = presetTheme; opts = (0, import_ag_charts_core204.mergeDefaults)(opts, gaugeTheme); if (opts.targets != null && targetsTheme != null) { if (opts.type === "radial-gauge") { opts.targets = (0, import_ag_charts_core204.mergeArrayDefaults)(opts.targets, targetsTheme); } else { opts.targets = (0, import_ag_charts_core204.mergeArrayDefaults)(opts.targets, targetsTheme); } } return opts; } function createGauge(opts, presetTheme) { switch (opts.type) { case "radial-gauge": return radialGaugeOptions(applyThemeDefaults(opts, presetTheme)); case "linear-gauge": return linearGaugeOptions(applyThemeDefaults(opts, presetTheme)); default: return { series: [] }; } } // packages/ag-charts-enterprise/src/preset/gaugePresetModule.ts var commonGaugeOptions = { // Valid pass-through options theme: import_ag_charts_core205.defined, container: import_ag_charts_core205.defined, animation: import_ag_charts_core205.defined, background: import_ag_charts_core205.defined, contextMenu: import_ag_charts_core205.defined, context: () => true, listeners: import_ag_charts_core205.defined, locale: import_ag_charts_core205.defined, width: import_ag_charts_core205.defined, height: import_ag_charts_core205.defined, minWidth: import_ag_charts_core205.defined, minHeight: import_ag_charts_core205.defined, title: import_ag_charts_core205.defined, subtitle: import_ag_charts_core205.defined, footnote: import_ag_charts_core205.defined, padding: import_ag_charts_core205.defined, tooltip: { ...import_ag_charts_core205.tooltipOptionsDefs, ...import_ag_charts_core205.commonChartOptionsDefs.tooltip } }; commonGaugeOptions.overrideDevicePixelRatio = (0, import_ag_charts_core205.undocumented)(import_ag_charts_core205.positiveNumber); commonGaugeOptions.foreground = (0, import_ag_charts_core205.undocumented)(import_ag_charts_core205.defined); var GaugePresetModule = { type: "preset", name: "gauge-preset", enterprise: true, version: import_ag_charts_community182.VERSION, dependencies: [StandaloneChartModule], options: (0, import_ag_charts_core205.typeUnion)( { "linear-gauge": { ...(0, import_ag_charts_core205.without)(import_ag_charts_core205.linearGaugeSeriesOptionsDef, ["type"]), ...commonGaugeOptions }, "radial-gauge": { ...(0, import_ag_charts_core205.without)(import_ag_charts_core205.radialGaugeSeriesOptionsDef, ["type"]), ...commonGaugeOptions } }, "gauge options" ), create: createGauge }; // packages/ag-charts-enterprise/src/series/linear-gauge/linearGaugeSeries.ts var import_ag_charts_community186 = require("ag-charts-community"); var import_ag_charts_core211 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/gauge-util/datumUnion.ts var DatumUnion = class { *[Symbol.iterator]() { const { node, datum } = this; if (node && datum) yield { node, datum }; } nodes() { return this.node ? [this.node] : []; } update(datumSelection, group, ctor, nodeUpdater) { const nodes = datumSelection.nodes(); if (nodes.length === 0) { this.node?.remove(); this.node = void 0; } else { if (this.node === void 0) { this.node = new ctor(); this.node.fillOpacity = 0; this.node.strokeOpacity = 0; group.appendChild(this.node); } const first = nodes[0]; const last = nodes.toReversed().find((n) => n.datum.datum.value > n.datum.datum.segmentStart) ?? nodes.at(-1); this.node.datum = this.datum = first.datum; nodeUpdater(this.node, first, last); } } }; // packages/ag-charts-enterprise/src/series/gauge-util/label.ts var import_ag_charts_core206 = require("ag-charts-core"); var fadeInFns = { fromFn: () => ({ opacity: 0, phase: "initial" }), toFn: () => ({ opacity: 1 }) }; function formatLabel(value, scale) { if (value == null) return ""; const { min, max } = scale; const minLog10 = min === 0 ? 0 : Math.ceil(Math.log10(Math.abs(min))); const maxLog10 = max === 0 ? 0 : Math.ceil(Math.log10(Math.abs(max))); const dp = Math.max(2 - Math.max(minLog10, maxLog10), 0); return value.toFixed(dp); } function getLabelText(seriesId, ctx, datum, valueOverride) { if (datum.text != null) return datum.text; const value = valueOverride ?? datum.value; let labelFormat; if (datum?.formatter != null) { labelFormat = formatWithContext(ctx, datum.formatter, { seriesId, datum: void 0, value }); } return labelFormat == null || (0, import_ag_charts_core206.isArray)(labelFormat) ? labelFormat : String(labelFormat); } // packages/ag-charts-enterprise/src/series/gauge-util/lineMarker.ts function lineMarker({ path, x, y, size }) { path.moveTo(x, y - size / 2); path.lineTo(x, y + size / 2); } // packages/ag-charts-enterprise/src/series/gauge-util/pick.ts var import_ag_charts_community183 = require("ag-charts-community"); var import_ag_charts_core207 = require("ag-charts-core"); function pickGaugeNearestDatum(self, point) { const it = (0, import_ag_charts_core207.iterate)(self.datumUnion.nodes(), self.targetSelection.nodes()); return self.pickNodeNearestDistantObject(point, it); } function pickGaugeFocus(self, opts) { const others = [ { data: self.contextNodeData?.nodeData, selection: self.datumUnion }, { data: self.contextNodeData?.targetData, selection: self.targetSelection } ].filter((v) => v.data && v.data.length > 0); const otherIndex = (0, import_ag_charts_core207.clamp)(0, opts.otherIndex + opts.otherIndexDelta, others.length - 1); if (others.length === 0) return; const { data, selection } = others[otherIndex]; if (data == null || data.length === 0) return; const datumIndex = (0, import_ag_charts_core207.clamp)(0, opts.datumIndex, data.length - 1); const datum = data[datumIndex]; for (const node of selection) { if (node.datum === datum) { const bounds = node.node; return { bounds, clipFocusBox: true, datum, datumIndex, otherIndex }; } } } function findGaugeNodeDatum(self, itemId) { return import_ag_charts_community183._ModuleSupport.findNodeDatumInArray(itemId, self.contextNodeData?.nodeData) ?? import_ag_charts_community183._ModuleSupport.findNodeDatumInArray(itemId, self.contextNodeData?.targetData); } // packages/ag-charts-enterprise/src/series/linear-gauge/linearGaugeSeriesProperties.ts var import_ag_charts_community184 = require("ag-charts-community"); var import_ag_charts_core209 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/gauge-util/segmentation.ts var import_ag_charts_core208 = require("ag-charts-core"); var GaugeSegmentationIntervalProperties = class extends import_ag_charts_core208.BaseProperties { getSegments(scale, maxTicks) { const { values, step, count } = this; const d0 = Math.min(...scale.domain); const d1 = Math.max(...scale.domain); let ticks; if (values != null) { const segments = values.filter((v) => v > d0 && v < d1).sort((a, b) => a - b); ticks = [d0, ...segments, d1]; } else if (step != null) { const segments = []; for (let i = d0; i < d1; i += step) { segments.push(i); } segments.push(d1); ticks = segments; } else if (count == null) { const segments = scale.ticks({ nice: [true, true], interval: void 0, tickCount: void 0, minTickCount: 0, maxTickCount: Infinity })?.ticks?.filter((v) => v > d0 && v < d1); ticks = segments == null ? void 0 : [d0, ...segments, d1]; } else { const segments = count + 1; ticks = Array.from({ length: segments + 1 }, (_, i) => i / segments * (d1 - d0) + d0); } if (ticks != null && ticks.length > maxTicks) { import_ag_charts_core208.Logger.warnOnce( `the configured segmentation results in more than 1 item per pixel, ignoring. Supply a segmentation configuration that results in larger segments or omit this configuration` ); ticks = void 0; } ticks ?? (ticks = [d0, d1]); return ticks; } }; __decorateClass([ import_ag_charts_core208.Property ], GaugeSegmentationIntervalProperties.prototype, "values", 2); __decorateClass([ import_ag_charts_core208.Property ], GaugeSegmentationIntervalProperties.prototype, "step", 2); __decorateClass([ import_ag_charts_core208.Property ], GaugeSegmentationIntervalProperties.prototype, "count", 2); var GaugeSegmentationProperties = class extends import_ag_charts_core208.BaseProperties { constructor() { super(...arguments); this.enabled = false; this.interval = new GaugeSegmentationIntervalProperties(); this.spacing = 0; } }; __decorateClass([ import_ag_charts_core208.Property ], GaugeSegmentationProperties.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core208.Property ], GaugeSegmentationProperties.prototype, "interval", 2); __decorateClass([ import_ag_charts_core208.Property ], GaugeSegmentationProperties.prototype, "spacing", 2); // packages/ag-charts-enterprise/src/series/linear-gauge/linearGaugeSeriesProperties.ts var { makeSeriesTooltip: makeSeriesTooltip11, SeriesProperties: SeriesProperties2, Label: Label9, AxisLabel: AxisLabel5, getColorStops } = import_ag_charts_community184._ModuleSupport; var LinearGaugeDefaultTargetLabelProperties = class extends Label9 { }; __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeDefaultTargetLabelProperties.prototype, "spacing", 2); var LinearGaugeTargetProperties = class extends import_ag_charts_core209.BaseProperties { constructor() { super(...arguments); this.value = 0; this.label = new LinearGaugeDefaultTargetLabelProperties(); } getStyle(defaultTarget) { const { fill = defaultTarget.fill ?? "black", fillOpacity = defaultTarget.fillOpacity ?? 1, stroke: stroke3 = defaultTarget.stroke ?? "black", strokeWidth = defaultTarget.strokeWidth ?? 0, strokeOpacity = defaultTarget.strokeOpacity ?? 1, lineDash = defaultTarget.lineDash ?? [0], lineDashOffset = defaultTarget.lineDashOffset ?? 0 } = this; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }; } }; __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "text", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "value", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "shape", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "placement", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "size", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "rotation", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeTargetProperties.prototype, "label", 2); var LinearGaugeBarProperties = class extends import_ag_charts_core209.BaseProperties { constructor() { super(...arguments); this.enabled = true; this.thicknessRatio = 1; this.fills = new import_ag_charts_core209.PropertiesArray(import_ag_charts_community184._ModuleSupport.StopProperties); this.fillMode = "continuous"; this.fillOpacity = 1; this.stroke = "black"; this.strokeWidth = 0; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; } getStyle(defaultColorRange, horizontal, scale) { const { fill, fills, fillMode, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; const barFill = fill ?? createLinearGradient(fills, fillMode, defaultColorRange, scale, horizontal); return { fill: barFill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }; } }; __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "thickness", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "thicknessRatio", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "fills", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "fillMode", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeBarProperties.prototype, "lineDashOffset", 2); var LinearGaugeScaleIntervalProperties = class extends import_ag_charts_core209.BaseProperties { constructor() { super(...arguments); this.values = void 0; this.step = void 0; this.minSpacing = 0; this.maxSpacing = 1e3; } }; __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleIntervalProperties.prototype, "values", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleIntervalProperties.prototype, "step", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleIntervalProperties.prototype, "minSpacing", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleIntervalProperties.prototype, "maxSpacing", 2); var LinearGaugeScaleLabelProperties = class extends AxisLabel5 { constructor() { super(...arguments); this.placement = void 0; } }; __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleLabelProperties.prototype, "placement", 2); var LinearGaugeScaleProperties = class extends import_ag_charts_core209.BaseProperties { constructor() { super(...arguments); this.min = 0; this.max = 1; this.fills = new import_ag_charts_core209.PropertiesArray(import_ag_charts_community184._ModuleSupport.StopProperties); this.fillMode = "continuous"; this.fillOpacity = 1; this.stroke = "black"; this.strokeWidth = 0; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.defaultFill = "black"; this.interval = new LinearGaugeScaleIntervalProperties(); this.label = new LinearGaugeScaleLabelProperties(); } getStyle(barEnabled, defaultColorRange, horizontal, scale) { const { fill, fills, defaultFill, fillMode, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; const scaleFill = fill ?? (barEnabled && fills.length === 0 ? defaultFill : void 0) ?? createLinearGradient(fills, fillMode, defaultColorRange, scale, horizontal); return { fill: scaleFill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }; } }; __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "min", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "max", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "fills", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "fillMode", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "defaultFill", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "interval", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeScaleProperties.prototype, "label", 2); var LinearGaugeLabelProperties = class extends AutoSizedLabel { constructor() { super(...arguments); this.placement = "inside-center"; this.avoidCollisions = true; } }; __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeLabelProperties.prototype, "text", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeLabelProperties.prototype, "placement", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeLabelProperties.prototype, "avoidCollisions", 2); var LinearGaugeSeriesProperties = class extends SeriesProperties2 { constructor() { super(...arguments); this.value = 0; this.segmentation = new GaugeSegmentationProperties(); this.defaultColorRange = []; this.targets = new import_ag_charts_core209.PropertiesArray(LinearGaugeTargetProperties); this.defaultTarget = new LinearGaugeTargetProperties(); this.defaultScale = new LinearGaugeScaleProperties(); this.direction = "vertical"; this.thickness = 1; this.cornerRadius = 0; this.cornerMode = "container"; this.margin = 0; this.scale = new LinearGaugeScaleProperties(); this.bar = new LinearGaugeBarProperties(); this.label = new LinearGaugeLabelProperties(); this.tooltip = makeSeriesTooltip11(); } }; __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "value", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "segmentation", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "defaultColorRange", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "targets", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "defaultTarget", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "defaultScale", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "direction", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "thickness", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "cornerMode", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "margin", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "scale", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "bar", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core209.Property ], LinearGaugeSeriesProperties.prototype, "tooltip", 2); function createLinearGradient(fills, fillMode, defaultColorRange, scale, horizontal) { const colorStops = getColorStops(fills, defaultColorRange, scale.domain, fillMode); return { type: "gradient", gradient: "linear", colorSpace: "oklch", colorStops, rotation: horizontal ? 90 : 0, bounds: "series" }; } // packages/ag-charts-enterprise/src/series/linear-gauge/linearGaugeUtil.ts var import_ag_charts_community185 = require("ag-charts-community"); var import_ag_charts_core210 = require("ag-charts-core"); var { BBox: BBox19 } = import_ag_charts_community185._ModuleSupport; function datumRect(datum) { const { x0, y0, x1, y1, horizontalInset, verticalInset } = datum; const x = Math.min(x0, x1) + horizontalInset; const y = Math.min(y0, y1) + verticalInset; const width = Math.max(Math.abs(x1 - x0) - 2 * horizontalInset, 0); const height = Math.max(Math.abs(y1 - y0) - 2 * verticalInset, 0); return { x, y, width, height }; } function clipBBoxVisibility(datum, clipBBox) { if (clipBBox == null) return true; const rect = datumRect(datum); const delta3 = 1e-6; const x0 = rect.x + delta3; const y0 = rect.y + delta3; const x1 = rect.x + rect.width - delta3; const y1 = rect.y + rect.height - delta3; const clipX0 = clipBBox.x; const clipX1 = clipBBox.x + clipBBox.width; const clipY0 = clipBBox.y; const clipY1 = clipBBox.y + clipBBox.height; return Math.max(x0, clipX0) <= Math.min(x1, clipX1) && Math.max(y0, clipY0) <= Math.min(y1, clipY1); } function hasClipBBox(datum) { const { clipX0, clipX1, clipY0, clipY1 } = datum; return clipX0 != null && clipX1 != null || clipY0 != null && clipY1 != null; } function computeClipBBox(datum) { if (!hasClipBBox(datum)) return; const { x0, y0, x1, y1 } = datum; const { x, y, width, height } = datumRect(datum); let { clipX0, clipX1, clipY0, clipY1 } = datum; if (clipX0 == null || clipX1 == null) { clipX0 = x0; clipX1 = x1; } if (clipY0 == null || clipY1 == null) { clipY0 = y0; clipY1 = y1; } const clipX = Math.min(clipX0, clipX1); const clipY = Math.min(clipY0, clipY1); const clipWidth = Math.abs(clipX1 - clipX0); const clipHeight = Math.abs(clipY1 - clipY0); clipX0 = Math.max(x, clipX); clipY0 = Math.max(y, clipY); clipX1 = Math.min(x + width, clipX + clipWidth); clipY1 = Math.min(y + height, clipY + clipHeight); return new BBox19( Math.min(clipX0, clipX1), Math.min(clipY0, clipY1), Math.abs(clipX1 - clipX0), Math.abs(clipY1 - clipY0) ); } function prepareLinearGaugeSeriesAnimationFunctions(initialLoad, horizontal) { const phase = initialLoad ? "initial" : "update"; const node = { fromFn(sect, datum) { const previousDatum = sect.previousDatum; let { x0, y0, x1, y1, clipX0, clipY0, clipX1, clipY1 } = previousDatum ?? datum; const { horizontalInset, verticalInset } = datum; const previousHadClipBBox = previousDatum != null && hasClipBBox(previousDatum); const nextHasClipBBox = hasClipBBox(datum); if (previousHadClipBBox && nextHasClipBBox) { } else if (!previousHadClipBBox && nextHasClipBBox) { ({ x0, y0, x1, y1, clipX0, clipY0, clipX1, clipY1 } = datum); if (initialLoad) { if (horizontal) { clipX1 = datum.clipX0; } else { clipY1 = datum.clipY0; } } } else if (previousHadClipBBox && !nextHasClipBBox) { ({ x0, y0, x1, y1 } = datum); clipX0 = void 0; clipY0 = void 0; clipX1 = void 0; clipY1 = void 0; } else if (initialLoad) { if (horizontal) { x1 = x0; } else { y1 = y0; } } return { x0, y0, x1, y1, clipX0, clipY0, clipX1, clipY1, horizontalInset, verticalInset, phase }; }, toFn(_sect, datum) { const { x0, y0, x1, y1, clipX0, clipY0, clipX1, clipY1, horizontalInset, verticalInset } = datum; return { x0, y0, x1, y1, clipX0, clipY0, clipX1, clipY1, horizontalInset, verticalInset }; }, applyFn(rect, params) { rect.setProperties(resetLinearGaugeSeriesResetRectFunction(rect, params)); } }; return { node }; } function resetLinearGaugeSeriesResetRectFunction(_node, datum) { const { x, y, width, height } = datumRect(datum); const clipBBox = computeClipBBox(datum); const visible = clipBBoxVisibility(datum, clipBBox); return { x, y, width, height, clipBBox, visible }; } var horizontalTextAligns = { ["Before" /* Before */]: "right", ["Center" /* Center */]: "center", ["After" /* After */]: "left" }; var verticalTextBaselines = { ["Before" /* Before */]: "top", ["Center" /* Center */]: "middle", ["After" /* After */]: "bottom" }; var horizontalAlignFactors = { ["Before" /* Before */]: -1, ["Center" /* Center */]: -0.5, ["After" /* After */]: 0 }; var verticalAlignFactors2 = { ["Before" /* Before */]: 0, ["Center" /* Center */]: -0.5, ["After" /* After */]: -1 }; function formatLinearGaugeLabels(series, ctx, selection, opts, bboxes, datumOverrides) { const { seriesRect, gaugeRect, barRect } = bboxes; const { padding: padding2, horizontal } = opts; selection.each((label, labelDatum) => { const labelText = getLabelText(series.id, ctx, labelDatum, datumOverrides?.label); let boundingWidth; let boundingHeight; if (labelDatum.placement === "outside-start") { if (horizontal) { boundingWidth = gaugeRect.x; boundingHeight = seriesRect.height; } else { boundingWidth = seriesRect.width; boundingHeight = seriesRect.height - (gaugeRect.y + gaugeRect.height); } } else if (labelDatum.placement === "outside-end") { if (horizontal) { boundingWidth = seriesRect.width - (gaugeRect.x + gaugeRect.width); boundingHeight = seriesRect.height; } else { boundingWidth = seriesRect.width; boundingHeight = gaugeRect.y; } } else if (labelDatum.avoidCollisions) { boundingWidth = gaugeRect.width; boundingHeight = gaugeRect.height; } let layout; if (labelText == null) { return; } else if (boundingWidth != null && boundingHeight != null) { const sizeFittingHeight = () => ({ width: boundingWidth, height: boundingHeight, meta: null }); const labelMeta = formatSingleLabel((0, import_ag_charts_core210.toPlainText)(labelText), labelDatum, { padding: padding2 }, sizeFittingHeight); layout = labelMeta?.[0]; } else { const measurer3 = (0, import_ag_charts_core210.cachedTextMeasurer)(labelDatum); const { width, height } = (0, import_ag_charts_core210.isArray)(labelText) ? (0, import_ag_charts_core210.measureTextSegments)(labelText, labelDatum) : measurer3.measureLines((0, import_ag_charts_core210.toTextString)(labelText)); layout = { text: labelText, fontSize: labelDatum.fontSize, lineHeight: labelDatum.lineHeight ?? measurer3.lineHeight(), width, height }; } if (layout == null) { label.visible = false; return; } const scale0 = horizontal ? gaugeRect.x : gaugeRect.y + gaugeRect.height; const scale1 = horizontal ? gaugeRect.x + gaugeRect.width : gaugeRect.y; const bar0 = horizontal ? barRect.x : barRect.y + barRect.height; const bar1 = horizontal ? barRect.x + barRect.width : barRect.y; const offset = labelDatum.spacing * (horizontal ? 1 : -1); let bounds0; let bounds1; let s; let align; switch (labelDatum.placement) { case "outside-start": bounds0 = -Infinity; bounds1 = Infinity; s = scale0 - offset; align = "Before" /* Before */; break; case "outside-end": bounds0 = -Infinity; bounds1 = Infinity; s = scale1 + offset; align = "After" /* After */; break; case "inside-start": bounds0 = scale0; bounds1 = bar1; s = scale0 + offset; align = "After" /* After */; break; case "inside-end": bounds0 = bar1; bounds1 = scale1; s = scale1 - offset; align = "Before" /* Before */; break; case "inside-center": bounds0 = scale0; bounds1 = scale1; s = (scale0 + scale1) / 2; align = "Center" /* Center */; break; case "bar-inside": bounds0 = bar0; bounds1 = bar1; s = (bar0 + bar1) / 2; align = "Center" /* Center */; break; case "bar-inside-end": bounds0 = bar0; bounds1 = bar1; s = bar1 - offset; align = "Before" /* Before */; break; case "bar-outside-end": bounds0 = bar1; bounds1 = scale1; s = bar1 + offset; align = "After" /* After */; break; case "bar-end": bounds0 = -Infinity; bounds1 = Infinity; s = bar1; align = "Center" /* Center */; break; } const x = horizontal ? s : gaugeRect.x + gaugeRect.width / 2; const y = horizontal ? gaugeRect.y + gaugeRect.height / 2 : s; let s0; let s1; if (horizontal) { s0 = x + horizontalAlignFactors[align] * layout.width; s1 = s0 + layout.width; } else { s0 = y + verticalAlignFactors2[align] * layout.height; s1 = s0 + layout.height; } const inside = Math.min(s0, s1) >= Math.min(bounds0, bounds1) && Math.max(s0, s1) <= Math.max(bounds0, bounds1); if (labelDatum.avoidCollisions && !inside) { label.visible = false; return; } label.visible = true; label.text = layout.text; label.fontSize = layout.fontSize; label.lineHeight = layout.lineHeight; label.textAlign = horizontal ? horizontalTextAligns[align] : "center"; label.textBaseline = horizontal ? "middle" : verticalTextBaselines[align]; label.x = x; label.y = y; }); } // packages/ag-charts-enterprise/src/series/linear-gauge/linearGaugeSeries.ts var { fromToMotion: fromToMotion2, resetMotion: resetMotion3, SeriesNodePickMode: SeriesNodePickMode8, createDatumId: createDatumId10, BBox: BBox20, Group: Group12, PointerEvents: PointerEvents5, Selection: Selection7, Rect: Rect8, Text: Text3, TransformableText: TransformableText2, Marker: Marker3, LinearScale: LinearScale4, generateTicks: generateTicks2, NiceMode } = import_ag_charts_community186._ModuleSupport; var horizontalTargetPlacementRotation = { before: 180, middle: 0, after: 0 }; var verticalTargetPlacementRotation = { before: 90, middle: 0, after: -90 }; var LinearGaugeSeries = class extends import_ag_charts_community186._ModuleSupport.Series { constructor(moduleCtx) { super({ moduleCtx, pickModes: [SeriesNodePickMode8.EXACT_SHAPE_MATCH, SeriesNodePickMode8.NEAREST_NODE] }); this.properties = new LinearGaugeSeriesProperties(); this.seriesRect = BBox20.NaN; this.gaugeRect = BBox20.NaN; this.scale = new LinearScale4(); this.originX = 0; this.originY = 0; this.scaleGroup = this.contentGroup.appendChild(new Group12({ name: "scaleGroup" })); this.itemGroup = this.contentGroup.appendChild(new Group12({ name: "itemGroup" })); this.itemTargetGroup = this.contentGroup.appendChild(new Group12({ name: "itemTargetGroup" })); this.itemTargetLabelGroup = this.contentGroup.appendChild(new Group12({ name: "itemTargetLabelGroup" })); this.itemLabelGroup = this.contentGroup.appendChild(new Group12({ name: "itemLabelGroup" })); this.highlightTargetGroup = this.highlightGroup.appendChild( new Group12({ name: "itemTargetLabelGroup" }) ); this.tickGroup = this.contentGroup.appendChild(new Group12({ name: "tickGroup" })); this.scaleSelection = Selection7.select( this.scaleGroup, () => this.nodeFactory() ); this.datumSelection = Selection7.select( this.itemGroup, () => this.nodeFactory() ); this.targetSelection = Selection7.select( this.itemTargetGroup, () => this.markerFactory() ); this.targetLabelSelection = Selection7.select(this.itemTargetLabelGroup, Text3); this.labelSelection = Selection7.select( this.itemLabelGroup, Text3 ); this.highlightTargetSelection = Selection7.select(this.highlightTargetGroup, () => this.markerFactory()); this.tickSelection = Selection7.select(this.tickGroup, TransformableText2); this.datumUnion = new DatumUnion(); this.animationState = new import_ag_charts_core211.StateMachine("empty", { empty: { update: { target: "ready", action: () => this.animateEmptyUpdateReady() }, reset: "empty", skip: "ready" }, ready: { updateData: "waiting", clear: "clearing", resize: () => this.animateReadyResize(), reset: "empty", skip: "ready" }, waiting: { update: { target: "ready", action: () => this.animateWaitingUpdateReady() }, reset: "empty", skip: "ready" }, clearing: { update: { target: "empty" }, reset: "empty", skip: "ready" } }); this.scaleGroup.pointerEvents = PointerEvents5.None; this.tickGroup.pointerEvents = PointerEvents5.None; } get range() { return this.horizontal ? [0, this.gaugeRect.width] : [0, this.gaugeRect.height]; } get horizontal() { return this.properties.direction === "horizontal"; } get hasData() { return true; } nodeFactory() { const rect = new Rect8(); rect.crisp = true; return rect; } markerFactory() { return new Marker3(); } processData() { this.nodeDataRefresh = true; this.animationState.transition("updateData"); } formatLabel(value) { return formatLabel(value, this.properties.scale); } getShapeFillBBox() { const { properties, originX, originY, horizontal, scale } = this; const { thickness } = properties; const length = (0, import_ag_charts_core211.findRangeExtent)(scale.range); const bbox = new BBox20(originX, originY, horizontal ? length : thickness, horizontal ? thickness : length); return { axis: bbox, series: bbox }; } getTargets() { const { properties } = this; const defaultTarget = properties.defaultTarget; return Array.from(properties.targets).map((target) => { const { text: text2 = defaultTarget.text, value = defaultTarget.value ?? 0, shape = defaultTarget.shape ?? "triangle", rotation = defaultTarget.rotation ?? 0, placement = defaultTarget.placement ?? "middle", spacing = defaultTarget.spacing ?? 0, size = defaultTarget.size ?? 0 } = target; const { enabled: labelEnabled = defaultTarget.label.enabled, color: labelColor = defaultTarget.label.color ?? "black", fontStyle: labelFontStyle = defaultTarget.label.fontStyle ?? "normal", fontWeight: labelFontWeight = defaultTarget.label.fontWeight ?? "normal", fontSize: labelFontSize = defaultTarget.label.fontSize, fontFamily: labelFontFamily = defaultTarget.label.fontFamily, spacing: labelSpacing = defaultTarget.label.spacing ?? 0 } = target.label; return { text: text2, value, shape, placement, spacing, size, rotation, label: { enabled: labelEnabled, color: labelColor, fontStyle: labelFontStyle, fontWeight: labelFontWeight, fontSize: labelFontSize, fontFamily: labelFontFamily, spacing: labelSpacing }, style: target.getStyle(defaultTarget) }; }); } getTargetPoint(target) { const { properties, originX, originY, horizontal, scale, gaugeRect } = this; const { thickness } = properties; const { value, placement, spacing, size } = target; const mainOffset = scale.convert(value); let crossOffset; switch (placement) { case "before": crossOffset = -(spacing + size / 2); break; case "after": crossOffset = thickness + spacing + size / 2; break; default: crossOffset = thickness / 2; break; } return { x: originX + gaugeRect.x + (horizontal ? mainOffset : crossOffset), y: originY + gaugeRect.y + (horizontal ? crossOffset : mainOffset) }; } getTargetLabel(target) { const { size, placement, label } = target; const { spacing, color: fill, fontStyle, fontWeight, fontSize, fontFamily } = label; const lineHeight = void 0; const offset = size / 2 + spacing; let textAlign; let textBaseline; let offsetX = 0; let offsetY = 0; if (this.horizontal) { textAlign = "center"; if (placement === "after") { textBaseline = "top"; offsetY = offset; } else { textBaseline = "bottom"; offsetY = -offset; } } else { textBaseline = "middle"; if (placement === "before") { textAlign = "right"; offsetX = -offset; } else { textAlign = "left"; offsetX = offset; } } return { offsetX, offsetY, fill, textAlign, textBaseline, fontStyle, fontWeight, fontSize, fontFamily, lineHeight }; } labelDatum(label, value) { const { placement, avoidCollisions, spacing, text: text2, color: fill, fontSize, minimumFontSize, fontStyle, fontWeight, fontFamily, lineHeight, wrapping, overflowStrategy, formatter = (params) => this.formatLabel(params.value) } = label; return { placement, avoidCollisions, spacing, text: text2, value, fill, fontSize, minimumFontSize, fontStyle, fontWeight, fontFamily, lineHeight, wrapping, overflowStrategy, formatter }; } verticalLabelInset() { const { label } = this.properties; const measurer3 = (0, import_ag_charts_core211.cachedTextMeasurer)(label); const lines = label.text?.split("\n"); const labelSize = (label.lineHeight ?? measurer3.lineHeight()) * (lines?.length ?? 1); return label.spacing + labelSize; } horizontalLabelInset() { const { scale, properties } = this; const { scale: scaleProps, label } = properties; const lines = label.text?.split("\n"); const measurer3 = (0, import_ag_charts_core211.cachedTextMeasurer)(label); const ticks = scaleProps.interval.values ?? scale.ticks({ nice: [false, false], interval: scaleProps.interval.step, minTickCount: 0, maxTickCount: 6, tickCount: 5 })?.ticks ?? []; const linesOrTicks = lines ?? ticks?.map((tick) => getLabelText(this.id, this.ctx, this.labelDatum(label, tick)) ?? ""); const labelSize = linesOrTicks.reduce((accum, text2) => { const { width } = (0, import_ag_charts_core211.isArray)(text2) ? (0, import_ag_charts_core211.measureTextSegments)(text2, label) : measurer3.measureLines((0, import_ag_charts_core211.toTextString)(text2)); return Math.max(accum, width); }, 0); return label.spacing + labelSize; } tickFormatter(domain, ticks) { const { format, formatter } = this.properties.scale.label; let tickFormatter; if (format != null) { tickFormatter = (0, import_ag_charts_core211.tickFormat)(ticks, typeof format === "string" ? format : void 0); } return (value, index) => { let r = void 0; if (formatter) { r ?? (r = formatWithContext(this.ctx, formatter, { value, index, domain, boundSeries: void 0 })); } r ?? (r = tickFormatter?.(value)); return r ?? this.formatLabel(value); }; } createNodeData() { const { id: seriesId, properties, horizontal, scale, seriesRect } = this; const { value, segmentation, thickness, cornerRadius, cornerMode, bar, scale: scaleProps, label, defaultColorRange, defaultScale } = properties; scale.domain = [scaleProps.min, scaleProps.max]; scale.range = horizontal ? [0, seriesRect.width] : [seriesRect.height, 0]; let axisRotation; let sideFlag; if (horizontal) { sideFlag = 1; axisRotation = Math.PI / -2; } else if (scaleProps.label.placement === "before") { sideFlag = 1; axisRotation = 0; } else { sideFlag = -1; axisRotation = 0; } let x0; let x1; let y0; let y1; if (horizontal) { x0 = 0; x1 = seriesRect.width; y0 = (seriesRect.height - thickness) / 2; y1 = y0 + thickness; if (label.placement === "outside-start") { x0 += this.horizontalLabelInset(); } else if (label.placement === "outside-end") { x1 -= this.horizontalLabelInset(); } } else { x0 = (seriesRect.width - thickness) / 2; x1 = x0 + thickness; y1 = 0; y0 = seriesRect.height; if (label.placement === "outside-start") { y0 -= this.verticalLabelInset(); } else if (label.placement === "outside-end") { y1 += this.verticalLabelInset(); } } this.gaugeRect = new BBox20(Math.min(x0, x1), Math.min(y0, y1), Math.abs(x1 - x0), Math.abs(y1 - y0)); const originX = 0; const originY = 0; scale.domain = [scaleProps.min, scaleProps.max]; scale.range = horizontal ? [x0, x1] : [y0, y1]; const scaleLabel = (0, import_ag_charts_core211.mergeDefaults)({ parallel: horizontal }, scaleProps.label, defaultScale.label); const { tickData: { ticks: tickData } } = generateTicks2({ scale, label: scaleLabel, interval: scaleProps.interval, tickFormatter: (domain, ticks) => this.tickFormatter(domain, ticks), domain: scale.domain, range: this.range, reverse: false, primaryTickCount: void 0, defaultTickMinSpacing: 0, visibleRange: [0, 1], niceMode: [NiceMode.Off, NiceMode.Off], labelOffset: 0, axisRotation, sideFlag }); const isReversed = false; const targets = this.getTargets(); const nodeData = []; const targetData = []; const labelData = []; const scaleData = []; const [m0, m1] = scale.range; const mainAxisSize = Math.abs(m1 - m0); const containerX = horizontal ? scale.convert(value) : x1; const containerY = horizontal ? y1 : scale.convert(value); const inset = segmentation.enabled ? segmentation.spacing / 2 : 0; const horizontalInset = horizontal ? inset : 0; const verticalInset = horizontal ? 0 : inset; const barThickness = Math.min(bar.thickness ?? Math.round(bar.thicknessRatio * thickness), thickness); const barInset = -(thickness - barThickness) / 2; const barXInset = horizontal ? 0 : barInset; const barYInset = horizontal ? barInset : 0; const cornersOnAllItems = cornerMode === "item"; const maxTicks = Math.ceil(mainAxisSize); let segments = segmentation.enabled ? segmentation.interval.getSegments(scale, maxTicks) : void 0; const barStyle = bar.getStyle(defaultColorRange, horizontal, scale); const scaleStyle = scaleProps.getStyle(bar.enabled, defaultColorRange, horizontal, scale); if (segments == null && cornersOnAllItems) { const segmentStart = Math.min(...scale.domain); const segmentEnd = Math.max(...scale.domain); const datum = { value, segmentStart, segmentEnd }; if (bar.enabled) { const barAppliedCornerRadius = Math.min(cornerRadius, barThickness / 2, mainAxisSize / 2); const barCornerInset = barAppliedCornerRadius * (isReversed ? -1 : 1); const barCornerXInset = horizontal ? barCornerInset : 0; const barCornerYInset = horizontal ? 0 : barCornerInset; nodeData.push({ series: this, itemId: `value`, datum, datumIndex: { type: 0 /* Node */ }, type: 0 /* Node */, x0: originX + x0 - barCornerXInset - barXInset, y0: originY + y0 - barCornerYInset - barYInset, x1: originX + containerX + barCornerXInset + barXInset, y1: originY + containerY + barCornerYInset + barYInset, clipX0: void 0, clipY0: void 0, clipX1: void 0, clipY1: void 0, topLeftCornerRadius: cornerRadius, topRightCornerRadius: cornerRadius, bottomRightCornerRadius: cornerRadius, bottomLeftCornerRadius: cornerRadius, horizontalInset, verticalInset, style: barStyle }); } const scaleAppliedCornerRadius = Math.min(cornerRadius, thickness / 2, mainAxisSize / 2); const scaleCornerInset = scaleAppliedCornerRadius * (isReversed ? -1 : 1); const scaleCornerXInset = horizontal ? scaleCornerInset : 0; const scaleCornerYInset = horizontal ? 0 : scaleCornerInset; scaleData.push({ series: this, itemId: `scale`, datum, datumIndex: { type: 0 /* Node */ }, type: 0 /* Node */, x0: originX + x0 - scaleCornerXInset, y0: originY + y0 - scaleCornerYInset, x1: originX + x1 + scaleCornerXInset, y1: originY + y1 + scaleCornerYInset, clipX0: void 0, clipY0: void 0, clipX1: void 0, clipY1: void 0, topLeftCornerRadius: cornerRadius, topRightCornerRadius: cornerRadius, bottomRightCornerRadius: cornerRadius, bottomLeftCornerRadius: cornerRadius, horizontalInset, verticalInset, style: scaleStyle }); } else { segments ?? (segments = scale.domain); const clipX0 = originX + x0 - barXInset; const clipY0 = originY + y0 - barYInset; const clipX1 = originX + containerX + barXInset; const clipY1 = originY + containerY + barYInset; for (let i = 0; i < segments.length - 1; i += 1) { const segmentStart = segments[i + 0]; const segmentEnd = segments[i + 1]; const datum = { value, segmentStart, segmentEnd }; const isStart = i === 0; const isEnd = i === segments.length - 2; const itemStart = scale.convert(segmentStart); const itemEnd = scale.convert(segmentEnd); const startCornerRadius = cornersOnAllItems || isStart ? cornerRadius : 0; const endCornerRadius = cornersOnAllItems || isEnd ? cornerRadius : 0; const topLeftCornerRadius = horizontal ? startCornerRadius : endCornerRadius; const topRightCornerRadius = endCornerRadius; const bottomRightCornerRadius = horizontal ? endCornerRadius : startCornerRadius; const bottomLeftCornerRadius = startCornerRadius; if (bar.enabled) { nodeData.push({ series: this, itemId: `value-${i}`, datum, datumIndex: { type: 0 /* Node */ }, type: 0 /* Node */, x0: originX + (horizontal ? itemStart : x0), y0: originY + (horizontal ? y0 : itemStart), x1: originX + (horizontal ? itemEnd : x1), y1: originY + (horizontal ? y1 : itemEnd), clipX0, clipY0, clipX1, clipY1, topLeftCornerRadius, topRightCornerRadius, bottomRightCornerRadius, bottomLeftCornerRadius, horizontalInset, verticalInset, style: barStyle }); } scaleData.push({ series: this, itemId: `scale-${i}`, datum, datumIndex: { type: 0 /* Node */ }, type: 0 /* Node */, x0: originX + (horizontal ? itemStart : x0), y0: originY + (horizontal ? y0 : itemStart), x1: originX + (horizontal ? itemEnd : x1), y1: originY + (horizontal ? y1 : itemEnd), clipX0: void 0, clipY0: void 0, clipX1: void 0, clipY1: void 0, topLeftCornerRadius, topRightCornerRadius, bottomRightCornerRadius, bottomLeftCornerRadius, horizontalInset, verticalInset, style: scaleStyle }); } } for (const dataArray of [scaleData, nodeData]) { for (const datum of dataArray) { const dx0 = datum.clipX0 ?? datum.x0; const dx1 = datum.clipX1 ?? datum.x1; const dy0 = datum.clipY0 ?? datum.y0; const dy1 = datum.clipY1 ?? datum.y1; datum.midPoint = { x: (dx0 + dx1) / 2, y: (dy0 + dy1) / 2 }; } } if (label.enabled) { labelData.push(this.labelDatum(label, value)); } const targetPlacementRotation2 = horizontal ? horizontalTargetPlacementRotation : verticalTargetPlacementRotation; for (let i = 0; i < targets.length; i += 1) { const target = targets[i]; const { value: targetValue, text: text2, shape, size, style } = target; const targetPoint = this.getTargetPoint(target); const targetRotation = (0, import_ag_charts_core211.toRadians)(target.rotation + targetPlacementRotation2[target.placement]); targetData.push({ series: this, itemId: `target-${i}`, midPoint: targetPoint, datum: { value: targetValue }, datumIndex: { type: 1 /* Target */, index: i }, type: 1 /* Target */, value: targetValue, text: text2, x: targetPoint.x, y: targetPoint.y, shape, size, rotation: targetRotation, label: this.getTargetLabel(target), style }); } return { itemId: seriesId, nodeData, tickData, targetData, labelData, scaleData }; } findNodeDatum(itemId) { return findGaugeNodeDatum(this, itemId); } updateSelections(resize) { if (this.nodeDataRefresh || resize) { this.contextNodeData = this.createNodeData(); this.nodeDataRefresh = false; } } highlightDatum(node) { if (node?.series === this && node.type === 1 /* Target */) { return node; } } update({ seriesRect }) { const { datumSelection, labelSelection, targetSelection, targetLabelSelection, scaleSelection, highlightTargetSelection, tickSelection } = this; this.seriesRect = seriesRect ?? BBox20.NaN; const resize = this.checkResize(seriesRect); this.updateSelections(resize); this.contentGroup.visible = this.visible; this.contentGroup.opacity = this.getOpacity(); const nodeData = this.contextNodeData?.nodeData ?? []; const labelData = this.contextNodeData?.labelData ?? []; const targetData = this.contextNodeData?.targetData ?? []; const scaleData = this.contextNodeData?.scaleData ?? []; const tickData = this.contextNodeData?.tickData ?? []; const highlightTargetDatum = this.highlightDatum(this.ctx.highlightManager.getActiveHighlight()); this.scaleSelection = this.updateScaleSelection({ scaleData, scaleSelection }); this.updateScaleNodes({ scaleSelection }); this.targetSelection = this.updateTargetSelection({ targetData, targetSelection }); this.updateTargetNodes({ targetSelection, isHighlight: false }); this.targetLabelSelection = this.updateTargetLabelSelection({ targetData, targetLabelSelection }); this.updateTargetLabelNodes({ targetLabelSelection }); this.datumSelection = this.updateDatumSelection({ nodeData, datumSelection }); this.updateDatumNodes({ datumSelection }); this.labelSelection = this.updateLabelSelection({ labelData, labelSelection }); this.updateLabelNodes({ labelSelection }); this.highlightTargetSelection = this.updateTargetSelection({ targetData: highlightTargetDatum == null ? [] : [highlightTargetDatum], targetSelection: highlightTargetSelection }); this.updateTargetNodes({ targetSelection: highlightTargetSelection, isHighlight: true }); this.tickSelection = this.updateTickSelection({ tickData, tickSelection }); this.updateTickNodes({ tickSelection }); if (resize) { this.animationState.transition("resize"); } this.animationState.transition("update"); } updateDatumSelection(opts) { return opts.datumSelection.update(opts.nodeData, void 0, (datum) => { return createDatumId10(opts.nodeData.length, datum.itemId); }); } updateDatumNodes(opts) { const { datumSelection } = opts; const { ctx } = this; const animationDisabled = ctx.animationManager.isSkipped(); const fillBBox = this.getShapeFillBBox(); datumSelection.each((rect, datum) => { const { topLeftCornerRadius, topRightCornerRadius, bottomRightCornerRadius, bottomLeftCornerRadius } = datum; rect.setStyleProperties(datum.style, fillBBox); rect.topLeftCornerRadius = topLeftCornerRadius; rect.topRightCornerRadius = topRightCornerRadius; rect.bottomRightCornerRadius = bottomRightCornerRadius; rect.bottomLeftCornerRadius = bottomLeftCornerRadius; rect.pointerEvents = this.properties.bar.enabled ? import_ag_charts_community186._ModuleSupport.PointerEvents.All : import_ag_charts_community186._ModuleSupport.PointerEvents.None; if (animationDisabled || rect.previousDatum == null) { rect.setProperties(resetLinearGaugeSeriesResetRectFunction(rect, datum)); } }); const { horizontal } = this; this.datumUnion.update(datumSelection, this.itemGroup, import_ag_charts_community186._ModuleSupport.Rect, (node, first, last) => { const left = Math.min(first.x, last.x); const right = Math.max(first.x + first.width, last.x + last.width); const top = Math.min(first.y, last.y); const bottom = Math.max(first.y + first.height, last.y + last.height); const width = right - left; const height = bottom - top; node.pointerEvents = import_ag_charts_community186._ModuleSupport.PointerEvents.None; node.x = left; node.y = top; node.width = width; node.height = height; node.topLeftCornerRadius = horizontal ? first.topLeftCornerRadius : last.topLeftCornerRadius; node.topRightCornerRadius = last.topRightCornerRadius; node.bottomRightCornerRadius = horizontal ? last.bottomRightCornerRadius : first.bottomRightCornerRadius; node.bottomLeftCornerRadius = first.bottomLeftCornerRadius; const firstClipBBox = first.clipBBox; const lastClipBBox = last.clipBBox ?? firstClipBBox; if (firstClipBBox && lastClipBBox) { node.clipBBox = BBox20.merge([firstClipBBox, lastClipBBox]).intersection( horizontal ? new BBox20(left, -Infinity, width, Infinity) : new BBox20(-Infinity, top, Infinity, height) ); } else { node.clipBBox = void 0; } }); } updateScaleSelection(opts) { return opts.scaleSelection.update(opts.scaleData, void 0, (datum) => { return createDatumId10(opts.scaleData.length, datum.itemId); }); } updateScaleNodes(opts) { const { scaleSelection } = opts; const fillBBox = this.getShapeFillBBox(); scaleSelection.each((rect, datum) => { const { topLeftCornerRadius, topRightCornerRadius, bottomRightCornerRadius, bottomLeftCornerRadius } = datum; rect.setStyleProperties(datum.style, fillBBox); rect.setProperties(resetLinearGaugeSeriesResetRectFunction(rect, datum)); rect.topLeftCornerRadius = topLeftCornerRadius; rect.topRightCornerRadius = topRightCornerRadius; rect.bottomRightCornerRadius = bottomRightCornerRadius; rect.bottomLeftCornerRadius = bottomLeftCornerRadius; rect.setProperties(resetLinearGaugeSeriesResetRectFunction(rect, datum)); }); } updateTargetSelection(opts) { return opts.targetSelection.update(opts.targetData, void 0, (target) => target.itemId); } updateTargetNodes(opts) { const { targetSelection, isHighlight } = opts; targetSelection.each((target, datum) => { const { x, y, shape, size, rotation } = datum; const style = this.getTargetStyle(isHighlight, datum); target.setStyleProperties(style); target.size = size; target.shape = shape === "line" ? lineMarker : shape; target.translationX = x; target.translationY = y; target.rotation = rotation; }); } getTargetStyle(isHighlight, { datumIndex, style }) { const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); return (0, import_ag_charts_core211.mergeDefaults)(highlightStyle, { ...style, opacity: 1 }); } updateTargetLabelSelection(opts) { return opts.targetLabelSelection.update(opts.targetData); } updateTargetLabelNodes(opts) { const { targetLabelSelection } = opts; targetLabelSelection.each((label, target) => { const { x, y, text: text2 } = target; const { offsetX, offsetY, fill, fontStyle, fontWeight, fontSize, fontFamily, textAlign, textBaseline } = target.label; label.visible = true; label.x = x + offsetX; label.y = y + offsetY; label.text = text2; label.fill = fill; label.fontStyle = fontStyle; label.fontWeight = fontWeight; label.fontSize = fontSize; label.fontFamily = fontFamily; label.textAlign = textAlign; label.textBaseline = textBaseline; }); } updateTickSelection(opts) { return opts.tickSelection.update(opts.tickData, void 0, (datum) => datum.tickId); } updateTickNodes(opts) { const { gaugeRect, properties } = this; const defaultScale = properties.defaultScale; const { enabled, color: color7, fontFamily = defaultScale.label.fontFamily, fontSize = defaultScale.label.fontSize, fontStyle, fontWeight = defaultScale.label.fontWeight, spacing } = properties.scale.label; let { placement } = properties.scale.label; const rotation = (0, import_ag_charts_core211.toRadians)(properties.scale.label.rotation ?? 0); let textAlign; let textBaseline; let textX; let textY; if (this.horizontal) { placement ?? (placement = "after"); textAlign = "center"; textBaseline = placement === "before" ? "bottom" : "top"; textY = this.originY + gaugeRect.y + (placement === "before" ? -spacing : gaugeRect.height + spacing); } else { placement ?? (placement = "before"); textAlign = placement === "before" ? "end" : "start"; textBaseline = "middle"; textX = this.originX + gaugeRect.x + (placement === "before" ? -spacing : gaugeRect.width + spacing); } opts.tickSelection.each((label, datum) => { if (!enabled) { label.visible = false; return; } const x = textX ?? datum.translation; const y = textY ?? datum.translation; label.visible = true; label.text = datum.tickLabel; label.fill = color7; label.fontFamily = fontFamily; label.fontSize = fontSize; label.fontStyle = fontStyle; label.fontWeight = fontWeight; label.textBaseline = textBaseline; label.textAlign = textAlign; label.x = x; label.y = y; label.rotationCenterX = x; label.rotationCenterY = y; label.rotation = rotation; }); } updateLabelSelection(opts) { return opts.labelSelection.update(opts.labelData, void 0, (_datum) => "primary"); } updateLabelNodes(opts) { const { labelSelection } = opts; const animationDisabled = this.ctx.animationManager.isSkipped(); labelSelection.each((label, datum) => { label.fill = datum.fill; label.fontStyle = datum.fontStyle; label.fontWeight = datum.fontWeight; label.fontFamily = datum.fontFamily; }); if (animationDisabled || this.labelsHaveExplicitText()) { this.formatLabelText(); } } labelsHaveExplicitText() { for (const { datum } of this.labelSelection) { if (datum.text == null) { return false; } } return true; } formatLabelText(datum) { const { labelSelection, horizontal, scale, seriesRect, gaugeRect } = this; const { x, y, width, height } = gaugeRect; const value = datum?.label ?? this.properties.value; let barRect; if (horizontal) { const xValue = scale.convert(value); barRect = new BBox20(x, y, xValue - x, height); } else { const yValue = scale.convert(value); barRect = new BBox20(x, yValue, width, height - yValue); } const bboxes = { seriesRect, gaugeRect, barRect }; const { margin: padding2 } = this.properties; formatLinearGaugeLabels(this, this.ctx, labelSelection, { padding: padding2, horizontal }, bboxes, datum); } resetAllAnimation() { this.ctx.animationManager.stopByAnimationGroupId(this.id); resetMotion3([this.datumSelection], resetLinearGaugeSeriesResetRectFunction); this.formatLabelText(); } resetAnimation(phase) { if (phase === "initial") { this.animationState.transition("reset"); } else if (phase === "ready") { this.animationState.transition("skip"); } } animateLabelText(params = {}) { const { animationManager } = this.ctx; let labelFrom = 0; let labelTo = 0; this.labelSelection.each((label, datum) => { label.opacity = 1; labelFrom = label.previousDatum?.value ?? params.from ?? datum.value; labelTo = datum.value; }); if (this.labelsHaveExplicitText()) { } else if (labelFrom === labelTo) { this.formatLabelText({ label: labelTo }); } else { const animationId = `${this.id}_labels`; animationManager.animate({ id: animationId, groupId: "label", from: { label: labelFrom }, to: { label: labelTo }, phase: params.phase ?? "update", ease: import_ag_charts_core211.easeOut, onUpdate: (datum) => this.formatLabelText(datum), onStop: () => this.formatLabelText({ label: labelTo }) }); } } animateEmptyUpdateReady() { const { animationManager } = this.ctx; const { node } = prepareLinearGaugeSeriesAnimationFunctions(true, this.horizontal); fromToMotion2(this.id, "node", animationManager, [this.datumSelection], node, (_sector, datum) => datum.itemId); fromToMotion2(this.id, "label", animationManager, [this.labelSelection], fadeInFns, () => "primary"); this.animateLabelText({ from: 0, phase: "initial" }); } animateWaitingUpdateReady() { const { animationManager } = this.ctx; const { node } = prepareLinearGaugeSeriesAnimationFunctions(false, this.horizontal); fromToMotion2(this.id, "node", animationManager, [this.datumSelection], node, (_sector, datum) => datum.itemId); this.animateLabelText(); } animateReadyResize() { this.resetAllAnimation(); } getSeriesDomain() { return { domain: [0, 1] }; } dataCount() { return Number.NaN; } getSeriesRange() { return [Number.NaN, Number.NaN]; } getLegendData() { return []; } getTooltipContent(datumIndex) { const { id: seriesId, properties } = this; const { tooltip } = properties; if (datumIndex == null) return; let value; let text2; let fallbackLabel; if (datumIndex.type === 0 /* Node */) { value = properties.value; text2 = properties.label.text; fallbackLabel = this.ctx.localeManager.t("ariaLabelGaugeValue"); } else { ({ value, text: text2 } = properties.targets[datumIndex.index]); fallbackLabel = this.ctx.localeManager.t("ariaLabelGaugeTarget"); } if (value == null) return; return this.formatTooltipWithContext( tooltip, { data: [{ label: text2, fallbackLabel, value: this.formatLabel(value) }] }, { seriesId, title: void 0, datum: void 0, value } ); } pickNodeClosestDatum(point) { return pickGaugeNearestDatum(this, point); } pickFocus(opts) { return pickGaugeFocus(this, opts); } getCaptionText() { return this.formatLabel(this.properties.value); } getCategoryValue(_datumIndex) { return; } datumIndexForCategoryValue(_categoryValue) { return; } hasItemStylers() { return this.properties.label.itemStyler != null; } }; LinearGaugeSeries.className = "LinearGaugeSeries"; LinearGaugeSeries.type = "linear-gauge"; // packages/ag-charts-enterprise/src/series/linear-gauge/linearGaugeModule.ts var themeTemplate2 = { minWidth: 200, minHeight: 200, tooltip: { enabled: false }, series: { thickness: 50, defaultColorRange: { $if: [ { $eq: [{ $palette: "type" }, "inbuilt"] }, { $interpolate: [{ $palette: "secondDivergingColors" }, 5] }, import_ag_charts_core212.SAFE_RANGE2_OPERATION ] }, scale: { // @ts-expect-error undocumented option defaultFill: { $path: ["/1", { $palette: "fill" }, { $palette: "hierarchyColors" }] }, // TODO: mix backgroundColor and foregroundColor? stroke: { $path: ["/2", import_ag_charts_core212.SAFE_STROKE_FILL_OPERATION, { $palette: "hierarchyColors" }] }, // TODO: mix backgroundColor and foregroundColor? strokeWidth: { $isUserOption: ["./stroke", 2, 0] }, label: { spacing: 11 } }, bar: { strokeWidth: { $isUserOption: ["./stroke", 2, 0] } }, segmentation: { enabled: false, interval: {}, spacing: 1 }, defaultTarget: { fill: { $ref: "foregroundColor" }, stroke: { $ref: "foregroundColor" }, size: 10, shape: "triangle", placement: "after", spacing: 5, label: { enabled: true, fontWeight: { $ref: "fontWeight" }, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, color: { $ref: "textColor" }, spacing: 5 } }, defaultScale: { label: { fontWeight: { $ref: "fontWeight" }, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, color: { $ref: "textColor" } } }, label: { ...import_ag_charts_core212.LABEL_BOXING_DEFAULTS, enabled: false, placement: "inside-start", fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, fontSize: { $rem: 2 }, minimumFontSize: import_ag_charts_core212.FONT_SIZE.SMALL, spacing: 18, color: { $ref: "chartBackgroundColor" } }, margin: 4, tooltip: { range: { $path: ["/tooltip/range", 10] } } } }; var LinearGaugeModule = { type: "series", name: "linear-gauge", chartType: "standalone", enterprise: true, dependencies: [GaugePresetModule], version: import_ag_charts_community187.VERSION, options: import_ag_charts_core212.linearGaugeSeriesOptionsDef, themeTemplate: themeTemplate2, create: (ctx) => new LinearGaugeSeries(ctx) }; // packages/ag-charts-enterprise/src/series/map-line/mapLineModule.ts var import_ag_charts_community196 = require("ag-charts-community"); var import_ag_charts_core220 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/charts/topologyChartModule.ts var import_ag_charts_community189 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/charts/topologyChart.ts var import_ag_charts_community188 = require("ag-charts-community"); var import_ag_charts_core213 = require("ag-charts-core"); var { Chart: Chart2, MercatorScale } = import_ag_charts_community188._ModuleSupport; function isTopologySeries(series) { return series.type === "map-shape" || series.type === "map-line" || series.type === "map-marker" || series.type === "map-shape-background" || series.type === "map-line-background"; } var TopologyChart = class extends Chart2 { constructor(options, resources) { super(options, resources); this.xAxis = { id: (0, import_ag_charts_core213.createId)(import_ag_charts_community188._ModuleSupport.Axis), direction: import_ag_charts_core213.ChartAxisDirection.X }; this.yAxis = { id: (0, import_ag_charts_core213.createId)(import_ag_charts_community188._ModuleSupport.Axis), direction: import_ag_charts_core213.ChartAxisDirection.Y }; this.ctx.zoomManager.setAxes([this.xAxis, this.yAxis]); } getChartType() { return "topology"; } updateData() { super.updateData(); const options = this.getOptions(); if (this.topology !== options.topology) { this.topology = options.topology; } const { topology } = this; for (const series of this.series) { if (isTopologySeries(series)) { series.setChartTopology(topology); } } } performLayout(ctx) { const { seriesRoot, annotationRoot } = this; const seriesRect = ctx.layoutBox.clone().shrink(this.seriesArea.getPadding()); this.seriesRect = seriesRect; this.animationRect = seriesRect; const mapSeries = this.series; const combinedBbox = mapSeries.reduce((combined, series) => { if (!series.visible) return combined; const bbox = series.topologyBounds; if (bbox == null) return combined; if (combined == null) return bbox; return combined.merge(bbox); }, void 0); let scale; if (combinedBbox != null) { const { lon0, lat0, lon1, lat1 } = combinedBbox; const domain = [ [lon0, lat0], [lon1, lat1] ]; const bounds = MercatorScale.bounds(domain); const { width, height } = seriesRect; const viewBoxScale = Math.min(width / bounds.width, height / bounds.height); const viewBoxWidth = bounds.width * viewBoxScale; const viewBoxHeight = bounds.height * viewBoxScale; const viewBoxOriginX = (width - viewBoxWidth) / 2; const viewBoxOriginY = (height - viewBoxHeight) / 2; const x0 = viewBoxOriginX; const y0 = viewBoxOriginY; const x1 = viewBoxOriginX + viewBoxWidth; const y1 = viewBoxOriginY + viewBoxHeight; const xZoom = this.ctx.zoomManager.getAxisZoom(this.xAxis.id); const yZoom = this.ctx.zoomManager.getAxisZoom(this.yAxis.id); const xSpan = (x1 - x0) / (xZoom.max - xZoom.min); const xStart = x0 - xSpan * xZoom.min; const ySpan = (y1 - y0) / (1 - yZoom.min - (1 - yZoom.max)); const yStart = y0 - ySpan * (1 - yZoom.max); scale = new MercatorScale(domain, [ [xStart, yStart], [xStart + xSpan, yStart + ySpan] ]); } for (const series of mapSeries) { series.scale = scale; } const seriesVisible = this.series.some((s) => s.visible); seriesRoot.visible = seriesVisible; for (const group of [seriesRoot, annotationRoot]) { group.translationX = Math.floor(seriesRect.x); group.translationY = Math.floor(seriesRect.y); group.setClipRect(seriesRect.clone()); } this.ctx.layoutManager.emitLayoutComplete(ctx, { series: { visible: seriesVisible, rect: seriesRect, paddedRect: ctx.layoutBox } }); } }; TopologyChart.className = "TopologyChart"; TopologyChart.type = "topology"; __decorateClass([ import_ag_charts_core213.Property ], TopologyChart.prototype, "topology", 2); // packages/ag-charts-enterprise/src/charts/topologyChartModule.ts var { topologyChartOptionsDefs } = import_ag_charts_community189._ModuleSupport; var TopologyChartModule = { type: "chart", name: "topology", enterprise: true, version: import_ag_charts_community189.VERSION, options: topologyChartOptionsDefs, create(options, resources) { return new TopologyChart(options, resources); } }; // packages/ag-charts-enterprise/src/series/map-util/mapThemeDefaults.ts var import_ag_charts_core214 = require("ag-charts-core"); var MAP_THEME_DEFAULTS = { zoom: { axes: "xy", anchorPointX: "pointer", anchorPointY: "pointer", buttons: { // @ts-expect-error undocumented options anchorPointX: "middle", anchorPointY: "middle" } }, legend: { enabled: false } }; function applyMapPalette(object) { const clone = (0, import_ag_charts_core214.deepClone)(object); (0, import_ag_charts_core214.jsonWalk)(clone, (value) => { if (typeof value === "object" && "$palette" in value) { value["$mapPalette"] = value["$palette"]; delete value["$palette"]; } }); return clone; } // packages/ag-charts-enterprise/src/series/map-line/mapLineSeries.ts var import_ag_charts_community194 = require("ag-charts-community"); var import_ag_charts_core218 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/map-util/geoGeometry.ts var import_ag_charts_community190 = require("ag-charts-community"); var import_ag_charts_core215 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/map-util/lineStringUtil.ts var delta2 = 1e-9; function lineSegmentDistanceToPointSquared(a, b, x, y) { const [ax, ay] = a; const [bx, by] = b; const abx = bx - ax; const aby = by - ay; const l = abx * abx + aby * aby; let x0; let y0; if (Math.abs(l) < delta2) { x0 = ax; y0 = ay; } else { let t = ((x - ax) * abx + (y - ay) * aby) / l; t = Math.max(0, Math.min(1, t)); x0 = ax + t * (bx - ax); y0 = ay + t * (by - ay); } const dx2 = x - x0; const dy2 = y - y0; return dx2 * dx2 + dy2 * dy2; } function lineStringDistance(lineString, x, y) { let minDistanceSquared = Infinity; let p0 = lineString.at(-1); for (const p1 of lineString) { minDistanceSquared = Math.min(minDistanceSquared, lineSegmentDistanceToPointSquared(p0, p1, x, y)); p0 = p1; } return Math.sqrt(minDistanceSquared); } function lineStringLength(lineSegment) { let [x0, y0] = lineSegment[0]; let totalDistance = 0; for (let i = 1; i < lineSegment.length; i += 1) { const [x1, y1] = lineSegment[i]; const distance = Math.hypot(x1 - x0, y1 - y0); totalDistance += distance; x0 = x1; y0 = y1; } return totalDistance; } function lineStringCenter(lineSegment) { if (lineSegment.length === 0) return; const targetDistance = lineStringLength(lineSegment) / 2; let [x0, y0] = lineSegment[0]; let totalDistance = 0; for (let i = 1; i < lineSegment.length; i += 1) { const [x1, y1] = lineSegment[i]; const segmentDistance = Math.hypot(x1 - x0, y1 - y0); const nextDistance = totalDistance + segmentDistance; if (nextDistance > targetDistance) { const ratio8 = (targetDistance - totalDistance) / segmentDistance; const point = [x0 + (x1 - x0) * ratio8, y0 + (y1 - y0) * ratio8]; const angle = Math.atan2(y1 - y0, x1 - x0); return { point, angle }; } totalDistance = nextDistance; x0 = x1; y0 = y1; } } // packages/ag-charts-enterprise/src/series/map-util/lonLatBbox.ts var LonLatBBox = class _LonLatBBox { constructor(lon0, lat0, lon1, lat1) { this.lon0 = lon0; this.lat0 = lat0; this.lon1 = lon1; this.lat1 = lat1; } extend(lon0, lat0, lon1, lat1) { this.lon0 = Math.min(this.lon0, lon0); this.lat0 = Math.min(this.lat0, lat0); this.lon1 = Math.max(this.lon1, lon1); this.lat1 = Math.max(this.lat1, lat1); return this; } merge(other) { return this.extend(other.lon0, other.lat0, other.lon1, other.lat1); } static extend(into, lon0, lat0, lon1, lat1) { return into ? into.extend(lon0, lat0, lon1, lat1) : new _LonLatBBox(lon0, lat0, lon1, lat1); } }; // packages/ag-charts-enterprise/src/series/map-util/polygonUtil.ts function polygonBbox(polygon, into) { for (const coordinates of polygon) { const [lon, lat] = coordinates; into = LonLatBBox.extend(into, lon, lat, lon, lat); } return into; } function polygonCentroid(polygon) { if (polygon.length === 0) return; let x = 0; let y = 0; let k = 0; let [x0, y0] = polygon.at(-1); for (const [x1, y1] of polygon) { const c = x0 * y1 - x1 * y0; k += c; x += (x0 + x1) * c; y += (y0 + y1) * c; x0 = x1; y0 = y1; } k *= 3; return [x / k, y / k]; } function polygonDistance(polygons, x, y) { let inside = false; let minDistanceSquared = Infinity; for (const polygon of polygons) { let p0 = polygon.at(-1); let [x0, y0] = p0; for (const p1 of polygon) { const [x1, y1] = p1; if (y1 > y !== y0 > y && x < (x0 - x1) * (y - y1) / (y0 - y1) + x1) { inside = !inside; } minDistanceSquared = Math.min(minDistanceSquared, lineSegmentDistanceToPointSquared(p0, p1, x, y)); p0 = p1; x0 = x1; y0 = y1; } } return (inside ? -1 : 1) * Math.sqrt(minDistanceSquared); } // packages/ag-charts-enterprise/src/series/map-util/geoGeometry.ts var { Path: Path11, ExtendedPath2D: ExtendedPath2D5, BBox: BBox21 } = import_ag_charts_community190._ModuleSupport; var GeoGeometry = class extends Path11 { constructor() { super(...arguments); this.projectedGeometry = void 0; this.renderMode = 3 /* All */; // Keep non-filled shapes separate so we don't fill them this.strokePath = new ExtendedPath2D5(); } computeBBox() { if (this.dirtyPath || this.isDirtyPath()) { this.updatePath(); this.dirtyPath = false; } return this.bbox?.clone(); } updatePath() { const { projectedGeometry } = this; this.strokePath.clear(); this.path.clear(); this.bbox = projectedGeometry == null ? void 0 : this.drawGeometry(projectedGeometry, void 0); } drawPath(ctx) { super.drawPath(ctx); this.renderStroke(ctx, this.strokePath.getPath2D()); } containsPoint(x, y) { const { projectedGeometry } = this; if (projectedGeometry == null) return false; if (!this.getBBox().containsPoint(x, y)) return false; return this.geometryDistance(projectedGeometry, x, y) <= 0; } distanceSquared(x, y) { const { projectedGeometry } = this; if (projectedGeometry == null) return Infinity; const distance = this.geometryDistance(projectedGeometry, x, y); return distance > 0 ? distance * distance : 0; } geometryDistance(geometry, x, y) { const { renderMode, strokeWidth } = this; const drawPolygons = (renderMode & 1 /* Polygons */) !== 0; const drawLines = (renderMode & 2 /* Lines */) !== 0; const minStrokeDistance = Math.max(strokeWidth / 2, 1) + 1; switch (geometry.type) { case "GeometryCollection": return geometry.geometries.reduce( (minDistance, g) => Math.min(minDistance, this.geometryDistance(g, x, y)), Infinity ); case "MultiPolygon": return drawPolygons ? geometry.coordinates.reduce( (minDistance, polygon) => Math.min(minDistance, Math.max(polygonDistance(polygon, x, y), 0)), Infinity ) : Infinity; case "Polygon": return drawPolygons ? Math.max(polygonDistance(geometry.coordinates, x, y), 0) : Infinity; case "MultiLineString": return drawLines ? geometry.coordinates.reduce((minDistance, lineString) => { return Math.min( minDistance, Math.max(lineStringDistance(lineString, x, y) - minStrokeDistance, 0) ); }, Infinity) : Infinity; case "LineString": return drawLines ? Math.max(lineStringDistance(geometry.coordinates, x, y) - minStrokeDistance, 0) : Infinity; case "MultiPoint": case "Point": default: return Infinity; } } shouldDrawPolygons() { return (this.renderMode & 1 /* Polygons */) !== 0; } shouldDrawLines() { return (this.renderMode & 2 /* Lines */) !== 0; } drawGeometryCollection(geometries, bbox) { for (const g of geometries) { bbox = this.drawGeometry(g, bbox); } return bbox; } drawMultiPolygon(coordinates, bbox) { if (!this.shouldDrawPolygons()) return bbox; for (const polygon of coordinates) { bbox = this.drawPolygon(this.path, polygon, bbox); } return bbox; } drawSinglePolygon(coordinates, bbox) { if (!this.shouldDrawPolygons()) return bbox; return this.drawPolygon(this.path, coordinates, bbox); } drawMultiLineString(coordinates, bbox) { if (!this.shouldDrawLines()) return bbox; for (const lineString of coordinates) { bbox = this.drawLineString(this.strokePath, lineString, bbox, false); } return bbox; } drawSingleLineString(coordinates, bbox) { if (!this.shouldDrawLines()) return bbox; return this.drawLineString(this.strokePath, coordinates, bbox, false); } drawGeometry(geometry, bbox) { switch (geometry.type) { case "GeometryCollection": return this.drawGeometryCollection(geometry.geometries, bbox); case "MultiPolygon": return this.drawMultiPolygon(geometry.coordinates, bbox); case "Polygon": return this.drawSinglePolygon(geometry.coordinates, bbox); case "MultiLineString": return this.drawMultiLineString(geometry.coordinates, bbox); case "LineString": return this.drawSingleLineString(geometry.coordinates, bbox); case "Point": case "MultiPoint": return bbox; } } drawPolygon(path, polygons, bbox) { if (polygons.length < 1) return bbox; bbox = this.drawLineString(path, polygons[0], bbox, true); for (let i = 1; i < polygons.length; i += 1) { const enclave = polygons[i]; this.drawLineString(path, enclave, void 0, true); } return bbox; } drawLineString(path, coordinates, bbox, isClosed) { if (coordinates.length < 2) return bbox; const end = isClosed ? coordinates.length - 1 : coordinates.length; for (let i = 0; i < end; i += 1) { const [x, y] = coordinates[i]; if (i === 0) { path.moveTo(x, y); } else { path.lineTo(x, y); } if (bbox == null) { bbox = new BBox21(x, y, 0, 0); } else { const { x: x0, y: y0 } = bbox; const x1 = x0 + bbox.width; const y1 = y0 + bbox.height; bbox.x = Math.min(x0, x); bbox.y = Math.min(y0, y); bbox.width = Math.max(x1, x) - bbox.x; bbox.height = Math.max(y1, y) - bbox.y; } } if (isClosed) { path.closePath(); } return bbox; } }; __decorateClass([ (0, import_ag_charts_core215.SceneObjectChangeDetection)({ equals: import_ag_charts_core215.objectsEqual }) ], GeoGeometry.prototype, "projectedGeometry", 2); __decorateClass([ (0, import_ag_charts_core215.SceneChangeDetection)() ], GeoGeometry.prototype, "renderMode", 2); // packages/ag-charts-enterprise/src/series/map-util/geometryUtil.ts var import_ag_charts_community191 = require("ag-charts-community"); var import_ag_charts_core216 = require("ag-charts-core"); function calculatePolygonArea(polygon) { const bbox = polygonBbox(polygon[0], void 0); if (bbox == null) return 0; return Math.abs(bbox.lat1 - bbox.lat0) * Math.abs(bbox.lon1 - bbox.lon0); } function findLargestByMetric(items, metric) { let maxValue; let maxItem; for (const item of items) { const value = metric(item); if (value == null) continue; if (maxValue == null || value > maxValue) { maxValue = value; maxItem = item; } } return maxItem; } function geometryBbox(geometry, into) { if (geometry.bbox != null) { const [lon0, lat0, lon1, lat1] = geometry.bbox; into = LonLatBBox.extend(into, lon0, lat0, lon1, lat1); return into; } switch (geometry.type) { case "GeometryCollection": for (const g of geometry.geometries) { into = geometryBbox(g, into); } break; case "MultiPolygon": for (const c of geometry.coordinates) { if (c.length > 0) { into = polygonBbox(c[0], into); } } break; case "Polygon": if (geometry.coordinates.length > 0) { into = polygonBbox(geometry.coordinates[0], into); } break; case "MultiLineString": for (const c of geometry.coordinates) { into = polygonBbox(c, into); } break; case "LineString": into = polygonBbox(geometry.coordinates, into); break; case "MultiPoint": for (const p of geometry.coordinates) { const [lon, lat] = p; into = LonLatBBox.extend(into, lon, lat, lon, lat); } break; case "Point": { const [lon, lat] = geometry.coordinates; into = LonLatBBox.extend(into, lon, lat, lon, lat); break; } } return into; } function largestPolygon(geometry) { switch (geometry.type) { case "Polygon": return geometry.coordinates; case "MultiPolygon": return findLargestByMetric(geometry.coordinates, calculatePolygonArea); case "GeometryCollection": { const polygons = geometry.geometries.map(largestPolygon).filter((p) => p != null); return findLargestByMetric(polygons, calculatePolygonArea); } case "MultiLineString": case "LineString": case "MultiPoint": case "Point": return; } } function largestLineString(geometry) { switch (geometry.type) { case "LineString": return geometry.coordinates; case "MultiLineString": return findLargestByMetric(geometry.coordinates, lineStringLength); case "GeometryCollection": { const lineStrings = geometry.geometries.map(largestLineString).filter((l) => l != null); return findLargestByMetric(lineStrings, lineStringLength); } case "MultiPolygon": case "Polygon": case "MultiPoint": case "Point": return; } } function containsType(geometry, type) { if (geometry == null) return false; switch (geometry.type) { case "GeometryCollection": return geometry.geometries.some((g) => containsType(g, type)); case "MultiPolygon": case "Polygon": return (type & 1 /* Polygon */) !== 0; case "MultiLineString": case "LineString": return (type & 2 /* LineString */) !== 0; case "MultiPoint": case "Point": return (type & 4 /* Point */) !== 0; } } function projectGeometry(geometry, scale) { switch (geometry.type) { case "GeometryCollection": return { type: "GeometryCollection", geometries: geometry.geometries.map((g) => projectGeometry(g, scale)) }; case "Polygon": return { type: "Polygon", coordinates: projectPolygon(geometry.coordinates, scale) }; case "MultiPolygon": return { type: "MultiPolygon", coordinates: projectMultiPolygon(geometry.coordinates, scale) }; case "MultiLineString": return { type: "MultiLineString", coordinates: projectPolygon(geometry.coordinates, scale) }; case "LineString": return { type: "LineString", coordinates: projectLineString(geometry.coordinates, scale) }; case "MultiPoint": return { type: "MultiPoint", coordinates: projectLineString(geometry.coordinates, scale) }; case "Point": return { type: "Point", coordinates: scale.convert(geometry.coordinates) }; } } function projectMultiPolygon(multiPolygon, scale) { return multiPolygon.map((polygon) => projectPolygon(polygon, scale)); } function projectPolygon(polygon, scale) { return polygon.map((lineString) => projectLineString(lineString, scale)); } function projectLineString(lineString, scale) { return lineString.map((lonLat) => scale.convert(lonLat)); } // packages/ag-charts-enterprise/src/series/map-util/mapUtil.ts function prepareMapMarkerAnimationFunctions() { const fromFn = (marker, _datum, status) => { if (status === "removed") { return { scalingX: 1, scalingY: 1 }; } else if (marker.previousDatum == null) { return { scalingX: 0, scalingY: 0 }; } return { scalingX: marker.scalingX, scalingY: marker.scalingY }; }; const toFn = (_marker, _datum, status) => { if (status === "removed") { return { scalingX: 0, scalingY: 0 }; } return { scalingX: 1, scalingY: 1 }; }; return { fromFn, toFn }; } function findFocusedGeoGeometry(series, opts) { const datum = series.contextNodeData?.nodeData[opts.datumIndex]; if (datum === void 0) return void 0; for (const node of series.datumSelection.nodes()) { if (node.datum === datum) { return node; } } return void 0; } // packages/ag-charts-enterprise/src/series/map-util/topologySeries.ts var import_ag_charts_community192 = require("ag-charts-community"); var TopologySeriesProperties = class extends import_ag_charts_community192._ModuleSupport.SeriesProperties { }; var TopologySeries = class extends import_ag_charts_community192._ModuleSupport.DataModelSeries { constructor(options) { super(options); this.cleanup.register( this.ctx.eventsHub.on("data:update", () => { }), this.ctx.eventsHub.on("legend:item-click", (event) => { this.onLegendItemClick(event); }), this.ctx.eventsHub.on("legend:item-double-click", (event) => { this.onLegendItemDoubleClick(event); }) ); } getSeriesDomain() { return { domain: [Number.NaN, Number.NaN] }; } getSeriesRange() { return [Number.NaN, Number.NaN]; } getHighlightedDatum() { let highlightedDatum = this.ctx.highlightManager?.getActiveHighlight(); const { legendItemName } = this.properties; const matchingLegendItemName = legendItemName != null && highlightedDatum?.datum == null && legendItemName === highlightedDatum?.legendItemName; if (highlightedDatum != null && (highlightedDatum.series !== this && !matchingLegendItemName || highlightedDatum.datum == null)) { highlightedDatum = void 0; } return highlightedDatum; } }; // packages/ag-charts-enterprise/src/series/map-line/mapLineSeriesProperties.ts var import_ag_charts_community193 = require("ag-charts-community"); var import_ag_charts_core217 = require("ag-charts-core"); var { SeriesProperties: SeriesProperties3, makeSeriesTooltip: makeSeriesTooltip12, Label: Label10 } = import_ag_charts_community193._ModuleSupport; var MapLineSeriesProperties = class extends SeriesProperties3 { constructor() { super(...arguments); this.topology = void 0; this.idKey = ""; this.topologyIdKey = "name"; this.idName = void 0; this.labelKey = void 0; this.labelName = void 0; this.colorRange = void 0; this.maxStrokeWidth = void 0; this.stroke = "black"; this.strokeOpacity = 1; this.strokeWidth = 0; this.lineDash = [0]; this.lineDashOffset = 0; this.label = new Label10(); this.tooltip = makeSeriesTooltip12(); } getStyle() { const { stroke: stroke3, strokeOpacity, strokeWidth, lineDash, lineDashOffset } = this; return { stroke: stroke3, strokeOpacity, strokeWidth, lineDash, lineDashOffset, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "topology", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "title", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "legendItemName", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "idKey", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "topologyIdKey", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "idName", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "labelKey", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "labelName", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "sizeKey", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "sizeName", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "colorKey", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "colorName", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "sizeDomain", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "colorRange", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "maxStrokeWidth", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core217.Property ], MapLineSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/map-line/mapLineSeries.ts var { getMissCount: getMissCount2, getLabelStyles: getLabelStyles2, createDatumId: createDatumId11, SeriesNodePickMode: SeriesNodePickMode9, valueProperty: valueProperty11, ColorScale: ColorScale2, LinearScale: LinearScale5, Selection: Selection8, Text: Text4, Transformable: Transformable3 } = import_ag_charts_community194._ModuleSupport; var MapLineSeries = class extends TopologySeries { constructor(moduleCtx) { super({ moduleCtx, categoryKey: void 0, propertyKeys: { size: ["colorKey"], color: ["colorKey"], label: ["labelKey"] }, propertyNames: { size: ["sizeName"], color: ["colorName"], label: ["labelName"] }, pickModes: [SeriesNodePickMode9.EXACT_SHAPE_MATCH, SeriesNodePickMode9.NEAREST_NODE], usesPlacedLabels: true }); this.properties = new MapLineSeriesProperties(); this._chartTopology = void 0; this.colorScale = new ColorScale2(); this.sizeScale = new LinearScale5(); this.datumSelection = Selection8.select( this.contentGroup, () => this.nodeFactory() ); this.labelSelection = Selection8.select(this.labelGroup, Text4); this.highlightDatumSelection = Selection8.select( this.highlightNodeGroup, () => this.nodeFactory() ); this.highlightLabelSelection = Selection8.select(this.highlightLabelGroup, Text4); this.placedLabelData = []; this._previousDatumMidPoint = void 0; } getNodeData() { return this.contextNodeData?.nodeData; } get topology() { return this.properties.topology ?? this._chartTopology; } get hasData() { return super.hasData && this.topology != null; } renderToOffscreenCanvas() { return true; } setZIndex(zIndex) { super.setZIndex(zIndex); this.contentGroup.zIndex = [1 /* ShapeLine */, zIndex]; this.highlightGroup.zIndex = [4 /* ShapeLineHighlight */, zIndex]; return true; } setChartTopology(topology) { this._chartTopology = topology; if (this.topology === topology) { this.nodeDataRefresh = true; } } isLabelEnabled() { return this.properties.labelKey != null && this.properties.label.enabled; } nodeFactory() { const geoGeometry = new GeoGeometry(); geoGeometry.renderMode = 2 /* Lines */; geoGeometry.lineJoin = "round"; geoGeometry.lineCap = "round"; return geoGeometry; } async processData(dataController) { if (this.data == null) return; const { data, topology, sizeScale, colorScale } = this; const { topologyIdKey, idKey, sizeKey, colorKey, labelKey, sizeDomain, colorRange } = this.properties; const featureById = /* @__PURE__ */ new Map(); for (const feature of topology?.features.values() ?? []) { const property = feature.properties?.[topologyIdKey]; if (property == null || !containsType(feature.geometry, 2 /* LineString */)) continue; featureById.set(property, feature); } const sizeScaleType = this.sizeScale.type; const colorScaleType = this.colorScale.type; const mercatorScaleType = this.scale?.type; const { dataModel, processedData } = await this.requestDataModel(dataController, data, { props: [ valueProperty11(idKey, mercatorScaleType, { id: "idValue", includeProperty: false }), valueProperty11(idKey, mercatorScaleType, { id: "featureValue", includeProperty: false, processor: () => (datum) => featureById.get(datum) }), ...labelKey == null ? [] : [valueProperty11(labelKey, "category", { id: "labelValue" })], ...sizeKey == null ? [] : [valueProperty11(sizeKey, sizeScaleType, { id: "sizeValue" })], ...colorKey == null ? [] : [valueProperty11(colorKey, colorScaleType, { id: "colorValue" })] ] }); const featureValues = dataModel.resolveColumnById(this, `featureValue`, processedData); this.topologyBounds = featureValues.reduce((current, feature) => { const geometry = feature?.geometry; if (geometry == null) return current; return geometryBbox(geometry, current); }, void 0); if (sizeKey != null) { const sizeIdx = dataModel.resolveProcessedDataIndexById(this, `sizeValue`); const processedSize = processedData.domain.values[sizeIdx] ?? []; sizeScale.domain = sizeDomain ?? processedSize; } if (colorRange != null && this.isColorScaleValid()) { const colorKeyIdx = dataModel.resolveProcessedDataIndexById(this, "colorValue"); colorScale.domain = processedData.domain.values[colorKeyIdx]; colorScale.range = colorRange; colorScale.update(); } if (topology == null) { import_ag_charts_core218.Logger.warnOnce(`no topology was provided for [MapLineSeries]; nothing will be rendered.`); } } isColorScaleValid() { const { colorKey } = this.properties; if (!colorKey) { return false; } const { dataModel, processedData } = this; if (!dataModel || !processedData) { return false; } const colorIdx = dataModel.resolveProcessedDataIndexById(this, "colorValue"); const dataCount = processedData.input.count; const missCount = getMissCount2(this, processedData.defs.values[colorIdx].missing); const colorDataMissing = dataCount === 0 || dataCount === missCount; return !colorDataMissing; } getLabelDatum(datum, datumIndex, idValue, labelValue, projectedGeometry, measurer3) { if (labelValue == null || projectedGeometry == null || idValue == null) return; const lineString = largestLineString(projectedGeometry); if (lineString == null) return; const { idKey, idName, sizeKey, sizeName, colorKey, colorName, labelKey, labelName, label } = this.properties; if (labelKey == null || !label.enabled) return; const labelText = this.getLabelText( labelValue, datum, labelKey, "label", [], label, { value: labelValue, datum, idKey, idName, sizeKey, sizeName, colorKey, colorName, labelKey, labelName } ); if (labelText == null) return; const labelSize = measurer3.measureLines(String(labelText)); const labelCenter = lineStringCenter(lineString); if (labelCenter == null) return; const [x, y] = labelCenter.point; const { width, height } = labelSize; return { point: { x, y, size: 0 }, label: { width, height, text: labelText }, anchor: void 0, placement: void 0, datumIndex, idValue }; } resolveColumn(key, columnId, processedData) { if (key == null || this.dataModel == null) return void 0; return this.dataModel.resolveColumnById(this, columnId, processedData); } resolveLineDataColumns(processedData) { const { sizeKey, colorKey, labelKey } = this.properties; return { idValues: this.dataModel.resolveColumnById(this, "idValue", processedData), featureValues: this.dataModel.resolveColumnById(this, "featureValue", processedData), labelValues: this.resolveColumn(labelKey, "labelValue", processedData), sizeValues: this.resolveColumn(sizeKey, "sizeValue", processedData), colorValues: this.resolveColumn(colorKey, "colorValue", processedData) }; } prepareProjectedLineGeometries(idValues, featureValues, processedData) { const projectedGeometries = /* @__PURE__ */ new Map(); for (const [datumIndex] of processedData.dataSources.get(this.id)?.data.entries() ?? []) { const id = idValues[datumIndex]; const geometry = featureValues[datumIndex]?.geometry; const projectedGeometry = geometry != null && this.scale != null ? projectGeometry(geometry, this.scale) : void 0; if (id != null && projectedGeometry != null) { projectedGeometries.set(id, projectedGeometry); } } return projectedGeometries; } warnMissingGeometries(missingGeometries) { if (missingGeometries.length === 0) return; const missingGeometriesCap = 10; if (missingGeometries.length > missingGeometriesCap) { const excessItems = missingGeometries.length - missingGeometriesCap; missingGeometries.length = missingGeometriesCap; missingGeometries.push(`(+${excessItems} more)`); } import_ag_charts_core218.Logger.warnOnce(`some data items do not have matches in the provided topology`, missingGeometries); } createNodeData() { const { id: seriesId, dataModel, processedData, sizeScale, properties } = this; const { label, legendItemName, colorKey } = properties; if (dataModel == null || processedData == null) return; if (!this.visible) { return { itemId: seriesId, nodeData: [], labelData: [] }; } const columns = this.resolveLineDataColumns(processedData); const maxStrokeWidth = properties.maxStrokeWidth ?? properties.strokeWidth; sizeScale.range = [Math.min(properties.strokeWidth, maxStrokeWidth), maxStrokeWidth]; const measurer3 = (0, import_ag_charts_core218.cachedTextMeasurer)(label); const projectedGeometries = this.prepareProjectedLineGeometries( columns.idValues, columns.featureValues, processedData ); const nodeData = []; const labelData = []; const missingGeometries = []; const rawData = processedData.dataSources.get(this.id)?.data ?? []; for (const [datumIndex, datum] of rawData.entries()) { const dataValues = { idValue: columns.idValues[datumIndex], colorValue: columns.colorValues?.[datumIndex], sizeValue: columns.sizeValues?.[datumIndex], labelValue: columns.labelValues?.[datumIndex] }; const projectedGeometry = projectedGeometries.get(dataValues.idValue); if (projectedGeometry == null) { missingGeometries.push(dataValues.idValue); } if (colorKey != null && dataValues.colorValue == null) { continue; } const labelDatum = this.getLabelDatum( datum, datumIndex, dataValues.idValue, dataValues.labelValue, projectedGeometry, measurer3 ); if (labelDatum != null) { labelData.push(labelDatum); } nodeData.push({ series: this, datum, datumIndex, ...dataValues, projectedGeometry, legendItemName, style: this.getItemStyle( { datumIndex, datum, colorValue: dataValues.colorValue, sizeValue: dataValues.sizeValue }, false ) }); } this.warnMissingGeometries(missingGeometries); return { itemId: seriesId, nodeData, labelData }; } updateSelections() { if (this.nodeDataRefresh) { this.contextNodeData = this.createNodeData(); this.nodeDataRefresh = false; } } update() { const { datumSelection, highlightDatumSelection } = this; this.updateSelections(); this.contentGroup.visible = this.visible; this.labelGroup.visible = this.visible; const drawingMode = this.ctx.chartService.highlight?.drawingMode ?? "overlay"; const highlightedDatum = this.getHighlightedDatum(); const nodeData = this.contextNodeData?.nodeData ?? []; this.datumSelection = this.updateDatumSelection({ nodeData, datumSelection }); this.updateDatumStyles({ datumSelection, isHighlight: false }); this.updateDatumNodes({ datumSelection, isHighlight: false, drawingMode: "overlay" }); this.highlightDatumSelection = this.updateDatumSelection({ nodeData: highlightedDatum == null ? [] : [highlightedDatum], datumSelection: highlightDatumSelection }); this.updateDatumStyles({ datumSelection: highlightDatumSelection, isHighlight: true }); this.updateDatumNodes({ datumSelection: highlightDatumSelection, isHighlight: true, drawingMode }); this.updateLabelNodes({ labelSelection: this.labelSelection, isHighlight: false }); this.updateHighlightLabelSelection(highlightedDatum); } updateDatumSelection(opts) { return opts.datumSelection.update(opts.nodeData, void 0, (datum) => createDatumId11(datum.idValue)); } getItemStyle({ datumIndex = 0, datum, colorValue, sizeValue }, isHighlight) { const { properties, colorScale, sizeScale } = this; const { colorRange, itemStyler } = properties; const baseStyle = properties.getStyle(); if (colorValue != null) { baseStyle.stroke = this.isColorScaleValid() ? colorScale.convert(colorValue) : colorRange?.[0] ?? properties.stroke; } const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); const style = (0, import_ag_charts_core218.mergeDefaults)(highlightStyle, baseStyle); if (sizeValue != null) { style.strokeWidth = sizeScale.convert(sizeValue, { clamp: true }); } let overrides; if (itemStyler != null) { overrides = this.cachedDatumCallback(createDatumId11(datumIndex, isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(datum, datumIndex, isHighlight, style); return this.callWithContext(itemStyler, params); }); } return overrides ? (0, import_ag_charts_core218.mergeDefaults)(style, overrides) : style; } makeItemStylerParams(datum, datumIndex, isHighlight, style) { const { id: seriesId } = this; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); return { seriesId, datum, highlightState, ...style }; } updateDatumStyles({ datumSelection, isHighlight }) { datumSelection.each((_, nodeDatum) => { nodeDatum.style = this.getItemStyle(nodeDatum, isHighlight); }); } updateDatumNodes({ datumSelection, drawingMode }) { datumSelection.each((geoGeometry, nodeDatum) => { const { projectedGeometry, style } = nodeDatum; if (projectedGeometry == null) { geoGeometry.visible = false; geoGeometry.projectedGeometry = void 0; return; } geoGeometry.visible = true; geoGeometry.projectedGeometry = projectedGeometry; geoGeometry.setProperties(style); geoGeometry.drawingMode = drawingMode; }); } updatePlacedLabelData(labelData) { this.placedLabelData = labelData; this.labelSelection = this.labelSelection.update(labelData, (text2) => { text2.pointerEvents = import_ag_charts_community194._ModuleSupport.PointerEvents.None; }); this.updateLabelNodes({ labelSelection: this.labelSelection, isHighlight: false }); this.updateHighlightLabelSelection(); } updateLabelNodes({ isHighlight, labelSelection }) { const { properties } = this; const activeHighlight = this.getHighlightedDatum(); labelSelection.each((label, placedLabel) => { const { x, y, width, height, text: text2, datum: labelDatum } = placedLabel; const style = getLabelStyles2(this, void 0, properties, properties.label, isHighlight, activeHighlight); const { color: fill, fontStyle, fontWeight, fontSize, fontFamily } = style; label.visible = true; label.x = x + width / 2; label.y = y + height / 2; label.text = text2; label.fill = fill; label.fontStyle = fontStyle; label.fontWeight = fontWeight; label.fontSize = fontSize; label.fontFamily = fontFamily; label.textAlign = "center"; label.textBaseline = "middle"; const datumIndex = labelDatum?.datumIndex; label.fillOpacity = this.getHighlightStyle(isHighlight, datumIndex).opacity ?? 1; label.setBoxing(style); }); } updateHighlightLabelSelection(highlightedDatum = this.getHighlightedDatum()) { const highlightId = highlightedDatum?.idValue; const highlightLabels = highlightId == null || !this.isLabelEnabled() ? [] : this.placedLabelData.filter((label) => label.datum.idValue === highlightId); this.highlightLabelSelection = this.highlightLabelSelection.update(highlightLabels); if (highlightLabels.length === 0) { this.highlightLabelSelection.cleanup(); } this.updateLabelNodes({ labelSelection: this.highlightLabelSelection, isHighlight: true }); } resetAnimation() { } getLabelData() { if (!this.isLabelEnabled()) return []; return this.contextNodeData?.labelData ?? []; } pickNodeClosestDatum({ x, y }) { let minDistanceSquared = Infinity; let minDatum; this.datumSelection.each((node, datum) => { const distanceSquared = node.distanceSquared(x, y); if (distanceSquared < minDistanceSquared) { minDistanceSquared = distanceSquared; minDatum = datum; } }); return minDatum == null ? void 0 : { datum: minDatum, distance: Math.sqrt(minDistanceSquared) }; } datumMidPoint(datum) { const { _previousDatumMidPoint } = this; if (_previousDatumMidPoint?.datum === datum) { return _previousDatumMidPoint.point; } const projectedGeometry = datum.projectedGeometry; const lineString = projectedGeometry == null ? void 0 : largestLineString(projectedGeometry); const center = lineString == null ? void 0 : lineStringCenter(lineString)?.point; const point = center == null ? void 0 : { x: center[0], y: center[1] }; this._previousDatumMidPoint = { datum, point }; return point; } legendItemSymbol(datumIndex) { const { dataModel, processedData, properties } = this; const { strokeWidth, strokeOpacity, lineDash } = properties; let { stroke: stroke3 } = properties; if (datumIndex != null && this.isColorScaleValid()) { const colorValues = dataModel.resolveColumnById(this, "colorValue", processedData); const colorValue = colorValues[datumIndex]; if (colorValue != null) { stroke3 = this.colorScale.convert(colorValue); } } return { marker: { fill: void 0, fillOpacity: 0, stroke: void 0, strokeWidth: 0, strokeOpacity: 0, lineDash: [0], lineDashOffset: 0, enabled: false }, line: { enabled: true, stroke: stroke3, strokeWidth, strokeOpacity, lineDash } }; } getLegendData(legendType) { const { processedData, dataModel } = this; if (processedData == null || dataModel == null) return []; const { id: seriesId, visible } = this; const { title, legendItemName, idKey, idName, colorKey, colorRange, showInLegend } = this.properties; if (legendType === "gradient" && colorKey != null && colorRange != null) { const colorDomain = processedData.domain.values[dataModel.resolveProcessedDataIndexById(this, "colorValue")]; const legendDatum = { legendType: "gradient", enabled: visible, seriesId, series: this.getFormatterContext("color"), colorRange, colorDomain }; return [legendDatum]; } else if (legendType === "category") { const legendDatum = { legendType: "category", id: seriesId, itemId: seriesId, seriesId, enabled: visible, label: { text: legendItemName ?? title ?? idName ?? idKey }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend }; return [legendDatum]; } else { return []; } } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, properties, ctx: { formatManager } } = this; const { idKey, idName, colorKey, colorName, sizeKey, sizeName, labelKey, labelName, title, legendItemName, tooltip } = properties; if (!dataModel || !processedData) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const idValues = dataModel.resolveColumnById(this, `idValue`, processedData); const sizeValue = sizeKey == null ? void 0 : dataModel.resolveColumnById(this, `sizeValue`, processedData)[datumIndex]; const colorValue = colorKey == null ? void 0 : dataModel.resolveColumnById(this, `colorValue`, processedData)[datumIndex]; if (colorKey != null && colorValue == null) { return; } const data = []; if (this.isLabelEnabled() && labelKey != null && labelKey !== idKey) { const labelValue = dataModel.resolveColumnById(this, `labelValue`, processedData)[datumIndex]; const content = formatManager.format(this.callWithContext.bind(this), { type: "category", value: labelValue, datum, seriesId, legendItemName, key: labelKey, source: "tooltip", property: "label", domain: [], boundSeries: this.getFormatterContext("label") }); data.push({ label: labelName, fallbackLabel: labelKey, value: content ?? labelValue }); } if (sizeValue != null && sizeKey != null) { const domain = dataModel.getDomain(this, `sizeValue`, "value", processedData).domain; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: sizeValue, datum, seriesId, legendItemName, key: sizeKey, source: "tooltip", property: "size", domain, boundSeries: this.getFormatterContext("size"), fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: sizeName, fallbackLabel: sizeKey, value: content ?? String(sizeValue) }); } if (colorValue != null && colorKey != null) { const domain = dataModel.getDomain(this, `colorValue`, "value", processedData).domain; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: colorValue, datum, seriesId, legendItemName, key: colorKey, source: "tooltip", property: "color", domain, boundSeries: this.getFormatterContext("color"), fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: colorName, fallbackLabel: colorKey, value: content ?? String(colorValue) }); } const format = this.getItemStyle({ datumIndex, datum, colorValue, sizeValue }, false); return this.formatTooltipWithContext( tooltip, { heading: idValues[datumIndex], title: title ?? legendItemName, symbol: this.legendItemSymbol(datumIndex), data }, { seriesId, datum, title, idKey, idName, colorKey, colorName, sizeKey, sizeName, labelKey, labelName, ...format } ); } computeFocusBounds(opts) { const geometry = findFocusedGeoGeometry(this, opts); return geometry ? Transformable3.toCanvas(this.contentGroup, geometry.getBBox()) : void 0; } hasItemStylers() { return this.properties.itemStyler != null || this.properties.label.itemStyler != null; } }; MapLineSeries.className = "MapLineSeries"; MapLineSeries.type = "map-line"; // packages/ag-charts-enterprise/src/series/map-line/mapLineSeriesOptionsDef.ts var import_ag_charts_community195 = require("ag-charts-community"); var import_ag_charts_core219 = require("ag-charts-core"); var { mapLineSeriesThemeableOptionsDef } = import_ag_charts_community195._ModuleSupport; var mapLineSeriesOptionsDef = { ...(0, import_ag_charts_core219.without)(import_ag_charts_core219.commonSeriesOptionsDefs, ["highlightStyle", "highlight"]), ...mapLineSeriesThemeableOptionsDef, type: (0, import_ag_charts_core219.required)((0, import_ag_charts_core219.constant)("map-line")), idKey: (0, import_ag_charts_core219.required)(import_ag_charts_core219.string), sizeKey: import_ag_charts_core219.string, colorKey: import_ag_charts_core219.string, labelKey: import_ag_charts_core219.string, idName: import_ag_charts_core219.string, sizeName: import_ag_charts_core219.string, colorName: import_ag_charts_core219.string, labelName: import_ag_charts_core219.string, topology: import_ag_charts_core219.geoJson, topologyIdKey: import_ag_charts_core219.string, legendItemName: import_ag_charts_core219.string, title: import_ag_charts_core219.string }; mapLineSeriesOptionsDef.colorRange = (0, import_ag_charts_core219.undocumented)((0, import_ag_charts_core219.and)((0, import_ag_charts_core219.arrayOf)(import_ag_charts_core219.color), (0, import_ag_charts_core219.arrayLength)(1))); // packages/ag-charts-enterprise/src/series/map-line/mapLineModule.ts var MapLineSeriesModule = { type: "series", name: "map-line", chartType: "topology", enterprise: true, version: import_ag_charts_community196.VERSION, dependencies: [TopologyChartModule], options: mapLineSeriesOptionsDef, themeTemplate: { ...MAP_THEME_DEFAULTS, series: { stroke: applyMapPalette(import_ag_charts_core220.SAFE_STROKE_FILL_OPERATION), colorRange: { $if: [ { $eq: [{ $mapPalette: "type" }, "inbuilt"] }, { $mapPalette: "divergingColors" }, applyMapPalette(import_ag_charts_core220.SAFE_RANGE2_OPERATION) ] }, strokeWidth: 1, maxStrokeWidth: 3, lineDash: [0], lineDashOffset: 0, label: { ...import_ag_charts_core220.LABEL_BOXING_DEFAULTS, enabled: true, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" } }, highlight: applyMapPalette(import_ag_charts_core220.MULTI_SERIES_HIGHLIGHT_STYLE) }, tooltip: { range: "exact" } }, create: (ctx) => new MapLineSeries(ctx) }; // packages/ag-charts-enterprise/src/series/map-line-background/mapLineBackgroundModule.ts var import_ag_charts_community200 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/series/map-line-background/mapLineBackgroundSeries.ts var import_ag_charts_community198 = require("ag-charts-community"); var import_ag_charts_core222 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/map-line-background/mapLineBackgroundSeriesProperties.ts var import_ag_charts_community197 = require("ag-charts-community"); var import_ag_charts_core221 = require("ag-charts-core"); var { SeriesProperties: SeriesProperties4, makeSeriesTooltip: makeSeriesTooltip13 } = import_ag_charts_community197._ModuleSupport; var MapLineBackgroundSeriesProperties = class extends SeriesProperties4 { constructor() { super(...arguments); this.topology = void 0; this.stroke = "black"; this.strokeOpacity = 1; this.strokeWidth = 0; this.lineDash = [0]; this.lineDashOffset = 0; this.tooltip = makeSeriesTooltip13(); } }; __decorateClass([ import_ag_charts_core221.Property ], MapLineBackgroundSeriesProperties.prototype, "topology", 2); __decorateClass([ import_ag_charts_core221.Property ], MapLineBackgroundSeriesProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core221.Property ], MapLineBackgroundSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core221.Property ], MapLineBackgroundSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core221.Property ], MapLineBackgroundSeriesProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core221.Property ], MapLineBackgroundSeriesProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core221.Property ], MapLineBackgroundSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/map-line-background/mapLineBackgroundSeries.ts var { createDatumId: createDatumId12, Group: Group13, Selection: Selection9, PointerEvents: PointerEvents6 } = import_ag_charts_community198._ModuleSupport; var MapLineBackgroundSeries = class extends TopologySeries { constructor(moduleCtx) { super({ moduleCtx, categoryKey: void 0, pickModes: [] }); this.properties = new MapLineBackgroundSeriesProperties(); this._chartTopology = void 0; this.itemGroup = this.contentGroup.appendChild(new Group13({ name: "itemGroup" })); this.datumSelection = Selection9.select( this.itemGroup, () => this.nodeFactory() ); this.itemGroup.pointerEvents = PointerEvents6.None; } getNodeData() { return this.contextNodeData?.nodeData; } get topology() { return this.properties.topology ?? this._chartTopology; } get focusable() { return false; } setOptionsData() { } setChartData() { } get hasData() { return false; } renderToOffscreenCanvas() { return true; } setChartTopology(topology) { this._chartTopology = topology; if (this.topology === topology) { this.nodeDataRefresh = true; } } setZIndex(zIndex) { super.setZIndex(zIndex); this.contentGroup.zIndex = [0 /* ShapeLineBackground */, zIndex, 0]; this.highlightGroup.zIndex = [0 /* ShapeLineBackground */, zIndex, 1]; return true; } nodeFactory() { const geoGeometry = new GeoGeometry(); geoGeometry.renderMode = 2 /* Lines */; geoGeometry.lineJoin = "round"; geoGeometry.lineCap = "round"; geoGeometry.pointerEvents = PointerEvents6.None; return geoGeometry; } processData() { const { topology } = this; this.topologyBounds = topology?.features.reduce((current, feature) => { const geometry = feature.geometry; if (geometry == null) return current; return geometryBbox(geometry, current); }, void 0); if (topology == null) { import_ag_charts_core222.Logger.warnOnce(`no topology was provided for [MapShapeBackgroundSeries]; nothing will be rendered.`); } } createNodeData() { const { id: seriesId, topology, scale, properties } = this; if (topology == null) return; const { stroke: stroke3, strokeOpacity, lineDash, lineDashOffset, strokeWidth } = properties; const nodeData = []; const labelData = []; for (const [index, feature] of topology.features.entries()) { const { geometry } = feature; const projectedGeometry = geometry != null && scale != null ? projectGeometry(geometry, scale) : void 0; if (projectedGeometry == null) continue; nodeData.push({ series: this, datum: feature, datumIndex: 0, index, projectedGeometry, style: { stroke: stroke3, strokeOpacity, lineDash, lineDashOffset, strokeWidth } }); } return { itemId: seriesId, nodeData, labelData }; } updateSelections() { if (this.nodeDataRefresh) { this.contextNodeData = this.createNodeData(); this.nodeDataRefresh = false; } } update() { const { datumSelection } = this; this.updateSelections(); this.contentGroup.visible = this.visible; this.labelGroup.visible = this.visible; const { nodeData = [] } = this.contextNodeData ?? {}; this.datumSelection = this.updateDatumSelection({ nodeData, datumSelection }); this.updateDatumNodes({ datumSelection }); } updateDatumSelection(opts) { return opts.datumSelection.update(opts.nodeData, void 0, (datum) => createDatumId12(datum.index)); } updateDatumNodes(opts) { const { datumSelection } = opts; datumSelection.each((geoGeometry, datum) => { const { projectedGeometry } = datum; if (projectedGeometry == null) { geoGeometry.visible = false; geoGeometry.projectedGeometry = void 0; return; } geoGeometry.visible = true; geoGeometry.projectedGeometry = projectedGeometry; geoGeometry.setProperties(datum.style); }); } resetAnimation() { } getLegendData() { return []; } getTooltipContent(_seriesDatum) { return; } computeFocusBounds(_opts) { return void 0; } hasItemStylers() { return false; } }; MapLineBackgroundSeries.className = "MapLineBackgroundSeries"; MapLineBackgroundSeries.type = "map-line-background"; // packages/ag-charts-enterprise/src/series/map-line-background/mapLineBackgroundSeriesOptionsDef.ts var import_ag_charts_community199 = require("ag-charts-community"); var import_ag_charts_core223 = require("ag-charts-core"); var { mapLineBackgroundSeriesThemeableOptionsDef } = import_ag_charts_community199._ModuleSupport; var mapLineBackgroundSeriesOptionsDef = { ...mapLineBackgroundSeriesThemeableOptionsDef, type: (0, import_ag_charts_core223.required)((0, import_ag_charts_core223.constant)("map-line-background")), topology: import_ag_charts_core223.geoJson }; // packages/ag-charts-enterprise/src/series/map-line-background/mapLineBackgroundModule.ts var MapLineBackgroundSeriesModule = { type: "series", name: "map-line-background", chartType: "topology", enterprise: true, version: import_ag_charts_community200.VERSION, dependencies: [TopologyChartModule], options: mapLineBackgroundSeriesOptionsDef, themeTemplate: { ...MAP_THEME_DEFAULTS, series: { stroke: { $path: ["/1", { $mapPalette: "stroke" }, { $mapPalette: "secondHierarchyColors" }] }, strokeWidth: 1, lineDash: [0], lineDashOffset: 0 } }, create: (ctx) => new MapLineBackgroundSeries(ctx) }; // packages/ag-charts-enterprise/src/series/map-marker/mapMarkerModule.ts var import_ag_charts_community205 = require("ag-charts-community"); var import_ag_charts_core228 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/map-marker/mapMarkerSeries.ts var import_ag_charts_community203 = require("ag-charts-community"); var import_ag_charts_core226 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/map-util/polygonPointSearch.ts var import_ag_charts_core224 = require("ag-charts-core"); function polygonPointSearch(polygons, precision, valueFn) { const bbox = polygonBbox(polygons[0], void 0); if (bbox == null) return; const boundingXCenter = (bbox.lon0 + bbox.lon1) / 2; const boundingYCenter = (bbox.lat0 + bbox.lat1) / 2; const boundingWidth = Math.abs(bbox.lon1 - bbox.lon0); const boundingHeight = Math.abs(bbox.lat1 - bbox.lat0); const centroid = polygonCentroid(polygons[0]); const [cx, cy] = centroid; const centroidDistanceToPolygon = -polygonDistance(polygons, cx, cy); let bestResult; const cellValue = (distanceToPolygon, distanceToCentroid) => { const centroidDriftFactor = 0.5; const centroidDrift = Math.max(distanceToCentroid - centroidDistanceToPolygon, 0); return distanceToPolygon - centroidDriftFactor * centroidDrift; }; const createLabelPlacement = (x2, y2, stride) => { const { distance: distance2, maxDistance } = valueFn(polygons, x2, y2, stride); const distanceToCentroid = Math.hypot(cx - x2, cy - y2); const maxXTowardsCentroid = Math.min(Math.max(cx, x2 - stride / 2), x2 + stride / 2); const maxYTowardsCentroid = Math.min(Math.max(cy, y2 - stride / 2), y2 + stride / 2); const minDistanceToCentroid = Math.hypot(cx - maxXTowardsCentroid, cy - maxYTowardsCentroid); const value = cellValue(distance2, distanceToCentroid); const maxValue = cellValue(maxDistance, minDistanceToCentroid); return { distance: distance2, maxDistance, value, maxValue, x: x2, y: y2, stride }; }; const appendLabelPlacement = (into, x2, y2, stride) => { const labelPlacement = createLabelPlacement(x2, y2, stride); if (labelPlacement.maxDistance >= 0) { into.push(labelPlacement); } }; const initialStride = Math.min(boundingWidth, boundingHeight) / 2; let queue = { value: createLabelPlacement(boundingXCenter, boundingYCenter, initialStride), next: null }; while (queue != null) { const item = queue.value; const { distance: distance2, value, maxValue, x: x2, y: y2, stride } = item; queue = queue.next; if (distance2 > 0 && (bestResult == null || value > bestResult.value)) { bestResult = item; } if (bestResult != null && maxValue - bestResult.value <= precision) { continue; } const nextStride = stride / 2; const newLabelPlacements = []; appendLabelPlacement(newLabelPlacements, x2 - nextStride, y2 - nextStride, nextStride); appendLabelPlacement(newLabelPlacements, x2 + nextStride, y2 - nextStride, nextStride); appendLabelPlacement(newLabelPlacements, x2 - nextStride, y2 + nextStride, nextStride); appendLabelPlacement(newLabelPlacements, x2 + nextStride, y2 + nextStride, nextStride); newLabelPlacements.sort(labelPlacementCmp); queue = (0, import_ag_charts_core224.insertListItemsSorted)(queue, newLabelPlacements, labelPlacementCmp); } if (bestResult == null) return; const { distance, x, y } = bestResult; return { x, y, distance }; } var labelPlacementCmp = (a, b) => b.maxValue - a.maxValue; // packages/ag-charts-enterprise/src/series/map-util/markerUtil.ts function polygonMarkerCenter(polygons, precision) { const result = polygonPointSearch(polygons, precision, (p, x2, y2, stride) => { const distance = -polygonDistance(p, x2, y2); const maxDistance = distance + stride * Math.SQRT2; return { distance, maxDistance }; }); if (result == null) return; const { x, y } = result; return [x, y]; } function markerPositions(geometry, precision) { let center; switch (geometry.type) { case "GeometryCollection": return geometry.geometries.flatMap((g) => markerPositions(g, precision)); case "MultiPoint": return geometry.coordinates; case "Point": return [geometry.coordinates]; case "MultiPolygon": { const polygon = largestPolygon(geometry); center = polygon == null ? void 0 : polygonMarkerCenter(polygon, precision); break; } case "Polygon": { const polygon = geometry.coordinates; center = polygon == null ? void 0 : polygonMarkerCenter(polygon, precision); break; } case "MultiLineString": { const lineString = largestLineString(geometry); center = lineString == null ? void 0 : lineStringCenter(lineString)?.point; break; } case "LineString": { const lineString = geometry.coordinates; center = lineStringCenter(lineString)?.point; break; } } return center == null ? [] : [center]; } // packages/ag-charts-enterprise/src/series/map-util/shapeFillBBox.ts var import_ag_charts_community201 = require("ag-charts-community"); var { BBox: BBox22 } = import_ag_charts_community201._ModuleSupport; function getTopologyShapeFillBBox(scale) { if (!scale) return; const { range: range2 } = scale; const x = range2[0][0]; const y = range2[0][1]; const width = range2[1][0] - x; const height = range2[1][1] - y; const bbox = new BBox22(x, y, width, height); return { series: bbox, axis: bbox }; } // packages/ag-charts-enterprise/src/series/map-marker/mapMarkerSeriesProperties.ts var import_ag_charts_community202 = require("ag-charts-community"); var import_ag_charts_core225 = require("ag-charts-core"); var { SeriesProperties: SeriesProperties5, makeSeriesTooltip: makeSeriesTooltip14, Label: Label11 } = import_ag_charts_community202._ModuleSupport; var MapMarkerSeriesLabel = class extends Label11 { constructor() { super(...arguments); this.placement = "bottom"; } }; __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesLabel.prototype, "placement", 2); var MapMarkerSeriesProperties = class extends SeriesProperties5 { constructor() { super(...arguments); this.topology = void 0; this.idKey = void 0; this.topologyIdKey = "name"; this.idName = void 0; this.latitudeKey = void 0; this.latitudeName = void 0; this.longitudeKey = void 0; this.longitudeName = void 0; this.labelKey = void 0; this.labelName = void 0; this.colorRange = void 0; this.shape = "circle"; this.size = 6; this.fill = "black"; this.fillOpacity = 1; this.stroke = "black"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.label = new MapMarkerSeriesLabel(); this.tooltip = makeSeriesTooltip14(); } getStyle() { const { size, shape, fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; return { size, shape, fill, fillOpacity, opacity: 1, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }; } }; __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "topology", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "title", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "legendItemName", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "idKey", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "topologyIdKey", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "idName", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "latitudeKey", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "latitudeName", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "longitudeKey", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "longitudeName", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "labelKey", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "labelName", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "sizeKey", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "sizeName", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "colorKey", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "colorName", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "colorRange", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "shape", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "size", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "maxSize", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "sizeDomain", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core225.Property ], MapMarkerSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/map-marker/mapMarkerSeries.ts var { fromToMotion: fromToMotion3, getMissCount: getMissCount3, createDatumId: createDatumId13, SeriesNodePickMode: SeriesNodePickMode10, valueProperty: valueProperty12, computeMarkerFocusBounds: computeMarkerFocusBounds2, ColorScale: ColorScale3, LinearScale: LinearScale6, Group: Group14, Selection: Selection10, Text: Text5, Marker: Marker4, getLabelStyles: getLabelStyles3 } = import_ag_charts_community203._ModuleSupport; var MapMarkerSeries = class extends TopologySeries { constructor(moduleCtx) { super({ moduleCtx, categoryKey: void 0, propertyKeys: { size: ["colorKey"], color: ["colorKey"], label: ["labelKey"] }, propertyNames: { size: ["sizeName"], color: ["colorName"], label: ["labelName"] }, pickModes: [SeriesNodePickMode10.EXACT_SHAPE_MATCH, SeriesNodePickMode10.NEAREST_NODE], usesPlacedLabels: true }); this.properties = new MapMarkerSeriesProperties(); this._chartTopology = void 0; this.colorScale = new ColorScale3(); this.sizeScale = new LinearScale6(); this.markerGroup = this.contentGroup.appendChild(new Group14({ name: "markerGroup" })); this.labelSelection = Selection10.select(this.labelGroup, Text5, false); this.highlightLabelSelection = Selection10.select(this.highlightLabelGroup, Text5, false); this.markerSelection = Selection10.select( this.markerGroup, Marker4, false ); this.highlightMarkerSelection = Selection10.select(this.highlightNodeGroup, Marker4); this.placedLabelData = []; this.animationState = new import_ag_charts_core226.StateMachine( "empty", { empty: { update: { target: "ready", action: () => this.animateMarkers() }, reset: "empty", skip: "ready" }, ready: { updateData: "waiting", clear: "clearing", resize: () => this.resetAllAnimation(), reset: "empty", skip: "ready" }, waiting: { update: { target: "ready", action: () => this.animateMarkers() }, // chart.ts transitions to updateData on zoom change resize: { target: "ready", action: () => this.resetAllAnimation() }, reset: "empty", skip: "ready" }, clearing: { update: { target: "empty", action: () => this.resetAllAnimation() }, reset: "empty", skip: "ready" } }, () => this.checkProcessedDataAnimatable() ); } getNodeData() { return this.contextNodeData?.nodeData; } get topology() { return this.properties.topology ?? this._chartTopology; } get hasData() { const hasLatLon = this.properties.latitudeKey != null && this.properties.longitudeKey != null; return super.hasData && (this.topology != null || hasLatLon); } renderToOffscreenCanvas() { return true; } setChartTopology(topology) { this._chartTopology = topology; if (this.topology === topology) { this.nodeDataRefresh = true; } } setZIndex(zIndex) { super.setZIndex(zIndex); this.contentGroup.zIndex = [2 /* Marker */, zIndex]; this.highlightGroup.zIndex = [3 /* MarkerHighlight */, zIndex]; return true; } isLabelEnabled() { return this.properties.labelKey != null && this.properties.label.enabled; } async processData(dataController) { if (this.data == null) return; const { data, sizeScale, colorScale } = this; const { topologyIdKey, idKey, latitudeKey, longitudeKey, sizeKey, colorKey, labelKey, sizeDomain, colorRange } = this.properties; const featureById = this.buildFeatureMap(topologyIdKey); const sizeScaleType = this.sizeScale.type; const colorScaleType = this.colorScale.type; const mercatorScaleType = this.scale?.type; const hasLatLon = latitudeKey != null && longitudeKey != null; const { dataModel, processedData } = await this.requestDataModel(dataController, data, { props: [ ...idKey == null ? [] : [ valueProperty12(idKey, mercatorScaleType, { id: "idValue", includeProperty: false }), valueProperty12(idKey, mercatorScaleType, { id: "featureValue", includeProperty: false, processor: () => (datum) => featureById.get(datum) }) ], ...hasLatLon ? [ valueProperty12(latitudeKey, mercatorScaleType, { id: "latValue" }), valueProperty12(longitudeKey, mercatorScaleType, { id: "lonValue" }) ] : [], ...labelKey ? [valueProperty12(labelKey, "category", { id: "labelValue" })] : [], ...sizeKey ? [valueProperty12(sizeKey, sizeScaleType, { id: "sizeValue" })] : [], ...colorKey ? [valueProperty12(colorKey, colorScaleType, { id: "colorValue" })] : [] ] }); const featureValues = idKey == null ? void 0 : dataModel.resolveColumnById(this, `featureValue`, processedData); const latValues = hasLatLon ? dataModel.resolveColumnById(this, `latValue`, processedData) : void 0; const lonValues = hasLatLon ? dataModel.resolveColumnById(this, `lonValue`, processedData) : void 0; this.topologyBounds = processedData.dataSources.get(this.id)?.data.reduce((current, _datum, datumIndex) => { const feature = featureValues?.[datumIndex]; const geometry = feature?.geometry; if (geometry != null) { current = geometryBbox(geometry, current); } if (latValues != null && lonValues != null) { const lon = lonValues[datumIndex]; const lat = latValues[datumIndex]; current = LonLatBBox.extend(current, lon, lat, lon, lat); } return current; }, void 0); if (sizeKey != null) { const sizeIdx = dataModel.resolveProcessedDataIndexById(this, `sizeValue`); const processedSize = processedData.domain.values[sizeIdx] ?? []; sizeScale.domain = sizeDomain ?? processedSize; } if (colorRange != null && this.isColorScaleValid()) { const colorKeyIdx = dataModel.resolveProcessedDataIndexById(this, "colorValue"); colorScale.domain = processedData.domain.values[colorKeyIdx]; colorScale.range = colorRange; colorScale.update(); } this.animationState.transition("updateData"); } isColorScaleValid() { const { colorKey } = this.properties; if (!colorKey) { return false; } const { dataModel, processedData } = this; if (!dataModel || !processedData) { return false; } const colorIdx = dataModel.resolveProcessedDataIndexById(this, "colorValue"); const dataCount = processedData.input.count; const missCount = getMissCount3(this, processedData.defs.values[colorIdx].missing); const colorDataMissing = dataCount === 0 || dataCount === missCount; return !colorDataMissing; } getLabelDatum(node, labelValue, measurer3) { if (labelValue == null) return; const { idKey, idName, latitudeKey, latitudeName, longitudeKey, longitudeName, sizeKey, sizeName, colorKey, colorName, labelKey, labelName, label, shape } = this.properties; if (labelKey == null || !label.enabled) return; const { datum, datumIndex, index, idValue, lonValue, latValue, point } = node; const { placement } = label; const labelText = this.getLabelText( labelValue, datum, labelKey, "label", [], label, { value: labelValue, datum, idKey, idName, latitudeKey, latitudeName, longitudeKey, longitudeName, sizeKey, sizeName, colorKey, colorName, labelKey, labelName } ); if (labelText == null) return; const { width, height } = measurer3.measureLines(String(labelText)); const anchor = Marker4.anchor(shape); return { point: { x: point.x, y: point.y, size: point.size }, label: { width, height, text: labelText }, anchor, placement, datumIndex, datumId: createDatumId13(index, idValue, lonValue, latValue) }; } resolveColumn(key, columnId, processedData) { if (key == null || this.dataModel == null) return void 0; return this.dataModel.resolveColumnById(this, columnId, processedData); } resolveDataColumns(processedData) { const { idKey, latitudeKey, longitudeKey, sizeKey, colorKey, labelKey } = this.properties; const hasLatLon = latitudeKey != null && longitudeKey != null; return { idValues: this.resolveColumn(idKey, "idValue", processedData), featureValues: this.resolveColumn(idKey, "featureValue", processedData), latValues: hasLatLon ? this.resolveColumn(latitudeKey, "latValue", processedData) : void 0, lonValues: hasLatLon ? this.resolveColumn(longitudeKey, "lonValue", processedData) : void 0, labelValues: this.resolveColumn(labelKey, "labelValue", processedData), sizeValues: this.resolveColumn(sizeKey, "sizeValue", processedData), colorValues: this.resolveColumn(colorKey, "colorValue", processedData) }; } prepareProjectedGeometries(idValues, featureValues, processedData) { if (idValues == null || featureValues == null || this.scale == null) return void 0; const projectedGeometries = /* @__PURE__ */ new Map(); for (const [datumIndex] of processedData.dataSources.get(this.id)?.data.entries() ?? []) { const id = idValues[datumIndex]; const geometry = featureValues[datumIndex]?.geometry; const projectedGeometry = geometry == null ? void 0 : projectGeometry(geometry, this.scale); if (id != null && projectedGeometry != null) { projectedGeometries.set(id, projectedGeometry); } } return projectedGeometries; } calculateMarkerSize(sizeValue) { return sizeValue == null ? this.properties.size : this.sizeScale.convert(sizeValue, { clamp: true }); } buildNodeDatum(datum, datumIndex, index, point, dataValues) { return { series: this, datum, datumIndex, index, ...dataValues, point, midPoint: { x: point.x, y: point.y }, legendItemName: this.properties.legendItemName, style: this.getMarkerItemStyle( { datumIndex, datum, colorValue: dataValues.colorValue, sizeValue: dataValues.sizeValue }, false ) }; } createNodeFromLatLon(datum, datumIndex, lonValue, latValue, dataValues, size, measurer3) { if (this.scale == null) { throw new Error("Scale is required for createNodeFromLatLon"); } const [x, y] = this.scale.convert([lonValue, latValue]); const point = { x, y, size }; const node = this.buildNodeDatum(datum, datumIndex, -1, point, dataValues); const label = this.getLabelDatum(node, dataValues.labelValue, measurer3) ?? void 0; return { node, label }; } createNodesFromGeometry(datum, datumIndex, geometry, dataValues, size, measurer3) { const nodes = []; const labels = []; for (const [index, [x, y]] of markerPositions(geometry, 1).entries()) { const point = { x, y, size }; const node = this.buildNodeDatum(datum, datumIndex, index, point, dataValues); nodes.push(node); const label = this.getLabelDatum(node, dataValues.labelValue, measurer3); if (label) { labels.push(label); } } return { nodes, labels }; } warnMissingGeometries(missingGeometries) { if (missingGeometries.length === 0) return; const missingGeometriesCap = 10; if (missingGeometries.length > missingGeometriesCap) { const excessItems = missingGeometries.length - missingGeometriesCap; missingGeometries.length = missingGeometriesCap; missingGeometries.push(`(+${excessItems} more)`); } import_ag_charts_core226.Logger.warnOnce(`some data items do not have matches in the provided topology`, missingGeometries); } buildFeatureMap(topologyIdKey) { const featureById = /* @__PURE__ */ new Map(); for (const feature of this.topology?.features.values() ?? []) { const property = feature.properties?.[topologyIdKey]; if (property != null) { featureById.set(property, feature); } } return featureById; } createNodeData() { const { id: seriesId, dataModel, processedData, sizeScale, properties, scale } = this; const { label } = properties; if (dataModel == null || processedData == null || scale == null) return; if (!this.visible) { return { itemId: seriesId, nodeData: [], labelData: [] }; } const columns = this.resolveDataColumns(processedData); const markerMaxSize = properties.maxSize ?? properties.size; sizeScale.range = [Math.min(properties.size, markerMaxSize), markerMaxSize]; const measurer3 = (0, import_ag_charts_core226.cachedTextMeasurer)(label); const projectedGeometries = this.prepareProjectedGeometries( columns.idValues, columns.featureValues, processedData ); const nodeData = []; const labelData = []; const missingGeometries = []; const rawData = processedData.dataSources.get(this.id)?.data ?? []; for (const [datumIndex, datum] of rawData.entries()) { const dataValues = { idValue: columns.idValues?.[datumIndex], lonValue: columns.lonValues?.[datumIndex], latValue: columns.latValues?.[datumIndex], colorValue: columns.colorValues?.[datumIndex], sizeValue: columns.sizeValues?.[datumIndex], labelValue: columns.labelValues?.[datumIndex] }; const size = this.calculateMarkerSize(dataValues.sizeValue); const projectedGeometry = dataValues.idValue == null ? void 0 : projectedGeometries?.get(dataValues.idValue); if (dataValues.idValue != null && projectedGeometries != null && projectedGeometry == null) { missingGeometries.push(dataValues.idValue); } if (dataValues.lonValue != null && dataValues.latValue != null) { const result = this.createNodeFromLatLon( datum, datumIndex, dataValues.lonValue, dataValues.latValue, dataValues, size, measurer3 ); nodeData.push(result.node); if (result.label) labelData.push(result.label); } else if (projectedGeometry != null) { const result = this.createNodesFromGeometry( datum, datumIndex, projectedGeometry, dataValues, size, measurer3 ); nodeData.push(...result.nodes); labelData.push(...result.labels); } } this.warnMissingGeometries(missingGeometries); return { itemId: seriesId, nodeData, labelData }; } updateSelections() { if (this.nodeDataRefresh) { this.contextNodeData = this.createNodeData(); this.nodeDataRefresh = false; } } checkScaleChange() { if (this.previousScale === this.scale) return false; this.previousScale = this.scale; return true; } update({ seriesRect }) { const resize = this.checkResize(seriesRect); const scaleChange = this.checkScaleChange(); const { markerSelection, highlightMarkerSelection } = this; const drawingMode = this.ctx.chartService.highlight?.drawingMode ?? "overlay"; this.updateSelections(); this.contentGroup.visible = this.visible; this.labelGroup.visible = this.visible; const highlightedDatum = this.getHighlightedDatum(); const nodeData = this.contextNodeData?.nodeData ?? []; this.markerSelection = this.updateMarkerSelection({ markerData: nodeData, markerSelection }); this.updateMarkerNodes({ markerSelection, isHighlight: false, highlightedDatum, drawingMode: "overlay" }); this.highlightMarkerSelection = this.updateMarkerSelection({ markerData: highlightedDatum == null ? [] : [highlightedDatum], markerSelection: highlightMarkerSelection }); this.updateMarkerNodes({ markerSelection: highlightMarkerSelection, isHighlight: true, highlightedDatum, drawingMode }); this.updateLabelNodes({ labelSelection: this.labelSelection, isHighlight: false }); this.updateHighlightLabelSelection(highlightedDatum); if (scaleChange || resize) { this.animationState.transition("resize"); } this.animationState.transition("update"); } updatePlacedLabelData(labelData) { this.placedLabelData = labelData; this.labelSelection = this.labelSelection.update(labelData, (text2) => { text2.pointerEvents = import_ag_charts_community203._ModuleSupport.PointerEvents.None; }); this.updateLabelNodes({ labelSelection: this.labelSelection, isHighlight: false }); this.updateHighlightLabelSelection(); } updateLabelNodes({ isHighlight, labelSelection }) { const { properties } = this; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); labelSelection.each((label, placedLabel) => { const { x, y, width, height, text: text2, datum: labelDatum } = placedLabel; const style = getLabelStyles3( this, void 0, properties, properties.label, isHighlight, activeHighlight ); const { color: fill, fontStyle, fontWeight, fontSize, fontFamily } = style; label.visible = true; label.x = x + width / 2; label.y = y + height / 2; label.text = text2; label.fill = fill; label.fontStyle = fontStyle; label.fontWeight = fontWeight; label.fontSize = fontSize; label.fontFamily = fontFamily; label.textAlign = "center"; label.textBaseline = "middle"; const datumIndex = labelDatum?.datumIndex; label.fillOpacity = this.getHighlightStyle(isHighlight, datumIndex).opacity ?? 1; label.setBoxing(style); }); } getHighlightedLabelId(highlightedDatum = this.getHighlightedDatum()) { if (highlightedDatum == null) return void 0; return createDatumId13( highlightedDatum.index, highlightedDatum.idValue, highlightedDatum.lonValue, highlightedDatum.latValue ); } updateHighlightLabelSelection(highlightedDatum = this.getHighlightedDatum()) { const highlightId = this.getHighlightedLabelId(highlightedDatum); const highlightLabels = highlightId == null || !this.isLabelEnabled() ? [] : this.placedLabelData.filter((label) => label.datum.datumId === highlightId); this.highlightLabelSelection = this.highlightLabelSelection.update(highlightLabels); if (highlightLabels.length === 0) { this.highlightLabelSelection.cleanup(); this.highlightLabelGroup.visible = false; return; } this.highlightLabelGroup.visible = true; this.updateLabelNodes({ labelSelection: this.highlightLabelSelection, isHighlight: true }); } updateMarkerSelection(opts) { const { markerData, markerSelection } = opts; return markerSelection.update( markerData, void 0, (datum) => createDatumId13(datum.index, datum.idValue, datum.lonValue, datum.latValue) ); } getMarkerItemStyle({ datumIndex, datum, colorValue, sizeValue }, isHighlight) { const { properties, colorScale, sizeScale } = this; const { colorRange, itemStyler } = properties; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); const baseStyle = (0, import_ag_charts_core226.mergeDefaults)(highlightStyle, properties.getStyle()); if (!isHighlight && colorValue != null) { baseStyle.fill = this.isColorScaleValid() ? colorScale.convert(colorValue) : colorRange?.[0] ?? baseStyle.fill; } if (sizeValue != null) { baseStyle.size = sizeScale.convert(sizeValue, { clamp: true }); } let style = baseStyle; if (itemStyler != null && datumIndex != null) { const overrides = this.cachedDatumCallback( createDatumId13(datumIndex, isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(datum, datumIndex, isHighlight, style); return this.callWithContext(itemStyler, params); } ); if (overrides) { style = (0, import_ag_charts_core226.mergeDefaults)(overrides, baseStyle); } } return style; } makeItemStylerParams(datum, datumIndex, isHighlight, style) { const { id: seriesId } = this; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum, highlightState, ...style, fill }; } updateMarkerNodes(opts) { const { markerSelection, isHighlight, highlightedDatum, drawingMode } = opts; const fillBBox = getTopologyShapeFillBBox(this.scale); markerSelection.each((marker, markerDatum) => { const { datum, point } = markerDatum; const style = this.getMarkerItemStyle(markerDatum, isHighlight); marker.shape = style.shape; marker.size = style.size; marker.setStyleProperties(style, fillBBox); marker.x = point.x; marker.y = point.y; marker.scalingCenterX = point.x; marker.scalingCenterY = point.y; marker.zIndex = !isHighlight && highlightedDatum != null && datum === highlightedDatum.datum ? 1 : 0; marker.drawingMode = drawingMode; }); } isProcessedDataAnimatable() { return true; } resetAnimation(phase) { if (phase === "initial") { this.animationState.transition("reset"); } else if (phase === "ready") { this.animationState.transition("skip"); } } resetAllAnimation() { this.ctx.animationManager.stopByAnimationGroupId(this.id); this.ctx.animationManager.skipCurrentBatch(); this.labelSelection.cleanup(); this.markerSelection.cleanup(); this.highlightMarkerSelection.cleanup(); this.highlightLabelSelection.cleanup(); this.highlightLabelGroup.visible = false; this.placedLabelData = []; } animateMarkers() { const { animationManager } = this.ctx; const fns = prepareMapMarkerAnimationFunctions(); fromToMotion3(this.id, "markers", animationManager, [this.markerSelection, this.highlightMarkerSelection], fns); } getLabelData() { if (!this.isLabelEnabled()) return []; return this.contextNodeData?.labelData ?? []; } pickNodeClosestDatum(p) { const { x: x0, y: y0 } = p; let minDistanceSquared = Infinity; let minDatum; for (const datum of this.contextNodeData?.nodeData ?? []) { const { x, y, size } = datum.point; const dx2 = Math.max(Math.abs(x - x0) - size, 0); const dy2 = Math.max(Math.abs(y - y0) - size, 0); const distanceSquared = dx2 * dx2 + dy2 * dy2; if (distanceSquared < minDistanceSquared) { minDistanceSquared = distanceSquared; minDatum = datum; } } return minDatum == null ? void 0 : { datum: minDatum, distance: Math.sqrt(minDistanceSquared) }; } legendItemSymbol(datumIndex) { const { dataModel, processedData, properties } = this; const { shape, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = properties; let { fill } = properties; if (datumIndex != null && this.isColorScaleValid()) { const colorValues = dataModel.resolveColumnById(this, "colorValue", processedData); const colorValue = colorValues[datumIndex]; fill = this.colorScale.convert(colorValue); } return { marker: { shape, fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } }; } getLegendData(legendType) { const { processedData, dataModel } = this; if (processedData == null || dataModel == null) return []; const { id: seriesId, visible } = this; const { title, legendItemName, idName, idKey, colorKey, colorRange, showInLegend } = this.properties; if (legendType === "gradient" && colorKey != null && colorRange != null) { const colorDomain = processedData.domain.values[dataModel.resolveProcessedDataIndexById(this, "colorValue")]; const legendDatum = { legendType: "gradient", enabled: visible, seriesId, series: this.getFormatterContext("color"), colorRange, colorDomain }; return [legendDatum]; } else if (legendType === "category") { const legendDatum = { legendType: "category", id: seriesId, itemId: seriesId, seriesId, enabled: visible, label: { text: legendItemName ?? title ?? idName ?? idKey ?? seriesId }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend }; return [legendDatum]; } else { return []; } } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, properties, ctx: { formatManager } } = this; const { idKey, idName, latitudeKey, latitudeName, longitudeKey, longitudeName, colorKey, colorName, sizeKey, sizeName, labelKey, labelName, title, legendItemName, tooltip } = properties; if (!dataModel || !processedData) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const sizeValue = sizeKey == null ? void 0 : dataModel.resolveColumnById(this, `sizeValue`, processedData)[datumIndex]; const colorValue = colorKey == null ? void 0 : dataModel.resolveColumnById(this, `colorValue`, processedData)[datumIndex]; const data = []; if (this.isLabelEnabled() && labelKey != null && labelKey !== idKey) { const labelValue = dataModel.resolveColumnById(this, `labelValue`, processedData)[datumIndex]; const content = formatManager.format(this.callWithContext.bind(this), { type: "category", value: labelValue, datum, seriesId, legendItemName, key: labelKey, source: "tooltip", property: "label", domain: [], boundSeries: this.getFormatterContext("label") }); data.push({ label: labelName, fallbackLabel: labelKey, value: content ?? labelValue }); } if (sizeKey != null && sizeValue != null) { const domain = dataModel.getDomain(this, `sizeValue`, "value", processedData).domain; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: sizeValue, datum, seriesId, legendItemName, key: sizeKey, source: "tooltip", property: "size", domain, boundSeries: this.getFormatterContext("size"), fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: sizeName, fallbackLabel: sizeKey, value: content ?? String(sizeValue) }); } if (colorKey != null && colorValue != null) { const domain = dataModel.getDomain(this, `colorValue`, "value", processedData).domain; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: colorValue, datum, seriesId, legendItemName, key: colorKey, source: "tooltip", property: "color", domain, boundSeries: this.getFormatterContext("color"), fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: colorName, fallbackLabel: colorKey, value: content ?? String(colorValue) }); } let heading; if (idKey != null) { heading = dataModel.resolveColumnById(this, `idValue`, processedData)[datumIndex]; } else if (latitudeKey != null && longitudeKey != null) { const latValue = dataModel.resolveColumnById(this, `latValue`, processedData)[datumIndex]; const lonValue = dataModel.resolveColumnById(this, `lonValue`, processedData)[datumIndex]; heading = `${Math.abs(latValue).toFixed(4)}\xB0 ${latValue >= 0 ? "N" : "S"}, ${Math.abs(lonValue).toFixed(4)}\xB0 ${lonValue >= 0 ? "W" : "E"}`; } const format = this.getMarkerItemStyle({ datumIndex, datum, colorValue, sizeValue }, false); return this.formatTooltipWithContext( tooltip, { heading, title: title ?? legendItemName, symbol: this.legendItemSymbol(datumIndex), data }, { seriesId, datum, title, idKey, idName, latitudeKey, latitudeName, longitudeKey, longitudeName, colorKey, colorName, sizeKey, sizeName, labelKey, labelName, ...format } ); } getFormattedMarkerStyle(markerDatum) { const format = this.getMarkerItemStyle(markerDatum, false); return { size: format.size, shape: format.shape }; } computeFocusBounds(opts) { return computeMarkerFocusBounds2(this, opts); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.label.itemStyler != null; } }; MapMarkerSeries.className = "MapMarkerSeries"; MapMarkerSeries.type = "map-marker"; // packages/ag-charts-enterprise/src/series/map-marker/mapMarkerSeriesOptionsDef.ts var import_ag_charts_community204 = require("ag-charts-community"); var import_ag_charts_core227 = require("ag-charts-core"); var { mapMarkerSeriesThemeableOptionsDef } = import_ag_charts_community204._ModuleSupport; var mapMarkerSeriesOptionsDef = { ...(0, import_ag_charts_core227.without)(import_ag_charts_core227.commonSeriesOptionsDefs, ["highlightStyle", "highlight"]), ...mapMarkerSeriesThemeableOptionsDef, type: (0, import_ag_charts_core227.required)((0, import_ag_charts_core227.constant)("map-marker")), idKey: import_ag_charts_core227.string, latitudeKey: import_ag_charts_core227.string, longitudeKey: import_ag_charts_core227.string, sizeKey: import_ag_charts_core227.string, colorKey: import_ag_charts_core227.string, labelKey: import_ag_charts_core227.string, idName: import_ag_charts_core227.string, latitudeName: import_ag_charts_core227.string, longitudeName: import_ag_charts_core227.string, sizeName: import_ag_charts_core227.string, colorName: import_ag_charts_core227.string, labelName: import_ag_charts_core227.string, topology: import_ag_charts_core227.geoJson, topologyIdKey: import_ag_charts_core227.string, legendItemName: import_ag_charts_core227.string, title: import_ag_charts_core227.string }; // packages/ag-charts-enterprise/src/series/map-marker/mapMarkerModule.ts var MapMarkerSeriesModule = { type: "series", name: "map-marker", chartType: "topology", enterprise: true, version: import_ag_charts_community205.VERSION, dependencies: [TopologyChartModule], options: mapMarkerSeriesOptionsDef, themeTemplate: { ...MAP_THEME_DEFAULTS, series: { shape: "circle", maxSize: 30, fill: applyMapPalette({ $applySwitch: [ { $path: "type" }, { $mapPalette: "fill" }, ["gradient", import_ag_charts_core228.FILL_GRADIENT_RADIAL_REVERSED_DEFAULTS], ["image", import_ag_charts_core228.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core228.FILL_PATTERN_DEFAULTS] ] }), stroke: { $mapPalette: "stroke" }, colorRange: { $if: [ { $eq: [{ $mapPalette: "type" }, "inbuilt"] }, { $mapPalette: "divergingColors" }, applyMapPalette(import_ag_charts_core228.SAFE_RANGE2_OPERATION) ] }, fillOpacity: 0.5, label: { ...import_ag_charts_core228.LABEL_BOXING_DEFAULTS, enabled: false, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" } }, highlight: applyMapPalette(import_ag_charts_core228.MULTI_SERIES_HIGHLIGHT_STYLE) }, tooltip: { range: "exact" } }, create: (ctx) => new MapMarkerSeries(ctx), validate(options, optionsDefs, path) { const result = (0, import_ag_charts_core228.validate)(options, optionsDefs, path); const { cleared, invalid } = result; if (cleared?.idKey == null && (cleared?.latitudeKey == null || cleared?.longitudeKey == null)) { const extendPath = (key) => path ? `${path}.${key}` : key; const message = `Either \`${extendPath("idKey")}\` or both \`${extendPath("latitudeKey")}\` and \`${extendPath("longitudeKey")}\` are required.`; invalid.push(new import_ag_charts_core228.ValidationError("required", message, null, path)); } return result; } }; // packages/ag-charts-enterprise/src/series/map-shape/mapShapeModule.ts var import_ag_charts_community209 = require("ag-charts-community"); var import_ag_charts_core232 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/map-shape/mapShapeSeries.ts var import_ag_charts_community207 = require("ag-charts-community"); var import_ag_charts_core230 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/map-util/polygonLabelUtil.ts function preferredLabelCenter(polygons, { aspectRatio, precision }) { const result = polygonPointSearch(polygons, precision, (p, cx, cy, stride) => { const width = maxWidthOfRectConstrainedByCenterAndAspectRatioToPolygon(p, cx, cy, aspectRatio); const maxWidth2 = width + 2 * stride * aspectRatio; const distance2 = width * Math.SQRT2; const maxDistance = maxWidth2 * Math.SQRT2; return { distance: distance2, maxDistance }; }); if (result == null) return; const { x, y, distance } = result; const maxWidth = distance / Math.SQRT2; return { x, y, maxWidth }; } function maxWidthOfRectConstrainedByCenterAndAspectRatioToLineSegment(a, b, cx, cy, aspectRatio) { const [ax, ay] = a; const [bx, by] = b; const positiveM = 1 / aspectRatio; const abx = bx - ax; const aby = by - ay; const [topPointX, topPointY] = ay <= by ? a : b; const [leftPointX, leftPointY] = ax <= bx ? a : b; const [bottomPointX, bottomPointY] = ay <= by ? b : a; const [rightPointX, rightPointY] = ax <= bx ? b : a; let maxWidth = Infinity; if (abx === 0) { for (let i = 0; i <= 1; i += 1) { const m = i === 0 ? positiveM : -positiveM; const y = m * (ax - cx) + cy; if (y >= topPointY && y <= bottomPointY) { const height = Math.abs(cy - y) * 2; const width = height * aspectRatio; maxWidth = Math.min(maxWidth, width); } } } else { const abm = aby / abx; for (let i = 0; i <= 1; i += 1) { const m = i === 0 ? positiveM : -positiveM; const x = (abm * ax - ay - m * cx + cy) / (abm - m); if (x >= leftPointX && x <= rightPointX) { const width = Math.abs(cx - x) * 2; maxWidth = Math.min(maxWidth, width); } } } const positiveMRecip = aspectRatio; const centerToTopMRecip = Math.abs((topPointX - cx) / (topPointY - cy)); const centerToBottomMRecip = Math.abs((bottomPointX - cx) / (bottomPointY - cy)); if (bottomPointY < cy && centerToBottomMRecip < positiveMRecip) { const height = Math.abs(cy - bottomPointY) * 2; const width = height * aspectRatio; maxWidth = Math.min(maxWidth, width); } else if (topPointY > cy && centerToTopMRecip < positiveMRecip) { const height = Math.abs(cy - topPointY) * 2; const width = height * aspectRatio; maxWidth = Math.min(maxWidth, width); } const centerToLeftM = Math.abs((leftPointY - cy) / (leftPointX - cx)); const centerToRightM = Math.abs((rightPointY - cy) / (rightPointX - cx)); if (rightPointX < cx && centerToRightM < positiveM) { const width = Math.abs(cx - rightPointX) * 2; maxWidth = Math.min(maxWidth, width); } else if (leftPointX > cx && centerToLeftM < positiveM) { const width = Math.abs(cx - leftPointX) * 2; maxWidth = Math.min(maxWidth, width); } return maxWidth; } function maxWidthOfRectConstrainedByCenterAndAspectRatioToPolygon(polygons, cx, cy, aspectRatio) { let inside = false; let minWidth = Infinity; for (const polygon of polygons) { let p0 = polygon.at(-1); let [x0, y0] = p0; for (const p1 of polygon) { const [x1, y1] = p1; if (y1 > cy !== y0 > cy && cx < (x0 - x1) * (cy - y1) / (y0 - y1) + x1) { inside = !inside; } const width = maxWidthOfRectConstrainedByCenterAndAspectRatioToLineSegment(p0, p1, cx, cy, aspectRatio); minWidth = Math.min(minWidth, width); p0 = p1; x0 = x1; y0 = y1; } } return (inside ? 1 : -1) * minWidth; } function applyX(into, cx, x) { if (x >= cx) { into.maxX = Math.min(into.maxX, x - cx); } if (x <= cx) { into.minX = Math.max(into.minX, x - cx); } } function xExtentsOfRectConstrainedByCenterAndHeightToLineSegment(into, a, b, cx, cy, height) { const ry0 = cy - height / 2; const ry1 = cy + height / 2; const [ax, ay] = a; const [bx, by] = b; const abx = bx - ax; const aby = by - ay; const [leftPointX, leftPointY] = ax <= bx ? a : b; const [rightPointX, rightPointY] = ax <= bx ? b : a; if (abx !== 0) { const abm = aby / abx; for (let i = 0; i <= 1; i += 1) { const y = i === 0 ? ry0 : ry1; const x = (y - ay) / abm + ax; if (x >= leftPointX && x <= rightPointX) { applyX(into, cx, x); } } } else if (Math.max(ry0, Math.min(ay, by)) <= Math.min(ry1, Math.max(ay, by))) { applyX(into, cx, ax); } if (rightPointX < cx && rightPointY >= ry0 && rightPointY <= ry1) { applyX(into, cx, rightPointX); } else if (leftPointX > cx && leftPointY >= ry0 && leftPointY <= ry1) { applyX(into, cx, leftPointX); } return into; } function maxWidthInPolygonForRectOfHeight(polygons, cx, cy, height) { const result = { minX: -Infinity, maxX: Infinity }; for (const polygon of polygons) { let p0 = polygon.at(-1); for (const p1 of polygon) { xExtentsOfRectConstrainedByCenterAndHeightToLineSegment(result, p0, p1, cx, cy, height); p0 = p1; } } const { minX, maxX } = result; if (Number.isFinite(minX) && Number.isFinite(maxX)) { return { x: cx + (minX + maxX) / 2, width: maxX - minX }; } else { return { x: cx, width: 0 }; } } // packages/ag-charts-enterprise/src/series/map-shape/mapShapeSeriesProperties.ts var import_ag_charts_community206 = require("ag-charts-community"); var import_ag_charts_core229 = require("ag-charts-core"); var { SeriesProperties: SeriesProperties6, makeSeriesTooltip: makeSeriesTooltip15 } = import_ag_charts_community206._ModuleSupport; var MapShapeSeriesProperties = class extends SeriesProperties6 { constructor() { super(...arguments); this.topology = void 0; this.idKey = ""; this.idName = void 0; this.topologyIdKey = "name"; this.labelKey = void 0; this.labelName = void 0; this.colorRange = void 0; this.fill = "black"; this.fillOpacity = 1; this.stroke = "black"; this.strokeOpacity = 1; this.strokeWidth = 0; this.lineDash = [0]; this.lineDashOffset = 0; this.padding = 0; this.label = new AutoSizedSecondaryLabel(); this.tooltip = makeSeriesTooltip15(); } getStyle() { const { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "topology", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "title", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "legendItemName", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "idKey", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "idName", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "topologyIdKey", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "labelKey", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "labelName", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "colorKey", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "colorName", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "colorRange", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "padding", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core229.Property ], MapShapeSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/map-shape/mapShapeSeries.ts var { getMissCount: getMissCount4, createDatumId: createDatumId14, SeriesNodePickMode: SeriesNodePickMode11, valueProperty: valueProperty13, ColorScale: ColorScale4, Group: Group15, Selection: Selection11, Text: Text6, PointerEvents: PointerEvents7, getLabelStyles: getLabelStyles4 } = import_ag_charts_community207._ModuleSupport; var fixedScale = import_ag_charts_community207._ModuleSupport.MercatorScale.fixedScale(); var MapShapeSeries = class extends TopologySeries { constructor(moduleCtx) { super({ moduleCtx, categoryKey: void 0, propertyKeys: { color: ["colorKey"], label: ["labelKey"] }, propertyNames: { color: ["colorName"], label: ["labelName"] }, pickModes: [SeriesNodePickMode11.EXACT_SHAPE_MATCH, SeriesNodePickMode11.NEAREST_NODE] }); this.properties = new MapShapeSeriesProperties(); this._chartTopology = void 0; this.colorScale = new ColorScale4(); this.itemGroup = this.contentGroup.appendChild(new Group15({ name: "itemGroup" })); this.itemLabelGroup = this.contentGroup.appendChild(new Group15({ name: "itemLabelGroup" })); this.datumSelection = Selection11.select( this.itemGroup, () => this.nodeFactory() ); this.labelSelection = Selection11.select( this.itemLabelGroup, Text6 ); this.highlightDatumSelection = Selection11.select( this.highlightNodeGroup, () => this.nodeFactory() ); this.highlightLabelSelection = Selection11.select(this.highlightLabelGroup, Text6); this.previousLabelLayouts = void 0; this._previousDatumMidPoint = void 0; this.itemLabelGroup.pointerEvents = PointerEvents7.None; } getNodeData() { return this.contextNodeData?.nodeData; } get topology() { return this.properties.topology ?? this._chartTopology; } get hasData() { return super.hasData && this.topology != null; } renderToOffscreenCanvas() { return true; } setChartTopology(topology) { this._chartTopology = topology; if (this.topology === topology) { this.nodeDataRefresh = true; } } setZIndex(zIndex) { super.setZIndex(zIndex); this.contentGroup.zIndex = [1 /* ShapeLine */, zIndex]; this.highlightGroup.zIndex = [4 /* ShapeLineHighlight */, zIndex]; return true; } isLabelEnabled() { return this.properties.labelKey != null && this.properties.label.enabled; } nodeFactory() { const geoGeometry = new GeoGeometry(); geoGeometry.renderMode = 1 /* Polygons */; geoGeometry.lineJoin = "round"; return geoGeometry; } async processData(dataController) { if (this.data == null) return; const { data, topology, colorScale } = this; const { topologyIdKey, idKey, colorKey, labelKey, colorRange } = this.properties; const featureById = /* @__PURE__ */ new Map(); for (const feature of topology?.features.values() ?? []) { const property = feature.properties?.[topologyIdKey]; if (property == null || !containsType(feature.geometry, 1 /* Polygon */)) continue; featureById.set(property, feature); } const colorScaleType = this.colorScale.type; const mercatorScaleType = this.scale?.type; const { dataModel, processedData } = await this.requestDataModel(dataController, data, { props: [ valueProperty13(idKey, mercatorScaleType, { id: "idValue", includeProperty: false }), valueProperty13(idKey, mercatorScaleType, { id: "featureValue", includeProperty: false, processor: () => (datum) => featureById.get(datum) }), ...labelKey ? [valueProperty13(labelKey, "category", { id: "labelValue" })] : [], ...colorKey ? [valueProperty13(colorKey, colorScaleType, { id: "colorValue" })] : [] ] }); const featureValues = dataModel.resolveColumnById(this, `featureValue`, processedData); this.topologyBounds = featureValues.reduce((current, feature) => { const geometry = feature?.geometry; if (geometry == null) return current; return geometryBbox(geometry, current); }, void 0); if (colorRange != null && this.isColorScaleValid()) { const colorKeyIdx = dataModel.resolveProcessedDataIndexById(this, "colorValue"); colorScale.domain = processedData.domain.values[colorKeyIdx]; colorScale.range = colorRange; colorScale.update(); } if (topology == null) { import_ag_charts_core230.Logger.warnOnce(`no topology was provided for [MapShapeSeries]; nothing will be rendered.`); } } isColorScaleValid() { const { colorKey } = this.properties; if (!colorKey) { return false; } const { dataModel, processedData } = this; if (!dataModel || !processedData) { return false; } const colorIdx = dataModel.resolveProcessedDataIndexById(this, "colorValue"); const dataCount = processedData.input.count; const missCount = getMissCount4(this, processedData.defs.values[colorIdx].missing); const colorDataMissing = dataCount === 0 || dataCount === missCount; return !colorDataMissing; } getLabelLayout(datum, labelValue, measurer3, geometry, previousLabelLayout) { if (labelValue == null || geometry == null) return; const { idKey, idName, colorKey, colorName, labelKey, labelName, padding: padding2, label } = this.properties; if (labelKey == null || !label.enabled) return; const labelText = this.getLabelText( labelValue, datum, labelKey, "label", [], label, { value: labelValue, datum, idKey, idName, colorKey, colorName, labelKey, labelName } ); if (labelText == null) return; const baseSize = (0, import_ag_charts_core230.isArray)(labelText) ? (0, import_ag_charts_core230.measureTextSegments)(labelText, label) : measurer3.measureLines(String(labelText)); const aspectRatio = (baseSize.width + 2 * padding2) / (baseSize.height + 2 * padding2); if (previousLabelLayout?.geometry === geometry && previousLabelLayout?.labelText === labelText && previousLabelLayout?.aspectRatio === aspectRatio) { return previousLabelLayout; } const fixedGeometry = projectGeometry(geometry, fixedScale); const fixedPolygon = largestPolygon(fixedGeometry); if (fixedPolygon == null) return; const labelPlacement = preferredLabelCenter(fixedPolygon, { aspectRatio, precision: 1e-3 }); if (labelPlacement == null) return; const { x, y, maxWidth } = labelPlacement; return { geometry, labelText, aspectRatio, x, y, maxWidth, fixedPolygon }; } getLabelDatum(labelLayout, scaling, datumIndex, idValue) { const { scale } = this; if (scale == null) return; const { padding: padding2, label } = this.properties; const { labelText, aspectRatio, x: untruncatedX, y, maxWidth, fixedPolygon } = labelLayout; const maxSizeWithoutTruncation = { width: Math.ceil(maxWidth * scaling), height: Math.ceil(maxWidth * scaling / aspectRatio), meta: untruncatedX }; const labelFormatting = formatSingleLabel( (0, import_ag_charts_core230.toPlainText)(labelText), label, { padding: padding2 }, (height, allowTruncation) => { if (!allowTruncation) { return maxSizeWithoutTruncation; } const result = maxWidthInPolygonForRectOfHeight(fixedPolygon, untruncatedX, y, height / scaling); return { width: result.width * scaling, height, meta: result.x }; } ); if (labelFormatting == null) return; const [{ text: text2, fontSize, lineHeight, width }, formattingX] = labelFormatting; const x = width < maxSizeWithoutTruncation.width ? untruncatedX : formattingX; const position = this.scale.convert(fixedScale.invert([x, y])); return { x: position[0], y: position[1], text: text2, fontSize, lineHeight, datumIndex, idValue, datumId: createDatumId14(idValue) }; } resolveColumn(key, columnId, processedData) { if (key == null || this.dataModel == null) return void 0; return this.dataModel.resolveColumnById(this, columnId, processedData); } resolveShapeDataColumns(processedData) { const { colorKey, labelKey } = this.properties; return { idValues: this.dataModel.resolveColumnById(this, "idValue", processedData), featureValues: this.dataModel.resolveColumnById(this, "featureValue", processedData), labelValues: this.resolveColumn(labelKey, "labelValue", processedData), colorValues: this.resolveColumn(colorKey, "colorValue", processedData) }; } warnMissingGeometries(missingGeometries) { if (missingGeometries.length === 0) return; const missingGeometriesCap = 10; if (missingGeometries.length > missingGeometriesCap) { const excessItems = missingGeometries.length - missingGeometriesCap; missingGeometries.length = missingGeometriesCap; missingGeometries.push(`(+${excessItems} more)`); } import_ag_charts_core230.Logger.warnOnce(`some data items do not have matches in the provided topology`, missingGeometries); } createNodeData() { const { id: seriesId, dataModel, processedData, properties, scale, previousLabelLayouts } = this; const { label, legendItemName, colorKey } = properties; if (dataModel == null || processedData == null) return; if (!this.visible) { return { itemId: seriesId, nodeData: [], labelData: [] }; } const scaling = scale == null ? Number.NaN : (scale.range[1][0] - scale.range[0][0]) / scale.bounds.width; const columns = this.resolveShapeDataColumns(processedData); const measurer3 = (0, import_ag_charts_core230.cachedTextMeasurer)(label); const labelLayouts = /* @__PURE__ */ new Map(); this.previousLabelLayouts = labelLayouts; const nodeData = []; const labelData = []; const missingGeometries = []; const rawData = processedData.dataSources.get(this.id)?.data ?? []; for (const [datumIndex, datum] of rawData.entries()) { const dataValues = { idValue: columns.idValues[datumIndex], colorValue: columns.colorValues?.[datumIndex], labelValue: columns.labelValues?.[datumIndex] }; const geometry = columns.featureValues[datumIndex]?.geometry ?? void 0; if (geometry == null) { missingGeometries.push(dataValues.idValue); } if (colorKey != null && dataValues.colorValue == null) { continue; } const labelLayout = this.getLabelLayout( datum, dataValues.labelValue, measurer3, geometry, previousLabelLayouts?.get(dataValues.idValue) ); if (labelLayout != null) { labelLayouts.set(dataValues.idValue, labelLayout); } const labelDatum = labelLayout != null && scale != null ? this.getLabelDatum(labelLayout, scaling, datumIndex, dataValues.idValue) : void 0; if (labelDatum != null) { labelData.push(labelDatum); } const projectedGeometry = geometry != null && scale != null ? projectGeometry(geometry, scale) : void 0; nodeData.push({ series: this, datum, datumIndex, ...dataValues, projectedGeometry, legendItemName, style: this.getItemStyle({ datum, datumIndex, colorValue: dataValues.colorValue }, false) }); } this.warnMissingGeometries(missingGeometries); return { itemId: seriesId, nodeData, labelData }; } updateSelections() { if (this.nodeDataRefresh) { this.contextNodeData = this.createNodeData(); this.nodeDataRefresh = false; } } update() { const { datumSelection, labelSelection, highlightDatumSelection } = this; this.updateSelections(); this.contentGroup.visible = this.visible; this.labelGroup.visible = this.visible; const drawingMode = this.ctx.chartService.highlight?.drawingMode ?? "overlay"; const highlightedDatum = this.getHighlightedDatum(); const nodeData = this.contextNodeData?.nodeData ?? []; const labelData = this.contextNodeData?.labelData ?? []; this.datumSelection = this.updateDatumSelection({ nodeData, datumSelection }); this.updateDatumStyles({ datumSelection, isHighlight: false }); this.updateDatumNodes({ datumSelection, drawingMode: "overlay" }); this.labelSelection = this.updateLabelSelection({ labelData, labelSelection }); const highlightLabelData = this.getHighlightLabelData(labelData, highlightedDatum); this.highlightLabelSelection = this.updateLabelSelection({ labelData: highlightLabelData, labelSelection: this.highlightLabelSelection }); this.updateLabelNodes({ labelSelection: this.labelSelection, isHighlight: false }); this.updateLabelNodes({ labelSelection: this.highlightLabelSelection, isHighlight: true }); this.highlightDatumSelection = this.updateDatumSelection({ nodeData: highlightedDatum == null ? [] : [highlightedDatum], datumSelection: highlightDatumSelection }); this.updateDatumStyles({ datumSelection: highlightDatumSelection, isHighlight: true }); this.updateDatumNodes({ datumSelection: highlightDatumSelection, drawingMode }); } getHighlightLabelData(labelData, highlightedDatum) { if (labelData.length === 0) return []; const highlightId = createDatumId14(highlightedDatum?.idValue); return labelData.filter( (labelDatum) => labelDatum.datumId === highlightId && labelDatum.datumIndex === highlightedDatum?.datumIndex ); } updateDatumSelection(opts) { return opts.datumSelection.update(opts.nodeData, void 0, (datum) => createDatumId14(datum.idValue)); } getItemStyle({ datumIndex, datum, colorValue }, isHighlight) { const { properties, colorScale } = this; const { colorRange, itemStyler } = properties; const baseStyle = properties.getStyle(); if (colorValue != null) { const fillOverride = this.isColorScaleValid() ? colorScale.convert(colorValue) : colorRange?.[0]; if (fillOverride != null) { baseStyle.fill = fillOverride; } } const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); let style = (0, import_ag_charts_core230.mergeDefaults)(highlightStyle, baseStyle); if (itemStyler != null && datumIndex != null) { const overrides = this.cachedDatumCallback( createDatumId14(datumIndex, isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(datum, datumIndex, isHighlight, style); return this.ctx.optionsGraphService.resolvePartial( ["series", `${this.declarationOrder}`], this.callWithContext(itemStyler, params) ); } ); if (overrides) { style = (0, import_ag_charts_core230.mergeDefaults)(overrides, style); } } return style; } makeItemStylerParams(datum, datumIndex, isHighlight, style) { const { id: seriesId } = this; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum, highlightState, ...style, fill }; } updateDatumStyles({ datumSelection, isHighlight }) { datumSelection.each((_, nodeDatum) => { nodeDatum.style = this.getItemStyle(nodeDatum, isHighlight); }); } updateDatumNodes({ datumSelection, drawingMode }) { const fillBBox = getTopologyShapeFillBBox(this.scale); datumSelection.each((geoGeometry, nodeDatum) => { const { projectedGeometry } = nodeDatum; if (projectedGeometry == null) { geoGeometry.visible = false; geoGeometry.projectedGeometry = void 0; return; } geoGeometry.visible = true; geoGeometry.projectedGeometry = projectedGeometry; geoGeometry.setStyleProperties(nodeDatum.style, fillBBox); geoGeometry.drawingMode = drawingMode; }); } updateLabelSelection(opts) { const labels = this.isLabelEnabled() ? opts.labelData : []; return opts.labelSelection.update(labels); } updateLabelNodes({ isHighlight, labelSelection }) { const { properties } = this; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); labelSelection.each((label, labelDatum) => { const { x, y, text: text2, fontSize, lineHeight, datumIndex } = labelDatum; const style = getLabelStyles4( this, void 0, properties, properties.label, isHighlight, activeHighlight ); const { color: fill, fontStyle, fontWeight, fontFamily } = style; label.visible = true; label.x = x; label.y = y; label.text = text2; label.fill = fill; label.fontStyle = fontStyle; label.fontWeight = fontWeight; label.fontSize = fontSize; label.lineHeight = lineHeight; label.fontFamily = fontFamily; label.textAlign = "center"; label.textBaseline = "middle"; label.fillOpacity = this.getHighlightStyle(isHighlight, datumIndex).opacity ?? 1; label.setBoxing(style); }); } resetAnimation() { } pickNodeClosestDatum({ x, y }) { let minDistanceSquared = Infinity; let minDatum; this.datumSelection.each((node, datum) => { const distanceSquared = node.distanceSquared(x, y); if (distanceSquared < minDistanceSquared) { minDistanceSquared = distanceSquared; minDatum = datum; } }); return minDatum == null ? void 0 : { datum: minDatum, distance: Math.sqrt(minDistanceSquared) }; } datumMidPoint(datum) { const { _previousDatumMidPoint } = this; if (_previousDatumMidPoint?.datum === datum) { return _previousDatumMidPoint.point; } const projectedGeometry = datum.projectedGeometry; const polygon = projectedGeometry == null ? void 0 : largestPolygon(projectedGeometry); const center = polygon == null ? void 0 : polygonMarkerCenter(polygon, 2); const point = center == null ? void 0 : { x: center[0], y: center[1] }; this._previousDatumMidPoint = { datum, point }; return point; } legendItemSymbol(datumIndex) { const { dataModel, processedData, properties } = this; const { fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = properties; let { fill } = properties; if (datumIndex != null && this.isColorScaleValid()) { const colorValues = dataModel.resolveColumnById(this, "colorValue", processedData); const colorValue = colorValues[datumIndex]; if (colorValue != null) { fill = this.colorScale.convert(colorValue); } } return { marker: { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } }; } getLegendData(legendType) { const { processedData, dataModel } = this; if (processedData == null || dataModel == null) return []; const { id: seriesId, visible } = this; const { title, legendItemName, idKey, idName, colorKey, colorRange, showInLegend } = this.properties; if (legendType === "gradient" && colorKey != null && colorRange != null) { const colorDomain = processedData.domain.values[dataModel.resolveProcessedDataIndexById(this, "colorValue")]; const legendDatum = { legendType: "gradient", enabled: visible, seriesId, series: this.getFormatterContext("color"), colorRange, colorDomain }; return [legendDatum]; } else if (legendType === "category") { const legendDatum = { legendType: "category", id: seriesId, itemId: seriesId, seriesId, enabled: visible, label: { text: legendItemName ?? title ?? idName ?? idKey }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend }; return [legendDatum]; } else { return []; } } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, properties, ctx: { formatManager } } = this; const { idKey, idName, colorKey, colorName, labelKey, labelName, legendItemName, title, tooltip } = properties; if (!dataModel || !processedData) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const idValue = dataModel.resolveColumnById(this, `idValue`, processedData)[datumIndex]; const colorValue = colorKey == null ? void 0 : dataModel.resolveColumnById(this, `colorValue`, processedData)[datumIndex]; if (colorKey != null && colorValue == null) { return; } const data = []; if (this.isLabelEnabled() && labelKey != null && labelKey !== idKey) { const labelValue = dataModel.resolveColumnById(this, `labelValue`, processedData)[datumIndex]; const content = formatManager.format(this.callWithContext.bind(this), { type: "category", value: labelValue, datum, seriesId, legendItemName, key: labelKey, source: "tooltip", property: "label", domain: [], boundSeries: this.getFormatterContext("label") }); data.push({ label: labelName, fallbackLabel: labelKey, value: content ?? labelValue }); } if (colorValue != null) { const domain = dataModel.getDomain(this, `colorValue`, "value", processedData).domain; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: colorValue, datum, seriesId, legendItemName, key: colorKey, source: "tooltip", property: "color", domain, boundSeries: this.getFormatterContext("color"), fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: colorName, fallbackLabel: colorKey, value: content ?? String(colorValue) }); } const format = this.getItemStyle({ datum, datumIndex, colorValue }, false); return this.formatTooltipWithContext( tooltip, { heading: idValue, title: title ?? legendItemName, symbol: this.legendItemSymbol(datumIndex), data }, { seriesId, datum, title, idKey, idName, colorKey, colorName, labelKey, labelName, ...format } ); } computeFocusBounds(opts) { return findFocusedGeoGeometry(this, opts); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.label.itemStyler != null; } }; MapShapeSeries.className = "MapShapeSeries"; MapShapeSeries.type = "map-shape"; // packages/ag-charts-enterprise/src/series/map-shape/mapShapeSeriesOptionsDef.ts var import_ag_charts_community208 = require("ag-charts-community"); var import_ag_charts_core231 = require("ag-charts-core"); var { mapShapeSeriesThemeableOptionsDef } = import_ag_charts_community208._ModuleSupport; var mapShapeSeriesOptionsDef = { ...(0, import_ag_charts_core231.without)(import_ag_charts_core231.commonSeriesOptionsDefs, ["highlightStyle", "highlight"]), ...mapShapeSeriesThemeableOptionsDef, type: (0, import_ag_charts_core231.required)((0, import_ag_charts_core231.constant)("map-shape")), idKey: (0, import_ag_charts_core231.required)(import_ag_charts_core231.string), colorKey: import_ag_charts_core231.string, labelKey: import_ag_charts_core231.string, idName: import_ag_charts_core231.string, colorName: import_ag_charts_core231.string, labelName: import_ag_charts_core231.string, topology: import_ag_charts_core231.geoJson, topologyIdKey: import_ag_charts_core231.string, legendItemName: import_ag_charts_core231.string, title: import_ag_charts_core231.string }; // packages/ag-charts-enterprise/src/series/map-shape/mapShapeModule.ts var MapShapeSeriesModule = { type: "series", name: "map-shape", chartType: "topology", enterprise: true, version: import_ag_charts_community209.VERSION, dependencies: [TopologyChartModule], options: mapShapeSeriesOptionsDef, themeTemplate: { ...MAP_THEME_DEFAULTS, series: { fill: applyMapPalette({ $applySwitch: [ { $path: "type" }, { $mapPalette: "fill" }, ["gradient", import_ag_charts_core232.FILL_GRADIENT_LINEAR_DEFAULTS], ["image", import_ag_charts_core232.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core232.FILL_PATTERN_DEFAULTS] ] }), stroke: { $ref: "chartBackgroundColor" }, colorRange: { $if: [ { $eq: [{ $mapPalette: "type" }, "inbuilt"] }, { $mapPalette: "divergingColors" }, applyMapPalette(import_ag_charts_core232.SAFE_RANGE2_OPERATION) ] }, fillOpacity: 1, strokeWidth: 1, lineDash: [0], lineDashOffset: 0, padding: 2, label: { ...import_ag_charts_core232.LABEL_BOXING_DEFAULTS, enabled: true, color: { $ref: "chartBackgroundColor" }, fontFamily: { $ref: "fontFamily" }, fontSize: { $ref: "fontSize" }, fontWeight: "bold", overflowStrategy: "hide" }, highlight: applyMapPalette(import_ag_charts_core232.MULTI_SERIES_HIGHLIGHT_STYLE) }, tooltip: { range: "exact" } }, create: (ctx) => new MapShapeSeries(ctx) }; // packages/ag-charts-enterprise/src/series/map-shape-background/mapShapeBackgroundModule.ts var import_ag_charts_community213 = require("ag-charts-community"); var import_ag_charts_core236 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/map-shape-background/mapShapeBackgroundSeries.ts var import_ag_charts_community211 = require("ag-charts-community"); var import_ag_charts_core234 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/map-shape-background/mapShapeBackgroundSeriesProperties.ts var import_ag_charts_community210 = require("ag-charts-community"); var import_ag_charts_core233 = require("ag-charts-core"); var { SeriesProperties: SeriesProperties7, makeSeriesTooltip: makeSeriesTooltip16 } = import_ag_charts_community210._ModuleSupport; var MapShapeBackgroundSeriesProperties = class extends SeriesProperties7 { constructor() { super(...arguments); this.topology = void 0; this.fill = "black"; this.fillOpacity = 1; this.stroke = "black"; this.strokeOpacity = 1; this.strokeWidth = 0; this.lineDash = [0]; this.lineDashOffset = 0; this.tooltip = makeSeriesTooltip16(); } }; __decorateClass([ import_ag_charts_core233.Property ], MapShapeBackgroundSeriesProperties.prototype, "topology", 2); __decorateClass([ import_ag_charts_core233.Property ], MapShapeBackgroundSeriesProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core233.Property ], MapShapeBackgroundSeriesProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core233.Property ], MapShapeBackgroundSeriesProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core233.Property ], MapShapeBackgroundSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core233.Property ], MapShapeBackgroundSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core233.Property ], MapShapeBackgroundSeriesProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core233.Property ], MapShapeBackgroundSeriesProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core233.Property ], MapShapeBackgroundSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/map-shape-background/mapShapeBackgroundSeries.ts var { createDatumId: createDatumId15, Selection: Selection12, Group: Group16, PointerEvents: PointerEvents8 } = import_ag_charts_community211._ModuleSupport; var MapShapeBackgroundSeries = class extends TopologySeries { constructor(moduleCtx) { super({ moduleCtx, categoryKey: void 0, pickModes: [] }); this.properties = new MapShapeBackgroundSeriesProperties(); this._chartTopology = void 0; this.itemGroup = this.contentGroup.appendChild(new Group16({ name: "itemGroup" })); this.datumSelection = Selection12.select( this.itemGroup, () => this.nodeFactory() ); this.itemGroup.pointerEvents = PointerEvents8.None; } get topology() { return this.properties.topology ?? this._chartTopology; } get focusable() { return false; } setOptionsData() { } setChartData() { } getNodeData() { return; } get hasData() { return false; } renderToOffscreenCanvas() { return true; } setChartTopology(topology) { this._chartTopology = topology; if (this.topology === topology) { this.nodeDataRefresh = true; } } setZIndex(zIndex) { super.setZIndex(zIndex); this.contentGroup.zIndex = [0 /* ShapeLineBackground */, zIndex, 0]; this.highlightGroup.zIndex = [0 /* ShapeLineBackground */, zIndex, 1]; return true; } nodeFactory() { const geoGeometry = new GeoGeometry(); geoGeometry.renderMode = 1 /* Polygons */; geoGeometry.lineJoin = "round"; geoGeometry.pointerEvents = PointerEvents8.None; return geoGeometry; } processData() { const { topology } = this; this.topologyBounds = topology?.features.reduce((current, feature) => { const geometry = feature.geometry; if (geometry == null) return current; return geometryBbox(geometry, current); }, void 0); if (topology == null) { import_ag_charts_core234.Logger.warnOnce(`no topology was provided for [MapShapeBackgroundSeries]; nothing will be rendered.`); } } createNodeData() { const { id: seriesId, topology, scale, properties } = this; if (topology == null) return; const { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = properties; const nodeData = []; const labelData = []; for (const [index, feature] of topology.features.entries()) { const { geometry } = feature; const projectedGeometry = geometry != null && scale != null ? projectGeometry(geometry, scale) : void 0; if (projectedGeometry == null) continue; nodeData.push({ series: this, datum: feature, datumIndex: 0, index, projectedGeometry, style: { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } }); } return { itemId: seriesId, nodeData, labelData }; } updateSelections() { if (this.nodeDataRefresh) { this.contextNodeData = this.createNodeData(); this.nodeDataRefresh = false; } } update() { const { datumSelection } = this; this.updateSelections(); this.contentGroup.visible = this.visible; this.labelGroup.visible = this.visible; const { nodeData = [] } = this.contextNodeData ?? {}; this.datumSelection = this.updateDatumSelection({ nodeData, datumSelection }); this.updateDatumNodes({ datumSelection }); } updateDatumSelection(opts) { return opts.datumSelection.update(opts.nodeData, void 0, (datum) => createDatumId15(datum.index)); } updateDatumNodes(opts) { const { datumSelection } = opts; datumSelection.each((geoGeometry, datum) => { const { projectedGeometry } = datum; if (projectedGeometry == null) { geoGeometry.visible = false; geoGeometry.projectedGeometry = void 0; return; } geoGeometry.visible = true; geoGeometry.projectedGeometry = projectedGeometry; geoGeometry.setProperties(datum.style); }); } resetAnimation() { } getLegendData() { return []; } getTooltipContent(_seriesDatum) { return; } pickFocus() { return void 0; } computeFocusBounds(_opts) { return void 0; } hasItemStylers() { return false; } }; MapShapeBackgroundSeries.className = "MapShapeBackgroundSeries"; MapShapeBackgroundSeries.type = "map-shape-background"; // packages/ag-charts-enterprise/src/series/map-shape-background/mapShapeBackgroundSeriesOptionsDef.ts var import_ag_charts_community212 = require("ag-charts-community"); var import_ag_charts_core235 = require("ag-charts-core"); var { mapShapeBackgroundSeriesThemeableOptionsDef } = import_ag_charts_community212._ModuleSupport; var mapShapeBackgroundSeriesOptionsDef = { ...mapShapeBackgroundSeriesThemeableOptionsDef, ...import_ag_charts_core235.commonSeriesOptionsDefs, type: (0, import_ag_charts_core235.required)((0, import_ag_charts_core235.constant)("map-shape-background")), topology: import_ag_charts_core235.geoJson }; // packages/ag-charts-enterprise/src/series/map-shape-background/mapShapeBackgroundModule.ts var MapShapeBackgroundSeriesModule = { type: "series", name: "map-shape-background", chartType: "topology", enterprise: true, version: import_ag_charts_community213.VERSION, dependencies: [TopologyChartModule], options: mapShapeBackgroundSeriesOptionsDef, themeTemplate: { ...MAP_THEME_DEFAULTS, series: { fill: applyMapPalette({ $applySwitch: [ { $path: "type" }, { $path: ["/1", { $mapPalette: "fill" }, { $mapPalette: "hierarchyColors" }] }, ["gradient", import_ag_charts_core236.FILL_GRADIENT_LINEAR_HIERARCHY_DEFAULTS], ["image", import_ag_charts_core236.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core236.FILL_PATTERN_HIERARCHY_DEFAULTS] ] }), stroke: { $ref: "chartBackgroundColor" }, strokeWidth: 1 } }, create: (ctx) => new MapShapeBackgroundSeries(ctx) }; // packages/ag-charts-enterprise/src/series/nightingale/nightingaleModule.ts var import_ag_charts_community221 = require("ag-charts-community"); var import_ag_charts_core243 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/nightingale/nightingaleSeries.ts var import_ag_charts_community219 = require("ag-charts-community"); var import_ag_charts_core240 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radial-column/radialColumnSeriesBase.ts var import_ag_charts_community215 = require("ag-charts-community"); var import_ag_charts_core238 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/util/radialUtil.ts var import_ag_charts_community214 = require("ag-charts-community"); var import_ag_charts_core237 = require("ag-charts-core"); var { createDatumId: createDatumId16, toHighlightString: toHighlightString4 } = import_ag_charts_community214._ModuleSupport; function makeStylerParams(series, highlightStateEnum) { const { id: seriesId } = series; const { angleKey, cornerRadius, fill, fillOpacity, lineDash, lineDashOffset, radiusKey, stackGroup, stroke: stroke3, strokeOpacity, strokeWidth } = series.properties; const highlightState = toHighlightString4(highlightStateEnum ?? import_ag_charts_community214._ModuleSupport.HighlightState.None); return { angleKey, cornerRadius, fill, fillOpacity, highlightState, lineDash, lineDashOffset, radiusKey, seriesId, stackGroup, stroke: stroke3, strokeOpacity, strokeWidth }; } function getStyle(series, ignoreStylerCallback, highlightState) { const { styler } = series.properties; let stylerResult = {}; if (!ignoreStylerCallback && styler) { const stylerParams = makeStylerParams(series, highlightState); stylerResult = series.ctx.optionsGraphService.resolvePartial( ["series", `${series.declarationOrder}`], series.cachedCallWithContext(styler, stylerParams) ?? {}, { pick: false } ) ?? {}; } return { cornerRadius: stylerResult.cornerRadius ?? series.properties.cornerRadius, fill: stylerResult.fill ?? series.properties.fill, fillOpacity: stylerResult.fillOpacity ?? series.properties.fillOpacity, lineDash: stylerResult.lineDash ?? series.properties.lineDash, lineDashOffset: stylerResult.lineDashOffset ?? series.properties.lineDashOffset, stroke: stylerResult.stroke ?? series.properties.stroke, strokeOpacity: stylerResult.strokeOpacity ?? series.properties.strokeOpacity, strokeWidth: stylerResult.strokeWidth ?? series.properties.strokeWidth, opacity: 1 }; } function makeItemStylerParams(series, nodeDatum, isHighlight, style) { const { id: seriesId, properties } = series; const { angleKey, radiusKey } = properties; const activeHighlight = series.ctx.highlightManager?.getActiveHighlight(); const highlightStateString = series.getHighlightStateString(activeHighlight, isHighlight, nodeDatum.datumIndex); const fill = series.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum: nodeDatum.datum, highlightState: highlightStateString, angleKey, radiusKey, ...style, fill }; } function getItemStyle(series, nodeDatum, isHighlight, highlightState) { const { properties } = series; const { itemStyler } = properties; const highlightStyle = series.getHighlightStyle(isHighlight, nodeDatum?.datumIndex, highlightState); const baseStyle = (0, import_ag_charts_core237.mergeDefaults)(highlightStyle, getStyle(series, nodeDatum === void 0, highlightState)); let style = baseStyle; if (itemStyler != null && nodeDatum != null) { const overrides = series.cachedDatumCallback( createDatumId16(series.getDatumId(nodeDatum), isHighlight ? "highlight" : "node"), () => { const params = makeItemStylerParams(series, nodeDatum, isHighlight, style); return series.callWithContext(itemStyler, params); } ); if (overrides) { style = (0, import_ag_charts_core237.mergeDefaults)(overrides, style); } } return style; } // packages/ag-charts-enterprise/src/series/radial-column/radialColumnSeriesBase.ts var { DEFAULT_POLAR_DIRECTION_KEYS, DEFAULT_POLAR_DIRECTION_NAMES, PolarAxis, diff: diff6, fixNumericExtent: fixNumericExtent8, groupAccumulativeValueProperty: groupAccumulativeValueProperty2, keyProperty: keyProperty9, normaliseGroupTo, resetLabelFn: resetLabelFn5, seriesLabelFadeInAnimation: seriesLabelFadeInAnimation5, seriesLabelFadeOutAnimation, valueProperty: valueProperty14, animationValidation: animationValidation7, createDatumId: createDatumId17, SeriesNodePickMode: SeriesNodePickMode12, CategoryScale: CategoryScale3, motion: motion6, updateLabelNode: updateLabelNode6, getItemStyles: getItemStyles3 } = import_ag_charts_community215._ModuleSupport; var RadialColumnSeriesNodeEvent = class extends import_ag_charts_community215._ModuleSupport.SeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); this.angleKey = series.properties.angleKey; this.radiusKey = series.properties.radiusKey; } }; var RadialColumnSeriesBase = class extends import_ag_charts_community215._ModuleSupport.PolarSeries { constructor(moduleCtx, { animationResetFns }) { super({ moduleCtx, categoryKey: "angleValue", propertyKeys: DEFAULT_POLAR_DIRECTION_KEYS, propertyNames: DEFAULT_POLAR_DIRECTION_NAMES, canHaveAxes: true, pickModes: [SeriesNodePickMode12.NEAREST_NODE, SeriesNodePickMode12.EXACT_SHAPE_MATCH], animationResetFns: { ...animationResetFns, label: resetLabelFn5 } }); this.NodeEvent = RadialColumnSeriesNodeEvent; this.groupScale = new CategoryScale3(); this.circleCache = { r: 0, cx: 0, cy: 0 }; } getSeriesDomain(direction) { const { dataModel, processedData } = this; if (!processedData || !dataModel) return { domain: [] }; if (direction === import_ag_charts_core238.ChartAxisDirection.Angle) { return dataModel.getDomain(this, "angleValue", "key", processedData); } else { const yExtent = dataModel.getDomain(this, "radiusValue-end", "value", processedData).domain; const fixedYExtent = Number.isFinite(yExtent[1] - yExtent[0]) ? [Math.min(yExtent[0], 0), Math.max(yExtent[1], 0)] : []; return { domain: fixNumericExtent8(fixedYExtent) }; } } async processData(dataController) { const { angleKey, radiusKey, normalizedTo } = this.properties; const animationEnabled = !this.ctx.animationManager.isSkipped(); const stackGroupId = this.getStackId(); const stackGroupTrailingId = `${stackGroupId}-trailing`; const extraProps = []; if ((0, import_ag_charts_core238.isDefined)(normalizedTo)) { extraProps.push(normaliseGroupTo([stackGroupId, stackGroupTrailingId], Math.abs(normalizedTo))); } if (this.needsDataModelDiff() && this.processedData) { extraProps.push(diff6(this.id, this.processedData)); } if (animationEnabled) { extraProps.push(animationValidation7()); } const visibleProps = this.visible ? {} : { forceValue: 0 }; const radiusScaleType = this.axes[import_ag_charts_core238.ChartAxisDirection.Radius]?.scale.type; const angleScaleType = this.axes[import_ag_charts_core238.ChartAxisDirection.Angle]?.scale.type; const allowNullKey = this.properties.allowNullKeys ?? false; await this.requestDataModel(dataController, this.data, { props: [ keyProperty9(angleKey, angleScaleType, { id: "angleValue", allowNullKey }), valueProperty14(radiusKey, radiusScaleType, { id: "radiusValue-raw", invalidValue: null, ...visibleProps }), ...groupAccumulativeValueProperty2( radiusKey, "normal", { id: `radiusValue-end`, rangeId: `radiusValue-range`, invalidValue: null, groupId: stackGroupId, separateNegative: true, ...visibleProps }, radiusScaleType ), ...groupAccumulativeValueProperty2( radiusKey, "trailing", { id: `radiusValue-start`, invalidValue: null, groupId: stackGroupTrailingId, separateNegative: true, ...visibleProps }, radiusScaleType ), ...extraProps ], groupByKeys: true, groupByData: false }); this.animationState.transition("updateData"); } didCircleChange() { const r = this.radius; const cx = this.centerX; const cy = this.centerY; const cache = this.circleCache; if (r !== cache.r || cx !== cache.cx || cy !== cache.cy) { this.circleCache = { r, cx, cy }; return true; } return false; } isRadiusAxisReversed() { return this.axes[import_ag_charts_core238.ChartAxisDirection.Radius]?.isReversed(); } maybeRefreshNodeData() { const circleChanged = this.didCircleChange(); if (!circleChanged && !this.nodeDataRefresh) return; this.contextNodeData = this.createNodeData(); this.nodeData = this.contextNodeData?.nodeData ?? []; this.nodeDataRefresh = false; } getAxisInnerRadius() { const radiusAxis = this.axes[import_ag_charts_core238.ChartAxisDirection.Radius]; return radiusAxis instanceof PolarAxis ? this.radius * radiusAxis.innerRadiusRatio : 0; } createNodeData() { const { processedData, dataModel, groupScale } = this; if (!dataModel || processedData?.type !== "grouped") return; const angleAxis = this.axes[import_ag_charts_core238.ChartAxisDirection.Angle]; const radiusAxis = this.axes[import_ag_charts_core238.ChartAxisDirection.Radius]; const angleScale = angleAxis?.scale; const radiusScale = radiusAxis?.scale; if (!angleScale || !radiusScale) { return; } const angleValues = dataModel.resolveKeysById(this, `angleValue`, processedData); const radiusStartValues = dataModel.resolveColumnById(this, `radiusValue-start`, processedData); const radiusEndValues = dataModel.resolveColumnById(this, `radiusValue-end`, processedData); const radiusRawValues = dataModel.resolveColumnById(this, `radiusValue-raw`, processedData); let groupPaddingInner = 0; let groupPaddingOuter = 0; if (angleAxis instanceof AngleCategoryAxis) { groupPaddingInner = angleAxis.groupPaddingInner; groupPaddingOuter = angleAxis.paddingInner; } const groupAngleStep = angleScale.bandwidth ?? 0; const paddedGroupAngleStep = groupAngleStep * (1 - groupPaddingOuter); const { index: groupIndex, visibleGroupCount } = this.ctx.seriesStateManager.getVisiblePeerGroupIndex(this); groupScale.domain = Array.from({ length: visibleGroupCount }).map((_, i) => String(i)); groupScale.range = [-paddedGroupAngleStep / 2, paddedGroupAngleStep / 2]; groupScale.paddingInner = visibleGroupCount > 1 ? groupPaddingInner : 0; const radiusAxisReversed = this.isRadiusAxisReversed(); const axisInnerRadius = this.getAxisInnerRadius(); const axisOuterRadius = this.radius; const axisTotalRadius = axisOuterRadius + axisInnerRadius; const { angleKey, radiusKey, angleName, radiusName, legendItemName, label } = this.properties; const radiusDomain = this.getSeriesDomain(import_ag_charts_core238.ChartAxisDirection.Radius).domain; const getLabelNodeDatum = (datum, radiusDatum, x, y) => { const labelText = this.getLabelText( radiusDatum, datum, radiusKey, "radius", radiusDomain, label, { value: radiusDatum, datum, angleKey, radiusKey, angleName, radiusName, legendItemName } ); if (labelText) { return { x, y, text: labelText, textAlign: "center", textBaseline: "middle" }; } }; const nodeData = []; const styles = getItemStyles3( (nodeDatum, isHighlight, highlightState) => getItemStyle(this, nodeDatum, isHighlight, highlightState) ); const context = { itemId: radiusKey, nodeData, labelData: nodeData, styles }; if (!this.visible) return context; const { dataSources } = processedData; const rawData = dataSources.get(this.id)?.data ?? []; for (const { datumIndex } of dataModel.forEachGroupDatum(this, processedData)) { const datum = rawData[datumIndex]; const angleDatum = angleValues[datumIndex]; if (angleDatum === void 0 && !this.properties.allowNullKeys) return; const radiusDatum = radiusRawValues[datumIndex]; const isPositive = radiusDatum >= 0 && !Object.is(radiusDatum, -0); const innerRadiusDatum = radiusStartValues[datumIndex]; const outerRadiusDatum = radiusEndValues[datumIndex]; const negative = isPositive === radiusAxisReversed; if (innerRadiusDatum === void 0 || outerRadiusDatum === void 0) return; let startAngle; let endAngle; let angle; if (rawData.length === 1) { startAngle = -0.5 * Math.PI; endAngle = 1.5 * Math.PI; angle = startAngle; } else { const groupAngle = angleScale.convert(angleDatum); startAngle = (0, import_ag_charts_core238.normalizeAngle360)(groupAngle + groupScale.convert(String(groupIndex))); endAngle = (0, import_ag_charts_core238.normalizeAngle360)(startAngle + groupScale.bandwidth); angle = startAngle + groupScale.bandwidth / 2; } const innerRadius = axisTotalRadius - radiusScale.convert(innerRadiusDatum); const outerRadius = axisTotalRadius - radiusScale.convert(outerRadiusDatum); const midRadius = (innerRadius + outerRadius) / 2; const x = Math.cos(angle) * midRadius; const y = Math.sin(angle) * midRadius; const labelNodeDatum = this.properties.label.enabled ? getLabelNodeDatum(datum, radiusDatum, x, y) : void 0; const columnWidth = this.getColumnWidth(startAngle, endAngle); nodeData.push({ series: this, datum, datumIndex, point: { x, y, size: 0 }, midPoint: { x, y }, label: labelNodeDatum, angleValue: angleDatum, radiusValue: radiusDatum, negative, innerRadius, outerRadius, stackInnerRadius: innerRadius, stackOuterRadius: outerRadius, startAngle, endAngle, midAngle: angle, axisInnerRadius, axisOuterRadius, columnWidth, index: datumIndex }); } return { itemId: radiusKey, nodeData, labelData: nodeData, styles }; } getColumnWidth(_startAngle, _endAngle) { return Number.NaN; } update({ seriesRect }) { const resize = this.checkResize(seriesRect); this.maybeRefreshNodeData(); this.contentGroup.translationX = this.centerX; this.contentGroup.translationY = this.centerY; this.highlightGroup.translationX = this.centerX; this.highlightGroup.translationY = this.centerY; if (this.labelGroup) { this.labelGroup.translationX = this.centerX; this.labelGroup.translationY = this.centerY; } this.updateSectorSelection(this.itemSelection, false); this.updateSectorSelection(this.highlightSelection, true); this.updateLabels(); if (resize) { this.animationState.transition("resize"); } this.animationState.transition("update"); } updateSectorSelection(selection, isHighlight) { const { contextNodeData } = this; if (!contextNodeData) { return; } const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); let selectionData = []; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); if (isHighlight) { if (activeHighlight?.datum && activeHighlight.series === this) { selectionData.push(activeHighlight); } } else { selectionData = this.nodeData; } const radiusAxisReversed = this.isRadiusAxisReversed(); const axisInnerRadius = radiusAxisReversed ? this.radius : this.getAxisInnerRadius(); const axisOuterRadius = radiusAxisReversed ? this.getAxisInnerRadius() : this.radius; const fillBBox = this.getShapeFillBBox(); const hasItemStylers = this.hasItemStylers(); selection.update(selectionData, void 0, (datum) => this.getDatumId(datum)).each((node, nodeDatum) => { const { midPoint } = nodeDatum; if (hasItemStylers) { const highlightState = this.getHighlightState(activeHighlight, isHighlight, nodeDatum.datumIndex); nodeDatum.style = getItemStyle(this, nodeDatum, isHighlight, highlightState); } const style = nodeDatum.style ?? contextNodeData.styles[this.getHighlightState(highlightedDatum, isHighlight, nodeDatum.datumIndex)]; const fill = style.fill; const itemBounds = (0, import_ag_charts_core238.isGradientFill)(fill) && fill.bounds === "item"; const fillParams = itemBounds ? { centerX: midPoint?.x ?? 0, centerY: midPoint?.y ?? 0 } : { centerX: 0, centerY: 0, innerRadius: axisInnerRadius, outerRadius: axisOuterRadius }; this.updateItemPath(node, nodeDatum, isHighlight); node.setStyleProperties(style, fillBBox, fillParams); node.cornerRadius = style.cornerRadius ?? 0; node.lineJoin = "round"; }); } updateLabels() { const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightDatum = activeHighlight?.series === this && activeHighlight?.datum ? activeHighlight : void 0; const highlightData = highlightDatum ? [highlightDatum] : []; this.labelSelection.update(this.nodeData).each((node, datum) => { updateLabelNode6(this, node, this.properties, this.properties.label, datum.label, false, activeHighlight); node.fillOpacity = this.getHighlightStyle(false, datum.datumIndex).opacity ?? 1; }); this.highlightLabelSelection.update(highlightData, void 0, (datum) => this.getDatumId(datum)).each((node, datum) => { updateLabelNode6(this, node, this.properties, this.properties.label, datum.label, true, activeHighlight); node.fillOpacity = this.getHighlightStyle(true, datum.datumIndex).opacity ?? 1; }); } animateEmptyUpdateReady() { const { labelSelection } = this; const fns = this.getColumnTransitionFunctions(); motion6.fromToMotion(this.id, "datums", this.ctx.animationManager, [this.itemSelection], fns); seriesLabelFadeInAnimation5( this, "labels", this.ctx.animationManager, labelSelection, this.highlightLabelSelection ); } animateClearingUpdateEmpty() { const { itemSelection } = this; const { animationManager } = this.ctx; const fns = this.getColumnTransitionFunctions(); motion6.fromToMotion(this.id, "datums", animationManager, [itemSelection], fns); seriesLabelFadeOutAnimation( this, "labels", animationManager, this.labelSelection, this.highlightLabelSelection ); } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, axes, properties } = this; const { angleKey, angleName, radiusKey, radiusName, legendItemName, tooltip } = properties; const angleAxis = axes[import_ag_charts_core238.ChartAxisDirection.Angle]; const radiusAxis = axes[import_ag_charts_core238.ChartAxisDirection.Radius]; const nodeDatum = this.nodeData?.[datumIndex]; if (!dataModel || !processedData || !angleAxis || !radiusAxis || !nodeDatum) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const angleValue = dataModel.resolveKeysById(this, `angleValue`, processedData)[datumIndex]; const radiusValue = dataModel.resolveColumnById(this, `radiusValue-raw`, processedData)[datumIndex]; if (angleValue === void 0 && !this.properties.allowNullKeys) return; const format = getItemStyle(this, nodeDatum, false); return this.formatTooltipWithContext( tooltip, { heading: this.getAxisValueText(angleAxis, "tooltip", angleValue, datum, angleKey, void 0), symbol: this.legendItemSymbol(), data: [ { label: radiusName, fallbackLabel: radiusKey, value: this.getAxisValueText(radiusAxis, "tooltip", radiusValue, datum, radiusKey, void 0), missing: import_ag_charts_community215._ModuleSupport.isTooltipValueMissing(radiusValue) } ] }, { seriesId, datum, title: angleName, angleKey, angleName, radiusKey, radiusName, legendItemName, ...format } ); } pickNodeClosestDatum(point) { return this.pickNodeNearestDistantObject(point, this.itemSelection.nodes()); } legendItemSymbol() { const { fill, stroke: stroke3, fillOpacity, strokeOpacity, strokeWidth, lineDash, lineDashOffset } = getStyle( this, false, import_ag_charts_community215._ModuleSupport.HighlightState.None ); const markerStyle = { fill: fill ?? "rgba(0, 0, 0, 0)", stroke: stroke3 ?? "rgba(0, 0, 0, 0)", fillOpacity, strokeOpacity, strokeWidth, lineDash, lineDashOffset }; if ((0, import_ag_charts_core238.isGradientFill)(markerStyle.fill)) { markerStyle.fill = { ...markerStyle.fill, gradient: "linear", rotation: 0, reverse: false }; } return { marker: markerStyle }; } getLegendData(legendType) { if (legendType !== "category") { return []; } const { id: seriesId, visible } = this; const { radiusKey, radiusName, legendItemName, showInLegend } = this.properties; return [ { legendType: "category", id: seriesId, itemId: radiusKey, seriesId, enabled: visible, label: { text: legendItemName ?? radiusName ?? radiusKey }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend } ]; } getDatumId(datum) { return createDatumId17(datum.angleValue); } computeLabelsBBox() { return null; } }; // packages/ag-charts-enterprise/src/series/radial-column/radialColumnSeriesBaseProperties.ts var import_ag_charts_community216 = require("ag-charts-community"); var import_ag_charts_core239 = require("ag-charts-core"); var { SeriesProperties: SeriesProperties8, makeSeriesTooltip: makeSeriesTooltip17, Label: Label12 } = import_ag_charts_community216._ModuleSupport; var RadialColumnSeriesBaseProperties = class extends SeriesProperties8 { constructor() { super(...arguments); this.angleKeyAxis = "angle"; this.radiusKeyAxis = "radius"; this.fill = "black"; this.fillOpacity = 1; this.stroke = "black"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.cornerRadius = 0; this.rotation = 0; this.label = new Label12(); this.tooltip = makeSeriesTooltip17(); } getStyle() { const { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, cornerRadius } = this; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, cornerRadius, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "angleKey", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "angleName", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "radiusKey", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "radiusName", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "angleKeyAxis", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "radiusKeyAxis", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "legendItemName", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "styler", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "rotation", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "stackGroup", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "normalizedTo", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core239.Property ], RadialColumnSeriesBaseProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/nightingale/nightingaleUtil.ts var import_ag_charts_community218 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/series/radial-column/radialColumnUtil.ts var import_ag_charts_community217 = require("ag-charts-community"); var { motion: motion7 } = import_ag_charts_community217._ModuleSupport; function createAngleMotionCalculator() { const angles = { startAngle: /* @__PURE__ */ new Map(), endAngle: /* @__PURE__ */ new Map() }; const angleKeys = ["startAngle", "endAngle"]; const calculate = (node, datum, status) => { for (const key of angleKeys) { const map = angles[key]; let from2 = (status === "removed" || status === "updated" ? node : datum)[key]; let to2 = (status === "removed" ? node : datum)[key]; if (Number.isNaN(to2)) { to2 = node.previousDatum?.[key] ?? Number.NaN; } const diff8 = from2 - to2; if (Math.abs(diff8) > Math.PI) { from2 -= Math.sign(diff8) * 2 * Math.PI; } map.set(datum, { from: from2, to: to2 }); } }; const getAngles = (datum, fromToKey) => { return { startAngle: angles.startAngle.get(datum)[fromToKey], endAngle: angles.endAngle.get(datum)[fromToKey] }; }; const from = (datum) => getAngles(datum, "from"); const to = (datum) => getAngles(datum, "to"); return { calculate, from, to }; } function fixRadialColumnAnimationStatus(node, datum, status) { if (status === "updated") { if (node.previousDatum == null || Number.isNaN(node.previousDatum.startAngle) || Number.isNaN(node.previousDatum.endAngle)) { return "added"; } if (Number.isNaN(datum.startAngle) || Number.isNaN(datum.endAngle)) { return "removed"; } } if (status === "added" && node.previousDatum != null) { return "updated"; } return status; } function prepareRadialColumnAnimationFunctions(axisZeroRadius) { const angles = createAngleMotionCalculator(); const fromFn = (node, datum, status) => { status = fixRadialColumnAnimationStatus(node, datum, status); angles.calculate(node, datum, status); const { startAngle, endAngle } = angles.from(datum); let innerRadius; let outerRadius; let columnWidth; let axisInnerRadius; let axisOuterRadius; if (status === "removed" || status === "updated") { innerRadius = node.innerRadius; outerRadius = node.outerRadius; columnWidth = node.columnWidth; axisInnerRadius = node.axisInnerRadius; axisOuterRadius = node.axisOuterRadius; } else { innerRadius = axisZeroRadius; outerRadius = axisZeroRadius; columnWidth = datum.columnWidth; axisInnerRadius = datum.axisInnerRadius; axisOuterRadius = datum.axisOuterRadius; } const phase = motion7.NODE_UPDATE_STATE_TO_PHASE_MAPPING[status]; return { innerRadius, outerRadius, columnWidth, axisInnerRadius, axisOuterRadius, startAngle, endAngle, phase }; }; const toFn = (node, datum, status) => { const { startAngle, endAngle } = angles.to(datum); let innerRadius; let outerRadius; let columnWidth; let axisInnerRadius; let axisOuterRadius; if (status === "removed") { innerRadius = node.innerRadius; outerRadius = node.innerRadius; columnWidth = node.columnWidth; axisInnerRadius = node.axisInnerRadius; axisOuterRadius = node.axisOuterRadius; } else { innerRadius = Number.isNaN(datum.innerRadius) ? axisZeroRadius : datum.innerRadius; outerRadius = Number.isNaN(datum.outerRadius) ? axisZeroRadius : datum.outerRadius; columnWidth = Number.isNaN(datum.columnWidth) ? node.columnWidth : datum.columnWidth; axisInnerRadius = datum.axisInnerRadius; axisOuterRadius = datum.axisOuterRadius; } return { innerRadius, outerRadius, columnWidth, axisInnerRadius, axisOuterRadius, startAngle, endAngle }; }; return { toFn, fromFn }; } function resetRadialColumnSelectionFn(_node, { innerRadius, outerRadius, columnWidth, axisInnerRadius, axisOuterRadius, startAngle, endAngle }) { return { innerRadius, outerRadius, columnWidth, axisInnerRadius, axisOuterRadius, startAngle, endAngle }; } // packages/ag-charts-enterprise/src/series/nightingale/nightingaleUtil.ts var { SectorBox, motion: motion8 } = import_ag_charts_community218._ModuleSupport; function getRadii(datum) { const { negative, innerRadius, outerRadius, stackInnerRadius, stackOuterRadius } = datum; return { innerRadius: negative ? stackOuterRadius : stackInnerRadius, outerRadius: negative ? stackInnerRadius : stackOuterRadius, clipInnerRadius: negative ? outerRadius : innerRadius, clipOuterRadius: negative ? innerRadius : outerRadius }; } function prepareNightingaleAnimationFunctions(axisZeroRadius) { const angles = createAngleMotionCalculator(); const fromFn = (sect, datum, status) => { status = fixRadialColumnAnimationStatus(sect, datum, status); angles.calculate(sect, datum, status); const { startAngle, endAngle } = angles.from(datum); let innerRadius; let outerRadius; let clipSector; if (status === "removed" || status === "updated") { innerRadius = sect.innerRadius; outerRadius = sect.outerRadius; clipSector = sect.clipSector; } else { innerRadius = axisZeroRadius; outerRadius = axisZeroRadius; } clipSector ?? (clipSector = new SectorBox(startAngle, endAngle, innerRadius, outerRadius)); const phase = motion8.NODE_UPDATE_STATE_TO_PHASE_MAPPING[status]; return { innerRadius, outerRadius, startAngle, endAngle, clipSector, phase }; }; const toFn = (_sect, datum, status) => { const { startAngle, endAngle } = angles.to(datum); let innerRadius; let outerRadius; let clipSector; if (status === "removed") { innerRadius = axisZeroRadius; outerRadius = axisZeroRadius; clipSector = new SectorBox(startAngle, endAngle, innerRadius, outerRadius); } else { let clipInnerRadius, clipOuterRadius; ({ innerRadius, outerRadius, clipInnerRadius, clipOuterRadius } = getRadii(datum)); if (Number.isNaN(innerRadius)) innerRadius = axisZeroRadius; if (Number.isNaN(outerRadius)) outerRadius = axisZeroRadius; if (Number.isNaN(clipInnerRadius)) clipInnerRadius = axisZeroRadius; if (Number.isNaN(clipOuterRadius)) clipOuterRadius = axisZeroRadius; clipSector = new SectorBox(startAngle, endAngle, clipInnerRadius, clipOuterRadius); } return { innerRadius, outerRadius, startAngle, endAngle, clipSector }; }; return { toFn, fromFn }; } function resetNightingaleSelectionFn(_sect, datum) { const { startAngle, endAngle } = datum; const { innerRadius, outerRadius, clipInnerRadius, clipOuterRadius } = getRadii(datum); const clipSector = new SectorBox(startAngle, endAngle, clipInnerRadius, clipOuterRadius); return { innerRadius, outerRadius, startAngle, endAngle, clipSector }; } // packages/ag-charts-enterprise/src/series/nightingale/nightingaleSeries.ts var { Sector: Sector4, SectorBox: SectorBox2 } = import_ag_charts_community219._ModuleSupport; var NightingaleSeries = class extends RadialColumnSeriesBase { // TODO: Enable once the options contract has been revisited // @TempValidate // sectorSpacing = 1; constructor(moduleCtx) { super(moduleCtx, { animationResetFns: { item: resetNightingaleSelectionFn } }); this.properties = new RadialColumnSeriesBaseProperties(); } setZIndex(zIndex) { super.setZIndex(zIndex); this.contentGroup.zIndex = [0, import_ag_charts_core240.PolarZIndexMap.FOREGROUND, zIndex]; this.highlightGroup.zIndex = [0, import_ag_charts_core240.PolarZIndexMap.HIGHLIGHT, zIndex]; this.labelGroup.zIndex = [0, import_ag_charts_core240.PolarZIndexMap.LABEL, zIndex]; return true; } getStackId() { const groupIndex = this.seriesGrouping?.groupIndex ?? this.id; return `nightingale-stack-${groupIndex}-yValues`; } nodeFactory() { return new Sector4(); } updateItemPath(node, datum, highlight) { const { negative } = datum; node.centerX = 0; node.centerY = 0; node.startOuterCornerRadius = negative ? 0 : this.properties.cornerRadius; node.endOuterCornerRadius = negative ? 0 : this.properties.cornerRadius; node.startInnerCornerRadius = negative ? this.properties.cornerRadius : 0; node.endInnerCornerRadius = negative ? this.properties.cornerRadius : 0; if (highlight) { const { startAngle, endAngle } = datum; const { innerRadius, outerRadius, clipInnerRadius, clipOuterRadius } = getRadii(datum); node.innerRadius = innerRadius; node.outerRadius = outerRadius; node.startAngle = startAngle; node.endAngle = endAngle; node.clipSector = new SectorBox2(startAngle, endAngle, clipInnerRadius, clipOuterRadius); } } getColumnTransitionFunctions() { const axisZeroRadius = this.isRadiusAxisReversed() ? this.radius : this.getAxisInnerRadius(); return prepareNightingaleAnimationFunctions(axisZeroRadius); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.styler != null || this.properties.label.itemStyler != null; } }; NightingaleSeries.className = "NightingaleSeries"; NightingaleSeries.type = "nightingale"; // packages/ag-charts-enterprise/src/series/nightingale/nightingaleSeriesOptionsDef.ts var import_ag_charts_community220 = require("ag-charts-community"); var import_ag_charts_core241 = require("ag-charts-core"); var { nightingaleSeriesThemeableOptionsDef } = import_ag_charts_community220._ModuleSupport; var nightingaleSeriesOptionsDef = { ...import_ag_charts_core241.commonSeriesOptionsDefs, ...nightingaleSeriesThemeableOptionsDef, type: (0, import_ag_charts_core241.required)((0, import_ag_charts_core241.constant)("nightingale")), angleKey: (0, import_ag_charts_core241.required)(import_ag_charts_core241.string), radiusKey: (0, import_ag_charts_core241.required)(import_ag_charts_core241.string), angleName: import_ag_charts_core241.string, radiusName: import_ag_charts_core241.string, legendItemName: import_ag_charts_core241.string, grouped: import_ag_charts_core241.boolean, stacked: import_ag_charts_core241.boolean, stackGroup: import_ag_charts_core241.string, normalizedTo: import_ag_charts_core241.number }; nightingaleSeriesOptionsDef.angleKeyAxis = (0, import_ag_charts_core241.undocumented)(import_ag_charts_core241.string); nightingaleSeriesOptionsDef.radiusKeyAxis = (0, import_ag_charts_core241.undocumented)(import_ag_charts_core241.string); // packages/ag-charts-enterprise/src/series/nightingale/nightingaleThemes.ts var import_ag_charts_core242 = require("ag-charts-core"); var NIGHTINGALE_SERIES_THEME = { series: { fill: { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, ["gradient", import_ag_charts_core242.FILL_GRADIENT_RADIAL_SERIES_DEFAULTS], ["image", import_ag_charts_core242.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core242.FILL_PATTERN_DEFAULTS] ] }, stroke: { $if: [{ $eq: [{ $palette: "type" }, "inbuilt"] }, { $ref: "chartBackgroundColor" }, { $palette: "stroke" }] }, strokeWidth: 1, label: { ...import_ag_charts_core242.LABEL_BOXING_DEFAULTS, enabled: false, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" } }, highlight: { ...import_ag_charts_core242.MULTI_SERIES_HIGHLIGHT_STYLE, bringToFront: false } }, axes: { [import_ag_charts_core242.POLAR_AXIS_TYPE.ANGLE_CATEGORY]: { shape: { $findFirstSiblingNotOperation: import_ag_charts_core242.POLAR_AXIS_SHAPE.CIRCLE }, groupPaddingInner: 0, paddingInner: 0, label: { spacing: 10 } }, [import_ag_charts_core242.POLAR_AXIS_TYPE.RADIUS_NUMBER]: { shape: { $findFirstSiblingNotOperation: import_ag_charts_core242.POLAR_AXIS_SHAPE.CIRCLE } } } }; // packages/ag-charts-enterprise/src/series/nightingale/nightingaleModule.ts var NightingaleSeriesModule = { type: "series", name: "nightingale", chartType: "polar", enterprise: true, stackable: true, groupable: true, stackedByDefault: true, version: import_ag_charts_community221.VERSION, dependencies: [import_ag_charts_community221.PolarChartModule], options: nightingaleSeriesOptionsDef, defaultAxes: { angle: { type: import_ag_charts_core243.POLAR_AXIS_TYPE.ANGLE_CATEGORY }, radius: { type: import_ag_charts_core243.POLAR_AXIS_TYPE.RADIUS_NUMBER } }, axisKeys: { [import_ag_charts_core243.ChartAxisDirection.X]: "xKeyAxis", [import_ag_charts_core243.ChartAxisDirection.Y]: "yKeyAxis" }, themeTemplate: NIGHTINGALE_SERIES_THEME, create: (ctx) => new NightingaleSeries(ctx) }; // packages/ag-charts-enterprise/src/series/pyramid/pyramidModule.ts var import_ag_charts_community225 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/series/pyramid/pyramidSeries.ts var import_ag_charts_community223 = require("ag-charts-community"); var import_ag_charts_core245 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/pyramid/pyramidProperties.ts var import_ag_charts_community222 = require("ag-charts-community"); var import_ag_charts_core244 = require("ag-charts-core"); var { SeriesProperties: SeriesProperties9, makeSeriesTooltip: makeSeriesTooltip18, Label: Label13, DropShadow: DropShadow5 } = import_ag_charts_community222._ModuleSupport; var PyramidSeriesLabel = class extends Label13 { }; var PyramidSeriesStageLabel = class extends Label13 { constructor() { super(...arguments); this.spacing = 0; } }; __decorateClass([ import_ag_charts_core244.Property ], PyramidSeriesStageLabel.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidSeriesStageLabel.prototype, "placement", 2); var PyramidProperties = class extends SeriesProperties9 { constructor() { super(...arguments); this.fills = []; this.fillOpacity = 1; this.strokes = []; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.direction = "vertical"; this.reverse = void 0; this.spacing = 0; this.aspectRatio = void 0; this.shadow = new DropShadow5().set({ enabled: false }); this.label = new PyramidSeriesLabel(); this.stageLabel = new PyramidSeriesStageLabel(); this.tooltip = makeSeriesTooltip18(); } getStyle(index = 0) { const { fills, strokes, fillOpacity, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; return { fill: fills[index % fills.length], fillOpacity, stroke: strokes[index % strokes.length], strokeWidth, strokeOpacity, lineDash, lineDashOffset, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "stageKey", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "valueKey", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "fills", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "strokes", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "direction", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "reverse", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "aspectRatio", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "shadow", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "stageLabel", 2); __decorateClass([ import_ag_charts_core244.Property ], PyramidProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/pyramid/pyramidUtil.ts function applyPyramidDatum(connector, { x, y, top, right, bottom, left }) { connector.x0 = x - top / 2; connector.x1 = x + top / 2; connector.x2 = x + bottom / 2; connector.x3 = x - bottom / 2; connector.y0 = y - left / 2; connector.y1 = y - right / 2; connector.y2 = y + right / 2; connector.y3 = y + left / 2; } function preparePyramidAnimationFunctions(direction) { const fromFn = (_connector, datum) => { const { x, y } = datum; let { top, right, bottom, left } = datum; if (direction === "vertical") { top = 0; bottom = 0; } else { left = 0; right = 0; } return { x, y, top, right, bottom, left }; }; const toFn = (_connector, datum) => { const { x, y, top, right, bottom, left } = datum; return { x, y, top, right, bottom, left }; }; const applyFn = applyPyramidDatum; return { fromFn, toFn, applyFn }; } // packages/ag-charts-enterprise/src/series/pyramid/pyramidSeries.ts var { valueProperty: valueProperty15, SeriesNodePickMode: SeriesNodePickMode13, createDatumId: createDatumId18, BBox: BBox23, Group: Group17, Selection: Selection13, Text: Text7, PointerEvents: PointerEvents9, fromToMotion: fromToMotion4, seriesLabelFadeInAnimation: seriesLabelFadeInAnimation6, getLabelStyles: getLabelStyles5 } = import_ag_charts_community223._ModuleSupport; var PyramidSeries = class extends import_ag_charts_community223._ModuleSupport.DataModelSeries { constructor(moduleCtx) { super({ moduleCtx, categoryKey: void 0, pickModes: [SeriesNodePickMode13.EXACT_SHAPE_MATCH, SeriesNodePickMode13.NEAREST_NODE] }); this.properties = new PyramidProperties(); this.itemGroup = this.contentGroup.appendChild(new Group17({ name: "itemGroup" })); this.itemLabelGroup = this.contentGroup.appendChild(new Group17({ name: "itemLabelGroup" })); this.stageLabelGroup = this.contentGroup.appendChild(new Group17({ name: "stageLabelGroup" })); this.datumSelection = Selection13.select( this.itemGroup, () => this.nodeFactory() ); this.labelSelection = Selection13.select( this.itemLabelGroup, Text7 ); this.stageLabelSelection = Selection13.select(this.stageLabelGroup, Text7); this.highlightLabelSelection = Selection13.select(this.highlightLabelGroup, Text7); this.highlightDatumSelection = Selection13.select( this.highlightNodeGroup, () => this.nodeFactory() ); this.animationState = new import_ag_charts_core245.StateMachine( "empty", { empty: { update: { target: "ready", action: () => this.animateEmptyUpdateReady() }, reset: "empty", skip: "ready" }, ready: { clear: "empty", reset: "empty", skip: "ready" } }, () => this.checkProcessedDataAnimatable() ); this.itemLabelGroup.pointerEvents = PointerEvents9.None; this.stageLabelGroup.pointerEvents = PointerEvents9.None; this.cleanup.register(this.ctx.eventsHub.on("legend:item-click", (event) => this.onLegendItemClick(event))); } nodeFactory() { return new FunnelConnector(); } getNodeData() { return this.contextNodeData?.nodeData; } resetAnimation(phase) { if (phase === "initial") { this.animationState.transition("reset"); } else if (phase === "ready") { this.animationState.transition("skip"); } } async processData(dataController) { if (this.data == null) return; const { id: seriesId, visible, ctx: { legendManager } } = this; const { stageKey, valueKey } = this.properties; const xScaleType = "category"; const yScaleType = "number"; const validation = (_value, _datum, index) => visible && legendManager.getItemEnabled({ seriesId, itemId: index }); const visibleProps = this.visible ? {} : { forceValue: 0 }; const allowNullKey = this.properties.allowNullKeys ?? false; await this.requestDataModel(dataController, this.data, { props: [ valueProperty15(stageKey, xScaleType, { id: "xValue", allowNullKey }), valueProperty15(valueKey, yScaleType, { id: `yValue`, ...visibleProps, validation, invalidValue: 0 }) ] }); } createNodeData() { const { id: seriesId, dataModel, processedData, properties, visible, ctx: { legendManager } } = this; const { stageKey, valueKey, direction, reverse = direction === "horizontal", spacing, aspectRatio, label, stageLabel } = properties; if (dataModel == null || processedData == null) return; const horizontal = direction === "horizontal"; const xValues = dataModel.resolveColumnById(this, `xValue`, processedData); const yValues = dataModel.resolveColumnById(this, `yValue`, processedData); const xDomain = dataModel.getDomain(this, "xValue", "value", processedData).domain; const yDomain = dataModel.getDomain(this, "yValue", "value", processedData).domain; const textMeasurer = (0, import_ag_charts_core245.cachedTextMeasurer)(stageLabel); let textAlign; let textBaseline; if (horizontal) { textAlign = "center"; textBaseline = stageLabel.placement === "before" ? "bottom" : "top"; } else { textAlign = stageLabel.placement === "after" ? "left" : "right"; textBaseline = "middle"; } const stageLabelData = stageLabel.enabled ? [] : void 0; let maxLabelWidth = 0; let maxLabelHeight = 0; let yTotal = 0; const rawData = processedData.dataSources.get(this.id)?.data ?? []; for (const [datumIndex, datum] of rawData.entries()) { const xValue = xValues[datumIndex]; if (xValue === void 0 && !this.properties.allowNullKeys) continue; const yValue = yValues[datumIndex]; const enabled = visible && legendManager.getItemEnabled({ seriesId, itemId: datumIndex }); yTotal += yValue; if (stageLabelData == null) continue; const text2 = this.getLabelText( xValue, datum, stageKey, "x", xDomain, this.properties.stageLabel, { datum, value: yValue, stageKey, valueKey }, this.properties.allowNullKeys ?? false ); const { width, height } = (0, import_ag_charts_core245.isArray)(text2) ? (0, import_ag_charts_core245.measureTextSegments)(text2, label) : textMeasurer.measureLines((0, import_ag_charts_core245.toTextString)(text2)); maxLabelWidth = Math.max(maxLabelWidth, width); maxLabelHeight = Math.max(maxLabelHeight, height); stageLabelData.push({ x: Number.NaN, y: Number.NaN, text: text2, textAlign, textBaseline, visible: enabled }); } const seriesRectWidth = this._nodeDataDependencies?.seriesRectWidth ?? 0; const seriesRectHeight = this._nodeDataDependencies?.seriesRectHeight ?? 0; const totalSpacing = spacing * (processedData.input.count - 1); let bounds; if (horizontal) { const verticalInset = maxLabelHeight + stageLabel.spacing; bounds = new BBox23( 0, stageLabel.placement === "before" ? verticalInset : 0, seriesRectWidth, seriesRectHeight - verticalInset ); } else { const horizontalInset = maxLabelWidth + stageLabel.spacing; bounds = new BBox23( stageLabel.placement === "after" ? 0 : horizontalInset, 0, seriesRectWidth - horizontalInset, seriesRectHeight ); } if (aspectRatio != null && aspectRatio !== 0) { const directionalAspectRatio = direction === "horizontal" ? 1 / aspectRatio : aspectRatio; const constrainedWidth = Math.min(bounds.width, bounds.height * directionalAspectRatio); const constrainedHeight = constrainedWidth / directionalAspectRatio; bounds = new BBox23( bounds.x + (bounds.width - constrainedWidth) / 2, bounds.y + (bounds.height - constrainedHeight) / 2, constrainedWidth, constrainedHeight ); } let labelX; let labelY; if (horizontal) { labelY = stageLabel.placement === "before" ? bounds.y - stageLabel.spacing : bounds.y + bounds.height + stageLabel.spacing; } else { labelX = stageLabel.placement === "after" ? bounds.x + bounds.width + stageLabel.spacing : bounds.x - stageLabel.spacing; } const availableWidth = bounds.width - (horizontal ? totalSpacing : 0); const availableHeight = bounds.height - (horizontal ? 0 : totalSpacing); if (availableWidth < 0 || availableHeight < 0) return; const nodeData = []; const labelData = []; let yStart = 0; let stageLabelIndex = 0; for (const [datumIndex, datum] of rawData.entries()) { const xValue = xValues[datumIndex]; if (xValue === void 0 && !this.properties.allowNullKeys) continue; const yValue = yValues[datumIndex]; const enabled = visible && legendManager.getItemEnabled({ seriesId, itemId: datumIndex }); const yEnd = yStart + yValue; const yMidRatio = (yStart + yEnd) / (2 * yTotal); const yRangeRatio = (yEnd - yStart) / yTotal; const xOffset = horizontal ? availableWidth * yMidRatio + spacing * datumIndex : availableWidth * 0.5; const yOffset = horizontal ? availableHeight * 0.5 : availableHeight * yMidRatio + spacing * datumIndex; const x = bounds.x + xOffset; const y = bounds.y + yOffset; if (stageLabelData != null) { const stageLabelDatum = stageLabelData[stageLabelIndex++]; stageLabelDatum.x = labelX ?? x; stageLabelDatum.y = labelY ?? y; } let top; let right; let bottom; let left; if (horizontal) { const barWidth = availableWidth * yRangeRatio; top = barWidth; bottom = barWidth; const y0 = (xOffset + barWidth / 2) * (availableHeight / bounds.width); const y1 = (xOffset - barWidth / 2) * (availableHeight / bounds.width); right = reverse ? bounds.height - y0 : y0; left = reverse ? bounds.height - y1 : y1; } else { const barHeight = availableHeight * yRangeRatio; right = barHeight; left = barHeight; const x0 = (yOffset - barHeight / 2) * (availableWidth / bounds.height); const x1 = (yOffset + barHeight / 2) * (availableWidth / bounds.height); top = reverse ? bounds.width - x0 : x0; bottom = reverse ? bounds.width - x1 : x1; } const text2 = this.getLabelText( yValue, datum, valueKey, "y", yDomain, label, { datum, value: yValue, stageKey, valueKey } ); const labelDatum = { x, y, text: text2, textAlign: "center", textBaseline: "middle", visible: enabled }; labelData.push(labelDatum); nodeData.push({ series: this, datum, datumIndex, index: datumIndex, xValue, yValue, x, y, top, right, bottom, left, label: labelDatum, enabled, midPoint: { x, y }, style: this.getItemStyle({ datumIndex, datum }, false) }); yStart = yEnd; } return { itemId: seriesId, nodeData, labelData, stageLabelData, bounds }; } updateSelections() { if (this.nodeDataRefresh) { this.contextNodeData = this.createNodeData(); this.nodeDataRefresh = false; } } update({ seriesRect }) { this.checkResize(seriesRect); const { datumSelection, labelSelection, stageLabelSelection, highlightDatumSelection, highlightLabelSelection } = this; this.updateSelections(); this.contentGroup.visible = this.visible; this.contentGroup.opacity = this.getOpacity(); let highlightedDatum = this.ctx.highlightManager?.getActiveHighlight(); if (highlightedDatum != null && (highlightedDatum.series !== this || highlightedDatum.datum == null)) { highlightedDatum = void 0; } const nodeData = this.contextNodeData?.nodeData ?? []; const labelData = this.contextNodeData?.labelData ?? []; const stageLabelData = this.contextNodeData?.stageLabelData ?? []; this.datumSelection = this.updateDatumSelection({ nodeData, datumSelection }); this.updateDatumStyles({ datumSelection, isHighlight: false }); this.updateDatumNodes({ datumSelection, isHighlight: false }); this.labelSelection = this.updateLabelSelection({ labelData, labelSelection }); this.updateLabelNodes({ labelSelection, labelProperties: this.properties.label }); this.stageLabelSelection = this.updateStageLabelSelection({ stageLabelData, stageLabelSelection }); this.updateLabelNodes({ labelSelection: stageLabelSelection, labelProperties: this.properties.stageLabel, checkActiveHighlight: true }); const highlightLabelData = this.getHighlightLabelData(labelData, highlightedDatum) ?? []; this.highlightLabelSelection = highlightLabelSelection.update(highlightLabelData); this.updateLabelNodes({ labelSelection: this.highlightLabelSelection, labelProperties: this.properties.label, isHighlight: true }); this.highlightDatumSelection = this.updateDatumSelection({ nodeData: highlightedDatum == null ? [] : [highlightedDatum], datumSelection: highlightDatumSelection }); this.updateDatumStyles({ datumSelection: highlightDatumSelection, isHighlight: true }); this.updateDatumNodes({ datumSelection: highlightDatumSelection, isHighlight: true }); this.animationState.transition("update"); } updateDatumSelection(opts) { return opts.datumSelection.update(opts.nodeData); } getItemStyle({ datumIndex, datum }, isHighlight) { const { properties } = this; const { itemStyler } = properties; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); const baseStyle = (0, import_ag_charts_core245.mergeDefaults)(highlightStyle, properties.getStyle(datumIndex)); let style = baseStyle; if (itemStyler != null && datumIndex != null) { const overrides = this.cachedDatumCallback( createDatumId18(datumIndex, isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(datum, datumIndex, isHighlight, style); return this.callWithContext(itemStyler, params); } ); if (overrides) { style = (0, import_ag_charts_core245.mergeDefaults)(overrides, style); } } return style; } makeItemStylerParams(datum, datumIndex, isHighlight, style) { const { id: seriesId, properties } = this; const { stageKey, valueKey } = properties; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum, stageKey, valueKey, highlightState, ...style, fill }; } updateDatumStyles({ datumSelection, isHighlight }) { datumSelection.each((_, nodeDatum) => { nodeDatum.style = this.getItemStyle(nodeDatum, isHighlight); }); } updateDatumNodes({ datumSelection }) { const { properties } = this; const { shadow } = properties; const bounds = this.contextNodeData?.bounds; const fillBBox = bounds ? { series: bounds, axis: bounds } : void 0; datumSelection.each((connector, nodeDatum) => { connector.setStyleProperties(nodeDatum.style, fillBBox); applyPyramidDatum(connector, nodeDatum); connector.fillShadow = shadow; }); } updateLabelSelection(opts) { return opts.labelSelection.update(this.properties.label.enabled ? opts.labelData : []); } updateStageLabelSelection(opts) { return opts.stageLabelSelection.update(opts.stageLabelData); } updateLabelNodes(opts) { const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const { labelSelection, labelProperties, isHighlight = false, checkActiveHighlight = false } = opts; labelSelection.each((label, nodeDatum, datumIndex) => { const { visible, x, y, text: text2, textAlign, textBaseline } = nodeDatum; const datumIsHighlighted = isHighlight || checkActiveHighlight && activeHighlight?.datumIndex === datumIndex; const highlightStyle = this.getHighlightStyle(datumIsHighlighted, datumIndex); const style = getLabelStyles5( this, void 0, this.properties, labelProperties, datumIsHighlighted, activeHighlight ); const { color: fill, fontSize, fontStyle, fontWeight, fontFamily } = style; label.visible = visible; label.x = x; label.y = y; label.text = text2; label.fill = fill; label.opacity = (highlightStyle.opacity ?? 1) * (style.fillOpacity ?? 1); label.fillOpacity = (highlightStyle.opacity ?? 1) * (style.fillOpacity ?? 1); label.fontStyle = fontStyle; label.fontWeight = fontWeight; label.fontSize = fontSize; label.fontFamily = fontFamily; label.textAlign = textAlign; label.textBaseline = textBaseline; label.setBoxing(style); }); } getHighlightLabelData(_labelData, highlightedItem) { if (highlightedItem?.label) { return [{ ...highlightedItem.label }]; } return void 0; } computeFocusBounds(opts) { const datum = this.getNodeData()?.[opts.datumIndex]; if (datum === void 0) return; for (const node of this.datumSelection) { if (node.datum === datum) { return node.node; } } } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, properties } = this; const { stageKey, valueKey, tooltip } = properties; if (!dataModel || !processedData) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const xValue = dataModel.resolveColumnById(this, "xValue", processedData)[datumIndex]; const yValue = dataModel.resolveColumnById(this, `yValue`, processedData)[datumIndex]; const allowNullKeys = this.properties.allowNullKeys ?? false; if (xValue === void 0 && !allowNullKeys) return; const label = this.getLabelText( xValue, datum, stageKey, "x", dataModel.getDomain(this, "xValue", "value", processedData).domain, this.properties.stageLabel, { datum, value: xValue, stageKey, valueKey } ); const format = this.getItemStyle({ datumIndex, datum }, false); return this.formatTooltipWithContext( tooltip, { symbol: this.legendItemSymbol(datumIndex), data: [{ label: (0, import_ag_charts_core245.toPlainText)(label), value: (0, import_ag_charts_core245.toPlainText)(yValue) }] }, { seriesId, datum, title: void 0, stageKey, valueKey, ...format } ); } getSeriesDomain() { return { domain: [Number.NaN, Number.NaN] }; } getSeriesRange() { return [Number.NaN, Number.NaN]; } pickNodeClosestDatum({ x, y }) { let minDistanceSquared = Infinity; let minDatum; this.datumSelection.each((node, datum) => { const distanceSquared = node.distanceSquared(x, y); if (distanceSquared < minDistanceSquared) { minDistanceSquared = distanceSquared; minDatum = datum; } }); return minDatum == null ? void 0 : { datum: minDatum, distance: Math.sqrt(minDistanceSquared) }; } legendItemSymbol(datumIndex) { const { fills, strokes, strokeWidth, fillOpacity, strokeOpacity, lineDash, lineDashOffset } = this.properties; const fill = fills[datumIndex] ?? "black"; const stroke3 = strokes[datumIndex] ?? "black"; return { marker: { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } }; } getLegendData(legendType) { const { processedData, dataModel, id: seriesId, ctx: { legendManager }, visible } = this; if (!dataModel || !processedData || legendType !== "category") { return []; } const { showInLegend } = this.properties; const stageValues = dataModel.resolveColumnById(this, `xValue`, processedData); return (processedData.dataSources.get(this.id)?.data ?? []).map((datum, datumIndex) => { const stageValue = stageValues[datumIndex]; const allowNullKeys = this.properties.allowNullKeys ?? false; if (stageValue == null && !allowNullKeys) return; return { legendType: "category", id: seriesId, datum, itemId: datumIndex, seriesId, enabled: visible && legendManager.getItemEnabled({ seriesId, itemId: datumIndex }), label: { text: String(stageValue) }, symbol: this.legendItemSymbol(datumIndex), hideInLegend: !showInLegend }; }).filter((datum) => datum != null); } animateReset() { this.ctx.animationManager.skipCurrentBatch(); this.ctx.animationManager.stopByAnimationGroupId(this.id); } animateEmptyUpdateReady() { const { datumSelection, labelSelection, properties } = this; const fns = preparePyramidAnimationFunctions(properties.direction); fromToMotion4(this.id, "nodes", this.ctx.animationManager, [datumSelection], fns); seriesLabelFadeInAnimation6(this, "labels", this.ctx.animationManager, labelSelection); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.label.itemStyler != null; } }; PyramidSeries.className = "PyramidSeries"; PyramidSeries.type = "pyramid"; // packages/ag-charts-enterprise/src/series/pyramid/pyramidSeriesOptionsDef.ts var import_ag_charts_community224 = require("ag-charts-community"); var import_ag_charts_core246 = require("ag-charts-core"); var { pyramidSeriesThemeableOptionsDef } = import_ag_charts_community224._ModuleSupport; var pyramidSeriesOptionsDef = { ...pyramidSeriesThemeableOptionsDef, ...import_ag_charts_core246.commonSeriesOptionsDefs, type: (0, import_ag_charts_core246.required)((0, import_ag_charts_core246.constant)("pyramid")), stageKey: (0, import_ag_charts_core246.required)(import_ag_charts_core246.string), valueKey: (0, import_ag_charts_core246.required)(import_ag_charts_core246.string) }; // packages/ag-charts-enterprise/src/series/pyramid/pyramidThemes.ts var import_ag_charts_core247 = require("ag-charts-core"); var PYRAMID_SERIES_THEME = { series: { direction: "vertical", strokeWidth: { $isUserOption: ["./strokes/0", 2, 0] }, spacing: 2, fills: { $applyCycle: [ { $size: { $path: ["./data", { $path: "/data" }] } }, { $palette: "fills" }, { $applySwitch: [ { $path: ["/type", void 0, { $value: "$1" }] }, { $value: "$1" }, ["gradient", import_ag_charts_core247.FILL_GRADIENT_LINEAR_DEFAULTS], ["pattern", import_ag_charts_core247.FILL_PATTERN_DEFAULTS], ["image", import_ag_charts_core247.FILL_IMAGE_DEFAULTS] ] } ] }, strokes: { $applyCycle: [{ $size: { $path: ["./data", { $path: "/data" }] } }, { $palette: "strokes" }] }, label: { ...import_ag_charts_core247.LABEL_BOXING_DEFAULTS, enabled: true, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "chartBackgroundColor" } }, stageLabel: { ...import_ag_charts_core247.LABEL_BOXING_DEFAULTS, enabled: true, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" }, spacing: 12 }, shadow: { enabled: false, color: import_ag_charts_core247.DEFAULT_SHADOW_COLOUR, xOffset: 3, yOffset: 3, blur: 5 }, highlight: { unhighlightedItem: { opacity: 0.4 } } } }; // packages/ag-charts-enterprise/src/series/pyramid/pyramidModule.ts var PyramidSeriesModule = { type: "series", name: "pyramid", chartType: "standalone", enterprise: true, solo: true, version: import_ag_charts_community225.VERSION, dependencies: [StandaloneChartModule], options: pyramidSeriesOptionsDef, themeTemplate: PYRAMID_SERIES_THEME, create: (ctx) => new PyramidSeries(ctx) }; // packages/ag-charts-enterprise/src/series/radar-area/radarAreaModule.ts var import_ag_charts_community231 = require("ag-charts-community"); var import_ag_charts_core254 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radar/radarThemes.ts var import_ag_charts_core248 = require("ag-charts-core"); var BASE_RADAR_SERIES_THEME = { series: { stroke: { $palette: "stroke" }, label: { ...import_ag_charts_core248.LABEL_BOXING_DEFAULTS, enabled: false, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" } }, marker: { enabled: true, fill: { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, ["gradient", import_ag_charts_core248.FILL_GRADIENT_RADIAL_REVERSED_DEFAULTS], ["image", import_ag_charts_core248.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core248.FILL_PATTERN_DEFAULTS] ] }, stroke: { $palette: "stroke" }, fillOpacity: 1, shape: "circle", size: 6, strokeOpacity: 1, strokeWidth: { $isUserOption: ["./stroke", 1, 0] } }, highlight: import_ag_charts_core248.MARKER_SERIES_HIGHLIGHT_STYLE, tooltip: { range: { $path: ["/tooltip/range", "nearest"] } } }, axes: { [import_ag_charts_core248.POLAR_AXIS_TYPE.ANGLE_CATEGORY]: { label: { spacing: 10 } } } }; var RADAR_LINE_SERIES_THEME = (0, import_ag_charts_core248.mergeDefaults)( { series: { stroke: import_ag_charts_core248.SAFE_STROKE_FILL_OPERATION, strokeWidth: 2 } }, BASE_RADAR_SERIES_THEME ); var RADAR_AREA_SERIES_THEME = (0, import_ag_charts_core248.mergeDefaults)( { series: { fill: { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, ["gradient", import_ag_charts_core248.FILL_GRADIENT_LINEAR_DEFAULTS], ["image", import_ag_charts_core248.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core248.FILL_PATTERN_DEFAULTS] ] }, fillOpacity: 0.8, strokeWidth: 2, marker: { enabled: false } } }, BASE_RADAR_SERIES_THEME ); // packages/ag-charts-enterprise/src/series/radar-area/radarAreaSeries.ts var import_ag_charts_community229 = require("ag-charts-community"); var import_ag_charts_core252 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radar/radarSeries.ts var import_ag_charts_community227 = require("ag-charts-community"); var import_ag_charts_core250 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radar/radarSeriesProperties.ts var import_ag_charts_community226 = require("ag-charts-community"); var import_ag_charts_core249 = require("ag-charts-core"); var { Label: Label14, SeriesMarker: SeriesMarker2, SeriesProperties: SeriesProperties10, makeSeriesTooltip: makeSeriesTooltip19 } = import_ag_charts_community226._ModuleSupport; var RadarSeriesProperties = class extends SeriesProperties10 { constructor() { super(...arguments); this.angleKeyAxis = "angle"; this.radiusKeyAxis = "radius"; this.stroke = "black"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.rotation = 0; this.marker = new SeriesMarker2(); this.label = new Label14(); this.tooltip = makeSeriesTooltip19(); this.connectMissingData = false; } }; __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "angleKey", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "radiusKey", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "angleName", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "radiusName", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "angleKeyAxis", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "radiusKeyAxis", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "legendItemName", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "rotation", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "styler", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "marker", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "tooltip", 2); __decorateClass([ import_ag_charts_core249.Property ], RadarSeriesProperties.prototype, "connectMissingData", 2); // packages/ag-charts-enterprise/src/series/radar/radarSeries.ts var { DEFAULT_POLAR_DIRECTION_KEYS: DEFAULT_POLAR_DIRECTION_KEYS2, DEFAULT_POLAR_DIRECTION_NAMES: DEFAULT_POLAR_DIRECTION_NAMES2, PolarAxis: PolarAxis2, SeriesNodePickMode: SeriesNodePickMode14, keyProperty: keyProperty10, valueProperty: valueProperty16, fixNumericExtent: fixNumericExtent9, seriesLabelFadeInAnimation: seriesLabelFadeInAnimation7, markerFadeInAnimation: markerFadeInAnimation2, resetMarkerFn: resetMarkerFn2, resetLabelFn: resetLabelFn6, animationValidation: animationValidation8, computeMarkerFocusBounds: computeMarkerFocusBounds3, BBox: BBox24, Group: Group18, Path: Path12, Selection: Selection14, Text: Text8, Marker: Marker5, updateLabelNode: updateLabelNode7, getMarkerStyles: getMarkerStyles2 } = import_ag_charts_community227._ModuleSupport; var RadarSeriesNodeEvent = class extends import_ag_charts_community227._ModuleSupport.SeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); this.angleKey = series.properties.angleKey; this.radiusKey = series.properties.radiusKey; } }; var RadarSeries = class extends import_ag_charts_community227._ModuleSupport.PolarSeries { constructor(moduleCtx) { super({ moduleCtx, categoryKey: "angleValue", propertyKeys: DEFAULT_POLAR_DIRECTION_KEYS2, propertyNames: DEFAULT_POLAR_DIRECTION_NAMES2, pickModes: [SeriesNodePickMode14.NEAREST_NODE, SeriesNodePickMode14.EXACT_SHAPE_MATCH], canHaveAxes: true, animationResetFns: { item: resetMarkerFn2, label: resetLabelFn6 }, clipFocusBox: false }); this.NodeEvent = RadarSeriesNodeEvent; this.lineGroup = this.contentGroup.appendChild(new Group18({ name: "radar-line" })); this.lineSelection = Selection14.select( this.lineGroup, Path12 ); this.resetInvalidToZero = false; this.circleCache = { r: 0, cx: 0, cy: 0 }; this.lineGroup.zIndex = 0; this.itemGroup.zIndex = 1; } renderToOffscreenCanvas() { const hasMarkers = (this.nodeData?.length ?? 0) > 0; return hasMarkers && this.getDrawingMode(false) === "cutout" || super.renderToOffscreenCanvas(); } nodeFactory() { return new Marker5(); } getSeriesDomain(direction) { const { dataModel, processedData } = this; if (!processedData || !dataModel) return { domain: [] }; if (direction === import_ag_charts_core250.ChartAxisDirection.Angle) { const domain = dataModel.getDomain(this, `angleValue`, "key", processedData).domain; const sortMetadata = dataModel.getKeySortMetadata(this, "angleValue", processedData); return { domain, sortMetadata }; } else { const domain = dataModel.getDomain(this, `radiusValue`, "value", processedData).domain; const ext = (0, import_ag_charts_core250.extent)(domain.length === 0 ? domain : [0].concat(domain)); return { domain: fixNumericExtent9(ext) }; } } async processData(dataController) { const { angleKey, radiusKey } = this.properties; const extraProps = []; if (!this.ctx.animationManager.isSkipped()) { extraProps.push(animationValidation8()); } const radiusScaleType = this.axes[import_ag_charts_core250.ChartAxisDirection.Radius]?.scale.type; const angleScaleType = this.axes[import_ag_charts_core250.ChartAxisDirection.Angle]?.scale.type; const allowNullKey = this.properties.allowNullKeys ?? false; await this.requestDataModel(dataController, this.data, { props: [ keyProperty10(angleKey, angleScaleType, { id: "angleValue", allowNullKey }), valueProperty16(radiusKey, radiusScaleType, { id: "radiusValue", invalidValue: void 0 }), ...extraProps ] }); this.animationState.transition("updateData"); } didCircleChange() { const r = this.radius; const cx = this.centerX; const cy = this.centerY; const cache = this.circleCache; if (!(r === cache.r && cx === cache.cx && cy === cache.cy)) { this.circleCache = { r, cx, cy }; return true; } return false; } getAxisInnerRadius() { const radiusAxis = this.axes[import_ag_charts_core250.ChartAxisDirection.Radius]; return radiusAxis instanceof PolarAxis2 ? this.radius * radiusAxis.innerRadiusRatio : 0; } maybeRefreshNodeData() { const didCircleChange = this.didCircleChange(); if (!didCircleChange && !this.nodeDataRefresh) return; this.contextNodeData = this.createNodeData(); this.nodeData = this.contextNodeData?.nodeData ?? []; this.nodeDataRefresh = false; } createNodeData() { const { processedData, dataModel } = this; if (!processedData || !dataModel) return; const { angleKey, radiusKey, angleName, radiusName, legendItemName, marker, label } = this.properties; const angleScale = this.axes[import_ag_charts_core250.ChartAxisDirection.Angle]?.scale; const radiusScale = this.axes[import_ag_charts_core250.ChartAxisDirection.Radius]?.scale; if (!angleScale || !radiusScale) { return; } const angleValues = dataModel.resolveKeysById(this, `angleValue`, processedData); const radiusValues = dataModel.resolveColumnById(this, `radiusValue`, processedData); const axisInnerRadius = this.getAxisInnerRadius(); const radiusDomain = this.getSeriesDomain(import_ag_charts_core250.ChartAxisDirection.Radius).domain; const rawData = processedData.dataSources.get(this.id)?.data ?? []; const allowNullKeys = this.properties.allowNullKeys ?? false; const nodeData = []; for (let datumIndex = 0; datumIndex < rawData.length; datumIndex++) { const datum = rawData[datumIndex]; const angleDatum = angleValues[datumIndex]; if (angleDatum === void 0 && !allowNullKeys) { continue; } const radiusDatum = radiusValues[datumIndex]; const angle = angleScale.convert(angleDatum); const radius = this.radius + axisInnerRadius - radiusScale.convert(radiusDatum); const cos = Math.cos(angle); const sin = Math.sin(angle); const x = cos * radius; const y = sin * radius; let labelNodeDatum; if (label.enabled) { const labelText = this.getLabelText( radiusDatum, datum, radiusKey, "radius", radiusDomain, label, { value: radiusDatum, datum, angleKey, radiusKey, angleName, radiusName, legendItemName } ); if (labelText) { let textAlign = "right"; if ((0, import_ag_charts_core250.isNumberEqual)(cos, 0)) { textAlign = "center"; } else if (cos > 0) { textAlign = "left"; } let textBaseline = "bottom"; if ((0, import_ag_charts_core250.isNumberEqual)(sin, 0)) { textBaseline = "middle"; } else if (sin > 0) { textBaseline = "top"; } labelNodeDatum = { x: x + cos * marker.size, y: y + sin * marker.size, text: labelText, textAlign, textBaseline }; } } nodeData.push({ series: this, datum, datumIndex, index: datumIndex, point: { x, y, size: marker.size }, midPoint: { x, y }, label: labelNodeDatum, angleValue: angleDatum, radiusValue: radiusDatum, missing: !(0, import_ag_charts_core250.isFiniteNumber)(angle) || !(0, import_ag_charts_core250.isFiniteNumber)(radius) }); } return { itemId: radiusKey, nodeData, labelData: nodeData, styles: getMarkerStyles2(this, this.properties, marker) }; } update({ seriesRect }) { const resize = this.checkResize(seriesRect); const animationEnabled = !this.ctx.animationManager.isSkipped(); const { series } = this.ctx.highlightManager?.getActiveHighlight() ?? {}; this.highlightGroup.visible = (animationEnabled || this.visible) && series === this; this.maybeRefreshNodeData(); this.contentGroup.translationX = this.centerX; this.contentGroup.translationY = this.centerY; this.highlightGroup.translationX = this.centerX; this.highlightGroup.translationY = this.centerY; if (this.labelGroup) { this.labelGroup.translationX = this.centerX; this.labelGroup.translationY = this.centerY; } this.updatePathSelections(); this.updateMarkerSelection(); this.updateHighlightSelection(); this.updatePathNodes(); if (this.hasItemStylers()) { this.updateDatumStyles(this.itemSelection, false); this.updateDatumStyles(this.highlightSelection, true); } const drawingMode = this.ctx.chartService.highlight?.drawingMode ?? "overlay"; this.updateMarkers(this.itemSelection, false, "overlay"); this.updateMarkers(this.highlightSelection, true, drawingMode); this.updateLabels(); if (resize) { this.animationState.transition("resize"); } this.animationState.transition("update"); } updatePathSelections() { const pathData = this.visible ? [true] : []; this.lineSelection.update(pathData); } updateMarkerSelection() { const { marker, styler } = this.properties; if (marker.isDirty()) { this.itemSelection.clear(); this.itemSelection.cleanup(); this.itemSelection = Selection14.select(this.itemGroup, () => this.nodeFactory(), false); } const markersEnabled = styler == null ? marker.enabled : this.getStyle().marker.enabled; const data = this.visible && marker.shape && markersEnabled ? this.nodeData : []; this.itemSelection.update(data); } updateHighlightSelection() { const { marker, styler } = this.properties; if (marker.isDirty()) { this.highlightSelection.clear(); this.highlightSelection.cleanup(); this.highlightSelection = Selection14.select(this.highlightGroup, () => this.nodeFactory(), false); } const markersEnabled = styler == null ? marker.enabled : this.getStyle().marker.enabled; const highlighted = this.ctx.highlightManager?.getActiveHighlight(); const data = this.visible && marker.shape && markersEnabled && highlighted?.datum ? [{ ...highlighted }] : []; this.highlightSelection.update(data); } getMarkerFill(highlightedStyle) { return highlightedStyle?.fill ?? this.getStyle().marker.fill; } getDatumStylerProperties(datum) { const { id: seriesId, properties } = this; const { angleKey, radiusKey } = properties; return { seriesId, datum, angleKey, radiusKey }; } updateDatumStyles(selection, isHighlight) { const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); selection.each((_, datum) => { const highlightState = this.getHighlightState(highlightedDatum, isHighlight, datum.datumIndex); const stylerStyle = this.getStyle(highlightState); const { stroke: stroke3, strokeWidth, strokeOpacity } = stylerStyle; datum.style = this.getMarkerStyle( this.properties.marker, datum, this.getDatumStylerProperties(datum.datum), { isHighlight, highlightState }, stylerStyle.marker, { stroke: stroke3, strokeWidth, strokeOpacity } ); }); } updateMarkers(selection, isHighlight, drawingMode) { const fillBBox = this.getShapeFillBBox(); const { contextNodeData } = this; if (!contextNodeData) { return; } const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); drawingMode = this.getDrawingMode(isHighlight, drawingMode); selection.each((node, datum) => { const style = datum.style ?? contextNodeData.styles[this.getHighlightState(highlightedDatum, isHighlight, datum.datumIndex)]; this.applyMarkerStyle(style, node, datum.point, fillBBox); node.drawingMode = drawingMode; }); } updateLabels() { const { properties } = this; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightData = activeHighlight?.series === this && activeHighlight?.datum ? [{ ...activeHighlight }] : []; this.labelSelection.update(this.nodeData).each((node, datum) => { if (datum.label) { const isHighlight = false; node.fillOpacity = this.getHighlightStyle(isHighlight, datum.datumIndex).opacity ?? 1; updateLabelNode7(this, node, properties, properties.label, datum.label, isHighlight, activeHighlight); } }); this.highlightLabelSelection.update(highlightData).each((node, datum) => { if (datum.label) { const isHighlight = true; node.fillOpacity = this.getHighlightStyle(isHighlight, datum.datumIndex).opacity ?? 1; updateLabelNode7(this, node, properties, properties.label, datum.label, isHighlight, activeHighlight); } }); } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, axes, properties } = this; const { angleKey, angleName, radiusKey, radiusName, legendItemName, tooltip, marker } = properties; const angleAxis = axes[import_ag_charts_core250.ChartAxisDirection.Angle]; const radiusAxis = axes[import_ag_charts_core250.ChartAxisDirection.Radius]; if (!dataModel || !processedData || !angleAxis || !radiusAxis) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const angleValue = dataModel.resolveKeysById(this, `angleValue`, processedData)[datumIndex]; const radiusValue = dataModel.resolveColumnById(this, `radiusValue`, processedData)[datumIndex]; const allowNullKeys = this.properties.allowNullKeys ?? false; if (angleValue === void 0 && !allowNullKeys) return; const activeStyle = this.getMarkerStyle(marker, { datum, datumIndex }, this.getDatumStylerProperties(datum), { isHighlight: false }); return this.formatTooltipWithContext( tooltip, { heading: this.getAxisValueText( angleAxis, "tooltip", angleValue, datum, angleKey, void 0, allowNullKeys ), symbol: this.legendItemSymbol(), data: [ { label: radiusName, fallbackLabel: radiusKey, value: this.getAxisValueText(radiusAxis, "tooltip", radiusValue, datum, radiusKey, void 0), missing: import_ag_charts_community227._ModuleSupport.isTooltipValueMissing(radiusValue) } ] }, { seriesId, datum, title: angleName, angleKey, radiusKey, angleName, radiusName, legendItemName, ...activeStyle } ); } legendItemSymbol() { const { stroke: stroke3, strokeWidth, strokeOpacity, lineDash, marker } = this.getStyle(); const markerStyle = { shape: marker.shape, enabled: marker.enabled || strokeWidth <= 0, fill: this.getMarkerFill() ?? marker.stroke ?? stroke3 ?? "rgba(0, 0, 0, 0)", stroke: marker.stroke ?? stroke3 ?? "rgba(0, 0, 0, 0)", fillOpacity: marker.fillOpacity, strokeOpacity: marker.strokeOpacity, strokeWidth: marker.strokeWidth, lineDash: marker.lineDash, lineDashOffset: marker.lineDashOffset }; return { marker: markerStyle, line: { enabled: true, stroke: stroke3, strokeOpacity, strokeWidth, lineDash } }; } getLegendData(legendType) { if (legendType !== "category") { return []; } const { id: seriesId, ctx: { legendManager }, visible } = this; const { radiusKey, radiusName, legendItemName, showInLegend } = this.properties; return [ { legendType: "category", id: seriesId, itemId: radiusKey, seriesId, enabled: visible && legendManager.getItemEnabled({ seriesId, itemId: radiusKey }), label: { text: legendItemName ?? radiusName ?? radiusKey }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend } ]; } pickNodeClosestDatum(hitPoint) { const { nodeData, centerX: cx, centerY: cy } = this; const { x, y } = hitPoint; const radius = this.radius; const distanceFromCenter = Math.hypot(x - cx, y - cy); if (distanceFromCenter > radius + this.maxChartMarkerSize) { return; } let minDistance = Infinity; let closestDatum; for (const datum of nodeData) { const { point: { x: datumX = Number.NaN, y: datumY = Number.NaN } = {} } = datum; if (Number.isNaN(datumX) || Number.isNaN(datumY)) { continue; } const distance = Math.hypot(hitPoint.x - datumX - cx, hitPoint.y - datumY - cy); if (distance < minDistance) { minDistance = distance; closestDatum = datum; } } if (closestDatum) { const distance = Math.max(minDistance - (closestDatum.point?.size ?? 0) / 2, 0); return { datum: closestDatum, distance }; } } computeLabelsBBox() { const { label } = this.properties; this.maybeRefreshNodeData(); const textBoxes = []; const tempText = new Text8(); for (const nodeDatum of this.nodeData) { if (!label.enabled || !nodeDatum.label) { continue; } tempText.text = nodeDatum.label.text; tempText.x = nodeDatum.label.x; tempText.y = nodeDatum.label.y; tempText.setFont(label); tempText.setAlign(nodeDatum.label); const box = tempText.getBBox(); textBoxes.push(box); } if (textBoxes.length === 0) { return null; } return BBox24.merge(textBoxes); } getLineNode() { return this.lineSelection?.at(0); } beforePathAnimation() { this.updatePathNodes(); } getPathNodesStyle() { const highlightDatum = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightState(highlightDatum); const highlightStyle = this.getHighlightStyle(void 0, void 0, highlightState); const stylerStyle = this.getStyle(highlightState); return (0, import_ag_charts_core250.mergeDefaults)(highlightStyle, stylerStyle); } getLinePoints() { const { nodeData, resetInvalidToZero } = this; const { connectMissingData } = this.properties; if (nodeData.length === 0) { return []; } const radiusAxis = this.axes[import_ag_charts_core250.ChartAxisDirection.Radius]; const angleAxis = this.axes[import_ag_charts_core250.ChartAxisDirection.Angle]; const reversedAngleAxis = angleAxis?.isReversed(); const reversedRadiusAxis = radiusAxis?.isReversed(); const data = reversedRadiusAxis && !reversedAngleAxis ? [...nodeData].reverse() : nodeData; const points = []; let prevPointInvalid = false; let firstValid; for (const [index, datum] of data.entries()) { let { x, y } = datum.point; const isPointInvalid = Number.isNaN(x) || Number.isNaN(y); if (!isPointInvalid) { firstValid ?? (firstValid = datum); } if (isPointInvalid && !connectMissingData) { x = 0; y = 0; } const moveTo2 = index === 0 || !resetInvalidToZero && !connectMissingData && (isPointInvalid || prevPointInvalid); points.push({ x, y, moveTo: moveTo2 }); prevPointInvalid = isPointInvalid; } if (firstValid !== void 0) { points.push({ x: firstValid.point.x, y: firstValid.point.y, moveTo: false }); } return points; } animateSinglePath(pathNode, points, ratio8) { const { path } = pathNode; path.clear(true); const axisInnerRadius = this.getAxisInnerRadius(); const radiusAxis = this.axes[import_ag_charts_core250.ChartAxisDirection.Radius]; const reversedRadiusAxis = radiusAxis?.isReversed(); const radiusZero = reversedRadiusAxis ? this.radius + axisInnerRadius - radiusAxis?.scale.convert(0) : axisInnerRadius; for (const point of points) { const { x: x1, y: y1, arc, radius = 0, startAngle = 0, endAngle = 0, moveTo: moveTo2 } = point; const angle = Math.atan2(y1, x1); const x0 = radiusZero * Math.cos(angle); const y0 = radiusZero * Math.sin(angle); const t = ratio8; const x = x0 * (1 - t) + x1 * t; const y = y0 * (1 - t) + y1 * t; if (arc) { path.arc(x1, y1, radius, startAngle, endAngle); } else if (moveTo2) { path.moveTo(x, y); } else { path.lineTo(x, y); } } pathNode.checkPathDirty(); } animatePaths(ratio8) { const linePoints = this.getLinePoints(); const lineNode = this.getLineNode(); if (!lineNode) return; this.animateSinglePath(lineNode, linePoints, ratio8); } animateEmptyUpdateReady() { const { itemSelection, labelSelection } = this; const { animationManager } = this.ctx; this.beforePathAnimation(); animationManager.animate({ id: `${this.id}_'path`, groupId: this.id, from: 0, to: 1, phase: "initial", collapsable: false, onUpdate: (ratio8) => this.animatePaths(ratio8), onStop: () => this.animatePaths(1) }); markerFadeInAnimation2(this, animationManager, "added", this.getAnimationDrawingModes(), itemSelection); seriesLabelFadeInAnimation7(this, "labels", animationManager, labelSelection, this.highlightLabelSelection); } animateWaitingUpdateReady(data) { super.animateWaitingUpdateReady(data); this.resetPaths(); } animateReadyResize(data) { super.animateReadyResize(data); this.resetPaths(); } resetPaths() { const lineNode = this.getLineNode(); if (lineNode) { const { path: linePath } = lineNode; const linePoints = this.getLinePoints(); const stylerStyle = this.getStyle(); lineNode.fill = void 0; lineNode.stroke = stylerStyle.stroke; lineNode.strokeWidth = stylerStyle.strokeWidth; lineNode.strokeOpacity = stylerStyle.strokeOpacity; lineNode.lineDash = stylerStyle.lineDash; lineNode.lineDashOffset = stylerStyle.lineDashOffset; linePath.clear(true); for (const { x, y, moveTo: moveTo2 } of linePoints) { if (moveTo2) { linePath.moveTo(x, y); } else { linePath.lineTo(x, y); } } lineNode.checkPathDirty(); return stylerStyle; } } getStylerResult(stylerResult, highlightState) { const { styler } = this.properties; if (styler) { const stylerParams = this.makeStylerParams(highlightState); const cbResult = this.cachedCallWithContext(styler, stylerParams) ?? {}; const resolved = this.ctx.optionsGraphService.resolvePartial( ["series", `${this.declarationOrder}`], cbResult, { pick: false } ); if (resolved) { stylerResult = resolved; } } return stylerResult; } getFormattedMarkerStyle(datum) { const { angleKey, radiusKey } = this.properties; return this.getMarkerStyle(this.properties.marker, datum, { angleKey, radiusKey }, { isHighlight: true }); } computeFocusBounds(opts) { return computeMarkerFocusBounds3(this, opts); } hasItemStylers() { return this.properties.styler != null || this.properties.marker.itemStyler != null || this.properties.label.itemStyler != null; } }; RadarSeries.className = "RadarSeries"; // packages/ag-charts-enterprise/src/series/radar-area/radarAreaSeriesProperties.ts var import_ag_charts_community228 = require("ag-charts-community"); var import_ag_charts_core251 = require("ag-charts-core"); var RadarAreaSeriesProperties = class extends RadarSeriesProperties { constructor() { super(...arguments); this.fill = "black"; this.fillOpacity = 1; } }; __decorateClass([ import_ag_charts_core251.Property ], RadarAreaSeriesProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core251.Property ], RadarAreaSeriesProperties.prototype, "fillOpacity", 2); // packages/ag-charts-enterprise/src/series/radar-area/radarAreaSeries.ts var { Group: Group19, HighlightState: HighlightState5, Path: Path13, PointerEvents: PointerEvents10, Selection: Selection15, toHighlightString: toHighlightString5 } = import_ag_charts_community229._ModuleSupport; var RadarAreaSeries = class extends RadarSeries { constructor(moduleCtx) { super(moduleCtx); this.properties = new RadarAreaSeriesProperties(); this.areaGroup = this.contentGroup.appendChild(new Group19({ name: "radar-area" })); this.areaSelection = Selection15.select( this.areaGroup, Path13 ); this.resetInvalidToZero = true; this.areaGroup.zIndex = -1; } updatePathSelections() { const pathData = this.visible ? [true] : []; this.areaSelection.update(pathData); super.updatePathSelections(); } getAreaNode() { return this.areaSelection.at(0); } getMarkerFill(highlightedStyle) { if (highlightedStyle?.fill != null) return highlightedStyle.fill; const stylerStyle = this.getStyle(); return stylerStyle.marker.fill ?? stylerStyle.fill; } updatePathNodes() { const styles = this.getPathNodesStyle(); const { fill, fillOpacity, strokeWidth, stroke: stroke3, strokeOpacity, lineDash, lineDashOffset, opacity } = styles; const lineNode = this.getLineNode(); if (lineNode) { lineNode.setProperties({ fill: void 0, lineJoin: "round", lineCap: "round", pointerEvents: PointerEvents10.None, opacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }); } const areaNode = this.getAreaNode(); if (areaNode) { areaNode.setStyleProperties({ fill, fillOpacity, stroke: void 0 }, this.getShapeFillBBox()); areaNode.setProperties({ lineJoin: "round", pointerEvents: PointerEvents10.None, opacity }); } } animatePaths(ratio8) { super.animatePaths(ratio8); const areaNode = this.getAreaNode(); if (areaNode) { this.animateSinglePath(areaNode, this.getAreaPoints(), ratio8); } } getAreaPoints() { const points = this.getLinePoints(); const getPolarAxis = (direction) => { const axis = this.axes[direction]; return axis instanceof import_ag_charts_community229._ModuleSupport.PolarAxis ? axis : void 0; }; const radiusAxis = getPolarAxis(import_ag_charts_core252.ChartAxisDirection.Radius); const angleAxis = getPolarAxis(import_ag_charts_core252.ChartAxisDirection.Angle); const reversedRadiusAxis = radiusAxis?.isReversed(); if (!reversedRadiusAxis) { return points; } const zeroLinePoints = angleAxis?.getAxisLinePoints()?.points ?? []; return points.concat(...zeroLinePoints); } resetPaths() { const superStyle = super.resetPaths(); const areaNode = this.getAreaNode(); if (areaNode) { const { path: areaPath } = areaNode; const areaPoints = this.getAreaPoints(); const stylerStyle = superStyle ?? this.getStyle(); const fillBBox = this.getShapeFillBBox(); areaNode.setStyleProperties( { fill: stylerStyle.fill, stroke: void 0, fillOpacity: stylerStyle.fillOpacity, lineDash: stylerStyle.lineDash, lineDashOffset: stylerStyle.lineDashOffset }, fillBBox ); areaNode.lineJoin = areaNode.lineCap = "round"; areaPath.clear(true); for (const { x, y, moveTo: moveTo2, arc, radius = 0, startAngle = 0, endAngle = 0 } of areaPoints) { if (arc) { areaPath.arc(x, y, radius, startAngle, endAngle); } else if (moveTo2) { areaPath.moveTo(x, y); } else { areaPath.lineTo(x, y); } } areaPath.closePath(); areaNode.checkPathDirty(); return stylerStyle; } } makeStylerParams(highlightStateEnum) { const { properties } = this; const highlightState = toHighlightString5(highlightStateEnum ?? HighlightState5.None); return { marker: { fill: properties.marker.fill, fillOpacity: properties.marker.fillOpacity, size: properties.marker.size, shape: properties.marker.shape, stroke: properties.marker.stroke, strokeOpacity: properties.marker.strokeOpacity, strokeWidth: properties.marker.strokeWidth, lineDash: properties.marker.lineDash, lineDashOffset: properties.marker.lineDashOffset }, highlightState, fill: properties.fill, fillOpacity: properties.fillOpacity, lineDash: properties.lineDash, lineDashOffset: properties.lineDashOffset, seriesId: this.id, stroke: properties.stroke, strokeOpacity: properties.strokeOpacity, strokeWidth: properties.strokeWidth, angleKey: properties.angleKey, radiusKey: properties.radiusKey }; } getStyle(highlightState) { const { marker, fill, fillOpacity, lineDash, lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth } = this.properties; const { size, shape, fill: markerFill = "transparent", fillOpacity: markerFillOpacity } = marker; const stylerResult = this.getStylerResult({}, highlightState); stylerResult.marker ?? (stylerResult.marker = {}); return { fill: stylerResult.fill ?? fill, fillOpacity: stylerResult.fillOpacity ?? fillOpacity, lineDash: stylerResult.lineDash ?? lineDash, lineDashOffset: stylerResult.lineDashOffset ?? lineDashOffset, stroke: stylerResult.stroke ?? stroke3, strokeOpacity: stylerResult.strokeOpacity ?? strokeOpacity, strokeWidth: stylerResult.strokeWidth ?? strokeWidth, marker: { enabled: stylerResult.marker.enabled ?? marker.enabled, fill: stylerResult.marker.fill ?? markerFill, fillOpacity: stylerResult.marker.fillOpacity ?? markerFillOpacity, shape: stylerResult.marker.shape ?? shape, size: stylerResult.marker.size ?? size, lineDash: stylerResult.marker.lineDash ?? marker.lineDash ?? lineDash, lineDashOffset: stylerResult.marker.lineDashOffset ?? marker.lineDashOffset ?? lineDashOffset, stroke: stylerResult.marker.stroke ?? marker.stroke ?? stroke3, strokeOpacity: stylerResult.marker.strokeOpacity ?? marker.strokeOpacity ?? strokeOpacity, strokeWidth: stylerResult.marker.strokeWidth ?? marker.strokeWidth ?? strokeWidth } }; } }; RadarAreaSeries.className = "RadarAreaSeries"; RadarAreaSeries.type = "radar-area"; // packages/ag-charts-enterprise/src/series/radar-area/radarAreaSeriesOptionsDef.ts var import_ag_charts_community230 = require("ag-charts-community"); var import_ag_charts_core253 = require("ag-charts-core"); var { radarAreaSeriesThemeableOptionsDef } = import_ag_charts_community230._ModuleSupport; var radarAreaSeriesOptionsDef = { ...import_ag_charts_core253.commonSeriesOptionsDefs, ...radarAreaSeriesThemeableOptionsDef, type: (0, import_ag_charts_core253.required)((0, import_ag_charts_core253.constant)("radar-area")), angleKey: (0, import_ag_charts_core253.required)(import_ag_charts_core253.string), radiusKey: (0, import_ag_charts_core253.required)(import_ag_charts_core253.string), angleName: import_ag_charts_core253.string, radiusName: import_ag_charts_core253.string, legendItemName: import_ag_charts_core253.string }; radarAreaSeriesOptionsDef.angleKeyAxis = (0, import_ag_charts_core253.undocumented)(import_ag_charts_core253.string); radarAreaSeriesOptionsDef.radiusKeyAxis = (0, import_ag_charts_core253.undocumented)(import_ag_charts_core253.string); // packages/ag-charts-enterprise/src/series/radar-area/radarAreaModule.ts var RadarAreaSeriesModule = { type: "series", name: "radar-area", chartType: "polar", enterprise: true, version: import_ag_charts_community231.VERSION, dependencies: [import_ag_charts_community231.PolarChartModule], options: radarAreaSeriesOptionsDef, defaultAxes: { angle: { type: import_ag_charts_core254.POLAR_AXIS_TYPE.ANGLE_CATEGORY }, radius: { type: import_ag_charts_core254.POLAR_AXIS_TYPE.RADIUS_NUMBER } }, axisKeys: { [import_ag_charts_core254.ChartAxisDirection.Angle]: "angleKeyAxis", [import_ag_charts_core254.ChartAxisDirection.Radius]: "radiusKeyAxis" }, themeTemplate: RADAR_AREA_SERIES_THEME, create: (ctx) => new RadarAreaSeries(ctx) }; // packages/ag-charts-enterprise/src/series/radar-line/radarLineModule.ts var import_ag_charts_community234 = require("ag-charts-community"); var import_ag_charts_core256 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radar-line/radarLineSeries.ts var import_ag_charts_community232 = require("ag-charts-community"); var { HighlightState: HighlightState6, PointerEvents: PointerEvents11, toHighlightString: toHighlightString6 } = import_ag_charts_community232._ModuleSupport; var RadarLineSeries = class extends RadarSeries { constructor() { super(...arguments); this.properties = new RadarSeriesProperties(); } updatePathSelections() { this.lineSelection.update(this.visible ? [true] : []); } updatePathNodes() { const lineNode = this.getLineNode(); if (!lineNode) return; const style = this.getPathNodesStyle(); const { strokeWidth, stroke: stroke3, strokeOpacity, lineDash, lineDashOffset, opacity } = style; lineNode.setProperties({ fill: void 0, lineJoin: "round", lineCap: "round", pointerEvents: PointerEvents11.None, opacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }); } makeStylerParams(highlightStateEnum) { const { properties } = this; const highlightState = toHighlightString6(highlightStateEnum ?? HighlightState6.None); return { marker: { fill: properties.marker.fill, fillOpacity: properties.marker.fillOpacity, size: properties.marker.size, shape: properties.marker.shape, stroke: properties.marker.stroke, strokeOpacity: properties.marker.strokeOpacity, strokeWidth: properties.marker.strokeWidth, lineDash: properties.marker.lineDash, lineDashOffset: properties.marker.lineDashOffset }, highlightState, lineDash: properties.lineDash, lineDashOffset: properties.lineDashOffset, seriesId: this.id, stroke: properties.stroke, strokeOpacity: properties.strokeOpacity, strokeWidth: properties.strokeWidth, angleKey: properties.angleKey, radiusKey: properties.radiusKey }; } getStyle(highlightState) { const { marker, lineDash, lineDashOffset, stroke: stroke3, strokeOpacity, strokeWidth } = this.properties; const { size, shape, fill = "transparent", fillOpacity } = marker; const stylerResult = this.getStylerResult({}, highlightState); stylerResult.marker ?? (stylerResult.marker = {}); return { lineDash: stylerResult.lineDash ?? lineDash, lineDashOffset: stylerResult.lineDashOffset ?? lineDashOffset, stroke: stylerResult.stroke ?? stroke3, strokeOpacity: stylerResult.strokeOpacity ?? strokeOpacity, strokeWidth: stylerResult.strokeWidth ?? strokeWidth, marker: { enabled: stylerResult.marker.enabled ?? marker.enabled, fill: stylerResult.marker.fill ?? fill, fillOpacity: stylerResult.marker.fillOpacity ?? fillOpacity, shape: stylerResult.marker.shape ?? shape, size: stylerResult.marker.size ?? size, lineDash: stylerResult.marker.lineDash ?? marker.lineDash ?? lineDash, lineDashOffset: stylerResult.marker.lineDashOffset ?? marker.lineDashOffset ?? lineDashOffset, stroke: stylerResult.marker.stroke ?? marker.stroke ?? stroke3, strokeOpacity: stylerResult.marker.strokeOpacity ?? marker.strokeOpacity ?? strokeOpacity, strokeWidth: stylerResult.marker.strokeWidth ?? marker.strokeWidth ?? strokeWidth } }; } }; RadarLineSeries.className = "RadarLineSeries"; RadarLineSeries.type = "radar-line"; // packages/ag-charts-enterprise/src/series/radar-line/radarLineSeriesOptionsDef.ts var import_ag_charts_community233 = require("ag-charts-community"); var import_ag_charts_core255 = require("ag-charts-core"); var { radarLineSeriesThemeableOptionsDef } = import_ag_charts_community233._ModuleSupport; var radarLineSeriesOptionsDef = { ...import_ag_charts_core255.commonSeriesOptionsDefs, ...radarLineSeriesThemeableOptionsDef, type: (0, import_ag_charts_core255.required)((0, import_ag_charts_core255.constant)("radar-line")), angleKey: (0, import_ag_charts_core255.required)(import_ag_charts_core255.string), radiusKey: (0, import_ag_charts_core255.required)(import_ag_charts_core255.string), angleName: import_ag_charts_core255.string, radiusName: import_ag_charts_core255.string, legendItemName: import_ag_charts_core255.string }; radarLineSeriesOptionsDef.angleKeyAxis = (0, import_ag_charts_core255.undocumented)(import_ag_charts_core255.string); radarLineSeriesOptionsDef.radiusKeyAxis = (0, import_ag_charts_core255.undocumented)(import_ag_charts_core255.string); // packages/ag-charts-enterprise/src/series/radar-line/radarLineModule.ts var RadarLineSeriesModule = { type: "series", name: "radar-line", chartType: "polar", enterprise: true, version: import_ag_charts_community234.VERSION, dependencies: [import_ag_charts_community234.PolarChartModule], options: radarLineSeriesOptionsDef, defaultAxes: { angle: { type: import_ag_charts_core256.POLAR_AXIS_TYPE.ANGLE_CATEGORY }, radius: { type: import_ag_charts_core256.POLAR_AXIS_TYPE.RADIUS_NUMBER } }, axisKeys: { [import_ag_charts_core256.ChartAxisDirection.Angle]: "angleKeyAxis", [import_ag_charts_core256.ChartAxisDirection.Radius]: "radiusKeyAxis" }, themeTemplate: RADAR_LINE_SERIES_THEME, create: (ctx) => new RadarLineSeries(ctx) }; // packages/ag-charts-enterprise/src/series/radial-bar/radialBarModule.ts var import_ag_charts_community239 = require("ag-charts-community"); var import_ag_charts_core261 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radial-bar/radialBarSeries.ts var import_ag_charts_community237 = require("ag-charts-community"); var import_ag_charts_core258 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radial-bar/radialBarSeriesProperties.ts var import_ag_charts_community235 = require("ag-charts-community"); var import_ag_charts_core257 = require("ag-charts-core"); var { SeriesProperties: SeriesProperties11, makeSeriesTooltip: makeSeriesTooltip20, Label: Label15 } = import_ag_charts_community235._ModuleSupport; var RadialBarSeriesProperties = class extends SeriesProperties11 { constructor() { super(...arguments); this.angleKeyAxis = "angle"; this.radiusKeyAxis = "radius"; this.fill = "black"; this.fillOpacity = 1; this.stroke = "black"; this.strokeWidth = 1; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.cornerRadius = 0; this.rotation = 0; this.label = new Label15(); this.tooltip = makeSeriesTooltip20(); } getStyle() { const { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, cornerRadius } = this; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset, cornerRadius, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "angleKey", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "radiusKey", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "angleName", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "radiusName", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "angleKeyAxis", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "radiusKeyAxis", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "legendItemName", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "styler", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "rotation", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "stackGroup", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "normalizedTo", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core257.Property ], RadialBarSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/radial-bar/radialBarUtil.ts var import_ag_charts_community236 = require("ag-charts-community"); var { SectorBox: SectorBox3, motion: motion9 } = import_ag_charts_community236._ModuleSupport; function fixRadialBarAnimationStatus(node, datum, status) { if (status === "updated") { if (node.previousDatum == null || Number.isNaN(node.previousDatum.innerRadius) || Number.isNaN(node.previousDatum.outerRadius)) { return "added"; } if (Number.isNaN(datum.innerRadius) || Number.isNaN(datum.outerRadius)) { return "removed"; } } if (status === "added" && node.previousDatum != null) { return "updated"; } return status; } function prepareRadialBarSeriesAnimationFunctions(axisZeroAngle) { const fromFn = (sect, datum, status) => { status = fixRadialBarAnimationStatus(sect, datum, status); let startAngle; let endAngle; let innerRadius; let outerRadius; let clipSector; if (status === "removed" || status === "updated") { startAngle = sect.startAngle; endAngle = sect.endAngle; innerRadius = sect.innerRadius; outerRadius = sect.outerRadius; clipSector = sect.clipSector; } else { startAngle = axisZeroAngle; endAngle = axisZeroAngle; innerRadius = datum.innerRadius; outerRadius = datum.outerRadius; } clipSector ?? (clipSector = new SectorBox3(startAngle, endAngle, innerRadius, outerRadius)); const phase = motion9.NODE_UPDATE_STATE_TO_PHASE_MAPPING[status]; return { startAngle, endAngle, innerRadius, outerRadius, clipSector, phase }; }; const toFn = (sect, datum, status) => { let startAngle; let endAngle; let innerRadius; let outerRadius; let clipSector; if (status === "removed") { startAngle = axisZeroAngle; endAngle = axisZeroAngle; innerRadius = datum.innerRadius; outerRadius = datum.outerRadius; clipSector = new SectorBox3(startAngle, endAngle, innerRadius, outerRadius); } else { startAngle = datum.startAngle; endAngle = datum.endAngle; innerRadius = Number.isNaN(datum.innerRadius) ? sect.innerRadius : datum.innerRadius; outerRadius = Number.isNaN(datum.outerRadius) ? sect.outerRadius : datum.outerRadius; clipSector = datum.clipSector; } return { startAngle, endAngle, innerRadius, outerRadius, clipSector }; }; return { toFn, fromFn }; } function resetRadialBarSelectionsFn(_node, datum) { return { centerX: 0, centerY: 0, innerRadius: datum.innerRadius, outerRadius: datum.outerRadius, startAngle: datum.startAngle, endAngle: datum.endAngle, clipSector: datum.clipSector }; } // packages/ag-charts-enterprise/src/series/radial-bar/radialBarSeries.ts var { DEFAULT_POLAR_DIRECTION_KEYS: DEFAULT_POLAR_DIRECTION_KEYS3, DEFAULT_POLAR_DIRECTION_NAMES: DEFAULT_POLAR_DIRECTION_NAMES3, PolarAxis: PolarAxis3, diff: diff7, groupAccumulativeValueProperty: groupAccumulativeValueProperty3, keyProperty: keyProperty11, normaliseGroupTo: normaliseGroupTo2, valueProperty: valueProperty17, fixNumericExtent: fixNumericExtent10, resetLabelFn: resetLabelFn7, seriesLabelFadeInAnimation: seriesLabelFadeInAnimation8, seriesLabelFadeOutAnimation: seriesLabelFadeOutAnimation2, animationValidation: animationValidation9, createDatumId: createDatumId19, CategoryScale: CategoryScale4, Sector: Sector5, SectorBox: SectorBox4, motion: motion10, updateLabelNode: updateLabelNode8, getItemStyles: getItemStyles4 } = import_ag_charts_community237._ModuleSupport; var RadialBarSeriesNodeEvent = class extends import_ag_charts_community237._ModuleSupport.SeriesNodeEvent { constructor(type, nativeEvent, datum, series) { super(type, nativeEvent, datum, series); this.angleKey = series.properties.angleKey; this.radiusKey = series.properties.radiusKey; } }; var RadialBarSeries = class extends import_ag_charts_community237._ModuleSupport.PolarSeries { constructor(moduleCtx) { super({ moduleCtx, categoryKey: "radiusValue", propertyKeys: DEFAULT_POLAR_DIRECTION_KEYS3, propertyNames: DEFAULT_POLAR_DIRECTION_NAMES3, canHaveAxes: true, animationResetFns: { item: resetRadialBarSelectionsFn, label: resetLabelFn7 } }); this.properties = new RadialBarSeriesProperties(); this.NodeEvent = RadialBarSeriesNodeEvent; this.groupScale = new CategoryScale4(); this.circleCache = { r: 0, cx: 0, cy: 0 }; } nodeFactory() { return new Sector5(); } getSeriesDomain(direction) { const { dataModel, processedData } = this; if (!processedData || !dataModel) return { domain: [] }; if (direction === import_ag_charts_core258.ChartAxisDirection.Angle) { const xExtent = dataModel.getDomain(this, "angleValue-end", "value", processedData).domain; const fixedXExtent = [Math.min(xExtent[0], 0), Math.max(xExtent[1], 0)]; return { domain: fixNumericExtent10(fixedXExtent) }; } else { return dataModel.getDomain(this, "radiusValue", "key", processedData); } } async processData(dataController) { const { angleKey, radiusKey, normalizedTo } = this.properties; const animationEnabled = !this.ctx.animationManager.isSkipped(); const stackGroupId = this.getStackId(); const stackGroupTrailingId = `${stackGroupId}-trailing`; const extraProps = []; if ((0, import_ag_charts_core258.isDefined)(normalizedTo)) { extraProps.push(normaliseGroupTo2([stackGroupId, stackGroupTrailingId], Math.abs(normalizedTo))); } if (this.needsDataModelDiff() && this.processedData) { extraProps.push(diff7(this.id, this.processedData)); } if (animationEnabled) { extraProps.push(animationValidation9()); } const visibleProps = this.visible ? {} : { forceValue: 0 }; const radiusScaleType = this.axes[import_ag_charts_core258.ChartAxisDirection.Radius]?.scale.type; const angleScaleType = this.axes[import_ag_charts_core258.ChartAxisDirection.Angle]?.scale.type; const allowNullKey = this.properties.allowNullKeys ?? false; await this.requestDataModel(dataController, this.data, { props: [ keyProperty11(radiusKey, radiusScaleType, { id: "radiusValue", allowNullKey }), valueProperty17(angleKey, angleScaleType, { id: "angleValue-raw", invalidValue: null, ...visibleProps }), ...groupAccumulativeValueProperty3( angleKey, "normal", { id: `angleValue-end`, rangeId: `angleValue-range`, invalidValue: null, groupId: stackGroupId, separateNegative: true, ...visibleProps }, angleScaleType ), ...groupAccumulativeValueProperty3( angleKey, "trailing", { id: `angleValue-start`, invalidValue: null, groupId: stackGroupTrailingId, separateNegative: true, ...visibleProps }, angleScaleType ), ...extraProps ], groupByKeys: true, groupByData: false }); this.animationState.transition("updateData"); } didCircleChange() { const r = this.radius; const cx = this.centerX; const cy = this.centerY; const cache = this.circleCache; if (!(r === cache.r && cx === cache.cx && cy === cache.cy)) { this.circleCache = { r, cx, cy }; return true; } return false; } maybeRefreshNodeData() { const circleChanged = this.didCircleChange(); if (!circleChanged && !this.nodeDataRefresh) return; this.contextNodeData = this.createNodeData(); this.nodeData = this.contextNodeData?.nodeData ?? []; this.nodeDataRefresh = false; } getAxisInnerRadius() { const radiusAxis = this.axes[import_ag_charts_core258.ChartAxisDirection.Radius]; return radiusAxis instanceof PolarAxis3 ? this.radius * radiusAxis.innerRadiusRatio : 0; } createNodeData() { const { processedData, dataModel } = this; if (!dataModel || processedData?.type !== "grouped") return; const angleAxis = this.axes[import_ag_charts_core258.ChartAxisDirection.Angle]; const radiusAxis = this.axes[import_ag_charts_core258.ChartAxisDirection.Radius]; const angleScale = angleAxis?.scale; const radiusScale = radiusAxis?.scale; if (!angleScale || !radiusScale) { return; } const radiusValues = dataModel.resolveKeysById(this, "radiusValue", processedData); const angleStartValues = dataModel.resolveColumnById(this, `angleValue-start`, processedData); const angleEndValues = dataModel.resolveColumnById(this, `angleValue-end`, processedData); const angleRawValues = dataModel.resolveColumnById(this, `angleValue-raw`, processedData); const angleRangeIndex = dataModel.resolveProcessedDataIndexById(this, `angleValue-range`); let groupPaddingInner = 0; if (radiusAxis instanceof RadiusCategoryAxis) { groupPaddingInner = radiusAxis.groupPaddingInner; } const { groupScale } = this; const { index: groupIndex, visibleGroupCount } = this.ctx.seriesStateManager.getVisiblePeerGroupIndex(this); groupScale.domain = Array.from({ length: visibleGroupCount }).map((_, i) => String(i)); groupScale.range = [0, Math.abs(radiusScale.bandwidth ?? 0)]; groupScale.paddingInner = visibleGroupCount > 1 ? groupPaddingInner : 0; const barWidth = groupScale.bandwidth >= 1 ? groupScale.bandwidth : groupScale.rawBandwidth; const angleAxisReversed = angleAxis.isReversed(); const radiusAxisReversed = radiusAxis.isReversed(); const axisInnerRadius = radiusAxisReversed ? this.radius : this.getAxisInnerRadius(); const axisOuterRadius = radiusAxisReversed ? this.getAxisInnerRadius() : this.radius; const axisTotalRadius = axisOuterRadius + axisInnerRadius; const angleDomain = this.getSeriesDomain(import_ag_charts_core258.ChartAxisDirection.Angle).domain; const { angleKey, radiusKey, angleName, radiusName, legendItemName, label } = this.properties; const getLabelNodeDatum = (datum, angleDatum, x, y) => { const labelText = this.getLabelText( angleDatum, datum, angleKey, "angle", angleDomain, label, { value: angleDatum, datum, angleKey, radiusKey, angleName, radiusName, legendItemName } ); if (labelText) { return { x, y, text: labelText, textAlign: "center", textBaseline: "middle" }; } }; const nodeData = []; const styles = getItemStyles4( (nodeDatum, isHighlight, highlightState) => getItemStyle(this, nodeDatum, isHighlight, highlightState) ); const context = { itemId: radiusKey, nodeData, labelData: nodeData, styles }; if (!this.visible) return context; const { dataSources } = processedData; const rawData = dataSources.get(this.id)?.data ?? []; for (const { datumIndex, group } of dataModel.forEachGroupDatum(this, processedData)) { const datum = rawData[datumIndex]; const radiusDatum = radiusValues[datumIndex]; if (radiusDatum === void 0 && !this.properties.allowNullKeys) return; const angleDatum = angleRawValues[datumIndex]; const angleStartDatum = angleStartValues[datumIndex]; const angleEndDatum = angleEndValues[datumIndex]; const isPositive = angleDatum >= 0 && !Object.is(angleDatum, -0); const angleRange = group.aggregation[angleRangeIndex][isPositive ? 1 : 0]; const reversed = isPositive === angleAxisReversed; let startAngle = angleScale.convert(angleStartDatum, { clamp: true }); let endAngle = angleScale.convert(angleEndDatum, { clamp: true }); let rangeStartAngle = angleScale.convert(0, { clamp: true }); let rangeEndAngle = angleScale.convert(angleRange, { clamp: true }); if (reversed) { [rangeStartAngle, rangeEndAngle] = [rangeEndAngle, rangeStartAngle]; [startAngle, endAngle] = [endAngle, startAngle]; } const dataRadius = axisTotalRadius - radiusScale.convert(radiusDatum); const innerRadius = dataRadius + groupScale.convert(String(groupIndex)); const outerRadius = innerRadius + barWidth; const midRadius = (innerRadius + outerRadius) / 2; const midAngle = startAngle + (0, import_ag_charts_core258.angleBetween)(startAngle, endAngle) / 2; const x = Math.cos(midAngle) * midRadius; const y = Math.sin(midAngle) * midRadius; const labelNodeDatum = this.properties.label.enabled ? getLabelNodeDatum(datum, angleDatum, x, y) : void 0; const clipSector = new SectorBox4(startAngle, endAngle, innerRadius, outerRadius); nodeData.push({ series: this, datum, datumIndex, point: { x, y, size: 0 }, midPoint: { x, y }, label: labelNodeDatum, angleValue: angleDatum, radiusValue: radiusDatum, innerRadius, outerRadius, startAngle: rangeStartAngle, endAngle: rangeEndAngle, clipSector, reversed, index: datumIndex }); } return context; } update({ seriesRect }) { const resize = this.checkResize(seriesRect); this.maybeRefreshNodeData(); this.contentGroup.translationX = this.centerX; this.contentGroup.translationY = this.centerY; this.highlightGroup.translationX = this.centerX; this.highlightGroup.translationY = this.centerY; if (this.labelGroup) { this.labelGroup.translationX = this.centerX; this.labelGroup.translationY = this.centerY; } this.updateSectorSelection(this.itemSelection, false); this.updateSectorSelection(this.highlightSelection, true); this.updateLabels(); if (resize) { this.animationState.transition("resize"); } this.animationState.transition("update"); } updateSectorSelection(selection, isHighlight) { let selectionData = []; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); if (isHighlight) { if (activeHighlight?.datum && activeHighlight.series === this) { selectionData.push(activeHighlight); } } else { selectionData = this.nodeData; } const { contextNodeData } = this; if (!contextNodeData) { return; } const highlightedDatum = this.ctx.highlightManager.getActiveHighlight(); const fillBBox = this.getShapeFillBBox(); const hasItemStylers = this.hasItemStylers(); selection.update(selectionData, void 0, (datum) => this.getDatumId(datum)).each((node, nodeDatum) => { const datum = readDatum(nodeDatum); if (datum == null) return; if (hasItemStylers) { const highlightState = this.getHighlightState(activeHighlight, isHighlight, nodeDatum.datumIndex); nodeDatum.style = getItemStyle(this, nodeDatum, isHighlight, highlightState); } const style = nodeDatum.style ?? contextNodeData.styles[this.getHighlightState(highlightedDatum, isHighlight, nodeDatum.datumIndex)]; const cornerRadius = style.cornerRadius; const fill = style.fill; const fillParams = (0, import_ag_charts_core258.isGradientFill)(fill) && fill.bounds !== "item" ? { centerX: 0, centerY: 0 } : void 0; node.setStyleProperties(style, fillBBox, fillParams); node.lineJoin = "round"; node.inset = node.stroke == null ? 0 : node.strokeWidth / 2; node.startInnerCornerRadius = datum.reversed ? cornerRadius : 0; node.startOuterCornerRadius = datum.reversed ? cornerRadius : 0; node.endInnerCornerRadius = datum.reversed ? 0 : cornerRadius; node.endOuterCornerRadius = datum.reversed ? 0 : cornerRadius; if (isHighlight) { node.startAngle = nodeDatum.startAngle; node.endAngle = nodeDatum.endAngle; node.clipSector = nodeDatum.clipSector; node.innerRadius = nodeDatum.innerRadius; node.outerRadius = nodeDatum.outerRadius; } }); } updateLabels() { const { properties } = this; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightDatum = activeHighlight?.series === this && activeHighlight?.datum ? activeHighlight : void 0; const highlightData = highlightDatum ? [highlightDatum] : []; this.labelSelection.update(this.nodeData).each((node, datum) => { const isHighlight = false; updateLabelNode8(this, node, properties, properties.label, datum.label, isHighlight, activeHighlight); node.fillOpacity = this.getHighlightStyle(isHighlight, datum.datumIndex).opacity ?? 1; }); this.highlightLabelSelection.update(highlightData, void 0, (datum) => this.getDatumId(datum)).each((node, datum) => { const isHighlight = true; updateLabelNode8(this, node, properties, properties.label, datum.label, isHighlight, activeHighlight); node.fillOpacity = this.getHighlightStyle(isHighlight, datum.datumIndex).opacity ?? 1; }); } getBarTransitionFunctions() { const angleScale = this.axes[import_ag_charts_core258.ChartAxisDirection.Angle]?.scale; let axisZeroAngle = 0; if (!angleScale) { return prepareRadialBarSeriesAnimationFunctions(axisZeroAngle); } const d0 = Math.min(angleScale.domain[0], angleScale.domain[1]); const d1 = Math.max(angleScale.domain[0], angleScale.domain[1]); if (d0 <= 0 && d1 >= 0) { axisZeroAngle = angleScale.convert(0); } return prepareRadialBarSeriesAnimationFunctions(axisZeroAngle); } animateEmptyUpdateReady() { const { labelSelection } = this; const fns = this.getBarTransitionFunctions(); motion10.fromToMotion(this.id, "datums", this.ctx.animationManager, [this.itemSelection], fns); seriesLabelFadeInAnimation8( this, "labels", this.ctx.animationManager, labelSelection, this.highlightLabelSelection ); } animateClearingUpdateEmpty() { const { itemSelection } = this; const { animationManager } = this.ctx; const fns = this.getBarTransitionFunctions(); motion10.fromToMotion(this.id, "datums", animationManager, [itemSelection], fns); seriesLabelFadeOutAnimation2( this, "labels", animationManager, this.labelSelection, this.highlightLabelSelection ); } getTooltipContent(datumIndex) { const { id: seriesId, dataModel, processedData, axes, properties } = this; const { angleKey, angleName, radiusKey, radiusName, legendItemName, tooltip } = properties; const angleAxis = axes[import_ag_charts_core258.ChartAxisDirection.Angle]; const radiusAxis = axes[import_ag_charts_core258.ChartAxisDirection.Radius]; const nodeDatum = this.nodeData?.[datumIndex]; if (!dataModel || !processedData || !angleAxis || !radiusAxis || !nodeDatum) return; const datum = processedData.dataSources.get(this.id)?.data[datumIndex]; const radiusValue = dataModel.resolveKeysById(this, `radiusValue`, processedData)[datumIndex]; const angleValue = dataModel.resolveColumnById(this, `angleValue-raw`, processedData)[datumIndex]; if (radiusValue === void 0 && !this.properties.allowNullKeys) return; const format = getItemStyle(this, nodeDatum, false); return this.formatTooltipWithContext( tooltip, { heading: this.getAxisValueText(radiusAxis, "tooltip", radiusValue, datum, radiusKey, void 0), symbol: this.legendItemSymbol(), data: [ { label: angleName, fallbackLabel: angleKey, value: this.getAxisValueText(angleAxis, "tooltip", angleValue, datum, angleKey, void 0), missing: import_ag_charts_community237._ModuleSupport.isTooltipValueMissing(angleValue) } ] }, { seriesId, datum, title: angleName, angleKey, angleName, radiusKey, radiusName, legendItemName, ...format } ); } pickNodeClosestDatum(point) { return this.pickNodeNearestDistantObject(point, this.itemSelection.nodes()); } legendItemSymbol() { const { fill, stroke: stroke3, fillOpacity, strokeOpacity, strokeWidth, lineDash, lineDashOffset } = getStyle( this, false, import_ag_charts_community237._ModuleSupport.HighlightState.None ); const markerStyle = { fill: fill ?? "rgba(0, 0, 0, 0)", stroke: stroke3 ?? "rgba(0, 0, 0, 0)", fillOpacity, strokeOpacity, strokeWidth, lineDash, lineDashOffset }; if ((0, import_ag_charts_core258.isGradientFill)(markerStyle.fill)) { markerStyle.fill = { ...markerStyle.fill, gradient: "linear", rotation: 0, reverse: false }; } return { marker: markerStyle }; } getLegendData(legendType) { if (legendType !== "category") { return []; } const { id: seriesId, visible } = this; const { angleKey, angleName, legendItemName, showInLegend } = this.properties; return [ { legendType: "category", id: seriesId, itemId: angleKey, seriesId, enabled: visible, label: { text: legendItemName ?? angleName ?? angleKey }, symbol: this.legendItemSymbol(), legendItemName, hideInLegend: !showInLegend } ]; } getDatumId(datum) { return createDatumId19(datum.radiusValue); } computeLabelsBBox() { return null; } getStackId() { const groupIndex = this.seriesGrouping?.groupIndex ?? this.id; return `radialBar-stack-${groupIndex}-xValues`; } hasItemStylers() { return this.properties.itemStyler != null || this.properties.styler != null || this.properties.label.itemStyler != null; } }; RadialBarSeries.className = "RadialBarSeries"; RadialBarSeries.type = "radial-bar"; // packages/ag-charts-enterprise/src/series/radial-bar/radialBarSeriesOptionsDef.ts var import_ag_charts_community238 = require("ag-charts-community"); var import_ag_charts_core259 = require("ag-charts-core"); var { radialBarSeriesThemeableOptionsDef } = import_ag_charts_community238._ModuleSupport; var radialBarSeriesOptionsDef = { ...import_ag_charts_core259.commonSeriesOptionsDefs, ...radialBarSeriesThemeableOptionsDef, type: (0, import_ag_charts_core259.required)((0, import_ag_charts_core259.constant)("radial-bar")), angleKey: (0, import_ag_charts_core259.required)(import_ag_charts_core259.string), radiusKey: (0, import_ag_charts_core259.required)(import_ag_charts_core259.string), angleName: import_ag_charts_core259.string, radiusName: import_ag_charts_core259.string, legendItemName: import_ag_charts_core259.string, grouped: import_ag_charts_core259.boolean, stacked: import_ag_charts_core259.boolean, stackGroup: import_ag_charts_core259.string, normalizedTo: import_ag_charts_core259.number }; radialBarSeriesOptionsDef.angleKeyAxis = (0, import_ag_charts_core259.undocumented)(import_ag_charts_core259.string); radialBarSeriesOptionsDef.radiusKeyAxis = (0, import_ag_charts_core259.undocumented)(import_ag_charts_core259.string); // packages/ag-charts-enterprise/src/series/radial-bar/radialBarThemes.ts var import_ag_charts_core260 = require("ag-charts-core"); var RADIAL_BAR_SERIES_THEME = { series: { fill: { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, ["gradient", import_ag_charts_core260.FILL_GRADIENT_CONIC_SERIES_DEFAULTS], ["image", import_ag_charts_core260.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core260.FILL_PATTERN_DEFAULTS] ] }, stroke: { $palette: "stroke" }, strokeWidth: { $isUserOption: ["./stroke", 1, 0] }, label: { ...import_ag_charts_core260.LABEL_BOXING_DEFAULTS, enabled: false, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "chartBackgroundColor" } }, highlight: import_ag_charts_core260.MULTI_SERIES_HIGHLIGHT_STYLE }, axes: { [import_ag_charts_core260.POLAR_AXIS_TYPE.RADIUS_CATEGORY]: { innerRadiusRatio: 0.2, groupPaddingInner: 0.2, paddingInner: 0.2, paddingOuter: 0.1 } } }; // packages/ag-charts-enterprise/src/series/radial-bar/radialBarModule.ts var RadialBarSeriesModule = { type: "series", name: "radial-bar", chartType: "polar", enterprise: true, stackable: true, groupable: true, version: import_ag_charts_community239.VERSION, dependencies: [import_ag_charts_community239.PolarChartModule], options: radialBarSeriesOptionsDef, defaultAxes: { angle: { type: import_ag_charts_core261.POLAR_AXIS_TYPE.ANGLE_NUMBER }, radius: { type: import_ag_charts_core261.POLAR_AXIS_TYPE.RADIUS_CATEGORY } }, axisKeys: { [import_ag_charts_core261.ChartAxisDirection.Angle]: "angleKeyAxis", [import_ag_charts_core261.ChartAxisDirection.Radius]: "radiusKeyAxis" }, themeTemplate: RADIAL_BAR_SERIES_THEME, create: (ctx) => new RadialBarSeries(ctx) }; // packages/ag-charts-enterprise/src/series/radial-column/radialColumnModule.ts var import_ag_charts_community242 = require("ag-charts-community"); var import_ag_charts_core266 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radial-column/radialColumnSeries.ts var import_ag_charts_community240 = require("ag-charts-community"); var import_ag_charts_core263 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radial-column/radialColumnSeriesProperties.ts var import_ag_charts_core262 = require("ag-charts-core"); var RadialColumnSeriesProperties = class extends RadialColumnSeriesBaseProperties { }; __decorateClass([ import_ag_charts_core262.Property ], RadialColumnSeriesProperties.prototype, "columnWidthRatio", 2); __decorateClass([ import_ag_charts_core262.Property ], RadialColumnSeriesProperties.prototype, "maxColumnWidthRatio", 2); // packages/ag-charts-enterprise/src/series/radial-column/radialColumnSeries.ts var { PolarAxis: PolarAxis4, RadialColumnShape, getRadialColumnWidth } = import_ag_charts_community240._ModuleSupport; var RadialColumnSeries = class extends RadialColumnSeriesBase { constructor(moduleCtx) { super(moduleCtx, { animationResetFns: { item: resetRadialColumnSelectionFn } }); this.properties = new RadialColumnSeriesProperties(); } getStackId() { const groupIndex = this.seriesGrouping?.groupIndex ?? this.id; return `radarColumn-stack-${groupIndex}-yValues`; } nodeFactory() { return new RadialColumnShape(); } getColumnTransitionFunctions() { const axisZeroRadius = this.isRadiusAxisReversed() ? this.radius : this.getAxisInnerRadius(); return prepareRadialColumnAnimationFunctions(axisZeroRadius); } isRadiusAxisCircle() { const radiusAxis = this.axes[import_ag_charts_core263.ChartAxisDirection.Radius]; return radiusAxis instanceof PolarAxis4 ? radiusAxis.shape === "circle" : false; } updateItemPath(node, datum, highlight) { node.isBeveled = this.isRadiusAxisCircle(); if (highlight) { node.innerRadius = datum.innerRadius; node.outerRadius = datum.outerRadius; node.startAngle = datum.startAngle; node.endAngle = datum.endAngle; node.columnWidth = datum.columnWidth; node.axisInnerRadius = datum.axisInnerRadius; node.axisOuterRadius = datum.axisOuterRadius; } } getColumnWidth(startAngle, endAngle) { const { columnWidthRatio = 0.5, maxColumnWidthRatio = 0.5 } = this.properties; return getRadialColumnWidth(startAngle, endAngle, this.radius, columnWidthRatio, maxColumnWidthRatio); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.styler != null || this.properties.label.itemStyler != null; } }; RadialColumnSeries.className = "RadialColumnSeries"; RadialColumnSeries.type = "radial-column"; // packages/ag-charts-enterprise/src/series/radial-column/radialColumnSeriesOptionsDef.ts var import_ag_charts_community241 = require("ag-charts-community"); var import_ag_charts_core264 = require("ag-charts-core"); var { radialColumnSeriesThemeableOptionsDef } = import_ag_charts_community241._ModuleSupport; var radialColumnSeriesOptionsDef = { ...import_ag_charts_core264.commonSeriesOptionsDefs, ...radialColumnSeriesThemeableOptionsDef, type: (0, import_ag_charts_core264.required)((0, import_ag_charts_core264.constant)("radial-column")), angleKey: (0, import_ag_charts_core264.required)(import_ag_charts_core264.string), radiusKey: (0, import_ag_charts_core264.required)(import_ag_charts_core264.string), angleName: import_ag_charts_core264.string, radiusName: import_ag_charts_core264.string, legendItemName: import_ag_charts_core264.string, grouped: import_ag_charts_core264.boolean, stacked: import_ag_charts_core264.boolean, stackGroup: import_ag_charts_core264.string, normalizedTo: import_ag_charts_core264.number }; radialColumnSeriesOptionsDef.angleKeyAxis = (0, import_ag_charts_core264.undocumented)(import_ag_charts_core264.string); radialColumnSeriesOptionsDef.radiusKeyAxis = (0, import_ag_charts_core264.undocumented)(import_ag_charts_core264.string); // packages/ag-charts-enterprise/src/series/radial-column/radialColumnThemes.ts var import_ag_charts_core265 = require("ag-charts-core"); var RADIAL_COLUMN_SERIES_THEME = { series: { fill: { $applySwitch: [ { $path: "type" }, { $palette: "fill" }, ["gradient", import_ag_charts_core265.FILL_GRADIENT_RADIAL_SERIES_DEFAULTS], ["image", import_ag_charts_core265.FILL_IMAGE_DEFAULTS], ["pattern", import_ag_charts_core265.FILL_PATTERN_DEFAULTS] ] }, stroke: { $palette: "stroke" }, columnWidthRatio: 0.5, maxColumnWidthRatio: 0.5, strokeWidth: { $isUserOption: ["./stroke", 1, 0] }, label: { ...import_ag_charts_core265.LABEL_BOXING_DEFAULTS, enabled: false, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" } }, highlight: import_ag_charts_core265.MULTI_SERIES_HIGHLIGHT_STYLE }, axes: { [import_ag_charts_core265.POLAR_AXIS_TYPE.ANGLE_CATEGORY]: { shape: { $findFirstSiblingNotOperation: import_ag_charts_core265.POLAR_AXIS_SHAPE.CIRCLE }, groupPaddingInner: 0, paddingInner: 0, label: { spacing: 10 } }, [import_ag_charts_core265.POLAR_AXIS_TYPE.RADIUS_NUMBER]: { shape: { $findFirstSiblingNotOperation: import_ag_charts_core265.POLAR_AXIS_SHAPE.CIRCLE }, innerRadiusRatio: 0.5 } } }; // packages/ag-charts-enterprise/src/series/radial-column/radialColumnModule.ts var RadialColumnSeriesModule = { type: "series", name: "radial-column", chartType: "polar", enterprise: true, stackable: true, groupable: true, version: import_ag_charts_community242.VERSION, dependencies: [import_ag_charts_community242.PolarChartModule], options: radialColumnSeriesOptionsDef, defaultAxes: { angle: { type: import_ag_charts_core266.POLAR_AXIS_TYPE.ANGLE_CATEGORY }, radius: { type: import_ag_charts_core266.POLAR_AXIS_TYPE.RADIUS_NUMBER } }, axisKeys: { [import_ag_charts_core266.ChartAxisDirection.Angle]: "angleKeyAxis", [import_ag_charts_core266.ChartAxisDirection.Radius]: "radiusKeyAxis" }, themeTemplate: RADIAL_COLUMN_SERIES_THEME, create: (ctx) => new RadialColumnSeries(ctx) }; // packages/ag-charts-enterprise/src/series/radial-gauge/radialGaugeModule.ts var import_ag_charts_community247 = require("ag-charts-community"); var import_ag_charts_core270 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radial-gauge/radialGaugeSeries.ts var import_ag_charts_community246 = require("ag-charts-community"); var import_ag_charts_core269 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/radial-gauge/radialGaugeNeedle.ts var import_ag_charts_community243 = require("ag-charts-community"); var { SvgPath, Rotatable, Translatable, Scalable: Scalable2 } = import_ag_charts_community243._ModuleSupport; var RadialGaugeNeedle = class extends Rotatable(Scalable2(Translatable(SvgPath))) { constructor() { super(...arguments); this.scalingCenterX = 0.5; this.scalingCenterY = 0.5; this.rotationCenterX = 0.5; this.rotationCenterY = 0.5; } }; RadialGaugeNeedle.defaultPathData = "M0.50245 0.53745C0.481767 0.53745 0.465 0.520683 0.465 0.5C0.465 0.479317 0.481767 0.46255 0.50245 0.46255L1 0.500012L0.50245 0.53745Z"; // packages/ag-charts-enterprise/src/series/radial-gauge/radialGaugeSeriesProperties.ts var import_ag_charts_community244 = require("ag-charts-community"); var import_ag_charts_core267 = require("ag-charts-core"); var { getColorStops: getColorStops2 } = import_ag_charts_community244._ModuleSupport; var { makeSeriesTooltip: makeSeriesTooltip21, SeriesProperties: SeriesProperties12, AxisLabel: AxisLabel6, Label: Label16 } = import_ag_charts_community244._ModuleSupport; var RadialGaugeDefaultTargetLabelProperties = class extends Label16 { }; __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeDefaultTargetLabelProperties.prototype, "spacing", 2); var RadialGaugeTargetProperties = class extends import_ag_charts_core267.BaseProperties { constructor() { super(...arguments); this.label = new RadialGaugeDefaultTargetLabelProperties(); } getStyle() { const { fill = "black", fillOpacity = 1, stroke: stroke3 = "black", strokeWidth = 0, strokeOpacity = 1, lineDash = [0], lineDashOffset = 0 } = this; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }; } }; __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "text", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "value", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "shape", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "placement", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "size", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "rotation", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeTargetProperties.prototype, "label", 2); var RadialGaugeBarProperties = class extends import_ag_charts_core267.BaseProperties { constructor() { super(...arguments); this.enabled = true; this.fills = new import_ag_charts_core267.PropertiesArray(import_ag_charts_community244._ModuleSupport.StopProperties); this.fillMode = "continuous"; this.fillOpacity = 1; this.stroke = "black"; this.strokeWidth = 0; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; } getStyle(defaultColorRange, scale) { const { enabled, fill, fills, fillMode, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; const barFill = enabled ? fill ?? createConicGradient(fills, fillMode, defaultColorRange, scale) : "none"; return { fill: barFill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }; } }; __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "fills", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "fillMode", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeBarProperties.prototype, "lineDashOffset", 2); var RadialGaugeScaleIntervalProperties = class extends import_ag_charts_core267.BaseProperties { constructor() { super(...arguments); this.values = void 0; this.step = void 0; this.minSpacing = 0; this.maxSpacing = 1e3; } }; __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleIntervalProperties.prototype, "values", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleIntervalProperties.prototype, "step", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleIntervalProperties.prototype, "minSpacing", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleIntervalProperties.prototype, "maxSpacing", 2); var RadialGaugeScaleLabelProperties = class extends AxisLabel6 { }; var RadialGaugeScaleProperties = class extends import_ag_charts_core267.BaseProperties { constructor() { super(...arguments); this.min = 0; this.max = 1; this.fills = new import_ag_charts_core267.PropertiesArray(import_ag_charts_community244._ModuleSupport.StopProperties); this.fillMode = "continuous"; this.fillOpacity = 1; this.stroke = "black"; this.strokeWidth = 0; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; this.defaultFill = "black"; this.interval = new RadialGaugeScaleIntervalProperties(); this.label = new RadialGaugeScaleLabelProperties(); } getStyle(barEnabled, defaultColorRange, scale) { const { fill, fills, defaultFill, fillMode, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset } = this; const scaleFill = fill ?? (barEnabled && fills.length === 0 ? defaultFill : void 0) ?? createConicGradient(fills, fillMode, defaultColorRange, scale); return { fill: scaleFill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }; } }; __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "min", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "max", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "fills", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "fillMode", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "defaultFill", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "interval", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeScaleProperties.prototype, "label", 2); var RadialGaugeNeedleProperties = class extends import_ag_charts_core267.BaseProperties { constructor() { super(...arguments); this.enabled = true; this.spacing = 0; this.fill = "black"; this.fillOpacity = 1; this.stroke = "black"; this.strokeWidth = 0; this.strokeOpacity = 1; this.lineDash = [0]; this.lineDashOffset = 0; } }; __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "enabled", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "radiusRatio", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeNeedleProperties.prototype, "lineDashOffset", 2); var RadialGaugeLabelProperties = class extends AutoSizedLabel { }; __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeLabelProperties.prototype, "text", 2); var RadialGaugeSecondaryLabelProperties = class extends AutoSizedSecondaryLabel { }; __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSecondaryLabelProperties.prototype, "text", 2); var RadialGaugeSeriesProperties = class extends SeriesProperties12 { constructor() { super(...arguments); this.startAngle = 0; this.endAngle = 0; this.segmentation = new GaugeSegmentationProperties(); this.defaultColorRange = []; this.targets = new import_ag_charts_core267.PropertiesArray(RadialGaugeTargetProperties); this.defaultTarget = new RadialGaugeTargetProperties(); this.outerRadiusRatio = 1; this.innerRadiusRatio = 1; this.cornerRadius = 0; this.cornerMode = "container"; this.spacing = 0; this.scale = new RadialGaugeScaleProperties(); this.bar = new RadialGaugeBarProperties(); this.needle = new RadialGaugeNeedleProperties(); this.label = new RadialGaugeLabelProperties(); this.secondaryLabel = new RadialGaugeSecondaryLabelProperties(); this.tooltip = makeSeriesTooltip21(); } }; __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "value", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "startAngle", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "endAngle", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "segmentation", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "defaultColorRange", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "targets", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "defaultTarget", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "outerRadiusRatio", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "innerRadiusRatio", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "outerRadius", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "innerRadius", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "cornerMode", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "scale", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "bar", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "needle", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "secondaryLabel", 2); __decorateClass([ import_ag_charts_core267.Property ], RadialGaugeSeriesProperties.prototype, "tooltip", 2); function createConicGradient(fills, fillMode, defaultColorRange, scale) { const { domain, range: range2 } = scale; const [startAngle, endAngle] = range2; const conicAngle = (0, import_ag_charts_core267.normalizeAngle360)((startAngle + endAngle) / 2 + Math.PI); const sweepAngle = (0, import_ag_charts_core267.normalizeAngle360Inclusive)(endAngle - startAngle); const colorStops = getColorStops2(fills, defaultColorRange, domain, fillMode).map( ({ color: color7, stop }) => { stop = Math.min(Math.max(stop, 0), 1); const angle = startAngle + sweepAngle * stop; stop = (angle - conicAngle) / (2 * Math.PI); stop = (stop % 1 + 1) % 1; return { stop, color: color7 }; } ); return { type: "gradient", gradient: "conic", colorSpace: "oklch", colorStops, bounds: "series", rotation: (0, import_ag_charts_core267.toDegrees)(conicAngle) + 90 }; } // packages/ag-charts-enterprise/src/series/radial-gauge/radialGaugeUtil.ts var import_ag_charts_community245 = require("ag-charts-community"); var import_ag_charts_core268 = require("ag-charts-core"); var { SectorBox: SectorBox5 } = import_ag_charts_community245._ModuleSupport; function computeClipSector(datum) { const { startAngle, endAngle, clipStartAngle, clipEndAngle, innerRadius, outerRadius } = datum; if (clipStartAngle == null || clipEndAngle == null) return; return new SectorBox5( Math.max(clipStartAngle, startAngle), Math.min(clipEndAngle, endAngle), innerRadius, outerRadius ); } function clipSectorVisibility(startAngle, endAngle, clipSector) { return Math.max(startAngle, clipSector.startAngle) <= Math.min(endAngle, clipSector.endAngle); } function hasClipSector(datum) { return datum.clipStartAngle != null && datum.clipEndAngle != null; } function datumClipSector(datum, zero) { const { clipStartAngle, clipEndAngle, innerRadius, outerRadius } = datum; return new SectorBox5(clipStartAngle, zero ? clipStartAngle : clipEndAngle, innerRadius, outerRadius); } function prepareRadialGaugeSeriesAnimationFunctions(initialLoad, initialStartAngle) { const phase = initialLoad ? "initial" : "update"; const node = { fromFn(sect, datum) { const previousDatum = sect.previousDatum; let { startAngle, endAngle } = previousDatum ?? datum; const previousClipSector = previousDatum != null && hasClipSector(previousDatum) ? datumClipSector(previousDatum, initialLoad) : void 0; const nextClipSector = hasClipSector(datum) ? datumClipSector(datum, initialLoad) : void 0; let clipSector; if (previousClipSector != null && nextClipSector != null) { clipSector = previousClipSector; } else if (previousClipSector == null && nextClipSector != null) { clipSector = nextClipSector; startAngle = datum.startAngle; endAngle = datum.endAngle; } else if (previousClipSector != null && nextClipSector == null) { clipSector = void 0; startAngle = datum.startAngle; endAngle = datum.endAngle; } else if (initialLoad) { endAngle = startAngle; } return { startAngle, endAngle, clipSector, phase }; }, toFn(_sect, datum) { const { startAngle, endAngle } = datum; let clipSector; if (hasClipSector(datum)) { clipSector = datumClipSector(datum, false); } return { startAngle, endAngle, clipSector }; }, applyFn(sect, params) { const { startAngle, endAngle } = params; let { clipSector } = params; if (clipSector != null) { clipSector = new SectorBox5( Math.max(startAngle, clipSector.startAngle), Math.min(endAngle, clipSector.endAngle), clipSector.innerRadius, clipSector.outerRadius ); } const visible = clipSector == null || clipSectorVisibility(startAngle, endAngle, clipSector); sect.startAngle = startAngle; sect.endAngle = endAngle; sect.clipSector = clipSector; sect.visible = visible; } }; const needle = { fromFn(needleNode) { let { angle: rotation } = needleNode.previousDatum ?? needleNode.datum; if (initialLoad) { rotation = initialStartAngle; } return { rotation, phase }; }, toFn(_needleNode, datum) { const { angle: rotation } = datum; return { rotation }; } }; return { node, needle }; } function resetRadialGaugeSeriesResetSectorFunction(_node, datum) { const { startAngle, endAngle } = datum; const clipSector = computeClipSector(datum); const visible = clipSector == null || clipSectorVisibility(startAngle, endAngle, clipSector); return { startAngle, endAngle, clipSector, visible }; } function resetRadialGaugeSeriesResetNeedleFunction(_node, datum) { const { angle } = datum; return { rotation: angle }; } var verticalAlignFactors3 = { top: 0, middle: 0.5, bottom: 1 }; function formatRadialGaugeLabels(series, ctx, selection, opts, innerRadius, datumOverrides) { const { padding: padding2, textAlign, verticalAlign } = opts; let labelDatum; let secondaryLabelDatum; selection.each((_node, datum) => { if (datum.label === "primary" /* Primary */) { labelDatum = datum; } else if (datum.label === "secondary" /* Secondary */) { secondaryLabelDatum = datum; } }); if (labelDatum == null) return; const labelText = getLabelText(series.id, ctx, labelDatum, datumOverrides?.label); if (labelText == null) return; const secondaryLabelText = secondaryLabelDatum == null ? void 0 : getLabelText(series.id, ctx, secondaryLabelDatum, datumOverrides?.secondaryLabel); const params = { padding: padding2 }; const horizontalFactor = textAlign === "center" ? 2 : 1; const verticalFactor = verticalAlign === "middle" ? 2 : 1; const sizeFittingHeight = (height2) => ({ width: Math.sqrt(Math.max(innerRadius ** 2 - (height2 / verticalFactor) ** 2, 0)) * horizontalFactor, height: Math.min(height2, verticalFactor * innerRadius), meta: null }); let labelLayout; let secondaryLabelLayout; let height; if (secondaryLabelDatum != null && secondaryLabelText != null) { const layout = formatStackedLabels( (0, import_ag_charts_core268.toPlainText)(labelText), labelDatum, (0, import_ag_charts_core268.toPlainText)(secondaryLabelText), secondaryLabelDatum, params, sizeFittingHeight ); labelLayout = layout?.label; secondaryLabelLayout = layout?.secondaryLabel; height = layout?.height ?? 0; } else { const layout = formatSingleLabel((0, import_ag_charts_core268.toPlainText)(labelText), labelDatum, params, sizeFittingHeight); labelLayout = layout?.[0]; secondaryLabelLayout = void 0; height = layout?.[0].height ?? 0; } const rectYOffset = height * verticalAlignFactors3[verticalAlign]; selection.each((label, datum) => { let layout; if (datum.label === "primary" /* Primary */) { layout = labelLayout; } else if (datum.label === "secondary" /* Secondary */) { layout = secondaryLabelLayout; } if (layout == null) { label.visible = false; return; } label.visible = true; label.text = layout.text; label.fontSize = layout.fontSize; label.lineHeight = layout.lineHeight; label.textAlign = textAlign; label.textBaseline = "middle"; const rectOriginInLabelRect = datum.label === "primary" /* Primary */ ? layout.height / 2 : height - layout.height / 2; label.y = datum.centerY + rectOriginInLabelRect - rectYOffset; label.x = datum.centerX; }); } // packages/ag-charts-enterprise/src/series/radial-gauge/radialGaugeSeries.ts var { fromToMotion: fromToMotion5, resetMotion: resetMotion4, SeriesNodePickMode: SeriesNodePickMode15, createDatumId: createDatumId20, sectorBox, BBox: BBox25, Group: Group20, PointerEvents: PointerEvents12, Selection: Selection16, Sector: Sector6, SectorBox: SectorBox6, Transformable: Transformable4, TransformableText: TransformableText3, Text: Text9, Marker: Marker6 } = import_ag_charts_community246._ModuleSupport; var targetPlacementRotation = { inside: 90, middle: 0, outside: -90 }; var outsideLabelPlacements = [ { textAlign: "left", textBaseline: "top" }, { textAlign: "right", textBaseline: "top" }, { textAlign: "right", textBaseline: "bottom" }, { textAlign: "left", textBaseline: "bottom" } ]; var insideLabelPlacements = [ { textAlign: "right", textBaseline: "bottom" }, { textAlign: "left", textBaseline: "bottom" }, { textAlign: "left", textBaseline: "top" }, { textAlign: "right", textBaseline: "top" } ]; var RadialGaugeSeries = class extends import_ag_charts_community246._ModuleSupport.Series { constructor(moduleCtx) { super({ moduleCtx, pickModes: [SeriesNodePickMode15.EXACT_SHAPE_MATCH, SeriesNodePickMode15.NEAREST_NODE] }); this.centerX = 0; this.centerY = 0; this.radius = 0; this.textAlign = "center"; this.verticalAlign = "middle"; this.properties = new RadialGaugeSeriesProperties(); this.scale = new LinearAngleScale(); this.scaleGroup = this.contentGroup.appendChild(new Group20({ name: "scaleGroup" })); this.itemGroup = this.contentGroup.appendChild(new Group20({ name: "itemGroup" })); this.itemNeedleGroup = this.contentGroup.appendChild(new Group20({ name: "itemNeedleGroup" })); this.itemTargetGroup = this.contentGroup.appendChild(new Group20({ name: "itemTargetGroup" })); this.itemTargetLabelGroup = this.contentGroup.appendChild(new Group20({ name: "itemTargetLabelGroup" })); this.itemLabelGroup = this.contentGroup.appendChild(new Group20({ name: "itemLabelGroup" })); this.highlightTargetGroup = this.highlightGroup.appendChild( new Group20({ name: "itemTargetLabelGroup" }) ); this.tickGroup = this.contentGroup.appendChild(new Group20({ name: "tickGroup" })); this.scaleSelection = Selection16.select( this.scaleGroup, () => this.nodeFactory() ); this.datumSelection = Selection16.select( this.itemGroup, () => this.nodeFactory() ); this.needleSelection = Selection16.select( this.itemNeedleGroup, RadialGaugeNeedle ); this.targetSelection = Selection16.select( this.itemTargetGroup, () => this.markerFactory() ); this.targetLabelSelection = Selection16.select(this.itemTargetLabelGroup, Text9); this.labelSelection = Selection16.select( this.itemLabelGroup, Text9 ); this.highlightTargetSelection = Selection16.select(this.highlightTargetGroup, () => this.markerFactory()); this.tickSelection = Selection16.select(this.tickGroup, import_ag_charts_community246._ModuleSupport.TransformableText); this.datumUnion = new DatumUnion(); this.animationState = new import_ag_charts_core269.StateMachine("empty", { empty: { update: { target: "ready", action: () => this.animateEmptyUpdateReady() }, reset: "empty", skip: "ready" }, ready: { updateData: "waiting", clear: "clearing", resize: () => this.animateReadyResize(), reset: "empty", skip: "ready" }, waiting: { update: { target: "ready", action: () => this.animateWaitingUpdateReady() }, reset: "empty", skip: "ready" }, clearing: { update: { target: "empty" }, reset: "empty", skip: "ready" } }); this.scaleGroup.pointerEvents = PointerEvents12.None; this.tickGroup.pointerEvents = PointerEvents12.None; this.itemNeedleGroup.pointerEvents = PointerEvents12.None; this.itemLabelGroup.pointerEvents = PointerEvents12.None; } get hasData() { return this.properties.value != null; } nodeFactory() { return new Sector6(); } markerFactory() { const marker = new Marker6(); marker.size = 1; return marker; } processData() { this.nodeDataRefresh = true; this.animationState.transition("updateData"); } formatLabel(value) { const { min, max } = this.properties.scale; return formatLabel(value, { min, max }); } layoutScale() { const { scale, properties } = this; const { seriesRectWidth, seriesRectHeight } = this.nodeDataDependencies; const { scale: scaleProps, outerRadius } = this.properties; const { min, max, label, interval } = scaleProps; const startAngle = (0, import_ag_charts_core269.toRadians)(properties.startAngle - 90); const endAngle = (0, import_ag_charts_core269.toRadians)(properties.endAngle - 90); const sweepAngle = (0, import_ag_charts_core269.normalizeAngle360Inclusive)(endAngle - startAngle); const largerThanHalf = sweepAngle > Math.PI; const containsTop = largerThanHalf || (0, import_ag_charts_core269.isBetweenAngles)(1.5 * Math.PI, startAngle, endAngle); const containsRight = largerThanHalf || (0, import_ag_charts_core269.isBetweenAngles)(0 * Math.PI, startAngle, endAngle); const containsBottom = largerThanHalf || (0, import_ag_charts_core269.isBetweenAngles)(0.5 * Math.PI, startAngle, endAngle); const containsLeft = largerThanHalf || (0, import_ag_charts_core269.isBetweenAngles)(1 * Math.PI, startAngle, endAngle); let textAlign; if (containsLeft && !containsRight) { textAlign = "right"; } else if (!containsLeft && containsRight) { textAlign = "left"; } else { textAlign = "center"; } let verticalAlign; if (containsTop && !containsBottom) { verticalAlign = "bottom"; } else if (!containsTop && containsBottom) { verticalAlign = "top"; } else { verticalAlign = "middle"; } const unitBox = sectorBox({ startAngle, endAngle, innerRadius: 0, outerRadius: 0.5 }); const centerXOffset = -(unitBox.x + unitBox.width / 2) * 2; const centerYOffset = -(unitBox.y + unitBox.height / 2) * 2; const unitBoxSize = Math.min(seriesRectWidth / unitBox.width, seriesRectHeight / unitBox.height); scale.domain = [min, max]; scale.range = [startAngle, endAngle]; scale.arcLength = unitBoxSize / 2; const { maxSpacing, minSpacing } = interval; const { arcLength } = scale; const minTickCount = maxSpacing ? Math.floor(arcLength / maxSpacing) : 1; const maxTickCount = minSpacing ? Math.floor(arcLength / minSpacing) : Infinity; const preferredTickCount = Math.floor(4 / Math.PI * Math.abs(scale.range[0] - scale.range[1])); const tickCount = Math.max(minTickCount, Math.min(maxTickCount, preferredTickCount)); const ticks = interval.values ?? scale.ticks({ nice: [false, false], interval: interval.step, minTickCount, maxTickCount, tickCount })?.ticks ?? []; const tickFormatter = (0, import_ag_charts_core269.tickFormat)(ticks, typeof label.format === "string" ? label.format : void 0); const tickData = []; for (const [index, value] of ticks.entries()) { let text2; if (label.formatter) { text2 = formatWithContext(this.ctx, label.formatter, { value, index, domain: scale.domain, boundSeries: void 0 }); } text2 ?? (text2 = tickFormatter?.(value)); if (text2 == null) continue; tickData.push({ index, value, text: text2 }); } const baseRadius = 0.5 * unitBoxSize; const labelInset = label.enabled && outerRadius == null && tickData.length > 0 ? this.getTickLabelInset({ tickData, radius: baseRadius, centerXOffset, centerYOffset, seriesRectWidth, seriesRectHeight, spacing: label.spacing, rotation: (0, import_ag_charts_core269.toRadians)(label.rotation ?? 0) }) : 0; const radiusBounds = Math.max( baseRadius - labelInset, // seriesRect may have negative size 0 ); const radius = outerRadius ?? radiusBounds; this.centerX = seriesRectWidth / 2 + centerXOffset * radius; this.centerY = seriesRectHeight / 2 + centerYOffset * radius; this.radius = radius; this.textAlign = textAlign; this.verticalAlign = verticalAlign; return tickData; } getShapeFillBBox() { const { centerX, centerY, radius } = this; const bbox = new BBox25(centerX - radius, centerY - radius, 2 * radius, 2 * radius); return { series: bbox, axis: bbox }; } getTargets() { const { properties } = this; const defaultTarget = properties.defaultTarget; return properties.targets.map((target) => { const { text: text2 = defaultTarget.text, value = defaultTarget.value ?? 0, shape = defaultTarget.shape ?? "triangle", rotation = defaultTarget.rotation ?? 0, placement = defaultTarget.placement ?? "middle", spacing = defaultTarget.spacing ?? 0, size = defaultTarget.size ?? 0 } = target; const { enabled: labelEnabled = defaultTarget.label.enabled, color: labelColor = defaultTarget.label.color ?? "black", fontStyle: labelFontStyle = defaultTarget.label.fontStyle ?? "normal", fontWeight: labelFontWeight = defaultTarget.label.fontWeight ?? "normal", fontSize: labelFontSize = defaultTarget.label.fontSize, fontFamily: labelFontFamily = defaultTarget.label.fontFamily, spacing: labelSpacing = defaultTarget.label.spacing ?? 0 } = target.label; return { text: text2, value, shape, placement, spacing, size, rotation, label: { enabled: labelEnabled, color: labelColor, fontStyle: labelFontStyle, fontWeight: labelFontWeight, fontSize: labelFontSize, fontFamily: labelFontFamily, spacing: labelSpacing }, style: target.getStyle() }; }); } getTargetRadius(target) { const { radius, properties } = this; const { innerRadiusRatio, outerRadiusRatio } = properties; const { placement, spacing, size } = target; const outerRadius = radius * outerRadiusRatio; const innerRadius = radius * innerRadiusRatio; switch (placement) { case "inside": return Math.max(innerRadius - spacing - size / 2, 0); case "outside": return outerRadius + spacing + size / 2; default: return (innerRadius + outerRadius) / 2; } } getTargetLabel(target) { const { scale } = this; const { value, size, placement, label } = target; const { spacing, color: fill, fontStyle, fontWeight, fontSize, fontFamily } = label; const angle = scale.convert(value); const quadrant = Math.trunc((0, import_ag_charts_core269.normalizeAngle360)(angle) / (Math.PI / 2)); const offset = size / 2 + spacing; let textAlign; let textBaseline; let offsetX; let offsetY; switch (placement) { case "outside": ({ textAlign, textBaseline } = outsideLabelPlacements[quadrant]); offsetX = offset * Math.cos(angle); offsetY = offset * Math.sin(angle); break; case "inside": ({ textAlign, textBaseline } = insideLabelPlacements[quadrant]); offsetX = -offset * Math.cos(angle); offsetY = -offset * Math.sin(angle); break; default: textAlign = "center"; textBaseline = "bottom"; offsetX = 0; offsetY = -offset; break; } return { offsetX, offsetY, fill, textAlign, textBaseline, fontStyle, fontWeight, fontSize, fontFamily, lineHeight: void 0 }; } createNodeData() { const tickData = this.layoutScale(); const { id: seriesId, scale, properties, radius, centerX, centerY } = this; const { value, innerRadiusRatio, outerRadiusRatio, segmentation, cornerRadius, cornerMode, needle, bar, scale: scaleProps, label, secondaryLabel } = properties; const { outerRadius = radius * outerRadiusRatio, innerRadius = radius * innerRadiusRatio, defaultColorRange } = properties; const targets = this.getTargets(); const nodeData = []; const targetData = []; const needleData = []; const labelData = []; const scaleData = []; const cornersOnAllItems = cornerMode === "item"; const containerStartAngle = scale.convert(scale.domain[0]); const containerEndAngle = scale.convert(value); const maxTicks = Math.ceil((0, import_ag_charts_core269.normalizeAngle360Inclusive)(containerEndAngle - containerStartAngle) * radius); let segments = segmentation.enabled ? segmentation.interval.getSegments(scale, maxTicks) : void 0; const barStyle = bar.getStyle(defaultColorRange, scale); const scaleStyle = scaleProps.getStyle(bar.enabled, defaultColorRange, scale); if (segments == null && cornersOnAllItems) { const segmentStart = Math.min(...scale.domain); const segmentEnd = Math.max(...scale.domain); const datum = { value, segmentStart, segmentEnd }; const appliedCornerRadius = Math.min(cornerRadius, (outerRadius - innerRadius) / 2); const angleInset = appliedCornerRadius / ((innerRadius + outerRadius) / 2); nodeData.push({ series: this, itemId: `value`, datum, datumIndex: { type: 0 /* Node */ }, type: 0 /* Node */, centerX, centerY, outerRadius, innerRadius, startAngle: containerStartAngle - angleInset, endAngle: containerEndAngle + angleInset, clipStartAngle: void 0, clipEndAngle: void 0, startCornerRadius: cornerRadius, endCornerRadius: cornerRadius, style: barStyle }); scaleData.push({ series: this, itemId: `scale`, datum, datumIndex: { type: 0 /* Node */ }, type: 0 /* Node */, centerX, centerY, outerRadius, innerRadius, startAngle: scale.range[0] - angleInset, endAngle: scale.range[1] + angleInset, clipStartAngle: void 0, clipEndAngle: void 0, startCornerRadius: cornerRadius, endCornerRadius: cornerRadius, style: scaleStyle }); } else { segments ?? (segments = scale.domain); for (let i = 0; i < segments.length - 1; i++) { const segmentStart = segments[i]; const segmentEnd = segments[i + 1]; const datum = { value, segmentStart, segmentEnd }; const isStart = i === 0; const isEnd = i === segments.length - 2; const itemStartAngle = scale.convert(segmentStart); const itemEndAngle = scale.convert(segmentEnd); nodeData.push({ series: this, itemId: `value-${i}`, datum, datumIndex: { type: 0 /* Node */ }, type: 0 /* Node */, centerX, centerY, outerRadius, innerRadius, startAngle: itemStartAngle, endAngle: itemEndAngle, clipStartAngle: containerStartAngle, clipEndAngle: containerEndAngle, startCornerRadius: cornersOnAllItems || isStart ? cornerRadius : 0, endCornerRadius: cornersOnAllItems || isEnd ? cornerRadius : 0, style: barStyle }); scaleData.push({ series: this, itemId: `scale-${i}`, datum, datumIndex: { type: 0 /* Node */ }, type: 0 /* Node */, centerX, centerY, outerRadius, innerRadius, startAngle: itemStartAngle, endAngle: itemEndAngle, clipStartAngle: void 0, clipEndAngle: void 0, startCornerRadius: cornersOnAllItems || isStart ? cornerRadius : 0, endCornerRadius: cornersOnAllItems || isEnd ? cornerRadius : 0, style: scaleStyle }); } } if (!needle.enabled && label.enabled) { const { text: text2, color: fill, fontSize, minimumFontSize, fontStyle, fontWeight, fontFamily, lineHeight, formatter = (params) => this.formatLabel(params.value) } = label; labelData.push({ label: "primary" /* Primary */, centerX, centerY, text: text2, value, fill, fontSize, minimumFontSize, fontStyle, fontWeight, fontFamily, lineHeight, formatter }); } if (!needle.enabled && secondaryLabel.enabled) { const { text: text2, color: fill, fontSize, minimumFontSize, fontStyle, fontWeight, fontFamily, lineHeight, formatter } = secondaryLabel; labelData.push({ label: "secondary" /* Secondary */, centerX, centerY, text: text2, value, fill, fontSize, minimumFontSize, fontStyle, fontWeight, fontFamily, lineHeight, formatter }); } if (needle.enabled) { let needleRadius = needle.radiusRatio == null ? innerRadius : radius * needle.radiusRatio; needleRadius = Math.max(needleRadius - needle.spacing, 0); const needleAngle = scale.convert(value); needleData.push({ centerX, centerY, radius: needleRadius, angle: needleAngle, series: this }); } for (let i = 0; i < targets.length; i += 1) { const target = targets[i]; const { value: targetValue, text: text2, size, shape, style } = target; if (targetValue < Math.min(...scale.domain) || targetValue > Math.max(...scale.domain)) { continue; } const targetRadius = this.getTargetRadius(target); const targetAngle = scale.convert(targetValue); const targetRotation = (0, import_ag_charts_core269.toRadians)(target.rotation + targetPlacementRotation[target.placement]); targetData.push({ series: this, itemId: `target-${i}`, midPoint: { x: targetRadius * Math.cos(targetAngle) + centerX, y: targetRadius * Math.sin(targetAngle) + centerY }, datum: { value: targetValue }, datumIndex: { type: 1 /* Target */, index: i }, type: 1 /* Target */, value: targetValue, text: text2, centerX, centerY, shape, radius: targetRadius, angle: targetAngle, rotation: targetRotation, size, label: this.getTargetLabel(target), style }); } return { itemId: seriesId, nodeData, needleData, targetData, labelData, scaleData, tickData }; } findNodeDatum(itemId) { return findGaugeNodeDatum(this, itemId); } updateSelections(resize) { if (this.nodeDataRefresh || resize) { this.contextNodeData = this.createNodeData(); this.nodeDataRefresh = false; } } highlightDatum(node) { if (node?.series === this && node.type === 1 /* Target */) { return node; } } update({ seriesRect }) { const { datumSelection, labelSelection, needleSelection, targetSelection, targetLabelSelection, scaleSelection, highlightTargetSelection, tickSelection } = this; const resize = this.checkResize(seriesRect); this.updateSelections(resize); this.contentGroup.visible = this.visible; this.contentGroup.opacity = this.getOpacity(); const nodeData = this.contextNodeData?.nodeData ?? []; const labelData = this.contextNodeData?.labelData ?? []; const needleData = this.contextNodeData?.needleData ?? []; const targetData = this.contextNodeData?.targetData ?? []; const scaleData = this.contextNodeData?.scaleData ?? []; const tickData = this.contextNodeData?.tickData ?? []; const highlightTargetDatum = this.highlightDatum(this.ctx.highlightManager.getActiveHighlight()); this.scaleSelection = this.updateScaleSelection({ scaleData, scaleSelection }); this.updateScaleNodes({ scaleSelection }); this.needleSelection = this.updateNeedleSelection({ needleData, needleSelection }); this.updateNeedleNodes({ needleSelection }); this.targetSelection = this.updateTargetSelection({ targetData, targetSelection }); this.updateTargetStyles({ targetSelection, isHighlight: false }); this.updateTargetNodes({ targetSelection }); this.targetLabelSelection = this.updateTargetLabelSelection({ targetData, targetLabelSelection }); this.updateTargetLabelNodes({ targetLabelSelection }); this.datumSelection = this.updateDatumSelection({ nodeData, datumSelection }); this.updateDatumNodes({ datumSelection }); this.labelSelection = this.updateLabelSelection({ labelData, labelSelection }); this.updateLabelNodes({ labelSelection }); this.highlightTargetSelection = this.updateTargetSelection({ targetData: highlightTargetDatum == null ? [] : [highlightTargetDatum], targetSelection: highlightTargetSelection }); this.updateTargetStyles({ targetSelection: highlightTargetSelection, isHighlight: true }); this.updateTargetNodes({ targetSelection: highlightTargetSelection }); this.tickSelection = this.updateTickSelection({ tickData, tickSelection }); this.updateTickNodes({ tickSelection }); if (resize) { this.animationState.transition("resize"); } this.animationState.transition("update"); } updateDatumSelection(opts) { return opts.datumSelection.update(opts.nodeData, void 0, (datum) => { return createDatumId20(opts.nodeData.length, datum.itemId); }); } updateDatumNodes(opts) { const { datumSelection } = opts; const { ctx, properties } = this; const { segmentation } = properties; const sectorSpacing = segmentation.spacing ?? 0; const animationDisabled = ctx.animationManager.isSkipped(); const fillBBox = this.getShapeFillBBox(); datumSelection.each((sector, datum) => { const { centerX, centerY, innerRadius, outerRadius, startCornerRadius, endCornerRadius } = datum; sector.centerX = centerX; sector.centerY = centerY; sector.innerRadius = innerRadius; sector.outerRadius = outerRadius; sector.pointerEvents = this.properties.bar.enabled ? import_ag_charts_community246._ModuleSupport.PointerEvents.All : import_ag_charts_community246._ModuleSupport.PointerEvents.None; sector.setStyleProperties(datum.style, fillBBox); sector.startOuterCornerRadius = startCornerRadius; sector.startInnerCornerRadius = startCornerRadius; sector.endOuterCornerRadius = endCornerRadius; sector.endInnerCornerRadius = endCornerRadius; sector.radialEdgeInset = (sectorSpacing + sector.strokeWidth) / 2; sector.concentricEdgeInset = sector.strokeWidth / 2; datum.midPoint = sector.getBBox().computeCenter(); if (animationDisabled || sector.previousDatum == null) { sector.setProperties(resetRadialGaugeSeriesResetSectorFunction(sector, datum)); } }); this.datumUnion.update(datumSelection, this.itemGroup, import_ag_charts_community246._ModuleSupport.Sector, (node, first, last) => { node.clipSector ?? (node.clipSector = new SectorBox6(Number.NaN, Number.NaN, Number.NaN, Number.NaN)); node.centerX = first.centerX; node.centerY = first.centerY; node.outerRadius = node.clipSector.outerRadius = first.outerRadius; node.innerRadius = node.clipSector.innerRadius = first.innerRadius; node.startAngle = node.clipSector.startAngle = first.startAngle; node.startInnerCornerRadius = first.startInnerCornerRadius; node.startOuterCornerRadius = first.startOuterCornerRadius; node.endAngle = last.endAngle; node.clipSector.endAngle = last.clipSector?.endAngle ?? last.endAngle; node.endInnerCornerRadius = last.endInnerCornerRadius; node.endOuterCornerRadius = last.endOuterCornerRadius; node.pointerEvents = import_ag_charts_community246._ModuleSupport.PointerEvents.None; }); } updateScaleSelection(opts) { return opts.scaleSelection.update(opts.scaleData, void 0, (datum) => { return createDatumId20(opts.scaleData.length, datum.itemId); }); } updateScaleNodes(opts) { const { scaleSelection } = opts; const { segmentation } = this.properties; const sectorSpacing = segmentation.spacing ?? 0; const fillBBox = this.getShapeFillBBox(); scaleSelection.each((sector, datum) => { const { centerX, centerY, innerRadius, outerRadius, startCornerRadius, endCornerRadius } = datum; sector.centerX = centerX; sector.centerY = centerY; sector.innerRadius = innerRadius; sector.outerRadius = outerRadius; sector.setStyleProperties(datum.style, fillBBox); sector.startOuterCornerRadius = startCornerRadius; sector.startInnerCornerRadius = startCornerRadius; sector.endOuterCornerRadius = endCornerRadius; sector.endInnerCornerRadius = endCornerRadius; sector.radialEdgeInset = (sectorSpacing + sector.strokeWidth) / 2; sector.concentricEdgeInset = sector.strokeWidth / 2; sector.setProperties(resetRadialGaugeSeriesResetSectorFunction(sector, datum)); }); } updateNeedleSelection(opts) { return opts.needleSelection.update(opts.needleData, void 0, () => createDatumId20(0)); } updateNeedleNodes(opts) { const { needleSelection } = opts; const { fill, fillOpacity, stroke: stroke3, strokeOpacity, strokeWidth, lineDash, lineDashOffset } = this.properties.needle; const animationDisabled = this.ctx.animationManager.isSkipped(); needleSelection.each((needle, datum) => { const { centerX, centerY, radius } = datum; const scale = radius * 2; needle.d = RadialGaugeNeedle.defaultPathData; needle.setStyleProperties({ fill, fillOpacity, stroke: stroke3, strokeOpacity, strokeWidth: strokeWidth / scale, lineDash: lineDash.map((d) => d / scale), lineDashOffset: lineDashOffset / scale }); needle.translationX = centerX; needle.translationY = centerY; needle.scalingX = scale; needle.scalingY = scale; if (animationDisabled) { needle.setProperties(resetRadialGaugeSeriesResetNeedleFunction(needle, datum)); } }); } updateTargetSelection(opts) { return opts.targetSelection.update(opts.targetData, void 0, (target) => target.itemId); } updateTargetStyles({ targetSelection, isHighlight }) { targetSelection.each((_, datum) => { datum.style = this.getTargetStyle(isHighlight, datum); }); } updateTargetNodes({ targetSelection }) { targetSelection.each((target, datum) => { const { centerX, centerY, angle, radius, shape, size, rotation } = datum; target.setStyleProperties(datum.style); target.size = size; target.shape = shape === "line" ? lineMarker : shape; target.translationX = centerX + radius * Math.cos(angle); target.translationY = centerY + radius * Math.sin(angle); target.rotation = angle + rotation; }); } getTargetStyle(isHighlight, { datumIndex, style }) { const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); return (0, import_ag_charts_core269.mergeDefaults)(highlightStyle, { ...style, opacity: 1 }); } updateTargetLabelSelection(opts) { return opts.targetLabelSelection.update(opts.targetData, void 0, (target) => target.itemId); } updateTargetLabelNodes(opts) { const { targetLabelSelection } = opts; targetLabelSelection.each((label, target) => { const { centerX, centerY, radius, angle, text: text2 } = target; const { offsetX, offsetY, fill, fontStyle, fontWeight, fontSize, fontFamily, textAlign, textBaseline } = target.label; if (text2 == null) { label.visible = false; return; } label.visible = true; label.x = centerX + radius * Math.cos(angle) + offsetX; label.y = centerY + radius * Math.sin(angle) + offsetY; label.text = text2; label.fill = fill; label.fontStyle = fontStyle; label.fontWeight = fontWeight; label.fontSize = fontSize; label.fontFamily = fontFamily; label.textAlign = textAlign; label.textBaseline = textBaseline; }); } updateLabelSelection(opts) { return opts.labelSelection.update(opts.labelData, void 0, (datum) => datum.label); } updateLabelNodes(opts) { const { labelSelection } = opts; const animationDisabled = this.ctx.animationManager.isSkipped(); labelSelection.each((label, datum) => { label.fill = datum.fill; label.fontStyle = datum.fontStyle; label.fontWeight = datum.fontWeight; label.fontFamily = datum.fontFamily; }); if (animationDisabled || this.labelsHaveExplicitText()) { this.formatLabelText(); } } updateTickSelection(opts) { return opts.tickSelection.update(opts.tickData, void 0, (datum) => datum.index); } updateTickNodes(opts) { const { scale, radius, centerX, centerY, properties } = this; const { enabled, color: color7, fontFamily, fontSize, fontStyle, fontWeight, spacing } = properties.scale.label; const rotation = (0, import_ag_charts_core269.toRadians)(properties.scale.label.rotation ?? 0); opts.tickSelection.each((label, datum) => { if (!enabled) { label.visible = false; return; } label.visible = true; label.text = datum.text; label.fill = color7; label.fontFamily = fontFamily; label.fontSize = fontSize; label.fontStyle = fontStyle; label.fontWeight = fontWeight; const angle = scale.convert(datum.value); const { textAlign, textBaseline } = this.getTickLabelAlign(angle); const x0 = centerX + (radius + spacing) * Math.cos(angle); const y0 = centerY + (radius + spacing) * Math.sin(angle); label.textAlign = textAlign; label.textBaseline = textBaseline; label.x = x0; label.y = y0; label.rotationCenterX = x0; label.rotationCenterY = y0; label.rotation = rotation; }); } getTickLabelAlign(tickAngle) { const cos = Math.cos(tickAngle); const sin = Math.sin(tickAngle); let textAlign; let textBaseline; const isCos0 = (0, import_ag_charts_core269.isNumberEqual)(cos, 0); const isSin0 = (0, import_ag_charts_core269.isNumberEqual)(sin, 0); const isCosPositive = cos > 0 && !isCos0; const isSinPositive = sin > 0 && !isSin0; textAlign = "right"; if (isCos0) { textAlign = "center"; } else if (isCosPositive) { textAlign = "left"; } textBaseline = "bottom"; if (isSin0) { textBaseline = "middle"; } else if (isSinPositive) { textBaseline = "top"; } return { textAlign, textBaseline }; } getTickLabelInset(params) { const { tickData, radius, centerXOffset, centerYOffset, seriesRectWidth, seriesRectHeight, spacing, rotation } = params; const { label } = this.properties.scale; const centerX = seriesRectWidth / 2 + centerXOffset * radius; const centerY = seriesRectHeight / 2 + centerYOffset * radius; const tempText = new TransformableText3(); tempText.fontFamily = label.fontFamily; tempText.fontSize = label.fontSize; tempText.fontStyle = label.fontStyle; tempText.fontWeight = label.fontWeight; tempText.rotation = rotation; const minComponent = 1e-6; let inset = 0; for (const datum of tickData) { const angle = this.scale.convert(datum.value); const cos = Math.cos(angle); const sin = Math.sin(angle); const x = centerX + (radius + spacing) * cos; const y = centerY + (radius + spacing) * sin; const { textAlign, textBaseline } = this.getTickLabelAlign(angle); tempText.text = datum.text; tempText.x = x; tempText.y = y; tempText.textAlign = textAlign; tempText.textBaseline = textBaseline; tempText.rotationCenterX = x; tempText.rotationCenterY = y; const box = rotation ? Transformable4.toCanvas(tempText) : tempText.getBBox(); if (box == null) continue; const minX = box.x; const maxX = box.x + box.width; const minY = box.y; const maxY = box.y + box.height; const overflowLeft = Math.max(0, -minX); const overflowRight = Math.max(0, maxX - seriesRectWidth); const overflowTop = Math.max(0, -minY); const overflowBottom = Math.max(0, maxY - seriesRectHeight); const dxPerRadius = centerXOffset + cos; if (Math.abs(dxPerRadius) > minComponent) { if (overflowRight > 0 && dxPerRadius > 0) { inset = Math.max(inset, overflowRight / dxPerRadius); } else if (overflowLeft > 0 && dxPerRadius < 0) { inset = Math.max(inset, overflowLeft / -dxPerRadius); } } const dyPerRadius = centerYOffset + sin; if (Math.abs(dyPerRadius) > minComponent) { if (overflowBottom > 0 && dyPerRadius > 0) { inset = Math.max(inset, overflowBottom / dyPerRadius); } else if (overflowTop > 0 && dyPerRadius < 0) { inset = Math.max(inset, overflowTop / -dyPerRadius); } } } return inset; } labelsHaveExplicitText() { for (const { datum } of this.labelSelection) { if (datum.text == null) { return false; } } return true; } formatLabelText(datum) { const { labelSelection, radius, textAlign, verticalAlign } = this; const { spacing: padding2, innerRadiusRatio } = this.properties; formatRadialGaugeLabels( this, this.ctx, labelSelection, { padding: padding2, textAlign, verticalAlign }, radius * innerRadiusRatio, datum ); } resetAllAnimation() { this.ctx.animationManager.stopByAnimationGroupId(this.id); resetMotion4([this.datumSelection], resetRadialGaugeSeriesResetSectorFunction); resetMotion4([this.needleSelection], resetRadialGaugeSeriesResetNeedleFunction); this.formatLabelText(); } resetAnimation(phase) { if (phase === "initial") { this.animationState.transition("reset"); } else if (phase === "ready") { this.animationState.transition("skip"); } } animateLabelText(params = {}) { const { animationManager } = this.ctx; let labelFrom; let labelTo; let secondaryLabelFrom; let secondaryLabelTo; this.labelSelection.each((label, datum) => { label.opacity = 1; if (datum.label === "primary" /* Primary */) { labelFrom = label.previousDatum?.value ?? params.from ?? datum.value; labelTo = datum.value; } else if (datum.label === "secondary" /* Secondary */) { secondaryLabelFrom = label.previousDatum?.value ?? params.from ?? datum.value; secondaryLabelTo = datum.value; } }); if (this.labelsHaveExplicitText()) { } else if (labelTo == null || secondaryLabelTo == null) { this.formatLabelText(); } else if (labelFrom === labelTo && secondaryLabelFrom === secondaryLabelTo) { this.formatLabelText({ label: labelTo, secondaryLabel: secondaryLabelTo }); } else { const animationId = `${this.id}_labels`; animationManager.animate({ id: animationId, groupId: "label", from: { label: labelFrom, secondaryLabel: secondaryLabelFrom }, to: { label: labelTo, secondaryLabel: secondaryLabelTo }, phase: params.phase ?? "update", onUpdate: (datum) => this.formatLabelText(datum), onStop: () => this.formatLabelText({ label: labelTo, secondaryLabel: secondaryLabelTo }) }); } } animateEmptyUpdateReady() { const { animationManager } = this.ctx; const { node, needle } = prepareRadialGaugeSeriesAnimationFunctions(true, this.scale.range[0]); fromToMotion5(this.id, "node", animationManager, [this.datumSelection], node, (_sector, datum) => datum.itemId); fromToMotion5(this.id, "needle", animationManager, [this.needleSelection], needle, () => "needle"); fromToMotion5( this.id, "label", animationManager, [this.labelSelection], fadeInFns, (_label, datum) => datum.label ); this.animateLabelText({ from: this.properties.scale.min, phase: "initial" }); } animateWaitingUpdateReady() { const { animationManager } = this.ctx; const { node, needle } = prepareRadialGaugeSeriesAnimationFunctions(false, this.scale.range[0]); fromToMotion5(this.id, "node", animationManager, [this.datumSelection], node, (_sector, datum) => datum.itemId); fromToMotion5(this.id, "needle", animationManager, [this.needleSelection], needle, () => "needle"); this.animateLabelText(); } animateReadyResize() { this.resetAllAnimation(); } dataCount() { return Number.NaN; } getSeriesDomain() { return { domain: [Number.NaN, Number.NaN] }; } getSeriesRange() { return [Number.NaN, Number.NaN]; } getLegendData() { return []; } getTooltipContent(datumIndex) { const { id: seriesId, properties } = this; const { tooltip } = properties; let value; let text2; let fallbackLabel; if (datumIndex.type === 0 /* Node */) { value = properties.value; text2 = properties.label.text; fallbackLabel = this.ctx.localeManager.t("ariaLabelGaugeValue"); } else { ({ value, text: text2 } = properties.targets[datumIndex.index]); fallbackLabel = this.ctx.localeManager.t("ariaLabelGaugeTarget"); } if (value == null) return; return this.formatTooltipWithContext( tooltip, { data: [{ label: text2, fallbackLabel, value: this.formatLabel(value) }] }, { seriesId, title: void 0, datum: void 0, value } ); } pickNodeClosestDatum(point) { return pickGaugeNearestDatum(this, point); } pickFocus(opts) { return pickGaugeFocus(this, opts); } getCaptionText() { const { value } = this.properties; const description = []; description.push(this.formatLabel(value)); this.labelSelection.each((_label, datum) => { const text2 = getLabelText(this.id, this.ctx, datum); if (text2 != null) { description.push((0, import_ag_charts_core269.toPlainText)(text2)); } }); return description.join(". "); } getCategoryValue(_datumIndex) { return; } datumIndexForCategoryValue(_categoryValue) { return; } hasItemStylers() { return this.properties.label.itemStyler != null; } }; RadialGaugeSeries.className = "RadialGaugeSeries"; RadialGaugeSeries.type = "radial-gauge"; // packages/ag-charts-enterprise/src/series/radial-gauge/radialGaugeModule.ts var RadialGaugeModule = { type: "series", name: "radial-gauge", chartType: "standalone", enterprise: true, dependencies: [GaugePresetModule], version: import_ag_charts_community247.VERSION, options: import_ag_charts_core270.radialGaugeSeriesOptionsDef, themeTemplate: { minWidth: 200, minHeight: 200, tooltip: { enabled: false }, series: { outerRadiusRatio: 1, innerRadiusRatio: 0.8, startAngle: 270, endAngle: 270 + 180, defaultColorRange: { $if: [ { $eq: [{ $palette: "type" }, "inbuilt"] }, { $interpolate: [{ $palette: "secondDivergingColors" }, 5] }, import_ag_charts_core270.SAFE_RANGE2_OPERATION ] }, scale: { defaultFill: { $path: ["/1", { $palette: "fill" }, { $palette: "hierarchyColors" }] }, // TODO: mix backgroundColor and foregroundColor? stroke: { $path: ["/2", import_ag_charts_core270.SAFE_STROKE_FILL_OPERATION, { $palette: "hierarchyColors" }] }, // TODO: mix backgroundColor and foregroundColor? strokeWidth: { $isUserOption: ["./stroke", 2, 0] }, label: { fontWeight: { $ref: "fontWeight" }, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, color: { $ref: "textColor" }, spacing: 12 } }, bar: { strokeWidth: { $isUserOption: ["./stroke", 2, 0] } }, segmentation: { enabled: false, interval: {}, spacing: 2 }, defaultTarget: { fill: { $ref: "foregroundColor" }, stroke: { $ref: "foregroundColor" }, size: 10, shape: "triangle", placement: "outside", spacing: 5, label: { enabled: true, fontWeight: { $ref: "fontWeight" }, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, color: { $ref: "textColor" }, spacing: 5 } }, needle: { enabled: false, fill: { $ref: "foregroundColor" }, spacing: 10 }, label: { ...import_ag_charts_core270.LABEL_BOXING_DEFAULTS, enabled: true, fontWeight: { $ref: "fontWeight" }, fontSize: 56, minimumFontSize: 18 / 56, fontFamily: { $ref: "fontFamily" }, color: { $ref: "textColor" } }, secondaryLabel: { ...import_ag_charts_core270.LABEL_BOXING_DEFAULTS, enabled: true, fontWeight: { $ref: "fontWeight" }, fontSize: { $rem: import_ag_charts_core270.FONT_SIZE_RATIO.LARGE }, minimumFontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, color: { $ref: "subtleTextColor" } }, tooltip: { range: { $path: ["/tooltip/range", 10] } } } }, create: (ctx) => new RadialGaugeSeries(ctx) }; // packages/ag-charts-enterprise/src/series/sankey/sankeyModule.ts var import_ag_charts_community252 = require("ag-charts-community"); var import_ag_charts_core275 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/sankey/sankeySeries.ts var import_ag_charts_community250 = require("ag-charts-community"); var import_ag_charts_core273 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/sankey/sankeyLink.ts var import_ag_charts_community248 = require("ag-charts-community"); var import_ag_charts_core271 = require("ag-charts-core"); var { BBox: BBox26, Path: Path14 } = import_ag_charts_community248._ModuleSupport; var SankeyLink = class extends Path14 { constructor() { super(...arguments); this.x1 = 0; this.x2 = 0; this.y1 = 0; this.y2 = 0; this.height = 0; this.inset = 0; this.elbows = []; } computeBBox() { const x = Math.min(this.x1, this.x2); const width = Math.max(this.x1, this.x2) - x; const y = Math.min(this.y1, this.y2); const height = Math.max(this.y1, this.y2) - y + this.height; return new BBox26(x, y, width, height); } updatePath() { const { path, inset } = this; path.clear(); const height = this.height - 2 * this.inset; const offset = height / 2; let x1 = this.x1 + inset; let y1 = this.y1 + inset; path.moveTo(x1, y1); for (const elbow of this.elbows) { this.updatePathSection(x1, y1, elbow.x, elbow.y, height, -offset); x1 = elbow.x; y1 = elbow.y; } const x2 = this.x2 - inset; const y2 = this.y2 + inset; this.updatePathSection(x1, y1, x2, y2, height, -offset); path.lineTo(x2, y2 + height); x1 = x2; y1 = y2; for (const elbow of this.elbows.toReversed()) { this.updatePathSection(x1, y1, elbow.x, elbow.y, height, offset); x1 = elbow.x; y1 = elbow.y; } this.updatePathSection(x1, y1, this.x1 + inset, this.y1 + inset, height, offset); path.closePath(); } updatePathSection(x1, y1, x2, y2, height, yOffset) { const { path } = this; const start = import_ag_charts_core271.Vec2.from(x1, y1 + yOffset + height / 2); const end = import_ag_charts_core271.Vec2.from(x2, y2 + yOffset + height / 2); if (Math.abs(end.y - start.y) < 2) { path.lineTo(end.x, end.y); return; } let angle = import_ag_charts_core271.Vec2.angle(import_ag_charts_core271.Vec2.sub(end, start)); if (angle < 0) angle = 2 * Math.PI + angle; const right = 0; const down = Math.PI / 2; const left = Math.PI; const up = Math.PI * 1.5; const innerArc = getArcValues(start, end, 0); const outerArc = getArcValues(start, end, height); if (innerArc.radius < height) { path.cubicCurveTo((start.x + end.x) / 2, start.y, (start.x + end.x) / 2, end.y, end.x, end.y); return; } if (angle >= up) { path.arc(start.x, y1 - innerArc.radius, innerArc.radius, down, down + outerArc.angle, true); path.arc(end.x, y2 + outerArc.radius, outerArc.radius, up + outerArc.angle, up); path.lineTo(end.x, end.y); } else if (angle > right && angle <= down) { path.arc(start.x, y1 + outerArc.radius, outerArc.radius, up, up + outerArc.angle); path.arc(end.x, y2 - innerArc.radius, innerArc.radius, down + innerArc.angle, down, true); path.lineTo(end.x, end.y); } else if (angle > down && angle <= left) { path.arc(start.x, y1 + outerArc.radius, outerArc.radius - height, up, up + outerArc.angle, true); path.arc(end.x, y2 - innerArc.radius, innerArc.radius + height, down + innerArc.angle, down); path.lineTo(end.x, end.y); } else { path.arc(start.x, y1 - innerArc.radius, innerArc.radius + height, down, down + innerArc.angle); path.arc(end.x, y2 + outerArc.radius, outerArc.radius - height, up + outerArc.angle, up, true); path.lineTo(end.x, end.y); } } }; __decorateClass([ (0, import_ag_charts_core271.SceneChangeDetection)() ], SankeyLink.prototype, "x1", 2); __decorateClass([ (0, import_ag_charts_core271.SceneChangeDetection)() ], SankeyLink.prototype, "x2", 2); __decorateClass([ (0, import_ag_charts_core271.SceneChangeDetection)() ], SankeyLink.prototype, "y1", 2); __decorateClass([ (0, import_ag_charts_core271.SceneChangeDetection)() ], SankeyLink.prototype, "y2", 2); __decorateClass([ (0, import_ag_charts_core271.SceneChangeDetection)() ], SankeyLink.prototype, "height", 2); __decorateClass([ (0, import_ag_charts_core271.SceneChangeDetection)() ], SankeyLink.prototype, "inset", 2); function getArcValues(start, end, minRadius) { const lineAngle = import_ag_charts_core271.Vec2.angle(import_ag_charts_core271.Vec2.sub(end, start)); const chordLength = import_ag_charts_core271.Vec2.distance(start, end); const bisect = import_ag_charts_core271.Vec2.add(start, import_ag_charts_core271.Vec2.rotate(import_ag_charts_core271.Vec2.from(chordLength / 2, 0), lineAngle)); const gradient = -1 / import_ag_charts_core271.Vec2.gradient(start, end); const intercept = import_ag_charts_core271.Vec2.intercept(bisect, gradient); const offset = lerpClamp(0.1, 0.5, Math.PI / 2 - Math.abs(import_ag_charts_core271.Vec2.gradient(start, end))); const center = import_ag_charts_core271.Vec2.intersectAtX(gradient, intercept, start.x); const radius = Math.max(minRadius, import_ag_charts_core271.Vec2.distance(start, center) * offset); const angle = import_ag_charts_core271.Vec2.angle(import_ag_charts_core271.Vec2.sub(center, start), import_ag_charts_core271.Vec2.sub(center, bisect)) / -(1.1 - offset); return { angle, radius }; } function lerpClamp(a, b, ratio8) { return (0, import_ag_charts_core271.clamp)(a, (b - a) * ratio8 + a, b); } // packages/ag-charts-enterprise/src/series/sankey/sankeySeriesProperties.ts var import_ag_charts_community249 = require("ag-charts-community"); var import_ag_charts_core272 = require("ag-charts-core"); var { FillGradientDefaults: FillGradientDefaults3, FillPatternDefaults: FillPatternDefaults3, FillImageDefaults: FillImageDefaults3, makeSeriesTooltip: makeSeriesTooltip22, SeriesProperties: SeriesProperties13, Label: Label17 } = import_ag_charts_community249._ModuleSupport; var SankeySeriesLabelProperties = class extends Label17 { constructor() { super(...arguments); this.spacing = 1; this.placement = void 0; this.edgePlacement = void 0; } }; __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLabelProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLabelProperties.prototype, "placement", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLabelProperties.prototype, "edgePlacement", 2); var SankeySeriesLinkProperties = class extends import_ag_charts_core272.BaseProperties { constructor() { super(...arguments); this.fill = void 0; this.fillOpacity = 1; this.stroke = void 0; this.strokeOpacity = 1; this.strokeWidth = 1; this.lineDash = [0]; this.lineDashOffset = 0; } }; __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLinkProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLinkProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLinkProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLinkProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLinkProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLinkProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLinkProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesLinkProperties.prototype, "itemStyler", 2); var SankeySeriesNodeProperties = class extends import_ag_charts_core272.BaseProperties { constructor() { super(...arguments); this.spacing = 1; this.minSpacing = 0; this.width = 1; this.alignment = "justify"; this.verticalAlignment = "center"; this.sort = "auto"; this.fill = void 0; this.fillOpacity = 1; this.stroke = void 0; this.strokeOpacity = 1; this.strokeWidth = 1; this.lineDash = [0]; this.lineDashOffset = 0; } }; __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "spacing", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "minSpacing", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "width", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "alignment", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "verticalAlignment", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "sort", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "fill", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "lineDash", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "lineDashOffset", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesNodeProperties.prototype, "itemStyler", 2); var SankeySeriesProperties = class extends SeriesProperties13 { constructor() { super(...arguments); this.nodes = void 0; this.idKey = ""; this.idName = void 0; this.labelKey = void 0; this.labelName = void 0; this.sizeKey = void 0; this.sizeName = void 0; this.fillGradientDefaults = new FillGradientDefaults3(); this.fillPatternDefaults = new FillPatternDefaults3(); this.fillImageDefaults = new FillImageDefaults3(); this.defaultColorRange = []; this.defaultPatternFills = []; this.fills = []; this.strokes = []; this.label = new SankeySeriesLabelProperties(); this.link = new SankeySeriesLinkProperties(); this.node = new SankeySeriesNodeProperties(); this.tooltip = makeSeriesTooltip22(); } getStyle(isLink, fills, strokes, index) { const { fillOpacity, strokeWidth, strokeOpacity, lineDash, lineDashOffset, fill = fills[index % fills.length], stroke: stroke3 = strokes[index % fills.length] } = isLink ? this.link : this.node; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, lineDash, lineDashOffset }; } }; __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "nodes", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "fromKey", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "toKey", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "idKey", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "idName", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "labelKey", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "labelName", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "sizeKey", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "sizeName", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "fillGradientDefaults", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "fillPatternDefaults", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "fillImageDefaults", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "defaultColorRange", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "defaultPatternFills", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "fills", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "strokes", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "link", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "node", 2); __decorateClass([ import_ag_charts_core272.Property ], SankeySeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/sankey/sankeySeries.ts var { Transformable: Transformable5, SeriesNodePickMode: SeriesNodePickMode16, createDatumId: createDatumId21, getShapeStyle: getShapeStyle2, getLabelStyles: getLabelStyles6, Rect: Rect9, BBox: BBox27 } = import_ag_charts_community250._ModuleSupport; var SankeySeries = class extends FlowProportionSeries { constructor(moduleCtx) { super({ moduleCtx, pickModes: [SeriesNodePickMode16.NEAREST_NODE, SeriesNodePickMode16.EXACT_SHAPE_MATCH] }); this.properties = new SankeySeriesProperties(); } isLabelEnabled() { return (this.properties.labelKey != null || this.nodes == null) && this.properties.label.enabled; } linkFactory() { return new SankeyLink(); } nodeFactory() { return new Rect9(); } createNodeData() { const seriesRectWidth = this._nodeDataDependencies?.seriesRectWidth ?? 0; const nodeWidth = this.properties.node.width; const { nodeGraph: baseNodeGraph, links, maxPathLength } = this.getNodeGraph(this.createNode.bind(this, nodeWidth), this.createLink, { includeCircularReferences: false }); const nodeGraph = baseNodeGraph; if (nodeGraph.size === 0) return; const columns = this.initialiseColumns(maxPathLength); this.assignNodesToColumns(nodeGraph, columns, maxPathLength); const measurer3 = (0, import_ag_charts_core273.cachedTextMeasurer)(this.properties.label); const { columnLabelInsetBefore, columnLabelInsetAfter } = this.getColumnLabelInsets( columns, measurer3, maxPathLength ); const columnWidth = (seriesRectWidth - nodeWidth - columnLabelInsetBefore - columnLabelInsetAfter) / (maxPathLength - 1); this.positionNodesInColumnsX(columns, columnWidth, columnLabelInsetBefore); this.createGhostNodesAndColumnDiffs(nodeGraph, columns); this.weightNodes(columns); const minSize = 1; const { sizeScale, nodeSpacing } = this.getScaleAndSpacing(columns, minSize); if (sizeScale < 0) { import_ag_charts_core273.Logger.warnOnce( "There was insufficient space to display the Sankey Series. Reduce [node.spacing], [node.minSpacing], or provide a larger container." ); return; } this.positionNodesInColumnsY(columns, minSize, sizeScale, nodeSpacing); this.sortAndPositionLinks(nodeGraph, sizeScale); const nodeData = []; const labelData = []; this.createNodesNodeData(nodeData, nodeGraph, columns, columnWidth, measurer3, labelData); this.createLinksNodeData(nodeData, links, minSize, sizeScale); return { itemId: this.id, nodeData, labelData }; } createNode(nodeWidth, node) { return { ...node, x: Number.NaN, y: Number.NaN, width: nodeWidth, height: Number.NaN }; } createLink(link) { return { ...link, x1: Number.NaN, x2: Number.NaN, y1: Number.NaN, y2: Number.NaN, height: Number.NaN, elbows: [] }; } initialiseColumns(maxPathLength) { const columns = []; for (let index = 0; index < maxPathLength; index += 1) { columns.push({ index, size: 0, nodes: [], x: 0 }); } return columns; } assignNodesToColumns(nodeGraph, columns, maxPathLength) { const { fromKey, toKey, sizeKey, labelKey } = this.properties; for (const graphNode of nodeGraph.values()) { const { datum: node, linksBefore, linksAfter } = graphNode; const size = Math.max( linksBefore.reduce((acc, { link }) => acc + link.size, 0), linksAfter.reduce((acc, { link }) => acc + link.size, 0) ); if (linksBefore.length === 0 && linksAfter.length === 0 || size === 0) { graphNode.columnIndex = -1; continue; } const column = this.getNodeColumn(columns, graphNode, maxPathLength); node.size = size; const { label } = this.properties; const labelText = label.enabled ? this.getLabelText( node.label, node.datum, labelKey, "label", [], this.properties.label, { datum: node.datum, value: node.label, fromKey, toKey, sizeKey, size } ) : void 0; node.label = (0, import_ag_charts_core273.toPlainText)(labelText); column.nodes.push(graphNode); column.size += size; graphNode.columnIndex = column.index; } } getNodeColumn(columns, graphNode, maxPathLength) { const { node: { alignment } } = this.properties; const { linksBefore, linksAfter, maxPathLengthBefore, maxPathLengthAfter } = graphNode; let column; switch (alignment) { case "left": column = columns[maxPathLengthBefore]; break; case "right": column = columns[maxPathLength - 1 - maxPathLengthAfter]; break; case "center": { if (linksBefore.length !== 0) { column = columns[maxPathLengthBefore]; } else if (linksAfter.length === 0) { column = columns[0]; } else { const columnIndex = linksAfter.reduce((acc, link) => Math.min(acc, link.node.maxPathLengthBefore), maxPathLength) - 1; column = columns[columnIndex]; } break; } case "justify": { column = linksAfter.length === 0 ? columns[maxPathLength - 1] : columns[maxPathLengthBefore]; break; } } return column; } getColumnLabelInsets(columns, measurer3, maxPathLength) { const { label: { spacing: labelSpacing, placement: labelPlacement, edgePlacement: edgeLabelPlacement }, node: { width: nodeWidth } } = this.properties; const seriesRectWidth = this._nodeDataDependencies?.seriesRectWidth ?? 0; let columnLabelInsetBefore = 0; let columnLabelInsetAfter = 0; if (this.isLabelEnabled() && (edgeLabelPlacement === "outside" || edgeLabelPlacement == null)) { const reduceLabelWidthFn = (acc, n) => { const node = n; if (node.datum.label == null || node.datum.label === "") return acc; let maxWidth = (seriesRectWidth - nodeWidth) / (maxPathLength - 1) - labelSpacing; if (labelPlacement === "center" && edgeLabelPlacement == null) maxWidth /= 2; const text2 = (0, import_ag_charts_core273.wrapText)(node.datum.label, { maxWidth, maxHeight: node.datum.height, font: this.properties.label, textWrap: "never" }); let { width } = measurer3.measureLines(text2); if (labelPlacement === "center" && edgeLabelPlacement == null) width /= 2; return Math.max(acc, width); }; if (labelPlacement !== "right" || edgeLabelPlacement === "outside") { columnLabelInsetBefore = nodeWidth + columns[0].nodes.reduce(reduceLabelWidthFn, 0); } if (labelPlacement !== "left" || edgeLabelPlacement === "outside") { columnLabelInsetAfter = nodeWidth + columns.at(-1).nodes.reduce(reduceLabelWidthFn, 0); } } return { columnLabelInsetBefore, columnLabelInsetAfter }; } positionNodesInColumnsX(columns, columnWidth, columnLabelInsetBefore) { for (let index = 0; index < columns.length; index++) { const column = columns[index]; column.x = columnLabelInsetBefore + index * columnWidth; for (const graphNode of column.nodes) { graphNode.datum.x = column.x; } } } createGhostNodesAndColumnDiffs(nodeGraph, columns) { for (const graphNode of nodeGraph.values()) { graphNode.weight = 0; let closestColumnDiff = Infinity; for (const link of graphNode.linksAfter) { const node = link.node; closestColumnDiff = Math.min(closestColumnDiff, node.columnIndex - graphNode.columnIndex); } if (closestColumnDiff === Infinity) { for (const link of graphNode.linksBefore) { const node = link.node; closestColumnDiff = Math.min(closestColumnDiff, graphNode.columnIndex - node.columnIndex); } } graphNode.closestColumnDiff = closestColumnDiff; this.createNodeGhostNodes(graphNode, columns, closestColumnDiff); } } createNodeGhostNodes(graphNode, columns, closestColumnDiff) { for (const link of graphNode.linksAfter) { const node = link.node; if (node.columnIndex <= graphNode.columnIndex) continue; for (let i = node.columnIndex - 1; i > graphNode.columnIndex; i--) { const size = link.link.size; const ghostNode = { ghost: true, datum: { ...graphNode.datum, size, y: 0, height: 0 }, weight: 0, linksBefore: [{ node: { columnIndex: i - 1, datum: { size } } }], linksAfter: [{ node: { columnIndex: i + 1, datum: { size } } }], link: link.link, columnIndex: graphNode.columnIndex, size: graphNode.datum.size, closestColumnDiff, fromNode: { y: node.datum.y }, toNode: { y: 0 } }; columns[i].size += size; columns[i].nodes.push(ghostNode); } } } weightNodes(columns) { const { properties } = this; if (properties.node.sort === "data") return; if (properties.node.sort !== "auto") { for (const column of columns) { column.nodes.sort((a, b) => this.sortNodes(a, b)); } return; } const sortedColumns = columns.toSorted((a, b) => { const aMax = a.nodes.reduce((acc, n) => Math.max(acc, n.datum.size), 0); const bMax = b.nodes.reduce((acc, n) => Math.max(acc, n.datum.size), 0); return bMax - aMax; }); const columnWeights = {}; for (let i = 0; i < sortedColumns.length; i++) { columnWeights[sortedColumns[i].index] = Math.pow(10, sortedColumns.length - i - 1); } for (const column of columns) { for (const node of column.nodes) { if ("ghost" in node && node.ghost) { node.weight = node.size / column.size * columnWeights[column.index]; continue; } node.weight = node.datum.size / column.size * columnWeights[column.index]; } column.nodes.sort((a, b) => a.weight - b.weight); } for (const column of columns) { for (const node of column.nodes) { if ("ghost" in node && node.ghost) { continue; } node.weight += node.linksBefore.reduce((acc, before) => { if (before.node.columnIndex !== column.index - 1) return acc; const weight = columns[before.node.columnIndex].nodes.indexOf(before.node) * columnWeights[before.node.columnIndex]; return Math.max(acc, weight); }, 0); node.weight += node.linksAfter.reduce((acc, after) => { if (after.node.columnIndex !== column.index + 1) return acc; const weight = columns[after.node.columnIndex].nodes.indexOf(after.node) * columnWeights[after.node.columnIndex]; return Math.max(acc, weight); }, 0); } column.nodes.sort((a, b) => this.sortNodes(a, b)); } } getScaleAndSpacing(columns, minSize) { const seriesRectHeight = this._nodeDataDependencies?.seriesRectHeight ?? 0; const getSizeScale = (spacing) => { return columns.reduce((acc, { size, nodes }) => { const spacingAccomodation = seriesRectHeight - nodes.length * minSize; const spacingOccupation = (nodes.length - 1) * spacing / spacingAccomodation; const columnSizeScale = (1 - spacingOccupation) / size; return Math.min(acc, columnSizeScale); }, Infinity); }; let nodeSpacing = this.properties.node.spacing; let sizeScale = getSizeScale(nodeSpacing); while (sizeScale < 0 && nodeSpacing > this.properties.node.minSpacing) { nodeSpacing -= 1; sizeScale = getSizeScale(nodeSpacing); } return { nodeSpacing, sizeScale }; } positionNodesInColumnsY(columns, minSize, sizeScale, nodeSpacing) { const seriesRectHeight = this._nodeDataDependencies?.seriesRectHeight ?? 0; for (const column of columns) { let columnNodesHeight = 0; for (const node of column.nodes) { const height = seriesRectHeight * node.datum.size * sizeScale; node.datum.height = Math.max(minSize, height); columnNodesHeight += height; } const spacingOccupation = nodeSpacing * (column.nodes.length - 1); let y = 0; if (this.properties.node.verticalAlignment === "bottom") { y = seriesRectHeight - columnNodesHeight - spacingOccupation; } else if (this.properties.node.verticalAlignment === "center") { y = (seriesRectHeight - columnNodesHeight - spacingOccupation) / 2; } for (const node of column.nodes) { node.datum.y = y; y += seriesRectHeight * node.datum.size * sizeScale + nodeSpacing; if ("ghost" in node && node.ghost) { node.link.elbows.push({ x: column.x, y: node.datum.y }); } } } } sortAndPositionLinks(nodeGraph, sizeScale) { const seriesRectHeight = this._nodeDataDependencies?.seriesRectHeight ?? 0; for (const { datum, linksBefore, linksAfter } of nodeGraph.values()) { let y2 = datum.y; linksBefore.sort( (a, b) => this.sortNodes(a.node, b.node) ); for (const { link } of linksBefore) { link.y2 = y2; y2 += link.size * seriesRectHeight * sizeScale; } let y1 = datum.y; linksAfter.sort( (a, b) => this.sortNodes(a.node, b.node, { invertColumnSort: true }) ); for (const { link } of linksAfter) { link.y1 = y1; y1 += link.size * seriesRectHeight * sizeScale; } } } createNodesNodeData(nodeData, nodeGraph, columns, columnWidth, measurer3, labelData) { for (const [index, column] of columns.entries()) { const leading = index === 0; const trailing = index === columns.length - 1; let bottom = -Infinity; column.nodes.sort((a, b) => a.datum.y - b.datum.y); for (const n of column.nodes) { if ("ghost" in n && n.ghost) continue; const { datum: node } = n; node.midPoint = { x: node.x + node.width / 2, y: node.y + node.height / 2 }; nodeData.push(node); bottom = this.createNodeLabelData( nodeGraph, columnWidth, measurer3, labelData, node, leading, trailing, bottom ); } } } createNodeLabelData(nodeGraph, columnWidth, measurer3, labelData, node, leading, trailing, bottom) { if (node.label == null) return bottom; const { label: { spacing: labelSpacing, edgePlacement: edgeLabelPlacement, fontSize } } = this.properties; const seriesRectWidth = this._nodeDataDependencies?.seriesRectWidth ?? 0; const y = node.y + node.height / 2; let text2; if (!leading && !trailing) { const lineHeight = (0, import_ag_charts_core273.calcLineHeight)(fontSize); const y12 = y - lineHeight; const y2 = y + lineHeight; let maxX = seriesRectWidth; for (const { datum } of nodeGraph.values()) { const intersectsLabel = datum.x > node.x && Math.max(datum.y, y12) <= Math.min(datum.y + datum.height, y2); if (intersectsLabel) { maxX = Math.min(maxX, datum.x - labelSpacing); } } const maxWidth = maxX - node.x - 2 * labelSpacing; text2 = (0, import_ag_charts_core273.wrapText)(node.label, { maxWidth, maxHeight: node.height, font: this.properties.label, textWrap: "never", overflow: "hide" }); } if (text2 == null || text2 === "") { const labelInset = edgeLabelPlacement == null && (leading || trailing) ? labelSpacing : labelSpacing * 2; text2 = (0, import_ag_charts_core273.wrapText)(node.label, { maxWidth: columnWidth - labelInset, maxHeight: node.height, font: this.properties.label, textWrap: "never" }); } if (text2 === "") return bottom; const { height } = measurer3.measureLines(text2); const y0 = y - height / 2; const y1 = y + height / 2; const { x, textAlign } = this.getNodeLabelPlacement(node, leading, trailing); if (y0 >= bottom) { labelData.push({ x, y, textAlign, text: text2, size: node.size, nodeDatum: node, datumIndex: node.datumIndex }); bottom = y1; } return bottom; } getNodeLabelPlacement(node, leading, trailing) { const { label: { spacing: labelSpacing, placement: labelPlacement, edgePlacement: edgeLabelPlacement } } = this.properties; let x = node.x + node.width + labelSpacing; let textAlign = "left"; let placement = labelPlacement; if (leading && edgeLabelPlacement == null && labelPlacement == null) { placement = "left"; } if (edgeLabelPlacement === "outside") { if (leading) placement = "left"; if (trailing) placement = "right"; } else if (edgeLabelPlacement === "inside") { if (leading) placement = "right"; if (trailing) placement = "left"; } if (placement === "left") { x = node.x - labelSpacing; textAlign = "right"; } else if (placement === "center") { x = node.x + node.width / 2; textAlign = "center"; } return { x, textAlign }; } createLinksNodeData(nodeData, links, minSize, sizeScale) { const seriesRectHeight = this._nodeDataDependencies?.seriesRectHeight ?? 0; const nodeWidth = this.properties.node.width; for (const link of links) { const { fromNode, toNode, size } = link; link.height = Math.max(minSize, seriesRectHeight * size * sizeScale); link.x1 = fromNode.x + nodeWidth; link.x2 = toNode.x; link.midPoint = { x: (link.x1 + link.x2) / 2, y: (link.y1 + link.y2) / 2 + link.height / 2 }; nodeData.push(link); } } sortNodes(a, b, opts) { const { properties } = this; if (properties.node.sort === "ascending") { return (a.datum.label ?? "").localeCompare(b.datum.label ?? ""); } else if (properties.node.sort === "descending") { return (b.datum.label ?? "").localeCompare(a.datum.label ?? ""); } else if (properties.node.sort === "data") { return 0; } if (a.columnIndex < b.columnIndex) return opts?.invertColumnSort ? 1 : -1; if (a.columnIndex > b.columnIndex) return opts?.invertColumnSort ? -1 : 1; if (a.weight === b.weight) { return a.datum.size - b.datum.size; } if (a.closestColumnDiff < b.closestColumnDiff) return 1; if (a.closestColumnDiff > b.closestColumnDiff) return -1; return a.weight - b.weight; } updateLabelSelection(opts) { const labels = this.isLabelEnabled() ? opts.labelData : []; return opts.labelSelection.update(labels); } updateLabelNodes(opts) { const activeHighlightDatum = this.getHighlightedDatum(); opts.labelSelection.each((label, datum) => { const { x, y, textAlign, text: text2, datumIndex, nodeDatum } = datum; const params = { fromKey: this.properties.fromKey, size: datum.size, sizeKey: this.properties.sizeKey, toKey: this.properties.toKey }; const isHighlight = this.isLabelHighlighted(nodeDatum, activeHighlightDatum); const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); const style = getLabelStyles6( this, void 0, params, this.properties.label, isHighlight, activeHighlightDatum ); const { color: fill, fontStyle, fontWeight, fontSize, fontFamily } = style; label.visible = true; label.x = x; label.y = y; label.text = text2; label.fill = fill; label.fontStyle = fontStyle; label.fontWeight = fontWeight; label.fontSize = fontSize; label.fontFamily = fontFamily; label.textAlign = textAlign; label.textBaseline = "middle"; const opacity = highlightStyle.opacity ?? 1; label.opacity = opacity; label.fillOpacity = opacity; label.setBoxing(style); }); } updateNodeSelection(opts) { return opts.datumSelection.update(opts.nodeData, void 0, (datum) => createDatumId21(datum.type, datum.id)); } getNodeStyle(nodeDatum, fromNodeDatumIndex, isHighlight) { const { properties } = this; const { fills, strokes, defaultColorRange, defaultPatternFills, fillGradientDefaults: fillGradientDefaults3, fillPatternDefaults: fillPatternDefaults3, fillImageDefaults: fillImageDefaults3 } = properties; const { itemStyler } = properties.node; const defaultColorStops = defaultColorRange[fromNodeDatumIndex % defaultColorRange.length].map((color7) => ({ color: color7 })); const defaultPatternFill = defaultPatternFills[fromNodeDatumIndex % defaultPatternFills.length]; const highlightStyle = this.getHighlightStyle(isHighlight, nodeDatum.datumIndex); const baseStyle = (0, import_ag_charts_core273.mergeDefaults)(highlightStyle, properties.getStyle(false, fills, strokes, fromNodeDatumIndex)); const hasNodeFill = properties.node.fill != null; let style = getShapeStyle2( baseStyle, hasNodeFill ? fillGradientDefaults3 : { ...fillGradientDefaults3.toJson(), colorStops: defaultColorStops }, hasNodeFill ? fillPatternDefaults3 : { ...fillPatternDefaults3.toJson(), fill: defaultPatternFill, stroke: defaultPatternFill }, fillImageDefaults3 ); if (itemStyler != null && nodeDatum.datumIndex != null) { const overrides = this.cachedDatumCallback( createDatumId21(nodeDatum.datumIndex.index, "node", isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams(nodeDatum, isHighlight, style); return this.callWithContext(itemStyler, params); } ); if (overrides) { style = (0, import_ag_charts_core273.mergeDefaults)( overrides, style, { ...fillGradientDefaults3.toJson(), colorStops: defaultColorStops }, { ...fillPatternDefaults3.toJson(), fill: defaultPatternFill, stroke: defaultPatternFill }, fillImageDefaults3 ); } } style.opacity = 1; return style; } makeItemStylerParams({ datum, datumIndex, size = 0, label }, isHighlight, style) { const { id: seriesId } = this; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum, highlightState, ...style, size, label, fill }; } updateNodeNodes(opts) { const { datumSelection, isHighlight } = opts; const fillBBox = this.getShapeFillBBox(); datumSelection.each((rect, datum) => { const { datumIndex } = datum; const style = this.getNodeStyle(datum, datumIndex.index, isHighlight); rect.x = datum.x; rect.y = datum.y; rect.width = Math.max(datum.width, 0); rect.height = Math.max(datum.height, 0); rect.setStyleProperties(style, fillBBox); }); } getShapeFillBBox() { const width = this._nodeDataDependencies?.seriesRectWidth ?? 0; const height = this._nodeDataDependencies?.seriesRectHeight ?? 0; const bbox = new BBox27(0, 0, width, height); return { series: bbox, axis: bbox }; } updateLinkSelection(opts) { return opts.datumSelection.update( opts.nodeData, void 0, (datum) => createDatumId21(datum.type, datum.index, datum.fromNode.id, datum.toNode.id) ); } getLinkStyle({ datumIndex, datum }, fromNodeDatumIndex, isHighlight) { const { id: seriesId, properties } = this; const { fills, strokes, defaultColorRange, defaultPatternFills, fillGradientDefaults: fillGradientDefaults3, fillPatternDefaults: fillPatternDefaults3, fillImageDefaults: fillImageDefaults3 } = properties; const { itemStyler } = properties.link; const defaultColorStops = defaultColorRange[fromNodeDatumIndex.index % defaultColorRange.length].map( (color7) => ({ color: color7 }) ); const defaultPatternFill = defaultPatternFills[fromNodeDatumIndex.index % defaultPatternFills.length]; const highlightStyle = this.getHighlightStyle(isHighlight, datumIndex); const baseStyle = (0, import_ag_charts_core273.mergeDefaults)( highlightStyle, properties.getStyle(true, fills, strokes, fromNodeDatumIndex.index) ); const hasLinkFill = properties.link.fill != null; let style = getShapeStyle2( baseStyle, hasLinkFill ? fillGradientDefaults3 : { ...fillGradientDefaults3.toJson(), colorStops: defaultColorStops }, hasLinkFill ? fillPatternDefaults3 : { ...fillPatternDefaults3.toJson(), fill: defaultPatternFill, stroke: defaultPatternFill }, fillImageDefaults3 ); if (itemStyler != null && datumIndex != null) { const overrides = this.cachedDatumCallback( createDatumId21(datumIndex.index, "link", isHighlight ? "highlight" : "node"), () => { const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const highlightState = this.getHighlightStateString(activeHighlight, isHighlight, datumIndex); return this.callWithContext(itemStyler, { seriesId, datum, highlightState, ...style }); } ); if (overrides) { style = (0, import_ag_charts_core273.mergeDefaults)( overrides, style, { ...fillGradientDefaults3.toJson(), colorStops: defaultColorStops }, { ...fillPatternDefaults3.toJson(), fill: defaultPatternFill, stroke: defaultPatternFill }, fillImageDefaults3 ); } } style.opacity = 1; return style; } updateLinkNodes(opts) { const { datumSelection, isHighlight } = opts; const fillBBox = this.getShapeFillBBox(); datumSelection.each((link, datum) => { const fromNodeDatumIndex = datum.fromNode.datumIndex; const style = this.getLinkStyle(datum, fromNodeDatumIndex, isHighlight); link.x1 = datum.x1; link.y1 = datum.y1; link.x2 = datum.x2; link.y2 = datum.y2; link.height = datum.height; link.elbows = datum.elbows; link.setStyleProperties(style, fillBBox); link.inset = link.strokeWidth / 2; }); } getTooltipContent(datumIndex) { const { id: seriesId, linksProcessedData, nodesProcessedData, properties, ctx: { formatManager } } = this; const { fromKey, toKey, sizeKey, sizeName, tooltip } = properties; const seriesDatum = this.contextNodeData?.nodeData.find( (d) => d.datumIndex.type === datumIndex.type && d.datumIndex.index === datumIndex.index ); if (seriesDatum == null) return; const nodeIndex = seriesDatum.type === 0 /* Link */ ? seriesDatum.fromNode.index : seriesDatum.index; const title = seriesDatum.type === 0 /* Link */ ? `${seriesDatum.fromNode.label} - ${seriesDatum.toNode.label}` : seriesDatum.label; const datum = datumIndex.type === 0 /* Link */ ? linksProcessedData?.dataSources.get(this.id)?.data[datumIndex.index] : nodesProcessedData?.dataSources.get(this.id)?.data[datumIndex.index]; const size = seriesDatum.size; let format; if (seriesDatum.type === 0 /* Link */) { const fromNodeDatumIndex = seriesDatum.fromNode.datumIndex; format = this.getLinkStyle({ datumIndex, datum }, fromNodeDatumIndex, false); } else { format = this.getNodeStyle({ datumIndex, datum }, datumIndex.index, false); } const data = []; if (sizeKey != null) { const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: size, datum, seriesId, legendItemName: void 0, key: sizeKey, source: "tooltip", property: "size", domain: [], boundSeries: this.getFormatterContext("size"), fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: sizeName, fallbackLabel: sizeKey, value: content ?? String(size) }); } return this.formatTooltipWithContext( tooltip, { title, symbol: this.legendItemSymbol(seriesDatum.type, nodeIndex, format), data }, { seriesId, datum, title, fromKey, toKey, sizeKey, sizeName, size, ...format } ); } computeFocusBounds(node) { if (node instanceof Rect9) { const { x, y, width, height } = node; const bbox = new BBox27(x, y, width, height); return Transformable5.toCanvas(this.contentGroup, bbox); } return node; } hasItemStylers() { return this.properties.node.itemStyler != null || this.properties.link.itemStyler != null || this.properties.label.itemStyler != null; } }; SankeySeries.className = "SankeySeries"; SankeySeries.type = "sankey"; // packages/ag-charts-enterprise/src/series/sankey/sankeySeriesOptionsDef.ts var import_ag_charts_community251 = require("ag-charts-community"); var import_ag_charts_core274 = require("ag-charts-core"); var { sankeySeriesThemeableOptionsDef } = import_ag_charts_community251._ModuleSupport; var sankeySeriesOptionsDef = { ...sankeySeriesThemeableOptionsDef, ...import_ag_charts_core274.commonSeriesOptionsDefs, type: (0, import_ag_charts_core274.required)((0, import_ag_charts_core274.constant)("sankey")), fromKey: (0, import_ag_charts_core274.required)(import_ag_charts_core274.string), toKey: (0, import_ag_charts_core274.required)(import_ag_charts_core274.string), sizeKey: import_ag_charts_core274.string, sizeName: import_ag_charts_core274.string }; sankeySeriesOptionsDef.fillGradientDefaults = (0, import_ag_charts_core274.undocumented)(import_ag_charts_core274.fillGradientDefaults); sankeySeriesOptionsDef.fillPatternDefaults = (0, import_ag_charts_core274.undocumented)(import_ag_charts_core274.fillPatternDefaults); sankeySeriesOptionsDef.fillImageDefaults = (0, import_ag_charts_core274.undocumented)(import_ag_charts_core274.fillImageDefaults); sankeySeriesOptionsDef.defaultColorRange = (0, import_ag_charts_core274.undocumented)((0, import_ag_charts_core274.arrayOf)((0, import_ag_charts_core274.arrayOf)(import_ag_charts_core274.color))); sankeySeriesOptionsDef.defaultPatternFills = (0, import_ag_charts_core274.undocumented)((0, import_ag_charts_core274.arrayOf)(import_ag_charts_core274.color)); // packages/ag-charts-enterprise/src/series/sankey/sankeyModule.ts var SankeySeriesModule = { type: "series", name: "sankey", chartType: "standalone", enterprise: true, solo: true, version: import_ag_charts_community252.VERSION, dependencies: [StandaloneChartModule], options: sankeySeriesOptionsDef, themeTemplate: { seriesArea: { padding: { top: 10, bottom: 10 } }, series: { fills: { $palette: "fills" }, strokes: { $palette: "strokes" }, fillGradientDefaults: import_ag_charts_core275.FILL_GRADIENT_LINEAR_DEFAULTS, fillPatternDefaults: import_ag_charts_core275.FILL_PATTERN_DEFAULTS, fillImageDefaults: import_ag_charts_core275.FILL_IMAGE_DEFAULTS, defaultColorRange: { $palette: "gradients" }, defaultPatternFills: import_ag_charts_core275.SAFE_FILLS_OPERATION, highlight: { unhighlightedItem: { opacity: 0.5 } }, label: { ...import_ag_charts_core275.LABEL_BOXING_DEFAULTS, enabled: true, fontFamily: { $ref: "fontFamily" }, fontSize: { $ref: "fontSize" }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "textColor" }, spacing: 10 }, node: { spacing: { $if: [{ $greaterThan: [{ $path: "./minSpacing" }, 20] }, { $path: "./minSpacing" }, 20] }, minSpacing: 0, width: 10, strokeWidth: { $isUserOption: ["./stroke", 2, 0] } }, link: { fillOpacity: 0.5, strokeWidth: { $isUserOption: ["./stroke", 2, 0] } } }, legend: { enabled: false, toggleSeries: false } }, create: (ctx) => new SankeySeries(ctx) }; // packages/ag-charts-enterprise/src/series/sunburst/sunburstModule.ts var import_ag_charts_community256 = require("ag-charts-community"); var import_ag_charts_core279 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/sunburst/sunburstSeries.ts var import_ag_charts_community254 = require("ag-charts-community"); var import_ag_charts_core277 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/sunburst/sunburstSeriesProperties.ts var import_ag_charts_community253 = require("ag-charts-community"); var import_ag_charts_core276 = require("ag-charts-core"); var { HierarchySeriesProperties, makeSeriesTooltip: makeSeriesTooltip23, HighlightProperties } = import_ag_charts_community253._ModuleSupport; var SunburstSeriesHighlightStyle = class extends import_ag_charts_core276.BaseProperties { }; __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesHighlightStyle.prototype, "fill", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesHighlightStyle.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesHighlightStyle.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesHighlightStyle.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesHighlightStyle.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesHighlightStyle.prototype, "opacity", 2); var SunburstSeriesHighlight = class extends HighlightProperties { constructor() { super(...arguments); this.highlightedBranch = new SunburstSeriesHighlightStyle(); this.unhighlightedBranch = new SunburstSeriesHighlightStyle(); } }; __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesHighlight.prototype, "highlightedBranch", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesHighlight.prototype, "unhighlightedBranch", 2); var SunburstSeriesProperties = class extends HierarchySeriesProperties { constructor() { super(...arguments); this.fillOpacity = 1; this.strokeWidth = 0; this.strokeOpacity = 1; this.cornerRadius = 0; this.highlight = new SunburstSeriesHighlight(); this.label = new AutoSizedLabel(); this.secondaryLabel = new AutoSizedSecondaryLabel(); this.tooltip = makeSeriesTooltip23(); } getStyle(index) { const { fills, strokes, fillOpacity, strokeWidth, strokeOpacity } = this; return { fill: fills[index % fills.length], fillOpacity, stroke: strokes[index % strokes.length], strokeWidth, strokeOpacity, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "sizeName", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "labelKey", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "secondaryLabelKey", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "sectorSpacing", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "padding", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "highlight", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "label", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "secondaryLabel", 2); __decorateClass([ import_ag_charts_core276.Property ], SunburstSeriesProperties.prototype, "tooltip", 2); // packages/ag-charts-enterprise/src/series/sunburst/sunburstSeries.ts var { fromToMotion: fromToMotion6, createDatumId: createDatumId22, PointerEvents: PointerEvents13, Sector: Sector7, Group: Group21, ScalableGroup, Selection: Selection17, TransformableText: TransformableText4, BBox: BBox28, getLabelStyles: getLabelStyles7, toHierarchyHighlightString } = import_ag_charts_community254._ModuleSupport; var SunburstNode = class extends import_ag_charts_community254._ModuleSupport.HierarchyNode { constructor() { super(...arguments); this.label = void 0; this.secondaryLabel = void 0; this.contentHeight = 0; this.bbox = void 0; // cspell:ignore bbox this.startAngle = 0; this.endAngle = 0; } }; function setAngleData(node, startAngle = 0, angleScale = 2 * Math.PI / node.sumSize) { for (const child of node.children) { const endAngle = startAngle + child.sumSize * angleScale; child.startAngle = startAngle; child.endAngle = endAngle; setAngleData(child, startAngle, angleScale); startAngle = endAngle; } } var SunburstSeries = class extends import_ag_charts_community254._ModuleSupport.HierarchySeries { constructor(moduleCtx) { super(moduleCtx); this.NodeClass = SunburstNode; this.properties = new SunburstSeriesProperties(); this.scalingGroup = this.contentGroup.appendChild(new ScalableGroup()); this.sectorGroup = this.scalingGroup.appendChild(new Group21()); this.highlightSectorGroup = this.scalingGroup.appendChild(new Group21()); this.sectorLabelGroup = this.scalingGroup.appendChild(new Group21()); this.datumSelection = Selection17.select(this.sectorGroup, Sector7); this.labelSelection = Selection17.select( this.sectorLabelGroup, Group21 ); this.highlightSelection = Selection17.select( this.highlightSectorGroup, Sector7 ); this.sectorLabelGroup.pointerEvents = PointerEvents13.None; } processData() { super.processData(); setAngleData(this.rootNode); } updateSelections() { const highlightedNode = this.getActiveHighlightNode(); this.highlightSelection.update( highlightedNode == null ? [] : [highlightedNode], void 0, (node) => this.getDatumId(node) ); if (!this.nodeDataRefresh) return; this.nodeDataRefresh = false; const { chart } = this; if (chart == null) return; const seriesRect = chart.seriesRect; if (seriesRect == null) return; const descendants = Array.from(this.rootNode); const updateLabelGroup = (group) => { group.append([ new TransformableText4({ tag: 0 /* Primary */ }), new TransformableText4({ tag: 1 /* Secondary */ }) ]); }; this.datumSelection.update(descendants, void 0, (node) => this.getDatumId(node)); this.labelSelection.update(descendants, updateLabelGroup, (node) => this.getDatumId(node)); } getItemStyle(nodeDatum, isHighlight) { const { properties, colorScale } = this; const { itemStyler } = properties; const rootIndex = nodeDatum.datumIndex?.[0] ?? 0; const highlightedNode = this.getActiveHighlightNode(); const highlightState = this.getHierarchyHighlightState(isHighlight, highlightedNode, nodeDatum); const highlightStyles = this.getHierarchyHighlightStyles(highlightState, this.properties.highlight); const baseStyle = (0, import_ag_charts_core277.mergeDefaults)(highlightStyles, properties.getStyle(rootIndex)); if (nodeDatum.colorValue != null && highlightStyles?.fill == null) { baseStyle.fill = colorScale.convert(nodeDatum.colorValue); } let style = baseStyle; if (itemStyler != null && nodeDatum != null) { const overrides = this.cachedDatumCallback( createDatumId22(this.getDatumId(nodeDatum), isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams( nodeDatum, style, toHierarchyHighlightString(highlightState) ); return this.callWithContext(itemStyler, params); } ); if (overrides) { style = (0, import_ag_charts_core277.mergeDefaults)(overrides, style); } } return style; } makeItemStylerParams(nodeDatum, style, highlightState) { const { id: seriesId } = this; const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum: nodeDatum.datum, depth: nodeDatum.depth ?? 0, highlightState, ...style, fill }; } updateNodes() { const { chart, data, maxDepth } = this; if (chart == null || data == null) { return; } const { width, height } = chart.seriesRect; const { sectorSpacing = 0, padding: padding2 = 0, cornerRadius, childrenKey, colorKey, colorName, labelKey, secondaryLabelKey, sizeKey, sizeName } = this.properties; this.contentGroup.translationX = width / 2; this.contentGroup.translationY = height / 2; const baseInset = sectorSpacing * 0.5; const radius = Math.min(width, height) / 2; const radiusScale = radius / (maxDepth + 1); const angleOffset = -Math.PI / 2; const seriesFillBBox = { series: new BBox28(-radius, -radius, 2 * radius, 2 * radius), axis: new BBox28(-radius, -radius, 2 * radius, 2 * radius) }; this.rootNode?.walk((node) => { const { startAngle, endAngle } = node; if (node.depth != null) { const midAngle = (startAngle + endAngle) / 2 + angleOffset; const midRadius = (node.depth + 0.5) * radiusScale; node.midPoint.x = Math.cos(midAngle) * midRadius; node.midPoint.y = Math.sin(midAngle) * midRadius; } }); this.rootNode?.walk((node) => { const { datum, depth, startAngle, endAngle, parent, sumSize } = node; node.label = void 0; node.secondaryLabel = void 0; node.contentHeight = 0; let labelValue; if (datum != null && depth != null && labelKey != null) { const value = datum[labelKey]; labelValue = this.getLabelText( value, datum, labelKey, "label", [], this.properties.label, { depth, datum, childrenKey, colorKey, colorName, labelKey, secondaryLabelKey, sizeKey, sizeName, value } ); } if (labelValue === "") { labelValue = void 0; } let secondaryLabelValue; if (datum != null && depth != null && secondaryLabelKey != null) { const value = datum[secondaryLabelKey]; secondaryLabelValue = this.getLabelText( value, datum, secondaryLabelKey, "secondaryLabel", [], this.properties.secondaryLabel, { depth, datum, childrenKey, colorKey, colorName, labelKey, secondaryLabelKey, sizeKey, sizeName, value } ); } if (secondaryLabelValue === "") { secondaryLabelValue = void 0; } if (depth == null) return; const innerRadius = depth * radiusScale + baseInset; const outerRadius = (depth + 1) * radiusScale - baseInset; const innerAngleOffset = innerRadius > baseInset ? baseInset / innerRadius : baseInset; const outerAngleOffset = outerRadius > baseInset ? baseInset / outerRadius : baseInset; const innerStartAngle = startAngle + innerAngleOffset; const innerEndAngle = endAngle + innerAngleOffset; const deltaInnerAngle = innerEndAngle - innerStartAngle; const outerStartAngle = startAngle + outerAngleOffset; const outerEndAngle = endAngle + outerAngleOffset; const deltaOuterAngle = outerEndAngle - outerStartAngle; const sizeFittingHeight = (labelHeight2) => { const isCenterCircle = depth === 0 && parent?.sumSize === sumSize; if (isCenterCircle) { const labelWidth2 = 2 * Math.sqrt(outerRadius ** 2 - (labelHeight2 * 0.5) ** 2); return { width: labelWidth2, height: labelHeight2, meta: 0 /* CenterCircle */ }; } const parallelHeight = labelHeight2; const availableWidthUntilItHitsTheOuterRadius = 2 * Math.sqrt(outerRadius ** 2 - (innerRadius + parallelHeight) ** 2); const availableWidthUntilItHitsTheStraightEdges = deltaInnerAngle < Math.PI ? 2 * innerRadius * Math.tan(deltaInnerAngle * 0.5) : Infinity; const parallelWidth = Math.min( availableWidthUntilItHitsTheOuterRadius, availableWidthUntilItHitsTheStraightEdges ); const maxPerpendicularAngle = Math.PI / 4; let perpendicularHeight; let perpendicularWidth; if (depth === 0) { perpendicularHeight = labelHeight2; perpendicularWidth = Math.sqrt(outerRadius ** 2 - (perpendicularHeight / 2) ** 2) - labelHeight2 / (2 * Math.tan(deltaOuterAngle * 0.5)); } else if ((0, import_ag_charts_core277.normalizeAngle360)(deltaInnerAngle) < maxPerpendicularAngle) { perpendicularHeight = 2 * innerRadius * Math.tan(deltaInnerAngle * 0.5); perpendicularWidth = Math.sqrt(outerRadius ** 2 - (perpendicularHeight / 2) ** 2) - innerRadius; } else { perpendicularWidth = 0; perpendicularHeight = 0; } return parallelWidth >= perpendicularWidth ? { width: parallelWidth, height: parallelHeight, meta: 1 /* Parallel */ } : { width: perpendicularWidth, height: perpendicularHeight, meta: 2 /* Perpendicular */ }; }; const formatting = formatLabels( (0, import_ag_charts_core277.toPlainText)(labelValue), this.properties.label, (0, import_ag_charts_core277.toPlainText)(secondaryLabelValue), this.properties.secondaryLabel, { padding: padding2 }, sizeFittingHeight ); if (formatting == null) return; const { width: labelWidth, height: labelHeight, meta: labelPlacement, label, secondaryLabel } = formatting; const theta = angleOffset + (startAngle + endAngle) / 2; const top = Math.sin(theta) >= 0; const right = Math.cos(theta) >= 0; const circleQuarter = (top ? 3 /* Top */ : 12 /* Bottom */) & (right ? 6 /* Right */ : 9 /* Left */); let labelRadius; switch (labelPlacement) { case 0 /* CenterCircle */: labelRadius = 0; break; case 1 /* Parallel */: { const opticalCentering = 0.58; const idealRadius = outerRadius - (radiusScale - labelHeight) * opticalCentering; const maximumRadius = Math.sqrt((outerRadius - padding2) ** 2 - (labelWidth / 2) ** 2); labelRadius = Math.min(idealRadius, maximumRadius); break; } case 2 /* Perpendicular */: if (depth === 0) { const minimumRadius = labelHeight / (2 * Math.tan(deltaInnerAngle * 0.5)) + labelWidth * 0.5; const maximumRadius = Math.sqrt(outerRadius ** 2 - (labelHeight * 0.5) ** 2) - labelWidth * 0.5; labelRadius = (minimumRadius + maximumRadius) * 0.5; } else { labelRadius = (innerRadius + outerRadius) * 0.5; } break; } if (label != null) { const { fontStyle = "normal", fontFamily, fontWeight = "normal", color: color7 = "black" } = this.properties.label; node.label = { ...label, fontStyle, fontFamily, fontWeight, color: color7, labelPlacement, circleQuarter, radius: labelRadius, theta }; } if (secondaryLabel != null) { const { fontStyle = "normal", fontFamily, fontWeight = "normal", color: color7 = "black" } = this.properties.secondaryLabel; node.secondaryLabel = { ...secondaryLabel, fontStyle, fontFamily, fontWeight, color: color7, labelPlacement, circleQuarter, radius: labelRadius, theta }; } node.contentHeight = formatting.height; }); const updateSector = (nodeDatum, sector, highlighted) => { const { depth, startAngle, endAngle } = nodeDatum; if (depth == null) { sector.visible = false; return; } sector.visible = true; const style = this.getItemStyle(nodeDatum, highlighted); const fill = style.fill; const strokeWidth = style.strokeWidth; const fillBBox = (0, import_ag_charts_core277.isGradientFill)(fill) && fill.bounds !== "item" ? seriesFillBBox : void 0; sector.setStyleProperties(style, fillBBox); sector.centerX = 0; sector.centerY = 0; sector.innerRadius = depth * radiusScale; sector.outerRadius = (depth + 1) * radiusScale; sector.startAngle = startAngle + angleOffset; sector.endAngle = endAngle + angleOffset; sector.inset = baseInset + strokeWidth * 0.5; sector.cornerRadius = cornerRadius; }; this.datumSelection.each((sector, datum) => { updateSector(datum, sector, false); }); this.highlightSelection.each((rect, datum) => { updateSector(datum, rect, true); }); const highlightedNode = this.getActiveHighlightNode(); const updateText = (node, text2, tag, highlighted) => { const { depth, contentHeight } = node; const primary = tag === 0 /* Primary */; const label = primary ? node.label : node.secondaryLabel; if (depth == null || label == null) { text2.visible = false; return; } const { labelPlacement, circleQuarter, radius: textRadius, theta } = label; const highlightState = this.getHierarchyHighlightState(highlighted, highlightedNode, node); const { opacity: highlightOpacity } = this.getHierarchyHighlightStyles(highlightState, this.properties.highlight) ?? {}; const params = { childrenKey: this.properties.childrenKey, colorKey: this.properties.colorKey, colorName: this.properties.colorName ?? this.properties.colorKey, depth: node.depth ?? Number.NaN, labelKey: this.properties.labelKey, secondaryLabelKey: this.properties.secondaryLabelKey, sizeKey: this.properties.sizeKey, sizeName: this.properties.sizeName ?? this.properties.sizeKey }; const baseLabelStyle = primary ? this.properties.label : this.properties.secondaryLabel; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const style = getLabelStyles7(this, node, params, baseLabelStyle, highlighted, activeHighlight); text2.text = label.text; text2.fontSize = label.fontSize; text2.lineHeight = label.lineHeight; text2.fontStyle = label.fontStyle; text2.fontFamily = label.fontFamily; text2.fontWeight = label.fontWeight; text2.fillOpacity = highlightOpacity ?? 1; text2.fill = style.color; text2.setBoxing(style); switch (labelPlacement) { case 0 /* CenterCircle */: text2.textAlign = "center"; text2.textBaseline = "top"; text2.translationX = 0; text2.translationY = (primary ? 0 : contentHeight - label.height) - contentHeight * 0.5; text2.rotation = 0; break; case 1 /* Parallel */: { const topHalf = (circleQuarter & 3 /* Top */) !== 0; const translationRadius = primary === !topHalf ? textRadius : textRadius - (contentHeight - label.height); text2.textAlign = "center"; text2.textBaseline = topHalf ? "bottom" : "top"; text2.translationX = Math.cos(theta) * translationRadius; text2.translationY = Math.sin(theta) * translationRadius; text2.rotation = topHalf ? theta - Math.PI * 0.5 : theta + Math.PI * 0.5; break; } case 2 /* Perpendicular */: { const rightHalf = (circleQuarter & 6 /* Right */) !== 0; const translation = primary === !rightHalf ? (contentHeight - label.height) * 0.5 : (label.height - contentHeight) * 0.5; text2.textAlign = "center"; text2.textBaseline = "middle"; text2.translationX = Math.cos(theta) * textRadius + Math.cos(theta + Math.PI / 2) * translation; text2.translationY = Math.sin(theta) * textRadius + Math.sin(theta + Math.PI / 2) * translation; text2.rotation = rightHalf ? theta : theta + Math.PI; break; } } text2.visible = true; }; const highlightedDatum = this.getActiveHighlightNode(); for (const text2 of this.labelSelection.selectByClass(TransformableText4)) { const datum = text2.closestDatum(); updateText(datum, text2, text2.tag, datum === highlightedDatum); } } getTooltipContent(datumIndex) { const { id: seriesId, properties, ctx } = this; const { labelKey, secondaryLabelKey, childrenKey, sizeKey, sizeName, colorKey, colorName, tooltip } = properties; const { formatManager } = ctx; const nodeDatum = datumIndex.reduce((n, i) => n?.children[i], this.rootNode); if (nodeDatum == null) return; const { datum, depth } = nodeDatum; if (datum == null || depth == null) return; const data = []; const datumSize = sizeKey == null ? void 0 : datum[sizeKey]; if (datumSize != null) { const sizeDomain = [0, this.rootNode?.sumSize ?? 0]; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: datumSize, datum, seriesId, legendItemName: void 0, key: sizeKey, source: "tooltip", property: "size", boundSeries: this.getFormatterContext("size"), domain: sizeDomain, fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: sizeName, fallbackLabel: sizeKey, value: content ?? (0, import_ag_charts_core277.formatValue)(datumSize) }); } const datumColor = colorKey == null ? void 0 : datum[colorKey]; if (datumColor != null) { const { colorDomain } = this; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: datumColor, datum, seriesId, legendItemName: void 0, key: colorKey, source: "tooltip", property: "color", boundSeries: this.getFormatterContext("color"), domain: colorDomain, fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: colorName, fallbackLabel: colorKey, value: content ?? (0, import_ag_charts_core277.formatValue)(datumColor) }); } const format = this.getItemStyle( { ...nodeDatum, colorValue: datumColor ?? nodeDatum.colorValue }, false ); const color7 = format.fill; const markerStyle = { shape: "square", fill: color7, fillOpacity: 1, stroke: void 0, strokeWidth: 0, strokeOpacity: 1, lineDash: [0], lineDashOffset: 0 }; if ((0, import_ag_charts_core277.isGradientFill)(markerStyle.fill)) { markerStyle.fill = { ...markerStyle.fill, gradient: "linear", rotation: 0, reverse: false }; } return this.formatTooltipWithContext( tooltip, { title: labelKey == null ? void 0 : datum[labelKey], symbol: { marker: markerStyle }, data }, { seriesId, datum, title: void 0, depth, labelKey, secondaryLabelKey, childrenKey, sizeKey, sizeName, colorKey, colorName, ...format } ); } createNodeData() { return void 0; } pickNodeClosestDatum(point) { return this.pickNodeNearestDistantObject(point, this.datumSelection.nodes()); } animateEmptyUpdateReady() { fromToMotion6(this.id, "nodes", this.ctx.animationManager, [this.scalingGroup], { toFn() { return { scalingX: 1, scalingY: 1 }; }, fromFn() { return { scalingX: 0, scalingY: 0 }; } }); } computeFocusBounds(node) { return node; } hasItemStylers() { return this.properties.itemStyler != null || this.properties.label.itemStyler != null; } }; SunburstSeries.className = "SunburstSeries"; SunburstSeries.type = "sunburst"; // packages/ag-charts-enterprise/src/series/sunburst/sunburstSeriesOptionsDef.ts var import_ag_charts_community255 = require("ag-charts-community"); var import_ag_charts_core278 = require("ag-charts-core"); var { sunburstSeriesThemeableOptionsDef } = import_ag_charts_community255._ModuleSupport; var sunburstSeriesOptionsDef = { ...sunburstSeriesThemeableOptionsDef, ...(0, import_ag_charts_core278.without)(import_ag_charts_core278.commonSeriesOptionsDefs, ["highlightStyle", "highlight", "showInLegend"]), type: (0, import_ag_charts_core278.required)((0, import_ag_charts_core278.constant)("sunburst")), labelKey: import_ag_charts_core278.string, secondaryLabelKey: import_ag_charts_core278.string, childrenKey: import_ag_charts_core278.string, sizeKey: import_ag_charts_core278.string, colorKey: import_ag_charts_core278.string, sizeName: import_ag_charts_core278.string, colorName: import_ag_charts_core278.string }; // packages/ag-charts-enterprise/src/series/sunburst/sunburstModule.ts var themeTemplate3 = { series: { fills: { $applyCycle: [ { $size: { $path: ["./data", { $path: "/data" }] } }, { $palette: "fills" }, { $applySwitch: [ { $path: ["/type", void 0, { $value: "$1" }] }, { $value: "$1" }, ["gradient", import_ag_charts_core279.FILL_GRADIENT_RADIAL_REVERSED_SERIES_DEFAULTS], ["pattern", import_ag_charts_core279.FILL_PATTERN_DEFAULTS], ["image", import_ag_charts_core279.FILL_IMAGE_DEFAULTS] ] } ] }, strokes: { $applyCycle: [{ $size: { $path: ["./data", { $path: "/data" }] } }, { $palette: "strokes" }] }, colorRange: { $palette: "divergingColors" }, strokeWidth: { $isUserOption: ["./strokes/0", 2, 0] }, label: { ...import_ag_charts_core279.LABEL_BOXING_DEFAULTS, enabled: true, fontFamily: { $ref: "fontFamily" }, fontSize: { $rem: import_ag_charts_core279.FONT_SIZE_RATIO.LARGE }, minimumFontSize: { $rem: 9 / import_ag_charts_core279.BASE_FONT_SIZE }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "chartBackgroundColor" }, overflowStrategy: "ellipsis", wrapping: "never", spacing: 2 }, secondaryLabel: { ...import_ag_charts_core279.LABEL_BOXING_DEFAULTS, enabled: true, fontFamily: { $ref: "fontFamily" }, fontSize: { $rem: import_ag_charts_core279.FONT_SIZE_RATIO.SMALLEST }, minimumFontSize: { $rem: 7 / import_ag_charts_core279.BASE_FONT_SIZE }, fontWeight: { $ref: "fontWeight" }, color: { $ref: "chartBackgroundColor" }, overflowStrategy: "ellipsis", wrapping: "never" }, sectorSpacing: 2, padding: 3, highlight: { unhighlightedItem: { fillOpacity: 0.6, strokeOpacity: 0.6 }, unhighlightedBranch: { fillOpacity: 0.2, strokeOpacity: 0.2 } } }, gradientLegend: { enabled: { $if: [{ $path: "../series/0/colorKey" }, true, false] } } }; var SunburstSeriesModule = { type: "series", name: "sunburst", chartType: "standalone", enterprise: true, solo: true, version: import_ag_charts_community256.VERSION, dependencies: [StandaloneChartModule], options: sunburstSeriesOptionsDef, themeTemplate: themeTemplate3, create: (ctx) => new SunburstSeries(ctx) }; // packages/ag-charts-enterprise/src/series/treemap/treemapModule.ts var import_ag_charts_community260 = require("ag-charts-community"); var import_ag_charts_core283 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/treemap/treemapSeries.ts var import_ag_charts_community258 = require("ag-charts-community"); var import_ag_charts_core281 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/series/treemap/treemapSeriesProperties.ts var import_ag_charts_community257 = require("ag-charts-community"); var import_ag_charts_core280 = require("ag-charts-core"); var { HierarchySeriesProperties: HierarchySeriesProperties2, makeSeriesTooltip: makeSeriesTooltip24, Label: Label18 } = import_ag_charts_community257._ModuleSupport; var TreemapGroupLabel = class extends Label18 { constructor() { super(...arguments); this.spacing = 0; } }; __decorateClass([ import_ag_charts_core280.Property ], TreemapGroupLabel.prototype, "spacing", 2); var TreemapSeriesGroupHighlightStyle = class extends import_ag_charts_core280.BaseProperties { }; __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroupHighlightStyle.prototype, "fill", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroupHighlightStyle.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroupHighlightStyle.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroupHighlightStyle.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroupHighlightStyle.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroupHighlightStyle.prototype, "opacity", 2); var TreemapSeriesGroupHighlight = class extends import_ag_charts_core280.BaseProperties { constructor() { super(...arguments); this.highlightedItem = new TreemapSeriesGroupHighlightStyle(); this.unhighlightedItem = new TreemapSeriesGroupHighlightStyle(); } }; __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroupHighlight.prototype, "highlightedItem", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroupHighlight.prototype, "unhighlightedItem", 2); var TreemapSeriesTileHighlightStyle = class extends import_ag_charts_core280.BaseProperties { }; __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlightStyle.prototype, "fill", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlightStyle.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlightStyle.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlightStyle.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlightStyle.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlightStyle.prototype, "opacity", 2); var TreemapSeriesTileHighlight = class extends import_ag_charts_core280.BaseProperties { constructor() { super(...arguments); this.highlightedBranch = new TreemapSeriesTileHighlightStyle(); this.highlightedItem = new TreemapSeriesTileHighlightStyle(); this.unhighlightedItem = new TreemapSeriesTileHighlightStyle(); this.unhighlightedBranch = new TreemapSeriesTileHighlightStyle(); } }; __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlight.prototype, "highlightedBranch", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlight.prototype, "highlightedItem", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlight.prototype, "unhighlightedItem", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTileHighlight.prototype, "unhighlightedBranch", 2); var TreemapSeriesGroup = class extends import_ag_charts_core280.BaseProperties { constructor() { super(...arguments); this.fill = void 0; this.fillOpacity = 1; this.strokeWidth = 1; this.strokeOpacity = 1; this.cornerRadius = 0; this.textAlign = "center"; this.gap = 0; this.padding = 0; this.interactive = true; this.label = new TreemapGroupLabel(); this.highlight = new TreemapSeriesGroupHighlight(); } }; __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "fill", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "textAlign", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "gap", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "padding", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "interactive", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "label", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesGroup.prototype, "highlight", 2); var TreemapSeriesTile = class extends import_ag_charts_core280.BaseProperties { constructor() { super(...arguments); this.fill = void 0; this.fillOpacity = 1; this.strokeWidth = 1; this.strokeOpacity = 1; this.cornerRadius = 0; this.textAlign = "center"; this.verticalAlign = "middle"; this.gap = 0; this.padding = 0; this.label = new AutoSizedLabel(); this.secondaryLabel = new AutoSizedSecondaryLabel(); this.highlight = new TreemapSeriesTileHighlight(); } }; __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "fill", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "fillOpacity", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "stroke", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "strokeWidth", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "strokeOpacity", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "cornerRadius", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "textAlign", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "verticalAlign", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "gap", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "padding", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "label", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "secondaryLabel", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesTile.prototype, "highlight", 2); var TreemapSeriesProperties = class extends HierarchySeriesProperties2 { constructor() { super(...arguments); this.tooltip = makeSeriesTooltip24(); this.group = new TreemapSeriesGroup(); this.tile = new TreemapSeriesTile(); this.undocumentedGroupFills = []; this.undocumentedGroupStrokes = []; } getStyle(isLeaf, fills, strokes, index) { const { fillOpacity, strokeWidth, strokeOpacity, fill = isLeaf ? fills[index % fills.length] : fills[Math.min(index, fills.length)], stroke: stroke3 = isLeaf ? strokes[index % fills.length] : strokes[Math.min(index, strokes.length)] } = isLeaf ? this.tile : this.group; return { fill, fillOpacity, stroke: stroke3, strokeWidth, strokeOpacity, opacity: 1 }; } }; __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesProperties.prototype, "sizeName", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesProperties.prototype, "labelKey", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesProperties.prototype, "secondaryLabelKey", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesProperties.prototype, "itemStyler", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesProperties.prototype, "tooltip", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesProperties.prototype, "group", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesProperties.prototype, "tile", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesProperties.prototype, "undocumentedGroupFills", 2); __decorateClass([ import_ag_charts_core280.Property ], TreemapSeriesProperties.prototype, "undocumentedGroupStrokes", 2); // packages/ag-charts-enterprise/src/series/treemap/treemapSeries.ts var { createDatumId: createDatumId23, Rect: Rect10, Group: Group22, BBox: BBox29, Selection: Selection18, Text: Text10, Transformable: Transformable6, getLabelStyles: getLabelStyles8, HierarchyHighlightState, toHierarchyHighlightString: toHierarchyHighlightString2 } = import_ag_charts_community258._ModuleSupport; var TreemapNode = class extends import_ag_charts_community258._ModuleSupport.HierarchyNode { constructor() { super(...arguments); this.labelValue = void 0; this.secondaryLabelValue = void 0; this.label = void 0; this.secondaryLabel = void 0; this.bbox = void 0; this.padding = void 0; } }; function nodeSize(node) { return node.children.length > 0 ? node.sumSize - node.sizeValue : node.sizeValue; } var textAlignFactors2 = { left: 0, center: 0.5, right: 1 }; var verticalAlignFactors4 = { top: 0, middle: 0.5, bottom: 1 }; var DistantGroup = class extends import_ag_charts_community258._ModuleSupport.Group { distanceSquared(x, y) { return this.getBBox().distanceSquared(x, y); } }; var TreemapSeries = class extends import_ag_charts_community258._ModuleSupport.HierarchySeries { constructor() { super(...arguments); this.NodeClass = TreemapNode; this.properties = new TreemapSeriesProperties(); this.rectGroup = this.contentGroup.appendChild(new Group22()); this.datumSelection = Selection18.select(this.rectGroup, Rect10); this.labelSelection = Selection18.select(this.labelGroup, Group22); this.highlightSelection = Selection18.select( this.rectGroup, Rect10 ); } groupTitleHeight(node, bbox) { const heightRatioThreshold = 3; const { label } = this.properties.group; const { labelValue } = node; const { fontSize } = label; if (label.enabled && labelValue != null && fontSize <= bbox.width / heightRatioThreshold && fontSize <= bbox.height / heightRatioThreshold) { const { height: fontHeight } = (0, import_ag_charts_core281.cachedTextMeasurer)(label).measureLines(labelValue); return Math.max(fontHeight, fontSize); } } getNodePadding(node, bbox) { if (node.parent == null) { return { top: 0, right: 0, bottom: 0, left: 0 }; } else if (node.children.length === 0) { const { padding: padding3 } = this.properties.tile; return { top: padding3, right: padding3, bottom: padding3, left: padding3 }; } const { padding: padding2, label: { spacing } } = this.properties.group; const fontHeight = this.groupTitleHeight(node, bbox); const titleHeight = fontHeight == null ? 0 : fontHeight + spacing; return { top: padding2 + titleHeight, right: padding2, bottom: padding2, left: padding2 }; } sortChildren({ children }) { const sortedChildrenIndices = Array.from(children, (_, i) => i).filter((i) => nodeSize(children[i]) > 0).sort((aIndex, bIndex) => nodeSize(children[bIndex]) - nodeSize(children[aIndex])); const childAt = (i) => { const sortedIndex = sortedChildrenIndices[i]; return children[sortedIndex]; }; return { sortedChildrenIndices, childAt }; } /** * Squarified Treemap algorithm * https://www.win.tue.nl/~vanwijk/stm.pdf */ squarify(node, bbox) { const { datum, children } = node; if (bbox.width <= 0 || bbox.height <= 0) { node.bbox = void 0; node.padding = void 0; node.midPoint.x = Number.NaN; node.midPoint.y = Number.NaN; return; } const padding2 = datum == null ? { top: 0, right: 0, bottom: 0, left: 0 } : this.getNodePadding(node, bbox); if (node.parent == null) { node.bbox = void 0; node.padding = void 0; node.midPoint.x = Number.NaN; node.midPoint.y = Number.NaN; } else { node.bbox = bbox; node.padding = padding2; node.midPoint.x = bbox.x + bbox.width / 2; node.midPoint.y = bbox.y; } const { sortedChildrenIndices, childAt } = this.sortChildren(node); const allLeafNodes = sortedChildrenIndices.every((sortedIndex) => children[sortedIndex].children.length === 0); const targetTileAspectRatio = 1; const width = bbox.width - padding2.left - padding2.right; const height = bbox.height - padding2.top - padding2.bottom; if (width <= 0 || height <= 0) return; const numChildren = sortedChildrenIndices.length; let stackSum = 0; let startIndex = 0; let minRatioDiff = Infinity; let partitionSum = sortedChildrenIndices.reduce((sum, sortedIndex) => sum + nodeSize(children[sortedIndex]), 0); const innerBox = new BBox29(bbox.x + padding2.left, bbox.y + padding2.top, width, height); const partition = innerBox.clone(); let i = 0; while (i < numChildren) { const value = nodeSize(childAt(i)); const firstValue = nodeSize(childAt(startIndex)); const isVertical2 = partition.width < partition.height; stackSum += value; const partThickness = isVertical2 ? partition.height : partition.width; const partLength = isVertical2 ? partition.width : partition.height; const firstTileLength = partLength * firstValue / stackSum; let stackThickness = partThickness * stackSum / partitionSum; const ratio8 = Math.max(firstTileLength, stackThickness) / Math.min(firstTileLength, stackThickness); const diff8 = Math.abs(targetTileAspectRatio - ratio8); if (diff8 < minRatioDiff) { minRatioDiff = diff8; i++; continue; } stackSum -= value; stackThickness = partThickness * stackSum / partitionSum; let start2 = isVertical2 ? partition.x : partition.y; for (let j = startIndex; j < i; j++) { const child = childAt(j); const childSize = nodeSize(child); const x = isVertical2 ? start2 : partition.x; const y = isVertical2 ? partition.y : start2; const length = partLength * childSize / stackSum; const stackWidth = isVertical2 ? length : stackThickness; const stackHeight = isVertical2 ? stackThickness : length; const childBbox = new BBox29(x, y, stackWidth, stackHeight); this.applyGap(innerBox, childBbox, allLeafNodes); this.squarify(child, childBbox); partitionSum -= childSize; start2 += length; } if (isVertical2) { partition.y += stackThickness; partition.height -= stackThickness; } else { partition.x += stackThickness; partition.width -= stackThickness; } startIndex = i; stackSum = 0; minRatioDiff = Infinity; } const isVertical = partition.width < partition.height; let start = isVertical ? partition.x : partition.y; for (let childIdx = startIndex; childIdx < numChildren; childIdx++) { const child = childAt(childIdx); const x = isVertical ? start : partition.x; const y = isVertical ? partition.y : start; const part = nodeSize(child) / partitionSum; const childWidth = partition.width * (isVertical ? part : 1); const childHeight = partition.height * (isVertical ? 1 : part); const childBox = new BBox29(x, y, childWidth, childHeight); this.applyGap(innerBox, childBox, allLeafNodes); this.squarify(child, childBox); start += isVertical ? childWidth : childHeight; } } applyGap(innerBox, childBox, allLeafNodes) { const gap = allLeafNodes ? this.properties.tile.gap * 0.5 : this.properties.group.gap * 0.5; const getBounds = (box) => ({ left: box.x, top: box.y, right: box.x + box.width, bottom: box.y + box.height }); const innerBounds = getBounds(innerBox); const childBounds = getBounds(childBox); const sides = ["top", "right", "bottom", "left"]; for (const side of sides) { if (!(0, import_ag_charts_core281.isNumberEqual)(innerBounds[side], childBounds[side])) { childBox.shrink(gap, side); } } } createNodeData() { return void 0; } getItemStyle(nodeDatum, isLeaf, isHighlight) { const { properties, colorScale } = this; const { itemStyler } = properties; const rootIndex = nodeDatum.datumIndex?.[0] ?? 0; const fills = isLeaf ? properties.fills : properties.undocumentedGroupFills; const strokes = isLeaf ? properties.strokes : properties.undocumentedGroupStrokes; const index = isLeaf ? rootIndex : nodeDatum.depth ?? -1; const highlightedNode = this.getActiveHighlightNode(); const tileHighlightState = this.getHierarchyHighlightState(isHighlight, highlightedNode, nodeDatum); const groupHighlightState = this.getGroupHighlightState(isHighlight, highlightedNode, nodeDatum); const highlightState = isLeaf ? tileHighlightState : groupHighlightState; const highlightStyle = isLeaf ? this.getTileHighlightStyle(tileHighlightState, groupHighlightState, highlightedNode) : this.getGroupHighlightStyle(groupHighlightState); const baseStyle = (0, import_ag_charts_core281.mergeDefaults)(highlightStyle, properties.getStyle(isLeaf, fills, strokes, index)); if (isLeaf && nodeDatum.colorValue != null && highlightStyle?.fill == null) { baseStyle.fill = colorScale.convert(nodeDatum.colorValue); } let style = baseStyle; if (itemStyler != null && nodeDatum != null) { const overrides = this.cachedDatumCallback( createDatumId23(this.getDatumId(nodeDatum), isHighlight ? "highlight" : "node"), () => { const params = this.makeItemStylerParams( nodeDatum, style, toHierarchyHighlightString2(highlightState) ); return this.callWithContext(itemStyler, params); } ); if (overrides) { style = (0, import_ag_charts_core281.mergeDefaults)(overrides, style); } } return style; } makeItemStylerParams(nodeDatum, style, highlightState) { const { id: seriesId } = this; const fill = this.filterItemStylerFillParams(style.fill) ?? style.fill; return { seriesId, datum: nodeDatum.datum, depth: nodeDatum.depth ?? -1, highlightState, ...style, fill }; } updateSelections() { const highlightedNode = this.getActiveHighlightNode(); this.highlightSelection.update( highlightedNode == null ? [] : [highlightedNode], void 0, (node) => this.getDatumId(node) ); if (!this.nodeDataRefresh) { return; } this.nodeDataRefresh = false; const { seriesRect } = this.chart ?? {}; if (!seriesRect) return; const descendants = Array.from(this.rootNode); const updateLabelGroup = (group) => { group.append([new Text10({ tag: 0 /* Primary */ }), new Text10({ tag: 1 /* Secondary */ })]); }; this.datumSelection.update(descendants, void 0, (node) => this.getDatumId(node)); this.labelSelection.update(descendants, updateLabelGroup, (node) => this.getDatumId(node)); } getActiveHighlightNode() { const highlightedNode = super.getActiveHighlightNode(); if (highlightedNode?.children.length && !this.properties.group.interactive) { return void 0; } return highlightedNode; } updateNodes() { const { rootNode, data } = this; const { childrenKey, colorKey, colorName, labelKey, secondaryLabelKey, sizeKey, sizeName, tile, group } = this.properties; const { seriesRect } = this.chart ?? {}; if (!seriesRect || !data) return; this.rootNode?.walk((node) => { const { datum, depth, children } = node; const isLeaf = children.length === 0; const labelStyle = isLeaf ? tile.label : group.label; let labelValue; if (labelStyle.enabled && datum != null && depth != null && labelKey != null) { const value = datum[labelKey]; labelValue = this.getLabelText( value, datum, labelKey, "label", [], labelStyle, { depth, datum, childrenKey, colorKey, colorName, labelKey, secondaryLabelKey, sizeKey, sizeName, value } ); } if (labelValue === "") { labelValue = void 0; } let secondaryLabelValue; if (tile.secondaryLabel.enabled && isLeaf && datum != null && depth != null && secondaryLabelKey != null) { const value = datum[secondaryLabelKey]; secondaryLabelValue = this.getLabelText( value, datum, secondaryLabelKey, "secondaryLabel", [], tile.secondaryLabel, { depth, datum, childrenKey, colorKey, colorName, labelKey, secondaryLabelKey, sizeKey, sizeName, value } ); } if (secondaryLabelValue === "") { secondaryLabelValue = void 0; } node.labelValue = (0, import_ag_charts_core281.toPlainText)(labelValue); node.secondaryLabelValue = (0, import_ag_charts_core281.toPlainText)(secondaryLabelValue); }); const { width, height } = seriesRect; this.squarify(rootNode, new BBox29(0, 0, width, height)); this.rootNode?.walk((node) => { const { bbox, children, labelValue, secondaryLabelValue } = node; node.label = void 0; node.secondaryLabel = void 0; if (bbox == null) return; if (children.length === 0) { const layout = { width: bbox.width, height: bbox.height, meta: null }; const formatting = formatLabels( labelValue, this.properties.tile.label, secondaryLabelValue, this.properties.tile.secondaryLabel, { padding: tile.padding }, () => layout ); if (formatting == null) { return; } const { height: labelHeight, label, secondaryLabel } = formatting; const { textAlign, verticalAlign, padding: padding2 } = tile; const textAlignFactor = textAlignFactors2[textAlign] ?? 0.5; const labelX = bbox.x + padding2 + (bbox.width - 2 * padding2) * textAlignFactor; const verticalAlignFactor = verticalAlignFactors4[verticalAlign] ?? 0.5; const labelYStart = bbox.y + padding2 + labelHeight * 0.5 + (bbox.height - 2 * padding2 - labelHeight) * verticalAlignFactor; if (label != null) { const { fontStyle = "normal", fontFamily, fontWeight = "normal", color: color7 = "black" } = this.properties.tile.label; node.label = { text: label.text, fontSize: label.fontSize, lineHeight: label.lineHeight, fontStyle, fontFamily, fontWeight, color: color7, textAlign, verticalAlign: "middle", x: labelX, y: labelYStart - (labelHeight - label.height) * 0.5 }; } if (secondaryLabel != null) { const { fontStyle = "normal", fontFamily, fontWeight = "normal", color: color7 = "black" } = this.properties.tile.secondaryLabel; node.secondaryLabel = { text: secondaryLabel.text, fontSize: secondaryLabel.fontSize, lineHeight: secondaryLabel.fontSize, fontStyle, fontFamily, fontWeight, color: color7, textAlign, verticalAlign: "middle", x: labelX, y: labelYStart + (labelHeight - secondaryLabel.height) * 0.5 }; } } else if (labelValue == null) { return; } else { const { padding: padding2, textAlign } = group; const groupTitleHeight = this.groupTitleHeight(node, bbox); if (groupTitleHeight == null) return; const innerWidth = bbox.width - 2 * padding2; const text2 = (0, import_ag_charts_core281.wrapText)(labelValue, { maxWidth: bbox.width - 2 * padding2, font: group.label, textWrap: "never" }); const textAlignFactor = textAlignFactors2[textAlign] ?? 0.5; const { fontStyle = "normal", fontFamily, fontWeight = "normal", color: color7 = "black" } = this.properties.group.label; node.label = { text: text2, fontSize: group.label.fontSize, lineHeight: (0, import_ag_charts_core281.calcLineHeight)(group.label.fontSize), fontStyle, fontFamily, fontWeight, color: color7, textAlign, verticalAlign: "middle", x: bbox.x + padding2 + innerWidth * textAlignFactor, y: bbox.y + padding2 + groupTitleHeight * 0.5 }; } }); const fillBBox = { series: new BBox29(0, 0, width, height), axis: new BBox29(0, 0, width, height) }; const updateRectFn = (node, rect, isHighlight) => { const { bbox } = node; if (bbox == null) { rect.visible = false; return; } const { depth = -1 } = node; const isLeaf = node.children.length === 0; const style = this.getItemStyle(node, isLeaf, isHighlight); rect.crisp = true; rect.setStyleProperties(style, fillBBox); rect.cornerRadius = isLeaf ? tile.cornerRadius : group.cornerRadius; rect.zIndex = [0, depth, isHighlight ? 1 : 0]; const onlyLeaves = node.parent?.children.every((n) => n.children.length === 0); const parentBbox = node.parent == null ? void 0 : node.parent.bbox; const parentPadding = node.parent == null ? void 0 : node.parent.padding; if (onlyLeaves === true && parentBbox != null && parentPadding != null) { rect.clipBBox = bbox; rect.x = parentBbox.x + parentPadding.left; rect.y = parentBbox.y + parentPadding.top; rect.width = parentBbox.width - (parentPadding.left + parentPadding.right); rect.height = parentBbox.height - (parentPadding.top + parentPadding.bottom); } else { rect.clipBBox = void 0; rect.x = bbox.x; rect.y = bbox.y; rect.width = bbox.width; rect.height = bbox.height; } rect.visible = true; }; this.datumSelection.each((rect, datum) => updateRectFn(datum, rect, false)); this.highlightSelection.each((rect, datum) => { updateRectFn(datum, rect, true); }); const updateLabelFn = (node, text2, tag, highlighted) => { const isLeaf = node.children.length === 0; const label = tag === 0 /* Primary */ ? node.label : node.secondaryLabel; if (label == null) { text2.visible = false; return; } let labelProps; let labelPath; if (tag === 0 /* Primary */) { labelProps = isLeaf ? tile.label : group.label; labelPath = ["series", `${this.declarationOrder}`, isLeaf ? "tile" : "group", "label"]; } else { labelProps = tile.secondaryLabel; labelPath = ["series", `${this.declarationOrder}`, "tile", "secondaryLabel"]; } const { opacity: highlightOpacity } = this.getItemStyle(node, isLeaf, highlighted) ?? {}; const params = { childrenKey: this.properties.childrenKey, colorKey: this.properties.colorKey, colorName: this.properties.colorName ?? this.properties.colorKey, depth: node.depth ?? Number.NaN, labelKey: this.properties.labelKey, secondaryLabelKey: this.properties.secondaryLabelKey, sizeKey: this.properties.sizeKey, sizeName: this.properties.sizeName ?? this.properties.sizeKey }; const activeHighlight = this.ctx.highlightManager?.getActiveHighlight(); const style = getLabelStyles8(this, node, params, labelProps, highlighted, activeHighlight, labelPath); text2.text = label.text; text2.fontSize = label.fontSize; text2.lineHeight = label.lineHeight; text2.fontStyle = label.fontStyle; text2.fontFamily = label.fontFamily; text2.fontWeight = label.fontWeight; text2.fillOpacity = highlightOpacity ?? 1; text2.fill = style.color; text2.setBoxing(style); text2.textAlign = label.textAlign; text2.textBaseline = label.verticalAlign; text2.x = label.x; text2.y = label.y; text2.visible = true; text2.zIndex = 1; }; const highlightedDatum = this.getActiveHighlightNode(); for (const text2 of this.labelSelection.selectByClass(Text10)) { const datum = text2.closestDatum(); updateLabelFn(datum, text2, text2.tag, datum === highlightedDatum); } } getGroupHighlightState(isHighlight, highlightedNode, nodeDatum) { const nodeIndex = nodeDatum.datumIndex; const highlightedIndex = highlightedNode?.datumIndex; const isDescendant = this.isDescendantDatumIndex(nodeIndex, highlightedIndex); if (nodeDatum.children?.length === 0) { if (nodeIndex == null || highlightedNode == null || highlightedNode.children?.length === 0) { return HierarchyHighlightState.None; } return isDescendant ? HierarchyHighlightState.Item : HierarchyHighlightState.OtherItem; } if (highlightedNode == null || highlightedNode.children?.length === 0) { return HierarchyHighlightState.None; } const isSibling = nodeDatum.depth != null && highlightedNode.depth != null && nodeDatum.depth === highlightedNode.depth; if (isDescendant && !isSibling) { return HierarchyHighlightState.None; } return isHighlight ? HierarchyHighlightState.Item : HierarchyHighlightState.OtherItem; } getTileHighlightStyle(tileHighlightState, groupHighlightState, highlightedNode) { const isGroupHighlighted = highlightedNode?.children && highlightedNode.children.length > 0; if (isGroupHighlighted) { const groupStyle = this.getGroupHighlightStyle(groupHighlightState); if (groupStyle?.fillOpacity == null && groupStyle?.strokeOpacity == null) { return void 0; } return { fillOpacity: groupStyle.fillOpacity, strokeOpacity: groupStyle.strokeOpacity }; } return this.getHierarchyHighlightStyles(tileHighlightState, this.properties.tile.highlight); } getGroupHighlightStyle(highlightState) { const { highlight } = this.properties.group; switch (highlightState) { case HierarchyHighlightState.Item: return highlight.highlightedItem; case HierarchyHighlightState.OtherItem: return highlight.unhighlightedItem; default: return void 0; } } getHighlightStateString(_datum, isHighlight, datumIndex) { if (datumIndex == null) { return toHierarchyHighlightString2(HierarchyHighlightState.None); } const nodeDatum = datumIndex.reduce((node, idx) => node?.children[idx], this.rootNode); const highlightedNode = this.getActiveHighlightNode(); if (nodeDatum == null) { return toHierarchyHighlightString2(HierarchyHighlightState.None); } const isLeaf = (nodeDatum.children?.length ?? 0) === 0; if (isLeaf) { const tileState = this.getHierarchyHighlightState(isHighlight ?? false, highlightedNode, nodeDatum); return toHierarchyHighlightString2(tileState); } const groupState = this.getGroupHighlightState(isHighlight ?? false, highlightedNode, nodeDatum); return toHierarchyHighlightString2(groupState); } isDescendantDatumIndex(nodeIndex, ancestorIndex) { if (ancestorIndex == null || ancestorIndex.length === 0) { return true; } if (nodeIndex == null || nodeIndex.length < ancestorIndex.length) { return false; } for (let i = 0; i < ancestorIndex.length; i += 1) { if (nodeIndex[i] !== ancestorIndex[i]) { return false; } } return true; } pickNodesExactShape(point) { const nodes = super.pickNodesExactShape(point); nodes.sort((a, b) => b.datumIndex.length - a.datumIndex.length); return nodes; } pickNodeClosestDatum(point) { const exactMatch = this.pickNodesExactShape(point); if (exactMatch.length !== 0) { return { datum: exactMatch[0], distance: 0 }; } return this.pickNodeNearestDistantObject(point, this.datumSelection.nodes()); } getTooltipContent(datumIndex) { const { id: seriesId, properties, ctx } = this; const { formatManager } = ctx; const { labelKey, secondaryLabelKey, childrenKey, sizeKey, sizeName, colorKey, colorName, tooltip } = properties; const nodeDatum = datumIndex.reduce((n, i) => n?.children[i], this.rootNode); if (nodeDatum == null) return; const { datum, depth, children } = nodeDatum; if (datum == null || depth == null) return; const isLeaf = children.length === 0; const data = []; const datumSize = sizeKey == null ? void 0 : datum[sizeKey]; if (datumSize != null) { const sizeDomain = [0, this.rootNode?.sumSize ?? 0]; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: datumSize, datum, seriesId, legendItemName: void 0, key: sizeKey, source: "tooltip", property: "size", boundSeries: this.getFormatterContext("size"), domain: sizeDomain, fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: sizeName, fallbackLabel: sizeKey, value: content ?? (0, import_ag_charts_core281.formatValue)(datumSize) }); } const datumColor = colorKey == null ? void 0 : datum[colorKey]; if (datumColor != null) { const { colorDomain } = this; const content = formatManager.format(this.callWithContext.bind(this), { type: "number", value: datumColor, datum, seriesId, legendItemName: void 0, key: colorKey, source: "tooltip", property: "color", boundSeries: this.getFormatterContext("color"), domain: colorDomain, fractionDigits: void 0, visibleDomain: void 0 }); data.push({ label: colorName, fallbackLabel: colorKey, value: content ?? (0, import_ag_charts_core281.formatValue)(datumColor) }); } const format = this.getItemStyle( { ...nodeDatum, colorValue: datumColor ?? nodeDatum.colorValue }, isLeaf, false ); const color7 = format.fill; const markerStyle = { shape: "square", fill: color7, fillOpacity: 1, stroke: void 0, strokeWidth: 0, strokeOpacity: 1, lineDash: [0], lineDashOffset: 0 }; if ((0, import_ag_charts_core281.isGradientFill)(markerStyle.fill)) { markerStyle.fill = { ...markerStyle.fill, gradient: "linear", rotation: 0, reverse: false }; } const symbol = isLeaf ? { marker: markerStyle } : void 0; return this.formatTooltipWithContext( tooltip, { title: labelKey == null ? void 0 : datum[labelKey], symbol, data }, { seriesId, datum, title: void 0, depth, labelKey, secondaryLabelKey, childrenKey, sizeKey, sizeName, colorKey, colorName, ...format } ); } computeFocusBounds(node) { return Transformable6.toCanvas(this.contentGroup, node.getBBox()); } hasItemStylers() { return this.properties.itemStyler != null || this.properties.tile.label.itemStyler != null || this.properties.group.label.itemStyler != null; } }; TreemapSeries.className = "TreemapSeries"; TreemapSeries.type = "treemap"; // packages/ag-charts-enterprise/src/series/treemap/treemapSeriesOptionsDef.ts var import_ag_charts_community259 = require("ag-charts-community"); var import_ag_charts_core282 = require("ag-charts-core"); var { treemapSeriesThemeableOptionsDef } = import_ag_charts_community259._ModuleSupport; var treemapSeriesOptionsDef = { ...treemapSeriesThemeableOptionsDef, ...(0, import_ag_charts_core282.without)(import_ag_charts_core282.commonSeriesOptionsDefs, ["highlightStyle", "highlight", "showInLegend"]), type: (0, import_ag_charts_core282.required)((0, import_ag_charts_core282.constant)("treemap")), labelKey: import_ag_charts_core282.string, secondaryLabelKey: import_ag_charts_core282.string, childrenKey: import_ag_charts_core282.string, sizeKey: import_ag_charts_core282.string, colorKey: import_ag_charts_core282.string, sizeName: import_ag_charts_core282.string, colorName: import_ag_charts_core282.string }; treemapSeriesOptionsDef.undocumentedGroupFills = (0, import_ag_charts_core282.undocumented)((0, import_ag_charts_core282.arrayOf)(import_ag_charts_core282.color)); treemapSeriesOptionsDef.undocumentedGroupStrokes = (0, import_ag_charts_core282.undocumented)((0, import_ag_charts_core282.arrayOf)(import_ag_charts_core282.color)); // packages/ag-charts-enterprise/src/series/treemap/treemapModule.ts var TreemapSeriesModule = { type: "series", name: "treemap", chartType: "standalone", enterprise: true, solo: true, version: import_ag_charts_community260.VERSION, dependencies: [StandaloneChartModule], options: treemapSeriesOptionsDef, themeTemplate: { series: { fills: { $applyCycle: [ { $size: { $path: ["./data", { $path: "/data" }] } }, { $palette: "fills" }, { $applySwitch: [ { $path: ["/type", void 0, { $value: "$1" }] }, { $value: "$1" }, ["gradient", import_ag_charts_core283.FILL_GRADIENT_LINEAR_DEFAULTS], ["pattern", import_ag_charts_core283.FILL_PATTERN_DEFAULTS], ["image", import_ag_charts_core283.FILL_IMAGE_DEFAULTS] ] } ] }, strokes: { $applyCycle: [{ $size: { $path: ["./data", { $path: "/data" }] } }, { $palette: "strokes" }] }, colorRange: { $palette: "divergingColors" }, undocumentedGroupFills: { $palette: "hierarchyColors" }, undocumentedGroupStrokes: { $palette: "secondHierarchyColors" }, group: { label: { ...import_ag_charts_core283.LABEL_BOXING_DEFAULTS, enabled: true, color: { $ref: "textColor" }, fontStyle: void 0, fontWeight: { $ref: "fontWeight" }, fontSize: { $ref: "fontSize" }, fontFamily: { $ref: "fontFamily" }, spacing: 4 }, fill: void 0, // Override default fill stroke: void 0, // Override default stroke strokeWidth: 1, padding: 4, gap: 2, textAlign: "left", highlight: { unhighlightedItem: { opacity: 0.2, fillOpacity: 0.2, strokeOpacity: 0.2 } } }, tile: { label: { ...import_ag_charts_core283.LABEL_BOXING_DEFAULTS, enabled: true, color: { $ref: "chartBackgroundColor" }, fontStyle: void 0, fontWeight: { $ref: "fontWeight" }, fontSize: { $rem: 1.5 }, minimumFontSize: { $rem: import_ag_charts_core283.FONT_SIZE_RATIO.SMALLER }, fontFamily: { $ref: "fontFamily" }, wrapping: "on-space", overflowStrategy: "ellipsis", spacing: 2 }, secondaryLabel: { ...import_ag_charts_core283.LABEL_BOXING_DEFAULTS, enabled: true, color: { $ref: "chartBackgroundColor" }, fontStyle: void 0, fontWeight: void 0, fontSize: { $ref: "fontSize" }, minimumFontSize: { $rem: import_ag_charts_core283.FONT_SIZE_RATIO.SMALLER }, fontFamily: { $ref: "fontFamily" }, wrapping: "never", overflowStrategy: "ellipsis" }, fill: void 0, // Override default fill stroke: void 0, // Override default stroke strokeWidth: { $isUserOption: ["../strokes/0", 2, { $isUserOption: ["./stroke", 2, 0] }] }, padding: 3, gap: 1, highlight: { unhighlightedItem: { fillOpacity: 0.6, strokeOpacity: 0.6 }, unhighlightedBranch: { fillOpacity: 0.2, strokeOpacity: 0.2 } } } }, gradientLegend: { enabled: { $if: [{ $path: "../series/0/colorKey" }, true, false] } } }, create: (ctx) => new TreemapSeries(ctx) }; // packages/ag-charts-enterprise/src/module-bundles/all.ts var import_ag_charts_community267 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/module-bundles/cartesian-axes.ts var import_ag_charts_community261 = require("ag-charts-community"); var AllCartesianAxesModule = [ import_ag_charts_community261.AllCartesianAxesModule, OrdinalTimeAxisModule ].flat(); // packages/ag-charts-enterprise/src/module-bundles/cartesian-series.ts var import_ag_charts_community262 = require("ag-charts-community"); var AllCartesianSeriesModule = [ import_ag_charts_community262.AllCartesianSeriesModule, BoxPlotSeriesModule, CandlestickSeriesModule, ConeFunnelSeriesModule, FunnelSeriesModule, HeatmapSeriesModule, OhlcSeriesModule, RangeAreaSeriesModule, RangeBarSeriesModule, WaterfallSeriesModule ].flat(); // packages/ag-charts-enterprise/src/module-bundles/cartesian.ts var AllCartesianModule = [ AllCartesianAxesModule, AllCartesianSeriesModule, AnimationModule, AnnotationsModule, BandHighlightModule, ChartToolbarModule, ContextMenuModule, CrosshairModule, DataSourceModule, ErrorBarsModule, FlashOnUpdateModule, GradientLegendModule, NavigatorModule, RangesModule, ScrollbarModule, StatusBarModule, SyncModule, ZoomModule ].flat(); // packages/ag-charts-enterprise/src/module-bundles/financial.ts var import_ag_charts_community265 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/preset/priceVolumePresetModules.ts var import_ag_charts_community264 = require("ag-charts-community"); var import_ag_charts_core286 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/preset/priceVolumePreset.ts var import_ag_charts_community263 = require("ag-charts-community"); var import_ag_charts_core285 = require("ag-charts-core"); // packages/ag-charts-enterprise/src/preset/priceVolumePresetTheme.ts var ThemeSymbols2 = __toESM(require("ag-charts-core")); var import_ag_charts_core284 = require("ag-charts-core"); var { DEFAULT_ANNOTATION_HANDLE_FILL: DEFAULT_ANNOTATION_HANDLE_FILL2, DEFAULT_ANNOTATION_STATISTICS_COLOR: DEFAULT_ANNOTATION_STATISTICS_COLOR2, DEFAULT_ANNOTATION_STATISTICS_DIVIDER_STROKE: DEFAULT_ANNOTATION_STATISTICS_DIVIDER_STROKE2, DEFAULT_ANNOTATION_STATISTICS_DOWN_FILL: DEFAULT_ANNOTATION_STATISTICS_DOWN_FILL2, DEFAULT_ANNOTATION_STATISTICS_DOWN_STROKE: DEFAULT_ANNOTATION_STATISTICS_DOWN_STROKE2, DEFAULT_ANNOTATION_STATISTICS_FILL: DEFAULT_ANNOTATION_STATISTICS_FILL2, DEFAULT_ANNOTATION_STATISTICS_STROKE: DEFAULT_ANNOTATION_STATISTICS_STROKE2, DEFAULT_FIBONACCI_STROKES: DEFAULT_FIBONACCI_STROKES2, DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL2, DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2, DEFAULT_TEXTBOX_COLOR: DEFAULT_TEXTBOX_COLOR2, DEFAULT_TEXTBOX_FILL: DEFAULT_TEXTBOX_FILL2, DEFAULT_TEXTBOX_STROKE: DEFAULT_TEXTBOX_STROKE2, DEFAULT_TEXT_ANNOTATION_COLOR } = ThemeSymbols2; var stroke2 = { stroke: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2 }; var handle2 = { fill: DEFAULT_ANNOTATION_HANDLE_FILL2 }; var axisLabel2 = { color: "white", fill: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2 }; var lineText2 = { color: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2 }; var font2 = { color: DEFAULT_TEXT_ANNOTATION_COLOR, fontSize: { $rem: import_ag_charts_core284.FONT_SIZE_RATIO.LARGE }, fontFamily: { $ref: "fontFamily" } }; var measurerStatistics2 = { ...font2, fontSize: { $ref: "fontSize" }, color: DEFAULT_ANNOTATION_STATISTICS_COLOR2, fill: DEFAULT_ANNOTATION_STATISTICS_FILL2, stroke: DEFAULT_ANNOTATION_STATISTICS_STROKE2, strokeWidth: 1, divider: { stroke: DEFAULT_ANNOTATION_STATISTICS_DIVIDER_STROKE2, strokeWidth: 1, strokeOpacity: 0.5 } }; var measurer2 = { ...stroke2, background: { fill: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL2, fillOpacity: 0.2 }, handle: { ...handle2 }, text: { ...lineText2 }, statistics: { ...measurerStatistics2 } }; var annotationsTheme2 = { // Lines line: { ...stroke2, handle: { ...handle2 }, text: { ...lineText2 } }, "horizontal-line": { ...stroke2, handle: { ...handle2 }, axisLabel: { ...axisLabel2 }, text: { ...lineText2 } }, "vertical-line": { ...stroke2, handle: { ...handle2 }, axisLabel: { ...axisLabel2 }, text: { ...lineText2 } }, // Channels "disjoint-channel": { ...stroke2, background: { fill: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL2, fillOpacity: 0.2 }, handle: { ...handle2 }, text: { ...lineText2 } }, "parallel-channel": { ...stroke2, background: { fill: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL2, fillOpacity: 0.2 }, handle: { ...handle2 }, text: { ...lineText2 } }, // Fibonnaccis "fibonacci-retracement": { ...stroke2, strokes: DEFAULT_FIBONACCI_STROKES2, rangeStroke: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2, handle: { ...handle2 }, text: { ...lineText2, position: "center" }, label: { ...font2, color: void 0, fontSize: { $rem: import_ag_charts_core284.FONT_SIZE_RATIO.SMALLER } } }, "fibonacci-retracement-trend-based": { ...stroke2, strokes: DEFAULT_FIBONACCI_STROKES2, rangeStroke: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2, handle: { ...handle2 }, text: { ...lineText2, position: "center" }, label: { ...font2, color: void 0, fontSize: { $rem: import_ag_charts_core284.FONT_SIZE_RATIO.SMALLER } } }, // Texts callout: { ...stroke2, ...font2, color: { $ref: "textColor" }, handle: { ...handle2 }, fill: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL2, fillOpacity: 0.2 }, comment: { ...font2, color: "white", fontWeight: 700, handle: { ...handle2 }, fill: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2 }, note: { ...font2, color: DEFAULT_TEXTBOX_COLOR2, fill: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2, stroke: { $ref: "chartBackgroundColor" }, strokeWidth: 1, strokeOpacity: 1, handle: { ...handle2 }, background: { fill: DEFAULT_TEXTBOX_FILL2, stroke: DEFAULT_TEXTBOX_STROKE2, strokeWidth: 1 } }, text: { ...font2, handle: { ...handle2 } }, // Shapes arrow: { ...stroke2, handle: { ...handle2 }, text: { ...lineText2 } }, "arrow-up": { fill: { $palette: "up.fill" }, handle: { ...handle2, stroke: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2 } }, "arrow-down": { fill: { $palette: "down.fill" }, handle: { ...handle2, stroke: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_COLOR2 } }, // Measurers "date-range": { ...measurer2 }, "price-range": { ...measurer2 }, "date-price-range": { ...measurer2 }, "quick-date-price-range": { up: { ...stroke2, fill: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL2, fillOpacity: 0.2, handle: { ...handle2 }, statistics: { ...measurerStatistics2, color: "#fff", fill: DEFAULT_FINANCIAL_CHARTS_ANNOTATION_BACKGROUND_FILL2, strokeWidth: 0, divider: { stroke: "#fff", strokeWidth: 1, strokeOpacity: 0.5 } } }, down: { ...stroke2, stroke: DEFAULT_ANNOTATION_STATISTICS_DOWN_STROKE2, fill: DEFAULT_ANNOTATION_STATISTICS_DOWN_FILL2, fillOpacity: 0.2, handle: { ...handle2, stroke: DEFAULT_ANNOTATION_STATISTICS_DOWN_STROKE2 }, statistics: { ...measurerStatistics2, color: "#fff", fill: DEFAULT_ANNOTATION_STATISTICS_DOWN_FILL2, strokeWidth: 0, divider: { stroke: "#fff", strokeWidth: 1, strokeOpacity: 0.5 } } } }, axesButtons: { enabled: true } }; // packages/ag-charts-enterprise/src/preset/priceVolumePreset.ts var chartTypes = ["ohlc", "line", "step-line", "hlc", "high-low", "candlestick", "hollow-candlestick"]; var toolbarButtons = [ { icon: "trend-line-drawing", tooltip: "toolbarAnnotationsLineAnnotations", value: "line-menu" }, { icon: "fibonacci-retracement-drawing", tooltip: "toolbarAnnotationsFibonacciAnnotations", value: "fibonacci-menu" }, { icon: "text-annotation", tooltip: "toolbarAnnotationsTextAnnotations", value: "text-menu" }, { icon: "arrow-drawing", tooltip: "toolbarAnnotationsShapeAnnotations", value: "shape-menu" }, { icon: "measurer-drawing", tooltip: "toolbarAnnotationsMeasurerAnnotations", value: "measurer-menu" }, { icon: "delete", tooltip: "toolbarAnnotationsClearAll", value: "clear" } ]; function priceVolume(opts, _presetTheme, getTheme) { const { dateKey = "date", highKey = "high", openKey = "open", lowKey = "low", closeKey = "close", volumeKey = "volume", chartType = "candlestick", navigator = false, volume = true, rangeButtons = true, statusBar = true, toolbar: toolbar2 = true, zoom = true, sync = false, theme, data, formatter, ...unusedOpts } = opts; const priceSeries = createPriceSeries(chartType, dateKey, highKey, lowKey, openKey, closeKey); const volumeSeries = createVolumeSeries(getTheme, dateKey, openKey, closeKey, volume, volumeKey); const miniChart = volume ? { miniChart: { enabled: navigator, series: [ { type: "line", xKey: dateKey, yKey: volumeKey, stroke: import_ag_charts_core285.SAFE_STROKE_FILL_OPERATION, marker: { enabled: false } } ] }, height: 40, minHandle: { height: 46 }, maxHandle: { height: 46 } } : null; const navigatorOpts = { navigator: { enabled: navigator, ...miniChart } }; const annotationOpts = { annotations: { enabled: toolbar2, optionsToolbar: { enabled: toolbar2 }, // @ts-expect-error undocumented option snap: true, toolbar: { enabled: toolbar2, buttons: toolbarButtons, padding: 0 }, data, xKey: dateKey, volumeKey: volume ? volumeKey : void 0 } }; const statusBarOpts = statusBar ? { statusBar: { enabled: true, highKey, openKey, lowKey, closeKey, volumeKey: volume ? volumeKey : void 0 } } : null; const zoomOpts = { zoom: { enabled: zoom, autoScaling: { enabled: true }, onDataChange: { stickToEnd: true }, // @ts-expect-error undocumented option enableIndependentAxes: true } }; const toolbarOpts = { ranges: { enabled: rangeButtons } }; const syncGroup = sync ? { sync: { enabled: sync, nodeInteraction: true, zoom: true } } : null; const volumeAxis = volume ? { yVolume: { type: "number", position: "left", label: { enabled: false }, crosshair: { enabled: false }, gridLine: { enabled: false }, nice: false, // @ts-expect-error undocumented option layoutConstraints: { stacked: false, width: 20, unit: "percent", align: "end" } } } : {}; return { theme: { baseTheme: typeof theme === "string" ? theme : "ag-financial", ...(0, import_ag_charts_core285.mergeDefaults)(typeof theme === "object" ? theme : null, { overrides: { common: { title: { padding: 4 }, padding: { top: 6, right: 8, bottom: 6 }, chartToolbar: { enabled: toolbar2 }, annotations: { ...annotationsTheme2 }, axes: { number: { interval: { maxSpacing: 45 }, label: { format: ".2f" } }, category: { gridLine: { enabled: true } }, time: { gridLine: { enabled: true } }, "unit-time": { gridLine: { enabled: true } }, "ordinal-time": { gridLine: { enabled: true } } } }, bar: { series: { fillOpacity: 0.5, highlight: { unhighlightedItem: { opacity: 1 }, unhighlightedSeries: { opacity: 1 } } } }, line: { series: { marker: { enabled: false }, highlight: { unhighlightedSeries: { opacity: 1 } }, ...inlineSwitch(chartType, { hlc: { stroke: { $palette: "altNeutral.stroke" }, strokeWidth: 2 }, line: { stroke: { $palette: "neutral.stroke" } }, "step-line": { stroke: { $palette: "neutral.stroke" }, interpolation: { type: "step" } } }) } }, candlestick: { series: { highlight: { unhighlightedItem: { opacity: 1 }, unhighlightedSeries: { opacity: 1 } }, ...inlineSwitch(chartType, { "hollow-candlestick": { item: { up: { fill: "transparent" } } } }) } }, ohlc: { series: { highlight: { unhighlightedItem: { opacity: 1 }, unhighlightedSeries: { opacity: 1 } } } }, "range-area": { series: { fillOpacity: 0.3, strokeWidth: 2, highlight: { bringToFront: false, unhighlightedItem: { opacity: 1 }, unhighlightedSeries: { opacity: 1 } }, ...inlineSwitch(chartType, { hlc: { fill: { $if: [ { $eq: [{ $value: "$index" }, 1] }, { $palette: "up.fill" }, { $palette: "down.fill" } ] }, stroke: { $if: [ { $eq: [{ $value: "$index" }, 1] }, { $palette: "up.stroke" }, { $palette: "down.stroke" } ] } } }) } }, "range-bar": { series: { highlight: { unhighlightedItem: { opacity: 1 }, unhighlightedSeries: { opacity: 1 } }, ...inlineSwitch(chartType, { "high-low": { fill: { $palette: "neutral.fill" }, stroke: { $palette: "neutral.stroke" } } }) } } } }) }, animation: { enabled: false }, legend: { enabled: false }, series: [...volumeSeries, ...priceSeries], axes: { y: { type: "number", position: "right", crosshair: { enabled: true, snap: false }, // @ts-expect-error undocumented option layoutConstraints: { stacked: false, width: 100, unit: "percent", align: "start" } }, ...volumeAxis, x: { type: "ordinal-time", position: "bottom", line: { enabled: false }, label: { enabled: true }, crosshair: { enabled: true } } }, tooltip: { enabled: false }, data, formatter, ...annotationOpts, ...navigatorOpts, ...statusBarOpts, ...zoomOpts, ...toolbarOpts, ...syncGroup, ...unusedOpts }; } function createVolumeSeries(getTheme, xKey, openKey, closeKey, volume, volumeKey) { if (!volume) return []; return [ { type: "bar", xKey, yKey: volumeKey, yKeyAxis: "yVolume", tooltip: { enabled: false }, // @ts-expect-error undocumented options: simpleItemStyler, focusPriority simpleItemStyler(datum) { const { up, down } = getTheme().palette; return { fill: datum[openKey] < datum[closeKey] ? up?.fill : down?.fill }; }, focusPriority: 1, highlight: { unhighlightedSeries: { opacity: 1 } } } ]; } var RANGE_AREA_TYPE = "range-area"; function createPriceSeries(chartType, xKey, highKey, lowKey, openKey, closeKey) { const keys = { xKey, openKey, closeKey, highKey, lowKey }; const singleKeys = { xKey, yKey: closeKey }; const common = { pickOutsideVisibleMinorAxis: true }; switch (chartType ?? "candlestick") { case "ohlc": return createPriceSeriesOHLC(common, keys); case "line": case "step-line": return createPriceSeriesLine(common, singleKeys); case "hlc": return createPriceSeriesHLC(common, singleKeys, keys); case "high-low": return createPriceSeriesHighLow(common, keys); case "candlestick": case "hollow-candlestick": return createPriceSeriesCandlestick(common, keys); default: import_ag_charts_core285.Logger.warnOnce(`unknown chart type: ${chartType}; expected one of: ${chartTypes.join(", ")}`); return createPriceSeriesCandlestick(common, keys); } } function createPriceSeriesOHLC(common, keys) { return [ { type: "ohlc", // @ts-expect-error undocumented option focusPriority: 0, ...common, ...keys } ]; } function createPriceSeriesLine(common, singleKeys) { return [ { type: "line", // @ts-expect-error undocumented option focusPriority: 0, ...common, ...singleKeys } ]; } function createPriceSeriesHLC(common, singleKeys, { xKey, highKey, closeKey, lowKey }) { return [ { type: RANGE_AREA_TYPE, // @ts-expect-error undocumented option focusPriority: 0, ...common, xKey, yHighKey: highKey, yLowKey: closeKey }, { type: RANGE_AREA_TYPE, // @ts-expect-error undocumented option focusPriority: 0, ...common, xKey, yHighKey: closeKey, yLowKey: lowKey }, { type: "line", ...common, ...singleKeys } ]; } function createPriceSeriesHighLow(common, { xKey, highKey, lowKey }) { return [ { type: "range-bar", ...common, xKey, yHighKey: highKey, yLowKey: lowKey, tooltip: { range: "nearest" }, // @ts-expect-error undocumented option focusPriority: 0 } ]; } function createPriceSeriesCandlestick(common, keys) { return [ { type: "candlestick", // @ts-expect-error undocumented option focusPriority: 0, ...common, ...keys } ]; } function inlineSwitch(caseName, switchCases) { return switchCases[caseName] ?? switchCases.default; } // packages/ag-charts-enterprise/src/preset/priceVolumePresetModules.ts var priceVolumeOptionsDef = { chartType: (0, import_ag_charts_core286.union)("candlestick", "hollow-candlestick", "ohlc", "line", "step-line", "hlc", "high-low"), dateKey: import_ag_charts_core286.string, openKey: import_ag_charts_core286.string, highKey: import_ag_charts_core286.string, lowKey: import_ag_charts_core286.string, closeKey: import_ag_charts_core286.string, volumeKey: import_ag_charts_core286.string, navigator: import_ag_charts_core286.boolean, volume: import_ag_charts_core286.boolean, rangeButtons: import_ag_charts_core286.boolean, statusBar: import_ag_charts_core286.boolean, toolbar: import_ag_charts_core286.boolean, zoom: import_ag_charts_core286.boolean, sync: import_ag_charts_core286.boolean, // Valid pass-through options theme: import_ag_charts_core286.defined, container: import_ag_charts_core286.defined, width: import_ag_charts_core286.defined, height: import_ag_charts_core286.defined, minWidth: import_ag_charts_core286.defined, minHeight: import_ag_charts_core286.defined, listeners: import_ag_charts_core286.defined, initialState: import_ag_charts_core286.defined, title: import_ag_charts_core286.defined, data: import_ag_charts_core286.array, formatter: import_ag_charts_core286.defined }; var commonGaugeOptions2 = { // Valid pass-through options theme: import_ag_charts_core286.defined, container: import_ag_charts_core286.defined, animation: import_ag_charts_core286.defined, background: import_ag_charts_core286.defined, contextMenu: import_ag_charts_core286.defined, context: () => true, listeners: import_ag_charts_core286.defined, locale: import_ag_charts_core286.defined, width: import_ag_charts_core286.defined, height: import_ag_charts_core286.defined, minWidth: import_ag_charts_core286.defined, minHeight: import_ag_charts_core286.defined, title: import_ag_charts_core286.defined, subtitle: import_ag_charts_core286.defined, footnote: import_ag_charts_core286.defined, padding: import_ag_charts_core286.defined, tooltip: { ...import_ag_charts_core286.tooltipOptionsDefs, ...import_ag_charts_core286.commonChartOptionsDefs.tooltip } }; commonGaugeOptions2.overrideDevicePixelRatio = (0, import_ag_charts_core286.undocumented)(import_ag_charts_core286.positiveNumber); var PriceVolumePresetModule = { type: "preset", name: "price-volume", enterprise: true, dependencies: [ChartToolbarModule, StatusBarModule], version: import_ag_charts_community264.VERSION, options: priceVolumeOptionsDef, create: priceVolume }; // packages/ag-charts-enterprise/src/module-bundles/financial.ts var FinancialChartModule = [ PriceVolumePresetModule, import_ag_charts_community265.BarSeriesModule, import_ag_charts_community265.LineSeriesModule, CandlestickSeriesModule, OhlcSeriesModule, RangeBarSeriesModule, RangeAreaSeriesModule, AnimationModule, AnnotationsModule, BandHighlightModule, ChartToolbarModule, ContextMenuModule, CrosshairModule, DataSourceModule, ErrorBarsModule, GradientLegendModule, NavigatorModule, RangesModule, SyncModule, ZoomModule, OrdinalTimeAxisModule, import_ag_charts_community265.TimeAxisModule, import_ag_charts_community265.NumberAxisModule ]; // packages/ag-charts-enterprise/src/module-bundles/gauge.ts var AllGaugeModule = [LinearGaugeModule, RadialGaugeModule]; // packages/ag-charts-enterprise/src/module-bundles/polar.ts var import_ag_charts_community266 = require("ag-charts-community"); var AllPolarModule = [ import_ag_charts_community266.AllPolarModule, AngleNumberAxisModule, AngleCategoryAxisModule, RadiusNumberAxisModule, RadiusCategoryAxisModule, NightingaleSeriesModule, RadarAreaSeriesModule, RadarLineSeriesModule, RadialBarSeriesModule, RadialColumnSeriesModule, AnimationModule, ContextMenuModule, DataSourceModule, GradientLegendModule ].flat(); // packages/ag-charts-enterprise/src/module-bundles/topology.ts var AllMapSeriesModule = [ MapLineSeriesModule, MapLineBackgroundSeriesModule, MapMarkerSeriesModule, MapShapeSeriesModule, MapShapeBackgroundSeriesModule ]; // packages/ag-charts-enterprise/src/module-bundles/all.ts var AllEnterpriseModule = [ import_ag_charts_community267.AllCommunityModule, AllCartesianModule, AllPolarModule, AllMapSeriesModule, AllGaugeModule, FinancialChartModule, ChordSeriesModule, PyramidSeriesModule, SankeySeriesModule, SunburstSeriesModule, TreemapSeriesModule ].flat(); // packages/ag-charts-enterprise/src/module-bundles/integrated.ts var import_ag_charts_community269 = require("ag-charts-community"); // packages/ag-charts-enterprise/src/setup.ts var import_ag_charts_community268 = require("ag-charts-community"); var import_ag_charts_core287 = require("ag-charts-core"); function setupEnterpriseModules() { import_ag_charts_core287.ModuleRegistry.registerModules(AllEnterpriseModule); import_ag_charts_core287.enterpriseRegistry.styles = styles_default; import_ag_charts_core287.enterpriseRegistry.licenseManager = (options) => new LicenseManager( options.container?.ownerDocument ?? (typeof document === "undefined" ? void 0 : document) ); import_ag_charts_core287.enterpriseRegistry.injectWatermark = injectWatermark; import_ag_charts_core287.enterpriseRegistry.createBackground = (ctx) => new Background(ctx); import_ag_charts_core287.enterpriseRegistry.createForeground = (ctx) => new Foreground(ctx); } // packages/ag-charts-enterprise/src/module-bundles/integrated.ts var LicenseManager2 = { setLicenseKey(key) { LicenseManager.setLicenseKey(key); } }; var AgChartsEnterpriseModule = { VERSION: import_ag_charts_community269.VERSION, _Scene: import_ag_charts_community269._Scene, _Theme: import_ag_charts_community269._Theme, _Util: import_ag_charts_community269._Util, create: import_ag_charts_community269.AgCharts.create.bind(import_ag_charts_community269.AgCharts), createSparkline: import_ag_charts_community269.AgCharts.__createSparkline.bind(import_ag_charts_community269.AgCharts), setup: () => { import_ag_charts_community269.ModuleRegistry.setRegistryMode(import_ag_charts_community269.ModuleRegistry.RegistryMode.Integrated); setupEnterpriseModules(); }, setGridContext: LicenseManager.setGridContext.bind(LicenseManager), setLicenseKey: LicenseManager.setLicenseKey.bind(LicenseManager), isEnterprise: true }; // packages/ag-charts-enterprise/src/main.ts import_ag_charts_core288.ModuleRegistry.setRegistryMode(import_ag_charts_core288.ModuleRegistry.RegistryMode.Enterprise); import_ag_charts_core288.enterpriseRegistry.styles = styles_default; import_ag_charts_core288.enterpriseRegistry.licenseManager = (options) => new LicenseManager(options.container?.ownerDocument ?? (typeof document === "undefined" ? void 0 : document)); import_ag_charts_core288.enterpriseRegistry.injectWatermark = injectWatermark; import_ag_charts_core288.enterpriseRegistry.createBackground = (ctx) => new Background(ctx); import_ag_charts_core288.enterpriseRegistry.createForeground = (ctx) => new Foreground(ctx);