exploreda 0.0.5 → 0.1.0

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.
Files changed (208) hide show
  1. package/README.md +144 -0
  2. package/dist/ExplorEda.cjs +4608 -10858
  3. package/dist/ExplorEda.cjs.map +1 -1
  4. package/dist/ExplorEda.css +2332 -1653
  5. package/dist/ExplorEda.css.map +1 -1
  6. package/dist/ExplorEda.d.cts +125 -278
  7. package/dist/ExplorEda.d.ts +125 -278
  8. package/dist/ExplorEda.js +4521 -10782
  9. package/dist/ExplorEda.js.map +1 -1
  10. package/dist/calculations.cjs +18 -0
  11. package/dist/calculations.cjs.map +1 -0
  12. package/dist/calculations.d.cts +63 -0
  13. package/dist/calculations.d.ts +63 -0
  14. package/dist/calculations.js +3 -0
  15. package/dist/calculations.js.map +1 -0
  16. package/dist/charts/bar.cjs +27 -0
  17. package/dist/charts/bar.cjs.map +1 -0
  18. package/dist/charts/bar.d.cts +2 -0
  19. package/dist/charts/bar.d.ts +2 -0
  20. package/dist/charts/bar.js +18 -0
  21. package/dist/charts/bar.js.map +1 -0
  22. package/dist/charts/box-plot.cjs +26 -0
  23. package/dist/charts/box-plot.cjs.map +1 -0
  24. package/dist/charts/box-plot.d.cts +2 -0
  25. package/dist/charts/box-plot.d.ts +2 -0
  26. package/dist/charts/box-plot.js +17 -0
  27. package/dist/charts/box-plot.js.map +1 -0
  28. package/dist/charts/color-legend.cjs +22 -0
  29. package/dist/charts/color-legend.cjs.map +1 -0
  30. package/dist/charts/color-legend.d.cts +2 -0
  31. package/dist/charts/color-legend.d.ts +2 -0
  32. package/dist/charts/color-legend.js +13 -0
  33. package/dist/charts/color-legend.js.map +1 -0
  34. package/dist/charts/data-table.cjs +22 -0
  35. package/dist/charts/data-table.cjs.map +1 -0
  36. package/dist/charts/data-table.d.cts +2 -0
  37. package/dist/charts/data-table.d.ts +2 -0
  38. package/dist/charts/data-table.js +13 -0
  39. package/dist/charts/data-table.js.map +1 -0
  40. package/dist/charts/line.cjs +30 -0
  41. package/dist/charts/line.cjs.map +1 -0
  42. package/dist/charts/line.d.cts +2 -0
  43. package/dist/charts/line.d.ts +2 -0
  44. package/dist/charts/line.js +17 -0
  45. package/dist/charts/line.js.map +1 -0
  46. package/dist/charts/markdown.cjs +16 -0
  47. package/dist/charts/markdown.cjs.map +1 -0
  48. package/dist/charts/markdown.css +77 -0
  49. package/dist/charts/markdown.css.map +1 -0
  50. package/dist/charts/markdown.d.cts +2 -0
  51. package/dist/charts/markdown.d.ts +2 -0
  52. package/dist/charts/markdown.js +7 -0
  53. package/dist/charts/markdown.js.map +1 -0
  54. package/dist/charts/pivot-table.cjs +23 -0
  55. package/dist/charts/pivot-table.cjs.map +1 -0
  56. package/dist/charts/pivot-table.d.cts +2 -0
  57. package/dist/charts/pivot-table.d.ts +2 -0
  58. package/dist/charts/pivot-table.js +14 -0
  59. package/dist/charts/pivot-table.js.map +1 -0
  60. package/dist/charts/row.cjs +27 -0
  61. package/dist/charts/row.cjs.map +1 -0
  62. package/dist/charts/row.d.cts +6 -0
  63. package/dist/charts/row.d.ts +6 -0
  64. package/dist/charts/row.js +18 -0
  65. package/dist/charts/row.js.map +1 -0
  66. package/dist/charts/scatter.cjs +24 -0
  67. package/dist/charts/scatter.cjs.map +1 -0
  68. package/dist/charts/scatter.d.cts +2 -0
  69. package/dist/charts/scatter.d.ts +2 -0
  70. package/dist/charts/scatter.js +15 -0
  71. package/dist/charts/scatter.js.map +1 -0
  72. package/dist/charts/summary-table.cjs +19 -0
  73. package/dist/charts/summary-table.cjs.map +1 -0
  74. package/dist/charts/summary-table.d.cts +2 -0
  75. package/dist/charts/summary-table.d.ts +2 -0
  76. package/dist/charts/summary-table.js +10 -0
  77. package/dist/charts/summary-table.js.map +1 -0
  78. package/dist/charts/three-d-scatter.cjs +24 -0
  79. package/dist/charts/three-d-scatter.cjs.map +1 -0
  80. package/dist/charts/three-d-scatter.d.cts +6 -0
  81. package/dist/charts/three-d-scatter.d.ts +6 -0
  82. package/dist/charts/three-d-scatter.js +15 -0
  83. package/dist/charts/three-d-scatter.js.map +1 -0
  84. package/dist/chunk-3PGYFLE3.cjs +499 -0
  85. package/dist/chunk-3PGYFLE3.cjs.map +1 -0
  86. package/dist/chunk-4HNDKMWF.js +167 -0
  87. package/dist/chunk-4HNDKMWF.js.map +1 -0
  88. package/dist/chunk-4QNENKTV.cjs +1214 -0
  89. package/dist/chunk-4QNENKTV.cjs.map +1 -0
  90. package/dist/chunk-54M32JJB.js +132 -0
  91. package/dist/chunk-54M32JJB.js.map +1 -0
  92. package/dist/chunk-5B23JVH3.cjs +2238 -0
  93. package/dist/chunk-5B23JVH3.cjs.map +1 -0
  94. package/dist/chunk-5LH6NSNL.js +456 -0
  95. package/dist/chunk-5LH6NSNL.js.map +1 -0
  96. package/dist/chunk-6DOKKCJ5.cjs +313 -0
  97. package/dist/chunk-6DOKKCJ5.cjs.map +1 -0
  98. package/dist/chunk-6HZX5CBT.cjs +1074 -0
  99. package/dist/chunk-6HZX5CBT.cjs.map +1 -0
  100. package/dist/chunk-6U5DOIQM.js +1071 -0
  101. package/dist/chunk-6U5DOIQM.js.map +1 -0
  102. package/dist/chunk-7GBZIK2R.cjs +80 -0
  103. package/dist/chunk-7GBZIK2R.cjs.map +1 -0
  104. package/dist/chunk-7PTJNIOD.js +520 -0
  105. package/dist/chunk-7PTJNIOD.js.map +1 -0
  106. package/dist/chunk-AHZYQ7FN.js +319 -0
  107. package/dist/chunk-AHZYQ7FN.js.map +1 -0
  108. package/dist/chunk-AOODAOL4.cjs +55 -0
  109. package/dist/chunk-AOODAOL4.cjs.map +1 -0
  110. package/dist/chunk-ASKFIRMC.cjs +165 -0
  111. package/dist/chunk-ASKFIRMC.cjs.map +1 -0
  112. package/dist/chunk-B7OQUBH4.cjs +171 -0
  113. package/dist/chunk-B7OQUBH4.cjs.map +1 -0
  114. package/dist/chunk-BIMEHDLB.js +72 -0
  115. package/dist/chunk-BIMEHDLB.js.map +1 -0
  116. package/dist/chunk-C62KHV7S.js +1225 -0
  117. package/dist/chunk-C62KHV7S.js.map +1 -0
  118. package/dist/chunk-C7GQT65O.cjs +1119 -0
  119. package/dist/chunk-C7GQT65O.cjs.map +1 -0
  120. package/dist/chunk-CGDWDV4Z.js +1211 -0
  121. package/dist/chunk-CGDWDV4Z.js.map +1 -0
  122. package/dist/chunk-CJQQFNEY.js +69 -0
  123. package/dist/chunk-CJQQFNEY.js.map +1 -0
  124. package/dist/chunk-DHYLSXNR.js +964 -0
  125. package/dist/chunk-DHYLSXNR.js.map +1 -0
  126. package/dist/chunk-DKFA4KOJ.cjs +87 -0
  127. package/dist/chunk-DKFA4KOJ.cjs.map +1 -0
  128. package/dist/chunk-DS5BS7PP.cjs +357 -0
  129. package/dist/chunk-DS5BS7PP.cjs.map +1 -0
  130. package/dist/chunk-EGMFQSGK.js +909 -0
  131. package/dist/chunk-EGMFQSGK.js.map +1 -0
  132. package/dist/chunk-EU5EFHO5.cjs +53 -0
  133. package/dist/chunk-EU5EFHO5.cjs.map +1 -0
  134. package/dist/chunk-FM46QSDM.js +837 -0
  135. package/dist/chunk-FM46QSDM.js.map +1 -0
  136. package/dist/chunk-GV2LRR32.cjs +843 -0
  137. package/dist/chunk-GV2LRR32.cjs.map +1 -0
  138. package/dist/chunk-H3XKFSA5.cjs +322 -0
  139. package/dist/chunk-H3XKFSA5.cjs.map +1 -0
  140. package/dist/chunk-H5AVMMCE.js +347 -0
  141. package/dist/chunk-H5AVMMCE.js.map +1 -0
  142. package/dist/chunk-JDMUN4VK.cjs +986 -0
  143. package/dist/chunk-JDMUN4VK.cjs.map +1 -0
  144. package/dist/chunk-JNO7OXCC.js +2171 -0
  145. package/dist/chunk-JNO7OXCC.js.map +1 -0
  146. package/dist/chunk-JQMG4ZR7.js +111 -0
  147. package/dist/chunk-JQMG4ZR7.js.map +1 -0
  148. package/dist/chunk-L2Q2R43U.cjs +118 -0
  149. package/dist/chunk-L2Q2R43U.cjs.map +1 -0
  150. package/dist/chunk-LBTZVERO.js +466 -0
  151. package/dist/chunk-LBTZVERO.js.map +1 -0
  152. package/dist/chunk-LUUGGTTK.cjs +1227 -0
  153. package/dist/chunk-LUUGGTTK.cjs.map +1 -0
  154. package/dist/chunk-MEEPH7ZC.cjs +911 -0
  155. package/dist/chunk-MEEPH7ZC.cjs.map +1 -0
  156. package/dist/chunk-MJPDJ5AS.js +184 -0
  157. package/dist/chunk-MJPDJ5AS.js.map +1 -0
  158. package/dist/chunk-MJROUIDZ.cjs +219 -0
  159. package/dist/chunk-MJROUIDZ.cjs.map +1 -0
  160. package/dist/chunk-MUWSBYJS.js +528 -0
  161. package/dist/chunk-MUWSBYJS.js.map +1 -0
  162. package/dist/chunk-NDF5LCST.js +1088 -0
  163. package/dist/chunk-NDF5LCST.js.map +1 -0
  164. package/dist/chunk-NGWTPED4.js +311 -0
  165. package/dist/chunk-NGWTPED4.js.map +1 -0
  166. package/dist/chunk-PP4VCONW.js +739 -0
  167. package/dist/chunk-PP4VCONW.js.map +1 -0
  168. package/dist/chunk-PRMC2A6P.cjs +488 -0
  169. package/dist/chunk-PRMC2A6P.cjs.map +1 -0
  170. package/dist/chunk-PST6UU6S.cjs +742 -0
  171. package/dist/chunk-PST6UU6S.cjs.map +1 -0
  172. package/dist/chunk-Q7LK2UWH.js +33 -0
  173. package/dist/chunk-Q7LK2UWH.js.map +1 -0
  174. package/dist/chunk-SFV5LZPD.js +162 -0
  175. package/dist/chunk-SFV5LZPD.js.map +1 -0
  176. package/dist/chunk-SKXGYJJG.cjs +370 -0
  177. package/dist/chunk-SKXGYJJG.cjs.map +1 -0
  178. package/dist/chunk-SWLNKY6R.js +477 -0
  179. package/dist/chunk-SWLNKY6R.js.map +1 -0
  180. package/dist/chunk-TGVLNHUB.cjs +483 -0
  181. package/dist/chunk-TGVLNHUB.cjs.map +1 -0
  182. package/dist/chunk-TLLRW6S3.js +74 -0
  183. package/dist/chunk-TLLRW6S3.js.map +1 -0
  184. package/dist/chunk-TRAIXZ6M.cjs +140 -0
  185. package/dist/chunk-TRAIXZ6M.cjs.map +1 -0
  186. package/dist/chunk-U74A5VK5.cjs +74 -0
  187. package/dist/chunk-U74A5VK5.cjs.map +1 -0
  188. package/dist/chunk-UAVDLBTA.cjs +74 -0
  189. package/dist/chunk-UAVDLBTA.cjs.map +1 -0
  190. package/dist/chunk-UJWS6TRV.js +354 -0
  191. package/dist/chunk-UJWS6TRV.js.map +1 -0
  192. package/dist/chunk-UUJMUPB3.cjs +531 -0
  193. package/dist/chunk-UUJMUPB3.cjs.map +1 -0
  194. package/dist/chunk-VTKHZIJB.cjs +549 -0
  195. package/dist/chunk-VTKHZIJB.cjs.map +1 -0
  196. package/dist/chunk-YXPAWUXO.js +51 -0
  197. package/dist/chunk-YXPAWUXO.js.map +1 -0
  198. package/dist/chunk-ZD64SCZB.js +80 -0
  199. package/dist/chunk-ZD64SCZB.js.map +1 -0
  200. package/dist/core.cjs +28 -0
  201. package/dist/core.cjs.map +1 -0
  202. package/dist/core.d.cts +22 -0
  203. package/dist/core.d.ts +22 -0
  204. package/dist/core.js +3 -0
  205. package/dist/core.js.map +1 -0
  206. package/dist/dataLayerState-B4XmQjQN.d.cts +258 -0
  207. package/dist/dataLayerState-B4XmQjQN.d.ts +258 -0
  208. package/package.json +32 -52
