minerva-design 1.1.0 → 1.2.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 (249) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/charts/canvas.d.cts +7 -0
  3. package/dist/charts/canvas.d.ts +7 -0
  4. package/dist/charts/core.cjs +1 -1
  5. package/dist/charts/core.d.cts +5 -1
  6. package/dist/charts/core.d.ts +5 -1
  7. package/dist/charts/core.js +4 -1
  8. package/dist/charts/engine/canvas.cjs +2 -0
  9. package/dist/charts/engine/canvas.cjs.map +1 -0
  10. package/dist/charts/engine/canvas.d.cts +85 -0
  11. package/dist/charts/engine/canvas.d.ts +85 -0
  12. package/dist/charts/engine/canvas.js +165 -0
  13. package/dist/charts/engine/canvas.js.map +1 -0
  14. package/dist/charts/engine/chart.cjs +2 -2
  15. package/dist/charts/engine/chart.cjs.map +1 -1
  16. package/dist/charts/engine/chart.js +382 -440
  17. package/dist/charts/engine/chart.js.map +1 -1
  18. package/dist/charts/engine/color.cjs +1 -1
  19. package/dist/charts/engine/color.cjs.map +1 -1
  20. package/dist/charts/engine/color.d.cts +10 -0
  21. package/dist/charts/engine/color.d.ts +10 -0
  22. package/dist/charts/engine/color.js +75 -3
  23. package/dist/charts/engine/color.js.map +1 -1
  24. package/dist/charts/engine/controller.cjs +3 -0
  25. package/dist/charts/engine/controller.cjs.map +1 -0
  26. package/dist/charts/engine/controller.d.cts +182 -0
  27. package/dist/charts/engine/controller.d.ts +182 -0
  28. package/dist/charts/engine/controller.js +528 -0
  29. package/dist/charts/engine/controller.js.map +1 -0
  30. package/dist/charts/engine/model.cjs +1 -1
  31. package/dist/charts/engine/model.cjs.map +1 -1
  32. package/dist/charts/engine/model.d.cts +2 -2
  33. package/dist/charts/engine/model.d.ts +2 -2
  34. package/dist/charts/engine/model.js +72 -72
  35. package/dist/charts/engine/model.js.map +1 -1
  36. package/dist/charts/engine/overlay.cjs +1 -1
  37. package/dist/charts/engine/overlay.cjs.map +1 -1
  38. package/dist/charts/engine/overlay.d.cts +17 -1
  39. package/dist/charts/engine/overlay.d.ts +17 -1
  40. package/dist/charts/engine/overlay.js +63 -49
  41. package/dist/charts/engine/overlay.js.map +1 -1
  42. package/dist/charts/engine/presets.cjs +3 -0
  43. package/dist/charts/engine/presets.cjs.map +1 -0
  44. package/dist/charts/engine/presets.d.cts +103 -0
  45. package/dist/charts/engine/presets.d.ts +103 -0
  46. package/dist/charts/engine/presets.js +153 -0
  47. package/dist/charts/engine/presets.js.map +1 -0
  48. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  49. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  50. package/dist/charts/engine/renderers/canvas2d.d.cts +17 -1
  51. package/dist/charts/engine/renderers/canvas2d.d.ts +17 -1
  52. package/dist/charts/engine/renderers/canvas2d.js +88 -51
  53. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  54. package/dist/charts/engine/scene.cjs +2 -0
  55. package/dist/charts/engine/scene.cjs.map +1 -0
  56. package/dist/charts/engine/scene.d.cts +89 -0
  57. package/dist/charts/engine/scene.d.ts +89 -0
  58. package/dist/charts/engine/scene.js +241 -0
  59. package/dist/charts/engine/scene.js.map +1 -0
  60. package/dist/charts/engine/theme.cjs +1 -1
  61. package/dist/charts/engine/theme.cjs.map +1 -1
  62. package/dist/charts/engine/theme.d.cts +25 -1
  63. package/dist/charts/engine/theme.d.ts +25 -1
  64. package/dist/charts/engine/theme.js +42 -26
  65. package/dist/charts/engine/theme.js.map +1 -1
  66. package/dist/charts/engine/types.d.cts +69 -2
  67. package/dist/charts/engine/types.d.ts +69 -2
  68. package/dist/charts/index.cjs +1 -1
  69. package/dist/charts/index.d.cts +1 -1
  70. package/dist/charts/index.d.ts +1 -1
  71. package/dist/charts/index.js +5 -2
  72. package/dist/charts/react/Chart.cjs +1 -1
  73. package/dist/charts/react/Chart.cjs.map +1 -1
  74. package/dist/charts/react/Chart.d.cts +11 -4
  75. package/dist/charts/react/Chart.d.ts +11 -4
  76. package/dist/charts/react/Chart.js +81 -39
  77. package/dist/charts/react/Chart.js.map +1 -1
  78. package/dist/charts/react/charts.cjs +1 -1
  79. package/dist/charts/react/charts.cjs.map +1 -1
  80. package/dist/charts/react/charts.d.cts +1 -1
  81. package/dist/charts/react/charts.d.ts +1 -1
  82. package/dist/charts/react/charts.js +99 -145
  83. package/dist/charts/react/charts.js.map +1 -1
  84. package/dist/charts/react/types.d.cts +29 -61
  85. package/dist/charts/react/types.d.ts +29 -61
  86. package/dist/native/charts/src/canvas.cjs +1 -0
  87. package/dist/native/charts/src/canvas.js +6 -0
  88. package/dist/native/charts/src/engine/axis.cjs +2 -0
  89. package/dist/native/charts/src/engine/axis.cjs.map +1 -0
  90. package/dist/native/charts/src/engine/axis.js +38 -0
  91. package/dist/native/charts/src/engine/axis.js.map +1 -0
  92. package/dist/native/charts/src/engine/canvas.cjs +1 -0
  93. package/dist/native/charts/src/engine/canvas.js +1 -0
  94. package/dist/native/charts/src/engine/color.cjs +2 -0
  95. package/dist/native/charts/src/engine/color.cjs.map +1 -0
  96. package/dist/native/charts/src/engine/color.js +130 -0
  97. package/dist/native/charts/src/engine/color.js.map +1 -0
  98. package/dist/native/charts/src/engine/controller.cjs +3 -0
  99. package/dist/native/charts/src/engine/controller.cjs.map +1 -0
  100. package/dist/native/charts/src/engine/controller.js +528 -0
  101. package/dist/native/charts/src/engine/controller.js.map +1 -0
  102. package/dist/native/charts/src/engine/data.cjs +2 -0
  103. package/dist/native/charts/src/engine/data.cjs.map +1 -0
  104. package/dist/native/charts/src/engine/data.js +104 -0
  105. package/dist/native/charts/src/engine/data.js.map +1 -0
  106. package/dist/native/charts/src/engine/decimate.cjs +2 -0
  107. package/dist/native/charts/src/engine/decimate.cjs.map +1 -0
  108. package/dist/native/charts/src/engine/decimate.js +28 -0
  109. package/dist/native/charts/src/engine/decimate.js.map +1 -0
  110. package/dist/native/charts/src/engine/format.cjs +2 -0
  111. package/dist/native/charts/src/engine/format.cjs.map +1 -0
  112. package/dist/native/charts/src/engine/format.js +34 -0
  113. package/dist/native/charts/src/engine/format.js.map +1 -0
  114. package/dist/native/charts/src/engine/layout.cjs +2 -0
  115. package/dist/native/charts/src/engine/layout.cjs.map +1 -0
  116. package/dist/native/charts/src/engine/layout.js +26 -0
  117. package/dist/native/charts/src/engine/layout.js.map +1 -0
  118. package/dist/native/charts/src/engine/model.cjs +2 -0
  119. package/dist/native/charts/src/engine/model.cjs.map +1 -0
  120. package/dist/native/charts/src/engine/model.js +175 -0
  121. package/dist/native/charts/src/engine/model.js.map +1 -0
  122. package/dist/native/charts/src/engine/overlay.cjs +2 -0
  123. package/dist/native/charts/src/engine/overlay.cjs.map +1 -0
  124. package/dist/native/charts/src/engine/overlay.js +49 -0
  125. package/dist/native/charts/src/engine/overlay.js.map +1 -0
  126. package/dist/native/charts/src/engine/presets.cjs +3 -0
  127. package/dist/native/charts/src/engine/presets.cjs.map +1 -0
  128. package/dist/native/charts/src/engine/presets.js +147 -0
  129. package/dist/native/charts/src/engine/presets.js.map +1 -0
  130. package/dist/native/charts/src/engine/scale.cjs +2 -0
  131. package/dist/native/charts/src/engine/scale.cjs.map +1 -0
  132. package/dist/native/charts/src/engine/scale.js +37 -0
  133. package/dist/native/charts/src/engine/scale.js.map +1 -0
  134. package/dist/native/charts/src/engine/scene.cjs +2 -0
  135. package/dist/native/charts/src/engine/scene.cjs.map +1 -0
  136. package/dist/native/charts/src/engine/scene.js +241 -0
  137. package/dist/native/charts/src/engine/scene.js.map +1 -0
  138. package/dist/native/charts/src/engine/spatial.cjs +2 -0
  139. package/dist/native/charts/src/engine/spatial.cjs.map +1 -0
  140. package/dist/native/charts/src/engine/spatial.js +53 -0
  141. package/dist/native/charts/src/engine/spatial.js.map +1 -0
  142. package/dist/native/charts/src/engine/theme.cjs +2 -0
  143. package/dist/native/charts/src/engine/theme.cjs.map +1 -0
  144. package/dist/native/charts/src/engine/theme.js +62 -0
  145. package/dist/native/charts/src/engine/theme.js.map +1 -0
  146. package/dist/native/charts/src/engine/time.cjs +2 -0
  147. package/dist/native/charts/src/engine/time.cjs.map +1 -0
  148. package/dist/native/charts/src/engine/time.js +189 -0
  149. package/dist/native/charts/src/engine/time.js.map +1 -0
  150. package/dist/native/charts/src/engine/viewport.cjs +2 -0
  151. package/dist/native/charts/src/engine/viewport.cjs.map +1 -0
  152. package/dist/native/charts/src/engine/viewport.js +12 -0
  153. package/dist/native/charts/src/engine/viewport.js.map +1 -0
  154. package/dist/native/components/Chart/ChartBase.cjs +2 -0
  155. package/dist/native/components/Chart/ChartBase.cjs.map +1 -0
  156. package/dist/native/components/Chart/ChartBase.d.cts +29 -0
  157. package/dist/native/components/Chart/ChartBase.d.ts +29 -0
  158. package/dist/native/components/Chart/ChartBase.js +287 -0
  159. package/dist/native/components/Chart/ChartBase.js.map +1 -0
  160. package/dist/native/components/Chart/charts.cjs +2 -0
  161. package/dist/native/components/Chart/charts.cjs.map +1 -0
  162. package/dist/native/components/Chart/charts.d.cts +19 -0
  163. package/dist/native/components/Chart/charts.d.ts +19 -0
  164. package/dist/native/components/Chart/charts.js +173 -0
  165. package/dist/native/components/Chart/charts.js.map +1 -0
  166. package/dist/native/components/Chart/index.cjs +1 -0
  167. package/dist/native/components/Chart/index.d.cts +2 -0
  168. package/dist/native/components/Chart/index.d.ts +2 -0
  169. package/dist/native/components/Chart/index.js +2 -0
  170. package/dist/native/components/Chart/measure.cjs +2 -0
  171. package/dist/native/components/Chart/measure.cjs.map +1 -0
  172. package/dist/native/components/Chart/measure.d.cts +5 -0
  173. package/dist/native/components/Chart/measure.d.ts +5 -0
  174. package/dist/native/components/Chart/measure.js +11 -0
  175. package/dist/native/components/Chart/measure.js.map +1 -0
  176. package/dist/native/components/Chart/scene.cjs +2 -0
  177. package/dist/native/components/Chart/scene.cjs.map +1 -0
  178. package/dist/native/components/Chart/scene.d.cts +41 -0
  179. package/dist/native/components/Chart/scene.d.ts +41 -0
  180. package/dist/native/components/Chart/scene.js +419 -0
  181. package/dist/native/components/Chart/scene.js.map +1 -0
  182. package/dist/native/components/Chart/theme.cjs +2 -0
  183. package/dist/native/components/Chart/theme.cjs.map +1 -0
  184. package/dist/native/components/Chart/theme.d.cts +10 -0
  185. package/dist/native/components/Chart/theme.d.ts +10 -0
  186. package/dist/native/components/Chart/theme.js +10 -0
  187. package/dist/native/components/Chart/theme.js.map +1 -0
  188. package/dist/native/components/Chart/types.d.cts +129 -0
  189. package/dist/native/components/Chart/types.d.ts +129 -0
  190. package/dist/native/index.cjs +1 -1
  191. package/dist/native/index.d.cts +1 -0
  192. package/dist/native/index.d.ts +1 -0
  193. package/dist/native/index.js +6 -4
  194. package/dist/native/manifest.d.cts +7 -0
  195. package/dist/native/manifest.d.ts +7 -0
  196. package/dist/native/source/components/Chart/ChartBase.tsx +545 -0
  197. package/dist/native/source/components/Chart/charts.tsx +291 -0
  198. package/dist/native/source/components/Chart/index.ts +8 -0
  199. package/dist/native/source/components/Chart/measure.ts +50 -0
  200. package/dist/native/source/components/Chart/scene.tsx +987 -0
  201. package/dist/native/source/components/Chart/theme.ts +16 -0
  202. package/dist/native/source/components/Chart/types.ts +194 -0
  203. package/dist/native/source/index.ts +1 -0
  204. package/dist/native/source/manifest.ts +14 -0
  205. package/dist/taro/charts.d.ts +144 -0
  206. package/dist/taro/index.d.ts +1 -0
  207. package/dist/taro/index.js +3064 -618
  208. package/dist/uni/BarChart.vue +75 -0
  209. package/dist/uni/BarChart.vue.d.ts +111 -0
  210. package/dist/uni/Chart.vue +68 -0
  211. package/dist/uni/Chart.vue.d.ts +100 -0
  212. package/dist/uni/LineChart.vue +75 -0
  213. package/dist/uni/LineChart.vue.d.ts +111 -0
  214. package/dist/uni/ProgressIndicator.vue.d.ts +1 -1
  215. package/dist/uni/QuadrantChart.vue +184 -0
  216. package/dist/uni/QuadrantChart.vue.d.ts +173 -0
  217. package/dist/uni/ScatterChart.vue +69 -0
  218. package/dist/uni/ScatterChart.vue.d.ts +100 -0
  219. package/dist/uni/chart-canvas.d.ts +68 -0
  220. package/dist/uni/chart-canvas.js +363 -0
  221. package/dist/uni/chart-types.d.ts +135 -0
  222. package/dist/uni/chart-types.js +84 -0
  223. package/dist/uni/charts-canvas.d.ts +1 -0
  224. package/dist/uni/charts-canvas.js +8 -0
  225. package/dist/uni/index.d.ts +6 -0
  226. package/dist/uni/index.js +6 -0
  227. package/dist/weapp/bar-chart/index.js +1 -0
  228. package/dist/weapp/bar-chart/index.json +1 -0
  229. package/dist/weapp/bar-chart/index.wxml +1 -0
  230. package/dist/weapp/bar-chart/index.wxss +1 -0
  231. package/dist/weapp/chart/index.js +1 -0
  232. package/dist/weapp/chart/index.json +1 -0
  233. package/dist/weapp/chart/index.wxml +1 -0
  234. package/dist/weapp/chart/index.wxss +1 -0
  235. package/dist/weapp/controls.js +4019 -266
  236. package/dist/weapp/line-chart/index.js +1 -0
  237. package/dist/weapp/line-chart/index.json +1 -0
  238. package/dist/weapp/line-chart/index.wxml +1 -0
  239. package/dist/weapp/line-chart/index.wxss +1 -0
  240. package/dist/weapp/quadrant-chart/index.js +1 -0
  241. package/dist/weapp/quadrant-chart/index.json +1 -0
  242. package/dist/weapp/quadrant-chart/index.wxml +1 -0
  243. package/dist/weapp/quadrant-chart/index.wxss +1 -0
  244. package/dist/weapp/scatter-chart/index.js +1 -0
  245. package/dist/weapp/scatter-chart/index.json +1 -0
  246. package/dist/weapp/scatter-chart/index.wxml +1 -0
  247. package/dist/weapp/scatter-chart/index.wxss +1 -0
  248. package/dist/weapp/types.d.ts +295 -0
  249. package/package.json +21 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.cjs","names":["createTheme","font","buildModel","clampRange","sameRange","resolveAnnotations","tooltipContent","layoutChart","collectPointLabels","textBox","placeLabels","showsCrosshair","hoverMarks","dotSize","sameHover","hitTest","zoomRange","createScales","panRange","lowerBound","decimateMinMax","toCss","require_data","require_color","require_layout","require_model","require_overlay","require_decimate","require_scene","require_theme","require_viewport","copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","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","size","weight","rebuild","base","minSpan","it","setHover","legendLayout","option","named","s","cfg","position","entries","x","row","w","legendHeight","tooltipLayout","tooltip","custom","result","content","lines","line","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","labels","occupied","labelHeight","a","x0","x1","y0","y1","right","bottom","pos","pointLabels","t","next","crosshair","cx","rect","key","getScene","scales","changed","hitAt","sc","y","touch","inPlot","p","dataAt","plot","cy","setViewInternal","notify","zoomAt","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","shift","at","dx","dy","current","now","hit","set","visibleRange","sorted","count","range","scenePrimitives","maxDots","limits","maxBars","column","order","out","series","end","interleaved","n","segments","run","xv","yv","half","rects","merge","lastCol","ya","yb","col","k","dots","colors","colorOf","c","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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"}
