ngx-apexsankey 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,94 +1,62 @@
1
1
  # ngx-apexsankey
2
2
 
3
- Angular wrapper for [ApexSankey](https://github.com/apexcharts/apexsankey) - A JavaScript library to create Sankey diagrams.
3
+ Angular wrapper for [ApexSankey](https://github.com/apexcharts/apexsankey) a JavaScript library for creating Sankey diagrams.
4
4
 
5
5
  ## Installation
6
6
 
7
7
  ```bash
8
- npm install ngx-apexsankey apexsankey @svgdotjs/svg.js
8
+ npm install ngx-apexsankey apexsankey
9
9
  ```
10
10
 
11
- ## Loading ApexSankey
11
+ > **Note:** `apexsankey` is a peer dependency and must be installed alongside `ngx-apexsankey`.
12
12
 
13
- **Important:** You must load ApexSankey before using the Angular component. Choose one of the following methods:
14
-
15
- ### Option 1: CDN Script Tags (Recommended)
16
-
17
- Add the scripts to your `index.html`:
18
-
19
- ```html
20
- <!DOCTYPE html>
21
- <html>
22
- <head>
23
- <script src="https://cdn.jsdelivr.net/npm/@svgdotjs/svg.js"></script>
24
- <script src="https://cdn.jsdelivr.net/npm/apexsankey/apexsankey.min.js"></script>
25
- </head>
26
- <body>
27
- <app-root></app-root>
28
- </body>
29
- </html>
30
- ```
31
-
32
- ### Option 2: Angular.json Scripts
33
-
34
- Add to the `scripts` array in your `angular.json`:
35
-
36
- ```json
37
- {
38
- "architect": {
39
- "build": {
40
- "options": {
41
- "scripts": [
42
- "node_modules/@svgdotjs/svg.js/dist/svg.min.js",
43
- "node_modules/apexsankey/apexsankey.min.js"
44
- ]
45
- }
46
- }
47
- }
48
- }
49
- ```
50
-
51
- ## Quick Start
13
+ ## Basic Usage
52
14
 
53
15
  ```typescript
54
- import { Component } from '@angular/core';
55
- import { NgxApexsankeyComponent, GraphData, SankeyOptions } from 'ngx-apexsankey';
16
+ import { Component } from "@angular/core";
17
+ import {
18
+ NgxApexsankeyComponent,
19
+ GraphData,
20
+ SankeyOptions,
21
+ } from "ngx-apexsankey";
56
22
 
57
23
  @Component({
58
- selector: 'app-example',
24
+ selector: "app-example",
59
25
  standalone: true,
60
26
  imports: [NgxApexsankeyComponent],
61
27
  template: `
62
28
  <ngx-apexsankey
63
29
  [data]="data"
64
30
  [options]="options"
65
- (nodeClick)="onNodeClick($event)">
66
- </ngx-apexsankey>
67
- `
31
+ (nodeClick)="onNodeClick($event)"
32
+ ></ngx-apexsankey>
33
+ `,
68
34
  })
69
35
  export class ExampleComponent {
70
36
  data: GraphData = {
71
37
  nodes: [
72
- { id: 'oil', title: 'Oil' },
73
- { id: 'gas', title: 'Natural Gas' },
74
- { id: 'fossil', title: 'Fossil Fuels' },
75
- { id: 'energy', title: 'Energy' }
38
+ { id: "oil", title: "Oil" },
39
+ { id: "gas", title: "Natural Gas" },
40
+ { id: "coal", title: "Coal" },
41
+ { id: "fossil", title: "Fossil Fuels" },
42
+ { id: "energy", title: "Energy" },
76
43
  ],
77
44
  edges: [
78
- { source: 'oil', target: 'fossil', value: 15 },
79
- { source: 'gas', target: 'fossil', value: 20 },
80
- { source: 'fossil', target: 'energy', value: 35 }
81
- ]
45
+ { source: "oil", target: "fossil", value: 15, type: "flow" },
46
+ { source: "gas", target: "fossil", value: 20, type: "flow" },
47
+ { source: "coal", target: "fossil", value: 25, type: "flow" },
48
+ { source: "fossil", target: "energy", value: 60, type: "flow" },
49
+ ],
82
50
  };
83
51
 
84
52
  options: Partial<SankeyOptions> = {
85
53
  width: 800,
86
- height: 600,
87
- nodeWidth: 20
54
+ height: 500,
55
+ nodeWidth: 20,
88
56
  };
89
57
 
90
- onNodeClick(node: any) {
91
- console.log('Node clicked:', node);
58
+ onNodeClick(node: unknown) {
59
+ console.log("Node clicked:", node);
92
60
  }
93
61
  }
94
62
  ```
@@ -98,93 +66,122 @@ export class ExampleComponent {
98
66
  If you have a commercial license, set it once at app initialization:
99
67
 
100
68
  ```typescript
101
- // app.config.ts
102
- import { setApexSankeyLicense } from 'ngx-apexsankey';
69
+ // main.ts
70
+ import { setApexSankeyLicense } from "ngx-apexsankey";
103
71
 
104
- setApexSankeyLicense('your-license-key-here');
72
+ setApexSankeyLicense("your-license-key-here");
105
73
 
