exploreda 0.0.6 → 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 -11288
  3. package/dist/ExplorEda.cjs.map +1 -1
  4. package/dist/ExplorEda.css +2282 -1689
  5. package/dist/ExplorEda.css.map +1 -1
  6. package/dist/ExplorEda.d.cts +124 -278
  7. package/dist/ExplorEda.d.ts +124 -278
  8. package/dist/ExplorEda.js +4479 -11166
  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 +30 -52
@@ -0,0 +1,171 @@
1
+ 'use strict';
2
+
3
+ var chunk5B23JVH3_cjs = require('./chunk-5B23JVH3.cjs');
4
+ var d3ScaleChromatic = require('d3-scale-chromatic');
5
+ var d3Scale = require('d3-scale');
6
+ var react = require('react');
7
+
8
+ var numericalPalettes = {
9
+ Viridis: d3ScaleChromatic.interpolateViridis,
10
+ Inferno: d3ScaleChromatic.interpolateInferno,
11
+ Magma: d3ScaleChromatic.interpolateMagma,
12
+ Plasma: d3ScaleChromatic.interpolatePlasma,
13
+ Warm: d3ScaleChromatic.interpolateWarm,
14
+ Cool: d3ScaleChromatic.interpolateCool
15
+ };
16
+ var defaultCategoricalColors = d3ScaleChromatic.schemeCategory10;
17
+ function makeD3ColorScale(scale) {
18
+ if (scale.type === "numerical") {
19
+ const interpolate = numericalPalettes[scale.palette] ?? d3ScaleChromatic.interpolateViridis;
20
+ return d3Scale.scaleSequential(interpolate).domain([scale.min, scale.max]);
21
+ }
22
+ return d3Scale.scaleOrdinal().domain(Array.from(scale.mapping.keys())).range(scale.palette);
23
+ }
24
+ function makeColorScale(scale) {
25
+ const d3Scale = makeD3ColorScale(scale);
26
+ return (value) => scale.type === "numerical" ? d3Scale(Number(value)) : d3Scale(chunk5B23JVH3_cjs.categoryLabel(value));
27
+ }
28
+ function planNumericalLegend(scale, width, breakpoints, formatValue, getColor) {
29
+ const count = scale.min === scale.max ? 1 : Math.max(2, Math.min(Math.round(breakpoints), Math.floor(width / 56)));
30
+ const stops = Array.from({ length: count }, (_, index) => {
31
+ const value = scale.min + (scale.max - scale.min) * index / Math.max(1, count - 1);
32
+ return { value, label: formatValue(value), color: getColor(value) };
33
+ });
34
+ return {
35
+ width,
36
+ requestedBreakpoints: breakpoints,
37
+ widthPerStop: 56,
38
+ domain: [scale.min, scale.max],
39
+ stops,
40
+ background: count === 1 ? stops[0].color : `linear-gradient(to right, ${stops.map((stop) => stop.color).join(", ")})`
41
+ };
42
+ }
43
+ function useColorScales() {
44
+ const colorScales = chunk5B23JVH3_cjs.useDataLayer((state) => state.colorScales);
45
+ const addColorScale = chunk5B23JVH3_cjs.useDataLayer((state) => state.addColorScale);
46
+ const removeColorScale = chunk5B23JVH3_cjs.useDataLayer((state) => state.removeColorScale);
47
+ const updateColorScale = chunk5B23JVH3_cjs.useDataLayer((state) => state.updateColorScale);
48
+ const getColumnData = chunk5B23JVH3_cjs.useDataLayer((state) => state.getColumnData);
49
+ const fieldProfiles = chunk5B23JVH3_cjs.useDataLayer((state) => state.fieldProfiles);
50
+ const charts = chunk5B23JVH3_cjs.useDataLayer((state) => state.charts);
51
+ const d3Scales = react.useMemo(() => {
52
+ const scales = /* @__PURE__ */ new Map();
53
+ colorScales.forEach(
54
+ (scale) => scales.set(scale.id, makeD3ColorScale(scale))
55
+ );
56
+ return scales;
57
+ }, [colorScales]);
58
+ const getColorForValue = react.useCallback(
59
+ (scaleId, value, defaultColor = "#000000") => {
60
+ if (!scaleId) {
61
+ return defaultColor;
62
+ }
63
+ const scale = colorScales.find((s) => s.id === scaleId);
64
+ if (!scale) {
65
+ return "#000000";
66
+ }
67
+ const d3Scale = d3Scales.get(scaleId);
68
+ if (!d3Scale) {
69
+ return "#000000";
70
+ }
71
+ try {
72
+ if (scale.type === "numerical") {
73
+ return d3Scale(Number(value));
74
+ }
75
+ return d3Scale(chunk5B23JVH3_cjs.categoryLabel(value));
76
+ } catch {
77
+ return "#000000";
78
+ }
79
+ },
80
+ [colorScales, d3Scales]
81
+ );
82
+ const getScaleById = (id) => {
83
+ return colorScales.find((s) => s.id === id);
84
+ };
85
+ const createDefaultNumericalScale = (name, min, max, sourceField) => {
86
+ const scale = {
87
+ name,
88
+ type: "numerical",
89
+ palette: "Viridis",
90
+ min,
91
+ max,
92
+ sourceField
93
+ };
94
+ return addColorScale(scale);
95
+ };
96
+ const createDefaultCategoricalScale = (name, values, sourceField) => {
97
+ const defaultPalette = defaultCategoricalColors;
98
+ const mapping = /* @__PURE__ */ new Map();
99
+ values.forEach((value, i) => {
100
+ mapping.set(
101
+ value,
102
+ defaultPalette[i % defaultPalette.length] ?? "#000000"
103
+ );
104
+ });
105
+ const scale = {
106
+ name,
107
+ type: "categorical",
108
+ palette: Array.from(mapping.values()),
109
+ mapping,
110
+ sourceField
111
+ };
112
+ return addColorScale(scale);
113
+ };
114
+ const getD3Scale = (scaleId) => {
115
+ return d3Scales.get(scaleId) ?? d3Scale.scaleSequential(d3ScaleChromatic.interpolateViridis).domain([0, 1]);
116
+ };
117
+ const getOrCreateScaleForField = (field, name) => {
118
+ const boundScaleIds = new Set(
119
+ charts.filter(
120
+ (chart) => chart.colorField === field && typeof chart.colorScaleId === "string"
121
+ ).map((chart) => chart.colorScaleId)
122
+ );
123
+ if (boundScaleIds.size === 1) {
124
+ const [boundScaleId] = boundScaleIds;
125
+ if (boundScaleId && colorScales.some((scale) => scale.id === boundScaleId)) {
126
+ return boundScaleId;
127
+ }
128
+ }
129
+ const existingScale = colorScales.find((s) => s.sourceField === field);
130
+ if (existingScale) {
131
+ return existingScale.id;
132
+ }
133
+ const values = Object.values(getColumnData(field));
134
+ const cleanValues = values.filter((v) => v != null);
135
+ const profile = fieldProfiles.find((item) => item.name === field);
136
+ const isNumerical = (profile?.dataType ?? chunk5B23JVH3_cjs.detectColumnType(getColumnData(field))) === "numeric" && cleanValues.some((value) => chunk5B23JVH3_cjs.finiteNumber(value) !== void 0);
137
+ let newScale;
138
+ if (isNumerical) {
139
+ const numericValues = chunk5B23JVH3_cjs.finiteNumbers(cleanValues);
140
+ const min = Math.min(...numericValues);
141
+ const max = Math.max(...numericValues);
142
+ newScale = createDefaultNumericalScale(name ?? field, min, max, field);
143
+ } else {
144
+ const uniqueValues = Array.from(new Set(values.map(chunk5B23JVH3_cjs.categoryLabel)));
145
+ newScale = createDefaultCategoricalScale(
146
+ name ?? field,
147
+ uniqueValues,
148
+ field
149
+ );
150
+ }
151
+ return newScale.id;
152
+ };
153
+ return {
154
+ addColorScale,
155
+ removeColorScale,
156
+ updateColorScale,
157
+ getColorForValue,
158
+ getScaleById,
159
+ colorScales,
160
+ createDefaultNumericalScale,
161
+ createDefaultCategoricalScale,
162
+ getD3Scale,
163
+ getOrCreateScaleForField
164
+ };
165
+ }
166
+
167
+ exports.makeColorScale = makeColorScale;
168
+ exports.planNumericalLegend = planNumericalLegend;
169
+ exports.useColorScales = useColorScales;
170
+ //# sourceMappingURL=chunk-B7OQUBH4.cjs.map
171
+ //# sourceMappingURL=chunk-B7OQUBH4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/colorScaleMath.ts","../src/hooks/useColorScales.ts"],"names":["interpolateViridis","interpolateInferno","interpolateMagma","interpolatePlasma","interpolateWarm","interpolateCool","schemeCategory10","scaleSequential","scaleOrdinal","categoryLabel","useDataLayer","useMemo","useCallback","detectColumnType","finiteNumber","finiteNumbers"],"mappings":";;;;;;;AAeA,IAAM,iBAAoB,GAAA;AAAA,EACxB,OAAS,EAAAA,mCAAA;AAAA,EACT,OAAS,EAAAC,mCAAA;AAAA,EACT,KAAO,EAAAC,iCAAA;AAAA,EACP,MAAQ,EAAAC,kCAAA;AAAA,EACR,IAAM,EAAAC,gCAAA;AAAA,EACN,IAAM,EAAAC;AACR,CAAA;AAEO,IAAM,wBAA2B,GAAAC,iCAAA;AAEjC,SAAS,iBAAiB,KAAuB,EAAA;AACtD,EAAI,IAAA,KAAA,CAAM,SAAS,WAAa,EAAA;AAC9B,IAAA,MAAM,WACJ,GAAA,iBAAA,CAAkB,KAAM,CAAA,OAAyC,CACjE,IAAAN,mCAAA;AACF,IAAO,OAAAO,uBAAA,CAAgB,WAAW,CAAE,CAAA,MAAA,CAAO,CAAC,KAAM,CAAA,GAAA,EAAK,KAAM,CAAA,GAAG,CAAC,CAAA;AAAA;AAEnE,EAAA,OAAOC,oBAAqB,EAAA,CACzB,MAAO,CAAA,KAAA,CAAM,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,EAAM,CAAC,CACvC,CAAA,KAAA,CAAM,MAAM,OAAO,CAAA;AACxB;AAEO,SAAS,eAAe,KAAuB,EAAA;AACpD,EAAM,MAAA,OAAA,GAAU,iBAAiB,KAAK,CAAA;AACtC,EAAA,OAAO,CAAC,KAAA,KACN,KAAM,CAAA,IAAA,KAAS,WACV,GAAA,OAAA,CAAoC,MAAO,CAAA,KAAK,CAAC,CAAA,GACjD,OAAyC,CAAAC,+BAAA,CAAc,KAAK,CAAC,CAAA;AACtE;AAEO,SAAS,mBACd,CAAA,KAAA,EACA,KACA,EAAA,WAAA,EACA,aACA,QACA,EAAA;AACA,EAAM,MAAA,KAAA,GACJ,MAAM,GAAQ,KAAA,KAAA,CAAM,MAChB,CACA,GAAA,IAAA,CAAK,IAAI,CAAG,EAAA,IAAA,CAAK,IAAI,IAAK,CAAA,KAAA,CAAM,WAAW,CAAG,EAAA,IAAA,CAAK,MAAM,KAAQ,GAAA,EAAE,CAAC,CAAC,CAAA;AAC3E,EAAM,MAAA,KAAA,GAAQ,MAAM,IAAK,CAAA,EAAE,QAAQ,KAAM,EAAA,EAAG,CAAC,CAAA,EAAG,KAAU,KAAA;AACxD,IAAA,MAAM,KACJ,GAAA,KAAA,CAAM,GAAQ,GAAA,CAAA,KAAA,CAAM,GAAM,GAAA,KAAA,CAAM,GAAO,IAAA,KAAA,GAAS,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,KAAA,GAAQ,CAAC,CAAA;AACvE,IAAO,OAAA,EAAE,OAAO,KAAO,EAAA,WAAA,CAAY,KAAK,CAAG,EAAA,KAAA,EAAO,QAAS,CAAA,KAAK,CAAE,EAAA;AAAA,GACnE,CAAA;AACD,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,oBAAsB,EAAA,WAAA;AAAA,IACtB,YAAc,EAAA,EAAA;AAAA,IACd,MAAQ,EAAA,CAAC,KAAM,CAAA,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,IAC7B,KAAA;AAAA,IACA,YACE,KAAU,KAAA,CAAA,GACN,KAAM,CAAA,CAAC,EAAG,KACV,GAAA,CAAA,0BAAA,EAA6B,KAAM,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA,IAAA,CAAK,KAAK,CAAE,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,GAC/E;AACF;ACpDO,SAAS,cAAuC,GAAA;AACrD,EAAA,MAAM,WAAc,GAAAC,8BAAA,CAAa,CAAC,KAAA,KAAU,MAAM,WAAW,CAAA;AAC7D,EAAA,MAAM,aAAgB,GAAAA,8BAAA,CAAa,CAAC,KAAA,KAAU,MAAM,aAAa,CAAA;AACjE,EAAA,MAAM,gBAAmB,GAAAA,8BAAA,CAAa,CAAC,KAAA,KAAU,MAAM,gBAAgB,CAAA;AACvE,EAAA,MAAM,gBAAmB,GAAAA,8BAAA,CAAa,CAAC,KAAA,KAAU,MAAM,gBAAgB,CAAA;AACvE,EAAA,MAAM,aAAgB,GAAAA,8BAAA,CAAa,CAAC,KAAA,KAAU,MAAM,aAAa,CAAA;AACjE,EAAA,MAAM,aAAgB,GAAAA,8BAAA,CAAa,CAAC,KAAA,KAAU,MAAM,aAAa,CAAA;AACjE,EAAA,MAAM,MAAS,GAAAA,8BAAA,CAAa,CAAC,KAAA,KAAU,MAAM,MAAM,CAAA;AAGnD,EAAM,MAAA,QAAA,GAAWC,cAAQ,MAAM;AAC7B,IAAM,MAAA,MAAA,uBAAa,GAGjB,EAAA;AAEF,IAAY,WAAA,CAAA,OAAA;AAAA,MAAQ,CAAC,UACnB,MAAO,CAAA,GAAA,CAAI,MAAM,EAAI,EAAA,gBAAA,CAAiB,KAAK,CAAC;AAAA,KAC9C;AAEA,IAAO,OAAA,MAAA;AAAA,GACT,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,MAAM,gBAAmB,GAAAC,iBAAA;AAAA,IACvB,CACE,OAAA,EACA,KACA,EAAA,YAAA,GAAuB,SACZ,KAAA;AACX,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAO,OAAA,YAAA;AAAA;AAGT,MAAA,MAAM,QAAQ,WAAY,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,OAAO,CAAA;AACtD,MAAA,IAAI,CAAC,KAAO,EAAA;AAEV,QAAO,OAAA,SAAA;AAAA;AAGT,MAAM,MAAA,OAAA,GAAU,QAAS,CAAA,GAAA,CAAI,OAAO,CAAA;AACpC,MAAA,IAAI,CAAC,OAAS,EAAA;AACZ,QAAO,OAAA,SAAA;AAAA;AAGT,MAAI,IAAA;AACF,QAAI,IAAA,KAAA,CAAM,SAAS,WAAa,EAAA;AAC9B,UAAQ,OAAA,OAAA,CAAoC,MAAO,CAAA,KAAK,CAAC,CAAA;AAAA;AAE3D,QAAQ,OAAA,OAAA,CAAyCH,+BAAc,CAAA,KAAK,CAAC,CAAA;AAAA,OAC/D,CAAA,MAAA;AACN,QAAO,OAAA,SAAA;AAAA;AACT,KACF;AAAA,IACA,CAAC,aAAa,QAAQ;AAAA,GACxB;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,EAA2C,KAAA;AAC/D,IAAA,OAAO,YAAY,IAAK,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,GAC5C;AAEA,EAAA,MAAM,2BAA8B,GAAA,CAClC,IACA,EAAA,GAAA,EACA,KACA,WACmB,KAAA;AACnB,IAAA,MAAM,KAAyC,GAAA;AAAA,MAC7C,IAAA;AAAA,MACA,IAAM,EAAA,WAAA;AAAA,MACN,OAAS,EAAA,SAAA;AAAA,MACT,GAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,GAC5B;AAEA,EAAA,MAAM,6BAAgC,GAAA,CACpC,IACA,EAAA,MAAA,EACA,WACmB,KAAA;AACnB,IAAA,MAAM,cAAiB,GAAA,wBAAA;AACvB,IAAM,MAAA,OAAA,uBAAc,GAAoB,EAAA;AACxC,IAAO,MAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAO,CAAM,KAAA;AAC3B,MAAQ,OAAA,CAAA,GAAA;AAAA,QACN,KAAA;AAAA,QACA,cAAe,CAAA,CAAA,GAAI,cAAe,CAAA,MAAM,CAAK,IAAA;AAAA,OAC/C;AAAA,KACD,CAAA;AAED,IAAA,MAAM,KAA2C,GAAA;AAAA,MAC/C,IAAA;AAAA,MACA,IAAM,EAAA,aAAA;AAAA,MACN,OAAS,EAAA,KAAA,CAAM,IAAK,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACpC,OAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,cAAc,KAAK,CAAA;AAAA,GAC5B;AAEA,EAAM,MAAA,UAAA,GAAa,CAAC,OAAoB,KAAA;AACtC,IACE,OAAA,QAAA,CAAS,GAAI,CAAA,OAAO,CACpBF,IAAAA,uBAAAA,CAAgBP,mCAAkB,CAAA,CAAE,MAAO,CAAA,CAAC,CAAG,EAAA,CAAC,CAAC,CAAA;AAAA,GAErD;AAEA,EAAM,MAAA,wBAAA,GAA2B,CAAC,KAAA,EAAe,IAA0B,KAAA;AAGzE,IAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,MACxB,MACG,CAAA,MAAA;AAAA,QACC,CAAC,KACC,KAAA,KAAA,CAAM,eAAe,KAAS,IAAA,OAAO,MAAM,YAAiB,KAAA;AAAA,OAE/D,CAAA,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,YAAsB;AAAA,KAChD;AACA,IAAI,IAAA,aAAA,CAAc,SAAS,CAAG,EAAA;AAC5B,MAAM,MAAA,CAAC,YAAY,CAAI,GAAA,aAAA;AACvB,MACE,IAAA,YAAA,IACA,YAAY,IAAK,CAAA,CAAC,UAAU,KAAM,CAAA,EAAA,KAAO,YAAY,CACrD,EAAA;AACA,QAAO,OAAA,YAAA;AAAA;AACT;AAIF,IAAA,MAAM,gBAAgB,WAAY,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,gBAAgB,KAAK,CAAA;AACrE,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,OAAO,aAAc,CAAA,EAAA;AAAA;AAIvB,IAAA,MAAM,MAAS,GAAA,MAAA,CAAO,MAAO,CAAA,aAAA,CAAc,KAAK,CAAC,CAAA;AAGjD,IAAA,MAAM,cAAc,MAAO,CAAA,MAAA,CAAO,CAAC,CAAA,KAA4B,KAAK,IAAI,CAAA;AAGxE,IAAA,MAAM,UAAU,aAAc,CAAA,IAAA,CAAK,CAAC,IAAS,KAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAChE,IAAA,MAAM,eACH,OAAS,EAAA,QAAA,IAAYa,kCAAiB,CAAA,aAAA,CAAc,KAAK,CAAC,CAAA,MACzD,SACF,IAAA,WAAA,CAAY,KAAK,CAAC,KAAA,KAAUC,8BAAa,CAAA,KAAK,MAAM,MAAS,CAAA;AAE/D,IAAI,IAAA,QAAA;AACJ,IAAA,IAAI,WAAa,EAAA;AACf,MAAM,MAAA,aAAA,GAAgBC,gCAAc,WAAW,CAAA;AAC/C,MAAA,MAAM,GAAM,GAAA,IAAA,CAAK,GAAI,CAAA,GAAG,aAAa,CAAA;AACrC,MAAA,MAAM,GAAM,GAAA,IAAA,CAAK,GAAI,CAAA,GAAG,aAAa,CAAA;AACrC,MAAA,QAAA,GAAW,2BAA4B,CAAA,IAAA,IAAQ,KAAO,EAAA,GAAA,EAAK,KAAK,KAAK,CAAA;AAAA,KAChE,MAAA;AACL,MAAM,MAAA,YAAA,GAAe,MAAM,IAAK,CAAA,IAAI,IAAI,MAAO,CAAA,GAAA,CAAIN,+BAAa,CAAC,CAAC,CAAA;AAClE,MAAW,QAAA,GAAA,6BAAA;AAAA,QACT,IAAQ,IAAA,KAAA;AAAA,QACR,YAAA;AAAA,QACA;AAAA,OACF;AAAA;AAGF,IAAA,OAAO,QAAS,CAAA,EAAA;AAAA,GAClB;AAEA,EAAO,OAAA;AAAA,IACL,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,2BAAA;AAAA,IACA,6BAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF","file":"chunk-B7OQUBH4.cjs","sourcesContent":["import { categoryLabel } from \"./categories\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport type { ColorScaleType } from \"@/types/ColorScaleTypes\";\nimport { scaleOrdinal, scaleSequential } from \"d3-scale\";\nimport type { ScaleOrdinal, ScaleSequential } from \"d3-scale\";\nimport {\n interpolateCool,\n interpolateInferno,\n interpolateMagma,\n interpolatePlasma,\n interpolateViridis,\n interpolateWarm,\n schemeCategory10,\n} from \"d3-scale-chromatic\";\n\nconst numericalPalettes = {\n Viridis: interpolateViridis,\n Inferno: interpolateInferno,\n Magma: interpolateMagma,\n Plasma: interpolatePlasma,\n Warm: interpolateWarm,\n Cool: interpolateCool,\n};\n\nexport const defaultCategoricalColors = schemeCategory10;\n\nexport function makeD3ColorScale(scale: ColorScaleType) {\n if (scale.type === \"numerical\") {\n const interpolate =\n numericalPalettes[scale.palette as keyof typeof numericalPalettes] ??\n interpolateViridis;\n return scaleSequential(interpolate).domain([scale.min, scale.max]);\n }\n return scaleOrdinal<string>()\n .domain(Array.from(scale.mapping.keys()))\n .range(scale.palette);\n}\n\nexport function makeColorScale(scale: ColorScaleType) {\n const d3Scale = makeD3ColorScale(scale);\n return (value: datum) =>\n scale.type === \"numerical\"\n ? (d3Scale as ScaleSequential<string>)(Number(value))\n : (d3Scale as ScaleOrdinal<string, string>)(categoryLabel(value));\n}\n\nexport function planNumericalLegend(\n scale: Extract<ColorScaleType, { type: \"numerical\" }>,\n width: number,\n breakpoints: number,\n formatValue: (value: number) => string,\n getColor: (value: number) => string\n) {\n const count =\n scale.min === scale.max\n ? 1\n : Math.max(2, Math.min(Math.round(breakpoints), Math.floor(width / 56)));\n const stops = Array.from({ length: count }, (_, index) => {\n const value =\n scale.min + ((scale.max - scale.min) * index) / Math.max(1, count - 1);\n return { value, label: formatValue(value), color: getColor(value) };\n });\n return {\n width,\n requestedBreakpoints: breakpoints,\n widthPerStop: 56,\n domain: [scale.min, scale.max] as [number, number],\n stops,\n background:\n count === 1\n ? stops[0]!.color\n : `linear-gradient(to right, ${stops.map((stop) => stop.color).join(\", \")})`,\n };\n}\n","import { finiteNumber, finiteNumbers } from \"@/lib/numeric\";\nimport { categoryLabel } from \"@/lib/categories\";\nimport { detectColumnType } from \"@/components/SummaryTable/utils/dataTypeDetection\";\nimport { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport {\n CategoricalColorScale,\n ColorScaleType,\n NumericalColorScale,\n UseColorScalesReturn,\n} from \"@/types/ColorScaleTypes\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport { interpolateViridis } from \"d3-scale-chromatic\";\nimport { scaleSequential } from \"d3-scale\";\nimport type { ScaleOrdinal, ScaleSequential } from \"d3-scale\";\nimport {\n defaultCategoricalColors,\n makeD3ColorScale,\n} from \"@/lib/colorScaleMath\";\n\nimport { useCallback, useMemo } from \"react\";\n\nexport function useColorScales(): UseColorScalesReturn {\n const colorScales = useDataLayer((state) => state.colorScales);\n const addColorScale = useDataLayer((state) => state.addColorScale);\n const removeColorScale = useDataLayer((state) => state.removeColorScale);\n const updateColorScale = useDataLayer((state) => state.updateColorScale);\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const fieldProfiles = useDataLayer((state) => state.fieldProfiles);\n const charts = useDataLayer((state) => state.charts);\n\n // Memoized d3 scale objects\n const d3Scales = useMemo(() => {\n const scales = new Map<\n string,\n ScaleSequential<string> | ScaleOrdinal<string, string>\n >();\n\n colorScales.forEach((scale) =>\n scales.set(scale.id, makeD3ColorScale(scale))\n );\n\n return scales;\n }, [colorScales]);\n\n const getColorForValue = useCallback(\n (\n scaleId: string | undefined,\n value: datum,\n defaultColor: string = \"#000000\"\n ): string => {\n if (!scaleId) {\n return defaultColor;\n }\n\n const scale = colorScales.find((s) => s.id === scaleId);\n if (!scale) {\n // console.warn(`Color scale ${scaleId} not found`);\n return \"#000000\";\n }\n\n const d3Scale = d3Scales.get(scaleId);\n if (!d3Scale) {\n return \"#000000\";\n }\n\n try {\n if (scale.type === \"numerical\") {\n return (d3Scale as ScaleSequential<string>)(Number(value));\n }\n return (d3Scale as ScaleOrdinal<string, string>)(categoryLabel(value));\n } catch {\n return \"#000000\";\n }\n },\n [colorScales, d3Scales]\n );\n\n const getScaleById = (id: string): ColorScaleType | undefined => {\n return colorScales.find((s) => s.id === id);\n };\n\n const createDefaultNumericalScale = (\n name: string,\n min: number,\n max: number,\n sourceField?: string\n ): ColorScaleType => {\n const scale: Omit<NumericalColorScale, \"id\"> = {\n name,\n type: \"numerical\",\n palette: \"Viridis\",\n min,\n max,\n sourceField,\n };\n return addColorScale(scale);\n };\n\n const createDefaultCategoricalScale = (\n name: string,\n values: string[],\n sourceField?: string\n ): ColorScaleType => {\n const defaultPalette = defaultCategoricalColors;\n const mapping = new Map<string, string>();\n values.forEach((value, i) => {\n mapping.set(\n value,\n defaultPalette[i % defaultPalette.length] ?? \"#000000\"\n );\n });\n\n const scale: Omit<CategoricalColorScale, \"id\"> = {\n name,\n type: \"categorical\",\n palette: Array.from(mapping.values()),\n mapping,\n sourceField,\n };\n return addColorScale(scale);\n };\n\n const getD3Scale = (scaleId: string) => {\n return (\n d3Scales.get(scaleId) ??\n scaleSequential(interpolateViridis).domain([0, 1])\n );\n };\n\n const getOrCreateScaleForField = (field: string, name?: string): string => {\n // Existing chart bindings are authoritative. Keep the exact ID instead of\n // matching display names.\n const boundScaleIds = new Set(\n charts\n .filter(\n (chart) =>\n chart.colorField === field && typeof chart.colorScaleId === \"string\"\n )\n .map((chart) => chart.colorScaleId as string)\n );\n if (boundScaleIds.size === 1) {\n const [boundScaleId] = boundScaleIds;\n if (\n boundScaleId &&\n colorScales.some((scale) => scale.id === boundScaleId)\n ) {\n return boundScaleId;\n }\n }\n\n // Otherwise reuse the explicitly bound source scale before creating one.\n const existingScale = colorScales.find((s) => s.sourceField === field);\n if (existingScale) {\n return existingScale.id;\n }\n\n // Get all values for the field\n const values = Object.values(getColumnData(field));\n\n // Filter out null and undefined\n const cleanValues = values.filter((v): v is string | number => v != null);\n\n // Check if values are numerical\n const profile = fieldProfiles.find((item) => item.name === field);\n const isNumerical =\n (profile?.dataType ?? detectColumnType(getColumnData(field))) ===\n \"numeric\" &&\n cleanValues.some((value) => finiteNumber(value) !== undefined);\n\n let newScale: ColorScaleType;\n if (isNumerical) {\n const numericValues = finiteNumbers(cleanValues);\n const min = Math.min(...numericValues);\n const max = Math.max(...numericValues);\n newScale = createDefaultNumericalScale(name ?? field, min, max, field);\n } else {\n const uniqueValues = Array.from(new Set(values.map(categoryLabel)));\n newScale = createDefaultCategoricalScale(\n name ?? field,\n uniqueValues,\n field\n );\n }\n\n return newScale.id;\n };\n\n return {\n addColorScale,\n removeColorScale,\n updateColorScale,\n getColorForValue,\n getScaleById,\n colorScales,\n createDefaultNumericalScale,\n createDefaultCategoricalScale,\n getD3Scale,\n getOrCreateScaleForField,\n };\n}\n"]}
@@ -0,0 +1,72 @@
1
+ import { Input } from './chunk-MJPDJ5AS.js';
2
+ import { cn } from './chunk-JNO7OXCC.js';
3
+ import { useState, useEffect } from 'react';
4
+ import { jsx } from 'react/jsx-runtime';
5
+
6
+ function NumericInputEnter({
7
+ id,
8
+ value,
9
+ onChange,
10
+ stepSmall = 1,
11
+ stepMedium = 10,
12
+ stepLarge = 100,
13
+ min,
14
+ max,
15
+ placeholder,
16
+ className
17
+ }) {
18
+ const [localValue, setLocalValue] = useState(value.toString());
19
+ useEffect(() => setLocalValue(value.toString()), [value]);
20
+ const handleKeyDown = (e) => {
21
+ let delta = 0;
22
+ if (e.key === "ArrowUp" || e.key === "ArrowDown") {
23
+ e.preventDefault();
24
+ const direction = e.key === "ArrowUp" ? 1 : -1;
25
+ if (e.shiftKey && e.altKey) {
26
+ delta = stepLarge * direction;
27
+ } else if (e.shiftKey) {
28
+ delta = stepMedium * direction;
29
+ } else {
30
+ delta = stepSmall * direction;
31
+ }
32
+ const newValue = Number(value) + delta;
33
+ const clampedValue = Math.min(
34
+ max ?? Infinity,
35
+ Math.max(min ?? -Infinity, newValue)
36
+ );
37
+ onChange(clampedValue);
38
+ setLocalValue(clampedValue.toString());
39
+ }
40
+ };
41
+ const handleChange = (e) => {
42
+ setLocalValue(e.target.value);
43
+ const newValue = parseFloat(e.target.value);
44
+ if (!isNaN(newValue)) {
45
+ if ((min === void 0 || newValue >= min) && (max === void 0 || newValue <= max)) {
46
+ onChange(newValue);
47
+ }
48
+ }
49
+ };
50
+ const handleBlur = () => {
51
+ setLocalValue(value.toString());
52
+ };
53
+ return /* @__PURE__ */ jsx("div", { className: cn("relative max-w-[160px]", className), children: /* @__PURE__ */ jsx(
54
+ Input,
55
+ {
56
+ id,
57
+ type: "number",
58
+ value: localValue,
59
+ onChange: handleChange,
60
+ onKeyDown: handleKeyDown,
61
+ onBlur: handleBlur,
62
+ min,
63
+ max,
64
+ placeholder,
65
+ className: `w-full`
66
+ }
67
+ ) });
68
+ }
69
+
70
+ export { NumericInputEnter };
71
+ //# sourceMappingURL=chunk-BIMEHDLB.js.map
72
+ //# sourceMappingURL=chunk-BIMEHDLB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/NumericInputEnter.tsx"],"names":[],"mappings":";;;;;AAiBO,SAAS,iBAAkB,CAAA;AAAA,EAChC,EAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAY,GAAA,CAAA;AAAA,EACZ,UAAa,GAAA,EAAA;AAAA,EACb,SAAY,GAAA,GAAA;AAAA,EACZ,GAAA;AAAA,EACA,GAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAA2B,EAAA;AACzB,EAAA,MAAM,CAAC,UAAY,EAAA,aAAa,IAAI,QAAiB,CAAA,KAAA,CAAM,UAAU,CAAA;AAErE,EAAU,SAAA,CAAA,MAAM,cAAc,KAAM,CAAA,QAAA,EAAU,CAAG,EAAA,CAAC,KAAK,CAAC,CAAA;AAExD,EAAM,MAAA,aAAA,GAAgB,CAAC,CAAuC,KAAA;AAC5D,IAAA,IAAI,KAAQ,GAAA,CAAA;AAGZ,IAAA,IAAI,CAAE,CAAA,GAAA,KAAQ,SAAa,IAAA,CAAA,CAAE,QAAQ,WAAa,EAAA;AAChD,MAAA,CAAA,CAAE,cAAe,EAAA;AACjB,MAAA,MAAM,SAAY,GAAA,CAAA,CAAE,GAAQ,KAAA,SAAA,GAAY,CAAI,GAAA,EAAA;AAE5C,MAAI,IAAA,CAAA,CAAE,QAAY,IAAA,CAAA,CAAE,MAAQ,EAAA;AAC1B,QAAA,KAAA,GAAQ,SAAY,GAAA,SAAA;AAAA,OACtB,MAAA,IAAW,EAAE,QAAU,EAAA;AACrB,QAAA,KAAA,GAAQ,UAAa,GAAA,SAAA;AAAA,OAChB,MAAA;AACL,QAAA,KAAA,GAAQ,SAAY,GAAA,SAAA;AAAA;AAGtB,MAAM,MAAA,QAAA,GAAW,MAAO,CAAA,KAAK,CAAI,GAAA,KAAA;AAGjC,MAAA,MAAM,eAAe,IAAK,CAAA,GAAA;AAAA,QACxB,GAAO,IAAA,QAAA;AAAA,QACP,IAAK,CAAA,GAAA,CAAI,GAAO,IAAA,CAAA,QAAA,EAAW,QAAQ;AAAA,OACrC;AAEA,MAAA,QAAA,CAAS,YAAY,CAAA;AACrB,MAAc,aAAA,CAAA,YAAA,CAAa,UAAU,CAAA;AAAA;AACvC,GACF;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,CAA2C,KAAA;AAC/D,IAAc,aAAA,CAAA,CAAA,CAAE,OAAO,KAAK,CAAA;AAE5B,IAAA,MAAM,QAAW,GAAA,UAAA,CAAW,CAAE,CAAA,MAAA,CAAO,KAAK,CAAA;AAC1C,IAAI,IAAA,CAAC,KAAM,CAAA,QAAQ,CAAG,EAAA;AAEpB,MAAA,IAAA,CACG,QAAQ,MAAa,IAAA,QAAA,IAAY,SACjC,GAAQ,KAAA,MAAA,IAAa,YAAY,GAClC,CAAA,EAAA;AACA,QAAA,QAAA,CAAS,QAAQ,CAAA;AAAA;AACnB;AACF,GACF;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAc,aAAA,CAAA,KAAA,CAAM,UAAU,CAAA;AAAA,GAChC;AAEA,EAAA,2BACG,KAAI,EAAA,EAAA,SAAA,EAAW,EAAG,CAAA,wBAAA,EAA0B,SAAS,CACpD,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,EAAA;AAAA,MACA,IAAK,EAAA,QAAA;AAAA,MACL,KAAO,EAAA,UAAA;AAAA,MACP,QAAU,EAAA,YAAA;AAAA,MACV,SAAW,EAAA,aAAA;AAAA,MACX,MAAQ,EAAA,UAAA;AAAA,MACR,GAAA;AAAA,MACA,GAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAW,EAAA,CAAA,MAAA;AAAA;AAAA,GAEf,EAAA,CAAA;AAEJ","file":"chunk-BIMEHDLB.js","sourcesContent":["import { cn } from \"@/lib/utils\";\nimport { Input } from \"./ui/input\";\nimport { KeyboardEvent, useEffect, useState } from \"react\";\n\nexport interface NumericInputEnterProps {\n id?: string;\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n stepSmall?: number;\n stepMedium?: number;\n stepLarge?: number;\n placeholder?: string;\n className?: string;\n}\n\nexport function NumericInputEnter({\n id,\n value,\n onChange,\n stepSmall = 1,\n stepMedium = 10,\n stepLarge = 100,\n min,\n max,\n placeholder,\n className,\n}: NumericInputEnterProps) {\n const [localValue, setLocalValue] = useState<string>(value.toString());\n\n useEffect(() => setLocalValue(value.toString()), [value]);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n let delta = 0;\n\n // Handle arrow keys with modifiers\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const direction = e.key === \"ArrowUp\" ? 1 : -1;\n\n if (e.shiftKey && e.altKey) {\n delta = stepLarge * direction;\n } else if (e.shiftKey) {\n delta = stepMedium * direction;\n } else {\n delta = stepSmall * direction;\n }\n\n const newValue = Number(value) + delta;\n\n // Clamp value within min/max bounds\n const clampedValue = Math.min(\n max ?? Infinity,\n Math.max(min ?? -Infinity, newValue)\n );\n\n onChange(clampedValue);\n setLocalValue(clampedValue.toString());\n }\n };\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n setLocalValue(e.target.value);\n\n const newValue = parseFloat(e.target.value);\n if (!isNaN(newValue)) {\n // Only update if within bounds\n if (\n (min === undefined || newValue >= min) &&\n (max === undefined || newValue <= max)\n ) {\n onChange(newValue);\n }\n }\n };\n\n const handleBlur = () => {\n setLocalValue(value.toString());\n };\n\n return (\n <div className={cn(\"relative max-w-[160px]\", className)}>\n <Input\n id={id}\n type=\"number\"\n value={localValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n onBlur={handleBlur}\n min={min}\n max={max}\n placeholder={placeholder}\n className={`w-full`}\n />\n </div>\n );\n}\n"]}