minerva-design 1.2.0 → 1.3.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 (256) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/charts/canvas.d.cts +4 -1
  3. package/dist/charts/canvas.d.ts +4 -1
  4. package/dist/charts/core.cjs +1 -1
  5. package/dist/charts/core.d.cts +5 -2
  6. package/dist/charts/core.d.ts +5 -2
  7. package/dist/charts/core.js +6 -4
  8. package/dist/charts/engine/canvas.cjs +1 -1
  9. package/dist/charts/engine/canvas.cjs.map +1 -1
  10. package/dist/charts/engine/canvas.js +65 -53
  11. package/dist/charts/engine/canvas.js.map +1 -1
  12. package/dist/charts/engine/chart.cjs +1 -2
  13. package/dist/charts/engine/chart.cjs.map +1 -1
  14. package/dist/charts/engine/chart.js +342 -323
  15. package/dist/charts/engine/chart.js.map +1 -1
  16. package/dist/charts/engine/color.cjs +1 -1
  17. package/dist/charts/engine/color.cjs.map +1 -1
  18. package/dist/charts/engine/color.d.cts +17 -0
  19. package/dist/charts/engine/color.d.ts +17 -0
  20. package/dist/charts/engine/color.js +27 -3
  21. package/dist/charts/engine/color.js.map +1 -1
  22. package/dist/charts/engine/controller.cjs +2 -2
  23. package/dist/charts/engine/controller.cjs.map +1 -1
  24. package/dist/charts/engine/controller.d.cts +6 -0
  25. package/dist/charts/engine/controller.d.ts +6 -0
  26. package/dist/charts/engine/controller.js +317 -253
  27. package/dist/charts/engine/controller.js.map +1 -1
  28. package/dist/charts/engine/curve.cjs +2 -0
  29. package/dist/charts/engine/curve.cjs.map +1 -0
  30. package/dist/charts/engine/curve.d.cts +15 -0
  31. package/dist/charts/engine/curve.d.ts +15 -0
  32. package/dist/charts/engine/curve.js +56 -0
  33. package/dist/charts/engine/curve.js.map +1 -0
  34. package/dist/charts/engine/data.cjs +1 -1
  35. package/dist/charts/engine/data.cjs.map +1 -1
  36. package/dist/charts/engine/data.d.cts +15 -2
  37. package/dist/charts/engine/data.d.ts +15 -2
  38. package/dist/charts/engine/data.js +98 -38
  39. package/dist/charts/engine/data.js.map +1 -1
  40. package/dist/charts/engine/dom.cjs +1 -1
  41. package/dist/charts/engine/dom.cjs.map +1 -1
  42. package/dist/charts/engine/dom.d.cts +5 -3
  43. package/dist/charts/engine/dom.d.ts +5 -3
  44. package/dist/charts/engine/dom.js +27 -22
  45. package/dist/charts/engine/dom.js.map +1 -1
  46. package/dist/charts/engine/items.cjs +1 -1
  47. package/dist/charts/engine/items.cjs.map +1 -1
  48. package/dist/charts/engine/items.js +132 -61
  49. package/dist/charts/engine/items.js.map +1 -1
  50. package/dist/charts/engine/model.cjs +1 -1
  51. package/dist/charts/engine/model.cjs.map +1 -1
  52. package/dist/charts/engine/model.d.cts +30 -3
  53. package/dist/charts/engine/model.d.ts +30 -3
  54. package/dist/charts/engine/model.js +225 -108
  55. package/dist/charts/engine/model.js.map +1 -1
  56. package/dist/charts/engine/overlay.cjs +1 -1
  57. package/dist/charts/engine/overlay.cjs.map +1 -1
  58. package/dist/charts/engine/overlay.d.cts +2 -0
  59. package/dist/charts/engine/overlay.d.ts +2 -0
  60. package/dist/charts/engine/overlay.js +16 -16
  61. package/dist/charts/engine/overlay.js.map +1 -1
  62. package/dist/charts/engine/presets.cjs +2 -2
  63. package/dist/charts/engine/presets.cjs.map +1 -1
  64. package/dist/charts/engine/presets.d.cts +71 -5
  65. package/dist/charts/engine/presets.d.ts +71 -5
  66. package/dist/charts/engine/presets.js +120 -33
  67. package/dist/charts/engine/presets.js.map +1 -1
  68. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  69. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  70. package/dist/charts/engine/renderers/canvas2d.js +149 -111
  71. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  72. package/dist/charts/engine/renderers/range.cjs +1 -1
  73. package/dist/charts/engine/renderers/range.cjs.map +1 -1
  74. package/dist/charts/engine/renderers/range.js +4 -4
  75. package/dist/charts/engine/renderers/range.js.map +1 -1
  76. package/dist/charts/engine/renderers/shaders.cjs +37 -19
  77. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  78. package/dist/charts/engine/renderers/shaders.d.cts +2 -2
  79. package/dist/charts/engine/renderers/shaders.d.ts +2 -2
  80. package/dist/charts/engine/renderers/shaders.js +37 -19
  81. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  82. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  83. package/dist/charts/engine/renderers/types.d.cts +11 -4
  84. package/dist/charts/engine/renderers/types.d.ts +11 -4
  85. package/dist/charts/engine/renderers/types.js.map +1 -1
  86. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  87. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  88. package/dist/charts/engine/renderers/webgl2.js +33 -12
  89. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  90. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  91. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  92. package/dist/charts/engine/renderers/webgpu.js +18 -15
  93. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  94. package/dist/charts/engine/scene.cjs +1 -1
  95. package/dist/charts/engine/scene.cjs.map +1 -1
  96. package/dist/charts/engine/scene.d.cts +19 -6
  97. package/dist/charts/engine/scene.d.ts +19 -6
  98. package/dist/charts/engine/scene.js +201 -89
  99. package/dist/charts/engine/scene.js.map +1 -1
  100. package/dist/charts/engine/shapes/canvas.cjs +2 -0
  101. package/dist/charts/engine/shapes/canvas.cjs.map +1 -0
  102. package/dist/charts/engine/shapes/canvas.d.cts +58 -0
  103. package/dist/charts/engine/shapes/canvas.d.ts +58 -0
  104. package/dist/charts/engine/shapes/canvas.js +159 -0
  105. package/dist/charts/engine/shapes/canvas.js.map +1 -0
  106. package/dist/charts/engine/shapes/chart.cjs +2 -0
  107. package/dist/charts/engine/shapes/chart.cjs.map +1 -0
  108. package/dist/charts/engine/shapes/chart.d.cts +6 -0
  109. package/dist/charts/engine/shapes/chart.d.ts +6 -0
  110. package/dist/charts/engine/shapes/chart.js +273 -0
  111. package/dist/charts/engine/shapes/chart.js.map +1 -0
  112. package/dist/charts/engine/shapes/draw.cjs +2 -0
  113. package/dist/charts/engine/shapes/draw.cjs.map +1 -0
  114. package/dist/charts/engine/shapes/draw.d.cts +20 -0
  115. package/dist/charts/engine/shapes/draw.d.ts +20 -0
  116. package/dist/charts/engine/shapes/draw.js +152 -0
  117. package/dist/charts/engine/shapes/draw.js.map +1 -0
  118. package/dist/charts/engine/shapes/funnel.cjs +2 -0
  119. package/dist/charts/engine/shapes/funnel.cjs.map +1 -0
  120. package/dist/charts/engine/shapes/funnel.d.cts +6 -0
  121. package/dist/charts/engine/shapes/funnel.d.ts +6 -0
  122. package/dist/charts/engine/shapes/funnel.js +149 -0
  123. package/dist/charts/engine/shapes/funnel.js.map +1 -0
  124. package/dist/charts/engine/shapes/gauge.cjs +2 -0
  125. package/dist/charts/engine/shapes/gauge.cjs.map +1 -0
  126. package/dist/charts/engine/shapes/gauge.d.cts +7 -0
  127. package/dist/charts/engine/shapes/gauge.d.ts +7 -0
  128. package/dist/charts/engine/shapes/gauge.js +173 -0
  129. package/dist/charts/engine/shapes/gauge.js.map +1 -0
  130. package/dist/charts/engine/shapes/hit.cjs +2 -0
  131. package/dist/charts/engine/shapes/hit.cjs.map +1 -0
  132. package/dist/charts/engine/shapes/hit.d.cts +28 -0
  133. package/dist/charts/engine/shapes/hit.d.ts +28 -0
  134. package/dist/charts/engine/shapes/hit.js +124 -0
  135. package/dist/charts/engine/shapes/hit.js.map +1 -0
  136. package/dist/charts/engine/shapes/index.d.cts +9 -0
  137. package/dist/charts/engine/shapes/index.d.ts +9 -0
  138. package/dist/charts/engine/shapes/layout.cjs +3 -0
  139. package/dist/charts/engine/shapes/layout.cjs.map +1 -0
  140. package/dist/charts/engine/shapes/layout.d.cts +88 -0
  141. package/dist/charts/engine/shapes/layout.d.ts +88 -0
  142. package/dist/charts/engine/shapes/layout.js +266 -0
  143. package/dist/charts/engine/shapes/layout.js.map +1 -0
  144. package/dist/charts/engine/shapes/pie.cjs +2 -0
  145. package/dist/charts/engine/shapes/pie.cjs.map +1 -0
  146. package/dist/charts/engine/shapes/pie.d.cts +20 -0
  147. package/dist/charts/engine/shapes/pie.d.ts +20 -0
  148. package/dist/charts/engine/shapes/pie.js +302 -0
  149. package/dist/charts/engine/shapes/pie.js.map +1 -0
  150. package/dist/charts/engine/shapes/radar.cjs +2 -0
  151. package/dist/charts/engine/shapes/radar.cjs.map +1 -0
  152. package/dist/charts/engine/shapes/radar.d.cts +8 -0
  153. package/dist/charts/engine/shapes/radar.d.ts +8 -0
  154. package/dist/charts/engine/shapes/radar.js +197 -0
  155. package/dist/charts/engine/shapes/radar.js.map +1 -0
  156. package/dist/charts/engine/shapes/runtime.cjs +2 -0
  157. package/dist/charts/engine/shapes/runtime.cjs.map +1 -0
  158. package/dist/charts/engine/shapes/runtime.d.cts +29 -0
  159. package/dist/charts/engine/shapes/runtime.d.ts +29 -0
  160. package/dist/charts/engine/shapes/runtime.js +97 -0
  161. package/dist/charts/engine/shapes/runtime.js.map +1 -0
  162. package/dist/charts/engine/shapes/scene.cjs +2 -0
  163. package/dist/charts/engine/shapes/scene.cjs.map +1 -0
  164. package/dist/charts/engine/shapes/scene.d.cts +257 -0
  165. package/dist/charts/engine/shapes/scene.d.ts +257 -0
  166. package/dist/charts/engine/shapes/scene.js +123 -0
  167. package/dist/charts/engine/shapes/scene.js.map +1 -0
  168. package/dist/charts/engine/shapes/treemap.cjs +2 -0
  169. package/dist/charts/engine/shapes/treemap.cjs.map +1 -0
  170. package/dist/charts/engine/shapes/treemap.d.cts +14 -0
  171. package/dist/charts/engine/shapes/treemap.d.ts +14 -0
  172. package/dist/charts/engine/shapes/treemap.js +213 -0
  173. package/dist/charts/engine/shapes/treemap.js.map +1 -0
  174. package/dist/charts/engine/shapes/types.d.cts +292 -0
  175. package/dist/charts/engine/shapes/types.d.ts +292 -0
  176. package/dist/charts/engine/signature.cjs +2 -0
  177. package/dist/charts/engine/signature.cjs.map +1 -0
  178. package/dist/charts/engine/signature.d.cts +9 -0
  179. package/dist/charts/engine/signature.d.ts +9 -0
  180. package/dist/charts/engine/signature.js +13 -0
  181. package/dist/charts/engine/signature.js.map +1 -0
  182. package/dist/charts/engine/theme.cjs +1 -1
  183. package/dist/charts/engine/theme.cjs.map +1 -1
  184. package/dist/charts/engine/theme.d.cts +10 -1
  185. package/dist/charts/engine/theme.d.ts +10 -1
  186. package/dist/charts/engine/theme.js +40 -16
  187. package/dist/charts/engine/theme.js.map +1 -1
  188. package/dist/charts/engine/types.d.cts +70 -9
  189. package/dist/charts/engine/types.d.ts +70 -9
  190. package/dist/charts/index.cjs +1 -1
  191. package/dist/charts/index.d.cts +4 -2
  192. package/dist/charts/index.d.ts +4 -2
  193. package/dist/charts/index.js +8 -5
  194. package/dist/charts/react/Chart.cjs +1 -1
  195. package/dist/charts/react/Chart.cjs.map +1 -1
  196. package/dist/charts/react/Chart.d.cts +8 -1
  197. package/dist/charts/react/Chart.d.ts +8 -1
  198. package/dist/charts/react/Chart.js +66 -47
  199. package/dist/charts/react/Chart.js.map +1 -1
  200. package/dist/charts/react/charts.cjs +1 -1
  201. package/dist/charts/react/charts.cjs.map +1 -1
  202. package/dist/charts/react/charts.d.cts +10 -2
  203. package/dist/charts/react/charts.d.ts +10 -2
  204. package/dist/charts/react/charts.js +174 -51
  205. package/dist/charts/react/charts.js.map +1 -1
  206. package/dist/charts/react/shapes.cjs +2 -0
  207. package/dist/charts/react/shapes.cjs.map +1 -0
  208. package/dist/charts/react/shapes.d.cts +255 -0
  209. package/dist/charts/react/shapes.d.ts +255 -0
  210. package/dist/charts/react/shapes.js +242 -0
  211. package/dist/charts/react/shapes.js.map +1 -0
  212. package/dist/charts/react/types.d.cts +73 -4
  213. package/dist/charts/react/types.d.ts +73 -4
  214. package/dist/native/charts/src/engine/color.cjs +1 -1
  215. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  216. package/dist/native/charts/src/engine/color.js +12 -3
  217. package/dist/native/charts/src/engine/color.js.map +1 -1
  218. package/dist/native/charts/src/engine/controller.cjs +2 -2
  219. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  220. package/dist/native/charts/src/engine/controller.js +334 -270
  221. package/dist/native/charts/src/engine/controller.js.map +1 -1
  222. package/dist/native/charts/src/engine/curve.cjs +2 -0
  223. package/dist/native/charts/src/engine/curve.cjs.map +1 -0
  224. package/dist/native/charts/src/engine/curve.js +56 -0
  225. package/dist/native/charts/src/engine/curve.js.map +1 -0
  226. package/dist/native/charts/src/engine/data.cjs +1 -1
  227. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  228. package/dist/native/charts/src/engine/data.js +98 -38
  229. package/dist/native/charts/src/engine/data.js.map +1 -1
  230. package/dist/native/charts/src/engine/model.cjs +1 -1
  231. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  232. package/dist/native/charts/src/engine/model.js +229 -112
  233. package/dist/native/charts/src/engine/model.js.map +1 -1
  234. package/dist/native/charts/src/engine/overlay.cjs +1 -1
  235. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  236. package/dist/native/charts/src/engine/overlay.js +16 -16
  237. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  238. package/dist/native/charts/src/engine/presets.cjs +1 -1
  239. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  240. package/dist/native/charts/src/engine/presets.js +11 -4
  241. package/dist/native/charts/src/engine/presets.js.map +1 -1
  242. package/dist/native/charts/src/engine/scene.cjs +1 -1
  243. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  244. package/dist/native/charts/src/engine/scene.js +209 -97
  245. package/dist/native/charts/src/engine/scene.js.map +1 -1
  246. package/dist/native/charts/src/engine/theme.cjs.map +1 -1
  247. package/dist/native/charts/src/engine/theme.js.map +1 -1
  248. package/dist/native/components/Chart/scene.cjs +1 -1
  249. package/dist/native/components/Chart/scene.cjs.map +1 -1
  250. package/dist/native/components/Chart/scene.js +31 -19
  251. package/dist/native/components/Chart/scene.js.map +1 -1
  252. package/dist/native/source/components/Chart/scene.tsx +54 -20
  253. package/dist/taro/index.js +1059 -579
  254. package/dist/uni/charts-canvas.js +3 -1
  255. package/dist/weapp/controls.js +966 -225
  256. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","names":["copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","createTheme","cache","hidden","listeners","model","view","zoomed","width","height","annotations","scene","sceneDirty","lastPlot","destroyed","hover","pointers","gesture","lastTap","emit","type","listener","event","invalidate","interaction","value","o","measure","text","font","size","weight","rebuild","buildModel","clampRange","base","minSpan","sameRange","resolveAnnotations","it","setHover","legendLayout","option","named","s","cfg","position","entries","x","row","w","legendHeight","tooltipLayout","tooltip","custom","result","content","tooltipContent","lines","line","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","layoutChart","labels","collectPointLabels","occupied","labelHeight","a","textBox","x0","x1","y0","y1","right","bottom","pos","pointLabels","placeLabels","t","next","crosshair","showsCrosshair","cx","hoverMarks","dotSize","rect","key","getScene","scales","changed","sameHover","hitAt","sc","hitTest","y","touch","inPlot","p","dataAt","plot","cy","setViewInternal","notify","zoomAt","zoomRange","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","createScales","shift","panRange","at","dx","dy","current","now","hit","set","visibleRange","sorted","count","range","lowerBound","scenePrimitives","maxDots","limits","maxBars","column","order","out","series","end","interleaved","n","decimateMinMax","segments","run","xv","yv","half","rects","merge","lastCol","ya","yb","col","k","dots","colors","colorOf","c","toCss","visible","px","py","cell","cols","owner"],"sources":["../../../../../../charts/src/engine/controller.ts"],"sourcesContent":["// createChartController: the platform-free chart. It owns the options, the\n// theme, the model, the visible range and the interactions (pointer / touch\n// gestures fed by the host) and describes what to draw (`getScene`). Hosts\n// only draw: createCanvasChart on any 2D context, the React Native charts\n// with views.\n\nimport { toCss } from \"./color\";\nimport { lowerBound } from \"./data\";\nimport { decimateMinMax } from \"./decimate\";\nimport { createScales, type Rect } from \"./layout\";\nimport { buildModel, type ChartModel, type DataCache } from \"./model\";\nimport {\n font,\n placeLabels,\n textBox,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport {\n collectPointLabels,\n dotSize,\n hitTest,\n hoverMarks,\n layoutChart,\n resolveAnnotations,\n sameHover,\n showsCrosshair,\n tooltipContent,\n type ChartLayout,\n type HoverMark,\n type TooltipContent,\n} from \"./scene\";\nimport { createTheme, type ChartTheme, type ChartThemeInput } from \"./theme\";\nimport type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPlotClickEvent,\n ChartRect,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\n/** Events of a controller (no renderer events: hosts draw themselves) */\nexport type ChartControllerEventMap = Omit<ChartEventMap, \"renderer\">;\n\nexport interface ChartControllerConfig {\n options: ChartOptions;\n /** Colors and fonts (Minerva variables); light defaults when omitted */\n theme?: ChartThemeInput;\n /** Width in pixels of `text` drawn with the CSS `font` */\n measureText: (text: string, font: string) => number;\n /** Called when the scene changed and must be drawn again */\n onInvalidate?: () => void;\n}\n\nexport interface ChartLegendEntry {\n id: string;\n name: string;\n /** CSS color */\n color: string;\n shape: \"dot\" | \"line\" | \"square\";\n hidden: boolean;\n /** Hit / draw box of the entry, pixels of the chart */\n box: Rect;\n}\n\nexport interface ChartLegendLayout {\n entries: ChartLegendEntry[];\n position: \"top\" | \"bottom\";\n /** Whether a tap toggles the series */\n toggle: boolean;\n /** Height taken by the legend */\n height: number;\n}\n\nexport interface ChartTooltipLayout {\n /** Default content (`text` is set instead when `tooltip.render` returns a string) */\n content: TooltipContent;\n /** Lines of a custom string tooltip */\n text: string[] | null;\n /** Box of the tooltip, pixels of the chart */\n box: Rect;\n /** Line height used to lay the box out */\n lineHeight: number;\n padding: number;\n}\n\nexport interface ChartHoverLayout {\n event: ChartHoverEvent;\n marks: HoverMark[];\n /** X pixel of the guide line (`null` when hidden) */\n crosshairX: number | null;\n tooltip: ChartTooltipLayout | null;\n}\n\n/** Everything a host draws, in CSS pixels of the chart */\nexport interface ChartScene {\n width: number;\n height: number;\n theme: ChartTheme;\n model: ChartModel;\n view: ChartView;\n layout: ChartLayout;\n annotations: ResolvedAnnotation[];\n /** Labels of the dots that found a free slot */\n pointLabels: { label: PointLabel; box: Rect }[];\n legend: ChartLegendLayout | null;\n hover: ChartHoverLayout | null;\n /** Point being dragged (`interaction.dragPoints`) */\n dragging: { x: number; y: number; color: string; size: number } | null;\n}\n\nexport interface ChartPointerOptions {\n /** Pointer id (touch identifier); 0 by default */\n id?: number;\n /** Touch input: the tooltip follows the finger and stays after a tap */\n touch?: boolean;\n}\n\nexport interface ChartController {\n setOptions(options: ChartOptions): void;\n setTheme(theme: ChartThemeInput | undefined): void;\n /** Size of the chart in CSS pixels */\n setSize(width: number, height: number): void;\n /** What to draw (`null` until the size is known) */\n getScene(): ChartScene | null;\n pointerDown(x: number, y: number, options?: ChartPointerOptions): void;\n pointerMove(x: number, y: number, options?: ChartPointerOptions): void;\n pointerUp(x: number, y: number, options?: ChartPointerOptions): void;\n pointerCancel(options?: ChartPointerOptions): void;\n /** The mouse left the chart */\n pointerLeave(): void;\n /** Zooms around a pixel (factor < 1 zooms in) */\n zoomAt(x: number, y: number, factor: number): void;\n resetZoom(): void;\n getView(): ChartView;\n setView(view: Partial<ChartView>): void;\n /** Shows / hides a series (like a legend click) */\n toggleSeries(id: string): void;\n /** Hides the tooltip */\n clearHover(): void;\n getPlotRect(): ChartRect | null;\n toPixel(x: number, y: number): { x: number; y: number } | null;\n fromPixel(x: number, y: number): { x: number; y: number } | null;\n on<K extends keyof ChartControllerEventMap>(\n type: K,\n listener: (event: ChartControllerEventMap[K]) => void,\n ): () => void;\n destroy(): void;\n}\n\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\nconst TAP_SLOP = 6;\nconst TOUCH_SLOP = 10;\nconst DOUBLE_TAP_MS = 320;\nconst LEGEND_ROW = 20;\n\ninterface PointerState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n touch: boolean;\n moved: boolean;\n}\n\nexport const createChartController = (\n config: ChartControllerConfig,\n): ChartController => {\n let options = config.options;\n let themeInput = config.theme;\n let theme = createTheme(themeInput, options.palette);\n const cache: DataCache = new Map();\n const hidden = new Set<string>();\n const listeners: {\n [K in keyof ChartControllerEventMap]?: Set<\n (event: ChartControllerEventMap[K]) => void\n >;\n } = {};\n let model: ChartModel;\n let view: ChartView = { x: [0, 1], y: [0, 1] };\n let zoomed = false;\n let width = 0;\n let height = 0;\n let annotations: ResolvedAnnotation[] = [];\n let scene: ChartScene | null = null;\n let sceneDirty = true;\n let lastPlot = \"\";\n let destroyed = false;\n\n let hover: { event: ChartHoverEvent; x: number; y: number } | null = null;\n const pointers = new Map<number, PointerState>();\n let gesture:\n | { kind: \"pan\"; view: ChartView; x: number; y: number }\n | {\n kind: \"pinch\";\n view: ChartView;\n distance: number;\n midX: number;\n midY: number;\n }\n | { kind: \"point\"; item: ChartHoverItem; x: number; y: number }\n | null = null;\n let lastTap = { time: 0, x: 0, y: 0 };\n\n const emit = <K extends keyof ChartControllerEventMap>(\n type: K,\n event: ChartControllerEventMap[K],\n ) => {\n listeners[type]?.forEach((listener) => listener(event));\n };\n\n const invalidate = () => {\n sceneDirty = true;\n if (!destroyed) config.onInvalidate?.();\n };\n\n const interaction = () => {\n const value = options.interaction;\n if (value === false) return null;\n const o = typeof value === \"object\" ? value : {};\n return {\n pan: o.pan ?? true,\n dragPoints: o.dragPoints ?? false,\n };\n };\n\n const measure = (text: string, size = theme.fontSize, weight = 400) =>\n config.measureText(text, font(theme, size, weight));\n\n const rebuild = () => {\n model = buildModel(options, theme, hidden, cache);\n const { base, minSpan } = model;\n if (!zoomed) {\n view = copyView(base);\n } else {\n view = {\n x: model.zoom.x ? clampRange(view.x, base.x, minSpan.x) : [...base.x],\n y: model.zoom.y ? clampRange(view.y, base.y, minSpan.y) : [...base.y],\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n }\n annotations = resolveAnnotations(options.annotations, theme);\n if (hover) {\n const stillThere = hover.event.items.every(\n (it) =>\n model.series[it.seriesIndex] &&\n !model.series[it.seriesIndex].hidden &&\n it.index < model.series[it.seriesIndex].cols.count,\n );\n if (!stillThere) setHover(null);\n }\n invalidate();\n };\n\n // --------------------------------------------------------------- legend\n\n const legendLayout = (): ChartLegendLayout | null => {\n const option = options.legend;\n const named = options.series.filter((s) => s.name).length;\n const show = option === undefined ? named > 1 : !!option;\n if (!show) return null;\n const cfg = typeof option === \"object\" ? option : {};\n const position = cfg.position === \"bottom\" ? \"bottom\" : \"top\";\n const entries: ChartLegendEntry[] = [];\n let x = 4;\n let row = 0;\n for (const s of model.series) {\n const w = 14 + measure(s.name, 12) + 8;\n if (x + w > width - 4 && x > 4) {\n x = 4;\n row++;\n }\n entries.push({\n id: s.id,\n name: s.name,\n color: s.colorCss,\n shape:\n s.type === \"scatter\" ? \"dot\" : s.type === \"line\" ? \"line\" : \"square\",\n hidden: s.hidden,\n box: { x, y: row * LEGEND_ROW, width: w, height: LEGEND_ROW },\n });\n x += w + 10;\n }\n const legendHeight = (row + 1) * LEGEND_ROW + 6;\n if (position === \"bottom\") {\n for (const e of entries) e.box.y += height - legendHeight + 6;\n }\n return {\n entries,\n position,\n toggle: cfg.toggle ?? true,\n height: legendHeight,\n };\n };\n\n // ---------------------------------------------------------------- scene\n\n const tooltipLayout = (\n event: ChartHoverEvent,\n anchorX: number,\n anchorY: number,\n ): ChartTooltipLayout | null => {\n const tooltip = options.tooltip;\n if (tooltip === false) return null;\n const custom = typeof tooltip === \"object\" ? tooltip.render : undefined;\n let text: string[] | null = null;\n if (custom) {\n const result = custom(event);\n if (result === null || result === \"\") return null;\n if (typeof result === \"string\") text = result.split(\"\\n\");\n }\n const content = tooltipContent(model, event, scene?.layout.yTicks ?? null);\n const lineHeight = 18;\n const padding = 8;\n let w = 0;\n let lines: number;\n if (text) {\n for (const line of text) w = Math.max(w, measure(line, 12));\n lines = text.length;\n } else {\n w = measure(content.title, 12, 600) + (content.titleColor ? 14 : 0);\n for (const row of content.rows) {\n w = Math.max(\n w,\n (row.color ? 14 : 0) +\n measure(row.name, 12) +\n 16 +\n measure(row.value, 12, 600),\n );\n }\n lines = 1 + content.rows.length;\n }\n const boxW = Math.ceil(Math.max(w, 96) + padding * 2 + 4);\n const boxH = lines * lineHeight + padding * 2;\n let left = anchorX + 14;\n if (left + boxW > width - 4) left = anchorX - 14 - boxW;\n left = Math.max(4, Math.min(left, width - boxW - 4));\n const top = Math.max(4, Math.min(anchorY - boxH / 2, height - boxH - 4));\n return {\n content,\n text,\n box: { x: left, y: top, width: boxW, height: boxH },\n lineHeight,\n padding,\n };\n };\n\n const computeScene = (): ChartScene | null => {\n if (width <= 0 || height <= 0) return null;\n const legend = legendLayout();\n const legendTop = legend?.position === \"top\" ? legend.height : 0;\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height: height - (legend?.height ?? 0),\n padding: options.padding,\n top: legendTop,\n measure: (text) => measure(text),\n });\n const labels = collectPointLabels(model, view, layout.scales);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n for (const a of annotations) {\n if (a.type === \"text\" && a.text) {\n occupied.push(\n textBox(\n a,\n layout.scales,\n measure(a.text, theme.fontSize, a.weight),\n labelHeight,\n ),\n );\n continue;\n }\n if (a.type !== \"rect\" || !a.label) continue;\n // keep the dot labels off the area titles (drawForeground does the same)\n const s = layout.scales;\n const x0 = a.x0 === undefined ? layout.plot.x : s.xToPx(a.x0);\n const x1 =\n a.x1 === undefined ? layout.plot.x + layout.plot.width : s.xToPx(a.x1);\n const y0 =\n a.y0 === undefined ? layout.plot.y + layout.plot.height : s.yToPx(a.y0);\n const y1 = a.y1 === undefined ? layout.plot.y : s.yToPx(a.y1);\n const w = measure(a.label, theme.fontSize + 1, 600);\n const left = Math.min(x0, x1);\n const right = Math.max(x0, x1);\n const top = Math.min(y0, y1);\n const bottom = Math.max(y0, y1);\n const pos = a.labelPosition;\n occupied.push({\n x: pos.endsWith(\"left\")\n ? left + 10\n : pos.endsWith(\"right\")\n ? right - 10 - w\n : (left + right - w) / 2,\n y: pos.startsWith(\"top\")\n ? top + 10\n : pos.startsWith(\"bottom\")\n ? bottom - 10 - labelHeight\n : (top + bottom - labelHeight) / 2,\n width: w,\n height: labelHeight,\n });\n }\n const pointLabels = placeLabels(\n labels,\n layout.plot,\n (t) => measure(t),\n labelHeight - 2,\n occupied,\n );\n const next: ChartScene = {\n width,\n height,\n theme,\n model,\n view: copyView(view),\n layout,\n annotations,\n pointLabels,\n legend,\n hover: null,\n dragging: null,\n };\n scene = next;\n if (hover) {\n const crosshair = showsCrosshair(model, hover.event, options.crosshair);\n const cx = layout.scales.xToPx(hover.event.items[0].x);\n next.hover = {\n event: hover.event,\n marks: hoverMarks(model, layout.scales, hover.event),\n crosshairX:\n crosshair &&\n cx >= layout.plot.x &&\n cx <= layout.plot.x + layout.plot.width\n ? cx\n : null,\n tooltip:\n gesture?.kind === \"pan\" || gesture?.kind === \"point\"\n ? null\n : tooltipLayout(hover.event, hover.x, hover.y),\n };\n }\n if (gesture?.kind === \"point\") {\n const s = model.series[gesture.item.seriesIndex];\n next.dragging = {\n x: gesture.x,\n y: gesture.y,\n color: gesture.item.color,\n size: (s ? dotSize(s, gesture.item.index) : 8) + 6,\n };\n }\n const rect = layout.plot;\n const key = `${rect.x},${rect.y},${rect.width},${rect.height}`;\n if (key !== lastPlot) {\n lastPlot = key;\n emit(\"layout\", { ...rect });\n }\n return next;\n };\n\n const getScene = () => {\n if (sceneDirty || !scene) {\n sceneDirty = false;\n scene = computeScene();\n }\n return scene;\n };\n\n // ---------------------------------------------------------- interaction\n\n const scales = () => getScene()?.layout.scales ?? null;\n\n const setHover = (\n next: { event: ChartHoverEvent; x: number; y: number } | null,\n ) => {\n const changed = !sameHover(hover?.event ?? null, next?.event ?? null);\n hover = next;\n invalidate();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n const hitAt = (x: number, y: number, touch: boolean) => {\n const sc = scales();\n return sc\n ? hitTest(model, sc, scene?.layout.xTicks ?? null, x, y, touch ? 8 : 0)\n : null;\n };\n\n const inPlot = (x: number, y: number) => {\n const p = scales()?.plot;\n return (\n !!p && x >= p.x && x <= p.x + p.width && y >= p.y && y <= p.y + p.height\n );\n };\n\n const dataAt = (x: number, y: number) => {\n const sc = scales();\n if (!sc) return null;\n const { plot } = sc;\n const cx = Math.max(plot.x, Math.min(plot.x + plot.width, x));\n const cy = Math.max(plot.y, Math.min(plot.y + plot.height, y));\n return { x: sc.pxToX(cx), y: sc.pxToY(cy) };\n };\n\n const setViewInternal = (next: ChartView, notify: boolean) => {\n const { base, minSpan } = model;\n view = {\n x: clampRange(next.x, base.x, minSpan.x),\n y: clampRange(next.y, base.y, minSpan.y),\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n if (notify) emit(\"zoom\", copyView(view));\n invalidate();\n };\n\n const zoomAt = (x: number, y: number, factor: number) => {\n const sc = scales();\n if (!sc || (!model.zoom.x && !model.zoom.y)) return;\n const next = copyView(view);\n if (model.zoom.x) next.x = zoomRange(view.x, sc.pxToX(x), factor);\n if (model.zoom.y) next.y = zoomRange(view.y, sc.pxToY(y), factor);\n setViewInternal(next, true);\n };\n\n const resetZoom = () => {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n };\n\n const legendAt = (x: number, y: number) =>\n getScene()?.legend?.entries.find(\n (e) =>\n x >= e.box.x &&\n x <= e.box.x + e.box.width &&\n y >= e.box.y &&\n y <= e.box.y + e.box.height,\n ) ?? null;\n\n const toggleSeries = (id: string) => {\n if (hidden.has(id)) hidden.delete(id);\n else hidden.add(id);\n rebuild();\n };\n\n const startPinch = () => {\n const [a, b] = [...pointers.values()];\n gesture = {\n kind: \"pinch\",\n view: copyView(view),\n distance: Math.max(1, Math.hypot(a.x - b.x, a.y - b.y)),\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2,\n };\n setHover(null);\n };\n\n const pointerDown = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const touch = !!o.touch;\n pointers.set(id, { x, y, startX: x, startY: y, touch, moved: false });\n const it = interaction();\n if (pointers.size === 2) {\n if (it && (model.zoom.x || model.zoom.y) && gesture?.kind !== \"point\")\n startPinch();\n return;\n }\n if (pointers.size > 2 || !it) {\n if (!it && touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n return;\n }\n if (it.dragPoints) {\n const item = hitAt(x, y, touch)?.items.find(\n (i) => model.series[i.seriesIndex].type === \"scatter\",\n );\n if (item) {\n gesture = { kind: \"point\", item, x, y };\n return;\n }\n }\n if (zoomed && it.pan && inPlot(x, y)) {\n gesture = { kind: \"pan\", view: copyView(view), x, y };\n return;\n }\n gesture = null;\n if (touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerMove = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n if (p) {\n p.x = x;\n p.y = y;\n if (\n !p.moved &&\n Math.hypot(x - p.startX, y - p.startY) >\n (p.touch ? TOUCH_SLOP : TAP_SLOP)\n )\n p.moved = true;\n }\n if (gesture?.kind === \"pinch\" && pointers.size >= 2) {\n const [a, b] = [...pointers.values()];\n const distance = Math.max(1, Math.hypot(a.x - b.x, a.y - b.y));\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n const sc = scales();\n if (!sc) return;\n const start = createScales(\n sc.plot,\n gesture.view,\n model.x.reverse,\n model.y.reverse,\n );\n const factor = gesture.distance / distance;\n const next = copyView(gesture.view);\n if (model.zoom.x) {\n next.x = zoomRange(gesture.view.x, start.pxToX(gesture.midX), factor);\n const shift = (midX - gesture.midX) * start.xPerPx * factor;\n next.x = panRange(next.x, model.x.reverse ? shift : -shift);\n }\n if (model.zoom.y) {\n next.y = zoomRange(gesture.view.y, start.pxToY(gesture.midY), factor);\n const shift = (midY - gesture.midY) * start.yPerPx * factor;\n next.y = panRange(next.y, model.y.reverse ? -shift : shift);\n }\n setViewInternal(next, true);\n return;\n }\n if (gesture?.kind === \"point\" && p) {\n if (!p.moved) return;\n gesture.x = x;\n gesture.y = y;\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drag\", { item: gesture.item, x: at.x, y: at.y });\n return;\n }\n if (gesture?.kind === \"pan\" && p) {\n if (!p.moved) return;\n const sc = scales();\n if (!sc) return;\n const dx = x - gesture.x;\n const dy = y - gesture.y;\n const next = copyView(gesture.view);\n if (model.zoom.x)\n next.x = panRange(\n gesture.view.x,\n -dx * sc.xPerPx * (model.x.reverse ? -1 : 1),\n );\n if (model.zoom.y)\n next.y = panRange(\n gesture.view.y,\n dy * sc.yPerPx * (model.y.reverse ? -1 : 1),\n );\n setViewInternal(next, true);\n return;\n }\n if (pointers.size > 1) return;\n // mouse hover, or a finger scrubbing along the data\n if (!p || p.touch || !o.touch) {\n const event = hitAt(x, y, !!p?.touch || !!o.touch);\n if (event || !p?.touch) setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerUp = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n pointers.delete(id);\n const current = gesture;\n if (current?.kind === \"pinch\") {\n if (pointers.size < 2) gesture = null;\n return;\n }\n gesture = null;\n if (!p) return;\n if (current?.kind === \"point\") {\n if (p.moved) {\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drop\", { item: current.item, x: at.x, y: at.y });\n return;\n }\n } else if (current?.kind === \"pan\" && p.moved) {\n invalidate();\n return;\n }\n if (p.moved) {\n if (p.touch) invalidate();\n return;\n }\n // tap / click\n const now = Date.now();\n if (\n p.touch &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(x - lastTap.x, y - lastTap.y) < 24 &&\n zoomed\n ) {\n lastTap = { time: 0, x, y };\n resetZoom();\n return;\n }\n lastTap = { time: now, x, y };\n const legend = legendAt(x, y);\n if (legend) {\n if (getScene()?.legend?.toggle) toggleSeries(legend.id);\n return;\n }\n const hit = hitAt(x, y, p.touch);\n if (hit) {\n if (p.touch) setHover({ event: hit, x, y });\n emit(\"click\", hit);\n return;\n }\n if (p.touch) setHover(null);\n if (inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at as ChartPlotClickEvent);\n }\n };\n\n const pointerCancel = (o: ChartPointerOptions = {}) => {\n pointers.delete(o.id ?? 0);\n if (gesture?.kind === \"point\" || pointers.size < 2) gesture = null;\n invalidate();\n };\n\n model = buildModel(options, theme, hidden, cache);\n rebuild();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const paletteChanged =\n (next.palette ?? []).join() !== (options.palette ?? []).join();\n options = next;\n if (paletteChanged) theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setTheme(next) {\n if (destroyed) return;\n themeInput = next;\n theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setSize(w, h) {\n if (w === width && h === height) return;\n width = Math.max(0, w);\n height = Math.max(0, h);\n invalidate();\n },\n getScene,\n pointerDown,\n pointerMove,\n pointerUp,\n pointerCancel,\n pointerLeave() {\n if (!gesture && hover) setHover(null);\n },\n zoomAt,\n resetZoom,\n getView: () => copyView(view),\n setView(next) {\n if (destroyed) return;\n setViewInternal({ x: next.x ?? view.x, y: next.y ?? view.y }, false);\n },\n toggleSeries,\n clearHover() {\n if (hover) setHover(null);\n },\n getPlotRect() {\n const p = getScene()?.layout.plot;\n return p ? { ...p } : null;\n },\n toPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.xToPx(x), y: sc.yToPx(y) } : null;\n },\n fromPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.pxToX(x), y: sc.pxToY(y) } : null;\n },\n on(type, listener) {\n let set = listeners[type] as Set<typeof listener> | undefined;\n if (!set) {\n set = new Set();\n (listeners as Record<string, unknown>)[type] = set;\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n destroy() {\n destroyed = true;\n pointers.clear();\n for (const key of Object.keys(listeners))\n delete (listeners as Record<string, unknown>)[key];\n },\n };\n};\n\n// ------------------------------------------------------------- primitives\n\n/** A polyline (pixels of the chart): interleaved x, y */\nexport interface ChartLinePrimitive {\n kind: \"line\";\n seriesIndex: number;\n color: string;\n width: number;\n /** Runs of points without gaps */\n segments: number[][];\n}\n\nexport interface ChartAreaPrimitive {\n kind: \"area\";\n seriesIndex: number;\n color: string;\n opacity: number;\n /** Y pixel of the baseline */\n baseline: number;\n segments: number[][];\n}\n\nexport interface ChartBarPrimitive {\n kind: \"bars\";\n seriesIndex: number;\n color: string;\n /** Interleaved x, y, width, height */\n rects: number[];\n}\n\nexport interface ChartDotPrimitive {\n kind: \"dots\";\n seriesIndex: number;\n opacity: number;\n /** Interleaved x, y, diameter */\n dots: number[];\n /** CSS color of every dot */\n colors: string[];\n}\n\nexport type ChartPrimitive =\n | ChartLinePrimitive\n | ChartAreaPrimitive\n | ChartBarPrimitive\n | ChartDotPrimitive;\n\nexport interface ChartPrimitiveOptions {\n /**\n * Upper bound of the dots drawn per series: above it the dots are merged\n * into one per occupied cell of their size\n * @default 4000\n */\n maxDots?: number;\n /**\n * Upper bound of the bars drawn per series: above it neighboring bars\n * sharing a pixel column are merged\n * @default 2000\n */\n maxBars?: number;\n /**\n * Width in pixels of the columns lines are decimated to (at most four\n * points per column); larger values mean fewer shapes\n * @default 1\n */\n columnWidth?: number;\n /** Size of the cells dots are merged into (the dot size by default) */\n dotCell?: number;\n}\n\nconst visibleRange = (\n x: Float64Array,\n count: number,\n sorted: boolean,\n range: Range,\n): [number, number] => {\n if (!sorted) return [0, count];\n const [a, b] = range[0] <= range[1] ? range : [range[1], range[0]];\n return [\n Math.max(0, lowerBound(x, count, a) - 1),\n Math.min(count, lowerBound(x, count, b) + 1),\n ];\n};\n\n/**\n * Data of a scene as simple shapes in pixels of the chart, for hosts\n * without a canvas (React Native views, SVG): lines are decimated to a few\n * points per pixel column and large point sets are merged per cell, so the\n * number of shapes stays bounded by the size of the chart.\n */\nexport const scenePrimitives = (\n scene: ChartScene,\n limits: ChartPrimitiveOptions = {},\n): ChartPrimitive[] => {\n const { model, view, layout } = scene;\n const sc = layout.scales;\n const { plot } = layout;\n const maxDots = limits.maxDots ?? 4000;\n const maxBars = limits.maxBars ?? 2000;\n const column = Math.max(1, limits.columnWidth ?? 1);\n const order = { area: 0, bar: 1, line: 2, scatter: 3 } as const;\n const out: ChartPrimitive[] = [];\n const series = model.series\n .filter((s) => !s.hidden && s.cols.count > 0)\n .sort((a, b) => order[a.type] - order[b.type] || a.index - b.index);\n for (const s of series) {\n const { x, y, count, sorted } = s.cols;\n if (s.type === \"line\" || s.type === \"area\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const interleaved = new Float64Array((end - start) * 2);\n for (let i = start; i < end; i++) {\n interleaved[(i - start) * 2] = x[i];\n interleaved[(i - start) * 2 + 1] = y[i];\n }\n const n = end - start;\n const line =\n sorted && n > (plot.width * 2) / column\n ? decimateMinMax(interleaved, 0, n, (v) => sc.xToPx(v) / column)\n : { points: interleaved, length: n };\n const segments: number[][] = [];\n let run: number[] = [];\n for (let i = 0; i < line.length; i++) {\n const xv = line.points[i * 2];\n const yv = line.points[i * 2 + 1];\n if (!Number.isFinite(xv) || !Number.isFinite(yv)) {\n if (run.length) segments.push(run);\n run = [];\n continue;\n }\n run.push(sc.xToPx(xv), sc.yToPx(yv));\n }\n if (run.length) segments.push(run);\n if (s.type === \"area\") {\n out.push({\n kind: \"area\",\n seriesIndex: s.index,\n color: s.colorCss,\n opacity: s.opacity,\n baseline: sc.yToPx(model.baseline),\n segments,\n });\n }\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width: s.type === \"area\" ? Math.min(s.lineWidth, 2) : s.lineWidth,\n segments,\n });\n continue;\n }\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 0.5);\n const rects: number[] = [];\n const merge = end - start > maxBars;\n let lastCol = NaN;\n for (let i = start; i < end; i++) {\n const a = s.barBase[i];\n const b = s.barTop[i];\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < plot.x || cx - half > plot.x + plot.width) continue;\n const ya = sc.yToPx(a);\n const yb = sc.yToPx(b);\n const top = Math.min(ya, yb);\n const h = Math.max(1, Math.abs(ya - yb));\n const col = Math.floor(cx);\n if (merge && col === lastCol && rects.length) {\n // widen the previous bar of the same pixel column vertically\n const k = rects.length - 4;\n const bottom = Math.max(rects[k + 1] + rects[k + 3], top + h);\n rects[k + 1] = Math.min(rects[k + 1], top);\n rects[k + 3] = bottom - rects[k + 1];\n continue;\n }\n lastCol = col;\n rects.push(cx - half, top, half * 2, h);\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n });\n continue;\n }\n // scatter\n const dots: number[] = [];\n const colors: string[] = [];\n const colorOf = (i: number) => {\n const c = s.pointColors?.[i];\n return c ? toCss(c) : s.colorCss;\n };\n const visible: number[] = [];\n for (let i = 0; i < count; i++) {\n const xv = x[i];\n const yv = y[i];\n if (!Number.isFinite(xv) || !Number.isFinite(yv)) continue;\n const px = sc.xToPx(xv);\n const py = sc.yToPx(yv);\n if (\n px < plot.x ||\n px > plot.x + plot.width ||\n py < plot.y ||\n py > plot.y + plot.height\n )\n continue;\n visible.push(i);\n }\n if (visible.length > maxDots) {\n const cell = Math.max(2, limits.dotCell ?? s.pointSize * 0.8);\n const cols = Math.ceil(plot.width / cell) + 1;\n const owner = new Map<number, number>();\n for (const i of visible) {\n const cx = Math.floor((sc.xToPx(x[i]) - plot.x) / cell);\n const cy = Math.floor((sc.yToPx(y[i]) - plot.y) / cell);\n owner.set(cy * cols + cx, i);\n }\n for (const [key, i] of owner) {\n dots.push(\n plot.x + ((key % cols) + 0.5) * cell,\n plot.y + (Math.floor(key / cols) + 0.5) * cell,\n cell,\n );\n colors.push(colorOf(i));\n }\n } else {\n for (const i of visible) {\n dots.push(sc.xToPx(x[i]), sc.yToPx(y[i]), dotSize(s, i));\n colors.push(colorOf(i));\n }\n }\n out.push({\n kind: \"dots\",\n seriesIndex: s.index,\n opacity: s.opacity,\n dots,\n colors,\n });\n }\n return out;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"controller.js","names":["copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","createTheme","cache","hidden","listeners","model","view","zoomed","width","height","annotations","scene","sceneDirty","lastPlot","destroyed","hover","pointers","gesture","lastTap","emit","type","listener","event","invalidate","interaction","value","o","measure","text","font","size","weight","rebuild","buildModel","clampRange","base","minSpan","sameRange","resolveAnnotations","it","setHover","legendLayout","option","named","s","cfg","position","entries","x","row","w","legendShape","legendHeight","tooltipLayout","tooltip","custom","result","content","tooltipContent","lines","line","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","layoutChart","labels","collectPointLabels","occupied","labelHeight","a","textBox","x0","x1","y0","y1","right","bottom","pos","pointLabels","placeLabels","t","next","crosshair","showsCrosshair","cx","hoverMarks","dotSize","rect","key","getScene","scales","changed","sameHover","hitAt","sc","hitTest","y","touch","inPlot","p","dataAt","plot","cy","setViewInternal","notify","zoomAt","zoomRange","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","createScales","shift","panRange","at","dx","dy","current","now","hit","set","visibleRange","sorted","count","range","lowerBound","ORDER","scenePrimitives","maxDots","limits","maxBars","column","out","series","end","curved","curvePoints","n","points","bottoms","d","decimateMinMax","nextBottom","k","j","xv","segments","bottomSegments","run","runBottom","yv","bv","half","rects","colors","merge","lastCol","ya","yb","col","pc","toCss","up","down","wicks","bodies","wickColors","bodyColors","step","c","open","color","hi","high","lo","low","hw","hh","inset","unpackColor","dots","colorOf","visible","px","py","cell","cols","owner"],"sources":["../../../../../../charts/src/engine/controller.ts"],"sourcesContent":["// createChartController: the platform-free chart. It owns the options, the\n// theme, the model, the visible range and the interactions (pointer / touch\n// gestures fed by the host) and describes what to draw (`getScene`). Hosts\n// only draw: createCanvasChart on any 2D context, the React Native charts\n// with views.\n\nimport { toCss, unpackColor } from \"./color\";\nimport { curvePoints } from \"./curve\";\nimport { lowerBound } from \"./data\";\nimport { decimateMinMax } from \"./decimate\";\nimport { createScales, type Rect } from \"./layout\";\nimport { buildModel, type ChartModel, type DataCache } from \"./model\";\nimport {\n font,\n placeLabels,\n textBox,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport {\n collectPointLabels,\n dotSize,\n hitTest,\n hoverMarks,\n layoutChart,\n legendShape,\n resolveAnnotations,\n sameHover,\n showsCrosshair,\n tooltipContent,\n type ChartLayout,\n type HoverMark,\n type TooltipContent,\n} from \"./scene\";\nimport { createTheme, type ChartTheme, type ChartThemeInput } from \"./theme\";\nimport type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPlotClickEvent,\n ChartRect,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\n/** Events of a controller (no renderer events: hosts draw themselves) */\nexport type ChartControllerEventMap = Omit<ChartEventMap, \"renderer\">;\n\nexport interface ChartControllerConfig {\n options: ChartOptions;\n /** Colors and fonts (Minerva variables); light defaults when omitted */\n theme?: ChartThemeInput;\n /** Width in pixels of `text` drawn with the CSS `font` */\n measureText: (text: string, font: string) => number;\n /** Called when the scene changed and must be drawn again */\n onInvalidate?: () => void;\n}\n\nexport interface ChartLegendEntry {\n id: string;\n name: string;\n /** CSS color */\n color: string;\n shape: \"dot\" | \"line\" | \"square\";\n hidden: boolean;\n /** Hit / draw box of the entry, pixels of the chart */\n box: Rect;\n}\n\nexport interface ChartLegendLayout {\n entries: ChartLegendEntry[];\n position: \"top\" | \"bottom\";\n /** Whether a tap toggles the series */\n toggle: boolean;\n /** Height taken by the legend */\n height: number;\n}\n\nexport interface ChartTooltipLayout {\n /** Default content (`text` is set instead when `tooltip.render` returns a string) */\n content: TooltipContent;\n /** Lines of a custom string tooltip */\n text: string[] | null;\n /** Box of the tooltip, pixels of the chart */\n box: Rect;\n /** Line height used to lay the box out */\n lineHeight: number;\n padding: number;\n}\n\nexport interface ChartHoverLayout {\n event: ChartHoverEvent;\n marks: HoverMark[];\n /** X pixel of the guide line (`null` when hidden) */\n crosshairX: number | null;\n tooltip: ChartTooltipLayout | null;\n}\n\n/** Everything a host draws, in CSS pixels of the chart */\nexport interface ChartScene {\n width: number;\n height: number;\n theme: ChartTheme;\n model: ChartModel;\n view: ChartView;\n layout: ChartLayout;\n annotations: ResolvedAnnotation[];\n /** Labels of the dots that found a free slot */\n pointLabels: { label: PointLabel; box: Rect }[];\n legend: ChartLegendLayout | null;\n hover: ChartHoverLayout | null;\n /** Point being dragged (`interaction.dragPoints`) */\n dragging: { x: number; y: number; color: string; size: number } | null;\n}\n\nexport interface ChartPointerOptions {\n /** Pointer id (touch identifier); 0 by default */\n id?: number;\n /** Touch input: the tooltip follows the finger and stays after a tap */\n touch?: boolean;\n}\n\nexport interface ChartController {\n setOptions(options: ChartOptions): void;\n setTheme(theme: ChartThemeInput | undefined): void;\n /** Size of the chart in CSS pixels */\n setSize(width: number, height: number): void;\n /** What to draw (`null` until the size is known) */\n getScene(): ChartScene | null;\n pointerDown(x: number, y: number, options?: ChartPointerOptions): void;\n pointerMove(x: number, y: number, options?: ChartPointerOptions): void;\n pointerUp(x: number, y: number, options?: ChartPointerOptions): void;\n pointerCancel(options?: ChartPointerOptions): void;\n /** The mouse left the chart */\n pointerLeave(): void;\n /** Zooms around a pixel (factor < 1 zooms in) */\n zoomAt(x: number, y: number, factor: number): void;\n resetZoom(): void;\n getView(): ChartView;\n setView(view: Partial<ChartView>): void;\n /** Shows / hides a series (like a legend click) */\n toggleSeries(id: string): void;\n /** Hides the tooltip */\n clearHover(): void;\n getPlotRect(): ChartRect | null;\n toPixel(x: number, y: number): { x: number; y: number } | null;\n fromPixel(x: number, y: number): { x: number; y: number } | null;\n on<K extends keyof ChartControllerEventMap>(\n type: K,\n listener: (event: ChartControllerEventMap[K]) => void,\n ): () => void;\n destroy(): void;\n}\n\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\nconst TAP_SLOP = 6;\nconst TOUCH_SLOP = 10;\nconst DOUBLE_TAP_MS = 320;\nconst LEGEND_ROW = 20;\n\ninterface PointerState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n touch: boolean;\n moved: boolean;\n}\n\nexport const createChartController = (\n config: ChartControllerConfig,\n): ChartController => {\n let options = config.options;\n let themeInput = config.theme;\n let theme = createTheme(themeInput, options.palette);\n const cache: DataCache = new Map();\n const hidden = new Set<string>();\n const listeners: {\n [K in keyof ChartControllerEventMap]?: Set<\n (event: ChartControllerEventMap[K]) => void\n >;\n } = {};\n let model: ChartModel;\n let view: ChartView = { x: [0, 1], y: [0, 1] };\n let zoomed = false;\n let width = 0;\n let height = 0;\n let annotations: ResolvedAnnotation[] = [];\n let scene: ChartScene | null = null;\n let sceneDirty = true;\n let lastPlot = \"\";\n let destroyed = false;\n\n let hover: { event: ChartHoverEvent; x: number; y: number } | null = null;\n const pointers = new Map<number, PointerState>();\n let gesture:\n | { kind: \"pan\"; view: ChartView; x: number; y: number }\n | {\n kind: \"pinch\";\n view: ChartView;\n distance: number;\n midX: number;\n midY: number;\n }\n | { kind: \"point\"; item: ChartHoverItem; x: number; y: number }\n | null = null;\n let lastTap = { time: 0, x: 0, y: 0 };\n\n const emit = <K extends keyof ChartControllerEventMap>(\n type: K,\n event: ChartControllerEventMap[K],\n ) => {\n listeners[type]?.forEach((listener) => listener(event));\n };\n\n const invalidate = () => {\n sceneDirty = true;\n if (!destroyed) config.onInvalidate?.();\n };\n\n const interaction = () => {\n const value = options.interaction;\n if (value === false) return null;\n const o = typeof value === \"object\" ? value : {};\n return {\n pan: o.pan ?? true,\n dragPoints: o.dragPoints ?? false,\n };\n };\n\n const measure = (text: string, size = theme.fontSize, weight = 400) =>\n config.measureText(text, font(theme, size, weight));\n\n const rebuild = () => {\n model = buildModel(options, theme, hidden, cache);\n const { base, minSpan } = model;\n if (!zoomed) {\n view = copyView(base);\n } else {\n view = {\n x: model.zoom.x ? clampRange(view.x, base.x, minSpan.x) : [...base.x],\n y: model.zoom.y ? clampRange(view.y, base.y, minSpan.y) : [...base.y],\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n }\n annotations = resolveAnnotations(options.annotations, theme);\n if (hover) {\n const stillThere = hover.event.items.every(\n (it) =>\n model.series[it.seriesIndex] &&\n !model.series[it.seriesIndex].hidden &&\n it.index < model.series[it.seriesIndex].cols.count,\n );\n if (!stillThere) setHover(null);\n }\n invalidate();\n };\n\n // --------------------------------------------------------------- legend\n\n const legendLayout = (): ChartLegendLayout | null => {\n const option = options.legend;\n const named = options.series.filter((s) => s.name).length;\n const show = option === undefined ? named > 1 : !!option;\n if (!show) return null;\n const cfg = typeof option === \"object\" ? option : {};\n const position = cfg.position === \"bottom\" ? \"bottom\" : \"top\";\n const entries: ChartLegendEntry[] = [];\n let x = 4;\n let row = 0;\n for (const s of model.series) {\n const w = 14 + measure(s.name, 12) + 8;\n if (x + w > width - 4 && x > 4) {\n x = 4;\n row++;\n }\n entries.push({\n id: s.id,\n name: s.name,\n color: s.colorCss,\n shape: legendShape(s.type),\n hidden: s.hidden,\n box: { x, y: row * LEGEND_ROW, width: w, height: LEGEND_ROW },\n });\n x += w + 10;\n }\n const legendHeight = (row + 1) * LEGEND_ROW + 6;\n if (position === \"bottom\") {\n for (const e of entries) e.box.y += height - legendHeight + 6;\n }\n return {\n entries,\n position,\n toggle: cfg.toggle ?? true,\n height: legendHeight,\n };\n };\n\n // ---------------------------------------------------------------- scene\n\n const tooltipLayout = (\n event: ChartHoverEvent,\n anchorX: number,\n anchorY: number,\n ): ChartTooltipLayout | null => {\n const tooltip = options.tooltip;\n if (tooltip === false) return null;\n const custom = typeof tooltip === \"object\" ? tooltip.render : undefined;\n let text: string[] | null = null;\n if (custom) {\n const result = custom(event);\n if (result === null || result === \"\") return null;\n if (typeof result === \"string\") text = result.split(\"\\n\");\n }\n const content = tooltipContent(model, event, scene?.layout.yTicks ?? null);\n const lineHeight = 18;\n const padding = 8;\n let w = 0;\n let lines: number;\n if (text) {\n for (const line of text) w = Math.max(w, measure(line, 12));\n lines = text.length;\n } else {\n w = measure(content.title, 12, 600) + (content.titleColor ? 14 : 0);\n for (const row of content.rows) {\n w = Math.max(\n w,\n (row.color ? 14 : 0) +\n measure(row.name, 12) +\n 16 +\n measure(row.value, 12, 600),\n );\n }\n lines = 1 + content.rows.length;\n }\n const boxW = Math.ceil(Math.max(w, 96) + padding * 2 + 4);\n const boxH = lines * lineHeight + padding * 2;\n let left = anchorX + 14;\n if (left + boxW > width - 4) left = anchorX - 14 - boxW;\n left = Math.max(4, Math.min(left, width - boxW - 4));\n const top = Math.max(4, Math.min(anchorY - boxH / 2, height - boxH - 4));\n return {\n content,\n text,\n box: { x: left, y: top, width: boxW, height: boxH },\n lineHeight,\n padding,\n };\n };\n\n const computeScene = (): ChartScene | null => {\n if (width <= 0 || height <= 0) return null;\n const legend = legendLayout();\n const legendTop = legend?.position === \"top\" ? legend.height : 0;\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height: height - (legend?.height ?? 0),\n padding: options.padding,\n top: legendTop,\n measure: (text) => measure(text),\n });\n const labels = collectPointLabels(\n model,\n view,\n layout.scales,\n layout.yTicks,\n );\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n for (const a of annotations) {\n if (a.type === \"text\" && a.text) {\n occupied.push(\n textBox(\n a,\n layout.scales,\n measure(a.text, theme.fontSize, a.weight),\n labelHeight,\n ),\n );\n continue;\n }\n if (a.type !== \"rect\" || !a.label) continue;\n // keep the dot labels off the area titles (drawForeground does the same)\n const s = layout.scales;\n const x0 = a.x0 === undefined ? layout.plot.x : s.xToPx(a.x0);\n const x1 =\n a.x1 === undefined ? layout.plot.x + layout.plot.width : s.xToPx(a.x1);\n const y0 =\n a.y0 === undefined ? layout.plot.y + layout.plot.height : s.yToPx(a.y0);\n const y1 = a.y1 === undefined ? layout.plot.y : s.yToPx(a.y1);\n const w = measure(a.label, theme.fontSize + 1, 600);\n const left = Math.min(x0, x1);\n const right = Math.max(x0, x1);\n const top = Math.min(y0, y1);\n const bottom = Math.max(y0, y1);\n const pos = a.labelPosition;\n occupied.push({\n x: pos.endsWith(\"left\")\n ? left + 10\n : pos.endsWith(\"right\")\n ? right - 10 - w\n : (left + right - w) / 2,\n y: pos.startsWith(\"top\")\n ? top + 10\n : pos.startsWith(\"bottom\")\n ? bottom - 10 - labelHeight\n : (top + bottom - labelHeight) / 2,\n width: w,\n height: labelHeight,\n });\n }\n const pointLabels = placeLabels(\n labels,\n layout.plot,\n (t) => measure(t),\n labelHeight - 2,\n occupied,\n );\n const next: ChartScene = {\n width,\n height,\n theme,\n model,\n view: copyView(view),\n layout,\n annotations,\n pointLabels,\n legend,\n hover: null,\n dragging: null,\n };\n scene = next;\n if (hover) {\n const crosshair = showsCrosshair(model, hover.event, options.crosshair);\n const cx = layout.scales.xToPx(hover.event.items[0].x);\n next.hover = {\n event: hover.event,\n marks: hoverMarks(model, layout.scales, hover.event),\n crosshairX:\n crosshair &&\n cx >= layout.plot.x &&\n cx <= layout.plot.x + layout.plot.width\n ? cx\n : null,\n tooltip:\n gesture?.kind === \"pan\" || gesture?.kind === \"point\"\n ? null\n : tooltipLayout(hover.event, hover.x, hover.y),\n };\n }\n if (gesture?.kind === \"point\") {\n const s = model.series[gesture.item.seriesIndex];\n next.dragging = {\n x: gesture.x,\n y: gesture.y,\n color: gesture.item.color,\n size: (s ? dotSize(s, gesture.item.index) : 8) + 6,\n };\n }\n const rect = layout.plot;\n const key = `${rect.x},${rect.y},${rect.width},${rect.height}`;\n if (key !== lastPlot) {\n lastPlot = key;\n emit(\"layout\", { ...rect });\n }\n return next;\n };\n\n const getScene = () => {\n if (sceneDirty || !scene) {\n sceneDirty = false;\n scene = computeScene();\n }\n return scene;\n };\n\n // ---------------------------------------------------------- interaction\n\n const scales = () => getScene()?.layout.scales ?? null;\n\n const setHover = (\n next: { event: ChartHoverEvent; x: number; y: number } | null,\n ) => {\n const changed = !sameHover(hover?.event ?? null, next?.event ?? null);\n hover = next;\n invalidate();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n const hitAt = (x: number, y: number, touch: boolean) => {\n const sc = scales();\n return sc\n ? hitTest(model, sc, scene?.layout.xTicks ?? null, x, y, touch ? 8 : 0)\n : null;\n };\n\n const inPlot = (x: number, y: number) => {\n const p = scales()?.plot;\n return (\n !!p && x >= p.x && x <= p.x + p.width && y >= p.y && y <= p.y + p.height\n );\n };\n\n const dataAt = (x: number, y: number) => {\n const sc = scales();\n if (!sc) return null;\n const { plot } = sc;\n const cx = Math.max(plot.x, Math.min(plot.x + plot.width, x));\n const cy = Math.max(plot.y, Math.min(plot.y + plot.height, y));\n return { x: sc.pxToX(cx), y: sc.pxToY(cy) };\n };\n\n const setViewInternal = (next: ChartView, notify: boolean) => {\n const { base, minSpan } = model;\n view = {\n x: clampRange(next.x, base.x, minSpan.x),\n y: clampRange(next.y, base.y, minSpan.y),\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n if (notify) emit(\"zoom\", copyView(view));\n invalidate();\n };\n\n const zoomAt = (x: number, y: number, factor: number) => {\n const sc = scales();\n if (!sc || (!model.zoom.x && !model.zoom.y)) return;\n const next = copyView(view);\n if (model.zoom.x) next.x = zoomRange(view.x, sc.pxToX(x), factor);\n if (model.zoom.y) next.y = zoomRange(view.y, sc.pxToY(y), factor);\n setViewInternal(next, true);\n };\n\n const resetZoom = () => {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n };\n\n const legendAt = (x: number, y: number) =>\n getScene()?.legend?.entries.find(\n (e) =>\n x >= e.box.x &&\n x <= e.box.x + e.box.width &&\n y >= e.box.y &&\n y <= e.box.y + e.box.height,\n ) ?? null;\n\n const toggleSeries = (id: string) => {\n if (hidden.has(id)) hidden.delete(id);\n else hidden.add(id);\n rebuild();\n };\n\n const startPinch = () => {\n const [a, b] = [...pointers.values()];\n gesture = {\n kind: \"pinch\",\n view: copyView(view),\n distance: Math.max(1, Math.hypot(a.x - b.x, a.y - b.y)),\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2,\n };\n setHover(null);\n };\n\n const pointerDown = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const touch = !!o.touch;\n pointers.set(id, { x, y, startX: x, startY: y, touch, moved: false });\n const it = interaction();\n if (pointers.size === 2) {\n if (it && (model.zoom.x || model.zoom.y) && gesture?.kind !== \"point\")\n startPinch();\n return;\n }\n if (pointers.size > 2 || !it) {\n if (!it && touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n return;\n }\n if (it.dragPoints) {\n const item = hitAt(x, y, touch)?.items.find(\n (i) => model.series[i.seriesIndex].type === \"scatter\",\n );\n if (item) {\n gesture = { kind: \"point\", item, x, y };\n return;\n }\n }\n if (zoomed && it.pan && inPlot(x, y)) {\n gesture = { kind: \"pan\", view: copyView(view), x, y };\n return;\n }\n gesture = null;\n if (touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerMove = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n if (p) {\n p.x = x;\n p.y = y;\n if (\n !p.moved &&\n Math.hypot(x - p.startX, y - p.startY) >\n (p.touch ? TOUCH_SLOP : TAP_SLOP)\n )\n p.moved = true;\n }\n if (gesture?.kind === \"pinch\" && pointers.size >= 2) {\n const [a, b] = [...pointers.values()];\n const distance = Math.max(1, Math.hypot(a.x - b.x, a.y - b.y));\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n const sc = scales();\n if (!sc) return;\n const start = createScales(\n sc.plot,\n gesture.view,\n model.x.reverse,\n model.y.reverse,\n );\n const factor = gesture.distance / distance;\n const next = copyView(gesture.view);\n if (model.zoom.x) {\n next.x = zoomRange(gesture.view.x, start.pxToX(gesture.midX), factor);\n const shift = (midX - gesture.midX) * start.xPerPx * factor;\n next.x = panRange(next.x, model.x.reverse ? shift : -shift);\n }\n if (model.zoom.y) {\n next.y = zoomRange(gesture.view.y, start.pxToY(gesture.midY), factor);\n const shift = (midY - gesture.midY) * start.yPerPx * factor;\n next.y = panRange(next.y, model.y.reverse ? -shift : shift);\n }\n setViewInternal(next, true);\n return;\n }\n if (gesture?.kind === \"point\" && p) {\n if (!p.moved) return;\n gesture.x = x;\n gesture.y = y;\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drag\", { item: gesture.item, x: at.x, y: at.y });\n return;\n }\n if (gesture?.kind === \"pan\" && p) {\n if (!p.moved) return;\n const sc = scales();\n if (!sc) return;\n const dx = x - gesture.x;\n const dy = y - gesture.y;\n const next = copyView(gesture.view);\n if (model.zoom.x)\n next.x = panRange(\n gesture.view.x,\n -dx * sc.xPerPx * (model.x.reverse ? -1 : 1),\n );\n if (model.zoom.y)\n next.y = panRange(\n gesture.view.y,\n dy * sc.yPerPx * (model.y.reverse ? -1 : 1),\n );\n setViewInternal(next, true);\n return;\n }\n if (pointers.size > 1) return;\n // mouse hover, or a finger scrubbing along the data\n if (!p || p.touch || !o.touch) {\n const event = hitAt(x, y, !!p?.touch || !!o.touch);\n if (event || !p?.touch) setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerUp = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n pointers.delete(id);\n const current = gesture;\n if (current?.kind === \"pinch\") {\n if (pointers.size < 2) gesture = null;\n return;\n }\n gesture = null;\n if (!p) return;\n if (current?.kind === \"point\") {\n if (p.moved) {\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drop\", { item: current.item, x: at.x, y: at.y });\n return;\n }\n } else if (current?.kind === \"pan\" && p.moved) {\n invalidate();\n return;\n }\n if (p.moved) {\n if (p.touch) invalidate();\n return;\n }\n // tap / click\n const now = Date.now();\n if (\n p.touch &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(x - lastTap.x, y - lastTap.y) < 24 &&\n zoomed\n ) {\n lastTap = { time: 0, x, y };\n resetZoom();\n return;\n }\n lastTap = { time: now, x, y };\n const legend = legendAt(x, y);\n if (legend) {\n if (getScene()?.legend?.toggle) toggleSeries(legend.id);\n return;\n }\n const hit = hitAt(x, y, p.touch);\n if (hit) {\n if (p.touch) setHover({ event: hit, x, y });\n emit(\"click\", hit);\n return;\n }\n if (p.touch) setHover(null);\n if (inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at as ChartPlotClickEvent);\n }\n };\n\n const pointerCancel = (o: ChartPointerOptions = {}) => {\n pointers.delete(o.id ?? 0);\n if (gesture?.kind === \"point\" || pointers.size < 2) gesture = null;\n invalidate();\n };\n\n model = buildModel(options, theme, hidden, cache);\n rebuild();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const paletteChanged =\n (next.palette ?? []).join() !== (options.palette ?? []).join();\n options = next;\n if (paletteChanged) theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setTheme(next) {\n if (destroyed) return;\n themeInput = next;\n theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setSize(w, h) {\n if (w === width && h === height) return;\n width = Math.max(0, w);\n height = Math.max(0, h);\n invalidate();\n },\n getScene,\n pointerDown,\n pointerMove,\n pointerUp,\n pointerCancel,\n pointerLeave() {\n if (!gesture && hover) setHover(null);\n },\n zoomAt,\n resetZoom,\n getView: () => copyView(view),\n setView(next) {\n if (destroyed) return;\n setViewInternal({ x: next.x ?? view.x, y: next.y ?? view.y }, false);\n },\n toggleSeries,\n clearHover() {\n if (hover) setHover(null);\n },\n getPlotRect() {\n const p = getScene()?.layout.plot;\n return p ? { ...p } : null;\n },\n toPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.xToPx(x), y: sc.yToPx(y) } : null;\n },\n fromPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.pxToX(x), y: sc.pxToY(y) } : null;\n },\n on(type, listener) {\n let set = listeners[type] as Set<typeof listener> | undefined;\n if (!set) {\n set = new Set();\n (listeners as Record<string, unknown>)[type] = set;\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n destroy() {\n destroyed = true;\n pointers.clear();\n for (const key of Object.keys(listeners))\n delete (listeners as Record<string, unknown>)[key];\n },\n };\n};\n\n// ------------------------------------------------------------- primitives\n\n/** A polyline (pixels of the chart): interleaved x, y */\nexport interface ChartLinePrimitive {\n kind: \"line\";\n seriesIndex: number;\n color: string;\n width: number;\n /** Runs of points without gaps */\n segments: number[][];\n}\n\nexport interface ChartAreaPrimitive {\n kind: \"area\";\n seriesIndex: number;\n color: string;\n opacity: number;\n /** Y pixel of the baseline */\n baseline: number;\n segments: number[][];\n /** Stacked areas: y pixel of the bottom edge under every point of `segments` */\n bottoms?: number[][];\n}\n\nexport interface ChartBarPrimitive {\n kind: \"bars\";\n seriesIndex: number;\n color: string;\n /** Interleaved x, y, width, height */\n rects: number[];\n /** CSS color of every rect (candlesticks, heatmap cells, colored bars); `color` otherwise */\n colors?: string[];\n /** Corner radius in pixels */\n radius?: number;\n}\n\nexport interface ChartDotPrimitive {\n kind: \"dots\";\n seriesIndex: number;\n opacity: number;\n /** Interleaved x, y, diameter */\n dots: number[];\n /** CSS color of every dot */\n colors: string[];\n}\n\nexport type ChartPrimitive =\n | ChartLinePrimitive\n | ChartAreaPrimitive\n | ChartBarPrimitive\n | ChartDotPrimitive;\n\nexport interface ChartPrimitiveOptions {\n /**\n * Upper bound of the dots drawn per series: above it the dots are merged\n * into one per occupied cell of their size\n * @default 4000\n */\n maxDots?: number;\n /**\n * Upper bound of the bars drawn per series: above it neighboring bars\n * sharing a pixel column are merged\n * @default 2000\n */\n maxBars?: number;\n /**\n * Width in pixels of the columns lines are decimated to (at most four\n * points per column); larger values mean fewer shapes\n * @default 1\n */\n columnWidth?: number;\n /** Size of the cells dots are merged into (the dot size by default) */\n dotCell?: number;\n}\n\nconst visibleRange = (\n x: Float64Array,\n count: number,\n sorted: boolean,\n range: Range,\n): [number, number] => {\n if (!sorted) return [0, count];\n const [a, b] = range[0] <= range[1] ? range : [range[1], range[0]];\n return [\n Math.max(0, lowerBound(x, count, a) - 1),\n Math.min(count, lowerBound(x, count, b) + 1),\n ];\n};\n\nconst ORDER = {\n heatmap: 0,\n area: 1,\n bar: 2,\n candlestick: 3,\n line: 4,\n scatter: 5,\n} as const;\n\n/**\n * Data of a scene as simple shapes in pixels of the chart, for hosts\n * without a canvas (React Native views, SVG): lines are decimated to a few\n * points per pixel column and large point sets are merged per cell, so the\n * number of shapes stays bounded by the size of the chart.\n */\nexport const scenePrimitives = (\n scene: ChartScene,\n limits: ChartPrimitiveOptions = {},\n): ChartPrimitive[] => {\n const { model, view, layout } = scene;\n const sc = layout.scales;\n const { plot } = layout;\n const maxDots = limits.maxDots ?? 4000;\n const maxBars = limits.maxBars ?? 2000;\n const column = Math.max(1, limits.columnWidth ?? 1);\n const out: ChartPrimitive[] = [];\n const series = model.series\n .filter((s) => !s.hidden && s.cols.count > 0)\n .sort((a, b) => ORDER[a.type] - ORDER[b.type] || a.index - b.index);\n for (const s of series) {\n const { x, y, count, sorted } = s.cols;\n if (s.type === \"line\" || s.type === \"area\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const top = s.stackTop ?? y;\n // curve first (in data space), then decimation; the stacked bottom\n // edge follows the same sampling\n const curved = curvePoints(x, top, start, end, s.curve);\n const bottom = s.stackBase\n ? curvePoints(x, s.stackBase, start, end, s.curve).points\n : null;\n let n = curved.length;\n let points = curved.points;\n let bottoms = bottom;\n if (sorted && n > (plot.width * 2) / column) {\n if (bottom) {\n // keep the bottoms aligned with the kept tops (same x)\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n const next = new Float64Array(d.length * 2);\n const nextBottom = new Float64Array(d.length * 2);\n let k = 0;\n let j = 0;\n for (let i = 0; i < d.length; i++) {\n const xv = d.points[i * 2];\n while (j < n - 1 && points[j * 2] < xv) j++;\n next[k * 2] = xv;\n next[k * 2 + 1] = d.points[i * 2 + 1];\n nextBottom[k * 2] = xv;\n nextBottom[k * 2 + 1] = bottom[j * 2 + 1];\n k++;\n }\n points = next;\n bottoms = nextBottom;\n n = k;\n } else {\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n points = d.points;\n n = d.length;\n }\n }\n const segments: number[][] = [];\n const bottomSegments: number[][] = [];\n let run: number[] = [];\n let runBottom: number[] = [];\n for (let i = 0; i < n; i++) {\n const xv = points[i * 2];\n const yv = points[i * 2 + 1];\n const bv = bottoms ? bottoms[i * 2 + 1] : 0;\n if (\n !Number.isFinite(xv) ||\n !Number.isFinite(yv) ||\n !Number.isFinite(bv)\n ) {\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n }\n run = [];\n runBottom = [];\n continue;\n }\n run.push(sc.xToPx(xv), sc.yToPx(yv));\n if (bottoms) runBottom.push(sc.yToPx(bv));\n }\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n }\n if (s.type === \"area\") {\n out.push({\n kind: \"area\",\n seriesIndex: s.index,\n color: s.colorCss,\n opacity: s.opacity,\n baseline: sc.yToPx(model.baseline),\n segments,\n ...(bottoms ? { bottoms: bottomSegments } : {}),\n });\n }\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width: s.type === \"area\" ? Math.min(s.lineWidth, 2) : s.lineWidth,\n segments,\n });\n continue;\n }\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 0.5);\n const rects: number[] = [];\n const colors: string[] = [];\n const merge = end - start > maxBars;\n let lastCol = NaN;\n for (let i = start; i < end; i++) {\n const a = s.barBase[i];\n const b = s.barTop[i];\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < plot.x || cx - half > plot.x + plot.width) continue;\n const ya = sc.yToPx(a);\n const yb = sc.yToPx(b);\n const top = Math.min(ya, yb);\n const h = Math.max(1, Math.abs(ya - yb));\n const col = Math.floor(cx);\n if (merge && col === lastCol && rects.length) {\n // widen the previous bar of the same pixel column vertically\n const k = rects.length - 4;\n const bottom = Math.max(rects[k + 1] + rects[k + 3], top + h);\n rects[k + 1] = Math.min(rects[k + 1], top);\n rects[k + 3] = bottom - rects[k + 1];\n continue;\n }\n lastCol = col;\n rects.push(cx - half, top, half * 2, h);\n const pc = s.pointColors?.[i];\n colors.push(pc ? toCss(pc) : s.colorCss);\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n ...(s.pointColors ? { colors } : {}),\n radius: s.radius,\n });\n continue;\n }\n if (s.type === \"candlestick\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const { open, high, low } = s.cols;\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 1);\n const up = toCss(s.upColor);\n const down = toCss(s.downColor);\n const wicks: number[] = [];\n const bodies: number[] = [];\n const wickColors: string[] = [];\n const bodyColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n for (let i = start; i < end; i += step) {\n const c = y[i];\n const o = open ? open[i] : c;\n if (!Number.isFinite(c) || !Number.isFinite(o)) continue;\n const cx = sc.xToPx(x[i]);\n if (cx + half < plot.x || cx - half > plot.x + plot.width) continue;\n const color = c < o ? down : up;\n const hi = sc.yToPx(high ? high[i] : Math.max(o, c));\n const lo = sc.yToPx(low ? low[i] : Math.min(o, c));\n wicks.push(cx - 0.5, Math.min(hi, lo), 1, Math.abs(lo - hi));\n wickColors.push(color);\n const ya = sc.yToPx(o);\n const yb = sc.yToPx(c);\n bodies.push(\n cx - half,\n Math.min(ya, yb),\n half * 2,\n Math.max(1, Math.abs(ya - yb)),\n );\n bodyColors.push(color);\n }\n out.push(\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: wicks,\n colors: wickColors,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: bodies,\n colors: bodyColors,\n radius: 1,\n },\n );\n continue;\n }\n if (s.type === \"heatmap\") {\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const rects: number[] = [];\n const colors: string[] = [];\n const inset = hw > 3 && hh > 3 ? 1 : 0;\n for (let i = 0; i < count && rects.length / 4 < maxBars * 4; i++) {\n const c = s.cellColors?.[i];\n if (!c) continue;\n const cx = sc.xToPx(x[i]);\n const cy = sc.yToPx(y[i]);\n if (\n cx + hw < plot.x ||\n cx - hw > plot.x + plot.width ||\n cy + hh < plot.y ||\n cy - hh > plot.y + plot.height\n )\n continue;\n rects.push(\n cx - hw + inset,\n cy - hh + inset,\n hw * 2 - inset * 2,\n hh * 2 - inset * 2,\n );\n colors.push(toCss(unpackColor(c)));\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n colors,\n radius: s.radius,\n });\n continue;\n }\n // scatter\n const dots: number[] = [];\n const colors: string[] = [];\n const colorOf = (i: number) => {\n const c = s.pointColors?.[i];\n return c ? toCss(c) : s.colorCss;\n };\n const visible: number[] = [];\n for (let i = 0; i < count; i++) {\n const xv = x[i];\n const yv = y[i];\n if (!Number.isFinite(xv) || !Number.isFinite(yv)) continue;\n const px = sc.xToPx(xv);\n const py = sc.yToPx(yv);\n if (\n px < plot.x ||\n px > plot.x + plot.width ||\n py < plot.y ||\n py > plot.y + plot.height\n )\n continue;\n visible.push(i);\n }\n if (visible.length > maxDots) {\n const cell = Math.max(2, limits.dotCell ?? s.pointSize * 0.8);\n const cols = Math.ceil(plot.width / cell) + 1;\n const owner = new Map<number, number>();\n for (const i of visible) {\n const cx = Math.floor((sc.xToPx(x[i]) - plot.x) / cell);\n const cy = Math.floor((sc.yToPx(y[i]) - plot.y) / cell);\n owner.set(cy * cols + cx, i);\n }\n for (const [key, i] of owner) {\n dots.push(\n plot.x + ((key % cols) + 0.5) * cell,\n plot.y + (Math.floor(key / cols) + 0.5) * cell,\n cell,\n );\n colors.push(colorOf(i));\n }\n } else {\n for (const i of visible) {\n dots.push(sc.xToPx(x[i]), sc.yToPx(y[i]), dotSize(s, i));\n colors.push(colorOf(i));\n }\n }\n out.push({\n kind: \"dots\",\n seriesIndex: s.index,\n opacity: s.opacity,\n dots,\n colors,\n });\n }\n return out;\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=5e4,t=(e,t,n,r,i)=>{let a=Math.max(0,r-n);if(i===`step`){let i=new Float64Array(a*4),o=new Uint32Array(a*2),s=0;for(let a=n;a<r;a++)a>n&&Number.isFinite(t[a-1])&&Number.isFinite(t[a])&&(i[s*2]=e[a],i[s*2+1]=t[a-1],o[s++]=a-1),i[s*2]=e[a],i[s*2+1]=t[a],o[s++]=a;return{points:i,source:o,length:s}}if(i!==`smooth`||a<3||a>5e4){let i=new Float64Array(a*2),o=new Uint32Array(a);for(let a=n;a<r;a++)i[(a-n)*2]=e[a],i[(a-n)*2+1]=t[a],o[a-n]=a;return{points:i,source:o,length:a}}let o=new Float64Array(a),s=i=>i>=n&&i<r&&Number.isFinite(t[i])&&Number.isFinite(e[i]),c=n=>{let r=e[n+1]-e[n];return r===0?0:(t[n+1]-t[n])/r};for(let t=n;t<r;t++){if(!s(t))continue;let r=s(t-1),i=s(t+1),a;if(r&&i){let n=c(t-1),r=c(t);if(n*r<=0)a=0;else{let i=e[t]-e[t-1],o=e[t+1]-e[t],s=2*o+i,c=o+2*i;a=(s+c)/(s/n+c/r)}}else a=i?c(t):r?c(t-1):0;o[t-n]=a}let l=new Float64Array((a-1)*10*2+2),u=new Uint32Array((a-1)*10+1),d=0;for(let i=n;i<r;i++){if(l[d*2]=e[i],l[d*2+1]=t[i],u[d++]=i,!s(i)||!s(i+1))continue;let r=e[i],a=t[i],c=e[i+1]-r,f=o[i-n]*c,p=o[i+1-n]*c,m=t[i+1];for(let e=1;e<10;e++){let t=e/10,n=t*t,o=n*t,s=(2*o-3*n+1)*a+(o-2*n+t)*f+(-2*o+3*n)*m+(o-n)*p;l[d*2]=r+c*t,l[d*2+1]=s,u[d++]=i}}return{points:l,source:u,length:d}};exports.SMOOTH_LIMIT=e,exports.curvePoints=t;