106
- export const appConfig: ApplicationConfig = {
107
- providers: []
108
- };
74
+ bootstrapApplication(AppComponent, appConfig);
109
75
  ```
110
76
 
111
77
  ## Inputs
112
78
 
113
- | Input | Type | Required | Description |
114
- | --------- | ------------------------ | -------- | ------------------------------------- |
115
- | `data` | `GraphData` | Yes | Sankey diagram data (nodes and edges) |
116
- | `options` | `Partial<SankeyOptions>` | No | Configuration options for the diagram |
79
+ | Input | Type | Required | Description |
80
+ | --------- | ------------------------ | -------- | --------------------------------- |
81
+ | `data` | `GraphData` | Yes | Sankey data (nodes and edges) |
82
+ | `options` | `Partial<SankeyOptions>` | No | Sankey configuration (see below) |
117
83
 
118
84
  ## Outputs
119
85
 
120
- | Output | Type | Description |
121
- | ----------- | -------------------------- | ---------------------------- |
122
- | `nodeClick` | `EventEmitter<SankeyNode>` | Emits when a node is clicked |
123
-
124
- ## Data Format
125
-
126
- ### Nodes
86
+ | Output | Type | Description |
87
+ | ----------- | ----------------------------- | ---------------------------- |
88
+ | `nodeClick` | `EventEmitter<SankeyNode>` | Emits when a node is clicked |
89
+
90
+ ## SankeyOptions
91
+
92
+ All Sankey configuration is passed through the `options` input. `SankeyOptions` is an intersection of the sub-interfaces below — pass a partial; any omitted field falls back to its default.
93
+
94
+ #### Canvas & layout
95
+
96
+ | Option | Type | Default | Description |
97
+ | ---------------- | ------------------ | -------- | ------------------------------------------------------------------- |
98
+ | `width` | `number \| string` | `'100%'` | Canvas width (pixel number or CSS percentage) |
99
+ | `height` | `number \| string` | `'auto'` | Canvas height. `'auto'` derives from width at 1.6:1 |
100
+ | `spacing` | `number` | `20` | Horizontal spacing between node columns in pixels |
101
+ | `viewPortWidth` | `number` | `800` | Internal SVG viewport width |
102
+ | `viewPortHeight` | `number` | `500` | Internal SVG viewport height |
103
+ | `whitespace` | `number` | `0.18` | Fraction of vertical space used as margins between nodes (0–1) |
104
+ | `canvasStyle` | `string` | `''` | Arbitrary CSS injected onto the SVG root container |
105
+ | `enableToolbar` | `boolean` | `true` | Show the zoom/pan/export toolbar |
106
+
107
+ #### Nodes
108
+
109
+ | Option | Type | Default | Description |
110
+ | ----------------- | --------------------------------- | ------- | ---------------------------------------------------------- |
111
+ | `nodeWidth` | `number` | `20` | Width of each node rectangle in pixels |
112
+ | `nodeBorderWidth` | `number` | `1` | Border width of each node in pixels |
113
+ | `nodeBorderColor` | `string \| null` | `null` | Node border color |
114
+ | `onNodeClick` | `(node: SankeyNode) => void` | - | Callback fired when a node is clicked (prefer `nodeClick` output) |
115
+
116
+ #### Edges
117
+
118
+ | Option | Type | Default | Description |
119
+ | ------------------ | --------- | ------- | --------------------------------------------------------------- |
120
+ | `edgeOpacity` | `number` | `0.4` | Opacity of edges (0–1) |
121
+ | `edgeGradientFill` | `boolean` | `true` | Fill edges with a gradient between source and target colors |
122
+ | `edgeGap` | `number` | `2` | Gap in pixels between adjacent edges at their connection points |
123
+
124
+ #### Font
125
+
126
+ | Option | Type | Default | Description |
127
+ | ------------ | -------- | ----------- | -------------------------------- |
128
+ | `fontSize` | `string` | `'14px'` | CSS font-size for node labels |
129
+ | `fontFamily` | `string` | `''` | CSS font-family for node labels |
130
+ | `fontWeight` | `string` | `'400'` | CSS font-weight for node labels |
131
+ | `fontColor` | `string` | `'#212121'` | CSS color for node labels |
132
+
133
+ #### Tooltip
134
+
135
+ | Option | Type | Default | Description |
136
+ | --------------------- | --------------------------------------------- | -------------------------------- | -------------------------------------------- |
137
+ | `enableTooltip` | `boolean` | `true` | Show edge tooltips on hover |
138
+ | `tooltipTheme` | `'light' \| 'dark'` | - | Shortcut for dark/light color presets |
139
+ | `tooltipBGColor` | `string` | `'#FFFFFF'` | Tooltip background color |
140
+ | `tooltipBorderColor` | `string` | `'#E2E8F0'` | Tooltip border color |
141
+ | `tooltipFontColor` | `string` | `'#1a1a1a'` | Tooltip font color |
142
+ | `tooltipId` | `string` | `'apexsankey-tooltip-container'` | HTML `id` for the tooltip container |
143
+ | `tooltipTemplate` | `(content: TooltipContent) => string` | - | Custom edge (source→target) tooltip HTML |
144
+ | `nodeTooltipTemplate` | `(content: NodeTooltipContent) => string` | - | Custom per-node tooltip HTML |
145
+
146
+ #### Interaction & animation
147
+
148
+ | Option | Type | Default | Description |
149
+ | ------------------------ | --------- | ------- | -------------------------------------------------------------- |
150
+ | `highlightConnectedPath` | `boolean` | `true` | Highlight the connected flow path on hover |
151
+ | `dimOpacity` | `number` | `0.15` | Opacity for dimmed (unrelated) elements during highlighting |
152
+ | `animation.enabled` | `boolean` | `true` | Play entrance animation (disabled if `prefers-reduced-motion`) |
153
+ | `animation.duration` | `number` | `800` | Entrance animation duration in ms |
154
+
155
+ #### Accessibility
156
+
157
+ | Option | Type | Default | Description |
158
+ | -------------------- | --------- | ------- | ------------------------------------------------------------ |
159
+ | `a11y.enabled` | `boolean` | `true` | Enable WCAG 2.1 AA accessibility features |
160
+ | `a11y.diagramLabel` | `string` | - | Override the auto-generated aria-label on the SVG root |
161
+ | `a11y.description` | `string` | - | Populates the `<desc>` element for a longer description |
162
+
163
+ ## Data Structure
164
+
165
+ ```ts
166
+ interface GraphData {
167
+ nodes: SankeyNode[];
168
+ edges: SankeyEdge[];
169
+ }
127
170
 