@@ -0,0 +1,182 @@
1
+ import { Rect } from './layout.cjs';
2
+ import { ChartModel } from './model.cjs';
3
+ import { PointLabel, ResolvedAnnotation } from './overlay.cjs';
4
+ import { ChartLayout, HoverMark, TooltipContent } from './scene.cjs';
5
+ import { ChartTheme, ChartThemeInput } from './theme.cjs';
6
+ import { ChartEventMap, ChartHoverEvent, ChartOptions, ChartRect, ChartView } from './types.cjs';
7
+ /** Events of a controller (no renderer events: hosts draw themselves) */
8
+ export type ChartControllerEventMap = Omit<ChartEventMap, "renderer">;
9
+ export interface ChartControllerConfig {
10
+ options: ChartOptions;
11
+ /** Colors and fonts (Minerva variables); light defaults when omitted */
12
+ theme?: ChartThemeInput;
13
+ /** Width in pixels of `text` drawn with the CSS `font` */
14
+ measureText: (text: string, font: string) => number;
15
+ /** Called when the scene changed and must be drawn again */
16
+ onInvalidate?: () => void;
17
+ }
18
+ export interface ChartLegendEntry {
19
+ id: string;
20
+ name: string;
21
+ /** CSS color */
22
+ color: string;
23
+ shape: "dot" | "line" | "square";
24
+ hidden: boolean;
25
+ /** Hit / draw box of the entry, pixels of the chart */
26
+ box: Rect;
27
+ }
28
+ export interface ChartLegendLayout {
29
+ entries: ChartLegendEntry[];
30
+ position: "top" | "bottom";
31
+ /** Whether a tap toggles the series */
32
+ toggle: boolean;
33
+ /** Height taken by the legend */
34
+ height: number;
35
+ }
36
+ export interface ChartTooltipLayout {
37
+ /** Default content (`text` is set instead when `tooltip.render` returns a string) */
38
+ content: TooltipContent;
39
+ /** Lines of a custom string tooltip */
40
+ text: string[] | null;
41
+ /** Box of the tooltip, pixels of the chart */
42
+ box: Rect;
43
+ /** Line height used to lay the box out */
44
+ lineHeight: number;
45
+ padding: number;
46
+ }
47
+ export interface ChartHoverLayout {
48
+ event: ChartHoverEvent;
49
+ marks: HoverMark[];
50
+ /** X pixel of the guide line (`null` when hidden) */
51
+ crosshairX: number | null;
52
+ tooltip: ChartTooltipLayout | null;
53
+ }
54
+ /** Everything a host draws, in CSS pixels of the chart */
55
+ export interface ChartScene {
56
+ width: number;
57
+ height: number;
58
+ theme: ChartTheme;
59
+ model: ChartModel;
60
+ view: ChartView;
61
+ layout: ChartLayout;
62
+ annotations: ResolvedAnnotation[];
63
+ /** Labels of the dots that found a free slot */
64
+ pointLabels: {
65
+ label: PointLabel;
66
+ box: Rect;
67
+ }[];
68
+ legend: ChartLegendLayout | null;
69
+ hover: ChartHoverLayout | null;
70
+ /** Point being dragged (`interaction.dragPoints`) */
71
+ dragging: {
72
+ x: number;
73
+ y: number;
74
+ color: string;
75
+ size: number;
76
+ } | null;
77
+ }
78
+ export interface ChartPointerOptions {
79
+ /** Pointer id (touch identifier); 0 by default */
80
+ id?: number;
81
+ /** Touch input: the tooltip follows the finger and stays after a tap */
82
+ touch?: boolean;
83
+ }
84
+ export interface ChartController {
85
+ setOptions(options: ChartOptions): void;
86
+ setTheme(theme: ChartThemeInput | undefined): void;
87
+ /** Size of the chart in CSS pixels */
88
+ setSize(width: number, height: number): void;
89
+ /** What to draw (`null` until the size is known) */
90
+ getScene(): ChartScene | null;
91
+ pointerDown(x: number, y: number, options?: ChartPointerOptions): void;
92
+ pointerMove(x: number, y: number, options?: ChartPointerOptions): void;
93
+ pointerUp(x: number, y: number, options?: ChartPointerOptions): void;
94
+ pointerCancel(options?: ChartPointerOptions): void;
95
+ /** The mouse left the chart */
96
+ pointerLeave(): void;
97
+ /** Zooms around a pixel (factor < 1 zooms in) */
98
+ zoomAt(x: number, y: number, factor: number): void;
99
+ resetZoom(): void;
100
+ getView(): ChartView;
101
+ setView(view: Partial<ChartView>): void;
102
+ /** Shows / hides a series (like a legend click) */
103
+ toggleSeries(id: string): void;
104
+ /** Hides the tooltip */
105
+ clearHover(): void;
106
+ getPlotRect(): ChartRect | null;
107
+ toPixel(x: number, y: number): {
108
+ x: number;
109
+ y: number;
110
+ } | null;
111
+ fromPixel(x: number, y: number): {
112
+ x: number;
113
+ y: number;
114
+ } | null;
115
+ on<K extends keyof ChartControllerEventMap>(type: K, listener: (event: ChartControllerEventMap[K]) => void): () => void;
116
+ destroy(): void;
117
+ }
118
+ export declare const createChartController: (config: ChartControllerConfig) => ChartController;
119
+ /** A polyline (pixels of the chart): interleaved x, y */
120
+ export interface ChartLinePrimitive {
121
+ kind: "line";
122
+ seriesIndex: number;
123
+ color: string;
124
+ width: number;
125
+ /** Runs of points without gaps */
126
+ segments: number[][];
127
+ }
128
+ export interface ChartAreaPrimitive {
129
+ kind: "area";
130
+ seriesIndex: number;
131
+ color: string;
132
+ opacity: number;
133
+ /** Y pixel of the baseline */
134
+ baseline: number;
135
+ segments: number[][];
136
+ }
137
+ export interface ChartBarPrimitive {
138
+ kind: "bars";
139
+ seriesIndex: number;
140
+ color: string;
141
+ /** Interleaved x, y, width, height */
142
+ rects: number[];
143
+ }
144
+ export interface ChartDotPrimitive {
145
+ kind: "dots";
146
+ seriesIndex: number;
147
+ opacity: number;
148
+ /** Interleaved x, y, diameter */
149
+ dots: number[];
150
+ /** CSS color of every dot */
151
+ colors: string[];
152
+ }
153
+ export type ChartPrimitive = ChartLinePrimitive | ChartAreaPrimitive | ChartBarPrimitive | ChartDotPrimitive;
154
+ export interface ChartPrimitiveOptions {
155
+ /**
156
+ * Upper bound of the dots drawn per series: above it the dots are merged
157
+ * into one per occupied cell of their size
158
+ * @default 4000
159
+ */
160
+ maxDots?: number;
161
+ /**
162
+ * Upper bound of the bars drawn per series: above it neighboring bars
163
+ * sharing a pixel column are merged
164
+ * @default 2000
165
+ */
166
+ maxBars?: number;
167
+ /**
168
+ * Width in pixels of the columns lines are decimated to (at most four
169
+ * points per column); larger values mean fewer shapes
170
+ * @default 1
171
+ */
172
+ columnWidth?: number;
173
+ /** Size of the cells dots are merged into (the dot size by default) */
174
+ dotCell?: number;
175
+ }
176
+ /**
177
+ * Data of a scene as simple shapes in pixels of the chart, for hosts
178
+ * without a canvas (React Native views, SVG): lines are decimated to a few
179
+ * points per pixel column and large point sets are merged per cell, so the
180
+ * number of shapes stays bounded by the size of the chart.
181
+ */
182
+ export declare const scenePrimitives: (scene: ChartScene, limits?: ChartPrimitiveOptions) => ChartPrimitive[];
@@ -0,0 +1,182 @@
1
+ import { Rect } from './layout.js';
2
+ import { ChartModel } from './model.js';
3
+ import { PointLabel, ResolvedAnnotation } from './overlay.js';
4
+ import { ChartLayout, HoverMark, TooltipContent } from './scene.js';
5
+ import { ChartTheme, ChartThemeInput } from './theme.js';
6
+ import { ChartEventMap, ChartHoverEvent, ChartOptions, ChartRect, ChartView } from './types.js';
7
+ /** Events of a controller (no renderer events: hosts draw themselves) */
8
+ export type ChartControllerEventMap = Omit<ChartEventMap, "renderer">;
9
+ export interface ChartControllerConfig {
10
+ options: ChartOptions;
11
+ /** Colors and fonts (Minerva variables); light defaults when omitted */
12
+ theme?: ChartThemeInput;
13
+ /** Width in pixels of `text` drawn with the CSS `font` */
14
+ measureText: (text: string, font: string) => number;
15
+ /** Called when the scene changed and must be drawn again */
16
+ onInvalidate?: () => void;
17
+ }
18
+ export interface ChartLegendEntry {
19
+ id: string;
20
+ name: string;
21
+ /** CSS color */
22
+ color: string;
23
+ shape: "dot" | "line" | "square";
24
+ hidden: boolean;
25
+ /** Hit / draw box of the entry, pixels of the chart */
26
+ box: Rect;
27
+ }
28
+ export interface ChartLegendLayout {
29
+ entries: ChartLegendEntry[];
30
+ position: "top" | "bottom";
31
+ /** Whether a tap toggles the series */
32
+ toggle: boolean;
33
+ /** Height taken by the legend */
34
+ height: number;
35
+ }
36
+ export interface ChartTooltipLayout {
37
+ /** Default content (`text` is set instead when `tooltip.render` returns a string) */
38
+ content: TooltipContent;
39
+ /** Lines of a custom string tooltip */
40
+ text: string[] | null;
41
+ /** Box of the tooltip, pixels of the chart */
42
+ box: Rect;
43
+ /** Line height used to lay the box out */
44
+ lineHeight: number;
45
+ padding: number;
46
+ }
47
+ export interface ChartHoverLayout {
48
+ event: ChartHoverEvent;
49
+ marks: HoverMark[];
50
+ /** X pixel of the guide line (`null` when hidden) */
51
+ crosshairX: number | null;
52
+ tooltip: ChartTooltipLayout | null;
53
+ }
54
+ /** Everything a host draws, in CSS pixels of the chart */
55
+ export interface ChartScene {
56
+ width: number;
57
+ height: number;
58
+ theme: ChartTheme;
59
+ model: ChartModel;
60
+ view: ChartView;
61
+ layout: ChartLayout;
62
+ annotations: ResolvedAnnotation[];
63
+ /** Labels of the dots that found a free slot */
64
+ pointLabels: {
65
+ label: PointLabel;
66
+ box: Rect;
67
+ }[];
68
+ legend: ChartLegendLayout | null;
69
+ hover: ChartHoverLayout | null;
70
+ /** Point being dragged (`interaction.dragPoints`) */
71
+ dragging: {
72
+ x: number;
73
+ y: number;
74
+ color: string;
75
+ size: number;
76
+ } | null;
77
+ }
78
+ export interface ChartPointerOptions {
79
+ /** Pointer id (touch identifier); 0 by default */
80
+ id?: number;
81
+ /** Touch input: the tooltip follows the finger and stays after a tap */
82
+ touch?: boolean;
83
+ }
84
+ export interface ChartController {
85
+ setOptions(options: ChartOptions): void;
86
+ setTheme(theme: ChartThemeInput | undefined): void;
87
+ /** Size of the chart in CSS pixels */
88
+ setSize(width: number, height: number): void;
89
+ /** What to draw (`null` until the size is known) */
90
+ getScene(): ChartScene | null;
91
+ pointerDown(x: number, y: number, options?: ChartPointerOptions): void;
92
+ pointerMove(x: number, y: number, options?: ChartPointerOptions): void;
93
+ pointerUp(x: number, y: number, options?: ChartPointerOptions): void;
94
+ pointerCancel(options?: ChartPointerOptions): void;
95
+ /** The mouse left the chart */
96
+ pointerLeave(): void;
97
+ /** Zooms around a pixel (factor < 1 zooms in) */
98
+ zoomAt(x: number, y: number, factor: number): void;
99
+ resetZoom(): void;
100
+ getView(): ChartView;
101
+ setView(view: Partial<ChartView>): void;
102
+ /** Shows / hides a series (like a legend click) */
103
+ toggleSeries(id: string): void;
104
+ /** Hides the tooltip */
105
+ clearHover(): void;
106
+ getPlotRect(): ChartRect | null;
107
+ toPixel(x: number, y: number): {
108
+ x: number;
109
+ y: number;
110
+ } | null;
111
+ fromPixel(x: number, y: number): {
112
+ x: number;
113
+ y: number;
114
+ } | null;
115
+ on<K extends keyof ChartControllerEventMap>(type: K, listener: (event: ChartControllerEventMap[K]) => void): () => void;
116
+ destroy(): void;
117
+ }
118
+ export declare const createChartController: (config: ChartControllerConfig) => ChartController;
119
+ /** A polyline (pixels of the chart): interleaved x, y */
120
+ export interface ChartLinePrimitive {
121
+ kind: "line";
122
+ seriesIndex: number;
123
+ color: string;
124
+ width: number;
125
+ /** Runs of points without gaps */
126
+ segments: number[][];
127
+ }
128
+ export interface ChartAreaPrimitive {
129
+ kind: "area";
130
+ seriesIndex: number;
131
+ color: string;
132
+ opacity: number;
133
+ /** Y pixel of the baseline */
134
+ baseline: number;
135
+ segments: number[][];
136
+ }
137
+ export interface ChartBarPrimitive {
138
+ kind: "bars";
139
+ seriesIndex: number;
140
+ color: string;
141
+ /** Interleaved x, y, width, height */
142
+ rects: number[];
143
+ }
144
+ export interface ChartDotPrimitive {
145
+ kind: "dots";
146
+ seriesIndex: number;
147
+ opacity: number;
148
+ /** Interleaved x, y, diameter */
149
+ dots: number[];
150
+ /** CSS color of every dot */
151
+ colors: string[];
152
+ }
153
+ export type ChartPrimitive = ChartLinePrimitive | ChartAreaPrimitive | ChartBarPrimitive | ChartDotPrimitive;
154
+ export interface ChartPrimitiveOptions {
155
+ /**
156
+ * Upper bound of the dots drawn per series: above it the dots are merged
157
+ * into one per occupied cell of their size
158
+ * @default 4000
159
+ */
160
+ maxDots?: number;
161
+ /**
162
+ * Upper bound of the bars drawn per series: above it neighboring bars
163
+ * sharing a pixel column are merged
164
+ * @default 2000
165
+ */
166
+ maxBars?: number;
167
+ /**
168
+ * Width in pixels of the columns lines are decimated to (at most four
169
+ * points per column); larger values mean fewer shapes
170
+ * @default 1
171
+ */
172
+ columnWidth?: number;
173
+ /** Size of the cells dots are merged into (the dot size by default) */
174
+ dotCell?: number;
175
+ }
176
+ /**
177
+ * Data of a scene as simple shapes in pixels of the chart, for hosts
178
+ * without a canvas (React Native views, SVG): lines are decimated to a few
179
+ * points per pixel column and large point sets are merged per cell, so the
180
+ * number of shapes stays bounded by the size of the chart.
181
+ */
182
+ export declare const scenePrimitives: (scene: ChartScene, limits?: ChartPrimitiveOptions) => ChartPrimitive[];