2
+ //# sourceMappingURL=curve.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curve.cjs","names":["SMOOTH_LIMIT","curvePoints","n","end","start","curve","points","source","length","i","y","x","tangents","valid","slope","dx","hasPrev","hasNext","m","a","b","ha","hb","w1","w2","x0","y0","h","m0","m1","y1","k","t2","t3","v"],"sources":["../../../../../../charts/src/engine/curve.ts"],"sourcesContent":["// Curves between the points of a line: monotone cubic (smooth, never\n// overshoots the data, passes through every point) and steps. The curve is\n// resampled in data space, so every backend draws it as a polyline.\n\nimport type { ChartCurve } from \"./types\";\n\n/** Smooth curves are resampled with this many segments between two points */\nexport const SMOOTH_STEPS = 10;\n/** Above this many points per series a smooth curve is drawn straight (it is invisible anyway) */\nexport const SMOOTH_LIMIT = 50000;\n\n/**\n * Points of the curve through `x[i], y[i]` (`i` in `[start, end)`), as\n * interleaved x, y, plus the index of the source point each output point\n * belongs to. Gaps (non-finite y) are kept.\n */\nexport const curvePoints = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n start: number,\n end: number,\n curve: ChartCurve,\n): { points: Float64Array; source: Uint32Array; length: number } => {\n const n = Math.max(0, end - start);\n if (curve === \"step\") {\n const points = new Float64Array(n * 4);\n const source = new Uint32Array(n * 2);\n let length = 0;\n for (let i = start; i < end; i++) {\n const prevValid = i > start && Number.isFinite(y[i - 1]);\n if (prevValid && Number.isFinite(y[i])) {\n // horizontal run at the previous value, then the vertical jump\n points[length * 2] = x[i];\n points[length * 2 + 1] = y[i - 1];\n source[length++] = i - 1;\n }\n points[length * 2] = x[i];\n points[length * 2 + 1] = y[i];\n source[length++] = i;\n }\n return { points, source, length };\n }\n if (curve !== \"smooth\" || n < 3 || n > SMOOTH_LIMIT) {\n const points = new Float64Array(n * 2);\n const source = new Uint32Array(n);\n for (let i = start; i < end; i++) {\n points[(i - start) * 2] = x[i];\n points[(i - start) * 2 + 1] = y[i];\n source[i - start] = i;\n }\n return { points, source, length: n };\n }\n\n // Fritsch-Carlson tangents, per run of finite points\n const tangents = new Float64Array(n);\n const valid = (i: number) =>\n i >= start && i < end && Number.isFinite(y[i]) && Number.isFinite(x[i]);\n const slope = (i: number) => {\n const dx = x[i + 1] - x[i];\n return dx !== 0 ? (y[i + 1] - y[i]) / dx : 0;\n };\n for (let i = start; i < end; i++) {\n if (!valid(i)) continue;\n const hasPrev = valid(i - 1);\n const hasNext = valid(i + 1);\n let m: number;\n if (hasPrev && hasNext) {\n const a = slope(i - 1);\n const b = slope(i);\n if (a * b <= 0) {\n m = 0;\n } else {\n // weighted harmonic mean keeps the curve monotone between points\n const ha = x[i] - x[i - 1];\n const hb = x[i + 1] - x[i];\n const w1 = 2 * hb + ha;\n const w2 = hb + 2 * ha;\n m = (w1 + w2) / (w1 / a + w2 / b);\n }\n } else if (hasNext) {\n m = slope(i);\n } else if (hasPrev) {\n m = slope(i - 1);\n } else {\n m = 0;\n }\n tangents[i - start] = m;\n }\n\n const points = new Float64Array((n - 1) * SMOOTH_STEPS * 2 + 2);\n const source = new Uint32Array((n - 1) * SMOOTH_STEPS + 1);\n let length = 0;\n for (let i = start; i < end; i++) {\n points[length * 2] = x[i];\n points[length * 2 + 1] = y[i];\n source[length++] = i;\n if (!valid(i) || !valid(i + 1)) continue;\n const x0 = x[i];\n const y0 = y[i];\n const h = x[i + 1] - x0;\n const m0 = tangents[i - start] * h;\n const m1 = tangents[i + 1 - start] * h;\n const y1 = y[i + 1];\n for (let k = 1; k < SMOOTH_STEPS; k++) {\n const t = k / SMOOTH_STEPS;\n const t2 = t * t;\n const t3 = t2 * t;\n // cubic Hermite basis\n const v =\n (2 * t3 - 3 * t2 + 1) * y0 +\n (t3 - 2 * t2 + t) * m0 +\n (-2 * t3 + 3 * t2) * y1 +\n (t3 - t2) * m1;\n points[length * 2] = x0 + h * t;\n points[length * 2 + 1] = v;\n source[length++] = i;\n }\n }\n return { points, source, length };\n};\n"],"mappings":"AASA,IAAaA,EAAe,IAOfC,GACX,EACA,EACA,EACA,EACA,IACkE,CAClE,IAAMC,EAAI,KAAK,IAAI,EAAGC,EAAMC,CAAK,EACjC,GAAIC,IAAU,OAAQ,CACpB,IAAMC,EAAS,IAAI,aAAaJ,EAAI,CAAC,EAC/BK,EAAS,IAAI,YAAYL,EAAI,CAAC,EAChCM,EAAS,EACb,IAAK,IAAIC,EAAIL,EAAOK,EAAIN,EAAK,IACTM,EAAIL,GAAS,OAAO,SAASM,EAAED,EAAI,EAAE,GACtC,OAAO,SAASC,EAAED,EAAE,IAEnC,EAAOD,EAAS,GAAKG,EAAEF,GACvB,EAAOD,EAAS,EAAI,GAAKE,EAAED,EAAI,GAC/B,EAAO,KAAYA,EAAI,GAEzB,EAAOD,EAAS,GAAKG,EAAEF,GACvB,EAAOD,EAAS,EAAI,GAAKE,EAAED,GAC3B,EAAO,KAAYA,EAErB,MAAO,CAAE,SAAQ,SAAQ,QAAO,CAClC,CACA,GAAIJ,IAAU,UAAYH,EAAI,GAAKA,EAAA,IAAkB,CACnD,IAAMI,EAAS,IAAI,aAAaJ,EAAI,CAAC,EAC/BK,EAAS,IAAI,YAAYL,CAAC,EAChC,IAAK,IAAIO,EAAIL,EAAOK,EAAIN,EAAK,IAC3B,GAAQM,EAAIL,GAAS,GAAKO,EAAEF,GAC5B,GAAQA,EAAIL,GAAS,EAAI,GAAKM,EAAED,GAChC,EAAOA,EAAIL,GAASK,EAEtB,MAAO,CAAE,SAAQ,SAAQ,OAAQP,CAAE,CACrC,CAGA,IAAMU,EAAW,IAAI,aAAaV,CAAC,EAC7BW,EAAS,GACb,GAAKT,GAAS,EAAID,GAAO,OAAO,SAASO,EAAE,EAAE,GAAK,OAAO,SAASC,EAAE,EAAE,EAClEG,EAAS,GAAc,CAC3B,IAAMC,EAAKJ,EAAEF,EAAI,GAAKE,EAAEF,GACxB,OAAOM,IAAO,EAA6B,GAAxBL,EAAED,EAAI,GAAKC,EAAED,IAAMM,CACxC,EACA,IAAK,IAAIN,EAAIL,EAAOK,EAAIN,EAAK,IAAK,CAChC,GAAI,CAACU,EAAMJ,CAAC,EAAG,SACf,IAAMO,EAAUH,EAAMJ,EAAI,CAAC,EACrBQ,EAAUJ,EAAMJ,EAAI,CAAC,EACvBS,EACJ,GAAIF,GAAWC,EAAS,CACtB,IAAME,EAAIL,EAAML,EAAI,CAAC,EACfW,EAAIN,EAAML,CAAC,EACjB,GAAIU,EAAIC,GAAK,EACX,EAAI,MACC,CAEL,IAAMC,EAAKV,EAAEF,GAAKE,EAAEF,EAAI,GAClBa,EAAKX,EAAEF,EAAI,GAAKE,EAAEF,GAClBc,EAAK,EAAID,EAAKD,EACdG,EAAKF,EAAK,EAAID,EACpB,GAAKE,EAAKC,IAAOD,EAAKJ,EAAIK,EAAKJ,EACjC,CACF,KAAO,CAKLF,EALSD,EACLH,EAAML,CAAC,EACFO,EACLF,EAAML,EAAI,CAAC,EAEX,EAEN,EAASA,EAAIL,GAASc,CACxB,CAEA,IAAMZ,EAAS,IAAI,cAAcJ,EAAI,GAAA,GAAoB,EAAI,CAAC,EACxDK,EAAS,IAAI,aAAaL,EAAI,GAAA,GAAoB,CAAC,EACrDM,EAAS,EACb,IAAK,IAAI,EAAIJ,EAAO,EAAID,EAAK,IAAK,CAIhC,GAHA,EAAOK,EAAS,GAAKG,EAAE,GACvB,EAAOH,EAAS,EAAI,GAAKE,EAAE,GAC3B,EAAO,KAAY,EACf,CAACG,EAAM,CAAC,GAAK,CAACA,EAAM,EAAI,CAAC,EAAG,SAChC,IAAMY,EAAKd,EAAE,GACPe,EAAKhB,EAAE,GACPiB,EAAIhB,EAAE,EAAI,GAAKc,EACfG,EAAKhB,EAAS,EAAIR,GAASuB,EAC3BE,EAAKjB,EAAS,EAAI,EAAIR,GAASuB,EAC/BG,EAAKpB,EAAE,EAAI,GACjB,IAAK,IAAIqB,EAAI,EAAGA,EAAA,GAAkB,IAAK,CACrC,IAAM,EAAIA,EAAA,GACJC,EAAK,EAAI,EACTC,EAAKD,EAAK,EAEVE,GACH,EAAID,EAAK,EAAID,EAAK,GAAKN,GACvBO,EAAK,EAAID,EAAK,GAAKJ,GACnB,GAAKK,EAAK,EAAID,GAAMF,GACpBG,EAAKD,GAAMH,EACd,EAAOrB,EAAS,GAAKiB,EAAKE,EAAI,EAC9B,EAAOnB,EAAS,EAAI,GAAK0B,EACzB,EAAO,KAAY,CACrB,CACF,CACA,MAAO,CAAE,SAAQ,SAAQ,QAAO,CAClC"}
@@ -0,0 +1,56 @@
1
+ var e = 5e4, t = (e, t, n, r, i) => {
2
+ let a = Math.max(0, r - n);
3
+ if (i === "step") {
4
+ let i = new Float64Array(a * 4), o = new Uint32Array(a * 2), s = 0;
5
+ for (let a = n; a < r; a++) a > n && Number.isFinite(t[a - 1]) && Number.isFinite(t[a]) && (i[s * 2] = e[a], i[s * 2 + 1] = t[a - 1], o[s++] = a - 1), i[s * 2] = e[a], i[s * 2 + 1] = t[a], o[s++] = a;
6
+ return {
7
+ points: i,
8
+ source: o,
9
+ length: s
10
+ };
11
+ }
12
+ if (i !== "smooth" || a < 3 || a > 5e4) {
13
+ let i = new Float64Array(a * 2), o = new Uint32Array(a);
14
+ for (let a = n; a < r; a++) i[(a - n) * 2] = e[a], i[(a - n) * 2 + 1] = t[a], o[a - n] = a;
15
+ return {
16
+ points: i,
17
+ source: o,
18
+ length: a
19
+ };
20
+ }
21
+ let o = new Float64Array(a), s = (i) => i >= n && i < r && Number.isFinite(t[i]) && Number.isFinite(e[i]), c = (n) => {
22
+ let r = e[n + 1] - e[n];
23
+ return r === 0 ? 0 : (t[n + 1] - t[n]) / r;
24
+ };
25
+ for (let t = n; t < r; t++) {
26
+ if (!s(t)) continue;
27
+ let r = s(t - 1), i = s(t + 1), a;
28
+ if (r && i) {
29
+ let n = c(t - 1), r = c(t);
30
+ if (n * r <= 0) a = 0;
31
+ else {
32
+ let i = e[t] - e[t - 1], o = e[t + 1] - e[t], s = 2 * o + i, c = o + 2 * i;
33
+ a = (s + c) / (s / n + c / r);
34
+ }
35
+ } else a = i ? c(t) : r ? c(t - 1) : 0;
36
+ o[t - n] = a;
37
+ }
38
+ let l = new Float64Array((a - 1) * 10 * 2 + 2), u = new Uint32Array((a - 1) * 10 + 1), d = 0;
39
+ for (let i = n; i < r; i++) {
40
+ if (l[d * 2] = e[i], l[d * 2 + 1] = t[i], u[d++] = i, !s(i) || !s(i + 1)) continue;
41
+ let r = e[i], a = t[i], c = e[i + 1] - r, f = o[i - n] * c, p = o[i + 1 - n] * c, m = t[i + 1];
42
+ for (let e = 1; e < 10; e++) {
43
+ let t = e / 10, n = t * t, o = n * t, s = (2 * o - 3 * n + 1) * a + (o - 2 * n + t) * f + (-2 * o + 3 * n) * m + (o - n) * p;
44
+ l[d * 2] = r + c * t, l[d * 2 + 1] = s, u[d++] = i;
45
+ }
46
+ }
47
+ return {
48
+ points: l,
49
+ source: u,
50
+ length: d
51
+ };
52
+ };
53
+ //#endregion
54
+ export { e as SMOOTH_LIMIT, t as curvePoints };
55
+
56
+ //# sourceMappingURL=curve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curve.js","names":["SMOOTH_LIMIT","curvePoints","n","end","start","curve","points","source","length","i","y","x","tangents","valid","slope","dx","hasPrev","hasNext","m","a","b","ha","hb","w1","w2","x0","y0","h","m0","m1","y1","k","t2","t3","v"],"sources":["../../../../../../charts/src/engine/curve.ts"],"sourcesContent":["// Curves between the points of a line: monotone cubic (smooth, never\n// overshoots the data, passes through every point) and steps. The curve is\n// resampled in data space, so every backend draws it as a polyline.\n\nimport type { ChartCurve } from \"./types\";\n\n/** Smooth curves are resampled with this many segments between two points */\nexport const SMOOTH_STEPS = 10;\n/** Above this many points per series a smooth curve is drawn straight (it is invisible anyway) */\nexport const SMOOTH_LIMIT = 50000;\n\n/**\n * Points of the curve through `x[i], y[i]` (`i` in `[start, end)`), as\n * interleaved x, y, plus the index of the source point each output point\n * belongs to. Gaps (non-finite y) are kept.\n */\nexport const curvePoints = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n start: number,\n end: number,\n curve: ChartCurve,\n): { points: Float64Array; source: Uint32Array; length: number } => {\n const n = Math.max(0, end - start);\n if (curve === \"step\") {\n const points = new Float64Array(n * 4);\n const source = new Uint32Array(n * 2);\n let length = 0;\n for (let i = start; i < end; i++) {\n const prevValid = i > start && Number.isFinite(y[i - 1]);\n if (prevValid && Number.isFinite(y[i])) {\n // horizontal run at the previous value, then the vertical jump\n points[length * 2] = x[i];\n points[length * 2 + 1] = y[i - 1];\n source[length++] = i - 1;\n }\n points[length * 2] = x[i];\n points[length * 2 + 1] = y[i];\n source[length++] = i;\n }\n return { points, source, length };\n }\n if (curve !== \"smooth\" || n < 3 || n > SMOOTH_LIMIT) {\n const points = new Float64Array(n * 2);\n const source = new Uint32Array(n);\n for (let i = start; i < end; i++) {\n points[(i - start) * 2] = x[i];\n points[(i - start) * 2 + 1] = y[i];\n source[i - start] = i;\n }\n return { points, source, length: n };\n }\n\n // Fritsch-Carlson tangents, per run of finite points\n const tangents = new Float64Array(n);\n const valid = (i: number) =>\n i >= start && i < end && Number.isFinite(y[i]) && Number.isFinite(x[i]);\n const slope = (i: number) => {\n const dx = x[i + 1] - x[i];\n return dx !== 0 ? (y[i + 1] - y[i]) / dx : 0;\n };\n for (let i = start; i < end; i++) {\n if (!valid(i)) continue;\n const hasPrev = valid(i - 1);\n const hasNext = valid(i + 1);\n let m: number;\n if (hasPrev && hasNext) {\n const a = slope(i - 1);\n const b = slope(i);\n if (a * b <= 0) {\n m = 0;\n } else {\n // weighted harmonic mean keeps the curve monotone between points\n const ha = x[i] - x[i - 1];\n const hb = x[i + 1] - x[i];\n const w1 = 2 * hb + ha;\n const w2 = hb + 2 * ha;\n m = (w1 + w2) / (w1 / a + w2 / b);\n }\n } else if (hasNext) {\n m = slope(i);\n } else if (hasPrev) {\n m = slope(i - 1);\n } else {\n m = 0;\n }\n tangents[i - start] = m;\n }\n\n const points = new Float64Array((n - 1) * SMOOTH_STEPS * 2 + 2);\n const source = new Uint32Array((n - 1) * SMOOTH_STEPS + 1);\n let length = 0;\n for (let i = start; i < end; i++) {\n points[length * 2] = x[i];\n points[length * 2 + 1] = y[i];\n source[length++] = i;\n if (!valid(i) || !valid(i + 1)) continue;\n const x0 = x[i];\n const y0 = y[i];\n const h = x[i + 1] - x0;\n const m0 = tangents[i - start] * h;\n const m1 = tangents[i + 1 - start] * h;\n const y1 = y[i + 1];\n for (let k = 1; k < SMOOTH_STEPS; k++) {\n const t = k / SMOOTH_STEPS;\n const t2 = t * t;\n const t3 = t2 * t;\n // cubic Hermite basis\n const v =\n (2 * t3 - 3 * t2 + 1) * y0 +\n (t3 - 2 * t2 + t) * m0 +\n (-2 * t3 + 3 * t2) * y1 +\n (t3 - t2) * m1;\n points[length * 2] = x0 + h * t;\n points[length * 2 + 1] = v;\n source[length++] = i;\n }\n }\n return { points, source, length };\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- var e=e=>typeof e==`object`&&!!e&&!(`length`in e)&&`y`in e,t=(e,t)=>(n,r)=>{if(typeof n==`number`)return n;if(n instanceof Date)return n.getTime();if(typeof n==`string`){if(e===`category`)return t(n);if(e===`time`)return Date.parse(n);let i=Number(n);return Number.isNaN(i)?r:i}return r},n=e=>typeof e==`number`?e:e==null?NaN:Number(e),r=t=>{let n=new Set,r=e=>{typeof e==`string`&&n.add(e)};for(let n of t){if(e(n)){let e=n.x;if(e&&!ArrayBuffer.isView(e))for(let t=0;t<e.length;t++)r(e[t]);continue}let t=n;for(let e=0;e<t.length;e++){let n=t[e];Array.isArray(n)?r(n[0]):n&&typeof n==`object`&&r(n.x)}}return[...n]},i=(e,t,n,r)=>{let i=1/0,a=-1/0,o=1/0,s=-1/0,c=!0,l=-1/0;for(let r=0;r<n;r++){let n=e[r];if(!Number.isFinite(n)){t[r]=NaN;continue}n<l&&(c=!1),l=n;let u=t[r];Number.isFinite(u)&&(n<i&&(i=n),n>a&&(a=n),u<o&&(o=u),u>s&&(s=u))}let u=i>a;return{x:e,y:t,count:n,sorted:c,xMin:u?NaN:i,xMax:u?NaN:a,yMin:u?NaN:o,yMax:u?NaN:s,...r}},a=(t,r)=>{let a={size:null,colors:null,labels:null};if(e(t)){let e=t.y.length,o=new Float64Array(e),s=new Float64Array(e),c=t.x;for(let i=0;i<e;i++)s[i]=n(t.y[i]),o[i]=c?r(c[i],i):i;let l=null;if(t.size){l=new Float32Array(e);for(let r=0;r<e;r++)l[r]=n(t.size[r])}return i(o,s,e,{...a,size:l})}let o=t,s=o.length,c=new Float64Array(s),l=new Float64Array(s),u=null,d=null,f=null;for(let e=0;e<s;e++){let t=o[e];if(t==null||typeof t==`number`)c[e]=e,l[e]=n(t);else if(Array.isArray(t))c[e]=r(t[0],e),l[e]=n(t[1]);else if(typeof t==`object`){let i=t;c[e]=i.x===void 0?e:r(i.x,e),l[e]=n(i.y),i.size!==void 0&&(u??(u=new Float32Array(s).fill(NaN)),u[e]=i.size),i.color!==void 0&&(d??(d=Array(s)),d[e]=i.color),i.label!==void 0&&(f??(f=Array(s)),f[e]=i.label)}else c[e]=e,l[e]=NaN}return i(c,l,s,{size:u,colors:d,labels:f})},o=(e,t,n)=>{let r=0,i=t;for(;r<i;){let t=r+i>>>1;e[t]<n?r=t+1:i=t}return r},s=(e,t,n,r)=>{if(n===0)return-1;let i=o(e,n,r),a=i-1,s=i;for(;a>=0&&!Number.isFinite(t[a]);)a--;for(;s<n&&!Number.isFinite(t[s]);)s++;return a<0?s<n?s:-1:s>=n||r-e[a]<=e[s]-r?a:s};exports.collectCategories=r,exports.lowerBound=o,exports.nearestIndex=s,exports.normalizeData=a,exports.xResolver=t;
1
+ var e=e=>typeof e==`object`&&!!e&&!(`length`in e)&&`y`in e,t=(e,t)=>(n,r)=>{if(typeof n==`number`)return n;if(n instanceof Date)return n.getTime();if(typeof n==`string`){if(e===`category`)return t(n);if(e===`time`)return Date.parse(n);let i=Number(n);return Number.isNaN(i)?r:i}return r},n=e=>typeof e==`number`?e:e==null?NaN:Number(e),r=t=>{let n=new Set;for(let r of t){if(e(r)){let e=r.y;if(!ArrayBuffer.isView(e))for(let t=0;t<e.length;t++){let r=e[t];typeof r==`string`&&n.add(r)}continue}let t=r;for(let e=0;e<t.length;e++){let r=t[e],i=Array.isArray(r)?r[1]:r&&typeof r==`object`?r.y:void 0;typeof i==`string`&&n.add(i)}}return[...n]},i=t=>{let n=new Set,r=e=>{typeof e==`string`&&n.add(e)};for(let n of t){if(e(n)){let e=n.x;if(e&&!ArrayBuffer.isView(e))for(let t=0;t<e.length;t++)r(e[t]);continue}let t=n;for(let e=0;e<t.length;e++){let n=t[e];Array.isArray(n)?r(n[0]):n&&typeof n==`object`&&r(n.x)}}return[...n]},a=(e,t,n,r)=>{let i=1/0,a=-1/0,o=1/0,s=-1/0,c=!0,l=-1/0,{high:u,low:d,value:f}=r;for(let r=0;r<n;r++){let n=e[r];if(!Number.isFinite(n)){t[r]=NaN;continue}n<l&&(c=!1),l=n;let f=t[r];if(Number.isFinite(f)){if(n<i&&(i=n),n>a&&(a=n),f<o&&(o=f),f>s&&(s=f),u){let e=u[r];e>s&&(s=e),e<o&&(o=e)}if(d){let e=d[r];e<o&&(o=e),e>s&&(s=e)}}}let p=1/0,m=-1/0;if(f)for(let e=0;e<n;e++){let t=f[e];Number.isFinite(t)&&(t<p&&(p=t),t>m&&(m=t))}let h=i>a;return{x:e,y:t,count:n,sorted:c,xMin:h?NaN:i,xMax:h?NaN:a,yMin:h?NaN:o,yMax:h?NaN:s,valueMin:p>m?NaN:p,valueMax:p>m?NaN:m,...r}},o=(e,t)=>{if(!e)return null;if(e instanceof Float64Array&&e.length>=t)return e.length===t?e:e.subarray(0,t);let r=new Float64Array(t);for(let i=0;i<t;i++)r[i]=n(e[i]);return r},s=(t,r,i=n)=>{let s={size:null,colors:null,labels:null,open:null,high:null,low:null,value:null};if(e(t)){let e=t.y.length,c=new Float64Array(e),l=t.x;if(!l)for(let t=0;t<e;t++)c[t]=t;else if(ArrayBuffer.isView(l)&&l.length>=e)c.set(l.length===e?l:l.subarray(0,e));else for(let t=0;t<e;t++)c[t]=r(l[t],t);let u=t.y,d;if(ArrayBuffer.isView(u))d=new Float64Array(e),d.set(u);else{d=new Float64Array(e);for(let t=0;t<e;t++)d[t]=i(u[t])}let f=null;if(t.size){f=new Float32Array(e);for(let r=0;r<e;r++)f[r]=n(t.size[r])}return a(c,d,e,{...s,size:f,open:o(t.open,e),high:o(t.high,e),low:o(t.low,e),value:o(t.value,e)})}let c=t,l=c.length,u=new Float64Array(l),d=new Float64Array(l),f=null,p=null,m=null,h=null,g=null,_=null,v=null,y=()=>new Float64Array(l).fill(NaN);for(let e=0;e<l;e++){let t=c[e];if(t==null||typeof t==`number`)u[e]=e,d[e]=n(t);else if(Array.isArray(t))u[e]=r(t[0],e),d[e]=i(t[1]);else if(typeof t==`object`){let a=t;u[e]=a.x===void 0?e:r(a.x,e),d[e]=i(a.y),a.size!==void 0&&(f??(f=new Float32Array(l).fill(NaN)),f[e]=a.size),a.color!==void 0&&(p??(p=Array(l)),p[e]=a.color),a.label!==void 0&&(m??(m=Array(l)),m[e]=a.label),a.open!==void 0&&((h??(h=y()))[e]=n(a.open)),a.high!==void 0&&((g??(g=y()))[e]=n(a.high)),a.low!==void 0&&((_??(_=y()))[e]=n(a.low)),a.value!==void 0&&((v??(v=y()))[e]=n(a.value))}else u[e]=e,d[e]=NaN}return a(u,d,l,{size:f,colors:p,labels:m,open:h,high:g,low:_,value:v})},c=(e,t,n)=>{let r=0,i=t;for(;r<i;){let t=r+i>>>1;e[t]<n?r=t+1:i=t}return r},l=(e,t,n,r)=>{if(n===0)return-1;let i=c(e,n,r),a=i-1,o=i;for(;a>=0&&!Number.isFinite(t[a]);)a--;for(;o<n&&!Number.isFinite(t[o]);)o++;return a<0?o<n?o:-1:o>=n||r-e[a]<=e[o]-r?a:o};exports.collectCategories=i,exports.collectYCategories=r,exports.lowerBound=c,exports.nearestIndex=l,exports.normalizeData=s,exports.xResolver=t;
2
2
  //# sourceMappingURL=data.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"data.cjs","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","collectCategories","seen","add","datas","xs","i","list","item","finalize","xMin","xMax","yMin","yMax","sorted","prev","count","xi","x","yi","y","empty","extra","normalizeData","none","resolveX","size","colors","labels","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type { ChartAxisType, ChartSeriesData, ChartXValue } from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none) */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | null)[];\n size?: ArrayLike<number>;\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\" ? v : v === null || v === undefined ? NaN : Number(v);\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Pick<SeriesColumns, \"size\" | \"colors\" | \"labels\">,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n ...extra,\n };\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n): SeriesColumns => {\n const none = { size: null, colors: null, labels: null };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n const xs = data.x;\n for (let i = 0; i < count; i++) {\n y[i] = toNumber(data.y[i]);\n x[i] = xs ? resolveX(xs[i] as ChartXValue, i) : i;\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, { ...none, size });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = toNumber(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | null;\n size?: number;\n color?: string;\n label?: string;\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = toNumber(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, { size, colors, labels });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"data.cjs","names":["isColumns","data","xResolver","value","type","categoryIndex","n","index","toNumber","v","collectYCategories","seen","datas","ys","i","list","item","collectCategories","add","xs","finalize","xMin","xMax","yMin","yMax","sorted","prev","extra","count","xi","x","yi","y","high","h","low","l","valueMin","valueMax","empty","column","values","out","normalizeData","none","resolveX","resolveY","size","colors","labels","open","nanColumn","d","lowerBound","lo","hi","mid","nearestIndex","left","right"],"sources":["../../../../../../charts/src/engine/data.ts"],"sourcesContent":["// Normalization of series data into columns (Float64Array).\n\nimport type { ChartAxisType, ChartSeriesData, ChartXValue } from \"./types\";\n\nexport interface SeriesColumns {\n x: Float64Array;\n /** NaN where the value is missing */\n y: Float64Array;\n size: Float32Array | null;\n colors: (string | undefined)[] | null;\n labels: (string | undefined)[] | null;\n /** Candlesticks: open / high / low (y is the close) */\n open: Float64Array | null;\n high: Float64Array | null;\n low: Float64Array | null;\n /** Heatmaps: values of the cells */\n value: Float64Array | null;\n count: number;\n /** x is non-decreasing (binary search, decimation) */\n sorted: boolean;\n /** Extent of the finite points (NaN when there is none); high / low included */\n xMin: number;\n xMax: number;\n yMin: number;\n yMax: number;\n /** Extent of the finite `value`s (NaN when there is none) */\n valueMin: number;\n valueMax: number;\n}\n\ntype XResolver = (value: ChartXValue, index: number) => number;\n/** Converts a y value (a category name on category y axes) to a number */\nexport type YResolver = (value: unknown) => number;\n\ntype Extra = Pick<\n SeriesColumns,\n \"size\" | \"colors\" | \"labels\" | \"open\" | \"high\" | \"low\" | \"value\"\n>;\n\nconst isColumns = (\n data: ChartSeriesData,\n): data is {\n x?: ArrayLike<number> | readonly ChartXValue[];\n y: ArrayLike<number> | readonly (number | string | null)[];\n size?: ArrayLike<number>;\n open?: ArrayLike<number>;\n high?: ArrayLike<number>;\n low?: ArrayLike<number>;\n value?: ArrayLike<number> | readonly (number | null)[];\n} =>\n typeof data === \"object\" &&\n data !== null &&\n !(\"length\" in data) &&\n \"y\" in data;\n\n/** Converts an x value to a number for the axis type */\nexport const xResolver = (\n type: ChartAxisType,\n categoryIndex: (name: string) => number,\n): XResolver => {\n return (value, index) => {\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return value.getTime();\n if (typeof value === \"string\") {\n if (type === \"category\") return categoryIndex(value);\n if (type === \"time\") return Date.parse(value);\n const n = Number(value);\n return Number.isNaN(n) ? index : n;\n }\n return index;\n };\n};\n\nconst toNumber = (v: unknown): number =>\n typeof v === \"number\" ? v : v === null || v === undefined ? NaN : Number(v);\n\n/** Category names used by string y values (heatmap rows), in order of appearance */\nexport const collectYCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n for (const data of datas) {\n if (isColumns(data)) {\n const ys = data.y;\n if (!ArrayBuffer.isView(ys)) {\n for (let i = 0; i < ys.length; i++) {\n const v = ys[i];\n if (typeof v === \"string\") seen.add(v);\n }\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n const v = Array.isArray(item)\n ? item[1]\n : item && typeof item === \"object\"\n ? (item as { y?: unknown }).y\n : undefined;\n if (typeof v === \"string\") seen.add(v);\n }\n }\n return [...seen];\n};\n\n/** Category names used by string x values, in order of appearance */\nexport const collectCategories = (\n datas: readonly ChartSeriesData[],\n): string[] => {\n const seen = new Set<string>();\n const add = (v: unknown) => {\n if (typeof v === \"string\") seen.add(v);\n };\n for (const data of datas) {\n if (isColumns(data)) {\n const xs = data.x;\n if (xs && !ArrayBuffer.isView(xs)) {\n for (let i = 0; i < xs.length; i++) add(xs[i]);\n }\n continue;\n }\n const list = data as ArrayLike<unknown>;\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (Array.isArray(item)) add(item[0]);\n else if (item && typeof item === \"object\")\n add((item as { x?: unknown }).x);\n }\n }\n return [...seen];\n};\n\nconst finalize = (\n x: Float64Array,\n y: Float64Array,\n count: number,\n extra: Extra,\n): SeriesColumns => {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let sorted = true;\n let prev = -Infinity;\n const { high, low, value } = extra;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n if (!Number.isFinite(xi)) {\n y[i] = NaN;\n continue;\n }\n if (xi < prev) sorted = false;\n prev = xi;\n const yi = y[i];\n if (!Number.isFinite(yi)) continue;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n if (high) {\n const h = high[i];\n if (h > yMax) yMax = h;\n if (h < yMin) yMin = h;\n }\n if (low) {\n const l = low[i];\n if (l < yMin) yMin = l;\n if (l > yMax) yMax = l;\n }\n }\n let valueMin = Infinity;\n let valueMax = -Infinity;\n if (value) {\n for (let i = 0; i < count; i++) {\n const v = value[i];\n if (!Number.isFinite(v)) continue;\n if (v < valueMin) valueMin = v;\n if (v > valueMax) valueMax = v;\n }\n }\n const empty = xMin > xMax;\n return {\n x,\n y,\n count,\n sorted,\n xMin: empty ? NaN : xMin,\n xMax: empty ? NaN : xMax,\n yMin: empty ? NaN : yMin,\n yMax: empty ? NaN : yMax,\n valueMin: valueMin > valueMax ? NaN : valueMin,\n valueMax: valueMin > valueMax ? NaN : valueMax,\n ...extra,\n };\n};\n\nconst column = (\n values: ArrayLike<unknown> | undefined,\n count: number,\n): Float64Array | null => {\n if (!values) return null;\n if (values instanceof Float64Array && values.length >= count) {\n return values.length === count ? values : values.subarray(0, count);\n }\n const out = new Float64Array(count);\n for (let i = 0; i < count; i++) out[i] = toNumber(values[i]);\n return out;\n};\n\n/** Turns any supported data form into columns */\nexport const normalizeData = (\n data: ChartSeriesData,\n resolveX: XResolver,\n resolveY: YResolver = toNumber,\n): SeriesColumns => {\n const none: Extra = {\n size: null,\n colors: null,\n labels: null,\n open: null,\n high: null,\n low: null,\n value: null,\n };\n if (isColumns(data)) {\n const count = data.y.length;\n const x = new Float64Array(count);\n const xs = data.x;\n if (!xs) {\n for (let i = 0; i < count; i++) x[i] = i;\n } else if (ArrayBuffer.isView(xs) && xs.length >= count) {\n // typed arrays: a plain copy (the hot path of large data sets)\n x.set(\n (xs.length === count\n ? xs\n : (xs as unknown as Float64Array).subarray(\n 0,\n count,\n )) as ArrayLike<number>,\n );\n } else {\n for (let i = 0; i < count; i++) x[i] = resolveX(xs[i] as ChartXValue, i);\n }\n const ys = data.y;\n let y: Float64Array;\n if (ArrayBuffer.isView(ys)) {\n // finalize writes NaN at invalid x: copy so the input is never changed\n y = new Float64Array(count);\n y.set(ys as ArrayLike<number>);\n } else {\n y = new Float64Array(count);\n for (let i = 0; i < count; i++) y[i] = resolveY(ys[i]);\n }\n let size: Float32Array | null = null;\n if (data.size) {\n size = new Float32Array(count);\n for (let i = 0; i < count; i++) size[i] = toNumber(data.size[i]);\n }\n return finalize(x, y, count, {\n ...none,\n size,\n open: column(data.open, count),\n high: column(data.high, count),\n low: column(data.low, count),\n value: column(data.value, count),\n });\n }\n\n const list = data as ArrayLike<unknown>;\n const count = list.length;\n const x = new Float64Array(count);\n const y = new Float64Array(count);\n let size: Float32Array | null = null;\n let colors: (string | undefined)[] | null = null;\n let labels: (string | undefined)[] | null = null;\n let open: Float64Array | null = null;\n let high: Float64Array | null = null;\n let low: Float64Array | null = null;\n let value: Float64Array | null = null;\n const nanColumn = () => new Float64Array(count).fill(NaN);\n\n for (let i = 0; i < count; i++) {\n const item = list[i];\n if (item === null || item === undefined || typeof item === \"number\") {\n x[i] = i;\n y[i] = toNumber(item);\n } else if (Array.isArray(item)) {\n x[i] = resolveX(item[0] as ChartXValue, i);\n y[i] = resolveY(item[1]);\n } else if (typeof item === \"object\") {\n const d = item as {\n x?: ChartXValue;\n y?: number | string | null;\n size?: number;\n color?: string;\n label?: string;\n open?: number;\n high?: number;\n low?: number;\n value?: number | null;\n };\n x[i] = d.x === undefined ? i : resolveX(d.x, i);\n y[i] = resolveY(d.y);\n if (d.size !== undefined) {\n size ??= new Float32Array(count).fill(NaN);\n size[i] = d.size;\n }\n if (d.color !== undefined) {\n colors ??= new Array<string | undefined>(count);\n colors[i] = d.color;\n }\n if (d.label !== undefined) {\n labels ??= new Array<string | undefined>(count);\n labels[i] = d.label;\n }\n if (d.open !== undefined) (open ??= nanColumn())[i] = toNumber(d.open);\n if (d.high !== undefined) (high ??= nanColumn())[i] = toNumber(d.high);\n if (d.low !== undefined) (low ??= nanColumn())[i] = toNumber(d.low);\n if (d.value !== undefined) (value ??= nanColumn())[i] = toNumber(d.value);\n } else {\n x[i] = i;\n y[i] = NaN;\n }\n }\n return finalize(x, y, count, {\n size,\n colors,\n labels,\n open,\n high,\n low,\n value,\n });\n};\n\n/** First index whose x is >= value (sorted x) */\nexport const lowerBound = (\n x: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\n/** Index of the point with the closest x and a finite y (sorted x), -1 if none */\nexport const nearestIndex = (\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n value: number,\n): number => {\n if (count === 0) return -1;\n const i = lowerBound(x, count, value);\n let left = i - 1;\n let right = i;\n while (left >= 0 && !Number.isFinite(y[left])) left--;\n while (right < count && !Number.isFinite(y[right])) right++;\n if (left < 0) return right < count ? right : -1;\n if (right >= count) return left;\n return value - x[left] <= x[right] - value ? left : right;\n};\n"],"mappings":"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"}