128
- ```typescript
129
171
  interface SankeyNode {
130
- id: string; // unique identifier
131
- title: string; // display label
132
- color?: string; // optional custom color
172
+ id: string; // unique identifier
173
+ title: string; // display label
174
+ color?: string; // override auto-assigned palette color
133
175
  }
134
- ```
135
-
136
- ### Edges
137
176
 
138
- ```typescript
139
177
  interface SankeyEdge {
140
- source: string; // source node id
141
- target: string; // target node id
142
- value: number; // edge weight/size
143
- type?: string; // optional grouping type
144
- color?: string; // optional custom color
178
+ source: string; // id of upstream node
179
+ target: string; // id of downstream node
180
+ value: number; // flow value — determines edge band width
181
+ type: string; // category label (used for grouping and tooltip)
145
182
  }
146
183
  ```
147
184
 
148
- ## Options
149
-
150
- | Option | Type | Default | Description |
151
- | ------------------ | ---------------------- | ---------------------------- | -------------------------------------------- |
152
- | `width` | `number \| string` | `800` | Width of graph container |
153
- | `height` | `number \| string` | `800` | Height of graph container |
154
- | `canvasStyle` | `string` | `""` | CSS styles for canvas root container |
155
- | `spacing` | `number` | `100` | Spacing from top and left of graph container |
156
- | `nodeWidth` | `number` | `20` | Width of graph nodes |
157
- | `nodeBorderWidth` | `number` | `1` | Border width of nodes in pixels |
158
- | `nodeBorderColor` | `string` | `""` | Border color of nodes |
159
- | `onNodeClick` | `(node) => void` | `undefined` | Callback function for node click |
160
- | `edgeOpacity` | `number` | `0.4` | Opacity value for edges (0 to 1) |
161
- | `edgeGradientFill` | `boolean` | `true` | Enable gradient fill based on node colors |
162
- | `enableTooltip` | `boolean` | `false` | Enable tooltip on hover |
163
- | `enableToolbar` | `boolean` | `false` | Enable/disable graph toolbar |
164
- | `tooltipId` | `string` | `"sankey-tooltip-container"` | Tooltip HTML element id |
165
- | `tooltipTemplate` | `(content) => string` | default template | HTML template for tooltip |
166
- | `tooltipBorderColor` | `string` | `"#BCBCBC"` | Border color of tooltip |
167
- | `tooltipBGColor` | `string` | `"#FFFFFF"` | Background color of tooltip |
168
- | `fontSize` | `string` | `"14px"` | Font size of node labels |
169
- | `fontFamily` | `string` | `""` | Font family of node labels |
170
- | `fontWeight` | `string` | `"400"` | Font weight of node labels |
171
- | `fontColor` | `string` | `"#000000"` | Font color of node labels |
172
-
173
- ## Custom Node Ordering
174
-
175
- ```typescript
176
- const data: GraphData = {
177
- nodes: [...],
178
- edges: [...],
179
- options: {
180
- order: [
181
- [['a', 'b']], // first layer
182
- [['c']] // second layer
183
- ]
184
- }
185
- };
186
- ```
187
-
188
185
  ## Custom Tooltip
189
186
 
190
187
  ```typescript
@@ -192,39 +189,40 @@ const options: Partial<SankeyOptions> = {
192
189
  enableTooltip: true,
193
190
  tooltipTemplate: ({ source, target, value }) => `
194
191
  <div style="padding: 8px;">
195
- <strong>${source.title}</strong> → <strong>${target.title}</strong>
192
+ <strong>${source?.title}</strong> → <strong>${target?.title}</strong>
196
193
  <br />Value: ${value}
197
194
  </div>
198
- `
195
+ `,
199
196
  };
200
197
  ```
201
198
 
202
- ## TypeScript
203
-
204
- All types are exported:
199
+ ## TypeScript Support
205
200
 
206
201
  ```typescript
