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 @@
1
+ {"version":3,"sources":["../src/components/charts/ScatterPlot/ScatterPlotSettingsPanel.tsx","../src/components/charts/ScatterPlot/planScatterPoints.ts","../src/components/charts/ScatterPlot/scatterPlan.ts","../src/components/charts/ScatterPlot/ScatterSvg.tsx","../src/components/charts/ScatterPlot/scatterTrace.ts","../src/components/charts/ScatterPlot/ScatterPlot.tsx","../src/components/charts/ScatterPlot/definition.ts"],"names":["kind","id","props","jsx","jsxs","useState","useId","useRef","bounds"],"mappings":"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","file":"chunk-C62KHV7S.js","sourcesContent":["import { ChartSettingsPanelProps } from \"@/types/ChartTypes\";\nimport { ScatterPlotSettings } from \"./definition\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { FieldSelector } from \"@/components/FieldSelector\";\nimport { useColorScales } from \"@/hooks/useColorScales\";\n\nexport function ScatterPlotSettingsPanel({\n settings,\n onSettingsChange,\n}: ChartSettingsPanelProps<ScatterPlotSettings>) {\n const { getOrCreateScaleForField } = useColorScales();\n\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-[120px_1fr] items-center gap-4\">\n <Label>X Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.xField}\n onChange={(value) => onSettingsChange({ ...settings, xField: value })}\n />\n\n <Label>Y Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.yField}\n onChange={(value) => onSettingsChange({ ...settings, yField: value })}\n />\n\n <Label>Color Field</Label>\n <FieldSelector\n label=\"\"\n value={settings.colorField ?? \"\"}\n allowClear\n onChange={(value) =>\n onSettingsChange({\n ...settings,\n colorField: value || undefined,\n colorScaleId: value ? getOrCreateScaleForField(value) : undefined,\n })\n }\n />\n <Label htmlFor=\"scatter-point-size\">Point size</Label>\n <Input\n id=\"scatter-point-size\"\n type=\"number\"\n min={1}\n max={12}\n step={0.5}\n value={settings.pointSize ?? 3}\n onChange={(event) => {\n const value = Number(event.target.value);\n if (value >= 1 && value <= 12)\n onSettingsChange({ ...settings, pointSize: value });\n }}\n />\n <Label htmlFor=\"scatter-opacity\">Opacity</Label>\n <Input\n id=\"scatter-opacity\"\n type=\"number\"\n min={0.1}\n max={1}\n step={0.1}\n value={settings.pointOpacity ?? 0.7}\n onChange={(event) => {\n const value = Number(event.target.value);\n if (value >= 0.1 && value <= 1)\n onSettingsChange({ ...settings, pointOpacity: value });\n }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">\n Smaller, transparent points reveal overlap. Drag a rectangle to filter\n the other views.\n </p>\n </div>\n );\n}\n","import { finiteNumber } from \"@/lib/numeric\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { getRangeFilterForField } from \"@/hooks/getAxisFilter\";\nimport type { IdType } from \"@/providers/DataLayerProvider\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport type { ScatterPlotSettings } from \"./definition\";\n\nexport interface ScatterPointStyle {\n radius: { value: number; source: \"chart-setting\" | \"scatter-default\" };\n opacity: { value: number; source: \"chart-setting\" | \"scatter-default\" };\n dimmedOpacity: { value: number; source: \"own-filter-rule\" };\n}\n\nexport function planScatterPoints({\n settings,\n style,\n ids,\n xData,\n yData,\n colorData,\n xScale,\n yScale,\n getColor,\n}: {\n settings: ScatterPlotSettings;\n style: ScatterPointStyle;\n ids: IdType[];\n xData: Record<IdType, datum>;\n yData: Record<IdType, datum>;\n colorData: Record<IdType, datum>;\n xScale: (value: number) => number;\n yScale: (value: number) => number;\n getColor: (value: datum) => string;\n}) {\n const xFilter = getRangeFilterForField(settings.filters, settings.xField);\n const yFilter = getRangeFilterForField(settings.filters, settings.yField);\n const colorFilters = settings.filters.filter(\n (filter) => filter.field === settings.colorField\n );\n const points = [];\n\n for (const sourceId of ids) {\n const rawX = xData[sourceId];\n const rawY = yData[sourceId];\n const xValue = finiteNumber(rawX) ?? NaN;\n const yValue = finiteNumber(rawY) ?? NaN;\n if (!Number.isFinite(xValue) || !Number.isFinite(yValue)) {\n continue;\n }\n\n const x = xScale(xValue);\n const y = yScale(yValue);\n if (!Number.isFinite(x) || !Number.isFinite(y)) {\n continue;\n }\n\n const passesOwnFilter =\n (!xFilter || applyFilter(xValue, xFilter)) &&\n (!yFilter || applyFilter(yValue, yFilter)) &&\n colorFilters.every((filter) => applyFilter(colorData[sourceId], filter));\n const mappedColor = getColor(colorData[sourceId]);\n points.push({\n id: `${settings.id}:point:${sourceId}`,\n sourceId,\n xValue,\n yValue,\n colorValue: colorData[sourceId],\n mappedColor,\n x,\n y,\n color: passesOwnFilter ? mappedColor : \"rgb(156 163 175)\",\n opacity: passesOwnFilter\n ? style.opacity.value\n : style.dimmedOpacity.value,\n radius: style.radius.value,\n passesOwnFilter,\n });\n }\n\n return points;\n}\n","import { finiteNumber } from \"@/lib/numeric\";\nimport { getRangeFilterForField } from \"@/hooks/getAxisFilter\";\nimport {\n getFieldLabel,\n formatFieldValue,\n hasFieldDisplayFormat,\n type FieldSettingsMap,\n} from \"@/lib/fieldSettings\";\nimport { makeColorScale } from \"@/lib/colorScaleMath\";\nimport {\n categoryIncludes,\n categoryKey,\n categoryLabel,\n categoryValue,\n} from \"@/lib/categories\";\nimport type { IdType } from \"@/providers/DataLayerProvider\";\nimport type { datum, MarginSettings } from \"@/types/ChartTypes\";\nimport type { ColorScaleType } from \"@/types/ColorScaleTypes\";\nimport type { ValueFilter } from \"@/types/FilterTypes\";\nimport { numericScale } from \"../Axis/numericScale\";\nimport {\n planAxes,\n planChartMargin,\n type ChartAxesPlan,\n} from \"../Axis/axisPlan\";\nimport { getChartTitle } from \"../chartAccessibility\";\nimport { planScatterPoints, type ScatterPointStyle } from \"./planScatterPoints\";\nimport type { ScatterPlotSettings } from \"./definition\";\n\nexport type Extent = [[number, number], [number, number]];\ntype ScatterPoint = ReturnType<typeof planScatterPoints>[number] & {\n passesAllFilters: boolean;\n};\nexport type SvgPrimitive =\n | {\n kind: \"line\";\n id: string;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n className?: string;\n stroke?: string;\n strokeOpacity?: number;\n strokeWidth?: number;\n strokeDasharray?: string;\n hitStrokeWidth?: number;\n }\n | {\n kind: \"rect\";\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n rx?: number;\n fill?: string;\n fillOpacity?: number;\n stroke?: string;\n strokeWidth?: number;\n cursor?: string;\n }\n | {\n kind: \"circle\";\n id: string;\n cx: number;\n cy: number;\n r: number;\n fill?: string;\n stroke?: string;\n strokeWidth?: number;\n }\n | {\n kind: \"text\";\n id: string;\n x: number;\n y: number;\n text: string;\n className?: string;\n fill?: string;\n textAnchor?: \"start\" | \"middle\" | \"end\";\n fontSize?: number;\n fontWeight?: number;\n dy?: string;\n transform?: string;\n title?: string;\n };\n\nexport interface ScatterSnapshot {\n revision: string;\n allIds: IdType[];\n chartIds: IdType[];\n filteredIds: IdType[];\n facetIds?: IdType[];\n xData: Record<IdType, datum>;\n yData: Record<IdType, datum>;\n colorData: Record<IdType, datum>;\n facetRowData?: Record<IdType, datum>;\n facetColumnData?: Record<IdType, datum>;\n fieldSettings: FieldSettingsMap;\n colorScale?: ColorScaleType;\n calculatedFields?: string[];\n pixelRatio?: number;\n}\n\nexport interface ScatterPlan {\n revision: string;\n width: number;\n height: number;\n margin: MarginSettings;\n plotWidth: number;\n plotHeight: number;\n clipWidth: number;\n clipHeight: number;\n pixelRatio: number;\n calculatedBadges: {\n id: string;\n field: string;\n x: number;\n y: number;\n rotation: number;\n }[];\n xScale: {\n type: \"linear\" | \"symlog\";\n domain: [number, number];\n range: [number, number];\n };\n yScale: {\n type: \"linear\" | \"symlog\";\n domain: [number, number];\n range: [number, number];\n };\n title: string;\n description: string;\n axes: ChartAxesPlan;\n domainInputs: {\n x: [number, number];\n y: [number, number];\n buffer: number;\n population: \"all\";\n };\n legend?: {\n field: string;\n scaleId: string;\n type: \"categorical\" | \"numerical\";\n palette: string | string[];\n domain?: [number, number];\n items: {\n id: string;\n value: datum;\n label: string;\n count: number;\n color: string;\n selected: boolean;\n }[];\n };\n brushExtent: Extent | null;\n pointStyle: ScatterPointStyle;\n points: ScatterPoint[];\n exclusions: {\n sourceId: IdType;\n reason: \"invalid-x\" | \"invalid-y\" | \"nonfinite-position\";\n }[];\n populations: { all: number; chart: number; filtered: number; facet: number };\n rowSets: {\n all: IdType[];\n chart: IdType[];\n filtered: IdType[];\n facet: IdType[];\n };\n xField: string;\n yField: string;\n xDisplay: string;\n yDisplay: string;\n fieldSettings: FieldSettingsMap;\n}\n\nfunction numeric(value: datum) {\n return finiteNumber(value) ?? NaN;\n}\n\nfunction bounds(ids: IdType[], data: Record<IdType, datum>): [number, number] {\n let min = Infinity;\n let max = -Infinity;\n for (const id of ids) {\n const value = numeric(data[id]);\n if (!Number.isFinite(value)) {\n continue;\n }\n min = Math.min(min, value);\n max = Math.max(max, value);\n }\n return min === Infinity ? [0, 1] : [min, max];\n}\n\nfunction fieldLabel(field: string, settings: FieldSettingsMap) {\n return field === \"__ID\"\n ? \"Row sequence\"\n : getFieldLabel(field, settings[field]);\n}\n\nfunction display(field: string, value: number, settings: FieldSettingsMap) {\n return hasFieldDisplayFormat(settings[field])\n ? formatFieldValue(field, value, settings[field])\n : String(value);\n}\n\nexport function planScatter(\n settings: ScatterPlotSettings,\n snapshot: ScatterSnapshot,\n width: number,\n height: number\n): ScatterPlan {\n const xLabel =\n settings.xAxisLabel || fieldLabel(settings.xField, snapshot.fieldSettings);\n const yLabel =\n settings.yAxisLabel || fieldLabel(settings.yField, snapshot.fieldSettings);\n const [xMin, xMax] = bounds(snapshot.allIds, snapshot.xData);\n const [yMin, yMax] = bounds(snapshot.allIds, snapshot.yData);\n const xBuffer = (xMax - xMin) * 0.1;\n const yBuffer = (yMax - yMin) * 0.1;\n const yDomain: [number, number] = [yMin - yBuffer, yMax + yBuffer];\n const { margin, policy: marginPolicy } = planChartMargin({\n margin: settings.margin,\n width,\n yDomain,\n hasXLabel: Boolean(xLabel),\n hasYLabel: Boolean(yLabel),\n });\n const plotWidth = width - margin.left - margin.right;\n const plotHeight = height - margin.top - margin.bottom;\n const xDomain: [number, number] = [\n settings.xAxis.scaleType === \"symlog\" ? xMin : xMin - xBuffer,\n xMax + xBuffer,\n ];\n const actualYDomain: [number, number] =\n settings.yAxis.scaleType === \"symlog\" ? [yMin, yDomain[1]] : yDomain;\n const xScale = numericScale(settings.xAxis)\n .domain(xDomain)\n .range([0, plotWidth]);\n const yScale = numericScale(settings.yAxis)\n .domain(actualYDomain)\n .range([plotHeight, 0]);\n const xType = settings.xAxis.scaleType === \"symlog\" ? \"symlog\" : \"linear\";\n const yType = settings.yAxis.scaleType === \"symlog\" ? \"symlog\" : \"linear\";\n const facetSet = new Set(snapshot.facetIds);\n // Preserve the current helper's rule: an empty facet list means unrestricted.\n const ids = snapshot.facetIds?.length\n ? snapshot.chartIds.filter((id) => facetSet.has(id))\n : snapshot.chartIds;\n const resolveColor = snapshot.colorScale\n ? makeColorScale(snapshot.colorScale)\n : null;\n const getColor = (value: datum) => {\n if (!settings.colorScaleId) {\n return \"#3479a8\";\n }\n if (!resolveColor) {\n return \"#000000\";\n }\n try {\n return resolveColor(value);\n } catch {\n return \"#000000\";\n }\n };\n const filteredSet = new Set(snapshot.filteredIds);\n const pointStyle: ScatterPointStyle = {\n radius: {\n value: settings.pointSize ?? 3,\n source: settings.pointSize == null ? \"scatter-default\" : \"chart-setting\",\n },\n opacity: {\n value: settings.pointOpacity ?? 0.7,\n source:\n settings.pointOpacity == null ? \"scatter-default\" : \"chart-setting\",\n },\n dimmedOpacity: { value: 0.15, source: \"own-filter-rule\" },\n };\n const points = planScatterPoints({\n settings,\n style: pointStyle,\n ids,\n xData: snapshot.xData,\n yData: snapshot.yData,\n colorData: snapshot.colorData,\n xScale,\n yScale,\n getColor,\n }).map((point) => ({\n ...point,\n passesAllFilters: filteredSet.has(point.sourceId),\n }));\n const included = new Set(points.map((point) => point.sourceId));\n\n const format = (field: string) => (value: string | number) =>\n formatFieldValue(field, value, snapshot.fieldSettings[field]);\n const labelSource = (local: string) =>\n local ? (\"chart-setting\" as const) : (\"field-label\" as const);\n const axes = planAxes({\n plotWidth,\n plotHeight,\n margin,\n marginPolicy,\n x: {\n scale: xScale,\n scaleType: xType,\n field: settings.xField,\n fieldLabel: xLabel,\n density: settings.xGridLines,\n grid: settings.xAxis.grid,\n format: format(settings.xField),\n label: [xLabel, xType === \"symlog\" && \"symlog\"].filter(Boolean).join(\" · \"),\n labelSource: labelSource(settings.xAxisLabel),\n domainSource: {\n population: \"all source rows\",\n rows: snapshot.allIds.length,\n bounds: [xMin, xMax],\n padding: xType === \"symlog\" ? \"10% above\" : \"10% on each side\",\n },\n },\n y: {\n scale: yScale,\n scaleType: yType,\n field: settings.yField,\n fieldLabel: yLabel,\n density: settings.yGridLines,\n grid: settings.yAxis.grid,\n format: format(settings.yField),\n label: [yLabel, yType === \"symlog\" && \"symlog\"].filter(Boolean).join(\" · \"),\n labelSource: labelSource(settings.yAxisLabel),\n rule: false,\n domainSource: {\n population: \"all source rows\",\n rows: snapshot.allIds.length,\n bounds: [yMin, yMax],\n padding: yType === \"symlog\" ? \"10% above\" : \"10% on each side\",\n },\n },\n });\n\n const xFilter = getRangeFilterForField(settings.filters, settings.xField);\n const yFilter = getRangeFilterForField(settings.filters, settings.yField);\n const round = (value: number) => Math.round(value * 10000) / 10000;\n const brushExtent: Extent | null =\n xFilter?.min !== undefined &&\n xFilter.max !== undefined &&\n yFilter?.min !== undefined &&\n yFilter.max !== undefined\n ? [\n [round(xScale(xFilter.min)), round(yScale(yFilter.max))],\n [round(xScale(xFilter.max)), round(yScale(yFilter.min))],\n ]\n : null;\n const title = getChartTitle(settings, (field) =>\n fieldLabel(field, snapshot.fieldSettings)\n );\n const calculatedBadges: ScatterPlan[\"calculatedBadges\"] = [];\n if (snapshot.calculatedFields?.includes(settings.xField)) {\n calculatedBadges.push({\n id: \"calculation:x\",\n field: settings.xField,\n x: margin.left + plotWidth / 2 + Math.min(90, xLabel.length * 3.2) + 8,\n y: margin.top + plotHeight + Math.max(30, margin.bottom - 10) - 12,\n rotation: 0,\n });\n }\n if (snapshot.calculatedFields?.includes(settings.yField)) {\n calculatedBadges.push({\n id: \"calculation:y\",\n field: settings.yField,\n x: 0,\n y: margin.top + plotHeight / 2 - Math.min(90, yLabel.length * 3.2) - 30,\n rotation: -90,\n });\n }\n let legend: ScatterPlan[\"legend\"];\n if (settings.colorField && settings.colorScaleId && snapshot.colorScale) {\n const scale = snapshot.colorScale;\n if (scale.type === \"categorical\") {\n const values = new Map<string, datum>();\n for (const id of snapshot.allIds) {\n const value = categoryValue(snapshot.colorData[id]);\n values.set(categoryKey(value), value);\n }\n const counts = new Map<string, number>();\n for (const id of snapshot.chartIds) {\n const key = categoryKey(snapshot.colorData[id]);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n const selected = settings.filters\n .filter(\n (filter): filter is ValueFilter =>\n filter.type === \"value\" && filter.field === settings.colorField\n )\n .flatMap((filter) => filter.values);\n legend = {\n field: settings.colorField,\n scaleId: scale.id,\n type: \"categorical\",\n palette: [...scale.palette],\n items: [...values].map(([id, value]) => ({\n id,\n value,\n label: hasFieldDisplayFormat(\n snapshot.fieldSettings[settings.colorField!]\n )\n ? formatFieldValue(\n settings.colorField!,\n value,\n snapshot.fieldSettings[settings.colorField!]\n )\n : categoryLabel(value),\n count: counts.get(id) ?? 0,\n color: getColor(value),\n selected: categoryIncludes(selected, value),\n })),\n };\n } else {\n legend = {\n field: settings.colorField,\n scaleId: scale.id,\n type: \"numerical\",\n palette: scale.palette,\n domain: [scale.min, scale.max],\n items: [],\n };\n }\n }\n return {\n revision: snapshot.revision,\n width,\n height,\n margin,\n plotWidth,\n plotHeight,\n clipWidth: Math.max(0, plotWidth),\n clipHeight: Math.max(0, plotHeight),\n pixelRatio: snapshot.pixelRatio ?? 1,\n calculatedBadges,\n xScale: { type: xType, domain: xDomain, range: [0, plotWidth] },\n yScale: { type: yType, domain: actualYDomain, range: [plotHeight, 0] },\n title,\n description: [\n `Interactive scatter chart.`,\n settings.xAxisLabel && `Horizontal axis: ${settings.xAxisLabel}.`,\n settings.yAxisLabel && `Vertical axis: ${settings.yAxisLabel}.`,\n ]\n .filter(Boolean)\n .join(\" \"),\n axes,\n domainInputs: {\n x: [xMin, xMax],\n y: [yMin, yMax],\n buffer: 0.1,\n population: \"all\",\n },\n legend,\n brushExtent,\n pointStyle,\n points,\n exclusions: ids\n .filter((id) => !included.has(id))\n .map((sourceId) => ({\n sourceId,\n reason: !Number.isFinite(numeric(snapshot.xData[sourceId]))\n ? (\"invalid-x\" as const)\n : !Number.isFinite(numeric(snapshot.yData[sourceId]))\n ? (\"invalid-y\" as const)\n : (\"nonfinite-position\" as const),\n })),\n populations: {\n all: snapshot.allIds.length,\n chart: snapshot.chartIds.length,\n filtered: snapshot.filteredIds.length,\n facet: ids.length,\n },\n rowSets: {\n all: snapshot.allIds,\n chart: snapshot.chartIds,\n filtered: snapshot.filteredIds,\n facet: ids,\n },\n xField: settings.xField,\n yField: settings.yField,\n xDisplay: xLabel,\n yDisplay: yLabel,\n fieldSettings: snapshot.fieldSettings,\n };\n}\n\nexport function scatterPointReadout(plan: ScatterPlan, point: ScatterPoint) {\n return {\n xText: display(plan.xField, point.xValue, plan.fieldSettings),\n yText: display(plan.yField, point.yValue, plan.fieldSettings),\n };\n}\n\nexport function scatterHoverReadout(\n plan: ScatterPlan,\n snapshot: ScatterSnapshot,\n settings: ScatterPlotSettings,\n point: ScatterPoint\n) {\n const value = (field: string, item: datum) =>\n hasFieldDisplayFormat(snapshot.fieldSettings[field])\n ? formatFieldValue(field, item, snapshot.fieldSettings[field])\n : categoryLabel(item);\n return {\n ...scatterPointReadout(plan, point),\n colorText: settings.colorField\n ? value(settings.colorField, point.colorValue)\n : undefined,\n facetRowText: settings.facet.enabled\n ? value(\n settings.facet.rowVariable,\n snapshot.facetRowData?.[point.sourceId]\n )\n : undefined,\n facetColumnText:\n settings.facet.enabled && settings.facet.type === \"grid\"\n ? value(\n settings.facet.columnVariable,\n snapshot.facetColumnData?.[point.sourceId]\n )\n : undefined,\n };\n}\n\nexport function brushFilters(plan: ScatterPlan, extent: Extent) {\n const xScale = numericScale({ scaleType: plan.xScale.type })\n .domain(plan.xScale.domain)\n .range(plan.xScale.range);\n const yScale = numericScale({ scaleType: plan.yScale.type })\n .domain(plan.yScale.domain)\n .range(plan.yScale.range);\n return {\n x: [\n Math.min(xScale.invert(extent[0][0]), xScale.invert(extent[1][0])),\n Math.max(xScale.invert(extent[0][0]), xScale.invert(extent[1][0])),\n ] as [number, number],\n y: [\n Math.min(yScale.invert(extent[0][1]), yScale.invert(extent[1][1])),\n Math.max(yScale.invert(extent[0][1]), yScale.invert(extent[1][1])),\n ] as [number, number],\n };\n}\n\nexport function planScatterOverlay(\n plan: ScatterPlan,\n extent: Extent | null,\n hoveredId: string | null\n) {\n const brush: SvgPrimitive[] = [];\n if (extent) {\n const [[x0, y0], [x1, y1]] = extent;\n brush.push({\n kind: \"rect\",\n id: \"brush\",\n x: x0,\n y: y0,\n width: Math.max(0, x1 - x0),\n height: Math.max(0, y1 - y0),\n fill: \"var(--primary)\",\n fillOpacity: 0.09,\n stroke: \"var(--primary)\",\n strokeWidth: 1.25,\n cursor: \"move\",\n });\n for (const [i, x] of [x0, x1].entries()) {\n brush.push({\n kind: \"rect\",\n id: `brush:x:${i}`,\n x: x - 2,\n y: (y0 + y1) / 2 - 8,\n width: 4,\n height: 16,\n rx: 2,\n fill: \"var(--primary)\",\n cursor: \"ew-resize\",\n });\n }\n for (const [i, y] of [y0, y1].entries()) {\n brush.push({\n kind: \"rect\",\n id: `brush:y:${i}`,\n x: (x0 + x1) / 2 - 8,\n y: y - 2,\n width: 16,\n height: 4,\n rx: 2,\n fill: \"var(--primary)\",\n cursor: \"ns-resize\",\n });\n }\n }\n const point = plan.points.find((item) => item.id === hoveredId);\n const readout: SvgPrimitive[] = [];\n let readoutLabel: string | undefined;\n if (point) {\n const { x, y, color } = point;\n const { xText, yText } = scatterPointReadout(plan, point);\n readoutLabel = `Source row ${point.sourceId}; ${plan.xDisplay}: ${xText}; ${plan.yDisplay}: ${yText}`;\n const xWidth = xText.length * 6 + 12;\n const yWidth = yText.length * 6 + 12;\n const labelX = Math.max(\n xWidth / 2,\n Math.min(plan.plotWidth - xWidth / 2, x)\n );\n readout.push(\n {\n kind: \"line\",\n id: \"readout:x-rule\",\n x1: x,\n x2: x,\n y1: y,\n y2: plan.plotHeight + 3,\n stroke: color,\n strokeOpacity: 0.4,\n strokeWidth: 1,\n strokeDasharray: \"2 3\",\n },\n {\n kind: \"line\",\n id: \"readout:y-rule\",\n x1: x,\n x2: 0,\n y1: y,\n y2: y,\n stroke: color,\n strokeOpacity: 0.4,\n strokeWidth: 1,\n strokeDasharray: \"2 3\",\n },\n {\n kind: \"circle\",\n id: \"readout:ring\",\n cx: x,\n cy: y,\n r: point.radius + 5,\n fill: \"none\",\n stroke: \"var(--primary)\",\n strokeWidth: 2.5,\n },\n { kind: \"circle\", id: \"readout:center\", cx: x, cy: y, r: 2, fill: color },\n {\n kind: \"rect\",\n id: \"readout:x-bg\",\n x: labelX - xWidth / 2,\n y: plan.plotHeight + 5,\n width: xWidth,\n height: 20,\n fill: \"var(--card)\",\n },\n {\n kind: \"rect\",\n id: \"readout:y-bg\",\n x: -yWidth - 3,\n y: y - 10,\n width: yWidth,\n height: 20,\n fill: \"var(--card)\",\n },\n {\n kind: \"text\",\n id: \"readout:x-text\",\n x: labelX,\n y: plan.plotHeight + 18,\n text: xText,\n fill: color,\n fontSize: 10,\n fontWeight: 600,\n textAnchor: \"middle\",\n },\n {\n kind: \"text\",\n id: \"readout:y-text\",\n x: -8,\n y,\n dy: \".32em\",\n text: yText,\n fill: color,\n fontSize: 10,\n fontWeight: 600,\n textAnchor: \"end\",\n }\n );\n }\n return {\n brush,\n readout,\n readoutLabel,\n };\n}\n","import { useBrush } from \"@/hooks/useBrush\";\nimport { useId, useRef, useState } from \"react\";\nimport {\n planScatterOverlay,\n type Extent,\n type ScatterPlan,\n type SvgPrimitive,\n} from \"./scatterPlan\";\nimport { findAxisGuide } from \"../Axis/axisPlan\";\nimport { PlannedAxes, PlannedGrid } from \"../Axis/AxisLayer\";\n\nfunction Primitive({\n item,\n selected,\n}: {\n item: SvgPrimitive;\n selected: boolean;\n}) {\n if (item.kind === \"line\") {\n const { kind, id, hitStrokeWidth, ...props } = item;\n void kind;\n const hasHitTarget = hitStrokeWidth !== undefined;\n const line = (\n <line\n data-plan-id={id}\n {...props}\n style={selected ? { stroke: \"var(--primary)\" } : undefined}\n strokeOpacity={selected ? 1 : item.strokeOpacity}\n strokeWidth={selected ? 2.5 : item.strokeWidth}\n pointerEvents={hasHitTarget ? \"none\" : undefined}\n />\n );\n return hasHitTarget ? (\n <g>\n {line}\n <line\n data-plan-id={id}\n x1={item.x1}\n y1={item.y1}\n x2={item.x2}\n y2={item.y2}\n stroke=\"transparent\"\n strokeWidth={hitStrokeWidth}\n pointerEvents=\"stroke\"\n />\n </g>\n ) : (\n line\n );\n }\n if (item.kind === \"rect\") {\n const { kind, id, cursor, ...props } = item;\n void kind;\n return <rect data-plan-id={id} {...props} style={{ cursor }} />;\n }\n if (item.kind === \"circle\") {\n const { kind, id, ...props } = item;\n void kind;\n return <circle data-plan-id={id} {...props} />;\n }\n const { kind, id, title, text, ...props } = item;\n void kind;\n return (\n <text\n data-plan-id={id}\n {...props}\n aria-label={title}\n fill={selected ? \"var(--primary)\" : item.fill}\n textDecoration={selected ? \"underline\" : undefined}\n >\n {text}\n </text>\n );\n}\n\nfunction Primitives({\n items,\n selectedId,\n}: {\n items: SvgPrimitive[];\n selectedId?: string;\n}) {\n return items.map((item) => (\n <Primitive key={item.id} item={item} selected={item.id === selectedId} />\n ));\n}\n\nexport function ScatterSvg({\n plan,\n hoveredId,\n onBrushChange,\n onInspectPoint,\n onInspectGuide,\n onInspectOverlay,\n selectedId,\n}: {\n plan: ScatterPlan;\n hoveredId: string | null;\n onBrushChange: (extent: Extent | null) => void;\n onInspectPoint: (x: number, y: number) => boolean;\n onInspectGuide: (id: string) => void;\n onInspectOverlay: (id: string) => void;\n selectedId?: string;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const altAtDown = useRef(false);\n const [hoveredGuideId, setHoveredGuideId] = useState<string | null>(null);\n const [altHover, setAltHover] = useState(false);\n const chartId = useId();\n const brush = useBrush({\n svgRef,\n marginLeft: plan.margin.left,\n marginTop: plan.margin.top,\n innerWidth: plan.plotWidth,\n innerHeight: plan.plotHeight,\n mode: \"2d\",\n onBrushChange,\n onPlotClick: (_, event) => event.altKey || altAtDown.current,\n defaultExtent: plan.brushExtent,\n });\n const overlay = planScatterOverlay(plan, brush.extent ?? null, hoveredId);\n\n if (plan.width < 1 || plan.height < 1) {\n return null;\n }\n\n return (\n <svg\n ref={svgRef}\n width={plan.width}\n height={plan.height}\n role=\"group\"\n aria-label={plan.title}\n aria-describedby={`${chartId}-description`}\n className=\"absolute select-none\"\n style={{\n cursor:\n altHover && (hoveredId || hoveredGuideId)\n ? \"pointer\"\n : brush.getCursor(),\n touchAction: \"none\",\n }}\n tabIndex={0}\n onKeyDown={(event) => {\n const id = (event.target as Element)\n .closest(\"[data-plan-id]\")\n ?.getAttribute(\"data-plan-id\");\n if (\n event.altKey &&\n event.key === \"Enter\" &&\n id &&\n findAxisGuide(plan.axes, id)\n ) {\n event.preventDefault();\n event.stopPropagation();\n onInspectGuide(id);\n return;\n }\n if (event.key === \"Escape\") {\n event.stopPropagation();\n brush.clear();\n }\n }}\n onPointerDownCapture={(event) => {\n altAtDown.current = event.altKey;\n brush.handlePointerDown(event);\n }}\n onPointerMoveCapture={(event) => {\n brush.handlePointerMove(event);\n setAltHover(event.altKey);\n const id = (event.target as Element)\n .closest(\"[data-plan-id]\")\n ?.getAttribute(\"data-plan-id\");\n setHoveredGuideId(\n event.altKey && id && findAxisGuide(plan.axes, id) ? id : null\n );\n }}\n onPointerLeave={() => {\n setHoveredGuideId(null);\n setAltHover(false);\n }}\n onPointerUpCapture={brush.handlePointerUp}\n onPointerCancel={brush.cancel}\n onLostPointerCapture={brush.cancel}\n onClick={(event) => {\n if (!event.altKey || brush.wasDrag.current) return;\n const rect = event.currentTarget.getBoundingClientRect();\n const x = event.clientX - rect.left - plan.margin.left;\n const y = event.clientY - rect.top - plan.margin.top;\n if (\n x >= 0 &&\n x <= plan.plotWidth &&\n y >= 0 &&\n y <= plan.plotHeight &&\n onInspectPoint(x, y)\n )\n return;\n const id = (event.target as Element)\n .closest(\"[data-plan-id]\")\n ?.getAttribute(\"data-plan-id\");\n if (id && findAxisGuide(plan.axes, id)) {\n onInspectGuide(id);\n return;\n }\n if (id && overlay.brush.some((item) => item.id === id)) {\n onInspectOverlay(id);\n }\n }}\n >\n <desc id={`${chartId}-description`}>{plan.description}</desc>\n <defs>\n <clipPath id={`${chartId}-plot`}>\n <rect width={plan.clipWidth} height={plan.clipHeight} />\n </clipPath>\n </defs>\n <g transform={`translate(${plan.margin.left},${plan.margin.top})`}>\n <g clipPath={`url(#${chartId}-plot)`}>\n <PlannedGrid\n plan={plan.axes}\n interactive\n activeId={hoveredGuideId ?? selectedId}\n />\n </g>\n <g className=\"eda-brush\" clipPath={`url(#${chartId}-plot)`}>\n <Primitives items={overlay.brush} />\n </g>\n <PlannedAxes\n plan={plan.axes}\n interactive\n activeId={hoveredGuideId ?? selectedId}\n />\n <g\n className=\"eda-axis-readout\"\n role={overlay.readoutLabel ? \"img\" : undefined}\n aria-label={overlay.readoutLabel}\n pointerEvents=\"none\"\n >\n <Primitives items={overlay.readout} />\n </g>\n </g>\n </svg>\n );\n}\n","import { convertFieldValue } from \"@/lib/fieldSettings\";\nimport type { FieldProfile } from \"@/lib/fieldProfiles\";\nimport type {\n CalculationManager,\n RowCalculationTrace,\n} from \"@/lib/calculations/CalculationState\";\nimport type { datum } from \"@/types/ChartTypes\";\nimport type { ScatterPlotSettings } from \"./definition\";\nimport {\n planScatterOverlay,\n scatterHoverReadout,\n type ScatterPlan,\n type ScatterSnapshot,\n type SvgPrimitive,\n} from \"./scatterPlan\";\nimport {\n guideTargets,\n resolveGuideTrace,\n type GuideTrace,\n type TraceTarget,\n} from \"../trace/traceTypes\";\n\nexport interface FieldTrace {\n field: string;\n raw?: datum;\n prepared: datum;\n conversion?: { type: string; error?: string };\n calculation?: RowCalculationTrace;\n sources: {\n field: string;\n raw: datum;\n prepared: datum;\n conversion?: { type: string; error?: string };\n }[];\n}\n\nexport type ScatterTrace =\n | {\n kind: \"point\";\n id: string;\n revision: string;\n plan: ScatterPlan;\n sourceId: number;\n x: FieldTrace & { pixel: number };\n y: FieldTrace & { pixel: number };\n color?: FieldTrace & { mapped: string; rendered: string };\n facet?: {\n type: \"grid\" | \"wrap\";\n row: FieldTrace;\n column?: FieldTrace;\n sourceRows: number;\n chartRows: number;\n };\n radius: number;\n opacity: number;\n passesOwnFilter: boolean;\n passesAllFilters: boolean;\n hover: ReturnType<typeof scatterHoverReadout>;\n }\n | {\n kind: \"badge\";\n id: string;\n revision: string;\n badge: ScatterPlan[\"calculatedBadges\"][number];\n }\n | {\n kind: \"excluded\";\n id: string;\n revision: string;\n sourceId: number;\n reason: string;\n x: FieldTrace;\n y: FieldTrace;\n }\n | {\n kind: \"overlay\";\n id: string;\n revision: string;\n primitive: SvgPrimitive;\n extent: ScatterPlan[\"brushExtent\"];\n filters: ScatterPlotSettings[\"filters\"];\n };\n\nfunction sourceFields(trace: RowCalculationTrace): string[] {\n const calculated = new Set(trace.dependencies.map((item) => item.field));\n return [\n ...new Set([\n ...trace.inputs\n .filter((item) => !calculated.has(item.field))\n .map((item) => item.field),\n ...trace.dependencies.flatMap(sourceFields),\n ]),\n ];\n}\n\nexport function resolveScatterTrace(\n selection: { kind: string; id: string },\n plan: ScatterPlan,\n snapshot: ScatterSnapshot,\n settings: ScatterPlotSettings,\n rawRows: Record<string, datum>[],\n preparedRows: Record<string, datum>[],\n profiles: FieldProfile[],\n manager: CalculationManager<Record<string, datum>>\n): ScatterTrace | GuideTrace | undefined {\n if (selection.kind === \"guide\")\n return resolveGuideTrace(plan.axes, selection.id, plan.revision);\n if (selection.kind === \"badge\") {\n const badge = plan.calculatedBadges.find(\n (item) => item.id === selection.id\n );\n if (!badge) return undefined;\n return { kind: \"badge\", id: badge.id, revision: plan.revision, badge };\n }\n if (selection.kind === \"overlay\") {\n const primitive = planScatterOverlay(\n plan,\n plan.brushExtent,\n null\n ).brush.find((item) => item.id === selection.id);\n if (!primitive) return undefined;\n return {\n kind: \"overlay\",\n id: selection.id,\n revision: plan.revision,\n primitive,\n extent: plan.brushExtent,\n filters: settings.filters.filter(\n (filter) =>\n filter.type === \"range\" &&\n (filter.field === settings.xField || filter.field === settings.yField)\n ),\n };\n }\n const conversionFor = (field: string, raw: datum) => {\n const fieldSetting = snapshot.fieldSettings[field] ?? {};\n const applied = Boolean(\n fieldSetting.type ||\n fieldSetting.datePreset ||\n fieldSetting.nullTokens?.length\n );\n const type =\n fieldSetting.type ??\n profiles.find((item) => item.name === field)?.dataType;\n return applied && type\n ? { type, error: convertFieldValue(raw, type, fieldSetting).error }\n : undefined;\n };\n const fieldTrace = (\n field: string,\n value: datum,\n sourceId: number\n ): FieldTrace => {\n const raw = rawRows[sourceId]?.[field];\n const calculation = manager.traceRow(field, sourceId);\n const conversion = calculation ? undefined : conversionFor(field, raw);\n const sources = calculation\n ? sourceFields(calculation).map((name) => ({\n field: name,\n raw: rawRows[sourceId]?.[name],\n prepared: preparedRows[sourceId]?.[name],\n conversion: conversionFor(name, rawRows[sourceId]?.[name]),\n }))\n : [];\n return { field, raw, prepared: value, conversion, calculation, sources };\n };\n\n if (selection.kind === \"point\") {\n const point = plan.points.find((item) => item.id === selection.id);\n if (!point) return undefined;\n return {\n kind: \"point\",\n id: point.id,\n revision: plan.revision,\n plan,\n sourceId: point.sourceId,\n x: {\n ...fieldTrace(settings.xField, point.xValue, point.sourceId),\n pixel: point.x,\n },\n y: {\n ...fieldTrace(settings.yField, point.yValue, point.sourceId),\n pixel: point.y,\n },\n color: settings.colorField\n ? {\n ...fieldTrace(\n settings.colorField,\n point.colorValue,\n point.sourceId\n ),\n mapped: point.mappedColor,\n rendered: point.color,\n }\n : undefined,\n facet:\n settings.facet.enabled && snapshot.facetIds?.length\n ? {\n type: settings.facet.type,\n row: fieldTrace(\n settings.facet.rowVariable,\n snapshot.facetRowData?.[point.sourceId],\n point.sourceId\n ),\n column:\n settings.facet.type === \"grid\"\n ? fieldTrace(\n settings.facet.columnVariable,\n snapshot.facetColumnData?.[point.sourceId],\n point.sourceId\n )\n : undefined,\n sourceRows: snapshot.facetIds.length,\n chartRows: plan.populations.facet,\n }\n : undefined,\n radius: point.radius,\n opacity: point.opacity,\n passesOwnFilter: point.passesOwnFilter,\n passesAllFilters: point.passesAllFilters,\n hover: scatterHoverReadout(plan, snapshot, settings, point),\n };\n }\n if (selection.kind === \"excluded\") {\n const sourceId = Number(selection.id);\n const exclusion = plan.exclusions.find(\n (item) => item.sourceId === sourceId\n );\n if (!exclusion) return undefined;\n return {\n kind: \"excluded\",\n id: selection.id,\n revision: plan.revision,\n sourceId,\n reason: exclusion.reason,\n x: fieldTrace(settings.xField, snapshot.xData[sourceId], sourceId),\n y: fieldTrace(settings.yField, snapshot.yData[sourceId], sourceId),\n };\n }\n return undefined;\n}\n\nexport function scatterTraceTargets(plan: ScatterPlan): TraceTarget[] {\n return [\n ...guideTargets(plan.axes),\n ...planScatterOverlay(plan, plan.brushExtent, null).brush.map(({ id }) => ({\n kind: \"overlay\",\n id,\n label: id,\n })),\n ...plan.calculatedBadges.map((badge) => ({\n kind: \"badge\",\n id: badge.id,\n label: `Calculated: ${badge.field}`,\n })),\n ];\n}\n\n/** The point that draws a source row, or its invalid-value exclusion. */\nexport function findScatterTraceRow(plan: ScatterPlan, id: number) {\n const point = plan.points.find((item) => item.sourceId === id);\n if (point) return { kind: \"point\", id: point.id };\n return plan.exclusions.some((item) => item.sourceId === id)\n ? { kind: \"excluded\", id: String(id) }\n : undefined;\n}\n","import { useDataLayer } from \"@/providers/DataLayerProvider\";\nimport type { BaseChartProps } from \"@/types/ChartTypes\";\nimport {\n useCallback,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ScatterPlotSettings } from \"./definition\";\nimport { CalculatedFieldBadge } from \"@/components/calculations/CalculatedFieldBadge\";\nimport { ScatterSvg } from \"./ScatterSvg\";\nimport {\n findScatterTraceRow,\n resolveScatterTrace,\n scatterTraceTargets,\n} from \"./scatterTrace\";\nimport {\n useChartTrace,\n useChartTraceApi,\n useTraceSource,\n} from \"../trace/ChartTraceScope\";\nimport type { TraceSource } from \"../trace/traceTypes\";\nimport {\n brushFilters,\n planScatter,\n scatterHoverReadout,\n type Extent,\n type ScatterSnapshot,\n} from \"./scatterPlan\";\n\ninterface ScatterPlotProps extends BaseChartProps {\n settings: ScatterPlotSettings;\n}\n\nexport function ScatterPlot({\n settings,\n width,\n height,\n facetIds,\n}: ScatterPlotProps) {\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n const trace = useChartTrace();\n const traceApi = useChartTraceApi();\n const owner = useId();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const data = useDataLayer((state) => state.data);\n const rawData = useDataLayer((state) => state.rawData);\n const profiles = useDataLayer((state) => state.fieldProfiles);\n const manager = useDataLayer((state) => state.calculationManager);\n const calculations = useDataLayer((state) => state.calculations);\n const nonce = useDataLayer((state) => state.nonce);\n const chartItems = useDataLayer((state) => state.liveItems[settings.id]);\n const crossfilter = useDataLayer((state) => state.crossfilterWrapper);\n const getColumnData = useDataLayer((state) => state.getColumnData);\n const fieldSettings = useDataLayer((state) => state.fieldSettings);\n const colorScale = useDataLayer((state) =>\n state.colorScales.find((item) => item.id === settings.colorScaleId)\n );\n const updateChart = useDataLayer((state) => state.updateChart);\n const allIds = useMemo(() => data.map((row) => row.__ID), [data]);\n\n const snapshot = useMemo((): ScatterSnapshot => {\n // Chart and global filter populations come from the same store update.\n const chartIds =\n chartItems?.items\n .filter((item) => item.value > 0)\n .map((item) => item.key) ?? [];\n // The data layer replaces cached columns after edits; old maps stay stable.\n const column = (field: string | undefined) =>\n field ? getColumnData(field) : {};\n return {\n revision: `${nonce}:${chartItems?.nonce ?? 0}`,\n allIds,\n chartIds,\n filteredIds: crossfilter.getFilteredRowIds(),\n facetIds: facetIds?.slice(),\n xData: column(settings.xField),\n yData: column(settings.yField),\n colorData: column(settings.colorField),\n facetRowData: settings.facet.enabled\n ? column(settings.facet.rowVariable)\n : undefined,\n facetColumnData:\n settings.facet.enabled && settings.facet.type === \"grid\"\n ? column(settings.facet.columnVariable)\n : undefined,\n fieldSettings: Object.fromEntries(\n Object.entries(fieldSettings).map(([field, value]) => [\n field,\n { ...value },\n ])\n ),\n colorScale:\n colorScale?.type === \"categorical\"\n ? {\n ...colorScale,\n mapping: new Map(colorScale.mapping),\n palette: [...colorScale.palette],\n }\n : colorScale && { ...colorScale },\n calculatedFields: calculations.map((calc) => calc.resultColumnName),\n pixelRatio:\n typeof window === \"undefined\" ? 1 : window.devicePixelRatio || 1,\n };\n }, [\n allIds,\n chartItems,\n crossfilter,\n getColumnData,\n fieldSettings,\n colorScale,\n calculations,\n nonce,\n settings.xField,\n settings.yField,\n settings.colorField,\n settings.facet,\n facetIds,\n ]);\n\n const plan = useMemo(\n () => planScatter(settings, snapshot, width, height),\n [settings, snapshot, width, height]\n );\n const source = useMemo(\n (): TraceSource => ({\n role: \"chart\",\n revision: plan.revision,\n resolve: (kind, id) =>\n resolveScatterTrace(\n { kind, id },\n plan,\n snapshot,\n settings,\n rawData,\n data,\n profiles,\n manager\n ),\n findRow: (id) => findScatterTraceRow(plan, id),\n targets: () => scatterTraceTargets(plan),\n legendItems:\n plan.legend?.type === \"categorical\" ? plan.legend.items : undefined,\n }),\n [plan, snapshot, settings, rawData, data, profiles, manager]\n );\n useTraceSource(owner, source);\n const choose = (kind: string, id: string) =>\n traceApi?.inspect(owner, kind, id);\n const activeSelection =\n trace?.selection?.owner === owner ? trace.selection : null;\n const pointAt = (x: number, y: number) => {\n let nearest: (typeof plan.points)[number] | undefined;\n let distance = 100;\n for (const point of plan.points) {\n const dx = point.x - x;\n const dy = point.y - y;\n const squared = dx * dx + dy * dy;\n if (squared < distance) {\n nearest = point;\n distance = squared;\n }\n }\n return nearest;\n };\n const hoveredPoint = plan.points.find((point) => point.id === hoveredId);\n const hoveredText =\n hoveredPoint && scatterHoverReadout(plan, snapshot, settings, hoveredPoint);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) {\n return;\n }\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return;\n }\n const dpr = plan.pixelRatio;\n canvas.width = width * dpr;\n canvas.height = height * dpr;\n ctx.scale(dpr, dpr);\n ctx.clearRect(0, 0, width, height);\n ctx.translate(plan.margin.left, plan.margin.top);\n ctx.beginPath();\n ctx.rect(0, 0, plan.plotWidth, plan.plotHeight);\n ctx.clip();\n for (const point of plan.points) {\n ctx.fillStyle = point.color;\n ctx.globalAlpha = point.opacity;\n ctx.beginPath();\n ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2);\n ctx.fill();\n }\n }, [plan, width, height]);\n\n const handleBrushChange = useCallback(\n (extent: Extent | null) => {\n const filters = settings.filters.filter(\n (filter) =>\n filter.field !== settings.xField && filter.field !== settings.yField\n );\n if (extent) {\n const next = brushFilters(plan, extent);\n filters.push({\n type: \"range\",\n field: settings.xField,\n min: next.x[0],\n max: next.x[1],\n });\n filters.push({\n type: \"range\",\n field: settings.yField,\n min: next.y[0],\n max: next.y[1],\n });\n }\n updateChart(settings.id, { filters });\n },\n [plan, settings, updateChart]\n );\n\n return (\n <div\n style={{ width, height }}\n className=\"relative\"\n onPointerLeave={() => setHoveredId(null)}\n onPointerDownCapture={() => setHoveredId(null)}\n onKeyDownCapture={(event) => {\n if (event.key === \"Escape\") {\n setHoveredId(null);\n }\n }}\n onPointerMove={(event) => {\n if (event.buttons) {\n return;\n }\n const bounds = event.currentTarget.getBoundingClientRect();\n const px = event.clientX - bounds.left - plan.margin.left;\n const py = event.clientY - bounds.top - plan.margin.top;\n if (px < 0 || px > plan.plotWidth || py < 0 || py > plan.plotHeight) {\n setHoveredId(null);\n return;\n }\n // ponytail: linear hit testing; use a spatial index if large point clouds need hover.\n setHoveredId(pointAt(px, py)?.id ?? null);\n }}\n >\n {plan.populations.facet > 0 ? (\n <>\n <canvas\n ref={canvasRef}\n className=\"absolute inset-0 pointer-events-none\"\n style={{ width, height }}\n />\n <ScatterSvg\n plan={plan}\n hoveredId={hoveredId}\n onBrushChange={handleBrushChange}\n onInspectPoint={(x, y) => {\n const point = pointAt(x, y);\n if (!point) return false;\n return Boolean(choose(\"point\", point.id));\n }}\n onInspectGuide={(id) => choose(\"guide\", id)}\n onInspectOverlay={(id) => choose(\"overlay\", id)}\n selectedId={\n activeSelection?.kind === \"guide\" ? activeSelection.id : undefined\n }\n />\n {plan.calculatedBadges.map((badge) => (\n <span\n key={badge.id}\n className={`eda-scatter-axis-calc ${badge.rotation ? \"eda-scatter-axis-calc-y\" : \"\"}`}\n style={{ left: badge.x, top: badge.y }}\n onClickCapture={(event) => {\n if (!event.altKey) return;\n event.stopPropagation();\n choose(\"badge\", badge.id);\n }}\n >\n <CalculatedFieldBadge\n field={badge.field}\n hoverOpen={false}\n side={badge.rotation ? \"right\" : \"top\"}\n />\n </span>\n ))}\n {hoveredPoint && (\n <div\n className=\"pointer-events-none absolute left-2 top-2 max-w-[min(16rem,70%)] rounded border border-border bg-card/95 px-2 py-1 text-xs text-card-foreground shadow-sm\"\n role=\"status\"\n >\n <div>\n {plan.xDisplay}: {hoveredText?.xText}\n </div>\n <div>\n {plan.yDisplay}: {hoveredText?.yText}\n </div>\n {settings.colorField && (\n <div>\n Color · {settings.colorField}: {hoveredText?.colorText}\n </div>\n )}\n {settings.facet.enabled && (\n <div>\n Facet {settings.facet.rowVariable}:{\" \"}\n {hoveredText?.facetRowText}\n {settings.facet.type === \"grid\" &&\n ` · ${settings.facet.columnVariable}: ${hoveredText?.facetColumnText}`}\n </div>\n )}\n </div>\n )}\n </>\n ) : (\n <div className=\"flex items-center justify-center h-full text-muted-foreground\">\n No data available\n </div>\n )}\n </div>\n );\n}\n","import { BaseChartSettings, ChartDefinition, datum } from \"@/types/ChartTypes\";\nimport { DEFAULT_CHART_SETTINGS } from \"@/utils/defaultSettings\";\nimport { ScatterChart } from \"lucide-react\";\n\nimport { ScatterPlotSettingsPanel } from \"./ScatterPlotSettingsPanel\";\nimport { ScatterPlot } from \"./ScatterPlot\";\nimport { IdType } from \"@/providers/DataLayerProvider\";\nimport { applyFilter } from \"@/hooks/applyFilter\";\nimport { Filter } from \"@/types/FilterTypes\";\n\nexport interface ScatterPlotSettings extends BaseChartSettings {\n type: \"scatter\";\n pointSize?: number;\n pointOpacity?: number;\n xField: string;\n yField: string;\n filters: Filter[];\n}\n\nexport const scatterPlotDefinition: ChartDefinition<ScatterPlotSettings> = {\n type: \"scatter\",\n name: \"Scatter Plot\",\n description: \"Display data as points in a 2D space\",\n icon: ScatterChart,\n\n component: ScatterPlot,\n settingsPanel: ScatterPlotSettingsPanel,\n\n createDefaultSettings: (layout, field) => ({\n ...DEFAULT_CHART_SETTINGS,\n id: crypto.randomUUID(),\n type: \"scatter\",\n title: \"Scatter Plot\",\n layout,\n margin: { top: 20, right: 20, bottom: 20, left: 20 },\n xField: \"__ID\",\n yField: field ?? \"\",\n filters: [],\n }),\n\n validateSettings: (settings) => {\n return !!settings.xField && !!settings.yField;\n },\n\n getFilterFunction: (\n settings: ScatterPlotSettings,\n fieldGetter: (name: string) => Record<IdType, datum>\n ) => {\n const filters = settings.filters.map((filter) => ({\n filter,\n values: fieldGetter(filter.field),\n }));\n return (id: IdType) =>\n filters.every(({ filter, values }) => applyFilter(values[id], filter));\n },\n};\n"]}