@rowsncolumns/charts 27.0.30
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/LICENSE.md +100 -0
- package/Readme.md +81 -0
- package/dist/cjs/atoms/editing-chart.atom.d.ts +13 -0
- package/dist/cjs/atoms/editing-chart.atom.d.ts.map +1 -0
- package/dist/cjs/atoms/editing-chart.atom.js +26 -0
- package/dist/cjs/basic-chart/basic-chart.d.ts +5 -0
- package/dist/cjs/basic-chart/basic-chart.d.ts.map +1 -0
- package/dist/cjs/basic-chart/basic-chart.js +2250 -0
- package/dist/cjs/basic-chart/helpers.d.ts +12 -0
- package/dist/cjs/basic-chart/helpers.d.ts.map +1 -0
- package/dist/cjs/basic-chart/helpers.js +105 -0
- package/dist/cjs/basic-chart/index.d.ts +5 -0
- package/dist/cjs/basic-chart/index.d.ts.map +1 -0
- package/dist/cjs/basic-chart/index.js +12 -0
- package/dist/cjs/components/dialogs/chart-editor-dialog.d.ts +5 -0
- package/dist/cjs/components/dialogs/chart-editor-dialog.d.ts.map +1 -0
- package/dist/cjs/components/dialogs/chart-editor-dialog.js +25 -0
- package/dist/cjs/components/editors/chart-editor.d.ts +10 -0
- package/dist/cjs/components/editors/chart-editor.d.ts.map +1 -0
- package/dist/cjs/components/editors/chart-editor.js +631 -0
- package/dist/cjs/components/editors/chart-range-input.d.ts +17 -0
- package/dist/cjs/components/editors/chart-range-input.d.ts.map +1 -0
- package/dist/cjs/components/editors/chart-range-input.js +16 -0
- package/dist/cjs/config.d.ts +19 -0
- package/dist/cjs/config.d.ts.map +1 -0
- package/dist/cjs/config.js +196 -0
- package/dist/cjs/hooks/use-chart-editor.d.ts +8 -0
- package/dist/cjs/hooks/use-chart-editor.d.ts.map +1 -0
- package/dist/cjs/hooks/use-chart-editor.js +29 -0
- package/dist/cjs/hooks/use-charts.d.ts +35 -0
- package/dist/cjs/hooks/use-charts.d.ts.map +1 -0
- package/dist/cjs/hooks/use-charts.js +67 -0
- package/dist/cjs/hooks/use-on-create-chart.d.ts +13 -0
- package/dist/cjs/hooks/use-on-create-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-create-chart.js +24 -0
- package/dist/cjs/hooks/use-on-delete-chart.d.ts +8 -0
- package/dist/cjs/hooks/use-on-delete-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-delete-chart.js +19 -0
- package/dist/cjs/hooks/use-on-move-chart.d.ts +8 -0
- package/dist/cjs/hooks/use-on-move-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-move-chart.js +15 -0
- package/dist/cjs/hooks/use-on-resize-chart.d.ts +8 -0
- package/dist/cjs/hooks/use-on-resize-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-resize-chart.js +15 -0
- package/dist/cjs/hooks/use-on-update-chart.d.ts +9 -0
- package/dist/cjs/hooks/use-on-update-chart.d.ts.map +1 -0
- package/dist/cjs/hooks/use-on-update-chart.js +15 -0
- package/dist/cjs/index.d.ts +11 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +18 -0
- package/dist/cjs/interface/create-chart.d.ts +9 -0
- package/dist/cjs/interface/create-chart.d.ts.map +1 -0
- package/dist/cjs/interface/create-chart.js +110 -0
- package/dist/cjs/interface/delete-chart.d.ts +4 -0
- package/dist/cjs/interface/delete-chart.d.ts.map +1 -0
- package/dist/cjs/interface/delete-chart.js +26 -0
- package/dist/cjs/interface/move-chart.d.ts +5 -0
- package/dist/cjs/interface/move-chart.d.ts.map +1 -0
- package/dist/cjs/interface/move-chart.js +28 -0
- package/dist/cjs/interface/resize-chart.d.ts +5 -0
- package/dist/cjs/interface/resize-chart.d.ts.map +1 -0
- package/dist/cjs/interface/resize-chart.js +30 -0
- package/dist/cjs/interface/update-chart.d.ts +4 -0
- package/dist/cjs/interface/update-chart.d.ts.map +1 -0
- package/dist/cjs/interface/update-chart.js +29 -0
- package/dist/cjs/plotly/basic-chart/basic-chart.d.ts +5 -0
- package/dist/cjs/plotly/basic-chart/basic-chart.d.ts.map +1 -0
- package/dist/cjs/plotly/basic-chart/basic-chart.js +1586 -0
- package/dist/cjs/plotly/basic-chart/helpers.d.ts +20 -0
- package/dist/cjs/plotly/basic-chart/helpers.d.ts.map +1 -0
- package/dist/cjs/plotly/basic-chart/helpers.js +114 -0
- package/dist/cjs/plotly/basic-chart/index.d.ts +5 -0
- package/dist/cjs/plotly/basic-chart/index.d.ts.map +1 -0
- package/dist/cjs/plotly/basic-chart/index.js +12 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/types.d.ts +27 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/utils/aggregation.d.ts +6 -0
- package/dist/cjs/utils/aggregation.d.ts.map +1 -0
- package/dist/cjs/utils/aggregation.js +127 -0
- package/dist/cjs/utils/bar-layout.d.ts +57 -0
- package/dist/cjs/utils/bar-layout.d.ts.map +1 -0
- package/dist/cjs/utils/bar-layout.js +81 -0
- package/dist/cjs/utils/boxplot.d.ts +62 -0
- package/dist/cjs/utils/boxplot.d.ts.map +1 -0
- package/dist/cjs/utils/boxplot.js +105 -0
- package/dist/cjs/utils/bubble.d.ts +52 -0
- package/dist/cjs/utils/bubble.d.ts.map +1 -0
- package/dist/cjs/utils/bubble.js +139 -0
- package/dist/cjs/utils/chart-spec-utils.d.ts +67 -0
- package/dist/cjs/utils/chart-spec-utils.d.ts.map +1 -0
- package/dist/cjs/utils/chart-spec-utils.js +355 -0
- package/dist/cjs/utils/echarts-gl-loader.d.ts +11 -0
- package/dist/cjs/utils/echarts-gl-loader.d.ts.map +1 -0
- package/dist/cjs/utils/echarts-gl-loader.js +59 -0
- package/dist/cjs/utils/error-bars.d.ts +58 -0
- package/dist/cjs/utils/error-bars.d.ts.map +1 -0
- package/dist/cjs/utils/error-bars.js +154 -0
- package/dist/cjs/utils/gradient.d.ts +52 -0
- package/dist/cjs/utils/gradient.d.ts.map +1 -0
- package/dist/cjs/utils/gradient.js +93 -0
- package/dist/cjs/utils/hierarchy.d.ts +28 -0
- package/dist/cjs/utils/hierarchy.d.ts.map +1 -0
- package/dist/cjs/utils/hierarchy.js +186 -0
- package/dist/cjs/utils/histogram.d.ts +46 -0
- package/dist/cjs/utils/histogram.d.ts.map +1 -0
- package/dist/cjs/utils/histogram.js +125 -0
- package/dist/cjs/utils/of-pie.d.ts +101 -0
- package/dist/cjs/utils/of-pie.d.ts.map +1 -0
- package/dist/cjs/utils/of-pie.js +159 -0
- package/dist/cjs/utils/overrides.d.ts +12 -0
- package/dist/cjs/utils/overrides.d.ts.map +1 -0
- package/dist/cjs/utils/overrides.js +171 -0
- package/dist/cjs/utils/radar.d.ts +37 -0
- package/dist/cjs/utils/radar.d.ts.map +1 -0
- package/dist/cjs/utils/radar.js +70 -0
- package/dist/cjs/utils/region-map-loader.d.ts +22 -0
- package/dist/cjs/utils/region-map-loader.d.ts.map +1 -0
- package/dist/cjs/utils/region-map-loader.js +174 -0
- package/dist/cjs/utils/region-map.d.ts +100 -0
- package/dist/cjs/utils/region-map.d.ts.map +1 -0
- package/dist/cjs/utils/region-map.js +327 -0
- package/dist/cjs/utils/stock.d.ts +64 -0
- package/dist/cjs/utils/stock.d.ts.map +1 -0
- package/dist/cjs/utils/stock.js +153 -0
- package/dist/cjs/utils/three-d.d.ts +96 -0
- package/dist/cjs/utils/three-d.d.ts.map +1 -0
- package/dist/cjs/utils/three-d.js +191 -0
- package/dist/cjs/utils/trendline.d.ts +41 -0
- package/dist/cjs/utils/trendline.d.ts.map +1 -0
- package/dist/cjs/utils/trendline.js +303 -0
- package/dist/cjs/utils/waterfall.d.ts +24 -0
- package/dist/cjs/utils/waterfall.d.ts.map +1 -0
- package/dist/cjs/utils/waterfall.js +61 -0
- package/dist/cjs/utils/webgl.d.ts +12 -0
- package/dist/cjs/utils/webgl.d.ts.map +1 -0
- package/dist/cjs/utils/webgl.js +36 -0
- package/dist/cjs/vitest.config.d.ts +3 -0
- package/dist/cjs/vitest.config.d.ts.map +1 -0
- package/dist/cjs/vitest.config.js +9 -0
- package/dist/esm/atoms/editing-chart.atom.d.ts +13 -0
- package/dist/esm/atoms/editing-chart.atom.d.ts.map +1 -0
- package/dist/esm/atoms/editing-chart.atom.js +12 -0
- package/dist/esm/basic-chart/basic-chart.d.ts +5 -0
- package/dist/esm/basic-chart/basic-chart.d.ts.map +1 -0
- package/dist/esm/basic-chart/basic-chart.js +2343 -0
- package/dist/esm/basic-chart/helpers.d.ts +12 -0
- package/dist/esm/basic-chart/helpers.d.ts.map +1 -0
- package/dist/esm/basic-chart/helpers.js +98 -0
- package/dist/esm/basic-chart/index.d.ts +5 -0
- package/dist/esm/basic-chart/index.d.ts.map +1 -0
- package/dist/esm/basic-chart/index.js +7 -0
- package/dist/esm/components/dialogs/chart-editor-dialog.d.ts +5 -0
- package/dist/esm/components/dialogs/chart-editor-dialog.d.ts.map +1 -0
- package/dist/esm/components/dialogs/chart-editor-dialog.js +19 -0
- package/dist/esm/components/editors/chart-editor.d.ts +10 -0
- package/dist/esm/components/editors/chart-editor.d.ts.map +1 -0
- package/dist/esm/components/editors/chart-editor.js +550 -0
- package/dist/esm/components/editors/chart-range-input.d.ts +17 -0
- package/dist/esm/components/editors/chart-range-input.d.ts.map +1 -0
- package/dist/esm/components/editors/chart-range-input.js +10 -0
- package/dist/esm/config.d.ts +19 -0
- package/dist/esm/config.d.ts.map +1 -0
- package/dist/esm/config.js +161 -0
- package/dist/esm/hooks/use-chart-editor.d.ts +8 -0
- package/dist/esm/hooks/use-chart-editor.d.ts.map +1 -0
- package/dist/esm/hooks/use-chart-editor.js +32 -0
- package/dist/esm/hooks/use-charts.d.ts +35 -0
- package/dist/esm/hooks/use-charts.d.ts.map +1 -0
- package/dist/esm/hooks/use-charts.js +62 -0
- package/dist/esm/hooks/use-on-create-chart.d.ts +13 -0
- package/dist/esm/hooks/use-on-create-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-create-chart.js +19 -0
- package/dist/esm/hooks/use-on-delete-chart.d.ts +8 -0
- package/dist/esm/hooks/use-on-delete-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-delete-chart.js +14 -0
- package/dist/esm/hooks/use-on-move-chart.d.ts +8 -0
- package/dist/esm/hooks/use-on-move-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-move-chart.js +10 -0
- package/dist/esm/hooks/use-on-resize-chart.d.ts +8 -0
- package/dist/esm/hooks/use-on-resize-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-resize-chart.js +10 -0
- package/dist/esm/hooks/use-on-update-chart.d.ts +9 -0
- package/dist/esm/hooks/use-on-update-chart.d.ts.map +1 -0
- package/dist/esm/hooks/use-on-update-chart.js +10 -0
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +13 -0
- package/dist/esm/interface/create-chart.d.ts +9 -0
- package/dist/esm/interface/create-chart.d.ts.map +1 -0
- package/dist/esm/interface/create-chart.js +126 -0
- package/dist/esm/interface/delete-chart.d.ts +4 -0
- package/dist/esm/interface/delete-chart.d.ts.map +1 -0
- package/dist/esm/interface/delete-chart.js +20 -0
- package/dist/esm/interface/move-chart.d.ts +5 -0
- package/dist/esm/interface/move-chart.d.ts.map +1 -0
- package/dist/esm/interface/move-chart.js +22 -0
- package/dist/esm/interface/resize-chart.d.ts +5 -0
- package/dist/esm/interface/resize-chart.d.ts.map +1 -0
- package/dist/esm/interface/resize-chart.js +24 -0
- package/dist/esm/interface/update-chart.d.ts +4 -0
- package/dist/esm/interface/update-chart.d.ts.map +1 -0
- package/dist/esm/interface/update-chart.js +26 -0
- package/dist/esm/plotly/basic-chart/basic-chart.d.ts +5 -0
- package/dist/esm/plotly/basic-chart/basic-chart.d.ts.map +1 -0
- package/dist/esm/plotly/basic-chart/basic-chart.js +1682 -0
- package/dist/esm/plotly/basic-chart/helpers.d.ts +20 -0
- package/dist/esm/plotly/basic-chart/helpers.d.ts.map +1 -0
- package/dist/esm/plotly/basic-chart/helpers.js +107 -0
- package/dist/esm/plotly/basic-chart/index.d.ts +5 -0
- package/dist/esm/plotly/basic-chart/index.d.ts.map +1 -0
- package/dist/esm/plotly/basic-chart/index.js +7 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/types.d.ts +27 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/utils/aggregation.d.ts +6 -0
- package/dist/esm/utils/aggregation.d.ts.map +1 -0
- package/dist/esm/utils/aggregation.js +96 -0
- package/dist/esm/utils/bar-layout.d.ts +57 -0
- package/dist/esm/utils/bar-layout.d.ts.map +1 -0
- package/dist/esm/utils/bar-layout.js +70 -0
- package/dist/esm/utils/boxplot.d.ts +62 -0
- package/dist/esm/utils/boxplot.d.ts.map +1 -0
- package/dist/esm/utils/boxplot.js +91 -0
- package/dist/esm/utils/bubble.d.ts +52 -0
- package/dist/esm/utils/bubble.d.ts.map +1 -0
- package/dist/esm/utils/bubble.js +122 -0
- package/dist/esm/utils/chart-spec-utils.d.ts +67 -0
- package/dist/esm/utils/chart-spec-utils.d.ts.map +1 -0
- package/dist/esm/utils/chart-spec-utils.js +270 -0
- package/dist/esm/utils/echarts-gl-loader.d.ts +11 -0
- package/dist/esm/utils/echarts-gl-loader.d.ts.map +1 -0
- package/dist/esm/utils/echarts-gl-loader.js +51 -0
- package/dist/esm/utils/error-bars.d.ts +58 -0
- package/dist/esm/utils/error-bars.d.ts.map +1 -0
- package/dist/esm/utils/error-bars.js +134 -0
- package/dist/esm/utils/gradient.d.ts +52 -0
- package/dist/esm/utils/gradient.d.ts.map +1 -0
- package/dist/esm/utils/gradient.js +84 -0
- package/dist/esm/utils/hierarchy.d.ts +28 -0
- package/dist/esm/utils/hierarchy.d.ts.map +1 -0
- package/dist/esm/utils/hierarchy.js +150 -0
- package/dist/esm/utils/histogram.d.ts +46 -0
- package/dist/esm/utils/histogram.d.ts.map +1 -0
- package/dist/esm/utils/histogram.js +95 -0
- package/dist/esm/utils/of-pie.d.ts +101 -0
- package/dist/esm/utils/of-pie.d.ts.map +1 -0
- package/dist/esm/utils/of-pie.js +141 -0
- package/dist/esm/utils/overrides.d.ts +12 -0
- package/dist/esm/utils/overrides.d.ts.map +1 -0
- package/dist/esm/utils/overrides.js +159 -0
- package/dist/esm/utils/radar.d.ts +37 -0
- package/dist/esm/utils/radar.d.ts.map +1 -0
- package/dist/esm/utils/radar.js +49 -0
- package/dist/esm/utils/region-map-loader.d.ts +22 -0
- package/dist/esm/utils/region-map-loader.d.ts.map +1 -0
- package/dist/esm/utils/region-map-loader.js +141 -0
- package/dist/esm/utils/region-map.d.ts +100 -0
- package/dist/esm/utils/region-map.d.ts.map +1 -0
- package/dist/esm/utils/region-map.js +266 -0
- package/dist/esm/utils/stock.d.ts +64 -0
- package/dist/esm/utils/stock.d.ts.map +1 -0
- package/dist/esm/utils/stock.js +123 -0
- package/dist/esm/utils/three-d.d.ts +96 -0
- package/dist/esm/utils/three-d.d.ts.map +1 -0
- package/dist/esm/utils/three-d.js +162 -0
- package/dist/esm/utils/trendline.d.ts +41 -0
- package/dist/esm/utils/trendline.d.ts.map +1 -0
- package/dist/esm/utils/trendline.js +257 -0
- package/dist/esm/utils/waterfall.d.ts +24 -0
- package/dist/esm/utils/waterfall.d.ts.map +1 -0
- package/dist/esm/utils/waterfall.js +55 -0
- package/dist/esm/utils/webgl.d.ts +12 -0
- package/dist/esm/utils/webgl.d.ts.map +1 -0
- package/dist/esm/utils/webgl.js +30 -0
- package/dist/esm/vitest.config.d.ts +3 -0
- package/dist/esm/vitest.config.d.ts.map +1 -0
- package/dist/esm/vitest.config.js +7 -0
- package/package.json +96 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 3-D / surface chart helpers.
|
|
4
|
+
*
|
|
5
|
+
* Excel's 3-D chart classes (Bar3D / Line3D / Pie3D / Area3D / Surface /
|
|
6
|
+
* Surface3D) degrade to a 2-D fallback `chartType` when imported, with the
|
|
7
|
+
* authored type preserved verbatim on the spec as `sourceChartType`. These
|
|
8
|
+
* helpers gate the renderer's 3-D pipeline off that token and shape the
|
|
9
|
+
* category/series value matrix into the data layouts the echarts-gl
|
|
10
|
+
* `bar3D` / `line3D` / `surface` series expect.
|
|
11
|
+
*
|
|
12
|
+
* Everything in this module is pure and independent of echarts-gl so it can
|
|
13
|
+
* be unit-tested without loading (or even installing a working) WebGL stack.
|
|
14
|
+
*
|
|
15
|
+
* Mapping decisions (see also basic-chart.tsx):
|
|
16
|
+
* - BAR_3D -> `bar3D` (x = category, y = series index, z = value)
|
|
17
|
+
* - LINE_3D -> `line3D` (one polyline per series at its series-index depth)
|
|
18
|
+
* - AREA_3D -> `line3D` (echarts-gl has no area3D; the polyline keeps the
|
|
19
|
+
* authored depth layout)
|
|
20
|
+
* - SURFACE / SURFACE_3D -> `surface` (values grid as z-heights over the
|
|
21
|
+
* categories × series plane)
|
|
22
|
+
* - PIE_3D -> null (echarts-gl has no pie3D; the renderer keeps the
|
|
23
|
+
* existing 2-D pie fallback rather than faking it)
|
|
24
|
+
*/
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.SURFACE_COLOR_RAMP = exports.getValueExtent = exports.buildSurfaceData = exports.buildLine3DSeries = exports.buildBar3DData = exports.getCategoryCount = exports.resolve3DRenderKind = exports.is3DSpec = exports.normalize3DSourceType = void 0;
|
|
27
|
+
var tslib_1 = require("tslib");
|
|
28
|
+
var THREE_D_TOKENS = [
|
|
29
|
+
"BAR_3D",
|
|
30
|
+
"LINE_3D",
|
|
31
|
+
"PIE_3D",
|
|
32
|
+
"AREA_3D",
|
|
33
|
+
"SURFACE",
|
|
34
|
+
"SURFACE_3D",
|
|
35
|
+
];
|
|
36
|
+
var THREE_D_TOKEN_SET = new Set(THREE_D_TOKENS);
|
|
37
|
+
/**
|
|
38
|
+
* Normalize a raw `sourceChartType` value to one of the known 3-D tokens.
|
|
39
|
+
* Matching is case-insensitive and whitespace-tolerant; anything else
|
|
40
|
+
* (including null/undefined) returns null.
|
|
41
|
+
*/
|
|
42
|
+
var normalize3DSourceType = function (sourceChartType) {
|
|
43
|
+
if (typeof sourceChartType !== "string")
|
|
44
|
+
return null;
|
|
45
|
+
var token = sourceChartType.trim().toUpperCase();
|
|
46
|
+
return THREE_D_TOKEN_SET.has(token) ? token : null;
|
|
47
|
+
};
|
|
48
|
+
exports.normalize3DSourceType = normalize3DSourceType;
|
|
49
|
+
/**
|
|
50
|
+
* True when the spec was authored as one of the six 3-D / surface chart
|
|
51
|
+
* classes (its `sourceChartType` is one of the degraded-payload tokens).
|
|
52
|
+
* Note PIE_3D is included here even though it renders as the 2-D pie —
|
|
53
|
+
* use `resolve3DRenderKind` to decide whether the 3-D pipeline runs.
|
|
54
|
+
*/
|
|
55
|
+
var is3DSpec = function (spec) { return (0, exports.normalize3DSourceType)(spec === null || spec === void 0 ? void 0 : spec.sourceChartType) !== null; };
|
|
56
|
+
exports.is3DSpec = is3DSpec;
|
|
57
|
+
/**
|
|
58
|
+
* Map a `sourceChartType` token to the echarts-gl series kind it renders
|
|
59
|
+
* as, or null when the 3-D pipeline should not run:
|
|
60
|
+
* - PIE_3D — echarts-gl has no pie3D, so the 2-D pie fallback stays.
|
|
61
|
+
* - AREA_3D — echarts-gl has no area3D; rendered as line3D.
|
|
62
|
+
* - non-3-D / unknown tokens.
|
|
63
|
+
*/
|
|
64
|
+
var resolve3DRenderKind = function (sourceChartType) {
|
|
65
|
+
switch ((0, exports.normalize3DSourceType)(sourceChartType)) {
|
|
66
|
+
case "BAR_3D":
|
|
67
|
+
return "bar3D";
|
|
68
|
+
case "LINE_3D":
|
|
69
|
+
case "AREA_3D":
|
|
70
|
+
return "line3D";
|
|
71
|
+
case "SURFACE":
|
|
72
|
+
case "SURFACE_3D":
|
|
73
|
+
return "surface";
|
|
74
|
+
default:
|
|
75
|
+
// PIE_3D and non-3-D tokens: keep the 2-D fallback rendering.
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
exports.resolve3DRenderKind = resolve3DRenderKind;
|
|
80
|
+
var isFiniteNumber = function (value) {
|
|
81
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
82
|
+
};
|
|
83
|
+
/** Number of categories = the longest series' value count. */
|
|
84
|
+
var getCategoryCount = function (series) {
|
|
85
|
+
return series.reduce(function (max, entry) { return Math.max(max, entry.values.length); }, 0);
|
|
86
|
+
};
|
|
87
|
+
exports.getCategoryCount = getCategoryCount;
|
|
88
|
+
/**
|
|
89
|
+
* Shape series values into a single bar3D data array: one point per
|
|
90
|
+
* (category, series) cell — x is the category index, y the series index
|
|
91
|
+
* (depth row), z the value. Non-finite values are skipped (no bar).
|
|
92
|
+
*/
|
|
93
|
+
var buildBar3DData = function (series) {
|
|
94
|
+
var points = [];
|
|
95
|
+
series.forEach(function (entry, seriesIndex) {
|
|
96
|
+
entry.values.forEach(function (value, categoryIndex) {
|
|
97
|
+
if (isFiniteNumber(value)) {
|
|
98
|
+
points.push([categoryIndex, seriesIndex, value]);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
return points;
|
|
103
|
+
};
|
|
104
|
+
exports.buildBar3DData = buildBar3DData;
|
|
105
|
+
/**
|
|
106
|
+
* Shape series values into one line3D polyline per series, laid out at the
|
|
107
|
+
* series' index on the depth (y) axis. Non-finite values are skipped, so
|
|
108
|
+
* the polyline simply bridges gaps.
|
|
109
|
+
*/
|
|
110
|
+
var buildLine3DSeries = function (series) {
|
|
111
|
+
return series.map(function (entry, seriesIndex) {
|
|
112
|
+
var data = [];
|
|
113
|
+
entry.values.forEach(function (value, categoryIndex) {
|
|
114
|
+
if (isFiniteNumber(value)) {
|
|
115
|
+
data.push([categoryIndex, seriesIndex, value]);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return { name: entry.name, data: data };
|
|
119
|
+
});
|
|
120
|
+
};
|
|
121
|
+
exports.buildLine3DSeries = buildLine3DSeries;
|
|
122
|
+
/**
|
|
123
|
+
* Shape series values into a complete surface grid over the categories (x)
|
|
124
|
+
* × series (y) plane with the values as z-heights. Surfaces require a
|
|
125
|
+
* complete grid, so ragged series are padded and non-finite values are
|
|
126
|
+
* flattened to 0. Points are emitted row-major (per series row, categories
|
|
127
|
+
* in order), the layout echarts-gl's surface parser expects.
|
|
128
|
+
*/
|
|
129
|
+
var buildSurfaceData = function (series) {
|
|
130
|
+
var categoryCount = (0, exports.getCategoryCount)(series);
|
|
131
|
+
var points = [];
|
|
132
|
+
series.forEach(function (entry, seriesIndex) {
|
|
133
|
+
for (var categoryIndex = 0; categoryIndex < categoryCount; categoryIndex++) {
|
|
134
|
+
var value = entry.values[categoryIndex];
|
|
135
|
+
points.push([
|
|
136
|
+
categoryIndex,
|
|
137
|
+
seriesIndex,
|
|
138
|
+
isFiniteNumber(value) ? value : 0,
|
|
139
|
+
]);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
return points;
|
|
143
|
+
};
|
|
144
|
+
exports.buildSurfaceData = buildSurfaceData;
|
|
145
|
+
/**
|
|
146
|
+
* [min, max] of the z values, for the surface visualMap range. Returns
|
|
147
|
+
* [0, 1] for an empty grid and pads a flat grid (min === max) by 1 so the
|
|
148
|
+
* visualMap never has a zero-width range.
|
|
149
|
+
*/
|
|
150
|
+
var getValueExtent = function (points) {
|
|
151
|
+
var e_1, _a;
|
|
152
|
+
if (points.length === 0)
|
|
153
|
+
return [0, 1];
|
|
154
|
+
var min = points[0][2];
|
|
155
|
+
var max = points[0][2];
|
|
156
|
+
try {
|
|
157
|
+
for (var points_1 = tslib_1.__values(points), points_1_1 = points_1.next(); !points_1_1.done; points_1_1 = points_1.next()) {
|
|
158
|
+
var _b = tslib_1.__read(points_1_1.value, 3), z = _b[2];
|
|
159
|
+
if (z < min)
|
|
160
|
+
min = z;
|
|
161
|
+
if (z > max)
|
|
162
|
+
max = z;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
166
|
+
finally {
|
|
167
|
+
try {
|
|
168
|
+
if (points_1_1 && !points_1_1.done && (_a = points_1.return)) _a.call(points_1);
|
|
169
|
+
}
|
|
170
|
+
finally { if (e_1) throw e_1.error; }
|
|
171
|
+
}
|
|
172
|
+
return [min, max === min ? min + 1 : max];
|
|
173
|
+
};
|
|
174
|
+
exports.getValueExtent = getValueExtent;
|
|
175
|
+
/**
|
|
176
|
+
* Default z-height color ramp for surface plots (the classic echarts-gl
|
|
177
|
+
* blue → yellow → red diverging ramp). Used via visualMap.inRange.
|
|
178
|
+
*/
|
|
179
|
+
exports.SURFACE_COLOR_RAMP = [
|
|
180
|
+
"#313695",
|
|
181
|
+
"#4575b4",
|
|
182
|
+
"#74add1",
|
|
183
|
+
"#abd9e9",
|
|
184
|
+
"#e0f3f8",
|
|
185
|
+
"#ffffbf",
|
|
186
|
+
"#fee090",
|
|
187
|
+
"#fdae61",
|
|
188
|
+
"#f46d43",
|
|
189
|
+
"#d73027",
|
|
190
|
+
"#a50026",
|
|
191
|
+
];
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trendline regression shared by chart renderers.
|
|
3
|
+
*
|
|
4
|
+
* Excel/OOXML `<c:trendline>` supports linear / polynomial / exponential /
|
|
5
|
+
* logarithmic / power / moving-average fits. Neither echarts nor plotly
|
|
6
|
+
* compute these for us (echarts-stat is intentionally NOT a dependency),
|
|
7
|
+
* so the regressions are hand-rolled here as pure least-squares math and
|
|
8
|
+
* the renderers draw the returned points as an overlay line series.
|
|
9
|
+
*
|
|
10
|
+
* All fits operate on the index domain x = 0, 1, 2, … (one step per
|
|
11
|
+
* category) which matches how a category-axis chart positions points.
|
|
12
|
+
* The caller passes the raw y-values; gaps (null/NaN) are skipped during
|
|
13
|
+
* fitting but the fitted curve is still emitted for every x in range.
|
|
14
|
+
*/
|
|
15
|
+
export type TrendlineType = "linear" | "exp" | "log" | "poly" | "power" | "movingAvg";
|
|
16
|
+
export type TrendlinePoint = {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
};
|
|
20
|
+
export type TrendlineResult = {
|
|
21
|
+
/** Fitted points across the (optionally forecast-extended) domain. */
|
|
22
|
+
points: TrendlinePoint[];
|
|
23
|
+
/** Coefficient of determination (R²) of the fit, 0..1. null if N/A. */
|
|
24
|
+
rSquared: number | null;
|
|
25
|
+
/** Human-readable equation string, e.g. "y = 1.5x + 2". */
|
|
26
|
+
equation: string | null;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Compute a trendline for a series of y-values.
|
|
30
|
+
*
|
|
31
|
+
* @param values Raw y-values; the category index is used as x.
|
|
32
|
+
* @param spec Trendline parameters (type/order/period/forecast).
|
|
33
|
+
*/
|
|
34
|
+
export declare const computeTrendline: (values: (number | null | undefined)[], spec?: {
|
|
35
|
+
type?: TrendlineType | null;
|
|
36
|
+
order?: number | null;
|
|
37
|
+
period?: number | null;
|
|
38
|
+
forecastForward?: number | null;
|
|
39
|
+
forecastBackward?: number | null;
|
|
40
|
+
}) => TrendlineResult | null;
|
|
41
|
+
//# sourceMappingURL=trendline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trendline.d.ts","sourceRoot":"","sources":["../../../utils/trendline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,MAAM,aAAa,GACrB,QAAQ,GACR,KAAK,GACL,KAAK,GACL,MAAM,GACN,OAAO,GACP,WAAW,CAAC;AAEhB,MAAM,MAAM,cAAc,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,eAAe,GAAG;IAC5B,sEAAsE;IACtE,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAAC;AA+IF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EACrC,OAAM;IACJ,IAAI,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,KACL,eAAe,GAAG,IA6FpB,CAAC"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Trendline regression shared by chart renderers.
|
|
4
|
+
*
|
|
5
|
+
* Excel/OOXML `<c:trendline>` supports linear / polynomial / exponential /
|
|
6
|
+
* logarithmic / power / moving-average fits. Neither echarts nor plotly
|
|
7
|
+
* compute these for us (echarts-stat is intentionally NOT a dependency),
|
|
8
|
+
* so the regressions are hand-rolled here as pure least-squares math and
|
|
9
|
+
* the renderers draw the returned points as an overlay line series.
|
|
10
|
+
*
|
|
11
|
+
* All fits operate on the index domain x = 0, 1, 2, … (one step per
|
|
12
|
+
* category) which matches how a category-axis chart positions points.
|
|
13
|
+
* The caller passes the raw y-values; gaps (null/NaN) are skipped during
|
|
14
|
+
* fitting but the fitted curve is still emitted for every x in range.
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.computeTrendline = void 0;
|
|
18
|
+
var tslib_1 = require("tslib");
|
|
19
|
+
var isFiniteNum = function (v) {
|
|
20
|
+
return typeof v === "number" && Number.isFinite(v);
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Build (x, y) pairs from raw y-values using the category index as x.
|
|
24
|
+
* Non-finite y-values are dropped (they cannot be fitted).
|
|
25
|
+
*/
|
|
26
|
+
var toPairs = function (values) {
|
|
27
|
+
var pairs = [];
|
|
28
|
+
for (var i = 0; i < values.length; i++) {
|
|
29
|
+
var y = values[i];
|
|
30
|
+
if (isFiniteNum(y))
|
|
31
|
+
pairs.push({ x: i, y: y });
|
|
32
|
+
}
|
|
33
|
+
return pairs;
|
|
34
|
+
};
|
|
35
|
+
/** Compute R² between observed y and predicted f(x) over the fit pairs. */
|
|
36
|
+
var rSquaredOf = function (pairs, predict) {
|
|
37
|
+
var e_1, _a;
|
|
38
|
+
if (pairs.length < 2)
|
|
39
|
+
return null;
|
|
40
|
+
var meanY = pairs.reduce(function (s, p) { return s + p.y; }, 0) / pairs.length;
|
|
41
|
+
var ssRes = 0;
|
|
42
|
+
var ssTot = 0;
|
|
43
|
+
try {
|
|
44
|
+
for (var pairs_1 = tslib_1.__values(pairs), pairs_1_1 = pairs_1.next(); !pairs_1_1.done; pairs_1_1 = pairs_1.next()) {
|
|
45
|
+
var p = pairs_1_1.value;
|
|
46
|
+
var yHat = predict(p.x);
|
|
47
|
+
if (!Number.isFinite(yHat))
|
|
48
|
+
return null;
|
|
49
|
+
ssRes += Math.pow((p.y - yHat), 2);
|
|
50
|
+
ssTot += Math.pow((p.y - meanY), 2);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
54
|
+
finally {
|
|
55
|
+
try {
|
|
56
|
+
if (pairs_1_1 && !pairs_1_1.done && (_a = pairs_1.return)) _a.call(pairs_1);
|
|
57
|
+
}
|
|
58
|
+
finally { if (e_1) throw e_1.error; }
|
|
59
|
+
}
|
|
60
|
+
if (ssTot === 0)
|
|
61
|
+
return null;
|
|
62
|
+
return 1 - ssRes / ssTot;
|
|
63
|
+
};
|
|
64
|
+
var round = function (n, digits) {
|
|
65
|
+
if (digits === void 0) { digits = 4; }
|
|
66
|
+
var f = Math.pow(10, digits);
|
|
67
|
+
return Math.round(n * f) / f;
|
|
68
|
+
};
|
|
69
|
+
/** Solve a small linear system A·x = b via Gaussian elimination. */
|
|
70
|
+
var solveLinearSystem = function (A, b) {
|
|
71
|
+
var _a;
|
|
72
|
+
var n = b.length;
|
|
73
|
+
// Augmented matrix
|
|
74
|
+
var m = A.map(function (row, i) { return tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(row), false), [b[i]], false); });
|
|
75
|
+
for (var col = 0; col < n; col++) {
|
|
76
|
+
// Partial pivot
|
|
77
|
+
var pivot = col;
|
|
78
|
+
for (var r = col + 1; r < n; r++) {
|
|
79
|
+
if (Math.abs(m[r][col]) > Math.abs(m[pivot][col]))
|
|
80
|
+
pivot = r;
|
|
81
|
+
}
|
|
82
|
+
if (Math.abs(m[pivot][col]) < 1e-12)
|
|
83
|
+
return null;
|
|
84
|
+
_a = tslib_1.__read([m[pivot], m[col]], 2), m[col] = _a[0], m[pivot] = _a[1];
|
|
85
|
+
// Eliminate
|
|
86
|
+
for (var r = 0; r < n; r++) {
|
|
87
|
+
if (r === col)
|
|
88
|
+
continue;
|
|
89
|
+
var factor = m[r][col] / m[col][col];
|
|
90
|
+
for (var c = col; c <= n; c++) {
|
|
91
|
+
m[r][c] -= factor * m[col][c];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return m.map(function (row, i) { return row[n] / m[i][i]; });
|
|
96
|
+
};
|
|
97
|
+
/** Linear least squares: y = m·x + b. */
|
|
98
|
+
var fitLinear = function (pairs) {
|
|
99
|
+
var e_2, _a;
|
|
100
|
+
var n = pairs.length;
|
|
101
|
+
if (n < 2)
|
|
102
|
+
return null;
|
|
103
|
+
var sx = 0;
|
|
104
|
+
var sy = 0;
|
|
105
|
+
var sxx = 0;
|
|
106
|
+
var sxy = 0;
|
|
107
|
+
try {
|
|
108
|
+
for (var pairs_2 = tslib_1.__values(pairs), pairs_2_1 = pairs_2.next(); !pairs_2_1.done; pairs_2_1 = pairs_2.next()) {
|
|
109
|
+
var p = pairs_2_1.value;
|
|
110
|
+
sx += p.x;
|
|
111
|
+
sy += p.y;
|
|
112
|
+
sxx += p.x * p.x;
|
|
113
|
+
sxy += p.x * p.y;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
117
|
+
finally {
|
|
118
|
+
try {
|
|
119
|
+
if (pairs_2_1 && !pairs_2_1.done && (_a = pairs_2.return)) _a.call(pairs_2);
|
|
120
|
+
}
|
|
121
|
+
finally { if (e_2) throw e_2.error; }
|
|
122
|
+
}
|
|
123
|
+
var denom = n * sxx - sx * sx;
|
|
124
|
+
if (denom === 0)
|
|
125
|
+
return null;
|
|
126
|
+
var m = (n * sxy - sx * sy) / denom;
|
|
127
|
+
var b = (sy - m * sx) / n;
|
|
128
|
+
return { m: m, b: b };
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Polynomial least squares of the given order: y = c0 + c1·x + … + ck·x^k.
|
|
132
|
+
* Returns coefficients [c0, c1, …, ck] or null if singular.
|
|
133
|
+
*/
|
|
134
|
+
var fitPoly = function (pairs, order) {
|
|
135
|
+
var e_3, _a;
|
|
136
|
+
var k = Math.max(2, Math.min(6, Math.floor(order)));
|
|
137
|
+
var n = k + 1;
|
|
138
|
+
if (pairs.length < n)
|
|
139
|
+
return null;
|
|
140
|
+
// Build normal equations: (X^T X) c = X^T y where X has columns x^0..x^k
|
|
141
|
+
var A = Array.from({ length: n }, function () { return new Array(n).fill(0); });
|
|
142
|
+
var b = new Array(n).fill(0);
|
|
143
|
+
try {
|
|
144
|
+
for (var pairs_3 = tslib_1.__values(pairs), pairs_3_1 = pairs_3.next(); !pairs_3_1.done; pairs_3_1 = pairs_3.next()) {
|
|
145
|
+
var p = pairs_3_1.value;
|
|
146
|
+
var powers = [];
|
|
147
|
+
for (var i = 0; i < 2 * k + 1; i++) {
|
|
148
|
+
powers.push(i === 0 ? 1 : powers[i - 1] * p.x);
|
|
149
|
+
}
|
|
150
|
+
for (var row = 0; row < n; row++) {
|
|
151
|
+
for (var col = 0; col < n; col++) {
|
|
152
|
+
A[row][col] += powers[row + col];
|
|
153
|
+
}
|
|
154
|
+
b[row] += powers[row] * p.y;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
159
|
+
finally {
|
|
160
|
+
try {
|
|
161
|
+
if (pairs_3_1 && !pairs_3_1.done && (_a = pairs_3.return)) _a.call(pairs_3);
|
|
162
|
+
}
|
|
163
|
+
finally { if (e_3) throw e_3.error; }
|
|
164
|
+
}
|
|
165
|
+
return solveLinearSystem(A, b);
|
|
166
|
+
};
|
|
167
|
+
/** Exponential least squares: y = a·e^(b·x). Requires y > 0. */
|
|
168
|
+
var fitExp = function (pairs) {
|
|
169
|
+
var positive = pairs.filter(function (p) { return p.y > 0; });
|
|
170
|
+
if (positive.length < 2)
|
|
171
|
+
return null;
|
|
172
|
+
// Linearize: ln(y) = ln(a) + b·x
|
|
173
|
+
var lin = fitLinear(positive.map(function (p) { return ({ x: p.x, y: Math.log(p.y) }); }));
|
|
174
|
+
if (!lin)
|
|
175
|
+
return null;
|
|
176
|
+
return { a: Math.exp(lin.b), b: lin.m };
|
|
177
|
+
};
|
|
178
|
+
/** Logarithmic least squares: y = a + b·ln(x). Requires x > 0. */
|
|
179
|
+
var fitLog = function (pairs) {
|
|
180
|
+
var positive = pairs.filter(function (p) { return p.x > 0; });
|
|
181
|
+
if (positive.length < 2)
|
|
182
|
+
return null;
|
|
183
|
+
var lin = fitLinear(positive.map(function (p) { return ({ x: Math.log(p.x), y: p.y }); }));
|
|
184
|
+
if (!lin)
|
|
185
|
+
return null;
|
|
186
|
+
return { a: lin.b, b: lin.m };
|
|
187
|
+
};
|
|
188
|
+
/** Power least squares: y = a·x^b. Requires x > 0 and y > 0. */
|
|
189
|
+
var fitPower = function (pairs) {
|
|
190
|
+
var positive = pairs.filter(function (p) { return p.x > 0 && p.y > 0; });
|
|
191
|
+
if (positive.length < 2)
|
|
192
|
+
return null;
|
|
193
|
+
var lin = fitLinear(positive.map(function (p) { return ({ x: Math.log(p.x), y: Math.log(p.y) }); }));
|
|
194
|
+
if (!lin)
|
|
195
|
+
return null;
|
|
196
|
+
return { a: Math.exp(lin.b), b: lin.m };
|
|
197
|
+
};
|
|
198
|
+
/**
|
|
199
|
+
* Compute a trendline for a series of y-values.
|
|
200
|
+
*
|
|
201
|
+
* @param values Raw y-values; the category index is used as x.
|
|
202
|
+
* @param spec Trendline parameters (type/order/period/forecast).
|
|
203
|
+
*/
|
|
204
|
+
var computeTrendline = function (values, spec) {
|
|
205
|
+
var _a, _b, _c, _d, _e;
|
|
206
|
+
if (spec === void 0) { spec = {}; }
|
|
207
|
+
var pairs = toPairs(values);
|
|
208
|
+
if (pairs.length < 2)
|
|
209
|
+
return null;
|
|
210
|
+
var type = (_a = spec.type) !== null && _a !== void 0 ? _a : "linear";
|
|
211
|
+
var forward = Math.max(0, Math.floor((_b = spec.forecastForward) !== null && _b !== void 0 ? _b : 0));
|
|
212
|
+
var backward = Math.max(0, Math.floor((_c = spec.forecastBackward) !== null && _c !== void 0 ? _c : 0));
|
|
213
|
+
// Moving average is a smoothing of the observed values, not a fitted
|
|
214
|
+
// function, so it is handled separately and ignores forecasting.
|
|
215
|
+
if (type === "movingAvg") {
|
|
216
|
+
var period = Math.max(2, Math.floor((_d = spec.period) !== null && _d !== void 0 ? _d : 2));
|
|
217
|
+
var points_1 = [];
|
|
218
|
+
for (var i = period - 1; i < values.length; i++) {
|
|
219
|
+
var sum = 0;
|
|
220
|
+
var count = 0;
|
|
221
|
+
for (var j = i - period + 1; j <= i; j++) {
|
|
222
|
+
var v = values[j];
|
|
223
|
+
if (isFiniteNum(v)) {
|
|
224
|
+
sum += v;
|
|
225
|
+
count++;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
if (count > 0)
|
|
229
|
+
points_1.push({ x: i, y: sum / count });
|
|
230
|
+
}
|
|
231
|
+
return { points: points_1, rSquared: null, equation: null };
|
|
232
|
+
}
|
|
233
|
+
var lastX = values.length - 1;
|
|
234
|
+
var xStart = -backward;
|
|
235
|
+
var xEnd = lastX + forward;
|
|
236
|
+
var xs = [];
|
|
237
|
+
for (var x = xStart; x <= xEnd; x++)
|
|
238
|
+
xs.push(x);
|
|
239
|
+
var predict = null;
|
|
240
|
+
var equation = null;
|
|
241
|
+
switch (type) {
|
|
242
|
+
case "linear": {
|
|
243
|
+
var fit_1 = fitLinear(pairs);
|
|
244
|
+
if (!fit_1)
|
|
245
|
+
return null;
|
|
246
|
+
predict = function (x) { return fit_1.m * x + fit_1.b; };
|
|
247
|
+
equation = "y = ".concat(round(fit_1.m), "x + ").concat(round(fit_1.b));
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
case "poly": {
|
|
251
|
+
var coeffs_1 = fitPoly(pairs, (_e = spec.order) !== null && _e !== void 0 ? _e : 2);
|
|
252
|
+
if (!coeffs_1)
|
|
253
|
+
return null;
|
|
254
|
+
predict = function (x) {
|
|
255
|
+
return coeffs_1.reduce(function (acc, c, i) { return acc + c * Math.pow(x, i); }, 0);
|
|
256
|
+
};
|
|
257
|
+
equation =
|
|
258
|
+
"y = " +
|
|
259
|
+
coeffs_1
|
|
260
|
+
.map(function (c, i) { return (i === 0 ? "".concat(round(c)) : "".concat(round(c), "x^").concat(i)); })
|
|
261
|
+
.join(" + ");
|
|
262
|
+
break;
|
|
263
|
+
}
|
|
264
|
+
case "exp": {
|
|
265
|
+
var fit_2 = fitExp(pairs);
|
|
266
|
+
if (!fit_2)
|
|
267
|
+
return null;
|
|
268
|
+
predict = function (x) { return fit_2.a * Math.exp(fit_2.b * x); };
|
|
269
|
+
equation = "y = ".concat(round(fit_2.a), "e^(").concat(round(fit_2.b), "x)");
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
case "log": {
|
|
273
|
+
var fit_3 = fitLog(pairs);
|
|
274
|
+
if (!fit_3)
|
|
275
|
+
return null;
|
|
276
|
+
// ln(0) and ln(negative) are undefined; clamp x to >0 for the curve.
|
|
277
|
+
predict = function (x) { return fit_3.a + fit_3.b * Math.log(x <= 0 ? 1e-9 : x); };
|
|
278
|
+
equation = "y = ".concat(round(fit_3.a), " + ").concat(round(fit_3.b), "ln(x)");
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
case "power": {
|
|
282
|
+
var fit_4 = fitPower(pairs);
|
|
283
|
+
if (!fit_4)
|
|
284
|
+
return null;
|
|
285
|
+
predict = function (x) { return fit_4.a * (x <= 0 ? 0 : Math.pow(x, fit_4.b)); };
|
|
286
|
+
equation = "y = ".concat(round(fit_4.a), "x^").concat(round(fit_4.b));
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
default:
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
var points = xs
|
|
293
|
+
.map(function (x) { return ({ x: x, y: predict(x) }); })
|
|
294
|
+
.filter(function (p) { return Number.isFinite(p.y); });
|
|
295
|
+
if (points.length < 2)
|
|
296
|
+
return null;
|
|
297
|
+
return {
|
|
298
|
+
points: points,
|
|
299
|
+
rSquared: rSquaredOf(pairs, predict),
|
|
300
|
+
equation: equation,
|
|
301
|
+
};
|
|
302
|
+
};
|
|
303
|
+
exports.computeTrendline = computeTrendline;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waterfall computation shared by chart renderers.
|
|
3
|
+
*
|
|
4
|
+
* Plotly has a native waterfall trace that takes raw values and computes
|
|
5
|
+
* the cumulative offsets itself. Echarts has no native waterfall; the
|
|
6
|
+
* renderer pre-computes two parallel series:
|
|
7
|
+
* - placeholder: transparent bars at the cumulative offset, used as
|
|
8
|
+
* "spacers" so the visible bar starts at the right baseline.
|
|
9
|
+
* - value: the actual bar value (rendered on top of the placeholder).
|
|
10
|
+
*
|
|
11
|
+
* Total bars (where `isTotal` is true at that position) reset to baseline.
|
|
12
|
+
*
|
|
13
|
+
* `cumulative` is the running total after the bar — the y coordinate of
|
|
14
|
+
* the Excel-style connector line drawn across to the next bar.
|
|
15
|
+
*/
|
|
16
|
+
export type WaterfallStep = {
|
|
17
|
+
label: string;
|
|
18
|
+
placeholder: number;
|
|
19
|
+
value: number;
|
|
20
|
+
isTotal: boolean;
|
|
21
|
+
cumulative: number;
|
|
22
|
+
};
|
|
23
|
+
export declare const computeWaterfall: (values: (number | null | undefined)[], labels: string[], totalIndices?: Set<number>) => WaterfallStep[];
|
|
24
|
+
//# sourceMappingURL=waterfall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waterfall.d.ts","sourceRoot":"","sources":["../../../utils/waterfall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,QAAQ,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EACrC,QAAQ,MAAM,EAAE,EAChB,eAAc,GAAG,CAAC,MAAM,CAAa,KACpC,aAAa,EAsCf,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Waterfall computation shared by chart renderers.
|
|
4
|
+
*
|
|
5
|
+
* Plotly has a native waterfall trace that takes raw values and computes
|
|
6
|
+
* the cumulative offsets itself. Echarts has no native waterfall; the
|
|
7
|
+
* renderer pre-computes two parallel series:
|
|
8
|
+
* - placeholder: transparent bars at the cumulative offset, used as
|
|
9
|
+
* "spacers" so the visible bar starts at the right baseline.
|
|
10
|
+
* - value: the actual bar value (rendered on top of the placeholder).
|
|
11
|
+
*
|
|
12
|
+
* Total bars (where `isTotal` is true at that position) reset to baseline.
|
|
13
|
+
*
|
|
14
|
+
* `cumulative` is the running total after the bar — the y coordinate of
|
|
15
|
+
* the Excel-style connector line drawn across to the next bar.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.computeWaterfall = void 0;
|
|
19
|
+
var computeWaterfall = function (values, labels, totalIndices) {
|
|
20
|
+
var _a, _b, _c;
|
|
21
|
+
if (totalIndices === void 0) { totalIndices = new Set(); }
|
|
22
|
+
var steps = [];
|
|
23
|
+
var cumulative = 0;
|
|
24
|
+
for (var i = 0; i < values.length; i++) {
|
|
25
|
+
var v = typeof values[i] === "number" ? values[i] : 0;
|
|
26
|
+
var isTotal = totalIndices.has(i);
|
|
27
|
+
if (isTotal) {
|
|
28
|
+
cumulative = v;
|
|
29
|
+
steps.push({
|
|
30
|
+
label: (_a = labels[i]) !== null && _a !== void 0 ? _a : String(i),
|
|
31
|
+
placeholder: 0,
|
|
32
|
+
value: v,
|
|
33
|
+
isTotal: true,
|
|
34
|
+
cumulative: cumulative,
|
|
35
|
+
});
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (v >= 0) {
|
|
39
|
+
steps.push({
|
|
40
|
+
label: (_b = labels[i]) !== null && _b !== void 0 ? _b : String(i),
|
|
41
|
+
placeholder: cumulative,
|
|
42
|
+
value: v,
|
|
43
|
+
isTotal: false,
|
|
44
|
+
cumulative: cumulative + v,
|
|
45
|
+
});
|
|
46
|
+
cumulative += v;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
cumulative += v;
|
|
50
|
+
steps.push({
|
|
51
|
+
label: (_c = labels[i]) !== null && _c !== void 0 ? _c : String(i),
|
|
52
|
+
placeholder: cumulative,
|
|
53
|
+
value: -v,
|
|
54
|
+
isTotal: false,
|
|
55
|
+
cumulative: cumulative,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return steps;
|
|
60
|
+
};
|
|
61
|
+
exports.computeWaterfall = computeWaterfall;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebGL availability probe for the 3-D chart pipeline.
|
|
3
|
+
*
|
|
4
|
+
* SSR-safe: nothing touches `document`/`window` at module scope, and the
|
|
5
|
+
* probe returns false when no DOM exists. The (browser) result is cached —
|
|
6
|
+
* context creation is not free and availability doesn't change within a
|
|
7
|
+
* page's lifetime.
|
|
8
|
+
*/
|
|
9
|
+
export declare const isWebGLAvailable: () => boolean;
|
|
10
|
+
/** Test hook — clears the cached probe result. */
|
|
11
|
+
export declare const __resetWebGLAvailabilityForTests: () => void;
|
|
12
|
+
//# sourceMappingURL=webgl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webgl.d.ts","sourceRoot":"","sources":["../../../utils/webgl.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,eAAO,MAAM,gBAAgB,QAAO,OAgBnC,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,gCAAgC,QAAO,IAEnD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WebGL availability probe for the 3-D chart pipeline.
|
|
4
|
+
*
|
|
5
|
+
* SSR-safe: nothing touches `document`/`window` at module scope, and the
|
|
6
|
+
* probe returns false when no DOM exists. The (browser) result is cached —
|
|
7
|
+
* context creation is not free and availability doesn't change within a
|
|
8
|
+
* page's lifetime.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.__resetWebGLAvailabilityForTests = exports.isWebGLAvailable = void 0;
|
|
12
|
+
var cachedResult;
|
|
13
|
+
var isWebGLAvailable = function () {
|
|
14
|
+
var _a;
|
|
15
|
+
if (cachedResult !== undefined)
|
|
16
|
+
return cachedResult;
|
|
17
|
+
if (typeof document === "undefined") {
|
|
18
|
+
// SSR / non-DOM environment. Not cached: the module instance could in
|
|
19
|
+
// principle be shared with a later DOM environment.
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
var canvas = document.createElement("canvas");
|
|
24
|
+
cachedResult = Boolean((_a = canvas.getContext("webgl")) !== null && _a !== void 0 ? _a : canvas.getContext("experimental-webgl"));
|
|
25
|
+
}
|
|
26
|
+
catch (_b) {
|
|
27
|
+
cachedResult = false;
|
|
28
|
+
}
|
|
29
|
+
return cachedResult;
|
|
30
|
+
};
|
|
31
|
+
exports.isWebGLAvailable = isWebGLAvailable;
|
|
32
|
+
/** Test hook — clears the cached probe result. */
|
|
33
|
+
var __resetWebGLAvailabilityForTests = function () {
|
|
34
|
+
cachedResult = undefined;
|
|
35
|
+
};
|
|
36
|
+
exports.__resetWebGLAvailabilityForTests = __resetWebGLAvailabilityForTests;
|