207
202
  import {
208
203
  NgxApexsankeyComponent,
204
+ setApexSankeyLicense,
205
+ } from "ngx-apexsankey";
206
+
207
+ import type {
209
208
  GraphData,
210
209
  SankeyNode,
211
210
  SankeyEdge,
212
211
  SankeyOptions,
213
212
  SankeyGraph,
214
- setApexSankeyLicense
215
- } from 'ngx-apexsankey';
213
+ TooltipContent,
214
+ } from "ngx-apexsankey";
216
215
  ```
217
216
 
218
- ## Browser Support
219
-
220
- - Angular 17+
221
- - Modern browsers (Chrome, Firefox, Safari, Edge)
222
-
223
217
  ## License
224
218
 
225
- See [LICENSE](./LICENSE) file for details.
219
+ ngx-apexsankey uses the same dual-license model as ApexCharts. See [LICENSE](./LICENSE) for details.
220
+
221
+ - **Free** for individuals, non-profits, and small businesses (< $2M revenue)
222
+ - **Commercial license** required for larger organizations
226
223
 
227
224
  ## Links
228
225
 
229
- - [ApexSankey Documentation](https://apexcharts.com/docs/sankey)
230
- - [ApexSankey GitHub](https://github.com/apexcharts/apexsankey)
226
+ - [ApexSankey Documentation](https://github.com/apexcharts/apexsankey)
227
+ - [ApexCharts](https://apexcharts.com)
228
+ - [License Information](https://apexcharts.com/license)
@@ -0,0 +1,169 @@
1
+ import { Component, Input, Output, EventEmitter, ViewChild, ChangeDetectionStrategy, } from "@angular/core";
2
+ import { getApexSankeyClass, applyStoredLicense } from "./utils";
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * angular wrapper component for ApexSankey
6
+ * renders a sankey diagram using the ApexSankey library
7
+ *
8
+ * @example
9
+ * ```html
10
+ * <ngx-apexsankey
11
+ * [data]="sankeyData"
12
+ * [options]="sankeyOptions"
13
+ * (nodeClick)="onNodeClick($event)">
14
+ * </ngx-apexsankey>
15
+ * ```
16
+ */
17
+ export class NgxApexsankeyComponent {
18
+ /**
19
+ * sankey diagram data containing nodes and edges
20
+ */
21
+ data;
22
+ /**
23
+ * configuration options for the sankey diagram
24
+ */
25
+ options = {};
26
+ /**
27
+ * emits when a node is clicked
28
+ */
29
+ nodeClick = new EventEmitter();
30
+ /**
31
+ * reference to the container element
32
+ */
33
+ containerRef;
34
+ /**
35
+ * the rendered sankey graph instance
36
+ */
37
+ graph = null;
38
+ instance = null;
39
+ isBrowser = typeof window !== "undefined";
40
+ /**
41
+ * computed container styles from options
42
+ */
43
+ get containerStyle() {
44
+ const style = {};
45
+ if (this.options?.width) {
46
+ style["width"] =
47
+ typeof this.options.width === "number"
48
+ ? `${this.options.width}px`
49
+ : this.options.width;
50
+ }
51
+ if (this.options?.height) {
52
+ style["height"] =
53
+ typeof this.options.height === "number"
54
+ ? `${this.options.height}px`
55
+ : this.options.height;
56
+ }
57
+ return style;
58
+ }
59
+ ngOnInit() {
60
+ if (this.isBrowser) {
61
+ this.initChart();
62
+ }
63
+ }
64
+ ngOnChanges(changes) {
65
+ if (!this.isBrowser) {
66
+ return;
67
+ }
68
+ // if options changed, recreate the chart
69
+ if (changes["options"] && !changes["options"].firstChange) {
70
+ this.recreateChart();
71
+ return;
72
+ }
73
+ // if data changed, re-render
74
+ if (changes["data"] && !changes["data"].firstChange) {
75
+ this.renderChart();
76
+ }
77
+ }
78
+ ngOnDestroy() {
79
+ this.destroyChart();
80
+ }
81
+ /**
82
+ * initializes the sankey chart
83
+ */
84
+ initChart() {
85
+ const container = this.containerRef?.nativeElement;
86
+ if (!container) {
87
+ return;
88
+ }
89
+ const ApexSankey = getApexSankeyClass();
90
+ if (!ApexSankey) {
91
+ throw new Error("[ngx-apexsankey] ApexSankey not found. " +
92
+ "Make sure to import apexsankey and @svgdotjs/svg.js before using this component. " +
93
+ "See README for installation instructions.");
94
+ }
95
+ // apply stored license if set before ApexSankey loaded
96
+ applyStoredLicense(ApexSankey);
97
+ // merge options with node click handler
98
+ const mergedOptions = this.getMergedOptions();
99
+ // create instance and render
100
+ this.instance = new ApexSankey(container, mergedOptions);
101
+ this.graph = this.instance.render(this.data);
102
+ }
103
+ /**
104
+ * re-renders the chart with current data
105
+ */
106
+ renderChart() {
107
+ if (!this.instance || !this.containerRef?.nativeElement) {
108
+ return;
109
+ }
110
+ // clear existing content
111
+ if (this.graph?.clear) {
112
+ this.graph.clear();
113
+ }
114
+ // re-render with new data
115
+ this.graph = this.instance.render(this.data);
116
+ }
117
+ /**
118
+ * destroys and recreates the chart with new options
119
+ */
120
+ recreateChart() {
121
+ this.destroyChart();
122
+ this.initChart();
123
+ }
124
+ /**
125
+ * destroys the chart instance via the core destroy() API
126
+ */
127
+ destroyChart() {
128
+ this.instance?.destroy();
129
+ this.graph = null;
130
+ this.instance = null;
131
+ }
132
+ /**
133
+ * merges user options with the node click event emitter
134
+ */
135
+ getMergedOptions() {
136
+ const options = { ...this.options };
137
+ // wrap onNodeClick to also emit the event
138
+ const userCallback = options.onNodeClick;
139
+ options.onNodeClick = (node) => {
140
+ this.nodeClick.emit(node);
141
+ if (userCallback) {
142
+ userCallback(node);
143
+ }
144
+ };
145
+ return options;
146
+ }
147
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxApexsankeyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
148
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NgxApexsankeyComponent, isStandalone: true, selector: "ngx-apexsankey", inputs: { data: "data", options: "options" }, outputs: { nodeClick: "nodeClick" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `<div #container [style]="containerStyle"></div>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
149
+ }
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NgxApexsankeyComponent, decorators: [{
151
+ type: Component,
152
+ args: [{
153
+ selector: "ngx-apexsankey",
154
+ standalone: true,
155
+ template: `<div #container [style]="containerStyle"></div>`,
156
+ changeDetection: ChangeDetectionStrategy.OnPush,
157
+ }]
158
+ }], propDecorators: { data: [{
159
+ type: Input,
160
+ args: [{ required: true }]
161
+ }], options: [{
162
+ type: Input
163
+ }], nodeClick: [{
164
+ type: Output
165
+ }], containerRef: [{
166
+ type: ViewChild,
167
+ args: ["container", { static: true }]
168
+ }] } });
169
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFwZXhzYW5rZXkuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9uZ3gtYXBleHNhbmtleS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFLWixTQUFTLEVBQ1QsdUJBQXVCLEdBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBUXZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFFakU7Ozs7Ozs7Ozs7OztHQVlHO0FBT0gsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQzs7T0FFRztJQUN3QixJQUFJLENBQWE7SUFFNUM7O09BRUc7SUFDTSxPQUFPLEdBQTJCLEVBQUUsQ0FBQztJQUU5Qzs7T0FFRztJQUNPLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO0lBRXJEOztPQUVHO0lBRUgsWUFBWSxDQUEyQjtJQUV2Qzs7T0FFRztJQUNILEtBQUssR0FBdUIsSUFBSSxDQUFDO0lBRXpCLFFBQVEsR0FBOEIsSUFBSSxDQUFDO0lBQzNDLFNBQVMsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUM7SUFFbEQ7O09BRUc7SUFDSCxJQUFJLGNBQWM7UUFDaEIsTUFBTSxLQUFLLEdBQTJCLEVBQUUsQ0FBQztRQUV6QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFO1lBQ3ZCLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQ1osT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxRQUFRO29CQUNwQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSTtvQkFDM0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1NBQzFCO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLE1BQU0s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LE1BQU0sT0FBTyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFcEMsMENBQTBDO1FBQzFDLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7UUFDekMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQWdCLEVBQUUsRUFBRTtZQUN6QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixJQUFJLFlBQVksRUFBRTtnQkFDaEIsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ3BCO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzt3R0FoS1Usc0JBQXNCOzRGQUF0QixzQkFBc0IsMlNBSHZCLGlEQUFpRDs7NEZBR2hELHNCQUFzQjtrQkFObEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLGlEQUFpRDtvQkFDM0QsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07aUJBQ2hEOzhCQUs0QixJQUFJO3NCQUE5QixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFLaEIsT0FBTztzQkFBZixLQUFLO2dCQUtJLFNBQVM7c0JBQWxCLE1BQU07Z0JBTVAsWUFBWTtzQkFEWCxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7XG4gIEdyYXBoRGF0YSxcbiAgU2Fua2V5T3B0aW9ucyxcbiAgU2Fua2V5R3JhcGgsXG4gIFNhbmtleU5vZGUsXG4gIEFwZXhTYW5rZXlJbnN0YW5jZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldEFwZXhTYW5rZXlDbGFzcywgYXBwbHlTdG9yZWRMaWNlbnNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBhbmd1bGFyIHdyYXBwZXIgY29tcG9uZW50IGZvciBBcGV4U2Fua2V5XG4gKiByZW5kZXJzIGEgc2Fua2V5IGRpYWdyYW0gdXNpbmcgdGhlIEFwZXhTYW5rZXkgbGlicmFyeVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8bmd4LWFwZXhzYW5rZXlcbiAqICAgW2RhdGFdPVwic2Fua2V5RGF0YVwiXG4gKiAgIFtvcHRpb25zXT1cInNhbmtleU9wdGlvbnNcIlxuICogICAobm9kZUNsaWNrKT1cIm9uTm9kZUNsaWNrKCRldmVudClcIj5cbiAqIDwvbmd4LWFwZXhzYW5rZXk+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIm5neC1hcGV4c2Fua2V5XCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHRlbXBsYXRlOiBgPGRpdiAjY29udGFpbmVyIFtzdHlsZV09XCJjb250YWluZXJTdHlsZVwiPjwvZGl2PmAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hBcGV4c2Fua2V5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBzYW5rZXkgZGlhZ3JhbSBkYXRhIGNvbnRhaW5pbmcgbm9kZXMgYW5kIGVkZ2VzXG4gICAqL1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBkYXRhITogR3JhcGhEYXRhO1xuXG4gIC8qKlxuICAgKiBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBzYW5rZXkgZGlhZ3JhbVxuICAgKi9cbiAgQElucHV0KCkgb3B0aW9uczogUGFydGlhbDxTYW5rZXlPcHRpb25zPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBlbWl0cyB3aGVuIGEgbm9kZSBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgbm9kZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxTYW5rZXlOb2RlPigpO1xuXG4gIC8qKlxuICAgKiByZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50XG4gICAqL1xuICBAVmlld0NoaWxkKFwiY29udGFpbmVyXCIsIHsgc3RhdGljOiB0cnVlIH0pXG4gIGNvbnRhaW5lclJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIC8qKlxuICAgKiB0aGUgcmVuZGVyZWQgc2Fua2V5IGdyYXBoIGluc3RhbmNlXG4gICAqL1xuICBncmFwaDogU2Fua2V5R3JhcGggfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIGluc3RhbmNlOiBBcGV4U2Fua2V5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc0Jyb3dzZXIgPSB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiO1xuXG4gIC8qKlxuICAgKiBjb21wdXRlZCBjb250YWluZXIgc3R5bGVzIGZyb20gb3B0aW9uc1xuICAgKi9cbiAgZ2V0IGNvbnRhaW5lclN0eWxlKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHN0eWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy53aWR0aCkge1xuICAgICAgc3R5bGVbXCJ3aWR0aFwiXSA9XG4gICAgICAgIHR5cGVvZiB0aGlzLm9wdGlvbnMud2lkdGggPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy53aWR0aH1weGBcbiAgICAgICAgICA6IHRoaXMub3B0aW9ucy53aWR0aDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zPy5oZWlnaHQpIHtcbiAgICAgIHN0eWxlW1wiaGVpZ2h0XCJdID1cbiAgICAgICAgdHlwZW9mIHRoaXMub3B0aW9ucy5oZWlnaHQgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IGAke3RoaXMub3B0aW9ucy5oZWlnaHR9cHhgXG4gICAgICAgICAgOiB0aGlzLm9wdGlvbnMuaGVpZ2h0O1xuICAgIH1cblxuICAgIHJldHVybiBzdHlsZTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgdGhpcy5pbml0Q2hhcnQoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQnJvd3Nlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGlmIG9wdGlvbnMgY2hhbmdlZCwgcmVjcmVhdGUgdGhlIGNoYXJ0XG4gICAgaWYgKGNoYW5nZXNbXCJvcHRpb25zXCJdICYmICFjaGFuZ2VzW1wib3B0aW9uc1wiXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5yZWNyZWF0ZUNoYXJ0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gaWYgZGF0YSBjaGFuZ2VkLCByZS1yZW5kZXJcbiAgICBpZiAoY2hhbmdlc1tcImRhdGFcIl0gJiYgIWNoYW5nZXNbXCJkYXRhXCJdLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnJlbmRlckNoYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95Q2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBpbml0aWFsaXplcyB0aGUgc2Fua2V5IGNoYXJ0XG4gICAqL1xuICBwcml2YXRlIGluaXRDaGFydCgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lclJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IEFwZXhTYW5rZXkgPSBnZXRBcGV4U2Fua2V5Q2xhc3MoKTtcblxuICAgIGlmICghQXBleFNhbmtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIltuZ3gtYXBleHNhbmtleV0gQXBleFNhbmtleSBub3QgZm91bmQuIFwiICtcbiAgICAgICAgICBcIk1ha2Ugc3VyZSB0byBpbXBvcnQgYXBleHNhbmtleSBhbmQgQHN2Z2RvdGpzL3N2Zy5qcyBiZWZvcmUgdXNpbmcgdGhpcyBjb21wb25lbnQuIFwiICtcbiAgICAgICAgICBcIlNlZSBSRUFETUUgZm9yIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGFwcGx5IHN0b3JlZCBsaWNlbnNlIGlmIHNldCBiZWZvcmUgQXBleFNhbmtleSBsb2FkZWRcbiAgICBhcHBseVN0b3JlZExpY2Vuc2UoQXBleFNhbmtleSk7XG5cbiAgICAvLyBtZXJnZSBvcHRpb25zIHdpdGggbm9kZSBjbGljayBoYW5kbGVyXG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHRoaXMuZ2V0TWVyZ2VkT3B0aW9ucygpO1xuXG4gICAgLy8gY3JlYXRlIGluc3RhbmNlIGFuZCByZW5kZXJcbiAgICB0aGlzLmluc3RhbmNlID0gbmV3IEFwZXhTYW5rZXkoY29udGFpbmVyLCBtZXJnZWRPcHRpb25zKTtcbiAgICB0aGlzLmdyYXBoID0gdGhpcy5pbnN0YW5jZS5yZW5kZXIodGhpcy5kYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZS1yZW5kZXJzIHRoZSBjaGFydCB3aXRoIGN1cnJlbnQgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJDaGFydCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UgfHwgIXRoaXMuY29udGFpbmVyUmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2xlYXIgZXhpc3RpbmcgY29udGVudFxuICAgIGlmICh0aGlzLmdyYXBoPy5jbGVhcikge1xuICAgICAgdGhpcy5ncmFwaC5jbGVhcigpO1xuICAgIH1cblxuICAgIC8vIHJlLXJlbmRlciB3aXRoIG5ldyBkYXRhXG4gICAgdGhpcy5ncmFwaCA9IHRoaXMuaW5zdGFuY2UucmVuZGVyKHRoaXMuZGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogZGVzdHJveXMgYW5kIHJlY3JlYXRlcyB0aGUgY2hhcnQgd2l0aCBuZXcgb3B0aW9uc1xuICAgKi9cbiAgcHJpdmF0ZSByZWNyZWF0ZUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveUNoYXJ0KCk7XG4gICAgdGhpcy5pbml0Q2hhcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBkZXN0cm95cyB0aGUgY2hhcnQgaW5zdGFuY2UgdmlhIHRoZSBjb3JlIGRlc3Ryb3koKSBBUElcbiAgICovXG4gIHByaXZhdGUgZGVzdHJveUNoYXJ0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICB0aGlzLmdyYXBoID0gbnVsbDtcbiAgICB0aGlzLmluc3RhbmNlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBtZXJnZXMgdXNlciBvcHRpb25zIHdpdGggdGhlIG5vZGUgY2xpY2sgZXZlbnQgZW1pdHRlclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRNZXJnZWRPcHRpb25zKCk6IFBhcnRpYWw8U2Fua2V5T3B0aW9ucz4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7IC4uLnRoaXMub3B0aW9ucyB9O1xuXG4gICAgLy8gd3JhcCBvbk5vZGVDbGljayB0byBhbHNvIGVtaXQgdGhlIGV2ZW50XG4gICAgY29uc3QgdXNlckNhbGxiYWNrID0gb3B0aW9ucy5vbk5vZGVDbGljaztcbiAgICBvcHRpb25zLm9uTm9kZUNsaWNrID0gKG5vZGU6IFNhbmtleU5vZGUpID0+IHtcbiAgICAgIHRoaXMubm9kZUNsaWNrLmVtaXQobm9kZSk7XG4gICAgICBpZiAodXNlckNhbGxiYWNrKSB7XG4gICAgICAgIHVzZXJDYWxsYmFjayhub2RlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Core data types — kept here because ngx-apexsankey loads ApexSankey via
3
+ // the global window object (CDN pattern) and cannot import types from
4
+ // 'apexsankey' at build time without it being a devDependency.
5
+ // ---------------------------------------------------------------------------
6
+ export {};
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsc0VBQXNFO0FBQ3RFLCtEQUErRDtBQUMvRCw4RUFBOEUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvcmUgZGF0YSB0eXBlcyDigJQga2VwdCBoZXJlIGJlY2F1c2Ugbmd4LWFwZXhzYW5rZXkgbG9hZHMgQXBleFNhbmtleSB2aWFcbi8vIHRoZSBnbG9iYWwgd2luZG93IG9iamVjdCAoQ0ROIHBhdHRlcm4pIGFuZCBjYW5ub3QgaW1wb3J0IHR5cGVzIGZyb21cbi8vICdhcGV4c2Fua2V5JyBhdCBidWlsZCB0aW1lIHdpdGhvdXQgaXQgYmVpbmcgYSBkZXZEZXBlbmRlbmN5LlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogbm9kZSBkZWZpbml0aW9uIGZvciBzYW5rZXkgZGlhZ3JhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmtleU5vZGUge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuICByZWFkb25seSBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBlZGdlIGRlZmluaXRpb24gY29ubmVjdGluZyB0d28gbm9kZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5rZXlFZGdlIHtcbiAgcmVhZG9ubHkgc291cmNlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhcmdldDogc3RyaW5nO1xuICByZWFkb25seSB2YWx1ZTogbnVtYmVyO1xuICByZWFkb25seSB0eXBlPzogc3RyaW5nO1xuICByZWFkb25seSBjb2xvcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBkYXRhIG9wdGlvbnMgZm9yIGN1c3RvbSBvcmRlcmluZyBhbmQgbGluayBhbGlnbm1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhT3B0aW9ucyB7XG4gIHJlYWRvbmx5IG9yZGVyPzogc3RyaW5nW11bXVtdO1xuICByZWFkb25seSBhbGlnbkxpbmtUeXBlcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogY29tcGxldGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIHNhbmtleSBkaWFncmFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JhcGhEYXRhIHtcbiAgcmVhZG9ubHkgbm9kZXM6IFNhbmtleU5vZGVbXTtcbiAgcmVhZG9ubHkgZWRnZXM6IFNhbmtleUVkZ2VbXTtcbiAgcmVhZG9ubHkgb3B0aW9ucz86IERhdGFPcHRpb25zO1xufVxuXG4vKipcbiAqIGNvbnRlbnQgcGFzc2VkIHRvIHRvb2x0aXAgdGVtcGxhdGUgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb29sdGlwQ29udGVudCB7XG4gIHNvdXJjZTogU2Fua2V5Tm9kZTtcbiAgdGFyZ2V0OiBTYW5rZXlOb2RlO1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIGNvbWJpbmVkIHNhbmtleSBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBNaXJyb3JzIHRoZSBTYW5rZXlPcHRpb25zIGludGVyc2VjdGlvbiB0eXBlIGluIGNvcmUgYXBleHNhbmtleS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5rZXlPcHRpb25zIHtcbiAgLy8gY2FudmFzIC8gbGF5b3V0XG4gIHJlYWRvbmx5IGNhbnZhc1N0eWxlPzogc3RyaW5nO1xuICByZWFkb25seSBlbmFibGVUb29sYmFyPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaGVpZ2h0PzogbnVtYmVyIHwgc3RyaW5nO1xuICByZWFkb25seSBzcGFjaW5nPzogbnVtYmVyO1xuICByZWFkb25seSB2aWV3UG9ydEhlaWdodD86IG51bWJlcjtcbiAgcmVhZG9ubHkgdmlld1BvcnRXaWR0aD86IG51bWJlcjtcbiAgcmVhZG9ubHkgd2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gIC8vIG5vZGVcbiAgcmVhZG9ubHkgbm9kZUJvcmRlckNvbG9yPzogc3RyaW5nO1xuICByZWFkb25seSBub2RlQm9yZGVyV2lkdGg/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG5vZGVXaWR0aD86IG51bWJlcjtcbiAgcmVhZG9ubHkgb25Ob2RlQ2xpY2s/OiAobm9kZTogU2Fua2V5Tm9kZSkgPT4gdm9pZDtcbiAgLy8gZWRnZVxuICByZWFkb25seSBlZGdlR3JhZGllbnRGaWxsPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZWRnZU9wYWNpdHk/OiBudW1iZXI7XG4gIHJlYWRvbmx5IGVkZ2VHYXA/OiBudW1iZXI7XG4gIC8vIGZvbnRcbiAgcmVhZG9ubHkgZm9udENvbG9yPzogc3RyaW5nO1xuICByZWFkb25seSBmb250RmFtaWx5Pzogc3RyaW5nO1xuICByZWFkb25seSBmb250U2l6ZT86IHN0cmluZztcbiAgcmVhZG9ubHkgZm9udFdlaWdodD86IHN0cmluZztcbiAgLy8gdG9vbHRpcFxuICByZWFkb25seSBlbmFibGVUb29sdGlwPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdG9vbHRpcEJHQ29sb3I/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRvb2x0aXBCb3JkZXJDb2xvcj86IHN0cmluZztcbiAgcmVhZG9ubHkgdG9vbHRpcElkPzogc3RyaW5nO1xuICByZWFkb25seSB0b29sdGlwVGVtcGxhdGU/OiAoY29udGVudDogVG9vbHRpcENvbnRlbnQpID0+IHN0cmluZztcbiAgLy8gaW50ZXJhY3Rpb25cbiAgcmVhZG9ubHkgaGlnaGxpZ2h0T25Ib3Zlcj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRpbU9uSG92ZXI/OiBib29sZWFuO1xuICAvLyBhbmltYXRpb25cbiAgcmVhZG9ubHkgZW5hYmxlQW5pbWF0aW9uPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYW5pbWF0aW9uRHVyYXRpb24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogc2Fua2V5IGdyYXBoIGluc3RhbmNlIHJldHVybmVkIGJ5IEFwZXhTYW5rZXkucmVuZGVyKClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5rZXlHcmFwaCB7XG4gIGdyYXBoOiB1bmtub3duO1xuICBtYXhSYW5rOiBudW1iZXI7XG4gIHJlbmRlcihvcHRpb25zPzogeyBrZWVwT2xkUG9zaXRpb24/OiBib29sZWFuIH0pOiB2b2lkO1xuICBjbGVhcj86ICgpID0+IHZvaWQ7XG4gIGV4cG9ydFRvU3ZnPzogKCkgPT4gdm9pZDtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIHNwYWNpbmc6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBhcGV4c2Fua2V5IGNvbnN0cnVjdG9yIHR5cGUgKGxvYWRlZCB2aWEgd2luZG93IGdsb2JhbClcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGV4U2Fua2V5Q29uc3RydWN0b3Ige1xuICBuZXcgKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogUGFydGlhbDxTYW5rZXlPcHRpb25zPik6IEFwZXhTYW5rZXlJbnN0YW5jZTtcbiAgc2V0TGljZW5zZTogKGtleTogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIGFwZXhzYW5rZXkgaW5zdGFuY2UgdHlwZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwZXhTYW5rZXlJbnN0YW5jZSB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBvcHRpb25zOiBTYW5rZXlPcHRpb25zO1xuICBncmFwaDogU2Fua2V5R3JhcGg7XG4gIHJlbmRlcjogKGRhdGE6IEdyYXBoRGF0YSkgPT4gU2Fua2V5R3JhcGg7XG4gIGRlc3Ryb3k6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogZXh0ZW5kZWQgd2luZG93IGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIEFwZXhTYW5rZXkgZ2xvYmFsbHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcGV4U2Fua2V5V2luZG93IGV4dGVuZHMgV2luZG93IHtcbiAgQXBleFNhbmtleT86IEFwZXhTYW5rZXlDb25zdHJ1Y3RvcjtcbiAgX19BUEVYX1NBTktFWV9MSUNFTlNFX0tFWV9fPzogc3RyaW5nO1xufVxuIl19
@@ -2,4 +2,4 @@
2
2
  export { NgxApexsankeyComponent } from './lib/ngx-apexsankey.component';
