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
@@ -1 +1 @@
1
- {"version":3,"file":"canvas2d.js","names":["SCATTER_PIXEL_THRESHOLD","rgba","c","alpha","unpack","packed","isGap","v","lowerBoundX","lo","hi","count","mid","points","value","createCanvas2dRenderer","ctx","canvas","scratch","mapper","frame","w","h","x","xScale","xOffset","y","yScale","yOffset","a","b","visiblePoints","item","m","x0","x1","start","end","result","decimateMinMax","GAP","drawLine","pen","i","length","drawArea","base","gradient","runStart","lastX","close","px","drawBars","half","r","y0","y1","cx","top","height","radius","drawScatterPixels","sctx","image","data","f","u","size","cy","s","g","py","o","da","outA","drawScatter","groups","list","stroke","color","width","items"],"sources":["../../../../../charts/src/engine/renderers/canvas2d.ts"],"sourcesContent":["// Canvas2D backend: the fallback without GPU. Lines are decimated to a few\n// points per pixel column and very large scatter sets are written pixel by\n// pixel, so it stays usable with large data sets.\n\nimport { decimateMinMax } from \"../decimate\";\nimport type { Rgba } from \"../color\";\nimport {\n GAP,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type ScatterItem,\n} from \"./types\";\n\n/** Scatter sets above this size are rasterized through ImageData */\nexport const SCATTER_PIXEL_THRESHOLD = 20000;\n\nconst rgba = (c: Rgba, alpha: number) =>\n `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${c[3] * alpha})`;\n\nconst unpack = (packed: number): Rgba => [\n (packed & 0xff) / 255,\n ((packed >>> 8) & 0xff) / 255,\n ((packed >>> 16) & 0xff) / 255,\n ((packed >>> 24) & 0xff) / 255,\n];\n\nconst isGap = (v: number) => !Number.isFinite(v) || Math.abs(v) >= GAP * 0.5;\n\n/** First point index whose relative x is >= value (sorted, interleaved) */\nconst lowerBoundX = (points: Float32Array, count: number, value: number) => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (points[mid * 2] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\nexport const createCanvas2dRenderer = (\n canvas: HTMLCanvasElement,\n): ChartRenderer | null => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n let scratch: HTMLCanvasElement | null = null;\n\n const mapper = (frame: RenderFrame) => {\n const { xScale, xOffset, yScale, yOffset } = frame.transform;\n const w = frame.width;\n const h = frame.height;\n return {\n px: (x: number) => ((x * xScale + xOffset) * 0.5 + 0.5) * w,\n py: (y: number) => (1 - ((y * yScale + yOffset) * 0.5 + 0.5)) * h,\n /** Visible relative x range */\n xRange: (): [number, number] => {\n const a = (-1 - xOffset) / xScale;\n const b = (1 - xOffset) / xScale;\n return a < b ? [a, b] : [b, a];\n },\n };\n };\n\n /** Points actually drawn: decimated when there are many per pixel */\n const visiblePoints = (\n item: Extract<RenderItem, { kind: \"line\" | \"area\" }>,\n frame: RenderFrame,\n ): { points: ArrayLike<number>; length: number } => {\n if (!item.sorted || item.count <= frame.width * 2) {\n return { points: item.points, length: item.count };\n }\n const m = mapper(frame);\n const [x0, x1] = m.xRange();\n const start = Math.max(0, lowerBoundX(item.points, item.count, x0) - 1);\n const end = Math.min(\n item.count,\n lowerBoundX(item.points, item.count, x1) + 1,\n );\n const result = decimateMinMax(item.points, start, end, m.px, GAP * 0.5);\n return { points: result.points, length: result.length };\n };\n\n const drawLine = (\n item: Extract<RenderItem, { kind: \"line\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const { points, length } = visiblePoints(item, frame);\n ctx.beginPath();\n let pen = false;\n for (let i = 0; i < length; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (isGap(x) || isGap(y)) {\n pen = false;\n continue;\n }\n if (pen) ctx.lineTo(m.px(x), m.py(y));\n else ctx.moveTo(m.px(x), m.py(y));\n pen = true;\n }\n ctx.lineWidth = item.width * frame.dpr;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.strokeStyle = rgba(item.color, 1);\n ctx.stroke();\n };\n\n const drawArea = (\n item: Extract<RenderItem, { kind: \"area\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const { points, length } = visiblePoints(item, frame);\n const base = m.py(item.baseline);\n const gradient = ctx.createLinearGradient(0, 0, 0, base);\n gradient.addColorStop(0, rgba(item.color, item.opacity));\n gradient.addColorStop(1, rgba(item.color, item.opacity * 0.3));\n ctx.fillStyle = gradient;\n ctx.beginPath();\n let runStart = -1;\n let lastX = 0;\n const close = () => {\n if (runStart < 0) return;\n ctx.lineTo(lastX, base);\n ctx.closePath();\n runStart = -1;\n };\n for (let i = 0; i < length; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (isGap(x) || isGap(y)) {\n close();\n continue;\n }\n const px = m.px(x);\n if (runStart < 0) {\n runStart = i;\n ctx.moveTo(px, base);\n }\n ctx.lineTo(px, m.py(y));\n lastX = px;\n }\n close();\n ctx.fill();\n };\n\n const drawBars = (\n item: Extract<RenderItem, { kind: \"bar\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const half = Math.max(\n Math.abs(item.halfWidth * frame.transform.xScale) * 0.5 * frame.width,\n 0.5,\n );\n const r = item.radius * frame.dpr;\n ctx.fillStyle = rgba(item.color, 1);\n ctx.beginPath();\n const v = item.instances;\n for (let i = 0; i < item.count; i++) {\n const x = v[i * 3];\n const y0 = v[i * 3 + 1];\n const y1 = v[i * 3 + 2];\n if (isGap(x) || isGap(y0) || isGap(y1)) continue;\n const cx = m.px(x);\n const a = m.py(y0);\n const b = m.py(y1);\n const top = Math.min(a, b);\n const height = Math.abs(a - b);\n const radius = Math.min(r, half, height / 2);\n if (radius > 0.5 && typeof ctx.roundRect === \"function\") {\n ctx.roundRect(cx - half, top, half * 2, height, radius);\n } else {\n ctx.rect(cx - half, top, half * 2, height);\n }\n }\n ctx.fill();\n };\n\n const drawScatterPixels = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = canvas.width;\n const h = canvas.height;\n scratch ??= document.createElement(\"canvas\");\n scratch.width = w;\n scratch.height = h;\n const sctx = scratch.getContext(\"2d\");\n if (!sctx) return;\n const image = sctx.createImageData(w, h);\n const data = image.data;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const s = Math.max(1, Math.round(size * frame.dpr * 0.8));\n const x0 = Math.round(cx - s / 2);\n const y0 = Math.round(cy - s / 2);\n const packed = u[i * 4 + 3];\n const alpha =\n (((packed >>> 24) & 0xff) / 255) * Math.max(item.opacity, 0.6);\n const r = packed & 0xff;\n const g = (packed >>> 8) & 0xff;\n const b = (packed >>> 16) & 0xff;\n for (let py = Math.max(0, y0); py < Math.min(h, y0 + s); py++) {\n for (let px = Math.max(0, x0); px < Math.min(w, x0 + s); px++) {\n const o = (py * w + px) * 4;\n const da = data[o + 3] / 255;\n const outA = alpha + da * (1 - alpha);\n // straight-alpha \"over\"\n data[o] = (r * alpha + data[o] * da * (1 - alpha)) / outA;\n data[o + 1] = (g * alpha + data[o + 1] * da * (1 - alpha)) / outA;\n data[o + 2] = (b * alpha + data[o + 2] * da * (1 - alpha)) / outA;\n data[o + 3] = outA * 255;\n }\n }\n }\n sctx.putImageData(image, 0, 0);\n ctx.drawImage(scratch, 0, 0);\n };\n\n const drawScatter = (item: ScatterItem, frame: RenderFrame) => {\n if (item.count > SCATTER_PIXEL_THRESHOLD) {\n drawScatterPixels(item, frame);\n return;\n }\n const m = mapper(frame);\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n const groups = new Map<number, number[]>();\n for (let i = 0; i < item.count; i++) {\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(i);\n }\n const stroke = item.stroke * frame.dpr;\n for (const [packed, list] of groups) {\n const color = unpack(packed);\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const r = (size * frame.dpr) / 2;\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.fillStyle = rgba(color, item.opacity);\n ctx.fill();\n if (stroke > 0) {\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const r = Math.max(0, (size * frame.dpr) / 2 - stroke / 2);\n const cx = m.px(x);\n const cy = m.py(y);\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.lineWidth = stroke;\n ctx.strokeStyle = rgba(color, 1);\n ctx.stroke();\n }\n }\n };\n\n return {\n kind: \"canvas2d\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n for (const item of items) {\n switch (item.kind) {\n case \"line\":\n if (item.count > 1) drawLine(item, frame);\n break;\n case \"area\":\n if (item.count > 1) drawArea(item, frame);\n break;\n case \"bar\":\n drawBars(item, frame);\n break;\n default:\n drawScatter(item, frame);\n break;\n }\n }\n },\n destroy() {\n scratch = null;\n canvas.width = 0;\n canvas.height = 0;\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"canvas2d.js","names":["SCATTER_PIXEL_THRESHOLD","rgba","c","alpha","unpack","packed","isGap","v","lowerBoundX","lo","hi","count","mid","points","value","createCanvas2dPainter","scratch","mapper","frame","w","h","x","xScale","xOffset","y","yScale","yOffset","a","b","visiblePoints","item","m","x0","x1","start","end","result","decimateMinMax","GAP","drawLine","pen","i","length","ctx","drawArea","base","gradient","runStart","lastX","close","px","drawBars","half","r","y0","y1","cx","top","height","radius","drawScatterCells","f","u","cell","cols","rows","owner","cy","groups","list","cells","drawScatterPixels","scratchCanvas","sctx","image","data","size","s","g","py","o","da","outA","drawScatter","stroke","color","left","items","createCanvas2dRenderer","canvas","painter","width"],"sources":["../../../../../charts/src/engine/renderers/canvas2d.ts"],"sourcesContent":["// Canvas2D backend: the fallback without GPU. Lines are decimated to a few\n// points per pixel column and very large scatter sets are written pixel by\n// pixel, so it stays usable with large data sets.\n\nimport { decimateMinMax } from \"../decimate\";\nimport type { Rgba } from \"../color\";\nimport {\n GAP,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type ScatterItem,\n} from \"./types\";\n\n/** Scatter sets above this size are rasterized through ImageData */\nexport const SCATTER_PIXEL_THRESHOLD = 20000;\n\nconst rgba = (c: Rgba, alpha: number) =>\n `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${c[3] * alpha})`;\n\nconst unpack = (packed: number): Rgba => [\n (packed & 0xff) / 255,\n ((packed >>> 8) & 0xff) / 255,\n ((packed >>> 16) & 0xff) / 255,\n ((packed >>> 24) & 0xff) / 255,\n];\n\nconst isGap = (v: number) => !Number.isFinite(v) || Math.abs(v) >= GAP * 0.5;\n\n/** First point index whose relative x is >= value (sorted, interleaved) */\nconst lowerBoundX = (points: Float32Array, count: number, value: number) => {\n let lo = 0;\n let hi = count;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (points[mid * 2] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n};\n\nexport interface Canvas2dPainter {\n /**\n * Draws the items in a `frame.width` x `frame.height` device-pixel area\n * whose top-left corner is at (`left`, `top`) device pixels; nothing is\n * cleared\n */\n paint(\n items: readonly RenderItem[],\n frame: RenderFrame,\n left?: number,\n top?: number,\n ): void;\n destroy(): void;\n}\n\n/**\n * Data layer drawn with any 2D context (browser canvases, mini-program\n * canvases, OffscreenCanvas). `scratchCanvas` creates the canvas used to\n * rasterize very large scatter sets; without it they are drawn as one\n * square per occupied pixel cell.\n */\nexport const createCanvas2dPainter = (\n ctx: CanvasRenderingContext2D,\n scratchCanvas?: () => HTMLCanvasElement | null,\n): Canvas2dPainter => {\n let scratch: HTMLCanvasElement | null = null;\n\n const mapper = (frame: RenderFrame) => {\n const { xScale, xOffset, yScale, yOffset } = frame.transform;\n const w = frame.width;\n const h = frame.height;\n return {\n px: (x: number) => ((x * xScale + xOffset) * 0.5 + 0.5) * w,\n py: (y: number) => (1 - ((y * yScale + yOffset) * 0.5 + 0.5)) * h,\n /** Visible relative x range */\n xRange: (): [number, number] => {\n const a = (-1 - xOffset) / xScale;\n const b = (1 - xOffset) / xScale;\n return a < b ? [a, b] : [b, a];\n },\n };\n };\n\n /** Points actually drawn: decimated when there are many per pixel */\n const visiblePoints = (\n item: Extract<RenderItem, { kind: \"line\" | \"area\" }>,\n frame: RenderFrame,\n ): { points: ArrayLike<number>; length: number } => {\n if (!item.sorted || item.count <= frame.width * 2) {\n return { points: item.points, length: item.count };\n }\n const m = mapper(frame);\n const [x0, x1] = m.xRange();\n const start = Math.max(0, lowerBoundX(item.points, item.count, x0) - 1);\n const end = Math.min(\n item.count,\n lowerBoundX(item.points, item.count, x1) + 1,\n );\n const result = decimateMinMax(item.points, start, end, m.px, GAP * 0.5);\n return { points: result.points, length: result.length };\n };\n\n const drawLine = (\n item: Extract<RenderItem, { kind: \"line\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const { points, length } = visiblePoints(item, frame);\n ctx.beginPath();\n let pen = false;\n for (let i = 0; i < length; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (isGap(x) || isGap(y)) {\n pen = false;\n continue;\n }\n if (pen) ctx.lineTo(m.px(x), m.py(y));\n else ctx.moveTo(m.px(x), m.py(y));\n pen = true;\n }\n ctx.lineWidth = item.width * frame.dpr;\n ctx.lineJoin = \"round\";\n ctx.lineCap = \"round\";\n ctx.strokeStyle = rgba(item.color, 1);\n ctx.stroke();\n };\n\n const drawArea = (\n item: Extract<RenderItem, { kind: \"area\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const { points, length } = visiblePoints(item, frame);\n const base = m.py(item.baseline);\n const gradient = ctx.createLinearGradient(0, 0, 0, base);\n gradient.addColorStop(0, rgba(item.color, item.opacity));\n gradient.addColorStop(1, rgba(item.color, item.opacity * 0.3));\n ctx.fillStyle = gradient;\n ctx.beginPath();\n let runStart = -1;\n let lastX = 0;\n const close = () => {\n if (runStart < 0) return;\n ctx.lineTo(lastX, base);\n ctx.closePath();\n runStart = -1;\n };\n for (let i = 0; i < length; i++) {\n const x = points[i * 2];\n const y = points[i * 2 + 1];\n if (isGap(x) || isGap(y)) {\n close();\n continue;\n }\n const px = m.px(x);\n if (runStart < 0) {\n runStart = i;\n ctx.moveTo(px, base);\n }\n ctx.lineTo(px, m.py(y));\n lastX = px;\n }\n close();\n ctx.fill();\n };\n\n const drawBars = (\n item: Extract<RenderItem, { kind: \"bar\" }>,\n frame: RenderFrame,\n ) => {\n const m = mapper(frame);\n const half = Math.max(\n Math.abs(item.halfWidth * frame.transform.xScale) * 0.5 * frame.width,\n 0.5,\n );\n const r = item.radius * frame.dpr;\n ctx.fillStyle = rgba(item.color, 1);\n ctx.beginPath();\n const v = item.instances;\n for (let i = 0; i < item.count; i++) {\n const x = v[i * 3];\n const y0 = v[i * 3 + 1];\n const y1 = v[i * 3 + 2];\n if (isGap(x) || isGap(y0) || isGap(y1)) continue;\n const cx = m.px(x);\n const a = m.py(y0);\n const b = m.py(y1);\n const top = Math.min(a, b);\n const height = Math.abs(a - b);\n const radius = Math.min(r, half, height / 2);\n if (radius > 0.5 && typeof ctx.roundRect === \"function\") {\n ctx.roundRect(cx - half, top, half * 2, height, radius);\n } else {\n ctx.rect(cx - half, top, half * 2, height);\n }\n }\n ctx.fill();\n };\n\n /** One square per occupied cell (the last point of a cell wins, like the GPU) */\n const drawScatterCells = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n let cell = 0;\n for (let i = 0; i < Math.min(item.count, 64); i++)\n cell = Math.max(cell, f[i * 4 + 2]);\n cell = Math.max(1, Math.round((cell || 2) * frame.dpr * 0.8));\n const cols = Math.ceil(w / cell);\n const rows = Math.ceil(h / cell);\n const owner = new Int32Array(cols * rows).fill(-1);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n if (isGap(x) || isGap(y) || !(f[i * 4 + 2] > 0)) continue;\n const cx = Math.floor(m.px(x) / cell);\n const cy = Math.floor(m.py(y) / cell);\n if (cx < 0 || cy < 0 || cx >= cols || cy >= rows) continue;\n owner[cy * cols + cx] = i;\n }\n const groups = new Map<number, number[]>();\n for (let c = 0; c < owner.length; c++) {\n const i = owner[c];\n if (i < 0) continue;\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(c);\n }\n for (const [packed, cells] of groups) {\n ctx.fillStyle = rgba(unpack(packed), Math.max(item.opacity, 0.6));\n for (const c of cells) {\n ctx.fillRect(\n (c % cols) * cell,\n Math.floor(c / cols) * cell,\n cell,\n cell,\n );\n }\n }\n };\n\n const drawScatterPixels = (item: ScatterItem, frame: RenderFrame) => {\n const m = mapper(frame);\n const w = frame.width;\n const h = frame.height;\n scratch ??= scratchCanvas?.() ?? null;\n if (!scratch) {\n drawScatterCells(item, frame);\n return;\n }\n scratch.width = w;\n scratch.height = h;\n const sctx = scratch.getContext(\"2d\");\n if (!sctx) return;\n const image = sctx.createImageData(w, h);\n const data = image.data;\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n for (let i = 0; i < item.count; i++) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const s = Math.max(1, Math.round(size * frame.dpr * 0.8));\n const x0 = Math.round(cx - s / 2);\n const y0 = Math.round(cy - s / 2);\n const packed = u[i * 4 + 3];\n const alpha =\n (((packed >>> 24) & 0xff) / 255) * Math.max(item.opacity, 0.6);\n const r = packed & 0xff;\n const g = (packed >>> 8) & 0xff;\n const b = (packed >>> 16) & 0xff;\n for (let py = Math.max(0, y0); py < Math.min(h, y0 + s); py++) {\n for (let px = Math.max(0, x0); px < Math.min(w, x0 + s); px++) {\n const o = (py * w + px) * 4;\n const da = data[o + 3] / 255;\n const outA = alpha + da * (1 - alpha);\n // straight-alpha \"over\"\n data[o] = (r * alpha + data[o] * da * (1 - alpha)) / outA;\n data[o + 1] = (g * alpha + data[o + 1] * da * (1 - alpha)) / outA;\n data[o + 2] = (b * alpha + data[o + 2] * da * (1 - alpha)) / outA;\n data[o + 3] = outA * 255;\n }\n }\n }\n sctx.putImageData(image, 0, 0);\n ctx.drawImage(scratch, 0, 0);\n };\n\n const drawScatter = (item: ScatterItem, frame: RenderFrame) => {\n if (item.count > SCATTER_PIXEL_THRESHOLD) {\n drawScatterPixels(item, frame);\n return;\n }\n const m = mapper(frame);\n const f = new Float32Array(item.instances, 0, item.count * 4);\n const u = new Uint32Array(item.instances, 0, item.count * 4);\n const groups = new Map<number, number[]>();\n for (let i = 0; i < item.count; i++) {\n const packed = u[i * 4 + 3];\n let list = groups.get(packed);\n if (!list) groups.set(packed, (list = []));\n list.push(i);\n }\n const stroke = item.stroke * frame.dpr;\n for (const [packed, list] of groups) {\n const color = unpack(packed);\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const cx = m.px(x);\n const cy = m.py(y);\n const r = (size * frame.dpr) / 2;\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.fillStyle = rgba(color, item.opacity);\n ctx.fill();\n if (stroke > 0) {\n ctx.beginPath();\n for (const i of list) {\n const x = f[i * 4];\n const y = f[i * 4 + 1];\n const size = f[i * 4 + 2];\n if (isGap(x) || isGap(y) || !(size > 0)) continue;\n const r = Math.max(0, (size * frame.dpr) / 2 - stroke / 2);\n const cx = m.px(x);\n const cy = m.py(y);\n ctx.moveTo(cx + r, cy);\n ctx.arc(cx, cy, r, 0, Math.PI * 2);\n }\n ctx.lineWidth = stroke;\n ctx.strokeStyle = rgba(color, 1);\n ctx.stroke();\n }\n }\n };\n\n return {\n paint(items, frame, left = 0, top = 0) {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, left, top);\n ctx.beginPath();\n ctx.rect(0, 0, frame.width, frame.height);\n ctx.clip();\n for (const item of items) {\n switch (item.kind) {\n case \"line\":\n if (item.count > 1) drawLine(item, frame);\n break;\n case \"area\":\n if (item.count > 1) drawArea(item, frame);\n break;\n case \"bar\":\n drawBars(item, frame);\n break;\n default:\n drawScatter(item, frame);\n break;\n }\n }\n ctx.restore();\n },\n destroy() {\n scratch = null;\n },\n };\n};\n\nexport const createCanvas2dRenderer = (\n canvas: HTMLCanvasElement,\n): ChartRenderer | null => {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return null;\n const painter = createCanvas2dPainter(ctx, () =>\n typeof document === \"undefined\" ? null : document.createElement(\"canvas\"),\n );\n return {\n kind: \"canvas2d\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n painter.paint(items, frame);\n },\n destroy() {\n painter.destroy();\n canvas.width = 0;\n canvas.height = 0;\n },\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./layout.cjs"),r=require("./model.cjs"),i=require("./axis.cjs");var a={top:12,right:16,bottom:4,left:4},o=(e,t)=>t,s=(e,n)=>{let r=n.resolve??o;return(e??[]).map(e=>{if(e.type===`rect`){let i=e.color?r(e.color,n.primary):n.primary;return{type:`rect`,x0:e.x0,x1:e.x1,y0:e.y0,y1:e.y1,color:i,opacity:e.opacity??.08,label:e.label,labelPosition:e.labelPosition??`top-left`,labelColor:e.labelColor?r(e.labelColor,i):t.mix(i,n.text,.2)}}return e.type===`text`?{type:`text`,x:e.x,y:e.y,text:e.text,anchor:e.anchor??`center`,color:e.color?r(e.color,n.textMuted):n.textMuted,weight:e.weight??500}:{type:`line`,axis:e.axis,value:e.value,color:e.color?r(e.color,n.textMuted):n.textMuted,width:e.width??1,dash:[...e.dash??[4,4]],label:e.label}})},c=e=>{let{model:t,view:r,theme:o,width:s,height:c,measure:l}=e,u=t.y.tickCount??(c>=220?5:Math.max(2,Math.round((c-48)/52))),d=i.axisTicks(t.y,r.y,u),f=0;if(t.y.visible)for(let e of d.labels)f=Math.max(f,l(e));let p=48;if(t.x.type===`category`){p=0;let e=Math.max(1,Math.floor(t.x.categories.length/200));for(let n=0;n<t.x.categories.length;n+=e)p=Math.max(p,l(t.x.categories[n]))}let m={...a,...e.padding},h=n.computePlot({width:s,height:c,padding:m,yLabelWidth:t.y.visible?Math.ceil(f):0,xAxisVisible:t.x.visible,xTitle:!!t.x.title&&t.x.visible,yTitle:!!t.y.title&&t.y.visible,fontSize:o.fontSize});e.top&&(h.y+=e.top);let g=t.x.type===`category`?Math.max(1,Math.floor(h.width/(p+14))):t.x.tickCount??Math.max(2,Math.floor(h.width/96)),_=i.axisTicks(t.x,r.x,g);return{plot:h,scales:n.createScales(h,r,t.x.reverse,t.y.reverse),xTicks:_,yTicks:d}},l=(e,t,n)=>{let r=[];for(let i of e.series){if(i.hidden||i.type!==`scatter`||!i.showLabels)continue;let{x:e,y:a,count:o,labels:s,size:c}=i.cols;if(s)for(let l=0;l<o&&r.length<300;l++){let o=s[l];if(!o)continue;let u=e[l],d=a[l];if(u<t.x[0]||u>t.x[1]||d<t.y[0]||d>t.y[1])continue;let f=c&&c[l]>0?c[l]:i.pointSize;r.push({x:n.xToPx(u),y:n.yToPx(d),r:f/2,text:o})}}return r},u=(e,t,n)=>{let r=e.cols.x[t]+(e.type===`bar`?e.barOffset:0),i=e.type===`bar`&&e.barTop?e.barTop[t]:e.cols.y[t];return{px:n.xToPx(r),py:n.yToPx(i)}},d=(e,t,n,r,i)=>{let a=u(e,t,i),o=!1;if(e.type===`bar`&&e.barBase){let s=e.barHalfWidth/i.xPerPx,c=i.yToPx(e.barBase[t]);o=Math.abs(n-a.px)<=s&&r>=Math.min(c,a.py)-2&&r<=Math.max(c,a.py)+2}return{series:e,index:t,px:a.px,py:a.py,dx:Math.abs(i.xToPx(e.cols.x[t])-n),dist:o?0:Math.hypot(a.px-n,a.py-r),inside:o}},f=(e,t)=>e.cols.size&&e.cols.size[t]>0?e.cols.size[t]:e.pointSize,p=(e,t,n,i,a)=>{let o=Math.max(e.pointSize/2+6,10)+a,s=i.pxToX(t),c=i.pxToY(n),l=o*i.xPerPx,u=o*i.yPerPx,d=-1,p=1/0,{x:m,y:h}=e.cols;return r.gridOf(e).query(s-l,s+l,c-u,c+u,r=>{let o=Math.hypot(i.xToPx(m[r])-t,i.yToPx(h[r])-n);o<=Math.max(f(e,r)/2+4,8)+a&&o<=p&&(p=o,d=r)}),d},m=(t,n)=>{let{x:r,y:i,count:a,sorted:o}=t.cols;if(o)return e.nearestIndex(r,i,a,n);let s=-1,c=1/0;for(let e=0;e<a;e++){if(!Number.isFinite(i[e]))continue;let t=Math.abs(r[e]-n);t<c&&(c=t,s=e)}return s},h=(e,n)=>{let r=e.pointColors?.[n],i=e.cols.labels?.[n];return{seriesIndex:e.index,seriesId:e.id,seriesName:e.name,index:n,x:e.cols.x[n],y:e.cols.y[n],color:r?t.toCss(r):e.colorCss,...i===void 0?{}:{label:i}}},g=(e,t)=>{if(!e.length)return null;e.sort((e,t)=>e.series.index-t.series.index);let n=e.map(e=>h(e.series,e.index)),r=n[0].x;return{items:n,x:r,xLabel:t?.formatValue(r)??String(r)}},_=(e,t,n,r,i,a=0)=>{let{plot:o}=t,s=6+a;if(r<o.x-s||r>o.x+o.width+s||i<o.y-s||i>o.y+o.height+s)return null;let c=t.pxToX(r),l=[],u=[];for(let n of e.series)if(!(n.hidden||n.cols.count===0)){if(n.type===`scatter`){let e=p(n,r,i,t,a);e>=0&&l.push(d(n,e,r,i,t))}else{let e=m(n,c);e>=0&&u.push(d(n,e,r,i,t))}}if(e.tooltipMode===`nearest`){let e=[...l,...u].filter(e=>e.inside||e.series.type===`scatter`||e.dist<=32+a);return e.length?g([e.reduce((e,t)=>t.dist<=e.dist?t:e)],n):null}if(!u.length)return l.length?g([l.reduce((e,t)=>t.dist<=e.dist?t:e)],n):null;let f=Math.min(...u.map(e=>e.dx)),_=e.x.type===`category`?.5/t.xPerPx:0,v=u.filter(e=>e.dx<=f+Math.max(1,_)),y=v.reduce((e,t)=>t.dx<e.dx?t:e),b=g([y,...v.filter(e=>e!==y),...l],n);return b&&(b.x=h(y.series,y.index).x,b.xLabel=n?.formatValue(b.x)??String(b.x)),b},v=(e,t)=>e===t||!!e&&!!t&&e.items.length===t.items.length&&e.items.every((e,n)=>e.index===t.items[n].index&&e.seriesIndex===t.items[n].seriesIndex),y=(e,t,n)=>{let r=n?.formatValue??String;if(t.items.every(t=>e.series[t.seriesIndex].type===`scatter`)&&t.items.length===1){let n=t.items[0],i=[{color:null,name:e.x.title??`x`,value:t.xLabel},{color:null,name:e.y.title??`y`,value:r(n.y)}];return n.label!==void 0&&e.series.length>1&&i.push({color:null,name:``,value:n.seriesName}),{title:n.label??n.seriesName,titleColor:n.color,rows:i}}return{title:t.xLabel,titleColor:null,rows:t.items.map(e=>({color:e.color,name:e.label?`${e.seriesName} · ${e.label}`:e.seriesName,value:r(e.y)}))}},b=(e,t,n)=>{let r=[],{plot:i}=t;for(let a of n.items){let n=e.series[a.seriesIndex];if(n.type===`bar`&&n.barBase&&n.barTop){let e=t.xToPx(a.x+n.barOffset),i=Math.max(n.barHalfWidth/t.xPerPx,1),o=t.yToPx(n.barBase[a.index]),s=t.yToPx(n.barTop[a.index]);r.push({kind:`bar`,x:e-i,y:Math.min(o,s),width:i*2,height:Math.max(1,Math.abs(o-s))});continue}let o=t.xToPx(a.x),s=t.yToPx(a.y);if(o<i.x-1||o>i.x+i.width+1||s<i.y-1||s>i.y+i.height+1)continue;let c=n.type===`scatter`?f(n,a.index)+6:Math.max(10,n.lineWidth*2+6);r.push({kind:`dot`,x:o,y:s,size:c,color:a.color})}return r},x=(e,t,n)=>n??(e.tooltipMode===`axis`&&t.items.some(t=>e.series[t.seriesIndex].type!==`scatter`));exports.DEFAULT_PADDING=a,exports.collectPointLabels=l,exports.dotSize=f,exports.fallbackResolve=o,exports.hitTest=_,exports.hoverItemOf=h,exports.hoverMarks=b,exports.layoutChart=c,exports.pointOf=u,exports.resolveAnnotations=s,exports.sameHover=v,exports.showsCrosshair=x,exports.tooltipContent=y;
2
+ //# sourceMappingURL=scene.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","nearestIndex","toCss","require_data","require_color","require_layout","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","annotations","a","color","layoutChart","input","yCount","model","height","yTicks","view","yLabelWidth","label","measure","categoryWidth","step","i","padding","plot","xCount","xTicks","collectPointLabels","labels","series","texts","count","text","xi","x","yi","y","d","size","s","pointOf","xv","yv","sc","candidateOf","p","inside","half","base","px","py","dotSize","nearestScatter","radius","slop","rx","ry","best","bestDist","nearestX","sorted","bestD","hoverItemOf","pc","index","eventOf","candidates","b","items","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","tooltipContent","yFormat","rows","hoverMarks","marks","cx","showsCrosshair","crosshair"],"sources":["../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { mix, toCss, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { computePlot, createScales, type Rect, type Scales } from \"./layout\";\nimport { gridOf, type ChartModel, type SeriesModel } from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAnnotation,\n ChartHoverEvent,\n ChartHoverItem,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/** Annotation colors resolved against the theme */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: a.x0,\n x1: a.x1,\n y0: a.y0,\n y1: a.y1,\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: a.x,\n y: a.y,\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.value,\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts\n const yCount =\n model.y.tickCount ??\n (height >= 220 ? 5 : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(2, Math.floor(plot.width / 96)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks };\n};\n\n/** Labels of the visible scatter points (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n for (const series of model.series) {\n if (series.hidden || series.type !== \"scatter\" || !series.showLabels)\n continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n labels.push({ x: s.xToPx(xi), y: s.yToPx(yi), r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n dx: number;\n dist: number;\n inside: boolean;\n}\n\n/** Pixel position of a point (the top of a bar) */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const xv = s.cols.x[i] + (s.type === \"bar\" ? s.barOffset : 0);\n const yv = s.type === \"bar\" && s.barTop ? s.barTop[i] : s.cols.y[i];\n return { px: sc.xToPx(xv), py: sc.yToPx(yv) };\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n let inside = false;\n if (s.type === \"bar\" && s.barBase) {\n const half = s.barHalfWidth / sc.xPerPx;\n const base = sc.yToPx(s.barBase[i]);\n inside =\n Math.abs(px - p.px) <= half &&\n py >= Math.min(base, p.py) - 2 &&\n py <= Math.max(base, p.py) + 2;\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - px),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(s.pointSize / 2 + 6, 10) + slop;\n const xv = sc.pxToX(px);\n const yv = sc.pxToY(py);\n const rx = radius * sc.xPerPx;\n const ry = radius * sc.yPerPx;\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(xv - rx, xv + rx, yv - ry, yv + ry, (i) => {\n const d = Math.hypot(sc.xToPx(x[i]) - px, sc.yToPx(y[i]) - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const label = s.cols.labels?.[index];\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.cols.x[index],\n y: s.cols.y[index],\n color: pc ? toCss(pc) : s.colorCss,\n ...(label !== undefined ? { label } : {}),\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => hoverItemOf(c.series, c.index));\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const xv = sc.pxToX(px);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else {\n const i = nearestX(s, xv);\n if (i >= 0) others.push(candidateOf(s, i, px, py, sc));\n }\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / sc.xPerPx : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point) */\n titleColor: string | null;\n rows: TooltipRow[];\n}\n\n/** Default tooltip content of a hover payload */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? \"x\", value: event.xLabel },\n { color: null, name: model.y.title ?? \"y\", value: yFormat(it.y) },\n ];\n if (it.label !== undefined && model.series.length > 1)\n rows.push({ color: null, name: \"\", value: it.seriesName });\n return { title: it.label ?? it.seriesName, titleColor: it.color, rows };\n }\n return {\n title: event.xLabel,\n titleColor: null,\n rows: event.items.map((it) => ({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: yFormat(it.y),\n })),\n };\n};\n\n/** Shape of the hover marker of an item: a ring on a point, or a bar highlight */\nexport type HoverMark =\n | { kind: \"dot\"; x: number; y: number; size: number; color: string }\n | { kind: \"bar\"; x: number; y: number; width: number; height: number };\n\n/** Markers of the hovered points (pixels of the stage) */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const cx = sc.xToPx(it.x + s.barOffset);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 1);\n const a = sc.yToPx(s.barBase[it.index]);\n const b = sc.yToPx(s.barTop[it.index]);\n marks.push({\n kind: \"bar\",\n x: cx - half,\n y: Math.min(a, b),\n width: half * 2,\n height: Math.max(1, Math.abs(a - b)),\n });\n continue;\n }\n const px = sc.xToPx(it.x);\n const py = sc.yToPx(it.y);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 6\n : Math.max(10, s.lineWidth * 2 + 6);\n marks.push({ kind: \"dot\", x: px, y: py, size, color: it.color });\n }\n return marks;\n};\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => model.series[it.seriesIndex].type !== \"scatter\"));\n"],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { AxisTicks } from './axis.cjs';
2
+ import { Rgba } from './color.cjs';
3
+ import { Rect, Scales } from './layout.cjs';
4
+ import { ChartModel, SeriesModel } from './model.cjs';
5
+ import { PointLabel, ResolvedAnnotation } from './overlay.cjs';
6
+ import { ChartTheme } from './theme.cjs';
7
+ import { ChartAnnotation, ChartHoverEvent, ChartHoverItem, ChartPadding, ChartView } from './types.cjs';
8
+ export declare const MAX_POINT_LABELS = 300;
9
+ export declare const DEFAULT_PADDING: {
10
+ top: number;
11
+ right: number;
12
+ bottom: number;
13
+ left: number;
14
+ };
15
+ export declare const fallbackResolve: (_value: string, fallback: Rgba) => Rgba;
16
+ /** Annotation colors resolved against the theme */
17
+ export declare const resolveAnnotations: (annotations: readonly ChartAnnotation[] | undefined, theme: ChartTheme) => ResolvedAnnotation[];
18
+ export interface ChartLayout {
19
+ plot: Rect;
20
+ scales: Scales;
21
+ xTicks: AxisTicks;
22
+ yTicks: AxisTicks;
23
+ }
24
+ export interface LayoutInput {
25
+ model: ChartModel;
26
+ view: ChartView;
27
+ theme: ChartTheme;
28
+ /** Size of the drawing area (legend excluded), CSS pixels */
29
+ width: number;
30
+ height: number;
31
+ padding?: ChartPadding;
32
+ /** Offset of the drawing area (e.g. below a legend) */
33
+ top?: number;
34
+ /** Width of a tick label in the theme font */
35
+ measure: (text: string) => number;
36
+ }
37
+ /** Ticks, room for the axes and the plot rectangle */
38
+ export declare const layoutChart: (input: LayoutInput) => ChartLayout;
39
+ /** Labels of the visible scatter points (`showLabels`) */
40
+ export declare const collectPointLabels: (model: ChartModel, view: ChartView, s: Scales) => PointLabel[];
41
+ /** Pixel position of a point (the top of a bar) */
42
+ export declare const pointOf: (s: SeriesModel, i: number, sc: Scales) => {
43
+ px: number;
44
+ py: number;
45
+ };
46
+ /** Diameter of a scatter dot */
47
+ export declare const dotSize: (s: SeriesModel, i: number) => number;
48
+ /** Hover payload item of a point */
49
+ export declare const hoverItemOf: (s: SeriesModel, index: number) => ChartHoverItem;
50
+ /**
51
+ * Points under a pixel of the stage: the nearest point (scatter / `nearest`
52
+ * tooltips) or every series at the nearest x (`axis` tooltips).
53
+ * `slop` widens the reach of the dots (touch screens).
54
+ */
55
+ export declare const hitTest: (model: ChartModel, sc: Scales, xTicks: AxisTicks | null, px: number, py: number, slop?: number) => ChartHoverEvent | null;
56
+ /** Whether two hover payloads point at the same points */
57
+ export declare const sameHover: (a: ChartHoverEvent | null, b: ChartHoverEvent | null) => boolean;
58
+ export interface TooltipRow {
59
+ /** Swatch color (CSS) */
60
+ color: string | null;
61
+ name: string;
62
+ value: string;
63
+ }
64
+ export interface TooltipContent {
65
+ title: string;
66
+ /** Swatch of the title (single scatter point) */
67
+ titleColor: string | null;
68
+ rows: TooltipRow[];
69
+ }
70
+ /** Default tooltip content of a hover payload */
71
+ export declare const tooltipContent: (model: ChartModel, event: ChartHoverEvent, yTicks: AxisTicks | null) => TooltipContent;
72
+ /** Shape of the hover marker of an item: a ring on a point, or a bar highlight */
73
+ export type HoverMark = {
74
+ kind: "dot";
75
+ x: number;
76
+ y: number;
77
+ size: number;
78
+ color: string;
79
+ } | {
80
+ kind: "bar";
81
+ x: number;
82
+ y: number;
83
+ width: number;
84
+ height: number;
85
+ };
86
+ /** Markers of the hovered points (pixels of the stage) */
87
+ export declare const hoverMarks: (model: ChartModel, sc: Scales, event: ChartHoverEvent) => HoverMark[];
88
+ /** Whether the guide line follows the pointer */
89
+ export declare const showsCrosshair: (model: ChartModel, event: ChartHoverEvent, crosshair: boolean | undefined) => boolean;
@@ -0,0 +1,89 @@
1
+ import { AxisTicks } from './axis.js';
2
+ import { Rgba } from './color.js';
3
+ import { Rect, Scales } from './layout.js';
4
+ import { ChartModel, SeriesModel } from './model.js';
5
+ import { PointLabel, ResolvedAnnotation } from './overlay.js';
6
+ import { ChartTheme } from './theme.js';
7
+ import { ChartAnnotation, ChartHoverEvent, ChartHoverItem, ChartPadding, ChartView } from './types.js';
8
+ export declare const MAX_POINT_LABELS = 300;
9
+ export declare const DEFAULT_PADDING: {
10
+ top: number;
11
+ right: number;
12
+ bottom: number;
13
+ left: number;
14
+ };
15
+ export declare const fallbackResolve: (_value: string, fallback: Rgba) => Rgba;
16
+ /** Annotation colors resolved against the theme */
17
+ export declare const resolveAnnotations: (annotations: readonly ChartAnnotation[] | undefined, theme: ChartTheme) => ResolvedAnnotation[];
18
+ export interface ChartLayout {
19
+ plot: Rect;
20
+ scales: Scales;
21
+ xTicks: AxisTicks;
22
+ yTicks: AxisTicks;
23
+ }
24
+ export interface LayoutInput {
25
+ model: ChartModel;
26
+ view: ChartView;
27
+ theme: ChartTheme;
28
+ /** Size of the drawing area (legend excluded), CSS pixels */
29
+ width: number;
30
+ height: number;
31
+ padding?: ChartPadding;
32
+ /** Offset of the drawing area (e.g. below a legend) */
33
+ top?: number;
34
+ /** Width of a tick label in the theme font */
35
+ measure: (text: string) => number;
36
+ }
37
+ /** Ticks, room for the axes and the plot rectangle */
38
+ export declare const layoutChart: (input: LayoutInput) => ChartLayout;
39
+ /** Labels of the visible scatter points (`showLabels`) */
40
+ export declare const collectPointLabels: (model: ChartModel, view: ChartView, s: Scales) => PointLabel[];
41
+ /** Pixel position of a point (the top of a bar) */
42
+ export declare const pointOf: (s: SeriesModel, i: number, sc: Scales) => {
43
+ px: number;
44
+ py: number;
45
+ };
46
+ /** Diameter of a scatter dot */
47
+ export declare const dotSize: (s: SeriesModel, i: number) => number;
48
+ /** Hover payload item of a point */
49
+ export declare const hoverItemOf: (s: SeriesModel, index: number) => ChartHoverItem;
50
+ /**
51
+ * Points under a pixel of the stage: the nearest point (scatter / `nearest`
52
+ * tooltips) or every series at the nearest x (`axis` tooltips).
53
+ * `slop` widens the reach of the dots (touch screens).
54
+ */
55
+ export declare const hitTest: (model: ChartModel, sc: Scales, xTicks: AxisTicks | null, px: number, py: number, slop?: number) => ChartHoverEvent | null;
56
+ /** Whether two hover payloads point at the same points */
57
+ export declare const sameHover: (a: ChartHoverEvent | null, b: ChartHoverEvent | null) => boolean;
58
+ export interface TooltipRow {
59
+ /** Swatch color (CSS) */
60
+ color: string | null;
61
+ name: string;
62
+ value: string;
63
+ }
64
+ export interface TooltipContent {
65
+ title: string;
66
+ /** Swatch of the title (single scatter point) */
67
+ titleColor: string | null;
68
+ rows: TooltipRow[];
69
+ }
70
+ /** Default tooltip content of a hover payload */
71
+ export declare const tooltipContent: (model: ChartModel, event: ChartHoverEvent, yTicks: AxisTicks | null) => TooltipContent;
72
+ /** Shape of the hover marker of an item: a ring on a point, or a bar highlight */
73
+ export type HoverMark = {
74
+ kind: "dot";
75
+ x: number;
76
+ y: number;
77
+ size: number;
78
+ color: string;
79
+ } | {
80
+ kind: "bar";
81
+ x: number;
82
+ y: number;
83
+ width: number;
84
+ height: number;
85
+ };
86
+ /** Markers of the hovered points (pixels of the stage) */
87
+ export declare const hoverMarks: (model: ChartModel, sc: Scales, event: ChartHoverEvent) => HoverMark[];
88
+ /** Whether the guide line follows the pointer */
89
+ export declare const showsCrosshair: (model: ChartModel, event: ChartHoverEvent, crosshair: boolean | undefined) => boolean;
@@ -0,0 +1,241 @@
1
+ import { nearestIndex as e } from "./data.js";
2
+ import { mix as t, toCss as n } from "./color.js";
3
+ import { computePlot as r, createScales as i } from "./layout.js";
4
+ import { gridOf as a } from "./model.js";
5
+ import { axisTicks as o } from "./axis.js";
6
+ var s = {
7
+ top: 12,
8
+ right: 16,
9
+ bottom: 4,
10
+ left: 4
11
+ }, c = (e, t) => t, l = (e, n) => {
12
+ let r = n.resolve ?? c;
13
+ return (e ?? []).map((e) => {
14
+ if (e.type === "rect") {
15
+ let i = e.color ? r(e.color, n.primary) : n.primary;
16
+ return {
17
+ type: "rect",
18
+ x0: e.x0,
19
+ x1: e.x1,
20
+ y0: e.y0,
21
+ y1: e.y1,
22
+ color: i,
23
+ opacity: e.opacity ?? .08,
24
+ label: e.label,
25
+ labelPosition: e.labelPosition ?? "top-left",
26
+ labelColor: e.labelColor ? r(e.labelColor, i) : t(i, n.text, .2)
27
+ };
28
+ }
29
+ return e.type === "text" ? {
30
+ type: "text",
31
+ x: e.x,
32
+ y: e.y,
33
+ text: e.text,
34
+ anchor: e.anchor ?? "center",
35
+ color: e.color ? r(e.color, n.textMuted) : n.textMuted,
36
+ weight: e.weight ?? 500
37
+ } : {
38
+ type: "line",
39
+ axis: e.axis,
40
+ value: e.value,
41
+ color: e.color ? r(e.color, n.textMuted) : n.textMuted,
42
+ width: e.width ?? 1,
43
+ dash: [...e.dash ?? [4, 4]],
44
+ label: e.label
45
+ };
46
+ });
47
+ }, u = (e) => {
48
+ let { model: t, view: n, theme: a, width: c, height: l, measure: u } = e, d = t.y.tickCount ?? (l >= 220 ? 5 : Math.max(2, Math.round((l - 48) / 52))), f = o(t.y, n.y, d), p = 0;
49
+ if (t.y.visible) for (let e of f.labels) p = Math.max(p, u(e));
50
+ let m = 48;
51
+ if (t.x.type === "category") {
52
+ m = 0;
53
+ let e = Math.max(1, Math.floor(t.x.categories.length / 200));
54
+ for (let n = 0; n < t.x.categories.length; n += e) m = Math.max(m, u(t.x.categories[n]));
55
+ }
56
+ let h = {
57
+ ...s,
58
+ ...e.padding
59
+ }, g = r({
60
+ width: c,
61
+ height: l,
62
+ padding: h,
63
+ yLabelWidth: t.y.visible ? Math.ceil(p) : 0,
64
+ xAxisVisible: t.x.visible,
65
+ xTitle: !!t.x.title && t.x.visible,
66
+ yTitle: !!t.y.title && t.y.visible,
67
+ fontSize: a.fontSize
68
+ });
69
+ e.top && (g.y += e.top);
70
+ let _ = t.x.type === "category" ? Math.max(1, Math.floor(g.width / (m + 14))) : t.x.tickCount ?? Math.max(2, Math.floor(g.width / 96)), v = o(t.x, n.x, _);
71
+ return {
72
+ plot: g,
73
+ scales: i(g, n, t.x.reverse, t.y.reverse),
74
+ xTicks: v,
75
+ yTicks: f
76
+ };
77
+ }, d = (e, t, n) => {
78
+ let r = [];
79
+ for (let i of e.series) {
80
+ if (i.hidden || i.type !== "scatter" || !i.showLabels) continue;
81
+ let { x: e, y: a, count: o, labels: s, size: c } = i.cols;
82
+ if (s) for (let l = 0; l < o && r.length < 300; l++) {
83
+ let o = s[l];
84
+ if (!o) continue;
85
+ let u = e[l], d = a[l];
86
+ if (u < t.x[0] || u > t.x[1] || d < t.y[0] || d > t.y[1]) continue;
87
+ let f = c && c[l] > 0 ? c[l] : i.pointSize;
88
+ r.push({
89
+ x: n.xToPx(u),
90
+ y: n.yToPx(d),
91
+ r: f / 2,
92
+ text: o
93
+ });
94
+ }
95
+ }
96
+ return r;
97
+ }, f = (e, t, n) => {
98
+ let r = e.cols.x[t] + (e.type === "bar" ? e.barOffset : 0), i = e.type === "bar" && e.barTop ? e.barTop[t] : e.cols.y[t];
99
+ return {
100
+ px: n.xToPx(r),
101
+ py: n.yToPx(i)
102
+ };
103
+ }, p = (e, t, n, r, i) => {
104
+ let a = f(e, t, i), o = !1;
105
+ if (e.type === "bar" && e.barBase) {
106
+ let s = e.barHalfWidth / i.xPerPx, c = i.yToPx(e.barBase[t]);
107
+ o = Math.abs(n - a.px) <= s && r >= Math.min(c, a.py) - 2 && r <= Math.max(c, a.py) + 2;
108
+ }
109
+ return {
110
+ series: e,
111
+ index: t,
112
+ px: a.px,
113
+ py: a.py,
114
+ dx: Math.abs(i.xToPx(e.cols.x[t]) - n),
115
+ dist: o ? 0 : Math.hypot(a.px - n, a.py - r),
116
+ inside: o
117
+ };
118
+ }, m = (e, t) => e.cols.size && e.cols.size[t] > 0 ? e.cols.size[t] : e.pointSize, h = (e, t, n, r, i) => {
119
+ let o = Math.max(e.pointSize / 2 + 6, 10) + i, s = r.pxToX(t), c = r.pxToY(n), l = o * r.xPerPx, u = o * r.yPerPx, d = -1, f = Infinity, { x: p, y: h } = e.cols;
120
+ return a(e).query(s - l, s + l, c - u, c + u, (a) => {
121
+ let o = Math.hypot(r.xToPx(p[a]) - t, r.yToPx(h[a]) - n);
122
+ o <= Math.max(m(e, a) / 2 + 4, 8) + i && o <= f && (f = o, d = a);
123
+ }), d;
124
+ }, g = (t, n) => {
125
+ let { x: r, y: i, count: a, sorted: o } = t.cols;
126
+ if (o) return e(r, i, a, n);
127
+ let s = -1, c = Infinity;
128
+ for (let e = 0; e < a; e++) {
129
+ if (!Number.isFinite(i[e])) continue;
130
+ let t = Math.abs(r[e] - n);
131
+ t < c && (c = t, s = e);
132
+ }
133
+ return s;
134
+ }, _ = (e, t) => {
135
+ let r = e.pointColors?.[t], i = e.cols.labels?.[t];
136
+ return {
137
+ seriesIndex: e.index,
138
+ seriesId: e.id,
139
+ seriesName: e.name,
140
+ index: t,
141
+ x: e.cols.x[t],
142
+ y: e.cols.y[t],
143
+ color: r ? n(r) : e.colorCss,
144
+ ...i === void 0 ? {} : { label: i }
145
+ };
146
+ }, v = (e, t) => {
147
+ if (!e.length) return null;
148
+ e.sort((e, t) => e.series.index - t.series.index);
149
+ let n = e.map((e) => _(e.series, e.index)), r = n[0].x;
150
+ return {
151
+ items: n,
152
+ x: r,
153
+ xLabel: t?.formatValue(r) ?? String(r)
154
+ };
155
+ }, y = (e, t, n, r, i, a = 0) => {
156
+ let { plot: o } = t, s = 6 + a;
157
+ if (r < o.x - s || r > o.x + o.width + s || i < o.y - s || i > o.y + o.height + s) return null;
158
+ let c = t.pxToX(r), l = [], u = [];
159
+ for (let n of e.series) if (!(n.hidden || n.cols.count === 0)) {
160
+ if (n.type === "scatter") {
161
+ let e = h(n, r, i, t, a);
162
+ e >= 0 && l.push(p(n, e, r, i, t));
163
+ } else {
164
+ let e = g(n, c);
165
+ e >= 0 && u.push(p(n, e, r, i, t));
166
+ }
167
+ }
168
+ if (e.tooltipMode === "nearest") {
169
+ let e = [...l, ...u].filter((e) => e.inside || e.series.type === "scatter" || e.dist <= 32 + a);
170
+ return e.length ? v([e.reduce((e, t) => t.dist <= e.dist ? t : e)], n) : null;
171
+ }
172
+ if (!u.length) return l.length ? v([l.reduce((e, t) => t.dist <= e.dist ? t : e)], n) : null;
173
+ let d = Math.min(...u.map((e) => e.dx)), f = e.x.type === "category" ? .5 / t.xPerPx : 0, m = u.filter((e) => e.dx <= d + Math.max(1, f)), y = m.reduce((e, t) => t.dx < e.dx ? t : e), b = v([
174
+ y,
175
+ ...m.filter((e) => e !== y),
176
+ ...l
177
+ ], n);
178
+ return b && (b.x = _(y.series, y.index).x, b.xLabel = n?.formatValue(b.x) ?? String(b.x)), b;
179
+ }, b = (e, t) => e === t || !!e && !!t && e.items.length === t.items.length && e.items.every((e, n) => e.index === t.items[n].index && e.seriesIndex === t.items[n].seriesIndex), x = (e, t, n) => {
180
+ let r = n?.formatValue ?? String;
181
+ if (t.items.every((t) => e.series[t.seriesIndex].type === "scatter") && t.items.length === 1) {
182
+ let n = t.items[0], i = [{
183
+ color: null,
184
+ name: e.x.title ?? "x",
185
+ value: t.xLabel
186
+ }, {
187
+ color: null,
188
+ name: e.y.title ?? "y",
189
+ value: r(n.y)
190
+ }];
191
+ return n.label !== void 0 && e.series.length > 1 && i.push({
192
+ color: null,
193
+ name: "",
194
+ value: n.seriesName
195
+ }), {
196
+ title: n.label ?? n.seriesName,
197
+ titleColor: n.color,
198
+ rows: i
199
+ };
200
+ }
201
+ return {
202
+ title: t.xLabel,
203
+ titleColor: null,
204
+ rows: t.items.map((e) => ({
205
+ color: e.color,
206
+ name: e.label ? `${e.seriesName} · ${e.label}` : e.seriesName,
207
+ value: r(e.y)
208
+ }))
209
+ };
210
+ }, S = (e, t, n) => {
211
+ let r = [], { plot: i } = t;
212
+ for (let a of n.items) {
213
+ let n = e.series[a.seriesIndex];
214
+ if (n.type === "bar" && n.barBase && n.barTop) {
215
+ let e = t.xToPx(a.x + n.barOffset), i = Math.max(n.barHalfWidth / t.xPerPx, 1), o = t.yToPx(n.barBase[a.index]), s = t.yToPx(n.barTop[a.index]);
216
+ r.push({
217
+ kind: "bar",
218
+ x: e - i,
219
+ y: Math.min(o, s),
220
+ width: i * 2,
221
+ height: Math.max(1, Math.abs(o - s))
222
+ });
223
+ continue;
224
+ }
225
+ let o = t.xToPx(a.x), s = t.yToPx(a.y);
226
+ if (o < i.x - 1 || o > i.x + i.width + 1 || s < i.y - 1 || s > i.y + i.height + 1) continue;
227
+ let c = n.type === "scatter" ? m(n, a.index) + 6 : Math.max(10, n.lineWidth * 2 + 6);
228
+ r.push({
229
+ kind: "dot",
230
+ x: o,
231
+ y: s,
232
+ size: c,
233
+ color: a.color
234
+ });
235
+ }
236
+ return r;
237
+ }, C = (e, t, n) => n ?? (e.tooltipMode === "axis" && t.items.some((t) => e.series[t.seriesIndex].type !== "scatter"));
238
+ //#endregion
239
+ export { s as DEFAULT_PADDING, d as collectPointLabels, m as dotSize, c as fallbackResolve, y as hitTest, _ as hoverItemOf, S as hoverMarks, u as layoutChart, f as pointOf, l as resolveAnnotations, b as sameHover, C as showsCrosshair, x as tooltipContent };
240
+
241
+ //# sourceMappingURL=scene.js.map