@primeui/chart-core 0.0.1-alpha.1
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 +23 -0
- package/README.md +1 -0
- package/dist/animations/index.d.mts +136 -0
- package/dist/animations/index.mjs +18 -0
- package/dist/annotation.utils-Bm0lOO1o.d.mts +290 -0
- package/dist/borderRadius.utils-Cz73LLR_.d.mts +54 -0
- package/dist/canvas-D4vigq47.d.mts +34 -0
- package/dist/canvas.utils-D2WHi2gL.d.mts +167 -0
- package/dist/cartesian/index.d.mts +94 -0
- package/dist/cartesian/index.mjs +93 -0
- package/dist/chunk-22ST6YPP.mjs +304 -0
- package/dist/chunk-2QK2KOBN.mjs +10 -0
- package/dist/chunk-2QRS4YQ5.mjs +18 -0
- package/dist/chunk-3FFJEX4A.mjs +261 -0
- package/dist/chunk-3IYSJ2U7.mjs +567 -0
- package/dist/chunk-3OZLP4I4.mjs +190 -0
- package/dist/chunk-3WEMHXZI.mjs +198 -0
- package/dist/chunk-3Z62EUJN.mjs +138 -0
- package/dist/chunk-4C6EVJ54.mjs +362 -0
- package/dist/chunk-53HW45JB.mjs +102 -0
- package/dist/chunk-55Y3WI6S.mjs +186 -0
- package/dist/chunk-5JCI2DEB.mjs +97 -0
- package/dist/chunk-66T4MRC5.mjs +113 -0
- package/dist/chunk-6HSEJLSR.mjs +376 -0
- package/dist/chunk-6STOLMCA.mjs +187 -0
- package/dist/chunk-7CMVDIOU.mjs +54 -0
- package/dist/chunk-7QQ6ETB4.mjs +228 -0
- package/dist/chunk-A6ZQZFL2.mjs +272 -0
- package/dist/chunk-ADKLH73T.mjs +1 -0
- package/dist/chunk-AGU3NG6D.mjs +22 -0
- package/dist/chunk-AHYIS6EB.mjs +230 -0
- package/dist/chunk-AP3UYWYT.mjs +4 -0
- package/dist/chunk-ARB5T6MP.mjs +326 -0
- package/dist/chunk-ARRGOEFX.mjs +585 -0
- package/dist/chunk-AUF4CHDP.mjs +422 -0
- package/dist/chunk-B4FTADAZ.mjs +561 -0
- package/dist/chunk-BABQKA6K.mjs +339 -0
- package/dist/chunk-BETFQBM2.mjs +197 -0
- package/dist/chunk-BKP26M4K.mjs +413 -0
- package/dist/chunk-BZN2QHGP.mjs +200 -0
- package/dist/chunk-C36VWQ7A.mjs +86 -0
- package/dist/chunk-CHW4RKY3.mjs +16 -0
- package/dist/chunk-CINXJIRR.mjs +120 -0
- package/dist/chunk-DN6AXQYZ.mjs +667 -0
- package/dist/chunk-DP2IZNN3.mjs +92 -0
- package/dist/chunk-DTWTCFRG.mjs +119 -0
- package/dist/chunk-EAMUNLRU.mjs +172 -0
- package/dist/chunk-EDAKJLNA.mjs +17 -0
- package/dist/chunk-ERVQB2VZ.mjs +59 -0
- package/dist/chunk-FFMT6OCO.mjs +92 -0
- package/dist/chunk-FHTC2YDB.mjs +102 -0
- package/dist/chunk-FRST55HY.mjs +16 -0
- package/dist/chunk-HDFGCN2F.mjs +132 -0
- package/dist/chunk-IEGLX7VL.mjs +42 -0
- package/dist/chunk-ILUWFYGY.mjs +220 -0
- package/dist/chunk-IXOWSEHO.mjs +114 -0
- package/dist/chunk-J4RI2C2G.mjs +172 -0
- package/dist/chunk-J65DBT4R.mjs +13 -0
- package/dist/chunk-JGOVWSKH.mjs +179 -0
- package/dist/chunk-JO7VACY2.mjs +25 -0
- package/dist/chunk-JWFBOPM6.mjs +122 -0
- package/dist/chunk-KNDZP446.mjs +895 -0
- package/dist/chunk-KP2TWD4Z.mjs +90 -0
- package/dist/chunk-KQIFO5I3.mjs +225 -0
- package/dist/chunk-KVDEROP6.mjs +59 -0
- package/dist/chunk-LKC7MZKK.mjs +87 -0
- package/dist/chunk-LVMDQ4OJ.mjs +305 -0
- package/dist/chunk-M7B3JF43.mjs +90 -0
- package/dist/chunk-MTGMXRNF.mjs +136 -0
- package/dist/chunk-N3TIT3OH.mjs +1040 -0
- package/dist/chunk-NHRK5KU2.mjs +890 -0
- package/dist/chunk-NKUYIWAP.mjs +243 -0
- package/dist/chunk-NPDZLYIF.mjs +238 -0
- package/dist/chunk-O2X6FF45.mjs +499 -0
- package/dist/chunk-OGJ6IIBW.mjs +176 -0
- package/dist/chunk-OHGCZZPZ.mjs +403 -0
- package/dist/chunk-OWW3K55O.mjs +351 -0
- package/dist/chunk-OXTFAWSK.mjs +60 -0
- package/dist/chunk-PLSDU3C2.mjs +890 -0
- package/dist/chunk-PRDVPOZX.mjs +223 -0
- package/dist/chunk-Q6PPVIHU.mjs +21 -0
- package/dist/chunk-QQBXUDM4.mjs +885 -0
- package/dist/chunk-QS76E3TD.mjs +111 -0
- package/dist/chunk-QWQ6HY4I.mjs +209 -0
- package/dist/chunk-R6Y3R7EW.mjs +135 -0
- package/dist/chunk-RBLZRT5K.mjs +190 -0
- package/dist/chunk-RO4N6YFS.mjs +167 -0
- package/dist/chunk-RQ3CKQOX.mjs +984 -0
- package/dist/chunk-SALTGZFR.mjs +208 -0
- package/dist/chunk-SANZPAJ4.mjs +14 -0
- package/dist/chunk-SDBPQ5CF.mjs +624 -0
- package/dist/chunk-SSLTFJ3U.mjs +364 -0
- package/dist/chunk-SXHVDJGF.mjs +77 -0
- package/dist/chunk-TA4MVAEX.mjs +243 -0
- package/dist/chunk-TAHCOZHF.mjs +1772 -0
- package/dist/chunk-TQ6S34QZ.mjs +152 -0
- package/dist/chunk-UPRXABX5.mjs +90 -0
- package/dist/chunk-VGLSBZDN.mjs +71 -0
- package/dist/chunk-VN7CKCSE.mjs +364 -0
- package/dist/chunk-VVI3OBPJ.mjs +524 -0
- package/dist/chunk-VWF57TS3.mjs +62 -0
- package/dist/chunk-WA3OVISZ.mjs +179 -0
- package/dist/chunk-WCG35U6M.mjs +964 -0
- package/dist/chunk-WFTX4AQJ.mjs +194 -0
- package/dist/chunk-WFVOQ2QZ.mjs +18 -0
- package/dist/chunk-WH3C3Y7P.mjs +149 -0
- package/dist/chunk-WPFUV7K3.mjs +488 -0
- package/dist/chunk-WRULPWHD.mjs +492 -0
- package/dist/chunk-WS64BZXT.mjs +1 -0
- package/dist/chunk-WY4AURRE.mjs +2419 -0
- package/dist/chunk-WYLILAOO.mjs +167 -0
- package/dist/chunk-X4D7FKUS.mjs +62 -0
- package/dist/chunk-X7T34OLW.mjs +139 -0
- package/dist/chunk-XIHBK5D3.mjs +68 -0
- package/dist/chunk-XQQCGFYB.mjs +50 -0
- package/dist/chunk-XTVE4P3L.mjs +214 -0
- package/dist/chunk-XUAASRXW.mjs +579 -0
- package/dist/chunk-Y3L3D4GQ.mjs +685 -0
- package/dist/chunk-YBJ56XJS.mjs +132 -0
- package/dist/chunk-ZQFK6CAE.mjs +1 -0
- package/dist/chunk-ZT2Z7ERM.mjs +874 -0
- package/dist/chunk-ZTL2FQEW.mjs +714 -0
- package/dist/circular/arc/index.d.mts +8 -0
- package/dist/circular/arc/index.mjs +3 -0
- package/dist/circular/index.d.mts +44 -0
- package/dist/circular/index.mjs +13 -0
- package/dist/collect.utils-DiKB4ciO.d.mts +12 -0
- package/dist/computeChartState-BTVIqwyO.d.mts +304 -0
- package/dist/controller-BJE1AZ3q.d.mts +82 -0
- package/dist/controller-BoNigQJr.d.mts +63 -0
- package/dist/controllers/index.d.mts +16 -0
- package/dist/controllers/index.mjs +110 -0
- package/dist/datalabel.utils-CkjGeB8S.d.mts +122 -0
- package/dist/decimation.utils-CcvJVhI4.d.mts +244 -0
- package/dist/geometry-DUUQJXVM.d.mts +60 -0
- package/dist/index-DseIZa1j.d.mts +167 -0
- package/dist/index.d.mts +88 -0
- package/dist/index.mjs +110 -0
- package/dist/orchestrator/index.d.mts +264 -0
- package/dist/orchestrator/index.mjs +33 -0
- package/dist/plugins/index.d.mts +18 -0
- package/dist/plugins/index.mjs +1 -0
- package/dist/property-animations-D433wXzz.d.mts +580 -0
- package/dist/property-store-NORUWFND.d.mts +17 -0
- package/dist/radial/index.d.mts +14 -0
- package/dist/radial/index.mjs +37 -0
- package/dist/renderers/axis/index.d.mts +39 -0
- package/dist/renderers/axis/index.mjs +8 -0
- package/dist/renderers/circular/index.d.mts +13 -0
- package/dist/renderers/circular/index.mjs +13 -0
- package/dist/renderers/index.d.mts +83 -0
- package/dist/renderers/index.mjs +75 -0
- package/dist/renderers/navigator/index.d.mts +103 -0
- package/dist/renderers/navigator/index.mjs +8 -0
- package/dist/resize.utils-D_2qm6rv.d.mts +142 -0
- package/dist/ring.utils-DXvrxMkU.d.mts +138 -0
- package/dist/scale-KFv30jqZ.d.mts +307 -0
- package/dist/scales-Drf8AIhL.d.mts +75 -0
- package/dist/series/bar/canvas/index.d.mts +8 -0
- package/dist/series/bar/canvas/index.mjs +10 -0
- package/dist/series/bar/controller/index.d.mts +105 -0
- package/dist/series/bar/controller/index.mjs +44 -0
- package/dist/series/bar/controller-canvas/index.d.mts +7 -0
- package/dist/series/bar/controller-canvas/index.mjs +49 -0
- package/dist/series/bar/controller-svg/index.d.mts +7 -0
- package/dist/series/bar/controller-svg/index.mjs +49 -0
- package/dist/series/bar/index.d.mts +60 -0
- package/dist/series/bar/index.mjs +13 -0
- package/dist/series/bar/svg/index.d.mts +8 -0
- package/dist/series/bar/svg/index.mjs +11 -0
- package/dist/series/candlestick/canvas/index.d.mts +8 -0
- package/dist/series/candlestick/canvas/index.mjs +8 -0
- package/dist/series/candlestick/controller/index.d.mts +123 -0
- package/dist/series/candlestick/controller/index.mjs +40 -0
- package/dist/series/candlestick/controller-canvas/index.d.mts +7 -0
- package/dist/series/candlestick/controller-canvas/index.mjs +45 -0
- package/dist/series/candlestick/controller-svg/index.d.mts +7 -0
- package/dist/series/candlestick/controller-svg/index.mjs +45 -0
- package/dist/series/candlestick/index.d.mts +11 -0
- package/dist/series/candlestick/index.mjs +10 -0
- package/dist/series/candlestick/svg/index.d.mts +8 -0
- package/dist/series/candlestick/svg/index.mjs +8 -0
- package/dist/series/heatmap/canvas/index.d.mts +16 -0
- package/dist/series/heatmap/canvas/index.mjs +9 -0
- package/dist/series/heatmap/controller/index.d.mts +110 -0
- package/dist/series/heatmap/controller/index.mjs +23 -0
- package/dist/series/heatmap/controller-canvas/index.d.mts +7 -0
- package/dist/series/heatmap/controller-canvas/index.mjs +28 -0
- package/dist/series/heatmap/controller-svg/index.d.mts +7 -0
- package/dist/series/heatmap/controller-svg/index.mjs +28 -0
- package/dist/series/heatmap/index.d.mts +34 -0
- package/dist/series/heatmap/index.mjs +13 -0
- package/dist/series/heatmap/svg/index.d.mts +15 -0
- package/dist/series/heatmap/svg/index.mjs +10 -0
- package/dist/series/line/canvas/index.d.mts +6 -0
- package/dist/series/line/canvas/index.mjs +9 -0
- package/dist/series/line/controller/index.d.mts +111 -0
- package/dist/series/line/controller/index.mjs +47 -0
- package/dist/series/line/controller-canvas/index.d.mts +7 -0
- package/dist/series/line/controller-canvas/index.mjs +54 -0
- package/dist/series/line/controller-svg/index.d.mts +7 -0
- package/dist/series/line/controller-svg/index.mjs +54 -0
- package/dist/series/line/index.d.mts +49 -0
- package/dist/series/line/index.mjs +13 -0
- package/dist/series/line/svg/index.d.mts +6 -0
- package/dist/series/line/svg/index.mjs +9 -0
- package/dist/series/pie/canvas/index.d.mts +8 -0
- package/dist/series/pie/canvas/index.mjs +10 -0
- package/dist/series/pie/controller/index.d.mts +174 -0
- package/dist/series/pie/controller/index.mjs +110 -0
- package/dist/series/pie/controller-canvas/index.d.mts +8 -0
- package/dist/series/pie/controller-canvas/index.mjs +119 -0
- package/dist/series/pie/controller-svg/index.d.mts +8 -0
- package/dist/series/pie/controller-svg/index.mjs +118 -0
- package/dist/series/pie/index.d.mts +59 -0
- package/dist/series/pie/index.mjs +15 -0
- package/dist/series/pie/svg/index.d.mts +6 -0
- package/dist/series/pie/svg/index.mjs +11 -0
- package/dist/series/polar/canvas/index.d.mts +6 -0
- package/dist/series/polar/canvas/index.mjs +7 -0
- package/dist/series/polar/controller/index.d.mts +102 -0
- package/dist/series/polar/controller/index.mjs +46 -0
- package/dist/series/polar/controller-canvas/index.d.mts +8 -0
- package/dist/series/polar/controller-canvas/index.mjs +52 -0
- package/dist/series/polar/controller-svg/index.d.mts +8 -0
- package/dist/series/polar/controller-svg/index.mjs +52 -0
- package/dist/series/polar/index.d.mts +25 -0
- package/dist/series/polar/index.mjs +16 -0
- package/dist/series/polar/svg/index.d.mts +10 -0
- package/dist/series/polar/svg/index.mjs +8 -0
- package/dist/series/radar/canvas/index.d.mts +6 -0
- package/dist/series/radar/canvas/index.mjs +8 -0
- package/dist/series/radar/controller/index.d.mts +121 -0
- package/dist/series/radar/controller/index.mjs +43 -0
- package/dist/series/radar/controller-canvas/index.d.mts +8 -0
- package/dist/series/radar/controller-canvas/index.mjs +51 -0
- package/dist/series/radar/controller-svg/index.d.mts +8 -0
- package/dist/series/radar/controller-svg/index.mjs +51 -0
- package/dist/series/radar/index.d.mts +40 -0
- package/dist/series/radar/index.mjs +13 -0
- package/dist/series/radar/svg/index.d.mts +12 -0
- package/dist/series/radar/svg/index.mjs +9 -0
- package/dist/series/scatter/canvas/index.d.mts +8 -0
- package/dist/series/scatter/canvas/index.mjs +11 -0
- package/dist/series/scatter/controller/index.d.mts +124 -0
- package/dist/series/scatter/controller/index.mjs +44 -0
- package/dist/series/scatter/controller-canvas/index.d.mts +7 -0
- package/dist/series/scatter/controller-canvas/index.mjs +51 -0
- package/dist/series/scatter/controller-svg/index.d.mts +7 -0
- package/dist/series/scatter/controller-svg/index.mjs +51 -0
- package/dist/series/scatter/index.d.mts +25 -0
- package/dist/series/scatter/index.mjs +14 -0
- package/dist/series/scatter/svg/index.d.mts +8 -0
- package/dist/series/scatter/svg/index.mjs +12 -0
- package/dist/series/treemap/canvas/index.d.mts +50 -0
- package/dist/series/treemap/canvas/index.mjs +10 -0
- package/dist/series/treemap/controller/index.d.mts +130 -0
- package/dist/series/treemap/controller/index.mjs +20 -0
- package/dist/series/treemap/controller-canvas/index.d.mts +7 -0
- package/dist/series/treemap/controller-canvas/index.mjs +25 -0
- package/dist/series/treemap/controller-svg/index.d.mts +7 -0
- package/dist/series/treemap/controller-svg/index.mjs +25 -0
- package/dist/series/treemap/index.d.mts +15 -0
- package/dist/series/treemap/index.mjs +12 -0
- package/dist/series/treemap/svg/index.d.mts +15 -0
- package/dist/series/treemap/svg/index.mjs +9 -0
- package/dist/slices-DtewiwJx.d.mts +72 -0
- package/dist/spatialIndex.utils-B_GJkotZ.d.mts +5 -0
- package/dist/squarify.utils-B9CQBpa1.d.mts +50 -0
- package/dist/stacking-CChuAcLN.d.mts +319 -0
- package/dist/streaming.utils-DH-g1gNP.d.mts +49 -0
- package/dist/sync/index.d.mts +130 -0
- package/dist/sync/index.mjs +5 -0
- package/dist/tooltip.renderer-D5wpSlBa.d.mts +210 -0
- package/dist/utils/color/index.d.mts +58 -0
- package/dist/utils/color/index.mjs +4 -0
- package/dist/utils/data/index.d.mts +180 -0
- package/dist/utils/data/index.mjs +7 -0
- package/dist/utils/export/index.d.mts +14 -0
- package/dist/utils/export/index.mjs +6 -0
- package/dist/utils/index.d.mts +49 -0
- package/dist/utils/index.mjs +29 -0
- package/dist/utils/interaction/index.d.mts +255 -0
- package/dist/utils/interaction/index.mjs +9 -0
- package/dist/utils/layout/index.d.mts +3 -0
- package/dist/utils/layout/index.mjs +10 -0
- package/dist/utils/math/index.d.mts +162 -0
- package/dist/utils/math/index.mjs +1 -0
- package/dist/utils/render/index.d.mts +19 -0
- package/dist/utils/render/index.mjs +3 -0
- package/dist/utils/specialized/index.d.mts +37 -0
- package/dist/utils/specialized/index.mjs +66 -0
- package/dist/utils/text/index.d.mts +39 -0
- package/dist/utils/text/index.mjs +8 -0
- package/dist/utils/theme/index.d.mts +295 -0
- package/dist/utils/theme/index.mjs +5 -0
- package/dist/utils/zoom/index.d.mts +90 -0
- package/dist/utils/zoom/index.mjs +3 -0
- package/package.json +56 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import { FIELD_DEFAULTS } from './chunk-O2X6FF45.mjs';
|
|
2
|
+
|
|
3
|
+
// src/utils/specialized/exportMenu.utils.ts
|
|
4
|
+
var EXPORT_MENU_CONSTANTS = {
|
|
5
|
+
/** Button size in pixels */
|
|
6
|
+
BUTTON_SIZE: 36,
|
|
7
|
+
/** Button padding */
|
|
8
|
+
BUTTON_PADDING: 8,
|
|
9
|
+
/** Menu width */
|
|
10
|
+
MENU_WIDTH: 180,
|
|
11
|
+
/** Menu item height */
|
|
12
|
+
MENU_ITEM_HEIGHT: 32,
|
|
13
|
+
/** Separator height */
|
|
14
|
+
SEPARATOR_HEIGHT: 1,
|
|
15
|
+
/** Menu border radius */
|
|
16
|
+
BORDER_RADIUS: 4,
|
|
17
|
+
/** Z-index for menu overlay */
|
|
18
|
+
Z_INDEX: 1e3
|
|
19
|
+
};
|
|
20
|
+
var DEFAULT_EXPORT_MENU_ITEMS = ["downloadPNG", "downloadJPEG", "downloadSVG", "downloadPDF", "downloadCSV", "separator", "downloadPNGTransparent", "downloadSVGTransparent"];
|
|
21
|
+
var DEFAULT_EXPORT_MENU_PROPS = {
|
|
22
|
+
enabled: true,
|
|
23
|
+
filename: "chart",
|
|
24
|
+
menuItems: DEFAULT_EXPORT_MENU_ITEMS,
|
|
25
|
+
buttons: {
|
|
26
|
+
align: "right",
|
|
27
|
+
verticalAlign: "top",
|
|
28
|
+
x: -10,
|
|
29
|
+
y: 10
|
|
30
|
+
},
|
|
31
|
+
scale: 2,
|
|
32
|
+
backgroundColor: "auto",
|
|
33
|
+
buttonClass: "",
|
|
34
|
+
menuClass: ""
|
|
35
|
+
};
|
|
36
|
+
var EXPORT_MENU_LABELS = {
|
|
37
|
+
downloadPNG: "Download PNG",
|
|
38
|
+
downloadJPEG: "Download JPEG",
|
|
39
|
+
downloadSVG: "Download SVG",
|
|
40
|
+
downloadPDF: "Download PDF",
|
|
41
|
+
downloadCSV: "Download CSV",
|
|
42
|
+
downloadPNGTransparent: "Download PNG (Transparent)",
|
|
43
|
+
downloadSVGTransparent: "Download SVG (Transparent)"
|
|
44
|
+
};
|
|
45
|
+
var HAMBURGER_ICON_PATH = "M3 18h18v-2H3v2zm0-5h18v-2H3v2zm0-7v2h18V6H3z";
|
|
46
|
+
function resolveExportMenuProps(props) {
|
|
47
|
+
return {
|
|
48
|
+
enabled: props.enabled ?? DEFAULT_EXPORT_MENU_PROPS.enabled,
|
|
49
|
+
filename: props.filename ?? DEFAULT_EXPORT_MENU_PROPS.filename,
|
|
50
|
+
menuItems: props.menuItems ?? DEFAULT_EXPORT_MENU_PROPS.menuItems,
|
|
51
|
+
buttons: {
|
|
52
|
+
...DEFAULT_EXPORT_MENU_PROPS.buttons,
|
|
53
|
+
...props.buttons
|
|
54
|
+
},
|
|
55
|
+
scale: props.scale ?? DEFAULT_EXPORT_MENU_PROPS.scale,
|
|
56
|
+
backgroundColor: props.backgroundColor ?? DEFAULT_EXPORT_MENU_PROPS.backgroundColor,
|
|
57
|
+
buttonClass: props.buttonClass ?? "",
|
|
58
|
+
menuClass: props.menuClass ?? ""
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function isExportMenuSeparator(item) {
|
|
62
|
+
return item === "separator";
|
|
63
|
+
}
|
|
64
|
+
function filterExportMenuItems(items) {
|
|
65
|
+
return items.filter((item, i, arr) => {
|
|
66
|
+
if (item !== "separator") return true;
|
|
67
|
+
if (i === 0 || i === arr.length - 1) return false;
|
|
68
|
+
return arr[i - 1] !== "separator";
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
function estimateExportMenuHeight(items) {
|
|
72
|
+
const MENU_PADDING_Y = 8;
|
|
73
|
+
const SEPARATOR_SPACE = 9;
|
|
74
|
+
let height = MENU_PADDING_Y;
|
|
75
|
+
for (const item of items) {
|
|
76
|
+
height += item === "separator" ? SEPARATOR_SPACE : EXPORT_MENU_CONSTANTS.MENU_ITEM_HEIGHT;
|
|
77
|
+
}
|
|
78
|
+
return height;
|
|
79
|
+
}
|
|
80
|
+
function resolveExportMenuPlacement(input) {
|
|
81
|
+
const { align, verticalAlign, x, y, buttonSize, menuWidth, menuHeight, chartWidth, chartHeight } = input;
|
|
82
|
+
const gap = input.gap ?? 4;
|
|
83
|
+
const absX = Math.abs(x);
|
|
84
|
+
const absY = Math.abs(y);
|
|
85
|
+
const buttonLeft = align === "right" ? chartWidth - absX - buttonSize : absX;
|
|
86
|
+
const buttonTop = verticalAlign === "top" ? absY : chartHeight - absY - buttonSize;
|
|
87
|
+
const placement = {};
|
|
88
|
+
if (buttonLeft + menuWidth > chartWidth) {
|
|
89
|
+
placement.right = chartWidth - buttonLeft - buttonSize;
|
|
90
|
+
} else {
|
|
91
|
+
placement.left = buttonLeft;
|
|
92
|
+
}
|
|
93
|
+
if (buttonTop + buttonSize + menuHeight > chartHeight && verticalAlign !== "top") {
|
|
94
|
+
placement.bottom = chartHeight - buttonTop + gap;
|
|
95
|
+
} else {
|
|
96
|
+
placement.top = buttonTop + buttonSize + gap;
|
|
97
|
+
}
|
|
98
|
+
return placement;
|
|
99
|
+
}
|
|
100
|
+
function getExportAction(item) {
|
|
101
|
+
switch (item) {
|
|
102
|
+
case "downloadPNG":
|
|
103
|
+
return { format: "png", transparent: false };
|
|
104
|
+
case "downloadJPEG":
|
|
105
|
+
return { format: "jpeg", transparent: false };
|
|
106
|
+
case "downloadSVG":
|
|
107
|
+
return { format: "svg", transparent: false };
|
|
108
|
+
case "downloadPDF":
|
|
109
|
+
return { format: "pdf", transparent: false };
|
|
110
|
+
case "downloadCSV":
|
|
111
|
+
return { format: "csv", transparent: false };
|
|
112
|
+
case "downloadPNGTransparent":
|
|
113
|
+
return { format: "png", transparent: true };
|
|
114
|
+
case "downloadSVGTransparent":
|
|
115
|
+
return { format: "svg", transparent: true };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// src/utils/specialized/decimation.utils.ts
|
|
120
|
+
function decimateLTTB(yValues, targetCount, xValues) {
|
|
121
|
+
const n = yValues.length;
|
|
122
|
+
if (targetCount >= n || targetCount < 3) {
|
|
123
|
+
return Array.from({ length: n }, (_, i) => i);
|
|
124
|
+
}
|
|
125
|
+
const result = new Array(targetCount);
|
|
126
|
+
result[0] = 0;
|
|
127
|
+
const bucketCount = targetCount - 2;
|
|
128
|
+
const bucketSize = (n - 2) / bucketCount;
|
|
129
|
+
let prevSelectedIdx = 0;
|
|
130
|
+
for (let bucket = 0; bucket < bucketCount; bucket++) {
|
|
131
|
+
const bucketStart = Math.floor(bucket * bucketSize) + 1;
|
|
132
|
+
const bucketEnd = Math.min(Math.floor((bucket + 1) * bucketSize) + 1, n - 1);
|
|
133
|
+
let avgX = 0;
|
|
134
|
+
let avgY = 0;
|
|
135
|
+
if (bucket === bucketCount - 1) {
|
|
136
|
+
avgX = xValues ? xValues[n - 1] : n - 1;
|
|
137
|
+
avgY = yValues[n - 1];
|
|
138
|
+
} else {
|
|
139
|
+
const nextStart = Math.floor((bucket + 1) * bucketSize) + 1;
|
|
140
|
+
const nextEnd = Math.min(Math.floor((bucket + 2) * bucketSize) + 1, n - 1);
|
|
141
|
+
let count = 0;
|
|
142
|
+
for (let j = nextStart; j < nextEnd; j++) {
|
|
143
|
+
avgX += xValues ? xValues[j] : j;
|
|
144
|
+
avgY += yValues[j];
|
|
145
|
+
count++;
|
|
146
|
+
}
|
|
147
|
+
if (count > 0) {
|
|
148
|
+
avgX /= count;
|
|
149
|
+
avgY /= count;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const ax = xValues ? xValues[prevSelectedIdx] : prevSelectedIdx;
|
|
153
|
+
const ay = yValues[prevSelectedIdx];
|
|
154
|
+
const cx = avgX;
|
|
155
|
+
const cy = avgY;
|
|
156
|
+
let maxArea = -1;
|
|
157
|
+
let bestIdx = bucketStart;
|
|
158
|
+
for (let j = bucketStart; j < bucketEnd; j++) {
|
|
159
|
+
const bx = xValues ? xValues[j] : j;
|
|
160
|
+
const by = yValues[j];
|
|
161
|
+
const area = Math.abs(ax * (by - cy) + bx * (cy - ay) + cx * (ay - by));
|
|
162
|
+
if (area > maxArea) {
|
|
163
|
+
maxArea = area;
|
|
164
|
+
bestIdx = j;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
result[bucket + 1] = bestIdx;
|
|
168
|
+
prevSelectedIdx = bestIdx;
|
|
169
|
+
}
|
|
170
|
+
result[targetCount - 1] = n - 1;
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
function decimateMinMax(yValues, targetCount) {
|
|
174
|
+
const n = yValues.length;
|
|
175
|
+
if (targetCount >= n || targetCount < 2) {
|
|
176
|
+
return Array.from({ length: n }, (_, i) => i);
|
|
177
|
+
}
|
|
178
|
+
const indexSet = /* @__PURE__ */ new Set();
|
|
179
|
+
indexSet.add(0);
|
|
180
|
+
indexSet.add(n - 1);
|
|
181
|
+
const bucketSize = n / targetCount;
|
|
182
|
+
for (let bucket = 0; bucket < targetCount; bucket++) {
|
|
183
|
+
const bucketStart = Math.floor(bucket * bucketSize);
|
|
184
|
+
const bucketEnd = Math.min(Math.floor((bucket + 1) * bucketSize), n);
|
|
185
|
+
let minIdx = bucketStart;
|
|
186
|
+
let maxIdx = bucketStart;
|
|
187
|
+
let minVal = yValues[bucketStart];
|
|
188
|
+
let maxVal = yValues[bucketStart];
|
|
189
|
+
for (let j = bucketStart + 1; j < bucketEnd; j++) {
|
|
190
|
+
const val = yValues[j];
|
|
191
|
+
if (val < minVal) {
|
|
192
|
+
minVal = val;
|
|
193
|
+
minIdx = j;
|
|
194
|
+
}
|
|
195
|
+
if (val > maxVal) {
|
|
196
|
+
maxVal = val;
|
|
197
|
+
maxIdx = j;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
indexSet.add(minIdx);
|
|
201
|
+
indexSet.add(maxIdx);
|
|
202
|
+
}
|
|
203
|
+
const result = Array.from(indexSet);
|
|
204
|
+
result.sort((a, b) => a - b);
|
|
205
|
+
return result;
|
|
206
|
+
}
|
|
207
|
+
function decimateKMeans(xValues, yValues, targetCount) {
|
|
208
|
+
const n = xValues.length;
|
|
209
|
+
if (targetCount >= n || targetCount < 2) {
|
|
210
|
+
return Array.from({ length: n }, (_, i) => ({ x: xValues[i], y: yValues[i] }));
|
|
211
|
+
}
|
|
212
|
+
const k = targetCount;
|
|
213
|
+
let xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity;
|
|
214
|
+
for (let i = 0; i < n; i++) {
|
|
215
|
+
if (xValues[i] < xMin) xMin = xValues[i];
|
|
216
|
+
if (xValues[i] > xMax) xMax = xValues[i];
|
|
217
|
+
if (yValues[i] < yMin) yMin = yValues[i];
|
|
218
|
+
if (yValues[i] > yMax) yMax = yValues[i];
|
|
219
|
+
}
|
|
220
|
+
const xRange = xMax - xMin || 1;
|
|
221
|
+
const yRange = yMax - yMin || 1;
|
|
222
|
+
const normX = new Float64Array(n);
|
|
223
|
+
const normY = new Float64Array(n);
|
|
224
|
+
for (let i = 0; i < n; i++) {
|
|
225
|
+
normX[i] = (xValues[i] - xMin) / xRange;
|
|
226
|
+
normY[i] = (yValues[i] - yMin) / yRange;
|
|
227
|
+
}
|
|
228
|
+
const centX = new Float64Array(k);
|
|
229
|
+
const centY = new Float64Array(k);
|
|
230
|
+
const pool = new Int32Array(n);
|
|
231
|
+
for (let i = 0; i < n; i++) pool[i] = i;
|
|
232
|
+
for (let c = 0; c < k; c++) {
|
|
233
|
+
const j = c + Math.floor(Math.random() * (n - c));
|
|
234
|
+
const picked = pool[j];
|
|
235
|
+
pool[j] = pool[c];
|
|
236
|
+
pool[c] = picked;
|
|
237
|
+
centX[c] = normX[picked];
|
|
238
|
+
centY[c] = normY[picked];
|
|
239
|
+
}
|
|
240
|
+
const batchSize = Math.min(n, 1e4);
|
|
241
|
+
const iterations = 5;
|
|
242
|
+
const clusterCounts = new Float64Array(k);
|
|
243
|
+
for (let iter = 0; iter < iterations; iter++) {
|
|
244
|
+
const sumX = new Float64Array(k);
|
|
245
|
+
const sumY = new Float64Array(k);
|
|
246
|
+
const counts = new Float64Array(k);
|
|
247
|
+
for (let b = 0; b < batchSize; b++) {
|
|
248
|
+
const i = Math.floor(Math.random() * n);
|
|
249
|
+
const px = normX[i];
|
|
250
|
+
const py = normY[i];
|
|
251
|
+
let bestC = 0;
|
|
252
|
+
let bestDist = Infinity;
|
|
253
|
+
for (let c = 0; c < k; c++) {
|
|
254
|
+
const dx = px - centX[c];
|
|
255
|
+
const dy = py - centY[c];
|
|
256
|
+
const d = dx * dx + dy * dy;
|
|
257
|
+
if (d < bestDist) {
|
|
258
|
+
bestDist = d;
|
|
259
|
+
bestC = c;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
sumX[bestC] += px;
|
|
263
|
+
sumY[bestC] += py;
|
|
264
|
+
counts[bestC]++;
|
|
265
|
+
}
|
|
266
|
+
for (let c = 0; c < k; c++) {
|
|
267
|
+
if (counts[c] > 0) {
|
|
268
|
+
clusterCounts[c] += counts[c];
|
|
269
|
+
const lr = counts[c] / clusterCounts[c];
|
|
270
|
+
centX[c] = centX[c] * (1 - lr) + sumX[c] / counts[c] * lr;
|
|
271
|
+
centY[c] = centY[c] * (1 - lr) + sumY[c] / counts[c] * lr;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
const result = [];
|
|
276
|
+
for (let c = 0; c < k; c++) {
|
|
277
|
+
if (clusterCounts[c] > 0) {
|
|
278
|
+
result.push({
|
|
279
|
+
x: centX[c] * xRange + xMin,
|
|
280
|
+
y: centY[c] * yRange + yMin
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
286
|
+
var DEFAULT_SAMPLES = 500;
|
|
287
|
+
function decimate(yValues, config, xValues) {
|
|
288
|
+
const samples = config.samples ?? DEFAULT_SAMPLES;
|
|
289
|
+
const threshold = config.threshold ?? samples;
|
|
290
|
+
if (yValues.length <= threshold) {
|
|
291
|
+
return Array.from({ length: yValues.length }, (_, i) => i);
|
|
292
|
+
}
|
|
293
|
+
switch (config.algorithm) {
|
|
294
|
+
case "lttb":
|
|
295
|
+
case "k-means":
|
|
296
|
+
return decimateLTTB(yValues, samples, xValues);
|
|
297
|
+
case "min-max":
|
|
298
|
+
return decimateMinMax(yValues, samples);
|
|
299
|
+
default:
|
|
300
|
+
return Array.from({ length: yValues.length }, (_, i) => i);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
var ScatterDecimator = class {
|
|
304
|
+
constructor() {
|
|
305
|
+
this.cache = /* @__PURE__ */ new Map();
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Apply viewport-aware decimation to scatter datasets.
|
|
309
|
+
* Returns a new array with the same shape as `datasets`, with `props.data` replaced where decimated.
|
|
310
|
+
*/
|
|
311
|
+
apply(datasets, config, zoomX, zoomY) {
|
|
312
|
+
const samples = config.samples ?? DEFAULT_SAMPLES;
|
|
313
|
+
const threshold = config.threshold ?? samples;
|
|
314
|
+
const activeDataRefs = /* @__PURE__ */ new Set();
|
|
315
|
+
const result = datasets.map((sd) => {
|
|
316
|
+
const originalData = sd.props.data ?? [];
|
|
317
|
+
if (originalData.length <= threshold && !zoomX && !zoomY) return sd;
|
|
318
|
+
activeDataRefs.add(originalData);
|
|
319
|
+
const xField = String(sd.props.xField ?? FIELD_DEFAULTS.xField);
|
|
320
|
+
const yField = String(sd.props.yField ?? FIELD_DEFAULTS.yField);
|
|
321
|
+
let visibleData = originalData;
|
|
322
|
+
if (zoomX || zoomY) {
|
|
323
|
+
visibleData = originalData.filter((row) => {
|
|
324
|
+
const inX = !zoomX || row[xField] >= zoomX.min && row[xField] <= zoomX.max;
|
|
325
|
+
const inY = !zoomY || row[yField] >= zoomY.min && row[yField] <= zoomY.max;
|
|
326
|
+
return inX && inY;
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
if (visibleData.length <= samples) {
|
|
330
|
+
return { ...sd, props: { ...sd.props, data: visibleData } };
|
|
331
|
+
}
|
|
332
|
+
const vpKey = `${zoomX?.min ?? ""},${zoomX?.max ?? ""},${zoomY?.min ?? ""},${zoomY?.max ?? ""}`;
|
|
333
|
+
const cached = this.cache.get(originalData);
|
|
334
|
+
if (cached && cached.samples === samples && cached.viewportKey === vpKey) {
|
|
335
|
+
return { ...sd, props: { ...sd.props, data: cached.result } };
|
|
336
|
+
}
|
|
337
|
+
const xVals = visibleData.map((r) => r[xField]);
|
|
338
|
+
const yVals = visibleData.map((r) => r[yField]);
|
|
339
|
+
const decimated = decimateKMeans(xVals, yVals, samples);
|
|
340
|
+
const decimatedData = decimated.map((pt) => ({ [xField]: pt.x, [yField]: pt.y }));
|
|
341
|
+
this.cache.set(originalData, { samples, viewportKey: vpKey, result: decimatedData });
|
|
342
|
+
return { ...sd, props: { ...sd.props, data: decimatedData } };
|
|
343
|
+
});
|
|
344
|
+
for (const key of this.cache.keys()) {
|
|
345
|
+
if (!activeDataRefs.has(key)) this.cache.delete(key);
|
|
346
|
+
}
|
|
347
|
+
return result;
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
export { DEFAULT_EXPORT_MENU_ITEMS, DEFAULT_EXPORT_MENU_PROPS, EXPORT_MENU_CONSTANTS, EXPORT_MENU_LABELS, HAMBURGER_ICON_PATH, ScatterDecimator, decimate, decimateKMeans, decimateLTTB, decimateMinMax, estimateExportMenuHeight, filterExportMenuItems, getExportAction, isExportMenuSeparator, resolveExportMenuPlacement, resolveExportMenuProps };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { DEFAULT_DATA_LABEL_FONT_FAMILY, resolveFontFamily, resolveFontSize, DEFAULT_DATA_LABEL_FONT_SIZE } from './chunk-NKUYIWAP.mjs';
|
|
2
|
+
|
|
3
|
+
// src/utils/text/datalabel.utils.ts
|
|
4
|
+
function normalizeDataLabelConfig(props, adaptiveFontSize, adaptiveRotation, globalFont) {
|
|
5
|
+
if (!props) return null;
|
|
6
|
+
const fontSizeAccessor = props.fontSize;
|
|
7
|
+
const colorAccessor = props.color;
|
|
8
|
+
const connectorColorAccessor = props.connectorColor;
|
|
9
|
+
const connectorWidthAccessor = props.connectorWidth;
|
|
10
|
+
const scalarFontSize = typeof fontSizeAccessor === "number" ? fontSizeAccessor : void 0;
|
|
11
|
+
const scalarColor = typeof colorAccessor === "string" ? colorAccessor : void 0;
|
|
12
|
+
return {
|
|
13
|
+
display: props.display ?? "percentage",
|
|
14
|
+
fontSize: scalarFontSize ?? adaptiveFontSize ?? resolveFontSize(DEFAULT_DATA_LABEL_FONT_SIZE, globalFont),
|
|
15
|
+
fontWeight: props.fontWeight ?? "normal",
|
|
16
|
+
fontFamily: props.fontFamily ?? resolveFontFamily(void 0, globalFont) ?? DEFAULT_DATA_LABEL_FONT_FAMILY,
|
|
17
|
+
color: scalarColor,
|
|
18
|
+
// Pass the raw accessors through when the user supplied a non-scalar form so
|
|
19
|
+
// renderers can resolve per-label values from each item's ItemContext.
|
|
20
|
+
fontSizeAccessor: scalarFontSize === void 0 ? fontSizeAccessor : void 0,
|
|
21
|
+
colorAccessor: scalarColor === void 0 ? colorAccessor : void 0,
|
|
22
|
+
connectorColorAccessor,
|
|
23
|
+
connectorWidthAccessor,
|
|
24
|
+
minPercentage: props.minPercentage ?? 5,
|
|
25
|
+
formatter: props.formatter,
|
|
26
|
+
rotation: props.rotation ?? adaptiveRotation ?? 0,
|
|
27
|
+
leaderOffset: props.leaderOffset ?? 10,
|
|
28
|
+
horizontalOffset: props.horizontalOffset ?? 15,
|
|
29
|
+
textOffset: props.textOffset ?? 4,
|
|
30
|
+
lineHeight: props.lineHeight ?? 1.2,
|
|
31
|
+
lineStyle: props.lineStyle ?? "angled",
|
|
32
|
+
alignTo: props.alignTo ?? "labelLine",
|
|
33
|
+
render: props.render
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function formatLabelValue(value) {
|
|
37
|
+
return Number.isFinite(value) ? String(Number(value.toFixed(2))) : String(value);
|
|
38
|
+
}
|
|
39
|
+
function formatDataLabelText(value, percentage, display, formatter, label) {
|
|
40
|
+
if (formatter) {
|
|
41
|
+
return formatter(value, percentage, label);
|
|
42
|
+
}
|
|
43
|
+
switch (display) {
|
|
44
|
+
case "percentage":
|
|
45
|
+
return `${Math.round(percentage)}%`;
|
|
46
|
+
case "value":
|
|
47
|
+
return formatLabelValue(value);
|
|
48
|
+
case "both":
|
|
49
|
+
return `${formatLabelValue(value)} (${Math.round(percentage)}%)`;
|
|
50
|
+
case "label":
|
|
51
|
+
return label ?? null;
|
|
52
|
+
case "label-percentage":
|
|
53
|
+
return label ? `${label} ${Math.round(percentage)}%` : `${Math.round(percentage)}%`;
|
|
54
|
+
case "none":
|
|
55
|
+
default:
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export { formatDataLabelText, normalizeDataLabelConfig };
|