3
3
  // utility functions
4
4
  export { setApexSankeyLicense } from './lib/utils';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RSxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbWFpbiBjb21wb25lbnRcbmV4cG9ydCB7IE5neEFwZXhzYW5rZXlDb21wb25lbnQgfSBmcm9tICcuL2xpYi9uZ3gtYXBleHNhbmtleS5jb21wb25lbnQnO1xuXG4vLyB1dGlsaXR5IGZ1bmN0aW9uc1xuZXhwb3J0IHsgc2V0QXBleFNhbmtleUxpY2Vuc2UgfSBmcm9tICcuL2xpYi91dGlscyc7XG5cbi8vIHR5cGVzXG5leHBvcnQgdHlwZSB7XG4gIC8vIGRhdGEgdHlwZXNcbiAgU2Fua2V5Tm9kZSxcbiAgU2Fua2V5RWRnZSxcbiAgR3JhcGhEYXRhLFxuICBEYXRhT3B0aW9ucyxcblxuICAvLyBvcHRpb25zIHR5cGVzXG4gIFNhbmtleU9wdGlvbnMsXG4gIENvbW1vbk9wdGlvbnMsXG4gIE5vZGVPcHRpb25zLFxuICBFZGdlT3B0aW9ucyxcbiAgRm9udE9wdGlvbnMsXG4gIFRvb2x0aXBPcHRpb25zLFxuICBUb29sdGlwQ29udGVudCxcblxuICAvLyBpbnN0YW5jZSB0eXBlc1xuICBTYW5rZXlHcmFwaCxcbiAgQXBleFNhbmtleUluc3RhbmNlLFxuICBBcGV4U2Fua2V5Q29uc3RydWN0b3IsXG59IGZyb20gJy4vbGliL3R5cGVzJztcbiJdfQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQjtBQUNqQixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RSxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sYUFBYSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gbWFpbiBjb21wb25lbnRcbmV4cG9ydCB7IE5neEFwZXhzYW5rZXlDb21wb25lbnQgfSBmcm9tICcuL2xpYi9uZ3gtYXBleHNhbmtleS5jb21wb25lbnQnO1xuXG4vLyB1dGlsaXR5IGZ1bmN0aW9uc1xuZXhwb3J0IHsgc2V0QXBleFNhbmtleUxpY2Vuc2UgfSBmcm9tICcuL2xpYi91dGlscyc7XG5cbi8vIHR5cGVzXG5leHBvcnQgdHlwZSB7XG4gIC8vIGRhdGEgdHlwZXNcbiAgU2Fua2V5Tm9kZSxcbiAgU2Fua2V5RWRnZSxcbiAgR3JhcGhEYXRhLFxuICBEYXRhT3B0aW9ucyxcblxuICAvLyBvcHRpb25zIHR5cGVzXG4gIFNhbmtleU9wdGlvbnMsXG4gIFRvb2x0aXBDb250ZW50LFxuXG4gIC8vIGluc3RhbmNlIHR5cGVzXG4gIFNhbmtleUdyYXBoLFxuICBBcGV4U2Fua2V5SW5zdGFuY2UsXG4gIEFwZXhTYW5rZXlDb25zdHJ1Y3Rvcixcbn0gZnJvbSAnLi9saWIvdHlwZXMnO1xuIl19