@@ -0,0 +1,742 @@
1
+ 'use strict';
2
+
3
+ var chunkPRMC2A6P_cjs = require('./chunk-PRMC2A6P.cjs');
4
+ var chunkU74A5VK5_cjs = require('./chunk-U74A5VK5.cjs');
5
+ var chunkC7GQT65O_cjs = require('./chunk-C7GQT65O.cjs');
6
+ var chunk5B23JVH3_cjs = require('./chunk-5B23JVH3.cjs');
7
+ var chunk7GBZIK2R_cjs = require('./chunk-7GBZIK2R.cjs');
8
+ var lucideReact = require('lucide-react');
9
+ var react = require('react');
10
+ var reactDom = require('react-dom');
11
+ var sonner = require('sonner');
12
+ var jsxRuntime = require('react/jsx-runtime');
13
+
14
+ // src/hooks/useCreateCharts.ts
15
+ function useCreateCharts() {
16
+ const profiles = chunk5B23JVH3_cjs.useDataLayer((s) => s.fieldProfiles);
17
+ const charts = chunk5B23JVH3_cjs.useDataLayer((s) => s.charts);
18
+ const addChart = chunk5B23JVH3_cjs.useDataLayer((s) => s.addChart);
19
+ const createChart = (type, field, initialLayout) => {
20
+ const layout = initialLayout ?? {
21
+ x: 0,
22
+ y: Math.max(0, ...charts.map((chart) => chart.layout.y + chart.layout.h)),
23
+ w: 6,
24
+ h: 4
25
+ };
26
+ const definition = chunk7GBZIK2R_cjs.getChartDefinition(type);
27
+ if (!definition) {
28
+ throw new Error(`Chart type ${type} not registered`);
29
+ }
30
+ const numeric = profiles.filter((profile) => profile.dataType === "numeric").map((profile) => profile.name);
31
+ const categories = profiles.filter((profile) => profile.dataType !== "numeric").map((profile) => profile.name);
32
+ const selectedField = field || (type === "row" ? categories[0] : numeric[0]) || profiles[0]?.name || "";
33
+ const settings = definition.createDefaultSettings(layout, selectedField);
34
+ if (settings.type === "scatter" || settings.type === "3d-scatter") {
35
+ settings.xField = numeric[0] || "__ID";
36
+ settings.yField = field || numeric[1] || numeric[0] || "__ID";
37
+ settings.xAxisLabel = "";
38
+ settings.yAxisLabel = "";
39
+ if (settings.type === "3d-scatter")
40
+ settings.zField = numeric[2] || numeric[0] || "__ID";
41
+ }
42
+ if (settings.type === "line") {
43
+ settings.xField = "__ID";
44
+ settings.seriesField = selectedField ? [selectedField] : [];
45
+ settings.xAxisLabel = "";
46
+ settings.yAxisLabel = "";
47
+ }
48
+ if (settings.type === "data-table")
49
+ settings.columns = profiles.slice(0, 8).map((profile) => ({ id: profile.name, field: profile.name }));
50
+ if (settings.type === "pivot") {
51
+ settings.rowFields = categories.slice(0, 1);
52
+ settings.columnField = categories[1] || "";
53
+ settings.valueFields = selectedField ? [{ field: selectedField, aggregation: "count" }] : [];
54
+ }
55
+ if (settings.type === "color-legend")
56
+ settings.fields = categories.slice(0, 1);
57
+ if (settings.type === "bar" || settings.type === "row") {
58
+ settings.xAxisLabel = settings.type === "row" ? "Records" : "";
59
+ settings.yAxisLabel = settings.type === "bar" ? "Records" : "";
60
+ }
61
+ if (settings.type === "boxplot") settings.yAxisLabel = "";
62
+ settings.title = "";
63
+ addChart(settings);
64
+ };
65
+ return { createChart };
66
+ }
67
+ function ChartActions({ columnName, dataType }) {
68
+ const { createChart } = useCreateCharts();
69
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-1", children: [
70
+ dataType === "categorical" && /* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.ActionTooltip, { content: "Create row chart", children: /* @__PURE__ */ jsxRuntime.jsx(
71
+ chunk5B23JVH3_cjs.Button,
72
+ {
73
+ variant: "ghost",
74
+ size: "icon",
75
+ className: "h-6 w-6",
76
+ "aria-label": `Create row chart for ${columnName}`,
77
+ onClick: () => createChart("row", columnName),
78
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BarChart, { className: "h-4 w-4 rotate-90" })
79
+ }
80
+ ) }),
81
+ dataType === "numeric" && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
82
+ /* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.ActionTooltip, { content: "Create bar chart", children: /* @__PURE__ */ jsxRuntime.jsx(
83
+ chunk5B23JVH3_cjs.Button,
84
+ {
85
+ variant: "ghost",
86
+ size: "icon",
87
+ className: "h-6 w-6",
88
+ "aria-label": `Create bar chart for ${columnName}`,
89
+ onClick: () => createChart("bar", columnName),
90
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BarChart, { className: "h-4 w-4" })
91
+ }
92
+ ) }),
93
+ /* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.ActionTooltip, { content: "Create scatter plot", children: /* @__PURE__ */ jsxRuntime.jsx(
94
+ chunk5B23JVH3_cjs.Button,
95
+ {
96
+ variant: "ghost",
97
+ size: "icon",
98
+ className: "h-6 w-6",
99
+ "aria-label": `Create scatter chart for ${columnName}`,
100
+ onClick: () => createChart("scatter", columnName),
101
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ScatterChart, { className: "h-4 w-4" })
102
+ }
103
+ ) })
104
+ ] }),
105
+ (dataType === "categorical" || dataType === "datetime") && /* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.ActionTooltip, { content: "Create pivot table", children: /* @__PURE__ */ jsxRuntime.jsx(
106
+ chunk5B23JVH3_cjs.Button,
107
+ {
108
+ variant: "ghost",
109
+ size: "icon",
110
+ className: "h-6 w-6",
111
+ "aria-label": `Create pivot table for ${columnName}`,
112
+ onClick: () => createChart("pivot", columnName),
113
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Table2, { className: "h-4 w-4" })
114
+ }
115
+ ) })
116
+ ] });
117
+ }
118
+ var WIDTH = 96;
119
+ var HEIGHT = 20;
120
+ var SHARE_SEGMENTS = 5;
121
+ var OTHER_LABEL = "Other values";
122
+ var percent = (share) => share > 0 && share < 0.01 ? "<1%" : `${Math.round(share * 100)}%`;
123
+ function SparkDetails({
124
+ bars,
125
+ total,
126
+ fieldLabel,
127
+ locate,
128
+ children
129
+ }) {
130
+ const [active, setActive] = react.useState();
131
+ const bar = active === void 0 ? void 0 : bars[active];
132
+ const onPointerMove = (event) => {
133
+ const box = event.currentTarget.getBoundingClientRect();
134
+ if (box.width <= 0) return;
135
+ const fraction = (event.clientX - box.left) / box.width;
136
+ const index = locate(Math.min(0.9999, Math.max(0, fraction)));
137
+ setActive(index >= 0 && index < bars.length ? index : void 0);
138
+ };
139
+ return /* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.TooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs(chunk5B23JVH3_cjs.Tooltip, { open: bar !== void 0, children: [
140
+ /* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
141
+ "span",
142
+ {
143
+ className: "eda-summary-spark-hit",
144
+ "aria-hidden": "true",
145
+ onPointerMove,
146
+ onPointerLeave: () => setActive(void 0),
147
+ children: children(active)
148
+ }
149
+ ) }),
150
+ bar && /* @__PURE__ */ jsxRuntime.jsxs(chunk5B23JVH3_cjs.TooltipContent, { side: "top", collisionPadding: 12, children: [
151
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: fieldLabel }),
152
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium", children: bar.label }),
153
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "tabular-nums", children: [
154
+ bar.count.toLocaleString(),
155
+ " ",
156
+ bar.count === 1 ? "row" : "rows",
157
+ total > 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground", children: [
158
+ " ",
159
+ "\xB7 ",
160
+ percent(bar.count / total)
161
+ ] })
162
+ ] })
163
+ ] })
164
+ ] }) });
165
+ }
166
+ function Histogram({ bars, total, fieldLabel }) {
167
+ const peak = Math.max(...bars.map((bar) => bar.count), 1);
168
+ const step = WIDTH / Math.max(1, bars.length);
169
+ const gap = bars.length > 1 ? Math.min(1, step * 0.2) : 0;
170
+ return /* @__PURE__ */ jsxRuntime.jsx(
171
+ SparkDetails,
172
+ {
173
+ bars,
174
+ total,
175
+ fieldLabel,
176
+ locate: (fraction) => Math.floor(fraction * bars.length),
177
+ children: (active) => /* @__PURE__ */ jsxRuntime.jsxs(
178
+ "svg",
179
+ {
180
+ className: "eda-summary-spark",
181
+ viewBox: `0 0 ${WIDTH} ${HEIGHT}`,
182
+ preserveAspectRatio: "none",
183
+ focusable: "false",
184
+ children: [
185
+ active !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(
186
+ "rect",
187
+ {
188
+ className: "eda-summary-spark-focus",
189
+ x: active * step,
190
+ y: 0,
191
+ width: step,
192
+ height: HEIGHT
193
+ }
194
+ ),
195
+ /* @__PURE__ */ jsxRuntime.jsx(
196
+ "line",
197
+ {
198
+ className: "eda-summary-spark-base",
199
+ x1: 0,
200
+ x2: WIDTH,
201
+ y1: HEIGHT - 0.5,
202
+ y2: HEIGHT - 0.5
203
+ }
204
+ ),
205
+ bars.map(({ count }, index) => {
206
+ if (count === 0) return null;
207
+ const height = Math.max(1.5, count / peak * (HEIGHT - 1));
208
+ return /* @__PURE__ */ jsxRuntime.jsx(
209
+ "rect",
210
+ {
211
+ className: "eda-summary-spark-bar",
212
+ "data-active": index === active || void 0,
213
+ x: index * step + gap / 2,
214
+ y: HEIGHT - height,
215
+ width: Math.max(0.5, step - gap),
216
+ height
217
+ },
218
+ index
219
+ );
220
+ })
221
+ ]
222
+ }
223
+ )
224
+ }
225
+ );
226
+ }
227
+ function ShareBar({ bars, total, fieldLabel }) {
228
+ const shares = bars.map((bar) => total > 0 ? bar.count / total : 0);
229
+ const starts = shares.map(
230
+ (_, index) => shares.slice(0, index).reduce((sum, share) => sum + share, 0)
231
+ );
232
+ return /* @__PURE__ */ jsxRuntime.jsx(
233
+ SparkDetails,
234
+ {
235
+ bars,
236
+ total,
237
+ fieldLabel,
238
+ locate: (fraction) => starts.findIndex(
239
+ (start, index) => fraction >= start && fraction < start + shares[index]
240
+ ),
241
+ children: (active) => /* @__PURE__ */ jsxRuntime.jsx(
242
+ "svg",
243
+ {
244
+ className: "eda-summary-spark",
245
+ viewBox: `0 0 ${WIDTH} ${HEIGHT}`,
246
+ preserveAspectRatio: "none",
247
+ focusable: "false",
248
+ children: bars.map((bar, index) => /* @__PURE__ */ jsxRuntime.jsx(
249
+ "rect",
250
+ {
251
+ className: bar.muted ? "eda-summary-share-rest" : "eda-summary-share",
252
+ "data-rank": index,
253
+ "data-active": index === active || void 0,
254
+ x: starts[index] * WIDTH,
255
+ y: 5,
256
+ width: Math.max(0.5, shares[index] * WIDTH - 1),
257
+ height: HEIGHT - 10
258
+ },
259
+ index
260
+ ))
261
+ }
262
+ )
263
+ }
264
+ );
265
+ }
266
+ function dateBins(profile) {
267
+ const times = [];
268
+ let first;
269
+ let last;
270
+ for (const { value, count } of profile.categories?.distribution ?? []) {
271
+ const time = Date.parse(String(value));
272
+ if (!Number.isFinite(time)) continue;
273
+ for (let i = 0; i < count; i += 1) times.push(time);
274
+ if (!first || time < first.time) first = { time, value };
275
+ if (!last || time > last.time) last = { time, value };
276
+ }
277
+ if (!first || !last) return void 0;
278
+ times.sort((a, b) => a - b);
279
+ return {
280
+ first: first.value,
281
+ last: last.value,
282
+ firstTime: first.time,
283
+ lastTime: last.time,
284
+ bins: chunk5B23JVH3_cjs.binValues(times, first.time, last.time)
285
+ };
286
+ }
287
+ function labelBins(bins, min, max, label) {
288
+ const oneBinPerValue = bins.length === 1 || bins.length < chunk5B23JVH3_cjs.DISTRIBUTION_BINS && Number.isInteger(min) && bins.length === max - min + 1;
289
+ const width2 = (max - min) / Math.max(1, bins.length);
290
+ return bins.map((count, index) => {
291
+ if (oneBinPerValue) return { label: label(min + index), count };
292
+ const start = label(min + index * width2);
293
+ const end = label(
294
+ index === bins.length - 1 ? max : min + (index + 1) * width2
295
+ );
296
+ return { label: start === end ? start : `${start} \u2013 ${end}`, count };
297
+ });
298
+ }
299
+ var isoDate = (time) => new Date(time).toISOString().slice(0, 10);
300
+ function summarizeField(profile, format, fieldLabel = profile.name) {
301
+ const present = profile.totalCount - profile.nullCount - (profile.excludedCount ?? 0);
302
+ if (present <= 0) return void 0;
303
+ if (profile.statistics) {
304
+ const { min, max, median, bins = [] } = profile.statistics;
305
+ const low = format(min);
306
+ const high = format(max);
307
+ const bars2 = labelBins(bins, min, max, format);
308
+ const graphic = /* @__PURE__ */ jsxRuntime.jsx(Histogram, { bars: bars2, total: present, fieldLabel });
309
+ if (min === max) {
310
+ return { graphic, bars: bars2, low, description: `Every value is ${low}` };
311
+ }
312
+ return {
313
+ graphic,
314
+ bars: bars2,
315
+ low,
316
+ high,
317
+ statLabel: "median",
318
+ stat: format(median),
319
+ description: `Range ${low} to ${high}, median ${format(median)}`
320
+ };
321
+ }
322
+ if (profile.dataType === "datetime") {
323
+ const dates = dateBins(profile);
324
+ if (dates) {
325
+ const first = format(dates.first);
326
+ const last = format(dates.last);
327
+ const bars2 = labelBins(
328
+ dates.bins,
329
+ dates.firstTime,
330
+ dates.lastTime,
331
+ isoDate
332
+ );
333
+ return {
334
+ graphic: /* @__PURE__ */ jsxRuntime.jsx(Histogram, { bars: bars2, total: present, fieldLabel }),
335
+ bars: bars2,
336
+ low: first,
337
+ high: first === last ? void 0 : last,
338
+ description: `Dates from ${first} to ${last}`
339
+ };
340
+ }
341
+ }
342
+ const top = profile.categories?.topValues ?? [];
343
+ if (!top[0]) return void 0;
344
+ if (profile.uniqueCount === present && present > 1) {
345
+ const bars2 = [
346
+ { label: "Each value appears once", count: present, muted: true }
347
+ ];
348
+ return {
349
+ graphic: /* @__PURE__ */ jsxRuntime.jsx(ShareBar, { bars: bars2, total: present, fieldLabel }),
350
+ bars: bars2,
351
+ label: "All values unique",
352
+ description: `Every value is unique, for example ${chunk5B23JVH3_cjs.categoryLabel(top[0].value)}`
353
+ };
354
+ }
355
+ const bars = top.slice(0, SHARE_SEGMENTS).map(({ value, count }) => ({ label: chunk5B23JVH3_cjs.categoryLabel(value), count }));
356
+ const rest = present - bars.reduce((sum, bar) => sum + bar.count, 0);
357
+ if (rest > 0) bars.push({ label: OTHER_LABEL, count: rest, muted: true });
358
+ const leader = chunk5B23JVH3_cjs.categoryLabel(top[0].value);
359
+ const share = percent(top[0].count / present);
360
+ return {
361
+ graphic: /* @__PURE__ */ jsxRuntime.jsx(ShareBar, { bars, total: present, fieldLabel }),
362
+ bars,
363
+ label: leader,
364
+ statLabel: "share",
365
+ stat: share,
366
+ description: `Most common value ${leader}, ${share} of rows with a value`
367
+ };
368
+ }
369
+ var MAX_TRACK = 16;
370
+ var width = (values) => Math.min(
371
+ MAX_TRACK,
372
+ Math.max(0, ...values.map((value) => value?.length ?? 0))
373
+ );
374
+ function readingColumns(summaries) {
375
+ const present = summaries.filter(
376
+ (summary) => summary !== void 0
377
+ );
378
+ const measuredLow = width(present.map((summary) => summary.low));
379
+ const high = width(present.map((summary) => summary.high));
380
+ const label = width(present.map((summary) => summary.label));
381
+ const low = measuredLow === 0 && high === 0 ? label : measuredLow;
382
+ return {
383
+ "--eda-summary-low": `${low}ch`,
384
+ "--eda-summary-high": `${high}ch`,
385
+ "--eda-summary-stat-label": `${width(present.map((summary) => summary.statLabel))}ch`,
386
+ "--eda-summary-stat": `${width(present.map((summary) => summary.stat))}ch`
387
+ };
388
+ }
389
+ function SortHeader({
390
+ column,
391
+ label,
392
+ sort,
393
+ onSort,
394
+ className
395
+ }) {
396
+ const active = sort?.column === column;
397
+ const Icon = !active ? lucideReact.ArrowUpDown : sort.direction === "asc" ? lucideReact.ArrowUp : lucideReact.ArrowDown;
398
+ return /* @__PURE__ */ jsxRuntime.jsx(
399
+ "th",
400
+ {
401
+ scope: "col",
402
+ className,
403
+ "aria-sort": active ? sort.direction === "asc" ? "ascending" : "descending" : "none",
404
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
405
+ "button",
406
+ {
407
+ type: "button",
408
+ className: "eda-summary-sort",
409
+ "data-active": active || void 0,
410
+ onClick: () => onSort(column),
411
+ children: [
412
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: label }),
413
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { "aria-hidden": "true" })
414
+ ]
415
+ }
416
+ )
417
+ }
418
+ );
419
+ }
420
+ function CompactSummaryTable({
421
+ data,
422
+ onSort,
423
+ sort,
424
+ settings
425
+ }) {
426
+ const formatValue = chunk5B23JVH3_cjs.useDataLayer((state) => state.formatFieldValue);
427
+ const getFieldLabel = chunk5B23JVH3_cjs.useDataLayer((state) => state.getFieldLabel);
428
+ const label = getFieldLabel ?? ((field) => field);
429
+ const rows = data.map((profile) => ({
430
+ profile,
431
+ summary: summarizeField(
432
+ profile,
433
+ (value) => formatValue(profile.name, value),
434
+ label(profile.name)
435
+ )
436
+ }));
437
+ return /* @__PURE__ */ jsxRuntime.jsxs(
438
+ "table",
439
+ {
440
+ className: "eda-summary-table",
441
+ style: readingColumns(rows.map((row) => row.summary)),
442
+ children: [
443
+ /* @__PURE__ */ jsxRuntime.jsx("caption", { className: "sr-only", children: chunk5B23JVH3_cjs.getChartSummary(settings) }),
444
+ /* @__PURE__ */ jsxRuntime.jsxs("colgroup", { children: [
445
+ /* @__PURE__ */ jsxRuntime.jsx("col", { className: "eda-summary-col-field" }),
446
+ /* @__PURE__ */ jsxRuntime.jsx("col", { className: "eda-summary-col-count" }),
447
+ /* @__PURE__ */ jsxRuntime.jsx("col", { className: "eda-summary-col-count" }),
448
+ /* @__PURE__ */ jsxRuntime.jsx("col", {}),
449
+ /* @__PURE__ */ jsxRuntime.jsx("col", { className: "eda-summary-col-actions" })
450
+ ] }),
451
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
452
+ /* @__PURE__ */ jsxRuntime.jsx(SortHeader, { column: "name", label: "Field", sort, onSort }),
453
+ /* @__PURE__ */ jsxRuntime.jsx(
454
+ SortHeader,
455
+ {
456
+ column: "uniqueCount",
457
+ label: "Distinct",
458
+ sort,
459
+ onSort,
460
+ className: "eda-summary-num"
461
+ }
462
+ ),
463
+ /* @__PURE__ */ jsxRuntime.jsx(
464
+ SortHeader,
465
+ {
466
+ column: "nullCount",
467
+ label: "Missing",
468
+ sort,
469
+ onSort,
470
+ className: "eda-summary-num"
471
+ }
472
+ ),
473
+ /* @__PURE__ */ jsxRuntime.jsx("th", { scope: "col", children: "Values" }),
474
+ /* @__PURE__ */ jsxRuntime.jsx("th", { scope: "col", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Actions" }) })
475
+ ] }) }),
476
+ /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map(({ profile, summary }) => {
477
+ const fieldLabel = label(profile.name);
478
+ const missingShare = profile.totalCount > 0 ? profile.nullCount / profile.totalCount : 0;
479
+ return /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
480
+ /* @__PURE__ */ jsxRuntime.jsx("th", { scope: "row", className: "eda-summary-field", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
481
+ /* @__PURE__ */ jsxRuntime.jsx(
482
+ chunkC7GQT65O_cjs.FieldMetadata,
483
+ {
484
+ profile,
485
+ label: fieldLabel,
486
+ compact: true,
487
+ showDetail: false,
488
+ className: "min-w-0"
489
+ }
490
+ ),
491
+ /* @__PURE__ */ jsxRuntime.jsx(chunkC7GQT65O_cjs.CalculatedFieldBadge, { field: profile.name })
492
+ ] }) }),
493
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "eda-summary-num", children: profile.uniqueCount.toLocaleString() }),
494
+ /* @__PURE__ */ jsxRuntime.jsx(
495
+ "td",
496
+ {
497
+ className: chunk5B23JVH3_cjs.cn(
498
+ "eda-summary-num",
499
+ profile.nullCount > 0 && "eda-summary-missing"
500
+ ),
501
+ children: profile.nullCount > 0 ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
502
+ profile.nullCount.toLocaleString(),
503
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "eda-summary-share-label", children: missingShare < 0.01 ? "<1%" : `${Math.round(missingShare * 100)}%` })
504
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
505
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", className: "text-muted-foreground", children: "\u2013" }),
506
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "None" })
507
+ ] })
508
+ }
509
+ ),
510
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "eda-summary-values", children: summary ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "eda-summary-profile", children: [
511
+ summary.graphic,
512
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: summary.description }),
513
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { "aria-hidden": "true", className: "eda-summary-reading", children: [
514
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "eda-summary-range", children: summary.label !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "eda-summary-label", children: summary.label }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
515
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "eda-summary-low", children: summary.low }),
516
+ summary.high !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
517
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "eda-summary-sep", children: "\u2013" }),
518
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "eda-summary-high", children: summary.high })
519
+ ] })
520
+ ] }) }),
521
+ summary.stat !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "eda-summary-stat-group", children: [
522
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "eda-summary-stat-label", children: summary.statLabel }),
523
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "eda-summary-stat", children: summary.stat })
524
+ ] })
525
+ ] })
526
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: profile.totalCount === 0 ? "No rows in the current filter" : "No values" }) }),
527
+ /* @__PURE__ */ jsxRuntime.jsx("td", { className: "eda-summary-actions-cell", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "eda-summary-actions", children: [
528
+ /* @__PURE__ */ jsxRuntime.jsx(chunkPRMC2A6P_cjs.FieldInspector, { field: profile.name, children: /* @__PURE__ */ jsxRuntime.jsx(
529
+ chunk5B23JVH3_cjs.Button,
530
+ {
531
+ variant: "ghost",
532
+ size: "icon",
533
+ "aria-label": `Inspect ${fieldLabel}`,
534
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Settings2, {})
535
+ }
536
+ ) }),
537
+ /* @__PURE__ */ jsxRuntime.jsx(
538
+ ChartActions,
539
+ {
540
+ columnName: profile.name,
541
+ dataType: profile.dataType
542
+ }
543
+ )
544
+ ] }) })
545
+ ] }, profile.name);
546
+ }) })
547
+ ]
548
+ }
549
+ );
550
+ }
551
+ var exportToCSV = (profiles) => {
552
+ const headers = [
553
+ "Column",
554
+ "Type",
555
+ "Total",
556
+ "Unique",
557
+ "Missing",
558
+ "Min",
559
+ "Max",
560
+ "Mean",
561
+ "Median",
562
+ "StdDev",
563
+ "Top Values"
564
+ ];
565
+ const rows = profiles.map((profile) => [
566
+ profile.name,
567
+ profile.dataType,
568
+ profile.totalCount,
569
+ profile.uniqueCount,
570
+ profile.nullCount,
571
+ profile.statistics?.min ?? "",
572
+ profile.statistics?.max ?? "",
573
+ profile.statistics?.mean ?? "",
574
+ profile.statistics?.median ?? "",
575
+ profile.statistics?.stdDev ?? "",
576
+ profile.categories?.topValues.map((value) => `${chunk5B23JVH3_cjs.categoryLabel(value.value)}(${value.count})`).join("; ") ?? ""
577
+ ]);
578
+ const csvContent = [
579
+ headers.join(","),
580
+ ...rows.map(
581
+ (row) => row.map((cell) => `"${String(cell).replace(/"/g, '""')}"`).join(",")
582
+ )
583
+ ].join("\n");
584
+ const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });
585
+ const link = document.createElement("a");
586
+ const url = URL.createObjectURL(blob);
587
+ link.href = url;
588
+ link.download = "summary_table.csv";
589
+ document.body.appendChild(link);
590
+ link.click();
591
+ document.body.removeChild(link);
592
+ URL.revokeObjectURL(url);
593
+ sonner.toast.success("Summary table exported to CSV");
594
+ };
595
+ function SummaryTable({
596
+ height,
597
+ settings,
598
+ toolbarTarget
599
+ }) {
600
+ const sourceProfiles = chunk5B23JVH3_cjs.useDataLayer((state) => state.fieldProfiles);
601
+ const data = chunk5B23JVH3_cjs.useDataLayer((state) => state.data);
602
+ const calculations = chunk5B23JVH3_cjs.useDataLayer((state) => state.calculations);
603
+ const fieldSettings = chunk5B23JVH3_cjs.useDataLayer((state) => state.fieldSettings);
604
+ const getColumnData = chunk5B23JVH3_cjs.useDataLayer((state) => state.getColumnData);
605
+ const crossfilterWrapper = chunk5B23JVH3_cjs.useDataLayer((state) => state.crossfilterWrapper);
606
+ const liveItems = chunk5B23JVH3_cjs.useDataLayer((state) => state.liveItems);
607
+ const chartState = chunk5B23JVH3_cjs.useDataLayer((state) => state.charts);
608
+ const [sortConfig, setSortConfig] = react.useState({
609
+ column: null,
610
+ direction: "asc"
611
+ });
612
+ const allProfiles = react.useMemo(() => {
613
+ const filteredIds = new Set(
614
+ chartState.length ? crossfilterWrapper.getFilteredRowIds() : data.map((row) => row.__ID)
615
+ );
616
+ const filteredRows = data.filter((row) => filteredIds.has(row.__ID));
617
+ const profileColumn = (name) => Object.fromEntries(
618
+ filteredRows.map((row) => [row.__ID, row[name]])
619
+ );
620
+ const source = sourceProfiles.map(
621
+ (profile) => filteredRows.length === 0 ? chunk5B23JVH3_cjs.emptyFieldProfile(profile) : chunk5B23JVH3_cjs.buildFieldProfile(
622
+ profile.name,
623
+ profileColumn(profile.name),
624
+ profile.dataType
625
+ )
626
+ );
627
+ const calculated = calculations.map((calculation) => {
628
+ const allColumnData = getColumnData(calculation.resultColumnName);
629
+ const filteredColumnData = Object.fromEntries(
630
+ filteredRows.map((row) => [row.__ID, allColumnData[row.__ID]])
631
+ );
632
+ const profile = chunk5B23JVH3_cjs.buildFieldProfile(
633
+ calculation.resultColumnName,
634
+ allColumnData
635
+ );
636
+ return filteredRows.length === 0 ? chunk5B23JVH3_cjs.emptyFieldProfile(profile) : chunk5B23JVH3_cjs.buildFieldProfile(
637
+ calculation.resultColumnName,
638
+ filteredColumnData,
639
+ profile.dataType
640
+ );
641
+ });
642
+ return [...source, ...calculated];
643
+ }, [
644
+ sourceProfiles,
645
+ data,
646
+ calculations,
647
+ getColumnData,
648
+ crossfilterWrapper,
649
+ chartState,
650
+ liveItems,
651
+ fieldSettings
652
+ ]);
653
+ const sortedProfiles = react.useMemo(() => {
654
+ if (!sortConfig.column) {
655
+ return allProfiles;
656
+ }
657
+ return [...allProfiles].sort((a, b) => {
658
+ const aValue = a[sortConfig.column];
659
+ const bValue = b[sortConfig.column];
660
+ if (aValue === bValue) {
661
+ return 0;
662
+ }
663
+ if (aValue == null) {
664
+ return 1;
665
+ }
666
+ if (bValue == null) {
667
+ return -1;
668
+ }
669
+ const result = typeof aValue === "number" && typeof bValue === "number" ? aValue - bValue : String(aValue).localeCompare(String(bValue));
670
+ return sortConfig.direction === "asc" ? result : -result;
671
+ });
672
+ }, [allProfiles, sortConfig]);
673
+ const handleSort = (column) => {
674
+ setSortConfig((current) => {
675
+ if (current.column !== column) return { column, direction: "asc" };
676
+ if (current.direction === "asc") return { column, direction: "desc" };
677
+ return { column: null, direction: "asc" };
678
+ });
679
+ };
680
+ const toolbar = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "eda-table-toolbar-compact", children: [
681
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-muted-foreground tabular-nums", children: [
682
+ (allProfiles[0]?.totalCount ?? 0).toLocaleString(),
683
+ " rows"
684
+ ] }),
685
+ /* @__PURE__ */ jsxRuntime.jsx(chunk5B23JVH3_cjs.ActionTooltip, { content: "Export summary as CSV", children: /* @__PURE__ */ jsxRuntime.jsx(
686
+ chunk5B23JVH3_cjs.Button,
687
+ {
688
+ variant: "ghost",
689
+ size: "icon",
690
+ "aria-label": "Export summary as CSV",
691
+ onClick: () => exportToCSV(sortedProfiles),
692
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "h-3.5 w-3.5" })
693
+ }
694
+ ) })
695
+ ] });
696
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "eda-summary-view overflow-auto", style: { height }, children: [
697
+ toolbarTarget === void 0 ? toolbar : toolbarTarget && reactDom.createPortal(toolbar, toolbarTarget),
698
+ /* @__PURE__ */ jsxRuntime.jsx(
699
+ CompactSummaryTable,
700
+ {
701
+ data: sortedProfiles,
702
+ onSort: handleSort,
703
+ sort: sortConfig,
704
+ settings
705
+ }
706
+ )
707
+ ] });
708
+ }
709
+
710
+ // src/components/charts/SummaryTable/SummaryTableSettingsPanel.tsx
711
+ function SummaryTableSettingsPanel() {
712
+ return null;
713
+ }
714
+
715
+ // src/components/charts/SummaryTable/definition.ts
716
+ var summaryTableDefinition = {
717
+ type: "summary",
718
+ name: "Summary Table",
719
+ description: "Display summary statistics for your data",
720
+ icon: lucideReact.Info,
721
+ component: SummaryTable,
722
+ settingsPanel: SummaryTableSettingsPanel,
723
+ createDefaultSettings: (layout) => ({
724
+ ...chunkU74A5VK5_cjs.DEFAULT_CHART_SETTINGS,
725
+ id: crypto.randomUUID(),
726
+ type: "summary",
727
+ title: "Summary Table",
728
+ layout,
729
+ margin: { top: 20, right: 20, bottom: 20, left: 20 }
730
+ }),
731
+ validateSettings: () => {
732
+ return true;
733
+ },
734
+ getFilterFunction: () => {
735
+ return () => true;
736
+ }
737
+ };
738
+
739
+ exports.summaryTableDefinition = summaryTableDefinition;
740
+ exports.useCreateCharts = useCreateCharts;
741
+ //# sourceMappingURL=chunk-PST6UU6S.cjs.map
742
+ //# sourceMappingURL=chunk-PST6UU6S.cjs.map