minerva-design 1.5.0 → 1.6.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 (457) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/custom-elements.json +122 -5
  3. package/dist/angular/fesm2022/minerva-angular.mjs +55 -0
  4. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  5. package/dist/angular/types/minerva-angular.d.ts +23 -2
  6. package/dist/charts/canvas.d.cts +2 -1
  7. package/dist/charts/canvas.d.ts +2 -1
  8. package/dist/charts/core.d.cts +1 -1
  9. package/dist/charts/core.d.ts +1 -1
  10. package/dist/charts/engine/canvas.cjs +1 -1
  11. package/dist/charts/engine/canvas.cjs.map +1 -1
  12. package/dist/charts/engine/canvas.js +2 -1
  13. package/dist/charts/engine/canvas.js.map +1 -1
  14. package/dist/charts/engine/chart.cjs +1 -1
  15. package/dist/charts/engine/chart.cjs.map +1 -1
  16. package/dist/charts/engine/chart.js +144 -143
  17. package/dist/charts/engine/chart.js.map +1 -1
  18. package/dist/charts/engine/controller.cjs +2 -2
  19. package/dist/charts/engine/controller.cjs.map +1 -1
  20. package/dist/charts/engine/controller.d.cts +3 -1
  21. package/dist/charts/engine/controller.d.ts +3 -1
  22. package/dist/charts/engine/controller.js +130 -132
  23. package/dist/charts/engine/controller.js.map +1 -1
  24. package/dist/charts/engine/defaults.cjs.map +1 -1
  25. package/dist/charts/engine/defaults.d.cts +4 -4
  26. package/dist/charts/engine/defaults.d.ts +4 -4
  27. package/dist/charts/engine/defaults.js.map +1 -1
  28. package/dist/charts/engine/graph/chart.cjs +1 -1
  29. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  30. package/dist/charts/engine/graph/chart.js +740 -597
  31. package/dist/charts/engine/graph/chart.js.map +1 -1
  32. package/dist/charts/engine/graph/dag.cjs +1 -1
  33. package/dist/charts/engine/graph/dag.cjs.map +1 -1
  34. package/dist/charts/engine/graph/dag.js +191 -166
  35. package/dist/charts/engine/graph/dag.js.map +1 -1
  36. package/dist/charts/engine/graph/force.cjs +1 -1
  37. package/dist/charts/engine/graph/force.cjs.map +1 -1
  38. package/dist/charts/engine/graph/force.d.cts +9 -0
  39. package/dist/charts/engine/graph/force.d.ts +9 -0
  40. package/dist/charts/engine/graph/force.js +279 -181
  41. package/dist/charts/engine/graph/force.js.map +1 -1
  42. package/dist/charts/engine/graph/geometry.cjs +1 -1
  43. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  44. package/dist/charts/engine/graph/geometry.d.cts +14 -1
  45. package/dist/charts/engine/graph/geometry.d.ts +14 -1
  46. package/dist/charts/engine/graph/geometry.js +77 -24
  47. package/dist/charts/engine/graph/geometry.js.map +1 -1
  48. package/dist/charts/engine/graph/model.cjs +1 -1
  49. package/dist/charts/engine/graph/model.cjs.map +1 -1
  50. package/dist/charts/engine/graph/model.d.cts +9 -0
  51. package/dist/charts/engine/graph/model.d.ts +9 -0
  52. package/dist/charts/engine/graph/model.js +63 -43
  53. package/dist/charts/engine/graph/model.js.map +1 -1
  54. package/dist/charts/engine/graph/types.d.cts +14 -0
  55. package/dist/charts/engine/graph/types.d.ts +14 -0
  56. package/dist/charts/engine/graph/worker.cjs +12 -6
  57. package/dist/charts/engine/graph/worker.cjs.map +1 -1
  58. package/dist/charts/engine/graph/worker.js +12 -6
  59. package/dist/charts/engine/graph/worker.js.map +1 -1
  60. package/dist/charts/engine/labels.cjs.map +1 -1
  61. package/dist/charts/engine/labels.d.cts +17 -0
  62. package/dist/charts/engine/labels.d.ts +17 -0
  63. package/dist/charts/engine/labels.js.map +1 -1
  64. package/dist/charts/engine/model.cjs +1 -1
  65. package/dist/charts/engine/model.cjs.map +1 -1
  66. package/dist/charts/engine/model.d.cts +33 -0
  67. package/dist/charts/engine/model.d.ts +33 -0
  68. package/dist/charts/engine/model.js +149 -126
  69. package/dist/charts/engine/model.js.map +1 -1
  70. package/dist/charts/engine/orderbook/field.cjs +37 -0
  71. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  72. package/dist/charts/engine/orderbook/field.d.cts +92 -0
  73. package/dist/charts/engine/orderbook/field.d.ts +92 -0
  74. package/dist/charts/engine/orderbook/field.js +297 -0
  75. package/dist/charts/engine/orderbook/field.js.map +1 -0
  76. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  77. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  78. package/dist/charts/engine/orderbook/heatmap.js +413 -441
  79. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  80. package/dist/charts/engine/orderbook/host.cjs +1 -1
  81. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  82. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  83. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  84. package/dist/charts/engine/orderbook/host.js +27 -5
  85. package/dist/charts/engine/orderbook/host.js.map +1 -1
  86. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  87. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  88. package/dist/charts/engine/orderbook/ladder.js +1 -1
  89. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  90. package/dist/charts/engine/orderbook/layout.cjs +1 -1
  91. package/dist/charts/engine/orderbook/layout.cjs.map +1 -1
  92. package/dist/charts/engine/orderbook/layout.d.cts +5 -0
  93. package/dist/charts/engine/orderbook/layout.d.ts +5 -0
  94. package/dist/charts/engine/orderbook/layout.js +8 -2
  95. package/dist/charts/engine/orderbook/layout.js.map +1 -1
  96. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  97. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  98. package/dist/charts/engine/orderbook/tape.js +3 -3
  99. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  100. package/dist/charts/engine/orderbook/types.d.cts +12 -4
  101. package/dist/charts/engine/orderbook/types.d.ts +12 -4
  102. package/dist/charts/engine/overlay.cjs +1 -1
  103. package/dist/charts/engine/overlay.cjs.map +1 -1
  104. package/dist/charts/engine/overlay.d.cts +17 -0
  105. package/dist/charts/engine/overlay.d.ts +17 -0
  106. package/dist/charts/engine/overlay.js +29 -13
  107. package/dist/charts/engine/overlay.js.map +1 -1
  108. package/dist/charts/engine/presets.cjs +1 -1
  109. package/dist/charts/engine/presets.cjs.map +1 -1
  110. package/dist/charts/engine/presets.d.cts +12 -2
  111. package/dist/charts/engine/presets.d.ts +12 -2
  112. package/dist/charts/engine/presets.js +8 -2
  113. package/dist/charts/engine/presets.js.map +1 -1
  114. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  115. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  116. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  117. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  118. package/dist/charts/engine/renderers/follow.cjs +2 -0
  119. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  120. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  121. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  122. package/dist/charts/engine/renderers/follow.js +10 -0
  123. package/dist/charts/engine/renderers/follow.js.map +1 -0
  124. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  125. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  126. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  127. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  128. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  129. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  130. package/dist/charts/engine/renderers/gl.cjs +1 -1
  131. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  132. package/dist/charts/engine/renderers/gl.js +1 -1
  133. package/dist/charts/engine/renderers/gl.js.map +1 -1
  134. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  135. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  136. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  137. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  138. package/dist/charts/engine/renderers/shaders.js +9 -6
  139. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  140. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  141. package/dist/charts/engine/renderers/types.d.cts +2 -0
  142. package/dist/charts/engine/renderers/types.d.ts +2 -0
  143. package/dist/charts/engine/renderers/types.js.map +1 -1
  144. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  145. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  146. package/dist/charts/engine/renderers/webgl.js +85 -64
  147. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  148. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  149. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  150. package/dist/charts/engine/renderers/webgl2.js +72 -58
  151. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  152. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  153. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  154. package/dist/charts/engine/renderers/webgpu.js +1 -1
  155. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  156. package/dist/charts/engine/scene.cjs +1 -1
  157. package/dist/charts/engine/scene.cjs.map +1 -1
  158. package/dist/charts/engine/scene.d.cts +51 -4
  159. package/dist/charts/engine/scene.d.ts +51 -4
  160. package/dist/charts/engine/scene.js +188 -122
  161. package/dist/charts/engine/scene.js.map +1 -1
  162. package/dist/charts/engine/shapes/chord.cjs +1 -1
  163. package/dist/charts/engine/shapes/chord.cjs.map +1 -1
  164. package/dist/charts/engine/shapes/chord.js +108 -103
  165. package/dist/charts/engine/shapes/chord.js.map +1 -1
  166. package/dist/charts/engine/shapes/types.d.cts +5 -3
  167. package/dist/charts/engine/shapes/types.d.ts +5 -3
  168. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  169. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  170. package/dist/charts/engine/three-d/canvas2d.d.cts +36 -1
  171. package/dist/charts/engine/three-d/canvas2d.d.ts +36 -1
  172. package/dist/charts/engine/three-d/canvas2d.js +155 -80
  173. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  174. package/dist/charts/engine/three-d/chart.cjs +1 -1
  175. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  176. package/dist/charts/engine/three-d/chart.js +219 -215
  177. package/dist/charts/engine/three-d/chart.js.map +1 -1
  178. package/dist/charts/engine/three-d/oit.cjs +109 -0
  179. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  180. package/dist/charts/engine/three-d/oit.d.cts +34 -0
  181. package/dist/charts/engine/three-d/oit.d.ts +34 -0
  182. package/dist/charts/engine/three-d/oit.js +111 -0
  183. package/dist/charts/engine/three-d/oit.js.map +1 -0
  184. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  185. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  186. package/dist/charts/engine/three-d/render-types.d.cts +16 -3
  187. package/dist/charts/engine/three-d/render-types.d.ts +16 -3
  188. package/dist/charts/engine/three-d/render-types.js +6 -9
  189. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  190. package/dist/charts/engine/three-d/shaders.cjs +52 -26
  191. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  192. package/dist/charts/engine/three-d/shaders.d.cts +11 -3
  193. package/dist/charts/engine/three-d/shaders.d.ts +11 -3
  194. package/dist/charts/engine/three-d/shaders.js +84 -40
  195. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  196. package/dist/charts/engine/three-d/sort.cjs +1 -1
  197. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  198. package/dist/charts/engine/three-d/sort.d.cts +6 -4
  199. package/dist/charts/engine/three-d/sort.d.ts +6 -4
  200. package/dist/charts/engine/three-d/sort.js +51 -39
  201. package/dist/charts/engine/three-d/sort.js.map +1 -1
  202. package/dist/charts/engine/three-d/types.d.cts +9 -0
  203. package/dist/charts/engine/three-d/types.d.ts +9 -0
  204. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  205. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  206. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  207. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  208. package/dist/charts/engine/three-d/webgl.js +199 -76
  209. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  210. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  211. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  212. package/dist/charts/engine/three-d/webgpu.js +225 -99
  213. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  214. package/dist/charts/engine/trading/chart.cjs +1 -1
  215. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  216. package/dist/charts/engine/trading/chart.d.cts +0 -1
  217. package/dist/charts/engine/trading/chart.d.ts +0 -1
  218. package/dist/charts/engine/trading/chart.js +1048 -883
  219. package/dist/charts/engine/trading/chart.js.map +1 -1
  220. package/dist/charts/engine/trading/drawings.cjs +2 -2
  221. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  222. package/dist/charts/engine/trading/drawings.d.cts +6 -0
  223. package/dist/charts/engine/trading/drawings.d.ts +6 -0
  224. package/dist/charts/engine/trading/drawings.js +100 -88
  225. package/dist/charts/engine/trading/drawings.js.map +1 -1
  226. package/dist/charts/engine/trading/format.cjs +1 -1
  227. package/dist/charts/engine/trading/format.cjs.map +1 -1
  228. package/dist/charts/engine/trading/format.d.cts +6 -0
  229. package/dist/charts/engine/trading/format.d.ts +6 -0
  230. package/dist/charts/engine/trading/format.js +42 -30
  231. package/dist/charts/engine/trading/format.js.map +1 -1
  232. package/dist/charts/engine/trading/geometry.cjs +1 -1
  233. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  234. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  235. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  236. package/dist/charts/engine/trading/geometry.js +19 -4
  237. package/dist/charts/engine/trading/geometry.js.map +1 -1
  238. package/dist/charts/engine/trading/labels.cjs +1 -1
  239. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  240. package/dist/charts/engine/trading/labels.js +24 -4
  241. package/dist/charts/engine/trading/labels.js.map +1 -1
  242. package/dist/charts/engine/trading/studies.cjs +1 -1
  243. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  244. package/dist/charts/engine/trading/studies.d.cts +8 -0
  245. package/dist/charts/engine/trading/studies.d.ts +8 -0
  246. package/dist/charts/engine/trading/studies.js +4 -1
  247. package/dist/charts/engine/trading/studies.js.map +1 -1
  248. package/dist/charts/engine/trading/types.d.cts +34 -11
  249. package/dist/charts/engine/trading/types.d.ts +34 -11
  250. package/dist/charts/engine/types.d.cts +25 -4
  251. package/dist/charts/engine/types.d.ts +25 -4
  252. package/dist/charts/react/charts.cjs +1 -1
  253. package/dist/charts/react/charts.cjs.map +1 -1
  254. package/dist/charts/react/charts.js +20 -15
  255. package/dist/charts/react/charts.js.map +1 -1
  256. package/dist/charts/react/graph.cjs +1 -1
  257. package/dist/charts/react/graph.cjs.map +1 -1
  258. package/dist/charts/react/graph.d.cts +6 -0
  259. package/dist/charts/react/graph.d.ts +6 -0
  260. package/dist/charts/react/graph.js +28 -27
  261. package/dist/charts/react/graph.js.map +1 -1
  262. package/dist/charts/react/orderbook.cjs +1 -1
  263. package/dist/charts/react/orderbook.cjs.map +1 -1
  264. package/dist/charts/react/orderbook.d.cts +3 -1
  265. package/dist/charts/react/orderbook.d.ts +3 -1
  266. package/dist/charts/react/orderbook.js +1 -0
  267. package/dist/charts/react/orderbook.js.map +1 -1
  268. package/dist/charts/react/shapes.cjs.map +1 -1
  269. package/dist/charts/react/shapes.d.cts +4 -3
  270. package/dist/charts/react/shapes.d.ts +4 -3
  271. package/dist/charts/react/shapes.js.map +1 -1
  272. package/dist/charts/react/three-d.cjs +1 -1
  273. package/dist/charts/react/three-d.cjs.map +1 -1
  274. package/dist/charts/react/three-d.d.cts +7 -0
  275. package/dist/charts/react/three-d.d.ts +7 -0
  276. package/dist/charts/react/three-d.js +14 -13
  277. package/dist/charts/react/three-d.js.map +1 -1
  278. package/dist/charts/react/trading.cjs.map +1 -1
  279. package/dist/charts/react/trading.d.cts +3 -3
  280. package/dist/charts/react/trading.d.ts +3 -3
  281. package/dist/charts/react/trading.js.map +1 -1
  282. package/dist/core/contracts.cjs +1 -1
  283. package/dist/core/contracts.cjs.map +1 -1
  284. package/dist/core/contracts.js +1 -1
  285. package/dist/core/contracts.js.map +1 -1
  286. package/dist/native/charts/src/canvas.cjs +1 -1
  287. package/dist/native/charts/src/canvas.js +4 -3
  288. package/dist/native/charts/src/engine/controller.cjs +2 -2
  289. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  290. package/dist/native/charts/src/engine/controller.js +102 -104
  291. package/dist/native/charts/src/engine/controller.js.map +1 -1
  292. package/dist/native/charts/src/engine/labels.cjs +1 -1
  293. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  294. package/dist/native/charts/src/engine/labels.js +14 -1
  295. package/dist/native/charts/src/engine/labels.js.map +1 -1
  296. package/dist/native/charts/src/engine/model.cjs +1 -1
  297. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  298. package/dist/native/charts/src/engine/model.js +180 -157
  299. package/dist/native/charts/src/engine/model.js.map +1 -1
  300. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  301. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  302. package/dist/native/charts/src/engine/presets.cjs +1 -1
  303. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  304. package/dist/native/charts/src/engine/presets.js +8 -2
  305. package/dist/native/charts/src/engine/presets.js.map +1 -1
  306. package/dist/native/charts/src/engine/scene.cjs +1 -1
  307. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  308. package/dist/native/charts/src/engine/scene.js +188 -122
  309. package/dist/native/charts/src/engine/scene.js.map +1 -1
  310. package/dist/native/charts/src/engine/shapes/chord.cjs +1 -1
  311. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -1
  312. package/dist/native/charts/src/engine/shapes/chord.js +108 -103
  313. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -1
  314. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  315. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  316. package/dist/native/charts/src/engine/shapes/layout.js +88 -73
  317. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  318. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  319. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  320. package/dist/native/components/Chart/ChartBase.js +127 -115
  321. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  322. package/dist/native/components/Chart/charts.cjs +1 -1
  323. package/dist/native/components/Chart/charts.cjs.map +1 -1
  324. package/dist/native/components/Chart/charts.js +8 -5
  325. package/dist/native/components/Chart/charts.js.map +1 -1
  326. package/dist/native/components/Chart/scene.cjs +1 -1
  327. package/dist/native/components/Chart/scene.cjs.map +1 -1
  328. package/dist/native/components/Chart/scene.d.cts +6 -1
  329. package/dist/native/components/Chart/scene.d.ts +6 -1
  330. package/dist/native/components/Chart/scene.js +99 -50
  331. package/dist/native/components/Chart/scene.js.map +1 -1
  332. package/dist/native/components/Chart/types.d.cts +7 -1
  333. package/dist/native/components/Chart/types.d.ts +7 -1
  334. package/dist/native/components/Charts/charts.cjs +1 -1
  335. package/dist/native/components/Charts/charts.cjs.map +1 -1
  336. package/dist/native/components/Charts/charts.js +23 -18
  337. package/dist/native/components/Charts/charts.js.map +1 -1
  338. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  339. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  340. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  341. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  342. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -107
  343. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  344. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  345. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  346. package/dist/native/components/ShapeChart/geometry.js +120 -36
  347. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  348. package/dist/native/components/ShapeChart/types.d.cts +6 -4
  349. package/dist/native/components/ShapeChart/types.d.ts +6 -4
  350. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  351. package/dist/native/source/components/Chart/charts.tsx +10 -3
  352. package/dist/native/source/components/Chart/scene.tsx +85 -0
  353. package/dist/native/source/components/Chart/types.ts +7 -0
  354. package/dist/native/source/components/Charts/charts.tsx +7 -0
  355. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -36
  356. package/dist/native/source/components/ShapeChart/geometry.ts +188 -18
  357. package/dist/native/source/components/ShapeChart/types.ts +6 -4
  358. package/dist/taro/chart-a11y.d.ts +7 -0
  359. package/dist/taro/charts.d.ts +4 -1
  360. package/dist/taro/index.js +3212 -3049
  361. package/dist/taro/shape-charts.d.ts +6 -4
  362. package/dist/uni/AreaChart.vue +2 -1
  363. package/dist/uni/AreaChart.vue.d.ts +1 -1
  364. package/dist/uni/BarChart.vue +2 -1
  365. package/dist/uni/BarChart.vue.d.ts +1 -1
  366. package/dist/uni/BoxPlotChart.vue +2 -1
  367. package/dist/uni/BubbleChart.vue +2 -1
  368. package/dist/uni/CandlestickChart.vue +2 -1
  369. package/dist/uni/Chart.vue +2 -1
  370. package/dist/uni/Divider.vue.d.ts +1 -1
  371. package/dist/uni/DonutChart.vue.d.ts +1 -1
  372. package/dist/uni/GanttChart.vue +2 -1
  373. package/dist/uni/GanttChart.vue.d.ts +11 -0
  374. package/dist/uni/GaugeChart.vue.d.ts +1 -1
  375. package/dist/uni/HeatmapChart.vue +2 -1
  376. package/dist/uni/HistogramChart.vue +2 -1
  377. package/dist/uni/HorizontalBarChart.vue +2 -1
  378. package/dist/uni/HorizontalBarChart.vue.d.ts +1 -1
  379. package/dist/uni/LineChart.vue +2 -1
  380. package/dist/uni/MixedChart.vue +2 -1
  381. package/dist/uni/PieChart.vue.d.ts +1 -1
  382. package/dist/uni/QuadrantChart.vue +2 -1
  383. package/dist/uni/RangeAreaChart.vue +2 -1
  384. package/dist/uni/ScatterChart.vue +2 -1
  385. package/dist/uni/Sparkline.vue +2 -1
  386. package/dist/uni/WaterfallChart.vue +2 -1
  387. package/dist/uni/chart-a11y.d.ts +7 -0
  388. package/dist/uni/chart-a11y.js +29 -0
  389. package/dist/uni/chart-canvas.d.ts +9 -0
  390. package/dist/uni/chart-canvas.js +11 -1
  391. package/dist/uni/chart-types.d.ts +8 -1
  392. package/dist/uni/chart-types.js +5 -1
  393. package/dist/uni/charts-canvas.js +2 -1
  394. package/dist/uni/named-chart-options.d.ts +2 -0
  395. package/dist/uni/named-chart-options.js +3 -0
  396. package/dist/uni/shape-chart-canvas.d.ts +0 -2
  397. package/dist/uni/shape-chart-canvas.js +4 -36
  398. package/dist/uni/shape-chart-types.d.ts +2 -2
  399. package/dist/uni/shape-chart-types.js +2 -2
  400. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  401. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +2 -0
  402. package/dist/vue/components/Chart/GanttChart.vue.d.ts +15 -0
  403. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  404. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +8 -0
  405. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  406. package/dist/vue/components/Chart/GraphChart.vue.d.ts +2 -0
  407. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  408. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  409. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  410. package/dist/vue/components/Chart/TradingChart.vue.d.ts +9 -0
  411. package/dist/vue/components/Chart/TreeChart.vue.d.ts +2 -0
  412. package/dist/vue/components/Chart/graph.d.ts +3 -0
  413. package/dist/vue/components/Chart/graph.js +2 -0
  414. package/dist/vue/components/Chart/graph.js.map +1 -1
  415. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  416. package/dist/vue/components/Chart/three-d.js +2 -0
  417. package/dist/vue/components/Chart/three-d.js.map +1 -1
  418. package/dist/vue/components/Chart/trading.d.ts +7 -2
  419. package/dist/vue/components/Chart/trading.js +1 -0
  420. package/dist/vue/components/Chart/trading.js.map +1 -1
  421. package/dist/weapp/area-chart/index.wxml +1 -1
  422. package/dist/weapp/bar-chart/index.wxml +1 -1
  423. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  424. package/dist/weapp/bubble-chart/index.wxml +1 -1
  425. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  426. package/dist/weapp/chart/index.wxml +1 -1
  427. package/dist/weapp/charts/canvas.js +326 -54
  428. package/dist/weapp/charts/core.js +2 -0
  429. package/dist/weapp/controls.js +58 -27
  430. package/dist/weapp/gantt-chart/index.wxml +1 -1
  431. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  432. package/dist/weapp/histogram-chart/index.wxml +1 -1
  433. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  434. package/dist/weapp/line-chart/index.wxml +1 -1
  435. package/dist/weapp/mixed-chart/index.wxml +1 -1
  436. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  437. package/dist/weapp/range-area-chart/index.wxml +1 -1
  438. package/dist/weapp/scatter-chart/index.wxml +1 -1
  439. package/dist/weapp/sparkline/index.wxml +1 -1
  440. package/dist/weapp/types.d.ts +11 -2
  441. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  442. package/dist/web-components/components/chart/extended.d.ts +4 -0
  443. package/dist/web-components/components/chart/extended.js +8 -2
  444. package/dist/web-components/components/chart/extended.js.map +1 -1
  445. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  446. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  447. package/dist/web-components/components/graph/graph.d.ts +2 -0
  448. package/dist/web-components/components/graph/graph.js +3 -2
  449. package/dist/web-components/components/graph/graph.js.map +1 -1
  450. package/dist/web-components/components/trading-chart/trading-chart.d.ts +1 -1
  451. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  452. package/dist/web-components/html-custom-data.json +45 -0
  453. package/dist/web-components/types/react.d.ts +4 -4
  454. package/dist/web-components/types/solid.d.ts +8 -8
  455. package/dist/web-components/types/svelte.d.ts +8 -8
  456. package/dist/web-components/types/vue.d.ts +4 -4
  457. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","names":["copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","createTheme","cache","hidden","listeners","model","view","zoomed","width","height","annotations","scene","sceneDirty","lastPlot","destroyed","hover","pointers","gesture","lastTap","emit","type","listener","event","invalidate","interaction","value","o","measure","text","font","size","weight","rebuild","buildModel","clampRange","base","minSpan","sameRange","resolveAnnotations","it","setHover","legendLayout","option","named","s","legendShown","cfg","position","ramp","colorLegend","first","last","barWidth","right","barX","cy","l","entries","x","row","w","legendShape","legendHeight","tooltipLayout","tooltip","custom","result","content","tooltipContent","lines","swatchWidth","line","names","values","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","layoutChart","labels","collectPointLabels","occupied","labelHeight","a","textBox","r","rectOf","pos","pointLabels","placeLabels","t","next","connectorSegments","guide","crosshairAt","horizontal","hoverMarks","colors","heatPosition","dotSize","rect","key","getScene","scales","changed","sameHover","hitAt","sc","hitTest","y","touch","inPlot","p","dataAt","cx","plot","toData","fromPlotY","setViewInternal","notify","zoomAt","at","zoomRange","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","createScales","from","to","panRange","current","now","hit","toScreen","toPlotY","set","visibleRange","sorted","count","range","lowerBound","ORDER","toRects","along","out","k","scenePrimitives","maxDots","limits","maxBars","column","xLo","xHi","series","end","curved","curvePoints","bottom","n","points","bottoms","d","decimateMinMax","nextBottom","j","xv","band","segments","bottomSegments","lowerSegments","run","runBottom","runLower","flush","yv","bv","q","half","rects","merge","lastCol","ya","yb","col","pc","toCss","boxPrimitives","up","down","wicks","bodies","wickColors","bodyColors","step","c","open","color","hi","high","lo","low","hw","hh","style","heatCellStyle","inset","screenRect","unpackColor","dots","colorOf","visible","screen","cell","cols","owner","lw","boxes","boxColors","lineColors","dotColors","vertical","across","thick","m","q1","q3","before","outliers","prims"],"sources":["../../../../../../charts/src/engine/controller.ts"],"sourcesContent":["// createChartController: the platform-free chart. It owns the options, the\n// theme, the model, the visible range and the interactions (pointer / touch\n// gestures fed by the host) and describes what to draw (`getScene`). Hosts\n// only draw: createCanvasChart on any 2D context, the React Native charts\n// with views.\n\nimport { toCss, unpackColor } from \"./color\";\nimport { curvePoints } from \"./curve\";\nimport { lowerBound } from \"./data\";\nimport { decimateMinMax } from \"./decimate\";\nimport {\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport {\n buildModel,\n fromPlotY,\n heatPosition,\n toPlotY,\n type ChartModel,\n type DataCache,\n type SeriesModel,\n} from \"./model\";\nimport {\n font,\n placeLabels,\n rectOf,\n textBox,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport {\n collectPointLabels,\n colorLegend,\n connectorSegments,\n crosshairAt,\n dotSize,\n hitTest,\n hoverMarks,\n layoutChart,\n legendShape,\n legendShown,\n resolveAnnotations,\n sameHover,\n tooltipContent,\n type ChartLayout,\n type ConnectorSegment,\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\n/** Visual map of a heatmap: a gradient bar with the values at its ends */\nexport interface ChartColorLegendLayout {\n /** Box of the gradient bar, pixels of the chart */\n bar: Rect;\n /** CSS colors at even steps along the bar, from the lowest value */\n stops: string[];\n /** Value labels: `x` is the anchor, `align` the side of the text it touches */\n labels: { text: string; x: number; y: number; align: \"left\" | \"right\" }[];\n /** X pixels of the ticks on the bar (the middle of diverging ramps) */\n ticks: number[];\n /** X pixel of the hovered value on the bar (`null` when none) */\n caret: number | null;\n}\n\nexport interface ChartLegendLayout {\n /** Series entries (empty when `colors` is set) */\n entries: ChartLegendEntry[];\n /** Color legend of heatmap charts (instead of the entries) */\n colors: ChartColorLegendLayout | null;\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 * Width of the swatch column of the rows (0 when no row has a swatch):\n * the names start after it, the values are right-aligned on the box\n */\n swatchWidth: number;\n}\n\nexport interface ChartHoverLayout {\n event: ChartHoverEvent;\n marks: HoverMark[];\n /** X pixel of the vertical guide line (`null` when hidden) */\n crosshairX: number | null;\n /** Y pixel of the horizontal guide line of horizontal charts (`null` when hidden) */\n crosshairY: 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 /** Lines between consecutive bars (waterfall connectors) */\n connectors: ConnectorSegment[];\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(\n options.annotations,\n theme,\n model.y.type === \"log\" ? Math.log10 : undefined,\n );\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 if (!legendShown(option, model, named)) return null;\n const cfg = typeof option === \"object\" ? option : {};\n const position = cfg.position === \"bottom\" ? \"bottom\" : \"top\";\n const ramp = colorLegend(model);\n if (ramp) {\n // [min] [gradient] [max], on the right\n const first = ramp.labels[0]?.text ?? \"\";\n const last = ramp.labels[ramp.labels.length - 1]?.text ?? \"\";\n const barWidth = Math.max(60, Math.min(160, width * 0.32));\n const right = width - 4 - measure(last, 11) - 8;\n const barX = right - barWidth;\n const rowY = position === \"bottom\" ? height - LEGEND_ROW : 0;\n const cy = rowY + LEGEND_ROW / 2;\n return {\n entries: [],\n colors: {\n bar: { x: barX, y: cy - 4, width: barWidth, height: 8 },\n stops: ramp.stops,\n labels: [\n { text: first, x: barX - 8, y: cy, align: \"right\" },\n { text: last, x: right + 8, y: cy, align: \"left\" },\n ],\n ticks: ramp.labels\n .filter((l) => l.at > 0 && l.at < 1)\n .map((l) => barX + l.at * barWidth),\n caret: null,\n },\n position,\n toggle: false,\n height: LEGEND_ROW + 6,\n };\n }\n const entries: ChartLegendEntry[] = [];\n let x = 4;\n let row = 0;\n for (const s of model.series) {\n const w = 14 + measure(s.name, 12) + 8;\n if (x + w > width - 4 && x > 4) {\n x = 4;\n row++;\n }\n entries.push({\n id: s.id,\n name: s.name,\n color: s.colorCss,\n shape: legendShape(s.type),\n hidden: s.hidden,\n box: { x, y: row * LEGEND_ROW, width: w, height: LEGEND_ROW },\n });\n x += w + 10;\n }\n const legendHeight = (row + 1) * LEGEND_ROW + 6;\n if (position === \"bottom\") {\n for (const e of entries) e.box.y += height - legendHeight + 6;\n }\n return {\n entries,\n colors: null,\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(\n model,\n event,\n scene?.layout.yTicks ?? null,\n scene?.layout.y2Ticks ?? null,\n );\n const lineHeight = 18;\n const padding = 8;\n let w = 0;\n let lines: number;\n const swatchWidth = content.rows.some((row) => row.color) ? 14 : 0;\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 if (content.subtitle)\n w = Math.max(\n w,\n measure(content.subtitle, 11) + (content.titleColor ? 14 : 0),\n );\n // a label column and a value column, at least 16px apart\n let names = 0;\n let values = 0;\n for (const row of content.rows) {\n names = Math.max(names, measure(row.name, 12));\n values = Math.max(values, measure(row.value, 12, 600));\n }\n if (content.rows.length)\n w = Math.max(w, swatchWidth + names + 16 + values);\n lines = 1 + (content.subtitle ? 1 : 0) + 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 swatchWidth,\n };\n };\n\n const computeScene = (): ChartScene | null => {\n if (width <= 0 || height <= 0) return null;\n const legend = legendLayout();\n const legendTop = legend?.position === \"top\" ? legend.height : 0;\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height: height - (legend?.height ?? 0),\n padding: options.padding,\n top: legendTop,\n measure: (text) => measure(text),\n });\n const labels = collectPointLabels(\n model,\n view,\n layout.scales,\n layout.yTicks,\n );\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n for (const a of annotations) {\n if (a.type === \"text\" && a.text) {\n occupied.push(\n textBox(\n a,\n layout.scales,\n measure(a.text, theme.fontSize, a.weight),\n labelHeight,\n ),\n );\n continue;\n }\n if (a.type !== \"rect\" || !a.label) continue;\n // keep the dot labels off the area titles (drawForeground does the same)\n const r = rectOf(a, layout.scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const w = measure(a.label, theme.fontSize + 1, 600);\n const pos = a.labelPosition;\n occupied.push({\n x: pos.endsWith(\"left\")\n ? r.x + 10\n : pos.endsWith(\"right\")\n ? r.x + r.width - 10 - w\n : r.x + (r.width - w) / 2,\n y: pos.startsWith(\"top\")\n ? r.y + 10\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - 10 - labelHeight\n : r.y + (r.height - 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 connectors: connectorSegments(model, layout.scales),\n };\n scene = next;\n if (hover) {\n const guide = crosshairAt(\n model,\n layout.scales,\n hover.event,\n options.crosshair,\n );\n const horizontal = layout.scales.horizontal;\n next.hover = {\n event: hover.event,\n marks: hoverMarks(model, layout.scales, hover.event),\n crosshairX: horizontal ? null : guide,\n crosshairY: horizontal ? guide : null,\n tooltip:\n gesture?.kind === \"pan\" || gesture?.kind === \"point\"\n ? null\n : tooltipLayout(hover.event, hover.x, hover.y),\n };\n // the hovered value on the color legend\n const colors = legend?.colors;\n const it = hover.event.items[0];\n const s = it ? model.series[it.seriesIndex] : undefined;\n if (colors && it && s?.type === \"heatmap\" && it.value !== undefined)\n colors.caret =\n colors.bar.x + heatPosition(s, it.value) * colors.bar.width;\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 const p = toData(sc, cx, cy);\n // values of the axes (not logarithms)\n return { x: p.x, y: fromPlotY(model, p.y) };\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 const at = toData(sc, x, y);\n if (model.zoom.x) next.x = zoomRange(view.x, at.x, factor);\n if (model.zoom.y) next.y = zoomRange(view.y, at.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 model.horizontal,\n );\n const factor = gesture.distance / distance;\n const next = copyView(gesture.view);\n const from = toData(start, gesture.midX, gesture.midY);\n const to = toData(start, midX, midY);\n // the data under the first midpoint follows the fingers\n if (model.zoom.x) {\n next.x = zoomRange(gesture.view.x, from.x, factor);\n next.x = panRange(next.x, (from.x - to.x) * factor);\n }\n if (model.zoom.y) {\n next.y = zoomRange(gesture.view.y, from.y, factor);\n next.y = panRange(next.y, (from.y - to.y) * factor);\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 next = copyView(gesture.view);\n const from = toData(sc, gesture.x, gesture.y);\n const to = toData(sc, x, y);\n if (model.zoom.x) next.x = panRange(gesture.view.x, from.x - to.x);\n if (model.zoom.y) next.y = panRange(gesture.view.y, from.y - to.y);\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 ? toScreen(sc, x, toPlotY(model, y)) : null;\n },\n fromPixel(x, y) {\n const sc = scales();\n if (!sc) return null;\n const p = toData(sc, x, y);\n return { x: p.x, y: fromPlotY(model, p.y) };\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 (x pixel when `horizontal`) */\n baseline: number;\n segments: number[][];\n /**\n * Stacked and range areas: y pixel (x pixel when `horizontal`) of the\n * bottom edge under every point of `segments`\n */\n bottoms?: number[][];\n /** Horizontal charts: the area is filled toward the left edge (`baseline` / `bottoms` are x pixels) */\n horizontal?: boolean;\n}\n\nexport interface ChartBarPrimitive {\n kind: \"bars\";\n seriesIndex: number;\n color: string;\n /** Interleaved x, y, width, height */\n rects: number[];\n /** CSS color of every rect (candlesticks, heatmap cells, colored bars); `color` otherwise */\n colors?: string[];\n /** Corner radius in pixels */\n radius?: number;\n /** Opacity of the fill (box plot boxes, translucent bars) */\n opacity?: number;\n}\n\nexport interface ChartDotPrimitive {\n kind: \"dots\";\n seriesIndex: number;\n /** Opacity of the fill (0: rings only) */\n opacity: number;\n /** Interleaved x, y, diameter */\n dots: number[];\n /** CSS color of every dot */\n colors: string[];\n /** Width of a ring of the dot color around every dot, CSS pixels */\n stroke?: number;\n}\n\nexport type ChartPrimitive =\n | ChartLinePrimitive\n | ChartAreaPrimitive\n | ChartBarPrimitive\n | ChartDotPrimitive;\n\nexport interface ChartPrimitiveOptions {\n /**\n * Upper bound of the dots drawn per series: above it the dots are merged\n * into one per occupied cell of their size\n * @default 4000\n */\n maxDots?: number;\n /**\n * Upper bound of the bars drawn per series: above it neighboring bars\n * sharing a pixel column are merged\n * @default 2000\n */\n maxBars?: number;\n /**\n * Width in pixels of the columns lines are decimated to (at most four\n * points per column); larger values mean fewer shapes\n * @default 1\n */\n columnWidth?: number;\n /** Size of the cells dots are merged into (the dot size by default) */\n dotCell?: number;\n}\n\nconst visibleRange = (\n x: Float64Array,\n count: number,\n sorted: boolean,\n range: Range,\n): [number, number] => {\n if (!sorted) return [0, count];\n const [a, b] = range[0] <= range[1] ? range : [range[1], range[0]];\n return [\n Math.max(0, lowerBound(x, count, a) - 1),\n Math.min(count, lowerBound(x, count, b) + 1),\n ];\n};\n\nconst ORDER = {\n heatmap: 0,\n area: 1,\n bar: 2,\n boxplot: 2,\n candlestick: 3,\n line: 4,\n scatter: 5,\n} as const;\n\n/**\n * Rectangles collected along the axes (`x` along the x axis, `y` along the\n * value axis) and turned into screen rects\n */\nconst toRects = (sc: Scales, along: number[]): number[] => {\n if (!sc.horizontal) return along;\n const out = new Array<number>(along.length);\n for (let k = 0; k < along.length; k += 4) {\n out[k] = along[k + 1];\n out[k + 1] = along[k];\n out[k + 2] = along[k + 3];\n out[k + 3] = along[k + 2];\n }\n return out;\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 horizontal = sc.horizontal;\n const maxDots = limits.maxDots ?? 4000;\n const maxBars = limits.maxBars ?? 2000;\n const column = Math.max(1, limits.columnWidth ?? 1);\n // the x axis in pixels (along `xToPx`)\n const xLo = horizontal ? plot.y : plot.x;\n const xHi = xLo + (horizontal ? plot.height : plot.width);\n const out: ChartPrimitive[] = [];\n const series = model.series\n .filter((s) => !s.hidden && s.cols.count > 0)\n .sort((a, b) => ORDER[a.type] - ORDER[b.type] || a.index - b.index);\n for (const s of series) {\n const { x, y, count, sorted } = s.cols;\n if (s.type === \"line\" || s.type === \"area\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const top = s.stackTop ?? y;\n // curve first (in data space), then decimation; the stacked bottom\n // edge follows the same sampling\n const curved = curvePoints(x, top, start, end, s.curve);\n const bottom = s.stackBase\n ? curvePoints(x, s.stackBase, start, end, s.curve).points\n : null;\n let n = curved.length;\n let points = curved.points;\n let bottoms = bottom;\n if (sorted && n > ((xHi - xLo) * 2) / column) {\n if (bottom) {\n // keep the bottoms aligned with the kept tops (same x)\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n const next = new Float64Array(d.length * 2);\n const nextBottom = new Float64Array(d.length * 2);\n let k = 0;\n let j = 0;\n for (let i = 0; i < d.length; i++) {\n const xv = d.points[i * 2];\n while (j < n - 1 && points[j * 2] < xv) j++;\n next[k * 2] = xv;\n next[k * 2 + 1] = d.points[i * 2 + 1];\n nextBottom[k * 2] = xv;\n nextBottom[k * 2 + 1] = bottom[j * 2 + 1];\n k++;\n }\n points = next;\n bottoms = nextBottom;\n n = k;\n } else {\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n points = d.points;\n n = d.length;\n }\n }\n // range areas: a line on the lower edge too\n const band = s.type === \"area\" && !!s.cols.y0 && !!bottoms;\n const segments: number[][] = [];\n const bottomSegments: number[][] = [];\n const lowerSegments: number[][] = [];\n let run: number[] = [];\n let runBottom: number[] = [];\n let runLower: number[] = [];\n const flush = () => {\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n if (band) lowerSegments.push(runLower);\n }\n run = [];\n runBottom = [];\n runLower = [];\n };\n for (let i = 0; i < n; i++) {\n const xv = points[i * 2];\n const yv = points[i * 2 + 1];\n const bv = bottoms ? bottoms[i * 2 + 1] : 0;\n if (\n !Number.isFinite(xv) ||\n !Number.isFinite(yv) ||\n !Number.isFinite(bv)\n ) {\n flush();\n continue;\n }\n const p = toScreen(sc, xv, yv);\n run.push(p.x, p.y);\n if (bottoms) runBottom.push(sc.yToPx(bv));\n if (band) {\n const q = toScreen(sc, xv, bv);\n runLower.push(q.x, q.y);\n }\n }\n flush();\n if (s.type === \"area\") {\n out.push({\n kind: \"area\",\n seriesIndex: s.index,\n color: s.colorCss,\n opacity: s.opacity,\n baseline: sc.yToPx(model.baseline),\n segments,\n ...(bottoms ? { bottoms: bottomSegments } : {}),\n ...(horizontal ? { horizontal: true } : {}),\n });\n }\n if (s.lineWidth > 0) {\n const width =\n s.type === \"area\" ? Math.min(s.lineWidth, 2) : s.lineWidth;\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width,\n segments,\n });\n if (band)\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width,\n segments: lowerSegments,\n });\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 / Math.abs(sc.xPerPx), 0.5);\n const rects: number[] = [];\n const colors: string[] = [];\n const merge = end - start > maxBars;\n let lastCol = NaN;\n for (let i = start; i < end; i++) {\n const a = s.barBase[i];\n const b = s.barTop[i];\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < xLo || cx - half > xHi) 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 along the values\n const k = rects.length - 4;\n const bottom = Math.max(rects[k + 1] + rects[k + 3], top + h);\n rects[k + 1] = Math.min(rects[k + 1], top);\n rects[k + 3] = bottom - rects[k + 1];\n continue;\n }\n lastCol = col;\n rects.push(cx - half, top, half * 2, h);\n const pc = s.pointColors?.[i];\n colors.push(pc ? toCss(pc) : s.colorCss);\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, rects),\n ...(s.pointColors ? { colors } : {}),\n radius: s.radius,\n ...(s.opacity < 1 ? { opacity: s.opacity } : {}),\n });\n continue;\n }\n if (s.type === \"boxplot\") {\n out.push(...boxPrimitives(s, sc, view.x, xLo, xHi, maxBars));\n continue;\n }\n if (s.type === \"candlestick\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const { open, high, low } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n const up = toCss(s.upColor);\n const down = toCss(s.downColor);\n const wicks: number[] = [];\n const bodies: number[] = [];\n const wickColors: string[] = [];\n const bodyColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n for (let i = start; i < end; i += step) {\n const c = y[i];\n const o = open ? open[i] : c;\n if (!Number.isFinite(c) || !Number.isFinite(o)) continue;\n const cx = sc.xToPx(x[i]);\n if (cx + half < xLo || cx - half > xHi) continue;\n const color = c < o ? down : up;\n const hi = sc.yToPx(high ? high[i] : Math.max(o, c));\n const lo = sc.yToPx(low ? low[i] : Math.min(o, c));\n wicks.push(cx - 0.5, Math.min(hi, lo), 1, Math.abs(lo - hi));\n wickColors.push(color);\n const ya = sc.yToPx(o);\n const yb = sc.yToPx(c);\n bodies.push(\n cx - half,\n Math.min(ya, yb),\n half * 2,\n Math.max(1, Math.abs(ya - yb)),\n );\n bodyColors.push(color);\n }\n out.push(\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: toRects(sc, wicks),\n colors: wickColors,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: toRects(sc, bodies),\n colors: bodyColors,\n radius: 1,\n },\n );\n continue;\n }\n if (s.type === \"heatmap\") {\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const rects: number[] = [];\n const colors: string[] = [];\n const style = heatCellStyle(hw * 2, hh * 2, s.radius);\n const inset = style.inset;\n for (let i = 0; i < count && rects.length / 4 < maxBars * 4; i++) {\n const c = s.cellColors?.[i];\n if (!c) continue;\n const r = screenRect(\n sc,\n sc.xToPx(x[i]) - hw,\n sc.xToPx(x[i]) + hw,\n sc.yToPx(y[i]) - hh,\n sc.yToPx(y[i]) + hh,\n );\n if (\n r.x + r.width < plot.x ||\n r.x > plot.x + plot.width ||\n r.y + r.height < plot.y ||\n r.y > plot.y + plot.height\n )\n continue;\n rects.push(\n r.x + inset,\n r.y + inset,\n r.width - inset * 2,\n r.height - inset * 2,\n );\n colors.push(toCss(unpackColor(c)));\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n colors,\n radius: style.radius,\n });\n continue;\n }\n // scatter\n const dots: number[] = [];\n const colors: string[] = [];\n const colorOf = (i: number) => {\n const c = s.pointColors?.[i];\n return c ? toCss(c) : s.colorCss;\n };\n const visible: number[] = [];\n const screen: 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 p = toScreen(sc, xv, yv);\n if (\n p.x < plot.x ||\n p.x > plot.x + plot.width ||\n p.y < plot.y ||\n p.y > plot.y + plot.height\n )\n continue;\n visible.push(i);\n screen.push(p.x, p.y);\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 visible.forEach((i, k) => {\n const cx = Math.floor((screen[k * 2] - plot.x) / cell);\n const cy = Math.floor((screen[k * 2 + 1] - 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 visible.forEach((i, k) => {\n dots.push(screen[k * 2], screen[k * 2 + 1], 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\n/** Box plot shapes: translucent boxes, then whiskers, caps, edges and medians, then outliers */\nconst boxPrimitives = (\n s: SeriesModel,\n sc: Scales,\n range: Range,\n xLo: number,\n xHi: number,\n maxBars: number,\n): ChartPrimitive[] => {\n const { x, y, count, sorted, high, low, q1, q3, outliers } = s.cols;\n const [start, end] = visibleRange(x, count, sorted, range);\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n const lw = Math.max(1, s.lineWidth);\n const boxes: number[] = [];\n const lines: number[] = [];\n const boxColors: string[] = [];\n const lineColors: string[] = [];\n const dots: number[] = [];\n const dotColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n /** A line along the values (a whisker or a side) */\n const vertical = (cx: number, a: number, b: number) => {\n lines.push(cx - lw / 2, Math.min(a, b), lw, Math.abs(a - b));\n };\n /** A line across the box (an edge, a cap or the median) */\n const across = (cx: number, h: number, at: number, thick = lw) => {\n lines.push(cx - h, at - thick / 2, h * 2, thick);\n };\n for (let i = start; i < end; i += step) {\n const m = y[i];\n if (!Number.isFinite(m)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < xLo || cx - half > xHi) continue;\n const pc = s.pointColors?.[i];\n const color = pc ? toCss(pc) : s.colorCss;\n const lo = sc.yToPx(low && Number.isFinite(low[i]) ? low[i] : m);\n const hi = sc.yToPx(high && Number.isFinite(high[i]) ? high[i] : m);\n const a = sc.yToPx(q1 && Number.isFinite(q1[i]) ? q1[i] : m);\n const b = sc.yToPx(q3 && Number.isFinite(q3[i]) ? q3[i] : m);\n const before = lines.length;\n boxes.push(cx - half, Math.min(a, b), half * 2, Math.abs(a - b));\n boxColors.push(color);\n vertical(cx, lo, a);\n vertical(cx, b, hi);\n vertical(cx - half, a, b);\n vertical(cx + half, a, b);\n across(cx, half / 2, lo);\n across(cx, half / 2, hi);\n across(cx, half, a);\n across(cx, half, b);\n across(cx, half, sc.yToPx(m), Math.max(2, lw * 1.6));\n for (let k = before; k < lines.length; k += 4) lineColors.push(color);\n const out = outliers?.[i];\n if (out) {\n for (const v of out) {\n const p = sc.horizontal\n ? { x: sc.yToPx(v), y: cx }\n : { x: cx, y: sc.yToPx(v) };\n dots.push(p.x, p.y, s.outlierSize);\n dotColors.push(color);\n }\n }\n }\n const prims: ChartPrimitive[] = [\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, boxes),\n colors: boxColors,\n opacity: s.opacity,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, lines),\n colors: lineColors,\n },\n ];\n if (dots.length)\n prims.push({\n kind: \"dots\",\n seriesIndex: s.index,\n // rings of the series color, or filled dots\n opacity: s.outlierShape === \"hollow\" ? 0 : 0.85,\n dots,\n colors: dotColors,\n stroke: 1.25,\n });\n return prims;\n};\n"],"mappings":";;;;;;;;;;;AAgNA,IAAMA,KAAY,OAA6B;CAC7C,GAAG,CAACC,EAAE,EAAE,IAAIA,EAAE,EAAE,EAAE;CAClB,GAAG,CAACA,EAAE,EAAE,IAAIA,EAAE,EAAE,EAAE;AACpB,IAEMC,KAAW,GACXC,KAAa,IACbC,KAAgB,KAChBC,IAAa,IAWNC,KACX,MACoB;CACpB,IAAIC,IAAUC,EAAO,SACjBC,IAAaD,EAAO,OACpBE,IAAQC,EAAYF,GAAYF,EAAQ,OAAO,GAC7CK,oBAAmB,IAAI,IAAI,GAC3BC,oBAAS,IAAI,IAAY,GACzBC,IAIF,CAAC,GACDC,GACAC,IAAkB;EAAE,GAAG,CAAC,GAAG,CAAC;EAAG,GAAG,CAAC,GAAG,CAAC;CAAE,GACzCC,IAAS,IACTC,IAAQ,GACRC,IAAS,GACTC,KAAoC,CAAC,GACrCC,IAA2B,MAC3BC,KAAa,IACbC,KAAW,IACXC,IAAY,IAEZC,IAAiE,MAC/DC,oBAAW,IAAI,IAA0B,GAC3CC,IAUO,MACPC,IAAU;EAAE,MAAM;EAAG,GAAG;EAAG,GAAG;CAAE,GAE9BC,KACJ,GACA,MACG;EACH,EAAUC,EAAK,EAAE,SAAS,MAAaC,EAASC,CAAK,CAAC;CACxD,GAEMC,UAAmB;EAEvB,AADA,KAAa,IACRT,KAAWhB,EAAO,eAAe;CACxC,GAEM0B,WAAoB;EACxB,IAAMC,IAAQ5B,EAAQ;EACtB,IAAI4B,MAAU,IAAO,OAAO;EAC5B,IAAMC,IAAI,OAAOD,KAAU,WAAWA,IAAQ,CAAC;EAC/C,OAAO;GACL,KAAKC,EAAE,OAAO;GACd,YAAYA,EAAE,cAAc;EAC9B;CACF,GAEMC,KAAW,GAAc,IAAO3B,EAAM,UAAU,IAAS,QAC7DF,EAAO,YAAY8B,GAAMC,EAAK7B,GAAO8B,GAAMC,CAAM,CAAC,GAE9CC,WAAgB;EACpB,IAAQC,EAAWpC,GAASG,GAAOG,GAAQD,CAAK;EAChD,IAAM,EAAE,SAAM,eAAYG;EAwB1B,AAvBKE,KAGH,IAAO;GACL,GAAGF,EAAM,KAAK,IAAI6B,EAAW5B,EAAK,GAAG6B,EAAK,GAAGC,EAAQ,CAAC,IAAI,CAAC,GAAGD,EAAK,CAAC;GACpE,GAAG9B,EAAM,KAAK,IAAI6B,EAAW5B,EAAK,GAAG6B,EAAK,GAAGC,EAAQ,CAAC,IAAI,CAAC,GAAGD,EAAK,CAAC;EACtE,GACA,IAAS,CAACE,GAAU/B,EAAK,GAAG6B,EAAK,CAAC,KAAK,CAACE,GAAU/B,EAAK,GAAG6B,EAAK,CAAC,KANhE,IAAO7C,EAAS6C,CAAI,GAQtB,KAAcG,EACZzC,EAAQ,aACRG,GACAK,EAAM,EAAE,SAAS,QAAQ,KAAK,QAAQ,KAAA,CACxC,GACIU,MACiBA,EAAM,MAAM,MAAM,OAClC,MACCV,EAAM,OAAOkC,EAAG,gBAChB,CAAClC,EAAM,OAAOkC,EAAG,YAAY,CAAC,UAC9BA,EAAG,QAAQlC,EAAM,OAAOkC,EAAG,YAAY,CAAC,KAAK,KAE5C,KAAYC,EAAS,IAAI,IAEhCjB,EAAW;CACb,GAIMkB,WAA+C;EACnD,IAAMC,IAAS7C,EAAQ,QACjB8C,IAAQ9C,EAAQ,OAAO,QAAQ,MAAM+C,EAAE,IAAI,CAAC,CAAC;EACnD,IAAI,CAACC,EAAYH,GAAQrC,GAAOsC,CAAK,GAAG,OAAO;EAC/C,IAAMG,IAAM,OAAOJ,KAAW,WAAWA,IAAS,CAAC,GAC7CK,IAAWD,EAAI,aAAa,WAAW,WAAW,OAClDE,IAAOC,EAAY5C,CAAK;EAC9B,IAAI2C,GAAM;GAER,IAAME,IAAQF,EAAK,OAAO,EAAE,EAAE,QAAQ,IAChCG,IAAOH,EAAK,OAAOA,EAAK,OAAO,SAAS,EAAE,EAAE,QAAQ,IACpDI,IAAW,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK5C,IAAQ,GAAI,CAAC,GACnD6C,IAAQ7C,IAAQ,IAAImB,EAAQwB,GAAM,EAAE,IAAI,GACxCG,IAAOD,IAAQD,GAEfG,KADOR,MAAa,WAAWtC,IAASd,IAAa,KACzCA,IAAa;GAC/B,OAAO;IACL,SAAS,CAAC;IACV,QAAQ;KACN,KAAK;MAAE,GAAG2D;MAAM,GAAGC,IAAK;MAAG,OAAOH;MAAU,QAAQ;KAAE;KACtD,OAAOJ,EAAK;KACZ,QAAQ,CACN;MAAE,MAAME;MAAO,GAAGI,IAAO;MAAG,GAAGC;MAAI,OAAO;KAAQ,GAClD;MAAE,MAAMJ;MAAM,GAAGE,IAAQ;MAAG,GAAGE;MAAI,OAAO;KAAO,CACnD;KACA,OAAOP,EAAK,OACT,QAAQ,MAAMQ,EAAE,KAAK,KAAKA,EAAE,KAAK,CAAC,CAAC,CACnC,KAAK,MAAMF,IAAOE,EAAE,KAAKJ,CAAQ;KACpC,OAAO;IACT;IACA;IACA,QAAQ;IACR,QAAQ;GACV;EACF;EACA,IAAMK,IAA8B,CAAC,GACjCC,IAAI,GACJC,IAAM;EACV,KAAK,IAAMf,KAAKvC,EAAM,QAAQ;GAC5B,IAAMuD,IAAI,KAAKjC,EAAQiB,EAAE,MAAM,EAAE,IAAI;GAarC,AAZIc,IAAIE,IAAIpD,IAAQ,KAAKkD,IAAI,MAC3B,IAAI,GACJ,MAEFD,EAAQ,KAAK;IACX,IAAIb,EAAE;IACN,MAAMA,EAAE;IACR,OAAOA,EAAE;IACT,OAAOiB,EAAYjB,EAAE,IAAI;IACzB,QAAQA,EAAE;IACV,KAAK;KAAE;KAAG,GAAGe,IAAMhE;KAAY,OAAOiE;KAAG,QAAQjE;IAAW;GAC9D,CAAC,GACD,KAAKiE,IAAI;EACX;EACA,IAAME,KAAgBH,IAAM,KAAKhE,IAAa;EAC9C,IAAIoD,MAAa,UACf,KAAK,IAAM,KAAKU,GAAS,EAAE,IAAI,KAAKhD,IAASqD,IAAe;EAE9D,OAAO;GACL;GACA,QAAQ;GACR;GACA,QAAQhB,EAAI,UAAU;GACtB,QAAQgB;EACV;CACF,GAIMC,MACJ,GACA,GACA,MAC8B;EAC9B,IAAMC,IAAUnE,EAAQ;EACxB,IAAImE,MAAY,IAAO,OAAO;EAC9B,IAAMC,IAAS,OAAOD,KAAY,WAAWA,EAAQ,SAAS,KAAA,GAC1DpC,IAAwB;EAC5B,IAAIqC,GAAQ;GACV,IAAMC,IAASD,EAAO3C,CAAK;GAC3B,IAAI4C,MAAW,QAAQA,MAAW,IAAI,OAAO;GAC7C,AAAI,OAAOA,KAAW,aAAU,IAAOA,EAAO,MAAM,IAAI;EAC1D;EACA,IAAMC,IAAUC,EACd/D,GACAiB,GACAX,GAAO,OAAO,UAAU,MACxBA,GAAO,OAAO,WAAW,IAC3B,GAGIiD,IAAI,GACJS,GACEC,IAAcH,EAAQ,KAAK,MAAM,MAAQR,EAAI,KAAK,IAAI,KAAK;EACjE,IAAI/B,GAAM;GACR,KAAK,IAAM2C,KAAQ3C,GAAM,IAAI,KAAK,IAAIgC,GAAGjC,EAAQ4C,GAAM,EAAE,CAAC;GAC1D,IAAQ3C,EAAK;EACf,OAAO;GAEL,AADA,IAAID,EAAQwC,EAAQ,OAAO,IAAI,GAAG,KAAKA,EAAQ,aAAa,KAAK,IAC7DA,EAAQ,aACV,IAAI,KAAK,IACPP,GACAjC,EAAQwC,EAAQ,UAAU,EAAE,KAAKA,EAAQ,aAAa,KAAK,EAC7D;GAEF,IAAIK,IAAQ,GACRC,IAAS;GACb,KAAK,IAAMd,KAAOQ,EAAQ,MAExB,AADA,IAAQ,KAAK,IAAIK,GAAO7C,EAAQgC,EAAI,MAAM,EAAE,CAAC,GAC7C,IAAS,KAAK,IAAIc,GAAQ9C,EAAQgC,EAAI,OAAO,IAAI,GAAG,CAAC;GAIvD,AAFIQ,EAAQ,KAAK,WACf,IAAI,KAAK,IAAIP,GAAGU,IAAcE,IAAQ,KAAKC,CAAM,IACnD,IAAQ,IAAK,KAAQ,WAAoBN,EAAQ,KAAK;EACxD;EACA,IAAMO,IAAO,KAAK,KAAK,KAAK,IAAId,GAAG,EAAE,IAAI,KAAc,CAAC,GAClDe,IAAON,IAAQ,KAAa,IAC9BO,IAAOC,IAAU;EAErB,AADID,IAAOF,IAAOlE,IAAQ,MAAG,IAAOqE,IAAU,KAAKH,IACnD,IAAO,KAAK,IAAI,GAAG,KAAK,IAAIE,GAAMpE,IAAQkE,IAAO,CAAC,CAAC;EACnD,IAAMI,IAAM,KAAK,IAAI,GAAG,KAAK,IAAIC,IAAUJ,IAAO,GAAGlE,IAASkE,IAAO,CAAC,CAAC;EACvE,OAAO;GACL;GACA;GACA,KAAK;IAAE,GAAGC;IAAM,GAAGE;IAAK,OAAOJ;IAAM,QAAQC;GAAK;GAClD;GACA;GACA;EACF;CACF,GAEMK,WAAwC;EAC5C,IAAIxE,KAAS,KAAKC,KAAU,GAAG,OAAO;EACtC,IAAMwE,IAASxC,GAAa,GACtByC,IAAYD,GAAQ,aAAa,QAAQA,EAAO,SAAS,GACzDE,IAASC,EAAY;GACzB;GACA;GACA;GACA;GACA,QAAQ3E,KAAUwE,GAAQ,UAAU;GACpC,SAASpF,EAAQ;GACjB,KAAKqF;GACL,UAAU,MAASvD,EAAQC,CAAI;EACjC,CAAC,GACKyD,IAASC,EACbjF,GACAC,GACA6E,EAAO,QACPA,EAAO,MACT,GACMI,IAAmB,CAAC,GACpBC,IAAcxF,EAAM,WAAW;EACrC,KAAK,IAAMyF,KAAK/E,IAAa;GAC3B,IAAI+E,EAAE,SAAS,UAAUA,EAAE,MAAM;IAC/B,EAAS,KACPC,EACED,GACAN,EAAO,QACPxD,EAAQ8D,EAAE,MAAMzF,EAAM,UAAUyF,EAAE,MAAM,GACxCD,CACF,CACF;IACA;GACF;GACA,IAAIC,EAAE,SAAS,UAAU,CAACA,EAAE,OAAO;GAEnC,IAAME,IAAIC,EAAOH,GAAGN,EAAO,MAAM;GACjC,IAAIQ,EAAE,SAAS,KAAKA,EAAE,UAAU,GAAG;GACnC,IAAM/B,IAAIjC,EAAQ8D,EAAE,OAAOzF,EAAM,WAAW,GAAG,GAAG,GAC5C6F,IAAMJ,EAAE;GACd,EAAS,KAAK;IACZ,GAAGI,EAAI,SAAS,MAAM,IAClBF,EAAE,IAAI,KACNE,EAAI,SAAS,OAAO,IAClBF,EAAE,IAAIA,EAAE,QAAQ,KAAK/B,IACrB+B,EAAE,KAAKA,EAAE,QAAQ/B,KAAK;IAC5B,GAAGiC,EAAI,WAAW,KAAK,IACnBF,EAAE,IAAI,KACNE,EAAI,WAAW,QAAQ,IACrBF,EAAE,IAAIA,EAAE,SAAS,KAAKH,IACtBG,EAAE,KAAKA,EAAE,SAASH,KAAe;IACvC,OAAO5B;IACP,QAAQ4B;GACV,CAAC;EACH;EACA,IAAMM,IAAcC,EAClBV,GACAF,EAAO,OACN,MAAMxD,EAAQqE,CAAC,GAChBR,IAAc,GACdD,CACF,GACMU,IAAmB;GACvB;GACA;GACA;GACA;GACA,MAAM3G,EAASgB,CAAI;GACnB;GACA;GACA;GACA;GACA,OAAO;GACP,UAAU;GACV,YAAY4F,EAAkB7F,GAAO8E,EAAO,MAAM;EACpD;EAEA,IADA,IAAQc,GACJlF,GAAO;GACT,IAAMoF,IAAQC,EACZ/F,GACA8E,EAAO,QACPpE,EAAM,OACNlB,EAAQ,SACV,GACMwG,IAAalB,EAAO,OAAO;GACjC,EAAK,QAAQ;IACX,OAAOpE,EAAM;IACb,OAAOuF,EAAWjG,GAAO8E,EAAO,QAAQpE,EAAM,KAAK;IACnD,YAAYsF,IAAa,OAAOF;IAChC,YAAYE,IAAaF,IAAQ;IACjC,SACElF,GAAS,SAAS,SAASA,GAAS,SAAS,UACzC,OACA8C,GAAchD,EAAM,OAAOA,EAAM,GAAGA,EAAM,CAAC;GACnD;GAEA,IAAMwF,IAAStB,GAAQ,QACjB1C,IAAKxB,EAAM,MAAM,MAAM,IACvB,IAAIwB,IAAKlC,EAAM,OAAOkC,EAAG,eAAe,KAAA;GAC9C,AAAIgE,KAAUhE,KAAM,GAAG,SAAS,aAAaA,EAAG,UAAU,KAAA,MACxD,EAAO,QACLgE,EAAO,IAAI,IAAIC,EAAa,GAAGjE,EAAG,KAAK,IAAIgE,EAAO,IAAI;EAC5D;EACA,IAAItF,GAAS,SAAS,SAAS;GAC7B,IAAM2B,IAAIvC,EAAM,OAAOY,EAAQ,KAAK;GACpC,EAAK,WAAW;IACd,GAAGA,EAAQ;IACX,GAAGA,EAAQ;IACX,OAAOA,EAAQ,KAAK;IACpB,OAAO2B,IAAI6D,EAAQ7D,GAAG3B,EAAQ,KAAK,KAAK,IAAI,KAAK;GACnD;EACF;EACA,IAAMyF,IAAOvB,EAAO,MACdwB,IAAM,GAAGD,EAAK,EAAE,GAAGA,EAAK,EAAE,GAAGA,EAAK,MAAM,GAAGA,EAAK;EAKtD,OAJIC,MAAQ9F,OACV,KAAW8F,GACXxF,EAAK,UAAU,EAAE,GAAGuF,EAAK,CAAC,IAErBT;CACT,GAEMW,YACAhG,MAAc,CAACD,OACjB,KAAa,IACb,IAAQqE,GAAa,IAEhBrE,IAKHkG,UAAeD,EAAS,CAAC,EAAE,OAAO,UAAU,MAE5CpE,KACJ,MACG;EACH,IAAMsE,IAAU,CAACC,EAAUhG,GAAO,SAAS,MAAMkF,GAAM,SAAS,IAAI;EAGpE,AAFA,IAAQA,GACR1E,EAAW,GACPuF,KAAS3F,EAAK,SAAS8E,IAAOA,EAAK,QAAQ,IAAI;CACrD,GAEMe,KAAS,GAAW,GAAW,MAAmB;EACtD,IAAMC,IAAKJ,EAAO;EAClB,OAAOI,IACHC,EAAQ7G,GAAO4G,GAAItG,GAAO,OAAO,UAAU,MAAM+C,GAAGyD,GAAGC,IAAQ,IAAI,CAAC,IACpE;CACN,GAEMC,MAAU,GAAW,MAAc;EACvC,IAAMC,IAAIT,EAAO,CAAC,EAAE;EACpB,OACE,CAAC,CAACS,KAAK5D,KAAK4D,EAAE,KAAK5D,KAAK4D,EAAE,IAAIA,EAAE,SAASH,KAAKG,EAAE,KAAKH,KAAKG,EAAE,IAAIA,EAAE;CAEtE,GAEMC,MAAU,GAAW,MAAc;EACvC,IAAMN,IAAKJ,EAAO;EAClB,IAAI,CAACI,GAAI,OAAO;EAChB,IAAM,EAAE,YAASA,GACXO,IAAK,KAAK,IAAIC,EAAK,GAAG,KAAK,IAAIA,EAAK,IAAIA,EAAK,OAAO/D,CAAC,CAAC,GACtDH,IAAK,KAAK,IAAIkE,EAAK,GAAG,KAAK,IAAIA,EAAK,IAAIA,EAAK,QAAQN,CAAC,CAAC,GACvDG,IAAII,EAAOT,GAAIO,GAAIjE,CAAE;EAE3B,OAAO;GAAE,GAAG+D,EAAE;GAAG,GAAGK,EAAUtH,GAAOiH,EAAE,CAAC;EAAE;CAC5C,GAEMM,KAAmB,GAAiB,MAAoB;EAC5D,IAAM,EAAE,SAAM,eAAYvH;EAO1B,AANA,IAAO;GACL,GAAG6B,EAAW+D,EAAK,GAAG9D,EAAK,GAAGC,EAAQ,CAAC;GACvC,GAAGF,EAAW+D,EAAK,GAAG9D,EAAK,GAAGC,EAAQ,CAAC;EACzC,GACA,IAAS,CAACC,GAAU/B,EAAK,GAAG6B,EAAK,CAAC,KAAK,CAACE,GAAU/B,EAAK,GAAG6B,EAAK,CAAC,GAC5D0F,KAAQ1G,EAAK,QAAQ7B,EAASgB,CAAI,CAAC,GACvCiB,EAAW;CACb,GAEMuG,MAAU,GAAW,GAAW,MAAmB;EACvD,IAAMb,IAAKJ,EAAO;EAClB,IAAI,CAACI,KAAO,CAAC5G,EAAM,KAAK,KAAK,CAACA,EAAM,KAAK,GAAI;EAC7C,IAAM4F,IAAO3G,EAASgB,CAAI,GACpByH,IAAKL,EAAOT,GAAIvD,GAAGyD,CAAC;EAG1B,AAFI9G,EAAM,KAAK,MAAG,EAAK,IAAI2H,GAAU1H,EAAK,GAAGyH,EAAG,GAAGE,CAAM,IACrD5H,EAAM,KAAK,MAAG,EAAK,IAAI2H,GAAU1H,EAAK,GAAGyH,EAAG,GAAGE,CAAM,IACzDL,EAAgB3B,GAAM,EAAI;CAC5B,GAEMiC,WAAkB;EACtB,AAAK3H,KACLqH,EAAgBtI,EAASe,EAAM,IAAI,GAAG,EAAI;CAC5C,GAEM8H,MAAY,GAAW,MAC3BvB,EAAS,CAAC,EAAE,QAAQ,QAAQ,MACzB,MACClD,KAAK0E,EAAE,IAAI,KACX1E,KAAK0E,EAAE,IAAI,IAAIA,EAAE,IAAI,SACrBjB,KAAKiB,EAAE,IAAI,KACXjB,KAAKiB,EAAE,IAAI,IAAIA,EAAE,IAAI,MACzB,KAAK,MAEDC,MAAgB,MAAe;EAGnC,AAFIlI,EAAO,IAAImI,CAAE,IAAGnI,EAAO,OAAOmI,CAAE,IAC/BnI,EAAO,IAAImI,CAAE,GAClBtG,GAAQ;CACV,GAEMuG,WAAmB;EACvB,IAAM,CAAC9C,GAAG+C,KAAK,CAAC,GAAGxH,EAAS,OAAO,CAAC;EAQpC,AAPA,IAAU;GACR,MAAM;GACN,MAAM1B,EAASgB,CAAI;GACnB,UAAU,KAAK,IAAI,GAAG,KAAK,MAAMmF,EAAE,IAAI+C,EAAE,GAAG/C,EAAE,IAAI+C,EAAE,CAAC,CAAC;GACtD,OAAO/C,EAAE,IAAI+C,EAAE,KAAK;GACpB,OAAO/C,EAAE,IAAI+C,EAAE,KAAK;EACtB,GACAhG,EAAS,IAAI;CACf;CAoLA,OAHA,IAAQP,EAAWpC,GAASG,GAAOG,GAAQD,CAAK,GAChD8B,GAAQ,GAED;EACL,WAAW,GAAM;GACf,IAAIlB,GAAW;GACf,IAAM2H,KACHxC,EAAK,WAAW,CAAC,EAAA,CAAG,KAAK,OAAOpG,EAAQ,WAAW,CAAC,EAAA,CAAG,KAAK;GAG/D,AAFA,IAAUoG,GACNwC,MAAgB,IAAQxI,EAAYF,GAAYF,EAAQ,OAAO,IACnEmC,GAAQ;EACV;EACA,SAAS,GAAM;GACb,AAAIlB,MACJ,IAAamF,GACb,IAAQhG,EAAYF,GAAYF,EAAQ,OAAO,GAC/CmC,GAAQ;EACV;EACA,QAAQ,GAAG,GAAG;GACZ,CAAI4B,MAAMpD,KAASkI,MAAMjI,OACzB,IAAQ,KAAK,IAAI,GAAGmD,CAAC,GACrB,IAAS,KAAK,IAAI,GAAG8E,CAAC,GACtBnH,EAAW;EACb;EACA;EACA,cAxMmB,GAAW,GAAW,IAAyB,CAAC,MAAM;GACzE,IAAIT,GAAW;GACf,IAAMwH,IAAK5G,EAAE,MAAM,GACb0F,IAAQ,CAAC,CAAC1F,EAAE;GAClB,EAAS,IAAI4G,GAAI;IAAE;IAAG;IAAG,QAAQ5E;IAAG,QAAQyD;IAAG;IAAO,OAAO;GAAM,CAAC;GACpE,IAAM5E,IAAKf,GAAY;GACvB,IAAIR,EAAS,SAAS,GAAG;IACvB,AAAIuB,MAAOlC,EAAM,KAAK,KAAKA,EAAM,KAAK,MAAMY,GAAS,SAAS,WAC5DsH,GAAW;IACb;GACF;GACA,IAAIvH,EAAS,OAAO,KAAK,CAACuB,GAAI;IAC5B,IAAI,CAACA,KAAM6E,GAAO;KAChB,IAAM9F,IAAQ0F,EAAMtD,GAAGyD,GAAG,EAAI;KAC9B,EAAS7F,IAAQ;MAAE;MAAO;MAAG;KAAE,IAAI,IAAI;IACzC;IACA;GACF;GACA,IAAIiB,EAAG,YAAY;IACjB,IAAMoG,IAAO3B,EAAMtD,GAAGyD,GAAGC,CAAK,CAAC,EAAE,MAAM,MACpC,MAAM/G,EAAM,OAAOuI,EAAE,YAAY,CAAC,SAAS,SAC9C;IACA,IAAID,GAAM;KACR,IAAU;MAAE,MAAM;MAAS;MAAM;MAAG;KAAE;KACtC;IACF;GACF;GACA,IAAIpI,KAAUgC,EAAG,OAAO8E,GAAO3D,GAAGyD,CAAC,GAAG;IACpC,IAAU;KAAE,MAAM;KAAO,MAAM7H,EAASgB,CAAI;KAAG;KAAG;IAAE;IACpD;GACF;GAEA,IADA,IAAU,MACN8G,GAAO;IACT,IAAM9F,IAAQ0F,EAAMtD,GAAGyD,GAAG,EAAI;IAC9B,EAAS7F,IAAQ;KAAE;KAAO;KAAG;IAAE,IAAI,IAAI;GACzC;EACF;EAqKE,cAnKmB,GAAW,GAAW,IAAyB,CAAC,MAAM;GACzE,IAAIR,GAAW;GACf,IAAMwH,IAAK5G,EAAE,MAAM,GACb4F,IAAItG,EAAS,IAAIsH,CAAE;GAWzB,IAVIhB,MACF,EAAE,IAAI5D,GACN,EAAE,IAAIyD,GAEJ,CAACG,EAAE,SACH,KAAK,MAAM5D,IAAI4D,EAAE,QAAQH,IAAIG,EAAE,MAAM,KAClCA,EAAE,QAAQ7H,KAAaD,QAE1B,EAAE,QAAQ,MAEVyB,GAAS,SAAS,WAAWD,EAAS,QAAQ,GAAG;IACnD,IAAM,CAACyE,GAAG+C,KAAK,CAAC,GAAGxH,EAAS,OAAO,CAAC,GAC9B6H,IAAW,KAAK,IAAI,GAAG,KAAK,MAAMpD,EAAE,IAAI+C,EAAE,GAAG/C,EAAE,IAAI+C,EAAE,CAAC,CAAC,GACvDM,KAAQrD,EAAE,IAAI+C,EAAE,KAAK,GACrBO,KAAQtD,EAAE,IAAI+C,EAAE,KAAK,GACrBvB,IAAKJ,EAAO;IAClB,IAAI,CAACI,GAAI;IACT,IAAM+B,IAAQC,EACZhC,EAAG,MACHhG,EAAQ,MACRZ,EAAM,EAAE,SACRA,EAAM,EAAE,SACRA,EAAM,UACR,GACM4H,IAAShH,EAAQ,WAAW4H,GAC5B5C,IAAO3G,EAAS2B,EAAQ,IAAI,GAC5BiI,IAAOxB,EAAOsB,GAAO/H,EAAQ,MAAMA,EAAQ,IAAI,GAC/CkI,IAAKzB,EAAOsB,GAAOF,GAAMC,CAAI;IAUnC,AARI1I,EAAM,KAAK,MACb,EAAK,IAAI2H,GAAU/G,EAAQ,KAAK,GAAGiI,EAAK,GAAGjB,CAAM,GACjD,EAAK,IAAImB,GAASnD,EAAK,IAAIiD,EAAK,IAAIC,EAAG,KAAKlB,CAAM,IAEhD5H,EAAM,KAAK,MACb,EAAK,IAAI2H,GAAU/G,EAAQ,KAAK,GAAGiI,EAAK,GAAGjB,CAAM,GACjD,EAAK,IAAImB,GAASnD,EAAK,IAAIiD,EAAK,IAAIC,EAAG,KAAKlB,CAAM,IAEpDL,EAAgB3B,GAAM,EAAI;IAC1B;GACF;GACA,IAAIhF,GAAS,SAAS,WAAWqG,GAAG;IAClC,IAAI,CAACA,EAAE,OAAO;IAEd,AADA,EAAQ,IAAI5D,GACZ,EAAQ,IAAIyD;IACZ,IAAMY,IAAKR,GAAO7D,GAAGyD,CAAC;IAEtB,AADA5F,EAAW,GACPwG,KAAI5G,EAAK,QAAQ;KAAE,MAAMF,EAAQ;KAAM,GAAG8G,EAAG;KAAG,GAAGA,EAAG;IAAE,CAAC;IAC7D;GACF;GACA,IAAI9G,GAAS,SAAS,SAASqG,GAAG;IAChC,IAAI,CAACA,EAAE,OAAO;IACd,IAAML,IAAKJ,EAAO;IAClB,IAAI,CAACI,GAAI;IACT,IAAMhB,IAAO3G,EAAS2B,EAAQ,IAAI,GAC5BiI,IAAOxB,EAAOT,GAAIhG,EAAQ,GAAGA,EAAQ,CAAC,GACtCkI,IAAKzB,EAAOT,GAAIvD,GAAGyD,CAAC;IAG1B,AAFI9G,EAAM,KAAK,MAAG,EAAK,IAAI+I,GAASnI,EAAQ,KAAK,GAAGiI,EAAK,IAAIC,EAAG,CAAC,IAC7D9I,EAAM,KAAK,MAAG,EAAK,IAAI+I,GAASnI,EAAQ,KAAK,GAAGiI,EAAK,IAAIC,EAAG,CAAC,IACjEvB,EAAgB3B,GAAM,EAAI;IAC1B;GACF;GACA,IAAI,IAAS,OAAO,OAEhB,CAACqB,KAAKA,EAAE,SAAS,CAAC5F,EAAE,QAAO;IAC7B,IAAMJ,IAAQ0F,EAAMtD,GAAGyD,GAAG,CAAC,CAACG,GAAG,SAAS,CAAC,CAAC5F,EAAE,KAAK;IACjD,CAAIJ,KAAS,CAACgG,GAAG,UAAO9E,EAASlB,IAAQ;KAAE;KAAO;KAAG;IAAE,IAAI,IAAI;GACjE;EACF;EA6FE,YA3FiB,GAAW,GAAW,IAAyB,CAAC,MAAM;GACvE,IAAIR,GAAW;GACf,IAAMwH,IAAK5G,EAAE,MAAM,GACb4F,IAAItG,EAAS,IAAIsH,CAAE;GACzB,EAAS,OAAOA,CAAE;GAClB,IAAMe,IAAUpI;GAChB,IAAIoI,GAAS,SAAS,SAAS;IAC7B,AAAIrI,EAAS,OAAO,MAAG,IAAU;IACjC;GACF;GAEA,IADA,IAAU,MACN,CAACsG,GAAG;GACR,IAAI+B,GAAS,SAAS,SAChB;QAAA/B,EAAE,OAAO;KACX,IAAMS,IAAKR,GAAO7D,GAAGyD,CAAC;KAEtB,AADA5F,EAAW,GACPwG,KAAI5G,EAAK,QAAQ;MAAE,MAAMkI,EAAQ;MAAM,GAAGtB,EAAG;MAAG,GAAGA,EAAG;KAAE,CAAC;KAC7D;IACF;UACK,IAAIsB,GAAS,SAAS,SAAS/B,EAAE,OAAO;IAC7C,EAAW;IACX;GACF;GACA,IAAIA,EAAE,OAAO;IACX,AAAIA,EAAE,SAAO/F,EAAW;IACxB;GACF;GAEA,IAAM+H,IAAM,KAAK,IAAI;GACrB,IACEhC,EAAE,SACFgC,IAAMpI,EAAQ,OAAOxB,MACrB,KAAK,MAAMgE,IAAIxC,EAAQ,GAAGiG,IAAIjG,EAAQ,CAAC,IAAI,MAC3CX,GACA;IAEA,AADA,IAAU;KAAE,MAAM;KAAG;KAAG;IAAE,GAC1B2H,GAAU;IACV;GACF;GACA,IAAU;IAAE,MAAMoB;IAAK;IAAG;GAAE;GAC5B,IAAMrE,IAASkD,GAASzE,GAAGyD,CAAC;GAC5B,IAAIlC,GAAQ;IACV,AAAI2B,EAAS,CAAC,EAAE,QAAQ,UAAQyB,GAAapD,EAAO,EAAE;IACtD;GACF;GACA,IAAMsE,IAAMvC,EAAMtD,GAAGyD,GAAGG,EAAE,KAAK;GAC/B,IAAIiC,GAAK;IAEP,AADIjC,EAAE,SAAO9E,EAAS;KAAE,OAAO+G;KAAK;KAAG;IAAE,CAAC,GAC1CpI,EAAK,SAASoI,CAAG;IACjB;GACF;GAEA,IADIjC,EAAE,SAAO9E,EAAS,IAAI,GACtB6E,GAAO3D,GAAGyD,CAAC,GAAG;IAChB,IAAMY,IAAKR,GAAO7D,GAAGyD,CAAC;IACtB,AAAIY,KAAI5G,EAAK,aAAa4G,CAAyB;GACrD;EACF;EAoCE,gBAlCqB,IAAyB,CAAC,MAAM;GAGrD,AAFA/G,EAAS,OAAOU,EAAE,MAAM,CAAC,IACrBT,GAAS,SAAS,WAAWD,EAAS,OAAO,OAAG,IAAU,OAC9DO,EAAW;EACb;EA+BE,eAAe;GACb,AAAI,CAACN,KAAWF,KAAOyB,EAAS,IAAI;EACtC;EACA;EACA;EACA,eAAelD,EAASgB,CAAI;EAC5B,QAAQ,GAAM;GACZ,AAAIQ,KACJ8G,EAAgB;IAAE,GAAG3B,EAAK,KAAK3F,EAAK;IAAG,GAAG2F,EAAK,KAAK3F,EAAK;GAAE,GAAG,EAAK;EACrE;EACA;EACA,aAAa;GACX,AAAIS,KAAOyB,EAAS,IAAI;EAC1B;EACA,cAAc;GACZ,IAAM8E,IAAIV,EAAS,CAAC,EAAE,OAAO;GAC7B,OAAOU,IAAI,EAAE,GAAGA,EAAE,IAAI;EACxB;EACA,QAAQ,GAAG,GAAG;GACZ,IAAML,IAAKJ,EAAO;GAClB,OAAOI,IAAKuC,EAASvC,GAAIvD,GAAG+F,EAAQpJ,GAAO8G,CAAC,CAAC,IAAI;EACnD;EACA,UAAU,GAAG,GAAG;GACd,IAAMF,IAAKJ,EAAO;GAClB,IAAI,CAACI,GAAI,OAAO;GAChB,IAAMK,IAAII,EAAOT,GAAIvD,GAAGyD,CAAC;GACzB,OAAO;IAAE,GAAGG,EAAE;IAAG,GAAGK,EAAUtH,GAAOiH,EAAE,CAAC;GAAE;EAC5C;EACA,GAAG,GAAM,GAAU;GACjB,IAAIoC,IAAMtJ,EAAUgB;GAMpB,OALKsI,MACH,oBAAM,IAAI,IAAI,GACd,EAAuCtI,KAAQsI,IAEjDA,EAAI,IAAIrI,CAAQ,SACH;IACX,EAAI,OAAOA,CAAQ;GACrB;EACF;EACA,UAAU;GAER,AADA,IAAY,IACZL,EAAS,MAAM;GACf,KAAK,IAAM2F,KAAO,OAAO,KAAKvG,CAAS,GACrC,OAAQA,EAAsCuG;EAClD;CACF;AACF,GAuFMgD,KACJ,GACA,GACA,GACA,MACqB;CACrB,IAAI,CAACC,GAAQ,OAAO,CAAC,GAAGC,CAAK;CAC7B,IAAM,CAAC,GAAGrB,KAAKsB,EAAM,MAAMA,EAAM,KAAKA,IAAQ,CAACA,EAAM,IAAIA,EAAM,EAAE;CACjE,OAAO,CACL,KAAK,IAAI,GAAGC,EAAWrG,GAAGmG,GAAO,CAAC,IAAI,CAAC,GACvC,KAAK,IAAIA,GAAOE,EAAWrG,GAAGmG,GAAOrB,CAAC,IAAI,CAAC,CAC7C;AACF,GAEMwB,IAAQ;CACZ,SAAS;CACT,MAAM;CACN,KAAK;CACL,SAAS;CACT,aAAa;CACb,MAAM;CACN,SAAS;AACX,GAMMC,KAAW,GAAY,MAA8B;CACzD,IAAI,CAAChD,EAAG,YAAY,OAAOiD;CAC3B,IAAMC,IAAU,MAAcD,EAAM,MAAM;CAC1C,KAAK,IAAIE,IAAI,GAAGA,IAAIF,EAAM,QAAQ,KAAK,GAIrC,AAHA,EAAIE,KAAKF,EAAME,IAAI,IACnB,EAAIA,IAAI,KAAKF,EAAME,IACnB,EAAIA,IAAI,KAAKF,EAAME,IAAI,IACvB,EAAIA,IAAI,KAAKF,EAAME,IAAI;CAEzB,OAAOD;AACT,GAQaE,KACX,GACA,IAAgC,CAAC,MACZ;CACrB,IAAM,EAAE,UAAO,SAAM,cAAW1J,GAC1BsG,IAAK9B,EAAO,QACZ,EAAE,YAASA,GACXkB,IAAaY,EAAG,YAChBqD,IAAUC,EAAO,WAAW,KAC5BC,IAAUD,EAAO,WAAW,KAC5BE,IAAS,KAAK,IAAI,GAAGF,EAAO,eAAe,CAAC,GAE5CG,IAAMrE,IAAaoB,EAAK,IAAIA,EAAK,GACjCkD,IAAMD,KAAOrE,IAAaoB,EAAK,SAASA,EAAK,QAC7C0C,IAAwB,CAAC,GACzBS,IAASvK,EAAM,OAClB,QAAQ,MAAM,CAACuC,EAAE,UAAUA,EAAE,KAAK,QAAQ,CAAC,CAAC,CAC5C,MAAM,GAAG,MAAMoH,EAAMvE,EAAE,QAAQuE,EAAMxB,EAAE,SAAS/C,EAAE,QAAQ+C,EAAE,KAAK;CACpE,KAAK,IAAM5F,KAAKgI,GAAQ;EACtB,IAAM,EAAE,MAAG,MAAG,UAAO,cAAWhI,EAAE;EAClC,IAAIA,EAAE,SAAS,UAAUA,EAAE,SAAS,QAAQ;GAC1C,IAAM,CAACoG,GAAO6B,KAAOlB,EAAajG,GAAGmG,GAAOD,GAAQtJ,EAAK,CAAC,GACpDwE,IAAMlC,EAAE,YAAYuE,GAGpB2D,IAASC,EAAYrH,GAAGoB,GAAKkE,GAAO6B,GAAKjI,EAAE,KAAK,GAChDoI,IAASpI,EAAE,YACbmI,EAAYrH,GAAGd,EAAE,WAAWoG,GAAO6B,GAAKjI,EAAE,KAAK,CAAC,CAAC,SACjD,MACAqI,IAAIH,EAAO,QACXI,IAASJ,EAAO,QAChBK,IAAUH;GACd,IAAIpB,KAAUqB,KAAMN,IAAMD,KAAO,IAAKD,GAAQ;IAC5C,IAAIO,GAAQ;KAEV,IAAMI,IAAIC,EAAeH,GAAQ,GAAGD,IAAI,MAAMhE,EAAG,MAAM1H,CAAC,IAAIkL,CAAM,GAC5DxE,IAAO,IAAI,aAAamF,EAAE,SAAS,CAAC,GACpCE,IAAa,IAAI,aAAaF,EAAE,SAAS,CAAC,GAC5ChB,IAAI,GACJmB,IAAI;KACR,KAAK,IAAI,IAAI,GAAG,IAAIH,EAAE,QAAQ,KAAK;MACjC,IAAMI,IAAKJ,EAAE,OAAO,IAAI;MACxB,OAAOG,IAAIN,IAAI,KAAKC,EAAOK,IAAI,KAAKC,IAAI;MAKxC,AAJA,EAAKpB,IAAI,KAAKoB,GACd,EAAKpB,IAAI,IAAI,KAAKgB,EAAE,OAAO,IAAI,IAAI,IACnC,EAAWhB,IAAI,KAAKoB,GACpB,EAAWpB,IAAI,IAAI,KAAKY,EAAOO,IAAI,IAAI,IACvC;KACF;KAGA,AAFA,IAAStF,GACT,IAAUqF,GACV,IAAIlB;IACN,OAAO;KACL,IAAMgB,IAAIC,EAAeH,GAAQ,GAAGD,IAAI,MAAMhE,EAAG,MAAM1H,CAAC,IAAIkL,CAAM;KAElE,AADA,IAASW,EAAE,QACX,IAAIA,EAAE;IACR;GACF;GAEA,IAAMK,IAAO7I,EAAE,SAAS,UAAU,CAAC,CAACA,EAAE,KAAK,MAAM,CAAC,CAACuI,GAC7CO,IAAuB,CAAC,GACxBC,IAA6B,CAAC,GAC9BC,IAA4B,CAAC,GAC/BC,IAAgB,CAAC,GACjBC,IAAsB,CAAC,GACvBC,IAAqB,CAAC,GACpBC,UAAc;IAQlB,AAPIH,EAAI,WACNH,EAAS,KAAKG,CAAG,GACjBF,EAAe,KAAKG,CAAS,GACzBL,KAAMG,EAAc,KAAKG,CAAQ,IAEvC,IAAM,CAAC,GACP,IAAY,CAAC,GACb,IAAW,CAAC;GACd;GACA,KAAK,IAAInD,IAAI,GAAGA,IAAIqC,GAAG,KAAK;IAC1B,IAAMO,IAAKN,EAAOtC,IAAI,IAChBqD,IAAKf,EAAOtC,IAAI,IAAI,IACpBsD,IAAKf,IAAUA,EAAQvC,IAAI,IAAI,KAAK;IAC1C,IACE,CAAC,OAAO,SAAS4C,CAAE,KACnB,CAAC,OAAO,SAASS,CAAE,KACnB,CAAC,OAAO,SAASC,CAAE,GACnB;KACA,EAAM;KACN;IACF;IACA,IAAM5E,IAAIkC,EAASvC,GAAIuE,GAAIS,CAAE;IAG7B,IAFAJ,EAAI,KAAKvE,EAAE,GAAGA,EAAE,CAAC,GACb6D,KAASW,EAAU,KAAK7E,EAAG,MAAMiF,CAAE,CAAC,GACpCT,GAAM;KACR,IAAMU,IAAI3C,EAASvC,GAAIuE,GAAIU,CAAE;KAC7B,EAAS,KAAKC,EAAE,GAAGA,EAAE,CAAC;IACxB;GACF;GAcA,IAbAH,EAAM,GACFpJ,EAAE,SAAS,UACbuH,EAAI,KAAK;IACP,MAAM;IACN,aAAavH,EAAE;IACf,OAAOA,EAAE;IACT,SAASA,EAAE;IACX,UAAUqE,EAAG,MAAM5G,EAAM,QAAQ;IACjC;IACA,GAAI8K,IAAU,EAAE,SAASQ,EAAe,IAAI,CAAC;IAC7C,GAAItF,IAAa,EAAE,YAAY,GAAK,IAAI,CAAC;GAC3C,CAAC,GAECzD,EAAE,YAAY,GAAG;IACnB,IAAMpC,IACJoC,EAAE,SAAS,SAAS,KAAK,IAAIA,EAAE,WAAW,CAAC,IAAIA,EAAE;IAQnD,AAPAuH,EAAI,KAAK;KACP,MAAM;KACN,aAAavH,EAAE;KACf,OAAOA,EAAE;KACT;KACA;IACF,CAAC,GACG6I,KACFtB,EAAI,KAAK;KACP,MAAM;KACN,aAAavH,EAAE;KACf,OAAOA,EAAE;KACT;KACA,UAAUgJ;IACZ,CAAC;GACL;GACA;EACF;EACA,IAAIhJ,EAAE,SAAS,SAASA,EAAE,WAAWA,EAAE,QAAQ;GAC7C,IAAM,CAACoG,GAAO6B,KAAOlB,EAAajG,GAAGmG,GAAOD,GAAQtJ,EAAK,CAAC,GACpD8L,IAAO,KAAK,IAAIxJ,EAAE,eAAe,KAAK,IAAIqE,EAAG,MAAM,GAAG,EAAG,GACzDoF,IAAkB,CAAC,GACnB9F,IAAmB,CAAC,GACpB+F,IAAQzB,IAAM7B,IAAQwB,GACxB+B,IAAU;GACd,KAAK,IAAI3D,IAAII,GAAOJ,IAAIiC,GAAK,KAAK;IAChC,IAAMpF,IAAI7C,EAAE,QAAQgG,IACdJ,IAAI5F,EAAE,OAAOgG;IACnB,IAAI,CAAC,OAAO,SAASnD,CAAC,KAAK,CAAC,OAAO,SAAS+C,CAAC,GAAG;IAChD,IAAMhB,IAAKP,EAAG,MAAMvD,EAAEkF,KAAKhG,EAAE,SAAS;IACtC,IAAI4E,IAAK4E,IAAO1B,KAAOlD,IAAK4E,IAAOzB,GAAK;IACxC,IAAM6B,IAAKvF,EAAG,MAAMxB,CAAC,GACfgH,IAAKxF,EAAG,MAAMuB,CAAC,GACf1D,IAAM,KAAK,IAAI0H,GAAIC,CAAE,GACrB/D,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI8D,IAAKC,CAAE,CAAC,GACjCC,IAAM,KAAK,MAAMlF,CAAE;IACzB,IAAI8E,KAASI,MAAQH,KAAWF,EAAM,QAAQ;KAE5C,IAAMjC,IAAIiC,EAAM,SAAS,GACnBrB,IAAS,KAAK,IAAIqB,EAAMjC,IAAI,KAAKiC,EAAMjC,IAAI,IAAItF,IAAM4D,CAAC;KAE5D,AADA,EAAM0B,IAAI,KAAK,KAAK,IAAIiC,EAAMjC,IAAI,IAAItF,CAAG,GACzC,EAAMsF,IAAI,KAAKY,IAASqB,EAAMjC,IAAI;KAClC;IACF;IAEA,AADA,IAAUsC,GACVL,EAAM,KAAK7E,IAAK4E,GAAMtH,GAAKsH,IAAO,GAAG1D,CAAC;IACtC,IAAMiE,IAAK/J,EAAE,cAAcgG;IAC3B,EAAO,KAAK+D,IAAKC,EAAMD,CAAE,IAAI/J,EAAE,QAAQ;GACzC;GACA,EAAI,KAAK;IACP,MAAM;IACN,aAAaA,EAAE;IACf,OAAOA,EAAE;IACT,OAAOqH,EAAQhD,GAAIoF,CAAK;IACxB,GAAIzJ,EAAE,cAAc,EAAE,UAAO,IAAI,CAAC;IAClC,QAAQA,EAAE;IACV,GAAIA,EAAE,UAAU,IAAI,EAAE,SAASA,EAAE,QAAQ,IAAI,CAAC;GAChD,CAAC;GACD;EACF;EACA,IAAIA,EAAE,SAAS,WAAW;GACxB,EAAI,KAAK,GAAGiK,GAAcjK,GAAGqE,GAAI3G,EAAK,GAAGoK,GAAKC,GAAKH,CAAO,CAAC;GAC3D;EACF;EACA,IAAI5H,EAAE,SAAS,eAAe;GAC5B,IAAM,CAACoG,GAAO6B,KAAOlB,EAAajG,GAAGmG,GAAOD,GAAQtJ,EAAK,CAAC,GACpD,EAAE,SAAM,SAAM,WAAQsC,EAAE,MACxBwJ,IAAO,KAAK,IAAIxJ,EAAE,eAAe,KAAK,IAAIqE,EAAG,MAAM,GAAG,CAAC,GACvD6F,IAAKF,EAAMhK,EAAE,OAAO,GACpBmK,IAAOH,EAAMhK,EAAE,SAAS,GACxBoK,IAAkB,CAAC,GACnBC,IAAmB,CAAC,GACpBC,IAAuB,CAAC,GACxBC,IAAuB,CAAC,GACxBC,IAAO,KAAK,IAAI,GAAG,KAAK,MAAMvC,IAAM7B,KAASwB,CAAO,CAAC;GAC3D,KAAK,IAAI5B,IAAII,GAAOJ,IAAIiC,GAAK,KAAKuC,GAAM;IACtC,IAAMC,IAAIlG,EAAEyB,IACNlH,IAAI4L,IAAOA,EAAK1E,KAAKyE;IAC3B,IAAI,CAAC,OAAO,SAASA,CAAC,KAAK,CAAC,OAAO,SAAS3L,CAAC,GAAG;IAChD,IAAM8F,IAAKP,EAAG,MAAMvD,EAAEkF,EAAE;IACxB,IAAIpB,IAAK4E,IAAO1B,KAAOlD,IAAK4E,IAAOzB,GAAK;IACxC,IAAM4C,IAAQF,IAAI3L,IAAIqL,IAAOD,GACvBU,IAAKvG,EAAG,MAAMwG,IAAOA,EAAK7E,KAAK,KAAK,IAAIlH,GAAG2L,CAAC,CAAC,GAC7CK,IAAKzG,EAAG,MAAM0G,IAAMA,EAAI/E,KAAK,KAAK,IAAIlH,GAAG2L,CAAC,CAAC;IAEjD,AADAL,EAAM,KAAKxF,IAAK,IAAK,KAAK,IAAIgG,GAAIE,CAAE,GAAG,GAAG,KAAK,IAAIA,IAAKF,CAAE,CAAC,GAC3DN,EAAW,KAAKK,CAAK;IACrB,IAAMf,IAAKvF,EAAG,MAAMvF,CAAC,GACf+K,IAAKxF,EAAG,MAAMoG,CAAC;IAOrB,AANAJ,EAAO,KACLzF,IAAK4E,GACL,KAAK,IAAII,GAAIC,CAAE,GACfL,IAAO,GACP,KAAK,IAAI,GAAG,KAAK,IAAII,IAAKC,CAAE,CAAC,CAC/B,GACAU,EAAW,KAAKI,CAAK;GACvB;GACA,EAAI,KACF;IACE,MAAM;IACN,aAAa3K,EAAE;IACf,OAAOkK;IACP,OAAO7C,EAAQhD,GAAI+F,CAAK;IACxB,QAAQE;GACV,GACA;IACE,MAAM;IACN,aAAatK,EAAE;IACf,OAAOkK;IACP,OAAO7C,EAAQhD,GAAIgG,CAAM;IACzB,QAAQE;IACR,QAAQ;GACV,CACF;GACA;EACF;EACA,IAAIvK,EAAE,SAAS,WAAW;GACxB,IAAMgL,IAAK,KAAK,IAAIhL,EAAE,SAAS,IAAIqE,EAAG,MAAM,GACtC4G,IAAK,KAAK,IAAIjL,EAAE,SAAS,IAAIqE,EAAG,MAAM,GACtCoF,IAAkB,CAAC,GACnB9F,IAAmB,CAAC,GACpBuH,IAAQC,EAAcH,IAAK,GAAGC,IAAK,GAAGjL,EAAE,MAAM,GAC9CoL,IAAQF,EAAM;GACpB,KAAK,IAAIlF,IAAI,GAAGA,IAAIiB,KAASwC,EAAM,SAAS,IAAI7B,IAAU,GAAG,KAAK;IAChE,IAAM6C,IAAIzK,EAAE,aAAagG;IACzB,IAAI,CAACyE,GAAG;IACR,IAAM1H,IAAIsI,EACRhH,GACAA,EAAG,MAAMvD,EAAEkF,EAAE,IAAIgF,GACjB3G,EAAG,MAAMvD,EAAEkF,EAAE,IAAIgF,GACjB3G,EAAG,MAAME,EAAEyB,EAAE,IAAIiF,GACjB5G,EAAG,MAAME,EAAEyB,EAAE,IAAIiF,CACnB;IACA,AACElI,EAAE,IAAIA,EAAE,QAAQ8B,EAAK,KACrB9B,EAAE,IAAI8B,EAAK,IAAIA,EAAK,SACpB9B,EAAE,IAAIA,EAAE,SAAS8B,EAAK,KACtB9B,EAAE,IAAI8B,EAAK,IAAIA,EAAK,WAGtB4E,EAAM,KACJ1G,EAAE,IAAIqI,GACNrI,EAAE,IAAIqI,GACNrI,EAAE,QAAQqI,IAAQ,GAClBrI,EAAE,SAASqI,IAAQ,CACrB,GACAzH,EAAO,KAAKqG,EAAMsB,EAAYb,CAAC,CAAC,CAAC;GACnC;GACA,EAAI,KAAK;IACP,MAAM;IACN,aAAazK,EAAE;IACf,OAAOA,EAAE;IACT;IACA;IACA,QAAQkL,EAAM;GAChB,CAAC;GACD;EACF;EAEA,IAAMK,IAAiB,CAAC,GAClB5H,IAAmB,CAAC,GACpB6H,KAAW,MAAc;GAC7B,IAAMf,IAAIzK,EAAE,cAAcgG;GAC1B,OAAOyE,IAAIT,EAAMS,CAAC,IAAIzK,EAAE;EAC1B,GACMyL,IAAoB,CAAC,GACrBC,IAAmB,CAAC;EAC1B,KAAK,IAAI1F,IAAI,GAAGA,IAAIiB,GAAO,KAAK;GAC9B,IAAM2B,IAAK9H,EAAEkF,IACPqD,IAAK9E,EAAEyB;GACb,IAAI,CAAC,OAAO,SAAS4C,CAAE,KAAK,CAAC,OAAO,SAASS,CAAE,GAAG;GAClD,IAAM3E,IAAIkC,EAASvC,GAAIuE,GAAIS,CAAE;GAC7B,AACE3E,EAAE,IAAIG,EAAK,KACXH,EAAE,IAAIG,EAAK,IAAIA,EAAK,SACpBH,EAAE,IAAIG,EAAK,KACXH,EAAE,IAAIG,EAAK,IAAIA,EAAK,WAGtB4G,EAAQ,KAAKzF,CAAC,GACd0F,EAAO,KAAKhH,EAAE,GAAGA,EAAE,CAAC;EACtB;EACA,IAAI+G,EAAQ,SAAS/D,GAAS;GAC5B,IAAMiE,IAAO,KAAK,IAAI,GAAGhE,EAAO,WAAW3H,EAAE,YAAY,EAAG,GACtD4L,IAAO,KAAK,KAAK/G,EAAK,QAAQ8G,CAAI,IAAI,GACtCE,oBAAQ,IAAI,IAAoB;GACtC,EAAQ,SAAS,GAAG,MAAM;IACxB,IAAMjH,IAAK,KAAK,OAAO8G,EAAOlE,IAAI,KAAK3C,EAAK,KAAK8G,CAAI,GAC/ChL,IAAK,KAAK,OAAO+K,EAAOlE,IAAI,IAAI,KAAK3C,EAAK,KAAK8G,CAAI;IACzD,EAAM,IAAIhL,IAAKiL,IAAOhH,GAAIoB,CAAC;GAC7B,CAAC;GACD,KAAK,IAAM,CAACjC,GAAK,MAAM8H,GAMrB,AALAN,EAAK,KACH1G,EAAK,KAAMd,IAAM6H,IAAQ,MAAOD,GAChC9G,EAAK,KAAK,KAAK,MAAMd,IAAM6H,CAAI,IAAI,MAAOD,GAC1CA,CACF,GACAhI,EAAO,KAAK6H,EAAQ,CAAC,CAAC;EAE1B,OACE,EAAQ,SAAS,GAAG,MAAM;GAExB,AADAD,EAAK,KAAKG,EAAOlE,IAAI,IAAIkE,EAAOlE,IAAI,IAAI,IAAI3D,EAAQ7D,GAAGgG,CAAC,CAAC,GACzDrC,EAAO,KAAK6H,EAAQxF,CAAC,CAAC;EACxB,CAAC;EAEH,EAAI,KAAK;GACP,MAAM;GACN,aAAahG,EAAE;GACf,SAASA,EAAE;GACX;GACA;EACF,CAAC;CACH;CACA,OAAOuH;AACT,GAGM0C,MACJ,GACA,GACA,GACA,GACA,GACA,MACqB;CACrB,IAAM,EAAE,MAAG,MAAG,UAAO,WAAQ,SAAM,QAAK,OAAI,OAAI,gBAAajK,EAAE,MACzD,CAACoG,GAAO6B,KAAOlB,EAAajG,GAAGmG,GAAOD,GAAQE,CAAK,GACnDsC,IAAO,KAAK,IAAIxJ,EAAE,eAAe,KAAK,IAAIqE,EAAG,MAAM,GAAG,CAAC,GACvDyH,IAAK,KAAK,IAAI,GAAG9L,EAAE,SAAS,GAC5B+L,IAAkB,CAAC,GACnBtK,IAAkB,CAAC,GACnBuK,IAAsB,CAAC,GACvBC,IAAuB,CAAC,GACxBV,IAAiB,CAAC,GAClBW,IAAsB,CAAC,GACvB1B,IAAO,KAAK,IAAI,GAAG,KAAK,MAAMvC,IAAM7B,KAASwB,CAAO,CAAC,GAErDuE,KAAY,GAAY,GAAW,MAAc;EACrD,EAAM,KAAKvH,IAAKkH,IAAK,GAAG,KAAK,IAAIjJ,GAAG+C,CAAC,GAAGkG,GAAI,KAAK,IAAIjJ,IAAI+C,CAAC,CAAC;CAC7D,GAEMwG,KAAU,GAAY,GAAW,GAAY,IAAQN,MAAO;EAChE,EAAM,KAAKlH,IAAKkB,GAAGX,IAAKkH,IAAQ,GAAGvG,IAAI,GAAGuG,CAAK;CACjD;CACA,KAAK,IAAIrG,IAAII,GAAOJ,IAAIiC,GAAK,KAAKuC,GAAM;EACtC,IAAM8B,IAAI/H,EAAEyB;EACZ,IAAI,CAAC,OAAO,SAASsG,CAAC,GAAG;EACzB,IAAM1H,IAAKP,EAAG,MAAMvD,EAAEkF,KAAKhG,EAAE,SAAS;EACtC,IAAI4E,IAAK4E,IAAO1B,KAAOlD,IAAK4E,IAAOzB,GAAK;EACxC,IAAMgC,IAAK/J,EAAE,cAAcgG,IACrB2E,IAAQZ,IAAKC,EAAMD,CAAE,IAAI/J,EAAE,UAC3B8K,IAAKzG,EAAG,MAAM0G,KAAO,OAAO,SAASA,EAAI/E,EAAE,IAAI+E,EAAI/E,KAAKsG,CAAC,GACzD1B,IAAKvG,EAAG,MAAMwG,KAAQ,OAAO,SAASA,EAAK7E,EAAE,IAAI6E,EAAK7E,KAAKsG,CAAC,GAC5DzJ,IAAIwB,EAAG,MAAMkI,KAAM,OAAO,SAASA,EAAGvG,EAAE,IAAIuG,EAAGvG,KAAKsG,CAAC,GACrD1G,IAAIvB,EAAG,MAAMmI,KAAM,OAAO,SAASA,EAAGxG,EAAE,IAAIwG,EAAGxG,KAAKsG,CAAC,GACrDG,IAAShL,EAAM;EAWrB,AAVAsK,EAAM,KAAKnH,IAAK4E,GAAM,KAAK,IAAI3G,GAAG+C,CAAC,GAAG4D,IAAO,GAAG,KAAK,IAAI3G,IAAI+C,CAAC,CAAC,GAC/DoG,EAAU,KAAKrB,CAAK,GACpBwB,EAASvH,GAAIkG,GAAIjI,CAAC,GAClBsJ,EAASvH,GAAIgB,GAAGgF,CAAE,GAClBuB,EAASvH,IAAK4E,GAAM3G,GAAG+C,CAAC,GACxBuG,EAASvH,IAAK4E,GAAM3G,GAAG+C,CAAC,GACxBwG,EAAOxH,GAAI4E,IAAO,GAAGsB,CAAE,GACvBsB,EAAOxH,GAAI4E,IAAO,GAAGoB,CAAE,GACvBwB,EAAOxH,GAAI4E,GAAM3G,CAAC,GAClBuJ,EAAOxH,GAAI4E,GAAM5D,CAAC,GAClBwG,EAAOxH,GAAI4E,GAAMnF,EAAG,MAAMiI,CAAC,GAAG,KAAK,IAAI,GAAGR,IAAK,GAAG,CAAC;EACnD,KAAK,IAAItE,IAAIiF,GAAQjF,IAAI/F,EAAM,QAAQ,KAAK,GAAG,EAAW,KAAKkJ,CAAK;EACpE,IAAMpD,IAAMmF,IAAW1G;EACvB,IAAIuB,GACF,KAAK,IAAM5K,KAAK4K,GAAK;GACnB,IAAM7C,IAAIL,EAAG,aACT;IAAE,GAAGA,EAAG,MAAM1H,CAAC;IAAG,GAAGiI;GAAG,IACxB;IAAE,GAAGA;IAAI,GAAGP,EAAG,MAAM1H,CAAC;GAAE;GAE5B,AADA4O,EAAK,KAAK7G,EAAE,GAAGA,EAAE,GAAG1E,EAAE,WAAW,GACjCkM,EAAU,KAAKvB,CAAK;EACtB;CAEJ;CACA,IAAMgC,IAA0B,CAC9B;EACE,MAAM;EACN,aAAa3M,EAAE;EACf,OAAOA,EAAE;EACT,OAAOqH,EAAQhD,GAAI0H,CAAK;EACxB,QAAQC;EACR,SAAShM,EAAE;CACb,GACA;EACE,MAAM;EACN,aAAaA,EAAE;EACf,OAAOA,EAAE;EACT,OAAOqH,EAAQhD,GAAI5C,CAAK;EACxB,QAAQwK;CACV,CACF;CAWA,OAVIV,EAAK,UACPoB,EAAM,KAAK;EACT,MAAM;EACN,aAAa3M,EAAE;EAEf,SAASA,EAAE,iBAAiB,WAAW,IAAI;EAC3C;EACA,QAAQkM;EACR,QAAQ;CACV,CAAC,GACIS;AACT"}
1
+ {"version":3,"file":"controller.js","names":["copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","createTheme","cache","hidden","listeners","model","view","zoomed","width","height","annotations","dependencies","scene","sceneDirty","lastPlot","destroyed","hover","pointers","gesture","lastTap","emit","type","listener","event","invalidate","interaction","value","o","measure","text","font","size","weight","rebuild","buildModel","clampRange","base","minSpan","sameRange","resolveAnnotations","resolveDependencies","it","setHover","legendLayout","option","named","s","legendShown","cfg","position","ramp","colorLegend","first","last","barWidth","right","barX","cy","l","entries","x","row","w","legendShape","legendHeight","tooltipLayout","tooltip","custom","result","content","tooltipContent","lines","swatchWidth","line","names","values","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","layoutChart","labels","collectPointLabels","occupied","labelHeight","a","textBox","r","rectOf","pos","pointLabels","placeLabels","t","next","connectorSegments","dependencyArrows","guide","crosshairAt","horizontal","hoverMarks","colors","heatPosition","dotSize","rect","key","getScene","scales","changed","sameHover","hitAt","sc","hitTest","y","touch","inPlot","p","dataAt","cx","plot","toData","fromPlotX","fromPlotY","setViewInternal","notify","viewToValues","zoomAt","at","zoomRange","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","createScales","from","to","panRange","current","now","hit","viewFromValues","toScreen","toPlotX","toPlotY","set","visibleRange","sorted","count","range","lowerBound","ORDER","toRects","along","out","k","scenePrimitives","maxDots","limits","maxBars","column","xLo","xHi","series","end","curved","curvePoints","bottom","n","points","bottoms","d","decimateMinMax","nextBottom","j","xv","band","segments","bottomSegments","lowerSegments","run","runBottom","runLower","flush","yv","bv","q","half","rects","merge","lastCol","ya","yb","col","pc","toCss","boxPrimitives","up","down","wicks","bodies","wickColors","bodyColors","step","c","open","color","hi","high","lo","low","hw","hh","style","heatCellStyle","inset","screenRect","unpackColor","dots","colorOf","visible","screen","cell","cols","owner","lw","boxes","boxColors","lineColors","dotColors","vertical","across","thick","m","q1","q3","before","outliers","prims"],"sources":["../../../../../../charts/src/engine/controller.ts"],"sourcesContent":["// createChartController: the platform-free chart. It owns the options, the\n// theme, the model, the visible range and the interactions (pointer / touch\n// gestures fed by the host) and describes what to draw (`getScene`). Hosts\n// only draw: createCanvasChart on any 2D context, the React Native charts\n// with views.\n\nimport { toCss, unpackColor } from \"./color\";\nimport { curvePoints } from \"./curve\";\nimport { lowerBound } from \"./data\";\nimport { decimateMinMax } from \"./decimate\";\nimport {\n createScales,\n heatCellStyle,\n screenRect,\n toData,\n toScreen,\n type Rect,\n type Scales,\n} from \"./layout\";\nimport {\n buildModel,\n fromPlotX,\n fromPlotY,\n heatPosition,\n toPlotX,\n toPlotY,\n viewFromValues,\n viewToValues,\n type ChartModel,\n type DataCache,\n type SeriesModel,\n} from \"./model\";\nimport {\n font,\n placeLabels,\n rectOf,\n textBox,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport {\n collectPointLabels,\n colorLegend,\n connectorSegments,\n crosshairAt,\n dependencyArrows,\n dotSize,\n hitTest,\n hoverMarks,\n layoutChart,\n legendShape,\n legendShown,\n resolveAnnotations,\n resolveDependencies,\n sameHover,\n tooltipContent,\n type ChartLayout,\n type ConnectorSegment,\n type DependencyArrow,\n type ResolvedDependency,\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\n/** Visual map of a heatmap: a gradient bar with the values at its ends */\nexport interface ChartColorLegendLayout {\n /** Box of the gradient bar, pixels of the chart */\n bar: Rect;\n /** CSS colors at even steps along the bar, from the lowest value */\n stops: string[];\n /** Value labels: `x` is the anchor, `align` the side of the text it touches */\n labels: { text: string; x: number; y: number; align: \"left\" | \"right\" }[];\n /** X pixels of the ticks on the bar (the middle of diverging ramps) */\n ticks: number[];\n /** X pixel of the hovered value on the bar (`null` when none) */\n caret: number | null;\n}\n\nexport interface ChartLegendLayout {\n /** Series entries (empty when `colors` is set) */\n entries: ChartLegendEntry[];\n /** Color legend of heatmap charts (instead of the entries) */\n colors: ChartColorLegendLayout | null;\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 * Width of the swatch column of the rows (0 when no row has a swatch):\n * the names start after it, the values are right-aligned on the box\n */\n swatchWidth: number;\n}\n\nexport interface ChartHoverLayout {\n event: ChartHoverEvent;\n marks: HoverMark[];\n /** X pixel of the vertical guide line (`null` when hidden) */\n crosshairX: number | null;\n /** Y pixel of the horizontal guide line of horizontal charts (`null` when hidden) */\n crosshairY: 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 /** Lines between consecutive bars (waterfall connectors) */\n connectors: ConnectorSegment[];\n /** Elbow arrows between bars (`dependencies`, Gantt charts) */\n arrows: DependencyArrow[];\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 dependencies: ResolvedDependency[] = [];\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(\n options.annotations,\n theme,\n model.y.type === \"log\" ? Math.log10 : undefined,\n model.x.type === \"log\" ? Math.log10 : undefined,\n );\n dependencies = resolveDependencies(options.dependencies, 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 if (!legendShown(option, model, named)) return null;\n const cfg = typeof option === \"object\" ? option : {};\n const position = cfg.position === \"bottom\" ? \"bottom\" : \"top\";\n const ramp = colorLegend(model);\n if (ramp) {\n // [min] [gradient] [max], on the right\n const first = ramp.labels[0]?.text ?? \"\";\n const last = ramp.labels[ramp.labels.length - 1]?.text ?? \"\";\n const barWidth = Math.max(60, Math.min(160, width * 0.32));\n const right = width - 4 - measure(last, 11) - 8;\n const barX = right - barWidth;\n const rowY = position === \"bottom\" ? height - LEGEND_ROW : 0;\n const cy = rowY + LEGEND_ROW / 2;\n return {\n entries: [],\n colors: {\n bar: { x: barX, y: cy - 4, width: barWidth, height: 8 },\n stops: ramp.stops,\n labels: [\n { text: first, x: barX - 8, y: cy, align: \"right\" },\n { text: last, x: right + 8, y: cy, align: \"left\" },\n ],\n ticks: ramp.labels\n .filter((l) => l.at > 0 && l.at < 1)\n .map((l) => barX + l.at * barWidth),\n caret: null,\n },\n position,\n toggle: false,\n height: LEGEND_ROW + 6,\n };\n }\n const entries: ChartLegendEntry[] = [];\n let x = 4;\n let row = 0;\n for (const s of model.series) {\n const w = 14 + measure(s.name, 12) + 8;\n if (x + w > width - 4 && x > 4) {\n x = 4;\n row++;\n }\n entries.push({\n id: s.id,\n name: s.name,\n color: s.colorCss,\n shape: legendShape(s.type),\n hidden: s.hidden,\n box: { x, y: row * LEGEND_ROW, width: w, height: LEGEND_ROW },\n });\n x += w + 10;\n }\n const legendHeight = (row + 1) * LEGEND_ROW + 6;\n if (position === \"bottom\") {\n for (const e of entries) e.box.y += height - legendHeight + 6;\n }\n return {\n entries,\n colors: null,\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(\n model,\n event,\n scene?.layout.yTicks ?? null,\n scene?.layout.y2Ticks ?? null,\n );\n const lineHeight = 18;\n const padding = 8;\n let w = 0;\n let lines: number;\n const swatchWidth = content.rows.some((row) => row.color) ? 14 : 0;\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 if (content.subtitle)\n w = Math.max(\n w,\n measure(content.subtitle, 11) + (content.titleColor ? 14 : 0),\n );\n // a label column and a value column, at least 16px apart\n let names = 0;\n let values = 0;\n for (const row of content.rows) {\n names = Math.max(names, measure(row.name, 12));\n values = Math.max(values, measure(row.value, 12, 600));\n }\n if (content.rows.length)\n w = Math.max(w, swatchWidth + names + 16 + values);\n lines = 1 + (content.subtitle ? 1 : 0) + 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 swatchWidth,\n };\n };\n\n const computeScene = (): ChartScene | null => {\n if (width <= 0 || height <= 0) return null;\n const legend = legendLayout();\n const legendTop = legend?.position === \"top\" ? legend.height : 0;\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height: height - (legend?.height ?? 0),\n padding: options.padding,\n top: legendTop,\n measure: (text) => measure(text),\n });\n const labels = collectPointLabels(\n model,\n view,\n layout.scales,\n layout.yTicks,\n );\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n for (const a of annotations) {\n if (a.type === \"text\" && a.text) {\n occupied.push(\n textBox(\n a,\n layout.scales,\n measure(a.text, theme.fontSize, a.weight),\n labelHeight,\n ),\n );\n continue;\n }\n if (a.type !== \"rect\" || !a.label) continue;\n // keep the dot labels off the area titles (drawForeground does the same)\n const r = rectOf(a, layout.scales);\n if (r.width <= 0 || r.height <= 0) continue;\n const w = measure(a.label, theme.fontSize + 1, 600);\n const pos = a.labelPosition;\n occupied.push({\n x: pos.endsWith(\"left\")\n ? r.x + 10\n : pos.endsWith(\"right\")\n ? r.x + r.width - 10 - w\n : r.x + (r.width - w) / 2,\n y: pos.startsWith(\"top\")\n ? r.y + 10\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - 10 - labelHeight\n : r.y + (r.height - 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 connectors: connectorSegments(model, layout.scales),\n arrows: dependencyArrows(model, layout.scales, dependencies),\n };\n scene = next;\n if (hover) {\n const guide = crosshairAt(\n model,\n layout.scales,\n hover.event,\n options.crosshair,\n );\n const horizontal = layout.scales.horizontal;\n next.hover = {\n event: hover.event,\n marks: hoverMarks(model, layout.scales, hover.event),\n crosshairX: horizontal ? null : guide,\n crosshairY: horizontal ? guide : null,\n tooltip:\n gesture?.kind === \"pan\" || gesture?.kind === \"point\"\n ? null\n : tooltipLayout(hover.event, hover.x, hover.y),\n };\n // the hovered value on the color legend\n const colors = legend?.colors;\n const it = hover.event.items[0];\n const s = it ? model.series[it.seriesIndex] : undefined;\n if (colors && it && s?.type === \"heatmap\" && it.value !== undefined)\n colors.caret =\n colors.bar.x + heatPosition(s, it.value) * colors.bar.width;\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 const p = toData(sc, cx, cy);\n // values of the axes (not logarithms)\n return { x: fromPlotX(model, p.x), y: fromPlotY(model, p.y) };\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\", viewToValues(model, 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 const at = toData(sc, x, y);\n if (model.zoom.x) next.x = zoomRange(view.x, at.x, factor);\n if (model.zoom.y) next.y = zoomRange(view.y, at.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 model.horizontal,\n );\n const factor = gesture.distance / distance;\n const next = copyView(gesture.view);\n const from = toData(start, gesture.midX, gesture.midY);\n const to = toData(start, midX, midY);\n // the data under the first midpoint follows the fingers\n if (model.zoom.x) {\n next.x = zoomRange(gesture.view.x, from.x, factor);\n next.x = panRange(next.x, (from.x - to.x) * factor);\n }\n if (model.zoom.y) {\n next.y = zoomRange(gesture.view.y, from.y, factor);\n next.y = panRange(next.y, (from.y - to.y) * factor);\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 next = copyView(gesture.view);\n const from = toData(sc, gesture.x, gesture.y);\n const to = toData(sc, x, y);\n if (model.zoom.x) next.x = panRange(gesture.view.x, from.x - to.x);\n if (model.zoom.y) next.y = panRange(gesture.view.y, from.y - to.y);\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: () => viewToValues(model, view),\n setView(next) {\n if (destroyed) return;\n setViewInternal(viewFromValues(model, next, view), 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 ? toScreen(sc, toPlotX(model, x), toPlotY(model, y)) : null;\n },\n fromPixel(x, y) {\n const sc = scales();\n if (!sc) return null;\n const p = toData(sc, x, y);\n return { x: fromPlotX(model, p.x), y: fromPlotY(model, p.y) };\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 (x pixel when `horizontal`) */\n baseline: number;\n segments: number[][];\n /**\n * Stacked and range areas: y pixel (x pixel when `horizontal`) of the\n * bottom edge under every point of `segments`\n */\n bottoms?: number[][];\n /** Horizontal charts: the area is filled toward the left edge (`baseline` / `bottoms` are x pixels) */\n horizontal?: boolean;\n}\n\nexport interface ChartBarPrimitive {\n kind: \"bars\";\n seriesIndex: number;\n color: string;\n /** Interleaved x, y, width, height */\n rects: number[];\n /** CSS color of every rect (candlesticks, heatmap cells, colored bars); `color` otherwise */\n colors?: string[];\n /** Corner radius in pixels */\n radius?: number;\n /** Opacity of the fill (box plot boxes, translucent bars) */\n opacity?: number;\n}\n\nexport interface ChartDotPrimitive {\n kind: \"dots\";\n seriesIndex: number;\n /** Opacity of the fill (0: rings only) */\n opacity: number;\n /** Interleaved x, y, diameter */\n dots: number[];\n /** CSS color of every dot */\n colors: string[];\n /** Width of a ring of the dot color around every dot, CSS pixels */\n stroke?: number;\n}\n\nexport type ChartPrimitive =\n | ChartLinePrimitive\n | ChartAreaPrimitive\n | ChartBarPrimitive\n | ChartDotPrimitive;\n\nexport interface ChartPrimitiveOptions {\n /**\n * Upper bound of the dots drawn per series: above it the dots are merged\n * into one per occupied cell of their size\n * @default 4000\n */\n maxDots?: number;\n /**\n * Upper bound of the bars drawn per series: above it neighboring bars\n * sharing a pixel column are merged\n * @default 2000\n */\n maxBars?: number;\n /**\n * Width in pixels of the columns lines are decimated to (at most four\n * points per column); larger values mean fewer shapes\n * @default 1\n */\n columnWidth?: number;\n /** Size of the cells dots are merged into (the dot size by default) */\n dotCell?: number;\n}\n\nconst visibleRange = (\n x: Float64Array,\n count: number,\n sorted: boolean,\n range: Range,\n): [number, number] => {\n if (!sorted) return [0, count];\n const [a, b] = range[0] <= range[1] ? range : [range[1], range[0]];\n return [\n Math.max(0, lowerBound(x, count, a) - 1),\n Math.min(count, lowerBound(x, count, b) + 1),\n ];\n};\n\nconst ORDER = {\n heatmap: 0,\n area: 1,\n bar: 2,\n boxplot: 2,\n candlestick: 3,\n line: 4,\n scatter: 5,\n} as const;\n\n/**\n * Rectangles collected along the axes (`x` along the x axis, `y` along the\n * value axis) and turned into screen rects\n */\nconst toRects = (sc: Scales, along: number[]): number[] => {\n if (!sc.horizontal) return along;\n const out = new Array<number>(along.length);\n for (let k = 0; k < along.length; k += 4) {\n out[k] = along[k + 1];\n out[k + 1] = along[k];\n out[k + 2] = along[k + 3];\n out[k + 3] = along[k + 2];\n }\n return out;\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 horizontal = sc.horizontal;\n const maxDots = limits.maxDots ?? 4000;\n const maxBars = limits.maxBars ?? 2000;\n const column = Math.max(1, limits.columnWidth ?? 1);\n // the x axis in pixels (along `xToPx`)\n const xLo = horizontal ? plot.y : plot.x;\n const xHi = xLo + (horizontal ? plot.height : plot.width);\n const out: ChartPrimitive[] = [];\n const series = model.series\n .filter((s) => !s.hidden && s.cols.count > 0)\n .sort((a, b) => ORDER[a.type] - ORDER[b.type] || a.index - b.index);\n for (const s of series) {\n const { x, y, count, sorted } = s.cols;\n if (s.type === \"line\" || s.type === \"area\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const top = s.stackTop ?? y;\n // curve first (in data space), then decimation; the stacked bottom\n // edge follows the same sampling\n const curved = curvePoints(x, top, start, end, s.curve);\n const bottom = s.stackBase\n ? curvePoints(x, s.stackBase, start, end, s.curve).points\n : null;\n let n = curved.length;\n let points = curved.points;\n let bottoms = bottom;\n if (sorted && n > ((xHi - xLo) * 2) / column) {\n if (bottom) {\n // keep the bottoms aligned with the kept tops (same x)\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n const next = new Float64Array(d.length * 2);\n const nextBottom = new Float64Array(d.length * 2);\n let k = 0;\n let j = 0;\n for (let i = 0; i < d.length; i++) {\n const xv = d.points[i * 2];\n while (j < n - 1 && points[j * 2] < xv) j++;\n next[k * 2] = xv;\n next[k * 2 + 1] = d.points[i * 2 + 1];\n nextBottom[k * 2] = xv;\n nextBottom[k * 2 + 1] = bottom[j * 2 + 1];\n k++;\n }\n points = next;\n bottoms = nextBottom;\n n = k;\n } else {\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n points = d.points;\n n = d.length;\n }\n }\n // range areas: a line on the lower edge too\n const band = s.type === \"area\" && !!s.cols.y0 && !!bottoms;\n const segments: number[][] = [];\n const bottomSegments: number[][] = [];\n const lowerSegments: number[][] = [];\n let run: number[] = [];\n let runBottom: number[] = [];\n let runLower: number[] = [];\n const flush = () => {\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n if (band) lowerSegments.push(runLower);\n }\n run = [];\n runBottom = [];\n runLower = [];\n };\n for (let i = 0; i < n; i++) {\n const xv = points[i * 2];\n const yv = points[i * 2 + 1];\n const bv = bottoms ? bottoms[i * 2 + 1] : 0;\n if (\n !Number.isFinite(xv) ||\n !Number.isFinite(yv) ||\n !Number.isFinite(bv)\n ) {\n flush();\n continue;\n }\n const p = toScreen(sc, xv, yv);\n run.push(p.x, p.y);\n if (bottoms) runBottom.push(sc.yToPx(bv));\n if (band) {\n const q = toScreen(sc, xv, bv);\n runLower.push(q.x, q.y);\n }\n }\n flush();\n if (s.type === \"area\") {\n out.push({\n kind: \"area\",\n seriesIndex: s.index,\n color: s.colorCss,\n opacity: s.opacity,\n baseline: sc.yToPx(model.baseline),\n segments,\n ...(bottoms ? { bottoms: bottomSegments } : {}),\n ...(horizontal ? { horizontal: true } : {}),\n });\n }\n if (s.lineWidth > 0) {\n const width =\n s.type === \"area\" ? Math.min(s.lineWidth, 2) : s.lineWidth;\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width,\n segments,\n });\n if (band)\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width,\n segments: lowerSegments,\n });\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 / Math.abs(sc.xPerPx), 0.5);\n const rects: number[] = [];\n const colors: string[] = [];\n const merge = end - start > maxBars;\n let lastCol = NaN;\n for (let i = start; i < end; i++) {\n const a = s.barBase[i];\n const b = s.barTop[i];\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < xLo || cx - half > xHi) 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 along the values\n const k = rects.length - 4;\n const bottom = Math.max(rects[k + 1] + rects[k + 3], top + h);\n rects[k + 1] = Math.min(rects[k + 1], top);\n rects[k + 3] = bottom - rects[k + 1];\n continue;\n }\n lastCol = col;\n rects.push(cx - half, top, half * 2, h);\n const pc = s.pointColors?.[i];\n colors.push(pc ? toCss(pc) : s.colorCss);\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, rects),\n ...(s.pointColors ? { colors } : {}),\n radius: s.radius,\n ...(s.opacity < 1 ? { opacity: s.opacity } : {}),\n });\n continue;\n }\n if (s.type === \"boxplot\") {\n out.push(...boxPrimitives(s, sc, view.x, xLo, xHi, maxBars));\n continue;\n }\n if (s.type === \"candlestick\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const { open, high, low } = s.cols;\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n const up = toCss(s.upColor);\n const down = toCss(s.downColor);\n const wicks: number[] = [];\n const bodies: number[] = [];\n const wickColors: string[] = [];\n const bodyColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n for (let i = start; i < end; i += step) {\n const c = y[i];\n const o = open ? open[i] : c;\n if (!Number.isFinite(c) || !Number.isFinite(o)) continue;\n const cx = sc.xToPx(x[i]);\n if (cx + half < xLo || cx - half > xHi) continue;\n const color = c < o ? down : up;\n const hi = sc.yToPx(high ? high[i] : Math.max(o, c));\n const lo = sc.yToPx(low ? low[i] : Math.min(o, c));\n wicks.push(cx - 0.5, Math.min(hi, lo), 1, Math.abs(lo - hi));\n wickColors.push(color);\n const ya = sc.yToPx(o);\n const yb = sc.yToPx(c);\n bodies.push(\n cx - half,\n Math.min(ya, yb),\n half * 2,\n Math.max(1, Math.abs(ya - yb)),\n );\n bodyColors.push(color);\n }\n out.push(\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: toRects(sc, wicks),\n colors: wickColors,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: toRects(sc, bodies),\n colors: bodyColors,\n radius: 1,\n },\n );\n continue;\n }\n if (s.type === \"heatmap\") {\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const rects: number[] = [];\n const colors: string[] = [];\n const style = heatCellStyle(hw * 2, hh * 2, s.radius);\n const inset = style.inset;\n for (let i = 0; i < count && rects.length / 4 < maxBars * 4; i++) {\n const c = s.cellColors?.[i];\n if (!c) continue;\n const r = screenRect(\n sc,\n sc.xToPx(x[i]) - hw,\n sc.xToPx(x[i]) + hw,\n sc.yToPx(y[i]) - hh,\n sc.yToPx(y[i]) + hh,\n );\n if (\n r.x + r.width < plot.x ||\n r.x > plot.x + plot.width ||\n r.y + r.height < plot.y ||\n r.y > plot.y + plot.height\n )\n continue;\n rects.push(\n r.x + inset,\n r.y + inset,\n r.width - inset * 2,\n r.height - inset * 2,\n );\n colors.push(toCss(unpackColor(c)));\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n colors,\n radius: style.radius,\n });\n continue;\n }\n // scatter\n const dots: number[] = [];\n const colors: string[] = [];\n const colorOf = (i: number) => {\n const c = s.pointColors?.[i];\n return c ? toCss(c) : s.colorCss;\n };\n const visible: number[] = [];\n const screen: 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 p = toScreen(sc, xv, yv);\n if (\n p.x < plot.x ||\n p.x > plot.x + plot.width ||\n p.y < plot.y ||\n p.y > plot.y + plot.height\n )\n continue;\n visible.push(i);\n screen.push(p.x, p.y);\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 visible.forEach((i, k) => {\n const cx = Math.floor((screen[k * 2] - plot.x) / cell);\n const cy = Math.floor((screen[k * 2 + 1] - 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 visible.forEach((i, k) => {\n dots.push(screen[k * 2], screen[k * 2 + 1], 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\n/** Box plot shapes: translucent boxes, then whiskers, caps, edges and medians, then outliers */\nconst boxPrimitives = (\n s: SeriesModel,\n sc: Scales,\n range: Range,\n xLo: number,\n xHi: number,\n maxBars: number,\n): ChartPrimitive[] => {\n const { x, y, count, sorted, high, low, q1, q3, outliers } = s.cols;\n const [start, end] = visibleRange(x, count, sorted, range);\n const half = Math.max(s.barHalfWidth / Math.abs(sc.xPerPx), 1);\n const lw = Math.max(1, s.lineWidth);\n const boxes: number[] = [];\n const lines: number[] = [];\n const boxColors: string[] = [];\n const lineColors: string[] = [];\n const dots: number[] = [];\n const dotColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n /** A line along the values (a whisker or a side) */\n const vertical = (cx: number, a: number, b: number) => {\n lines.push(cx - lw / 2, Math.min(a, b), lw, Math.abs(a - b));\n };\n /** A line across the box (an edge, a cap or the median) */\n const across = (cx: number, h: number, at: number, thick = lw) => {\n lines.push(cx - h, at - thick / 2, h * 2, thick);\n };\n for (let i = start; i < end; i += step) {\n const m = y[i];\n if (!Number.isFinite(m)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < xLo || cx - half > xHi) continue;\n const pc = s.pointColors?.[i];\n const color = pc ? toCss(pc) : s.colorCss;\n const lo = sc.yToPx(low && Number.isFinite(low[i]) ? low[i] : m);\n const hi = sc.yToPx(high && Number.isFinite(high[i]) ? high[i] : m);\n const a = sc.yToPx(q1 && Number.isFinite(q1[i]) ? q1[i] : m);\n const b = sc.yToPx(q3 && Number.isFinite(q3[i]) ? q3[i] : m);\n const before = lines.length;\n boxes.push(cx - half, Math.min(a, b), half * 2, Math.abs(a - b));\n boxColors.push(color);\n vertical(cx, lo, a);\n vertical(cx, b, hi);\n vertical(cx - half, a, b);\n vertical(cx + half, a, b);\n across(cx, half / 2, lo);\n across(cx, half / 2, hi);\n across(cx, half, a);\n across(cx, half, b);\n across(cx, half, sc.yToPx(m), Math.max(2, lw * 1.6));\n for (let k = before; k < lines.length; k += 4) lineColors.push(color);\n const out = outliers?.[i];\n if (out) {\n for (const v of out) {\n const p = sc.horizontal\n ? { x: sc.yToPx(v), y: cx }\n : { x: cx, y: sc.yToPx(v) };\n dots.push(p.x, p.y, s.outlierSize);\n dotColors.push(color);\n }\n }\n }\n const prims: ChartPrimitive[] = [\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, boxes),\n colors: boxColors,\n opacity: s.opacity,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects: toRects(sc, lines),\n colors: lineColors,\n },\n ];\n if (dots.length)\n prims.push({\n kind: \"dots\",\n seriesIndex: s.index,\n // rings of the series color, or filled dots\n opacity: s.outlierShape === \"hollow\" ? 0 : 0.85,\n dots,\n colors: dotColors,\n stroke: 1.25,\n });\n return prims;\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("./locale.cjs");var t={en:{open:`Open`,high:`High`,low:`Low`,close:`Close`,max:`Max`,q3:`Q3`,median:`Median`,q1:`Q1`,min:`Min`,outliers:`Outliers`,value:`Value`,x:`x`,y:`y`,series:`Series`,chart:`Chart`,chartOf:`Chart: {series}`,start:`Start`,end:`End`,duration:`Duration`,progress:`Progress`,dependencies:`Depends on`,outlier:`Outlier`},zh:{open:`开盘`,high:`最高`,low:`最低`,close:`收盘`,max:`最大值`,q3:`上四分位`,median:`中位数`,q1:`下四分位`,min:`最小值`,outliers:`异常值`,value:`数值`,series:`系列`,chart:`图表`,chartOf:`图表:{series}`,start:`开始`,end:`结束`,duration:`时长`,progress:`进度`,dependencies:`前置任务`,outlier:`异常值`},ja:{open:`始値`,high:`高値`,low:`安値`,close:`終値`,max:`最大値`,q3:`第3四分位`,median:`中央値`,q1:`第1四分位`,min:`最小値`,outliers:`外れ値`,value:`値`,series:`系列`,chart:`グラフ`,chartOf:`グラフ:{series}`,start:`開始`,end:`終了`,duration:`期間`,progress:`進捗`,dependencies:`先行タスク`,outlier:`外れ値`},fr:{open:`Ouverture`,high:`Plus haut`,low:`Plus bas`,close:`Clôture`,max:`Max`,q3:`Q3`,median:`Médiane`,q1:`Q1`,min:`Min`,outliers:`Valeurs aberrantes`,value:`Valeur`,series:`Série`,chart:`Graphique`,chartOf:`Graphique : {series}`,start:`Début`,end:`Fin`,duration:`Durée`,progress:`Avancement`,dependencies:`Dépend de`,outlier:`Valeur aberrante`}},n=(n,r)=>e.localeLabels(t,n,r),r=e=>/^(zh|ja)\b/i.test(e)?`、`:`, `,i=e=>e.series.length?e.labels.chartOf.replace(`{series}`,e.series.map(e=>e.name).join(r(e.locale))):e.labels.chart;exports.CHART_LABELS=t,exports.chartAriaLabel=i,exports.chartLabels=n;
1
+ const e=require("./locale.cjs");var t={en:{open:`Open`,high:`High`,low:`Low`,close:`Close`,max:`Max`,q3:`Q3`,median:`Median`,q1:`Q1`,min:`Min`,outliers:`Outliers`,value:`Value`,x:`x`,y:`y`,series:`Series`,chart:`Chart`,chartOf:`Chart: {series}`,start:`Start`,end:`End`,duration:`Duration`,progress:`Progress`,dependencies:`Depends on`,outlier:`Outlier`},zh:{open:`开盘`,high:`最高`,low:`最低`,close:`收盘`,max:`最大值`,q3:`上四分位`,median:`中位数`,q1:`下四分位`,min:`最小值`,outliers:`异常值`,value:`数值`,series:`系列`,chart:`图表`,chartOf:`图表:{series}`,start:`开始`,end:`结束`,duration:`时长`,progress:`进度`,dependencies:`前置任务`,outlier:`异常值`},ja:{open:`始値`,high:`高値`,low:`安値`,close:`終値`,max:`最大値`,q3:`第3四分位`,median:`中央値`,q1:`第1四分位`,min:`最小値`,outliers:`外れ値`,value:`値`,series:`系列`,chart:`グラフ`,chartOf:`グラフ:{series}`,start:`開始`,end:`終了`,duration:`期間`,progress:`進捗`,dependencies:`先行タスク`,outlier:`外れ値`},fr:{open:`Ouverture`,high:`Plus haut`,low:`Plus bas`,close:`Clôture`,max:`Max`,q3:`Q3`,median:`Médiane`,q1:`Q1`,min:`Min`,outliers:`Valeurs aberrantes`,value:`Valeur`,series:`Série`,chart:`Graphique`,chartOf:`Graphique : {series}`,start:`Début`,end:`Fin`,duration:`Durée`,progress:`Avancement`,dependencies:`Dépend de`,outlier:`Valeur aberrante`}},n=(n,r)=>e.localeLabels(t,n,r),r=e=>/^(zh|ja)\b/i.test(e)?`、`:`, `,i=e=>e.series.length?e.labels.chartOf.replace(`{series}`,e.series.map(e=>e.name).join(r(e.locale))):e.labels.chart;function a(e){let t=e.locale??`en`,a=n(t,e.labels),o=e.series??[],s=e.title?.trim(),c=i({labels:a,locale:t,series:o});if(!s)return c;if(!o.length)return s;let l=a.chartOf.indexOf(a.chart);if(l<0||!a.chart)return`${s}. ${c}`;let u=o.map(e=>e.name).join(r(t)),d=e=>e.split(`{series}`).join(u);return d(a.chartOf.slice(0,l))+s+d(a.chartOf.slice(l+a.chart.length))}exports.CHART_LABELS=t,exports.chartAriaLabel=i,exports.chartLabels=n,exports.describeChart=a;
2
2
  //# sourceMappingURL=labels.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"labels.cjs","names":["localeLabels","require_locale","CHART_LABELS","chartLabels","locale","overrides","listSeparator","chartAriaLabel","model","s"],"sources":["../../../../../../charts/src/engine/labels.ts"],"sourcesContent":["// Built-in texts of the cartesian engine (tooltip rows, accessible names).\n\nimport { localeLabels, type LabelDictionary } from \"./locale\";\nimport type { ChartLabels } from \"./types\";\n\nexport const CHART_LABELS: LabelDictionary<ChartLabels> = {\n en: {\n open: \"Open\",\n high: \"High\",\n low: \"Low\",\n close: \"Close\",\n max: \"Max\",\n q3: \"Q3\",\n median: \"Median\",\n q1: \"Q1\",\n min: \"Min\",\n outliers: \"Outliers\",\n value: \"Value\",\n x: \"x\",\n y: \"y\",\n series: \"Series\",\n chart: \"Chart\",\n chartOf: \"Chart: {series}\",\n start: \"Start\",\n end: \"End\",\n duration: \"Duration\",\n progress: \"Progress\",\n dependencies: \"Depends on\",\n outlier: \"Outlier\",\n },\n zh: {\n open: \"开盘\",\n high: \"最高\",\n low: \"最低\",\n close: \"收盘\",\n max: \"最大值\",\n q3: \"上四分位\",\n median: \"中位数\",\n q1: \"下四分位\",\n min: \"最小值\",\n outliers: \"异常值\",\n value: \"数值\",\n series: \"系列\",\n chart: \"图表\",\n chartOf: \"图表:{series}\",\n start: \"开始\",\n end: \"结束\",\n duration: \"时长\",\n progress: \"进度\",\n dependencies: \"前置任务\",\n outlier: \"异常值\",\n },\n ja: {\n open: \"始値\",\n high: \"高値\",\n low: \"安値\",\n close: \"終値\",\n max: \"最大値\",\n q3: \"第3四分位\",\n median: \"中央値\",\n q1: \"第1四分位\",\n min: \"最小値\",\n outliers: \"外れ値\",\n value: \"値\",\n series: \"系列\",\n chart: \"グラフ\",\n chartOf: \"グラフ:{series}\",\n start: \"開始\",\n end: \"終了\",\n duration: \"期間\",\n progress: \"進捗\",\n dependencies: \"先行タスク\",\n outlier: \"外れ値\",\n },\n fr: {\n open: \"Ouverture\",\n high: \"Plus haut\",\n low: \"Plus bas\",\n close: \"Clôture\",\n max: \"Max\",\n q3: \"Q3\",\n median: \"Médiane\",\n q1: \"Q1\",\n min: \"Min\",\n outliers: \"Valeurs aberrantes\",\n value: \"Valeur\",\n series: \"Série\",\n chart: \"Graphique\",\n chartOf: \"Graphique : {series}\",\n start: \"Début\",\n end: \"Fin\",\n duration: \"Durée\",\n progress: \"Avancement\",\n dependencies: \"Dépend de\",\n outlier: \"Valeur aberrante\",\n },\n};\n\n/** Texts of a locale with the overrides */\nexport const chartLabels = (\n locale: string,\n overrides?: Partial<ChartLabels>,\n): ChartLabels => localeLabels(CHART_LABELS, locale, overrides);\n\n/** Separator of the list of series names in accessible names */\nconst listSeparator = (locale: string) =>\n /^(zh|ja)\\b/i.test(locale) ? \"、\" : \", \";\n\n/** Default accessible name of a chart model: \"Chart: Revenue, Costs\" */\nexport const chartAriaLabel = (model: {\n labels: ChartLabels;\n locale: string;\n series: readonly { name: string }[];\n}): string =>\n model.series.length\n ? model.labels.chartOf.replace(\n \"{series}\",\n model.series.map((s) => s.name).join(listSeparator(model.locale)),\n )\n : model.labels.chart;\n"],"mappings":"gCAKA,IAAaE,EAA6C,CACxD,GAAI,CACF,KAAM,OACN,KAAM,OACN,IAAK,MACL,MAAO,QACP,IAAK,MACL,GAAI,KACJ,OAAQ,SACR,GAAI,KACJ,IAAK,MACL,SAAU,WACV,MAAO,QACP,EAAG,IACH,EAAG,IACH,OAAQ,SACR,MAAO,QACP,QAAS,kBACT,MAAO,QACP,IAAK,MACL,SAAU,WACV,SAAU,WACV,aAAc,aACd,QAAS,SACX,EACA,GAAI,CACF,KAAM,KACN,KAAM,KACN,IAAK,KACL,MAAO,KACP,IAAK,MACL,GAAI,OACJ,OAAQ,MACR,GAAI,OACJ,IAAK,MACL,SAAU,MACV,MAAO,KACP,OAAQ,KACR,MAAO,KACP,QAAS,cACT,MAAO,KACP,IAAK,KACL,SAAU,KACV,SAAU,KACV,aAAc,OACd,QAAS,KACX,EACA,GAAI,CACF,KAAM,KACN,KAAM,KACN,IAAK,KACL,MAAO,KACP,IAAK,MACL,GAAI,QACJ,OAAQ,MACR,GAAI,QACJ,IAAK,MACL,SAAU,MACV,MAAO,IACP,OAAQ,KACR,MAAO,MACP,QAAS,eACT,MAAO,KACP,IAAK,KACL,SAAU,KACV,SAAU,KACV,aAAc,QACd,QAAS,KACX,EACA,GAAI,CACF,KAAM,YACN,KAAM,YACN,IAAK,WACL,MAAO,UACP,IAAK,MACL,GAAI,KACJ,OAAQ,UACR,GAAI,KACJ,IAAK,MACL,SAAU,qBACV,MAAO,SACP,OAAQ,QACR,MAAO,YACP,QAAS,uBACT,MAAO,QACP,IAAK,MACL,SAAU,QACV,SAAU,aACV,aAAc,YACd,QAAS,kBACX,CACF,EAGaC,GACX,EACA,IACgBH,EAAAA,aAAaE,EAAcE,EAAQC,CAAS,EAGxDC,EAAiB,GACrB,cAAc,KAAKF,CAAM,EAAI,IAAM,KAGxBG,EAAkB,GAK7BC,EAAM,OAAO,OACTA,EAAM,OAAO,QAAQ,QACnB,WACAA,EAAM,OAAO,IAAK,GAAMC,EAAE,IAAI,CAAC,CAAC,KAAKH,EAAcE,EAAM,MAAM,CAAC,CAClE,EACAA,EAAM,OAAO"}
1
+ {"version":3,"file":"labels.cjs","names":["localeLabels","require_locale","CHART_LABELS","chartLabels","locale","overrides","listSeparator","chartAriaLabel","model","s","describeChart","input","labels","series","title","generic","index","names","fill","part"],"sources":["../../../../../../charts/src/engine/labels.ts"],"sourcesContent":["// Built-in texts of the cartesian engine (tooltip rows, accessible names).\n\nimport { localeLabels, type LabelDictionary } from \"./locale\";\nimport type { ChartLabels } from \"./types\";\n\nexport const CHART_LABELS: LabelDictionary<ChartLabels> = {\n en: {\n open: \"Open\",\n high: \"High\",\n low: \"Low\",\n close: \"Close\",\n max: \"Max\",\n q3: \"Q3\",\n median: \"Median\",\n q1: \"Q1\",\n min: \"Min\",\n outliers: \"Outliers\",\n value: \"Value\",\n x: \"x\",\n y: \"y\",\n series: \"Series\",\n chart: \"Chart\",\n chartOf: \"Chart: {series}\",\n start: \"Start\",\n end: \"End\",\n duration: \"Duration\",\n progress: \"Progress\",\n dependencies: \"Depends on\",\n outlier: \"Outlier\",\n },\n zh: {\n open: \"开盘\",\n high: \"最高\",\n low: \"最低\",\n close: \"收盘\",\n max: \"最大值\",\n q3: \"上四分位\",\n median: \"中位数\",\n q1: \"下四分位\",\n min: \"最小值\",\n outliers: \"异常值\",\n value: \"数值\",\n series: \"系列\",\n chart: \"图表\",\n chartOf: \"图表:{series}\",\n start: \"开始\",\n end: \"结束\",\n duration: \"时长\",\n progress: \"进度\",\n dependencies: \"前置任务\",\n outlier: \"异常值\",\n },\n ja: {\n open: \"始値\",\n high: \"高値\",\n low: \"安値\",\n close: \"終値\",\n max: \"最大値\",\n q3: \"第3四分位\",\n median: \"中央値\",\n q1: \"第1四分位\",\n min: \"最小値\",\n outliers: \"外れ値\",\n value: \"値\",\n series: \"系列\",\n chart: \"グラフ\",\n chartOf: \"グラフ:{series}\",\n start: \"開始\",\n end: \"終了\",\n duration: \"期間\",\n progress: \"進捗\",\n dependencies: \"先行タスク\",\n outlier: \"外れ値\",\n },\n fr: {\n open: \"Ouverture\",\n high: \"Plus haut\",\n low: \"Plus bas\",\n close: \"Clôture\",\n max: \"Max\",\n q3: \"Q3\",\n median: \"Médiane\",\n q1: \"Q1\",\n min: \"Min\",\n outliers: \"Valeurs aberrantes\",\n value: \"Valeur\",\n series: \"Série\",\n chart: \"Graphique\",\n chartOf: \"Graphique : {series}\",\n start: \"Début\",\n end: \"Fin\",\n duration: \"Durée\",\n progress: \"Avancement\",\n dependencies: \"Dépend de\",\n outlier: \"Valeur aberrante\",\n },\n};\n\n/** Texts of a locale with the overrides */\nexport const chartLabels = (\n locale: string,\n overrides?: Partial<ChartLabels>,\n): ChartLabels => localeLabels(CHART_LABELS, locale, overrides);\n\n/** Separator of the list of series names in accessible names */\nconst listSeparator = (locale: string) =>\n /^(zh|ja)\\b/i.test(locale) ? \"、\" : \", \";\n\n/** Default accessible name of a chart model: \"Chart: Revenue, Costs\" */\nexport const chartAriaLabel = (model: {\n labels: ChartLabels;\n locale: string;\n series: readonly { name: string }[];\n}): string =>\n model.series.length\n ? model.labels.chartOf.replace(\n \"{series}\",\n model.series.map((s) => s.name).join(listSeparator(model.locale)),\n )\n : model.labels.chart;\n\n/**\n * Localized accessible description of a chart, for platforms that build their\n * own accessible name (\"Chart: Revenue, Costs\", \"营收:营收、成本\").\n * With a `title`, the title replaces the generic \"Chart\" word.\n */\nexport function describeChart(input: {\n /** BCP 47 locale (default \"en\") */\n locale?: string;\n /** Series of the chart (only their names are used) */\n series?: readonly { name: string }[];\n /** Title of the chart */\n title?: string;\n /** Overrides of the built-in texts */\n labels?: Partial<ChartLabels>;\n}): string {\n const locale = input.locale ?? \"en\";\n const labels = chartLabels(locale, input.labels);\n const series = input.series ?? [];\n const title = input.title?.trim();\n const generic = chartAriaLabel({ labels, locale, series });\n if (!title) return generic;\n if (!series.length) return title;\n const index = labels.chartOf.indexOf(labels.chart);\n if (index < 0 || !labels.chart) return `${title}. ${generic}`;\n const names = series.map((s) => s.name).join(listSeparator(locale));\n const fill = (part: string) => part.split(\"{series}\").join(names);\n return (\n fill(labels.chartOf.slice(0, index)) +\n title +\n fill(labels.chartOf.slice(index + labels.chart.length))\n );\n}\n"],"mappings":"gCAKA,IAAaE,EAA6C,CACxD,GAAI,CACF,KAAM,OACN,KAAM,OACN,IAAK,MACL,MAAO,QACP,IAAK,MACL,GAAI,KACJ,OAAQ,SACR,GAAI,KACJ,IAAK,MACL,SAAU,WACV,MAAO,QACP,EAAG,IACH,EAAG,IACH,OAAQ,SACR,MAAO,QACP,QAAS,kBACT,MAAO,QACP,IAAK,MACL,SAAU,WACV,SAAU,WACV,aAAc,aACd,QAAS,SACX,EACA,GAAI,CACF,KAAM,KACN,KAAM,KACN,IAAK,KACL,MAAO,KACP,IAAK,MACL,GAAI,OACJ,OAAQ,MACR,GAAI,OACJ,IAAK,MACL,SAAU,MACV,MAAO,KACP,OAAQ,KACR,MAAO,KACP,QAAS,cACT,MAAO,KACP,IAAK,KACL,SAAU,KACV,SAAU,KACV,aAAc,OACd,QAAS,KACX,EACA,GAAI,CACF,KAAM,KACN,KAAM,KACN,IAAK,KACL,MAAO,KACP,IAAK,MACL,GAAI,QACJ,OAAQ,MACR,GAAI,QACJ,IAAK,MACL,SAAU,MACV,MAAO,IACP,OAAQ,KACR,MAAO,MACP,QAAS,eACT,MAAO,KACP,IAAK,KACL,SAAU,KACV,SAAU,KACV,aAAc,QACd,QAAS,KACX,EACA,GAAI,CACF,KAAM,YACN,KAAM,YACN,IAAK,WACL,MAAO,UACP,IAAK,MACL,GAAI,KACJ,OAAQ,UACR,GAAI,KACJ,IAAK,MACL,SAAU,qBACV,MAAO,SACP,OAAQ,QACR,MAAO,YACP,QAAS,uBACT,MAAO,QACP,IAAK,MACL,SAAU,QACV,SAAU,aACV,aAAc,YACd,QAAS,kBACX,CACF,EAGaC,GACX,EACA,IACgBH,EAAAA,aAAaE,EAAcE,EAAQC,CAAS,EAGxDC,EAAiB,GACrB,cAAc,KAAKF,CAAM,EAAI,IAAM,KAGxBG,EAAkB,GAK7BC,EAAM,OAAO,OACTA,EAAM,OAAO,QAAQ,QACnB,WACAA,EAAM,OAAO,IAAK,GAAMC,EAAE,IAAI,CAAC,CAAC,KAAKH,EAAcE,EAAM,MAAM,CAAC,CAClE,EACAA,EAAM,OAAO,MAOnB,SAAgBE,EAAc,EASnB,CACT,IAAMN,EAASO,EAAM,QAAU,KACzBC,EAAST,EAAYC,EAAQO,EAAM,MAAM,EACzCE,EAASF,EAAM,QAAU,CAAC,EAC1BG,EAAQH,EAAM,OAAO,KAAK,EAC1BI,EAAUR,EAAe,CAAE,SAAQ,SAAQ,QAAO,CAAC,EACzD,GAAI,CAACO,EAAO,OAAOC,EACnB,GAAI,CAACF,EAAO,OAAQ,OAAOC,EAC3B,IAAME,EAAQJ,EAAO,QAAQ,QAAQA,EAAO,KAAK,EACjD,GAAII,EAAQ,GAAK,CAACJ,EAAO,MAAO,MAAO,GAAGE,EAAM,IAAIC,IACpD,IAAME,EAAQJ,EAAO,IAAK,GAAMJ,EAAE,IAAI,CAAC,CAAC,KAAKH,EAAcF,CAAM,CAAC,EAC5Dc,EAAQ,GAAiBC,EAAK,MAAM,UAAU,CAAC,CAAC,KAAKF,CAAK,EAChE,OACEC,EAAKN,EAAO,QAAQ,MAAM,EAAGI,CAAK,CAAC,EACnCF,EACAI,EAAKN,EAAO,QAAQ,MAAMI,EAAQJ,EAAO,MAAM,MAAM,CAAC,CAE1D"}
@@ -92,7 +92,20 @@ var t = {
92
92
  outlier: "Valeur aberrante"
93
93
  }
94
94
  }, n = (n, r) => e(t, n, r), r = (e) => /^(zh|ja)\b/i.test(e) ? "、" : ", ", i = (e) => e.series.length ? e.labels.chartOf.replace("{series}", e.series.map((e) => e.name).join(r(e.locale))) : e.labels.chart;
95
+ function a(e) {
96
+ let t = e.locale ?? "en", a = n(t, e.labels), o = e.series ?? [], s = e.title?.trim(), c = i({
97
+ labels: a,
98
+ locale: t,
99
+ series: o
100
+ });
101
+ if (!s) return c;
102
+ if (!o.length) return s;
103
+ let l = a.chartOf.indexOf(a.chart);
104
+ if (l < 0 || !a.chart) return `${s}. ${c}`;
105
+ let u = o.map((e) => e.name).join(r(t)), d = (e) => e.split("{series}").join(u);
106
+ return d(a.chartOf.slice(0, l)) + s + d(a.chartOf.slice(l + a.chart.length));
107
+ }
95
108
  //#endregion
96
- export { t as CHART_LABELS, i as chartAriaLabel, n as chartLabels };
109
+ export { t as CHART_LABELS, i as chartAriaLabel, n as chartLabels, a as describeChart };
97
110
 
98
111
  //# sourceMappingURL=labels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"labels.js","names":["CHART_LABELS","chartLabels","localeLabels","locale","overrides","listSeparator","chartAriaLabel","model","s"],"sources":["../../../../../../charts/src/engine/labels.ts"],"sourcesContent":["// Built-in texts of the cartesian engine (tooltip rows, accessible names).\n\nimport { localeLabels, type LabelDictionary } from \"./locale\";\nimport type { ChartLabels } from \"./types\";\n\nexport const CHART_LABELS: LabelDictionary<ChartLabels> = {\n en: {\n open: \"Open\",\n high: \"High\",\n low: \"Low\",\n close: \"Close\",\n max: \"Max\",\n q3: \"Q3\",\n median: \"Median\",\n q1: \"Q1\",\n min: \"Min\",\n outliers: \"Outliers\",\n value: \"Value\",\n x: \"x\",\n y: \"y\",\n series: \"Series\",\n chart: \"Chart\",\n chartOf: \"Chart: {series}\",\n start: \"Start\",\n end: \"End\",\n duration: \"Duration\",\n progress: \"Progress\",\n dependencies: \"Depends on\",\n outlier: \"Outlier\",\n },\n zh: {\n open: \"开盘\",\n high: \"最高\",\n low: \"最低\",\n close: \"收盘\",\n max: \"最大值\",\n q3: \"上四分位\",\n median: \"中位数\",\n q1: \"下四分位\",\n min: \"最小值\",\n outliers: \"异常值\",\n value: \"数值\",\n series: \"系列\",\n chart: \"图表\",\n chartOf: \"图表:{series}\",\n start: \"开始\",\n end: \"结束\",\n duration: \"时长\",\n progress: \"进度\",\n dependencies: \"前置任务\",\n outlier: \"异常值\",\n },\n ja: {\n open: \"始値\",\n high: \"高値\",\n low: \"安値\",\n close: \"終値\",\n max: \"最大値\",\n q3: \"第3四分位\",\n median: \"中央値\",\n q1: \"第1四分位\",\n min: \"最小値\",\n outliers: \"外れ値\",\n value: \"値\",\n series: \"系列\",\n chart: \"グラフ\",\n chartOf: \"グラフ:{series}\",\n start: \"開始\",\n end: \"終了\",\n duration: \"期間\",\n progress: \"進捗\",\n dependencies: \"先行タスク\",\n outlier: \"外れ値\",\n },\n fr: {\n open: \"Ouverture\",\n high: \"Plus haut\",\n low: \"Plus bas\",\n close: \"Clôture\",\n max: \"Max\",\n q3: \"Q3\",\n median: \"Médiane\",\n q1: \"Q1\",\n min: \"Min\",\n outliers: \"Valeurs aberrantes\",\n value: \"Valeur\",\n series: \"Série\",\n chart: \"Graphique\",\n chartOf: \"Graphique : {series}\",\n start: \"Début\",\n end: \"Fin\",\n duration: \"Durée\",\n progress: \"Avancement\",\n dependencies: \"Dépend de\",\n outlier: \"Valeur aberrante\",\n },\n};\n\n/** Texts of a locale with the overrides */\nexport const chartLabels = (\n locale: string,\n overrides?: Partial<ChartLabels>,\n): ChartLabels => localeLabels(CHART_LABELS, locale, overrides);\n\n/** Separator of the list of series names in accessible names */\nconst listSeparator = (locale: string) =>\n /^(zh|ja)\\b/i.test(locale) ? \"、\" : \", \";\n\n/** Default accessible name of a chart model: \"Chart: Revenue, Costs\" */\nexport const chartAriaLabel = (model: {\n labels: ChartLabels;\n locale: string;\n series: readonly { name: string }[];\n}): string =>\n model.series.length\n ? model.labels.chartOf.replace(\n \"{series}\",\n model.series.map((s) => s.name).join(listSeparator(model.locale)),\n )\n : model.labels.chart;\n"],"mappings":";;AAKA,IAAaA,IAA6C;CACxD,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,KAAK;EACL,IAAI;EACJ,QAAQ;EACR,IAAI;EACJ,KAAK;EACL,UAAU;EACV,OAAO;EACP,GAAG;EACH,GAAG;EACH,QAAQ;EACR,OAAO;EACP,SAAS;EACT,OAAO;EACP,KAAK;EACL,UAAU;EACV,UAAU;EACV,cAAc;EACd,SAAS;CACX;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,KAAK;EACL,IAAI;EACJ,QAAQ;EACR,IAAI;EACJ,KAAK;EACL,UAAU;EACV,OAAO;EACP,QAAQ;EACR,OAAO;EACP,SAAS;EACT,OAAO;EACP,KAAK;EACL,UAAU;EACV,UAAU;EACV,cAAc;EACd,SAAS;CACX;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,KAAK;EACL,IAAI;EACJ,QAAQ;EACR,IAAI;EACJ,KAAK;EACL,UAAU;EACV,OAAO;EACP,QAAQ;EACR,OAAO;EACP,SAAS;EACT,OAAO;EACP,KAAK;EACL,UAAU;EACV,UAAU;EACV,cAAc;EACd,SAAS;CACX;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,KAAK;EACL,IAAI;EACJ,QAAQ;EACR,IAAI;EACJ,KAAK;EACL,UAAU;EACV,OAAO;EACP,QAAQ;EACR,OAAO;EACP,SAAS;EACT,OAAO;EACP,KAAK;EACL,UAAU;EACV,UAAU;EACV,cAAc;EACd,SAAS;CACX;AACF,GAGaC,KACX,GACA,MACgBC,EAAaF,GAAcG,GAAQC,CAAS,GAGxDC,KAAiB,MACrB,cAAc,KAAKF,CAAM,IAAI,MAAM,MAGxBG,KAAkB,MAK7BC,EAAM,OAAO,SACTA,EAAM,OAAO,QAAQ,QACnB,YACAA,EAAM,OAAO,KAAK,MAAMC,EAAE,IAAI,CAAC,CAAC,KAAKH,EAAcE,EAAM,MAAM,CAAC,CAClE,IACAA,EAAM,OAAO"}
1
+ {"version":3,"file":"labels.js","names":["CHART_LABELS","chartLabels","localeLabels","locale","overrides","listSeparator","chartAriaLabel","model","s","describeChart","input","labels","series","title","generic","index","names","fill","part"],"sources":["../../../../../../charts/src/engine/labels.ts"],"sourcesContent":["// Built-in texts of the cartesian engine (tooltip rows, accessible names).\n\nimport { localeLabels, type LabelDictionary } from \"./locale\";\nimport type { ChartLabels } from \"./types\";\n\nexport const CHART_LABELS: LabelDictionary<ChartLabels> = {\n en: {\n open: \"Open\",\n high: \"High\",\n low: \"Low\",\n close: \"Close\",\n max: \"Max\",\n q3: \"Q3\",\n median: \"Median\",\n q1: \"Q1\",\n min: \"Min\",\n outliers: \"Outliers\",\n value: \"Value\",\n x: \"x\",\n y: \"y\",\n series: \"Series\",\n chart: \"Chart\",\n chartOf: \"Chart: {series}\",\n start: \"Start\",\n end: \"End\",\n duration: \"Duration\",\n progress: \"Progress\",\n dependencies: \"Depends on\",\n outlier: \"Outlier\",\n },\n zh: {\n open: \"开盘\",\n high: \"最高\",\n low: \"最低\",\n close: \"收盘\",\n max: \"最大值\",\n q3: \"上四分位\",\n median: \"中位数\",\n q1: \"下四分位\",\n min: \"最小值\",\n outliers: \"异常值\",\n value: \"数值\",\n series: \"系列\",\n chart: \"图表\",\n chartOf: \"图表:{series}\",\n start: \"开始\",\n end: \"结束\",\n duration: \"时长\",\n progress: \"进度\",\n dependencies: \"前置任务\",\n outlier: \"异常值\",\n },\n ja: {\n open: \"始値\",\n high: \"高値\",\n low: \"安値\",\n close: \"終値\",\n max: \"最大値\",\n q3: \"第3四分位\",\n median: \"中央値\",\n q1: \"第1四分位\",\n min: \"最小値\",\n outliers: \"外れ値\",\n value: \"値\",\n series: \"系列\",\n chart: \"グラフ\",\n chartOf: \"グラフ:{series}\",\n start: \"開始\",\n end: \"終了\",\n duration: \"期間\",\n progress: \"進捗\",\n dependencies: \"先行タスク\",\n outlier: \"外れ値\",\n },\n fr: {\n open: \"Ouverture\",\n high: \"Plus haut\",\n low: \"Plus bas\",\n close: \"Clôture\",\n max: \"Max\",\n q3: \"Q3\",\n median: \"Médiane\",\n q1: \"Q1\",\n min: \"Min\",\n outliers: \"Valeurs aberrantes\",\n value: \"Valeur\",\n series: \"Série\",\n chart: \"Graphique\",\n chartOf: \"Graphique : {series}\",\n start: \"Début\",\n end: \"Fin\",\n duration: \"Durée\",\n progress: \"Avancement\",\n dependencies: \"Dépend de\",\n outlier: \"Valeur aberrante\",\n },\n};\n\n/** Texts of a locale with the overrides */\nexport const chartLabels = (\n locale: string,\n overrides?: Partial<ChartLabels>,\n): ChartLabels => localeLabels(CHART_LABELS, locale, overrides);\n\n/** Separator of the list of series names in accessible names */\nconst listSeparator = (locale: string) =>\n /^(zh|ja)\\b/i.test(locale) ? \"、\" : \", \";\n\n/** Default accessible name of a chart model: \"Chart: Revenue, Costs\" */\nexport const chartAriaLabel = (model: {\n labels: ChartLabels;\n locale: string;\n series: readonly { name: string }[];\n}): string =>\n model.series.length\n ? model.labels.chartOf.replace(\n \"{series}\",\n model.series.map((s) => s.name).join(listSeparator(model.locale)),\n )\n : model.labels.chart;\n\n/**\n * Localized accessible description of a chart, for platforms that build their\n * own accessible name (\"Chart: Revenue, Costs\", \"营收:营收、成本\").\n * With a `title`, the title replaces the generic \"Chart\" word.\n */\nexport function describeChart(input: {\n /** BCP 47 locale (default \"en\") */\n locale?: string;\n /** Series of the chart (only their names are used) */\n series?: readonly { name: string }[];\n /** Title of the chart */\n title?: string;\n /** Overrides of the built-in texts */\n labels?: Partial<ChartLabels>;\n}): string {\n const locale = input.locale ?? \"en\";\n const labels = chartLabels(locale, input.labels);\n const series = input.series ?? [];\n const title = input.title?.trim();\n const generic = chartAriaLabel({ labels, locale, series });\n if (!title) return generic;\n if (!series.length) return title;\n const index = labels.chartOf.indexOf(labels.chart);\n if (index < 0 || !labels.chart) return `${title}. ${generic}`;\n const names = series.map((s) => s.name).join(listSeparator(locale));\n const fill = (part: string) => part.split(\"{series}\").join(names);\n return (\n fill(labels.chartOf.slice(0, index)) +\n title +\n fill(labels.chartOf.slice(index + labels.chart.length))\n );\n}\n"],"mappings":";;AAKA,IAAaA,IAA6C;CACxD,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,KAAK;EACL,IAAI;EACJ,QAAQ;EACR,IAAI;EACJ,KAAK;EACL,UAAU;EACV,OAAO;EACP,GAAG;EACH,GAAG;EACH,QAAQ;EACR,OAAO;EACP,SAAS;EACT,OAAO;EACP,KAAK;EACL,UAAU;EACV,UAAU;EACV,cAAc;EACd,SAAS;CACX;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,KAAK;EACL,IAAI;EACJ,QAAQ;EACR,IAAI;EACJ,KAAK;EACL,UAAU;EACV,OAAO;EACP,QAAQ;EACR,OAAO;EACP,SAAS;EACT,OAAO;EACP,KAAK;EACL,UAAU;EACV,UAAU;EACV,cAAc;EACd,SAAS;CACX;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,KAAK;EACL,IAAI;EACJ,QAAQ;EACR,IAAI;EACJ,KAAK;EACL,UAAU;EACV,OAAO;EACP,QAAQ;EACR,OAAO;EACP,SAAS;EACT,OAAO;EACP,KAAK;EACL,UAAU;EACV,UAAU;EACV,cAAc;EACd,SAAS;CACX;CACA,IAAI;EACF,MAAM;EACN,MAAM;EACN,KAAK;EACL,OAAO;EACP,KAAK;EACL,IAAI;EACJ,QAAQ;EACR,IAAI;EACJ,KAAK;EACL,UAAU;EACV,OAAO;EACP,QAAQ;EACR,OAAO;EACP,SAAS;EACT,OAAO;EACP,KAAK;EACL,UAAU;EACV,UAAU;EACV,cAAc;EACd,SAAS;CACX;AACF,GAGaC,KACX,GACA,MACgBC,EAAaF,GAAcG,GAAQC,CAAS,GAGxDC,KAAiB,MACrB,cAAc,KAAKF,CAAM,IAAI,MAAM,MAGxBG,KAAkB,MAK7BC,EAAM,OAAO,SACTA,EAAM,OAAO,QAAQ,QACnB,YACAA,EAAM,OAAO,KAAK,MAAMC,EAAE,IAAI,CAAC,CAAC,KAAKH,EAAcE,EAAM,MAAM,CAAC,CAClE,IACAA,EAAM,OAAO;AAOnB,SAAgBE,EAAc,GASnB;CACT,IAAMN,IAASO,EAAM,UAAU,MACzBC,IAASV,EAAYE,GAAQO,EAAM,MAAM,GACzCE,IAASF,EAAM,UAAU,CAAC,GAC1BG,IAAQH,EAAM,OAAO,KAAK,GAC1BI,IAAUR,EAAe;EAAE;EAAQ;EAAQ;CAAO,CAAC;CACzD,IAAI,CAACO,GAAO,OAAOC;CACnB,IAAI,CAACF,EAAO,QAAQ,OAAOC;CAC3B,IAAME,IAAQJ,EAAO,QAAQ,QAAQA,EAAO,KAAK;CACjD,IAAII,IAAQ,KAAK,CAACJ,EAAO,OAAO,OAAO,GAAGE,EAAM,IAAIC;CACpD,IAAME,IAAQJ,EAAO,KAAK,MAAMJ,EAAE,IAAI,CAAC,CAAC,KAAKH,EAAcF,CAAM,CAAC,GAC5Dc,KAAQ,MAAiBC,EAAK,MAAM,UAAU,CAAC,CAAC,KAAKF,CAAK;CAChE,OACEC,EAAKN,EAAO,QAAQ,MAAM,GAAGI,CAAK,CAAC,IACnCF,IACAI,EAAKN,EAAO,QAAQ,MAAMI,IAAQJ,EAAO,MAAM,MAAM,CAAC;AAE1D"}
@@ -1,2 +1,2 @@
1
- const e=require("./color.cjs"),t=require("./data.cjs"),n=require("./locale.cjs"),r=require("./scale.cjs"),i=require("./format.cjs"),a=require("./labels.cjs"),o=require("./spatial.cjs");var s={scale:1,offset:0,log:!0},c=e=>{if(typeof e==`object`&&e&&!(`length`in e)){let t=e.x;return t&&t.length?t[0]:void 0}let t=e;for(let e=0;e<Math.min(t.length,8);e++){let n=t[e];if(Array.isArray(n))return n[0];if(n&&typeof n==`object`)return n.x}},l=e=>{for(let t of e){let e=c(t);if(e instanceof Date)return`time`;if(typeof e==`string`)return`category`}return`linear`},u=(e,t,n,r,i)=>({type:t,reverse:!!e?.reverse,categories:n,title:e?.title,format:e?.format,grid:e?.grid??r,visible:e?.visible??!0,tickCount:e?.tickCount,locale:i,timeZone:e?.timeZone??`local`}),d=e=>{let t={};if(!e)return t;for(let n of Object.keys(e))e[n]!==void 0&&(t[n]=e[n]);return t},f=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];Number.isFinite(i)&&(i<t&&(t=i),i>n&&(n=i))}return[t,n]},p=(e,t)=>{let n=1/0;return e.forEach((e,r)=>{let i=t[r]?e:Float64Array.from(e).sort();for(let e=1;e<i.length;e++){let t=i[e]-i[e-1];t>0&&t<n&&(n=t)}}),n},m=(e,t,n)=>{if(n)return 1;let r=p(e.map(e=>t===`x`?e.cols.x:e.cols.y),e.map(e=>t===`x`&&e.cols.sorted));return Number.isFinite(r)?r:1},h=(e,t)=>{let n=new Map;if(t)for(let{s:t,stack:r}of e){let e=n.get(r);e||n.set(r,e=new Map);let{x:i,y:a,count:o}=t.cols;for(let t=0;t<o;t++){let n=a[t];if(!Number.isFinite(n))continue;let r=e.get(i[t])??[0,0];n>=0?r[0]+=n:r[1]-=n,e.set(i[t],r)}}let r=new Map,i=new Map;for(let{stack:t}of e)i.set(t,(i.get(t)??0)+1);return e.map(({s:e,stack:a})=>{let{x:o,y:s,count:c}=e.cols;if(!t&&i.get(a)===1){let e=new Float64Array(c),t=new Float64Array(c);for(let n=0;n<c;n++){let r=s[n],i=Number.isFinite(r);e[n]=i?0:NaN,t[n]=i?r:NaN}return{base:e,top:t}}let l=r.get(a);l||r.set(a,l=new Map);let u=n.get(a),d=new Float64Array(c),f=new Float64Array(c);for(let e=0;e<c;e++){let t=s[e];if(!Number.isFinite(t)){d[e]=NaN,f[e]=NaN;continue}if(u){let n=u.get(o[e]),r=n?t>=0?n[0]:n[1]:0;t=r>0?t/r*100:0}let n=l.get(o[e])??[0,0],r=t>=0?n[0]:n[1];d[e]=r,f[e]=r+t,t>=0?n[0]+=t:n[1]+=t,l.set(o[e],n)}return{base:d,top:f}})},ee=`var(--success-color, #16a34a)`,g=`var(--danger-color, #dc2626)`,_=e=>{for(let t of e){if(typeof t!=`object`||!t||!(`length`in t))continue;let e=t;for(let t=0;t<Math.min(e.length,8);t++){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n)){let e=n;if(e.y instanceof Date||e.y0 instanceof Date)return!0}}}return!1},v=e=>Number(e.toPrecision(12)),y=e=>{let t=10**Math.floor(Math.log10(e)+1e-9),n=e/t;return(n<1.5?2:n<3.5?5:10)*t},b=(e,t,n,i)=>{let[a,o]=n,s=r.tickStep(a,o,i),c=s>0?Math.round((o-a)/s):0;if([e,t]=r.ensureSpan(e,t),c<1||Math.abs(c*s-(o-a))>s*1e-6)return r.niceDomain(e,t,i);let l=r.tickStep(e,t,c);for(let n=0;n<40&&l>0;n++){let n=Math.floor(e/l+1e-9)*l;if(n+c*l>=t-l*1e-9)return[v(n),v(n+c*l)];l=y(l)}return r.niceDomain(e,t,i)},x=new WeakMap,S=(e,t)=>{let n=`${t.scale},${t.offset},${!!t.log}`,r=x.get(e);if(r&&r.key===n)return r.cols;let i=C(t),a=e=>e?e.map(i):null,o={...e,y:e.y.map(i),open:a(e.open),high:a(e.high),low:a(e.low),y0:a(e.y0),q1:a(e.q1),q3:a(e.q3),outliers:e.outliers?e.outliers.map(e=>e?.map(i)):null};if(t.log){let e=[1/0,-1/0],t=t=>{if(t)for(let n=0;n<t.length;n++){let r=t[n];Number.isFinite(r)&&(r<e[0]&&(e[0]=r),r>e[1]&&(e[1]=r))}};for(let e of[o.y,o.y0,o.high,o.low,o.q1,o.q3])t(e);o.outliers?.forEach(e=>t(e)),o.yMin=e[0]<=e[1]?e[0]:NaN,o.yMax=e[0]<=e[1]?e[1]:NaN}else{let t=i(e.yMin),n=i(e.yMax);o.yMin=Math.min(t,n),o.yMax=Math.max(t,n)}return x.set(e,{key:n,cols:o}),o},te=e=>{let t=Math.floor(e[0]+1e-9),n=Math.ceil(e[1]-1e-9);return[t,n>t?n:t+1]},ne=(e,t,n=-1/0)=>{let r=C(t),i=e=>e?e.map(r):null,a=e.stackBase;e.cols=S(e.raw,t),e.barBase=e.barBase&&!e.floating?e.barBase.map(e=>e===0?t.log?-1/0:r(0):r(e)):i(e.barBase),e.barTop=i(e.barTop),e.stackTop=i(e.stackTop),e.stackBase=a&&a===e.raw.y0?e.cols.y0:a?i(a):e.type===`area`?new Float64Array(e.cols.count).fill(n):null},C=e=>t=>(e.log?Math.log10(t):t)*e.scale+e.offset,w=(e,t)=>e.y.type===`log`?Math.log10(t):t,T=(e,t)=>e.y.type===`log`?10**t:t,re=(e,t)=>{for(let n of[e.barBase,e.stackBase])if(n)for(let e=0;e<n.length;e++)n[e]===-1/0&&(n[e]=t)},ie=(e,t)=>{let[n,r]=e.valueRange,i=e.colorMidpoint,a;return a=i!==null&&i>n&&i<r?t<i?(t-n)/(i-n)*.5:.5+(t-i)/(r-i)*.5:(t-n)/(r-n||1),a<0?0:a>1?1:a},ae=(t,n,r,i)=>{let a=e.luminance(r.background)<.4;if(t===`diverging`){let t=e.mixOklab(r.surface,r.textMuted,a?.12:.08),o=t=>a?e.withLightness(t,.7,1.25):e.withLightness(t,.5,1.05),s=n=>e.mixOklab(t,o(n),.5);return[o(i),s(i),t,s(n),o(n)]}return a?[e.mixOklab(r.surface,n,.14),e.withLightness(n,.46,.95),e.withLightness(n,.64,1.2),e.withLightness(n,.8,1.15)]:[e.mixOklab(r.surface,n,.06),e.withLightness(n,.8,.6),e.withLightness(n,.58,1),e.withLightness(n,.36,.9)]},E=(o,c,p,v,y=null)=>{let x=y??c.resolve??((t,n)=>e.resolveStaticColor(t,{},n)),w=o.series,T=n.resolveLocale(o.locale),E=typeof o.tooltip==`object`?o.tooltip:void 0,D=a.chartLabels(T,{...d(E?.labels),...d(o.labels)}),O=w.map(e=>e.data),k=o.xAxis?.type??l(O),A=k===`category`?[...o.xAxis?.categories??t.collectCategories(O)]:[],oe=new Map(A.map((e,t)=>[e,t])),se=t.xResolver(k,e=>oe.get(e)??NaN),j=o.yAxis,ce=w.filter(e=>e.type===`heatmap`).map(e=>e.data),M=j?.type===`category`||!j?.type&&ce.length?[...j?.categories??t.collectYCategories(ce)]:[],N=j?.type===`category`||M.length?`category`:j?.type===`time`||!j?.type&&_(O)?`time`:j?.type===`log`?`log`:`linear`,P=N===`log`,le=new Map(M.map((e,t)=>[e,t])),ue=e=>typeof e==`number`?e:typeof e==`string`?N===`category`?le.get(e)??NaN:N===`time`?Date.parse(e):Number(e):e instanceof Date?e.getTime():NaN,F=`${k}|${A.join(``)}|${N}|${M.join(``)}`,I=o.stackMode===`percent`,L=o.orientation===`horizontal`,R=new Set,z=w.map((n,r)=>{let i=n.id??`#${r}`;for(;R.has(i);)i+=`'`;R.add(i);let a=v.get(i);(!a||a.data!==n.data||a.resolverKey!==F)&&(a={data:n.data,resolverKey:F,cols:t.normalizeData(n.data,se,ue)},v.set(i,a));let o=n.type??`line`,s=c.palette[r%c.palette.length],l=n.color?x(n.color,s):s,u=a.cols,d=null;if((o===`scatter`||o===`bar`||o===`boxplot`)&&u.colors){let e=new Map;d=u.colors.map(t=>{if(t===void 0)return;let n=e.get(t);return n||e.set(t,n=x(t,l)),n})}let f=[],m=[0,1],h=null,_=null,y=null;if(o===`heatmap`){let t=n.colorScale,r=t===`diverging`?`diverging`:`sequential`;f=typeof t==`object`&&t.length?t.map(e=>x(e,l)):ae(r,l,c,x(g,[.86,.15,.15,1])),m=n.valueRange?[n.valueRange[0],n.valueRange[1]]:[u.valueMin,u.valueMax],Number.isFinite(m[0])||(m=[0,1]);let[i,a]=m;_=n.colorMidpoint??(r===`diverging`&&typeof t!=`object`?i<0&&a>0?0:(i+a)/2:null);let o=e.oklabRamp(f);y=o;let s=u.value??u.y,d={valueRange:m,colorMidpoint:_};h=new Uint32Array(u.count);for(let e=0;e<u.count;e++){let t=s[e];Number.isFinite(t)&&Number.isFinite(u.y[e])&&(h[e]=o[Math.round(ie(d,t)*255)])}}let b=n.connector?typeof n.connector==`object`?n.connector:{}:null,S=n.id??String(r);return{index:r,key:i,id:S,name:n.name??`${D.series} ${r+1}`,type:o,color:l,colorCss:e.toCss(l),lineWidth:n.lineWidth??(o===`candlestick`?1:o===`boxplot`?1.5:2),pointSize:n.pointSize??(o===`boxplot`?6:8),opacity:n.opacity??(o===`area`?.28:o===`scatter`?.78:o===`boxplot`?.22:1),hidden:!!n.hidden||p.has(S),showLabels:!!n.showLabels,curve:n.curve??`linear`,cols:u,raw:u,yAxis:n.yAxis===`right`&&!L?`right`:`left`,floating:o===`bar`&&!!u.y0,barOffset:0,barHalfWidth:0,barBase:null,barTop:null,stackBase:null,stackTop:null,pointColors:d,upColor:o===`candlestick`?x(n.upColor??ee,[.09,.64,.29,1]):l,downColor:o===`candlestick`?x(n.downColor??g,[.86,.15,.15,1]):l,cellColors:h,cellHalf:{x:.5,y:.5},colorScale:f,valueRange:m,colorMidpoint:_,colorLut:y,tooltip:n.tooltip!==!1,outlierShape:n.outlierShape??`hollow`,outlierSize:n.outlierSize??n.pointSize??7,connector:b&&o===`bar`?{color:b.color?x(b.color,c.textMuted):c.textMuted,dash:[...b.dash??[3,3]],width:b.width??1}:null,radius:n.radius??(o===`heatmap`?2:o===`boxplot`?0:3),format:n.format,valueName:n.valueName}}),B=z.filter(e=>!e.hidden),V=z.length>0&&z.every(e=>e.type===`scatter`||e.type===`heatmap`),H=B.filter(e=>e.type===`bar`||e.type===`boxplot`),U=B.filter(e=>e.type===`bar`),de=m(H,`x`,k===`category`);if(H.length){let e=new Map,t=e=>w[e.index].stack??`\u0000${e.key}`;for(let n of H)e.has(t(n))||e.set(t(n),e.size);let n=0;for(let e of H){let t=w[e.index].barWidth;t!==void 0&&t>n&&(n=Math.min(1,t))}let r=de*(n||(e.size>1?.78:.62)),i=r/e.size;for(let n of H){let a=e.get(t(n))??0;n.barOffset=-r/2+i*(a+.5),n.barHalfWidth=i/2*(e.size>1?.86:1)}let a=U.filter(e=>!e.floating),o=h(a.map(e=>({s:e,stack:t(e)})),!1),s=I?h(a.filter(e=>w[e.index].stack!==void 0).map(e=>({s:e,stack:t(e)})),!0):[],c=0;a.forEach((e,t)=>{let n=I&&w[e.index].stack!==void 0?s[c++]:o[t];e.barBase=n.base,e.barTop=n.top});for(let e of U){let{y:t,y0:n,count:r}=e.cols;if(!e.floating||!n)continue;let i=new Float64Array(r),a=new Float64Array(r);for(let e=0;e<r;e++){let r=Number.isFinite(t[e]);i[e]=r?Number.isFinite(n[e])?n[e]:0:NaN,a[e]=r?t[e]:NaN}e.barBase=i,e.barTop=a}}for(let e of B)e.type===`area`&&e.cols.y0&&w[e.index].stack===void 0&&(e.stackBase=e.cols.y0);let W=B.filter(e=>(e.type===`line`||e.type===`area`)&&w[e.index].stack!==void 0);if(W.length){let e=h(W.map(e=>({s:e,stack:w[e.index].stack??``})),I);W.forEach((t,n)=>{t.stackBase=e[n].base,t.stackTop=e[n].top})}let G=B.filter(e=>e.type===`candlestick`),fe=m(G,`x`,k===`category`);for(let e of G)e.barHalfWidth=fe*.3;let K=B.filter(e=>e.type===`heatmap`);if(K.length){let e=m(K,`x`,k===`category`)/2,t=m(K,`y`,N===`category`)/2;for(let n of K)n.cellHalf={x:e,y:t}}let q=o.xAxis,J;if(k===`category`)J=[-.5,Math.max(1,A.length)-.5];else{let e=[];for(let t of B){e.push(t.cols.xMin,t.cols.xMax);let n=t.type===`bar`||t.type===`boxplot`?de/2:t.type===`candlestick`?fe/2:t.type===`heatmap`?t.cellHalf.x:0;n&&e.push(t.cols.xMin-n,t.cols.xMax+n)}J=r.ensureSpan(...f(e),k===`time`?[Date.now()-864e5,Date.now()]:[0,1]);let t=z.every(e=>e.type===`scatter`);if(t){let e=(J[1]-J[0])*.04;J=[J[0]-e,J[1]+e]}(q?.nice??(t&&k===`linear`))&&k===`linear`&&(J=r.niceDomain(J[0],J[1],q?.tickCount??6))}if(q?.min!==void 0&&(J[0]=q.min),q?.max!==void 0&&(J[1]=q.max),J=r.ensureSpan(J[0],J[1]),P)for(let e of z)e.yAxis!==`right`&&e.type!==`heatmap`&&ne(e,s);let pe=(e,t,n=!1)=>{let r=[];for(let t of e)t.type===`bar`&&t.barBase&&t.barTop?r.push(...f(t.barBase),...f(t.barTop)):t.stackBase&&t.stackTop?r.push(...f(t.stackBase),...f(t.stackTop)):t.type===`heatmap`?r.push(t.cols.yMin-t.cellHalf.y,t.cols.yMax+t.cellHalf.y):r.push(t.cols.yMin,t.cols.yMax);let i=e.filter(e=>e.type===`bar`);if(!n&&(i.some(e=>!e.floating)||t)&&r.push(0),i.some(e=>e.showLabels)){let[e,t]=f(r);t>0&&r.push(t+(t-Math.min(0,e))*.1),e<0&&r.push(e-(Math.max(0,t)-e)*.1)}return r},me=B.filter(e=>e.yAxis===`left`),Y=me.length?me:B,he=Y.filter(e=>e.type===`bar`),X;if(N===`category`)X=[-.5,Math.max(1,M.length)-.5];else{let e=pe(Y,j?.zero,P),t=he.length>0||Y.some(e=>e.type===`area`);if(X=r.ensureSpan(...f(e)),z.every(e=>e.type===`scatter`)){let e=(X[1]-X[0])*.06;X=[X[0]-e,X[1]+e]}else if((G.length||Y.some(e=>e.type===`boxplot`))&&!he.length){let e=(X[1]-X[0])*.04;X=[X[0]-e,X[1]+e]}(j?.nice??!K.length)&&N===`linear`&&(X=r.niceDomain(X[0],X[1],j?.tickCount??5)),P&&j?.nice!==!1&&(X=te(X)),I&&(U.length||W.length)&&(X=[f(e)[0]<0?-100:0,100]),t&&!j?.zero&&!P&&X[0]<0&&f(e)[0]>=0&&(X[0]=0)}let ge=e=>P?Math.log10(e):e;if(j?.min!==void 0&&(X[0]=ge(j.min)),j?.max!==void 0&&(X[1]=ge(j.max)),X=r.ensureSpan(X[0],X[1]),P)for(let e of z)e.yAxis===`left`&&re(e,X[0]);let Z=o.yAxis2,_e=null,ve=null,Q=z.filter(e=>e.yAxis===`right`);if(Q.length&&N!==`category`){let e=Z?.type===`log`,t=Q.filter(e=>!e.hidden),n=e?t.flatMap(e=>{let t=S(e.raw,s);return[t.yMin,t.yMax]}):pe(t,Z?.zero),[i,a]=r.ensureSpan(...f(n)),o=Z?.nice===!1?[i,a]:e?te([i,a]):b(i,a,X,j?.tickCount??5),c=t=>e?Math.log10(t):t;Z?.min!==void 0&&(o[0]=c(Z.min)),Z?.max!==void 0&&(o[1]=c(Z.max)),o=r.ensureSpan(o[0],o[1]);let l=(X[1]-X[0])/(o[1]-o[0]),d={scale:l,offset:X[0]-o[0]*l,log:e};ve=d;let p=e?X[0]:C(d)(Math.min(Math.max(0,o[0]),o[1]));for(let e of Q)ne(e,d,p),re(e,X[0]);_e=u(Z,e?`log`:`linear`,[],!1,T)}let ye=N===`time`&&z.some(e=>e.type===`bar`)&&z.every(e=>e.type===`bar`?e.floating:e.type===`scatter`),$=o.interaction===!1?!1:o.interaction===!0||o.interaction===void 0?!0:o.interaction.zoom??!0,be=$===!1?{x:!1,y:!1}:$===!0?{x:!0,y:V}:{x:$.includes(`x`),y:$.includes(`y`)},xe=j?.format??(I&&(U.length||W.length)?e=>i.formatPercent(e,T):void 0);return{series:z,x:u(q,k,A,!1,T),y:{...u(j,N,M,N!==`category`,T),format:xe},y2:_e,y2Map:ve,horizontal:L,locale:T,labels:D,formatValue:i.valueFormatter(T),base:{x:J,y:X},allScatter:V,zoom:be,tooltipMode:E?.mode??(V?`nearest`:ye?`item`:`axis`),baseline:P?X[0]:Math.min(Math.max(0,X[0]),X[1]),minSpan:{x:k===`category`?1:(J[1]-J[0])*1e-7,y:N===`category`?1:(X[1]-X[0])*1e-7},percent:I,stacks:w.map(e=>e.stack!==void 0&&(e.type===`bar`||e.type===`line`||e.type===`area`||!e.type)?`${e.type===`bar`?`bar`:`line`}:${e.stack}`:null)}},D=(e,t)=>e.barTop?e.barTop[t]:e.stackTop?e.stackTop[t]:e.cols.y[t],O=new WeakMap,k=e=>{let t=O.get(e.cols);return t||(t=new o.GridIndex(e.cols.x,e.cols.y,e.cols.count),O.set(e.cols,t)),t};exports.alignedDomain=b,exports.buildModel=E,exports.detectXType=l,exports.fromPlotY=T,exports.gridOf=k,exports.heatPosition=ie,exports.heatmapStops=ae,exports.plottedY=D,exports.toPlotY=w;
1
+ const e=require("./color.cjs"),t=require("./data.cjs"),n=require("./locale.cjs"),r=require("./scale.cjs"),i=require("./format.cjs"),a=require("./labels.cjs"),o=require("./spatial.cjs");var s={scale:1,offset:0,log:!0},c=e=>{if(typeof e==`object`&&e&&!(`length`in e)){let t=e.x;return t&&t.length?t[0]:void 0}let t=e;for(let e=0;e<Math.min(t.length,8);e++){let n=t[e];if(Array.isArray(n))return n[0];if(n&&typeof n==`object`)return n.x}},l=e=>{for(let t of e){let e=c(t);if(e instanceof Date)return`time`;if(typeof e==`string`)return`category`}return`linear`},u=(e,t,n,r,i)=>({type:t,reverse:!!e?.reverse,categories:n,title:e?.title,format:e?.format,grid:e?.grid??r,visible:e?.visible??!0,tickCount:e?.tickCount,locale:i,timeZone:e?.timeZone??`local`}),d=e=>{let t={};if(!e)return t;for(let n of Object.keys(e))e[n]!==void 0&&(t[n]=e[n]);return t},f=e=>{let t=1/0,n=-1/0;for(let r=0;r<e.length;r++){let i=e[r];Number.isFinite(i)&&(i<t&&(t=i),i>n&&(n=i))}return[t,n]},p=(e,t)=>{let n=1/0;return e.forEach((e,r)=>{let i=t[r]?e:Float64Array.from(e).sort();for(let e=1;e<i.length;e++){let t=i[e]-i[e-1];t>0&&t<n&&(n=t)}}),n},m=(e,t,n)=>{if(n)return 1;let r=p(e.map(e=>t===`x`?e.cols.x:e.cols.y),e.map(e=>t===`x`&&e.cols.sorted));return Number.isFinite(r)?r:1},h=(e,t)=>{let n=new Map;if(t)for(let{s:t,stack:r}of e){let e=n.get(r);e||n.set(r,e=new Map);let{x:i,y:a,count:o}=t.cols;for(let t=0;t<o;t++){let n=a[t];if(!Number.isFinite(n))continue;let r=e.get(i[t])??[0,0];n>=0?r[0]+=n:r[1]-=n,e.set(i[t],r)}}let r=new Map,i=new Map;for(let{stack:t}of e)i.set(t,(i.get(t)??0)+1);return e.map(({s:e,stack:a})=>{let{x:o,y:s,count:c}=e.cols;if(!t&&i.get(a)===1){let e=new Float64Array(c),t=new Float64Array(c);for(let n=0;n<c;n++){let r=s[n],i=Number.isFinite(r);e[n]=i?0:NaN,t[n]=i?r:NaN}return{base:e,top:t}}let l=r.get(a);l||r.set(a,l=new Map);let u=n.get(a),d=new Float64Array(c),f=new Float64Array(c);for(let e=0;e<c;e++){let t=s[e];if(!Number.isFinite(t)){d[e]=NaN,f[e]=NaN;continue}if(u){let n=u.get(o[e]),r=n?t>=0?n[0]:n[1]:0;t=r>0?t/r*100:0}let n=l.get(o[e])??[0,0],r=t>=0?n[0]:n[1];d[e]=r,f[e]=r+t,t>=0?n[0]+=t:n[1]+=t,l.set(o[e],n)}return{base:d,top:f}})},ee=`var(--success-color, #16a34a)`,te=`var(--danger-color, #dc2626)`,g=e=>{for(let t of e){if(typeof t!=`object`||!t||!(`length`in t))continue;let e=t;for(let t=0;t<Math.min(e.length,8);t++){let n=e[t];if(n&&typeof n==`object`&&!Array.isArray(n)){let e=n;if(e.y instanceof Date||e.y0 instanceof Date)return!0}}}return!1},_=e=>Number(e.toPrecision(12)),v=e=>{let t=10**Math.floor(Math.log10(e)+1e-9),n=e/t;return(n<1.5?2:n<3.5?5:10)*t},y=(e,t,n,i)=>{let[a,o]=n,s=r.tickStep(a,o,i),c=s>0?Math.round((o-a)/s):0;if([e,t]=r.ensureSpan(e,t),c<1||Math.abs(c*s-(o-a))>s*1e-6)return r.niceDomain(e,t,i);let l=r.tickStep(e,t,c);for(let n=0;n<40&&l>0;n++){let n=Math.floor(e/l+1e-9)*l;if(n+c*l>=t-l*1e-9)return[_(n),_(n+c*l)];l=v(l)}return r.niceDomain(e,t,i)},b=new WeakMap,x=(e,t)=>{let n=`${t.scale},${t.offset},${!!t.log}`,r=b.get(e);if(r&&r.key===n)return r.cols;let i=C(t),a=e=>e?e.map(i):null,o=e,s={...o,y:o.y.map(i),open:a(o.open),high:a(o.high),low:a(o.low),y0:a(o.y0),q1:a(o.q1),q3:a(o.q3),outliers:o.outliers?o.outliers.map(e=>e?.map(i)):null};if(t.log){let e=[1/0,-1/0],t=t=>{if(t)for(let n=0;n<t.length;n++){let r=t[n];Number.isFinite(r)&&(r<e[0]&&(e[0]=r),r>e[1]&&(e[1]=r))}};for(let e of[s.y,s.y0,s.high,s.low,s.q1,s.q3])t(e);s.outliers?.forEach(e=>t(e)),s.yMin=e[0]<=e[1]?e[0]:NaN,s.yMax=e[0]<=e[1]?e[1]:NaN}else{let e=i(o.yMin),t=i(o.yMax);s.yMin=Math.min(e,t),s.yMax=Math.max(e,t)}return b.set(e,{key:n,cols:s}),s},S=e=>{let t=Math.floor(e[0]+1e-9),n=Math.ceil(e[1]-1e-9);return[t,n>t?n:t+1]},ne=(e,t,n=-1/0)=>{let r=C(t),i=e=>e?e.map(r):null,a=e.stackBase;e.cols=x(e.cols,t),e.barBase=e.barBase&&!e.floating?e.barBase.map(e=>e===0?t.log?-1/0:r(0):r(e)):i(e.barBase),e.barTop=i(e.barTop),e.stackTop=i(e.stackTop),e.stackBase=a&&a===e.raw.y0?e.cols.y0:a?i(a):e.type===`area`?new Float64Array(e.cols.count).fill(n):null},C=e=>t=>(e.log?Math.log10(t):t)*e.scale+e.offset,w=(e,t)=>e.y.type===`log`?Math.log10(t):t,T=(e,t)=>e.y.type===`log`?10**t:t,E=(e,t)=>e.x.type===`log`?Math.log10(t):t,D=(e,t)=>e.x.type===`log`?10**t:t,O=(e,t)=>({x:[D(e,t.x[0]),D(e,t.x[1])],y:[T(e,t.y[0]),T(e,t.y[1])]}),k=(e,t,n)=>({x:t.x?[E(e,t.x[0]),E(e,t.x[1])]:n.x,y:t.y?[w(e,t.y[0]),w(e,t.y[1])]:n.y}),A=new WeakMap,re=e=>{let t=A.get(e);if(t)return t;let n=e.x.map(e=>e>0?Math.log10(e):NaN),r=e.y,i=!1;for(let t=0;t<e.count;t++)Number.isFinite(n[t])||(i||(r=Float64Array.from(e.y)),i=!0,r[t]=NaN);let[a,o]=f(n),s={...e,x:n,y:r,xMin:a,xMax:o,sorted:e.sorted&&!i};return A.set(e,s),s},ie=(e,t)=>{for(let n of[e.barBase,e.stackBase])if(n)for(let e=0;e<n.length;e++)n[e]===-1/0&&(n[e]=t)},ae=(e,t)=>{let[n,r]=e.valueRange,i=e.colorMidpoint,a;return a=i!==null&&i>n&&i<r?t<i?(t-n)/(i-n)*.5:.5+(t-i)/(r-i)*.5:(t-n)/(r-n||1),a<0?0:a>1?1:a},oe=(t,n,r,i)=>{let a=e.luminance(r.background)<.4;if(t===`diverging`){let t=e.mixOklab(r.surface,r.textMuted,a?.12:.08),o=t=>a?e.withLightness(t,.7,1.25):e.withLightness(t,.5,1.05),s=n=>e.mixOklab(t,o(n),.5);return[o(i),s(i),t,s(n),o(n)]}return a?[e.mixOklab(r.surface,n,.14),e.withLightness(n,.46,.95),e.withLightness(n,.64,1.2),e.withLightness(n,.8,1.15)]:[e.mixOklab(r.surface,n,.06),e.withLightness(n,.8,.6),e.withLightness(n,.58,1),e.withLightness(n,.36,.9)]},se=(o,c,p,_,v=null)=>{let b=v??c.resolve??((t,n)=>e.resolveStaticColor(t,{},n)),w=o.series,T=n.resolveLocale(o.locale),E=typeof o.tooltip==`object`?o.tooltip:void 0,D=a.chartLabels(T,{...d(E?.labels),...d(o.labels)}),O=w.map(e=>e.data),k=o.xAxis?.type??l(O),A=k===`category`?[...o.xAxis?.categories??t.collectCategories(O)]:[],se=new Map(A.map((e,t)=>[e,t])),ce=t.xResolver(k,e=>se.get(e)??NaN),j=o.yAxis,M=w.filter(e=>e.type===`heatmap`).map(e=>e.data),N=j?.type===`category`||!j?.type&&M.length?[...j?.categories??t.collectYCategories(M)]:[],P=j?.type===`category`||N.length?`category`:j?.type===`time`||!j?.type&&g(O)?`time`:j?.type===`log`?`log`:`linear`,F=P===`log`,le=new Map(N.map((e,t)=>[e,t])),ue=e=>typeof e==`number`?e:typeof e==`string`?P===`category`?le.get(e)??NaN:P===`time`?Date.parse(e):Number(e):e instanceof Date?e.getTime():NaN,de=`${k}|${A.join(``)}|${P}|${N.join(``)}`,I=o.stackMode===`percent`,fe=o.orientation===`horizontal`,pe=new Set,L=w.map((n,r)=>{let i=n.id??`#${r}`;for(;pe.has(i);)i+=`'`;pe.add(i);let a=_.get(i);(!a||a.data!==n.data||a.resolverKey!==de)&&(a={data:n.data,resolverKey:de,cols:t.normalizeData(n.data,ce,ue)},_.set(i,a));let o=n.type??`line`,s=c.palette[r%c.palette.length],l=n.color?b(n.color,s):s,u=a.cols,d=null;if((o===`scatter`||o===`bar`||o===`boxplot`)&&u.colors){let e=new Map;d=u.colors.map(t=>{if(t===void 0)return;let n=e.get(t);return n||e.set(t,n=b(t,l)),n})}let f=[],m=[0,1],h=null,g=null,v=null;if(o===`heatmap`){let t=n.colorScale,r=t===`diverging`?`diverging`:`sequential`;f=typeof t==`object`&&t.length?t.map(e=>b(e,l)):oe(r,l,c,b(te,[.86,.15,.15,1])),m=n.valueRange?[n.valueRange[0],n.valueRange[1]]:[u.valueMin,u.valueMax],Number.isFinite(m[0])||(m=[0,1]);let[i,a]=m;g=n.colorMidpoint??(r===`diverging`&&typeof t!=`object`?i<0&&a>0?0:(i+a)/2:null);let o=e.oklabRamp(f);v=o;let s=u.value??u.y,d={valueRange:m,colorMidpoint:g};h=new Uint32Array(u.count);for(let e=0;e<u.count;e++){let t=s[e];Number.isFinite(t)&&Number.isFinite(u.y[e])&&(h[e]=o[Math.round(ae(d,t)*255)])}}let y=n.connector?typeof n.connector==`object`?n.connector:{}:null,x=n.id??String(r);return{index:r,key:i,id:x,name:n.name??`${D.series} ${r+1}`,type:o,color:l,colorCss:e.toCss(l),lineWidth:n.lineWidth??(o===`candlestick`?1:o===`boxplot`?1.5:2),pointSize:n.pointSize??(o===`boxplot`?6:8),opacity:n.opacity??(o===`area`?.28:o===`scatter`?.78:o===`boxplot`?.22:1),hidden:!!n.hidden||p.has(x),showLabels:!!n.showLabels,curve:n.curve??`linear`,cols:u,raw:u,yAxis:n.yAxis===`right`&&!fe?`right`:`left`,floating:o===`bar`&&!!u.y0,barOffset:0,barHalfWidth:0,barBase:null,barTop:null,stackBase:null,stackTop:null,pointColors:d,upColor:o===`candlestick`?b(n.upColor??ee,[.09,.64,.29,1]):l,downColor:o===`candlestick`?b(n.downColor??te,[.86,.15,.15,1]):l,cellColors:h,cellHalf:{x:.5,y:.5},colorScale:f,valueRange:m,colorMidpoint:g,colorLut:v,tooltip:n.tooltip!==!1,outlierShape:n.outlierShape??`hollow`,outlierSize:n.outlierSize??n.pointSize??7,connector:y&&o===`bar`?{color:y.color?b(y.color,c.textMuted):c.textMuted,dash:[...y.dash??[3,3]],width:y.width??1}:null,radius:n.radius??(o===`heatmap`?2:o===`boxplot`?0:3),format:n.format,valueName:n.valueName}}),R=L.filter(e=>!e.hidden),z=k===`log`;if(z)for(let e of L)e.cols=re(e.raw);let B=L.length>0&&L.every(e=>e.type===`scatter`||e.type===`heatmap`),V=R.filter(e=>e.type===`bar`||e.type===`boxplot`),H=R.filter(e=>e.type===`bar`),me=m(V,`x`,k===`category`);if(V.length){let e=new Map,t=e=>w[e.index].stack??`\u0000${e.key}`;for(let n of V)e.has(t(n))||e.set(t(n),e.size);let n=0;for(let e of V){let t=w[e.index].barWidth;t!==void 0&&t>n&&(n=Math.min(1,t))}let r=me*(n||(e.size>1?.78:.62)),i=r/e.size;for(let n of V){let a=e.get(t(n))??0;n.barOffset=-r/2+i*(a+.5),n.barHalfWidth=i/2*(e.size>1?.86:1)}let a=H.filter(e=>!e.floating),o=h(a.map(e=>({s:e,stack:t(e)})),!1),s=I?h(a.filter(e=>w[e.index].stack!==void 0).map(e=>({s:e,stack:t(e)})),!0):[],c=0;a.forEach((e,t)=>{let n=I&&w[e.index].stack!==void 0?s[c++]:o[t];e.barBase=n.base,e.barTop=n.top});for(let e of H){let{y:t,y0:n,count:r}=e.cols;if(!e.floating||!n)continue;let i=new Float64Array(r),a=new Float64Array(r);for(let e=0;e<r;e++){let r=Number.isFinite(t[e]);i[e]=r?Number.isFinite(n[e])?n[e]:0:NaN,a[e]=r?t[e]:NaN}e.barBase=i,e.barTop=a}}for(let e of R)e.type===`area`&&e.cols.y0&&w[e.index].stack===void 0&&(e.stackBase=e.cols.y0);let U=R.filter(e=>(e.type===`line`||e.type===`area`)&&w[e.index].stack!==void 0);if(U.length){let e=h(U.map(e=>({s:e,stack:w[e.index].stack??``})),I);U.forEach((t,n)=>{t.stackBase=e[n].base,t.stackTop=e[n].top})}let W=R.filter(e=>e.type===`candlestick`),he=m(W,`x`,k===`category`);for(let e of W)e.barHalfWidth=he*.3;let G=R.filter(e=>e.type===`heatmap`);if(G.length){let e=m(G,`x`,k===`category`)/2,t=m(G,`y`,P===`category`)/2;for(let n of G)n.cellHalf={x:e,y:t}}let K=o.xAxis,q;if(k===`category`)q=[-.5,Math.max(1,A.length)-.5];else{let e=[];for(let t of R){e.push(t.cols.xMin,t.cols.xMax);let n=t.type===`bar`||t.type===`boxplot`?me/2:t.type===`candlestick`?he/2:t.type===`heatmap`?t.cellHalf.x:0;n&&e.push(t.cols.xMin-n,t.cols.xMax+n)}q=r.ensureSpan(...f(e),k===`time`?[Date.now()-864e5,Date.now()]:[0,1]);let t=L.every(e=>e.type===`scatter`);if(t){let e=(q[1]-q[0])*.04;q=[q[0]-e,q[1]+e]}(K?.nice??(t&&k===`linear`))&&k===`linear`&&(q=r.niceDomain(q[0],q[1],K?.tickCount??6)),z&&K?.nice!==!1&&(q=S(q))}let ge=e=>z?Math.log10(e):e;if(K?.min!==void 0&&(q[0]=ge(K.min)),K?.max!==void 0&&(q[1]=ge(K.max)),q=r.ensureSpan(q[0],q[1]),F)for(let e of L)e.yAxis!==`right`&&e.type!==`heatmap`&&ne(e,s);let _e=(e,t,n=!1)=>{let r=[];for(let t of e)t.type===`bar`&&t.barBase&&t.barTop?r.push(...f(t.barBase),...f(t.barTop)):t.stackBase&&t.stackTop?r.push(...f(t.stackBase),...f(t.stackTop)):t.type===`heatmap`?r.push(t.cols.yMin-t.cellHalf.y,t.cols.yMax+t.cellHalf.y):r.push(t.cols.yMin,t.cols.yMax);let i=e.filter(e=>e.type===`bar`);if(!n&&(i.some(e=>!e.floating)||t)&&r.push(0),i.some(e=>e.showLabels)){let[e,t]=f(r);t>0&&r.push(t+(t-Math.min(0,e))*.1),e<0&&r.push(e-(Math.max(0,t)-e)*.1)}return r},ve=R.filter(e=>e.yAxis===`left`),J=ve.length?ve:R,ye=J.filter(e=>e.type===`bar`),Y;if(P===`category`)Y=[-.5,Math.max(1,N.length)-.5];else{let e=_e(J,j?.zero,F),t=ye.length>0||J.some(e=>e.type===`area`);if(Y=r.ensureSpan(...f(e)),L.every(e=>e.type===`scatter`)){let e=(Y[1]-Y[0])*.06;Y=[Y[0]-e,Y[1]+e]}else if((W.length||J.some(e=>e.type===`boxplot`))&&!ye.length){let e=(Y[1]-Y[0])*.04;Y=[Y[0]-e,Y[1]+e]}(j?.nice??!G.length)&&P===`linear`&&(Y=r.niceDomain(Y[0],Y[1],j?.tickCount??5)),F&&j?.nice!==!1&&(Y=S(Y)),I&&(H.length||U.length)&&(Y=[f(e)[0]<0?-100:0,100]),t&&!j?.zero&&!F&&Y[0]<0&&f(e)[0]>=0&&(Y[0]=0)}let be=e=>F?Math.log10(e):e;if(j?.min!==void 0&&(Y[0]=be(j.min)),j?.max!==void 0&&(Y[1]=be(j.max)),Y=r.ensureSpan(Y[0],Y[1]),F)for(let e of L)e.yAxis===`left`&&ie(e,Y[0]);let X=o.yAxis2,xe=null,Z=null,Q=L.filter(e=>e.yAxis===`right`);if(Q.length&&P!==`category`){let e=X?.type===`log`,t=Q.filter(e=>!e.hidden),n=e?t.flatMap(e=>{let t=x(e.raw,s);return[t.yMin,t.yMax]}):_e(t,X?.zero),[i,a]=r.ensureSpan(...f(n)),o=X?.nice===!1?[i,a]:e?S([i,a]):y(i,a,Y,j?.tickCount??5),c=t=>e?Math.log10(t):t;X?.min!==void 0&&(o[0]=c(X.min)),X?.max!==void 0&&(o[1]=c(X.max)),o=r.ensureSpan(o[0],o[1]);let l=(Y[1]-Y[0])/(o[1]-o[0]),d={scale:l,offset:Y[0]-o[0]*l,log:e};Z=d;let p=e?Y[0]:C(d)(Math.min(Math.max(0,o[0]),o[1]));for(let e of Q)ne(e,d,p),ie(e,Y[0]);xe=u(X,e?`log`:`linear`,[],!1,T)}let Se=P===`time`&&L.some(e=>e.type===`bar`)&&L.every(e=>e.type===`bar`?e.floating:e.type===`scatter`),$=o.interaction===!1?!1:o.interaction===!0||o.interaction===void 0?!0:o.interaction.zoom??!0,Ce=$===!1?{x:!1,y:!1}:$===!0?{x:!0,y:B}:{x:$.includes(`x`),y:$.includes(`y`)},we=j?.format??(I&&(H.length||U.length)?e=>i.formatPercent(e,T):void 0);return{series:L,x:u(K,k,A,!1,T),y:{...u(j,P,N,P!==`category`,T),format:we},y2:xe,y2Map:Z,horizontal:fe,locale:T,labels:D,formatValue:i.valueFormatter(T),base:{x:q,y:Y},allScatter:B,zoom:Ce,tooltipMode:E?.mode??(B?`nearest`:Se?`item`:`axis`),baseline:F?Y[0]:Math.min(Math.max(0,Y[0]),Y[1]),minSpan:{x:k===`category`?1:(q[1]-q[0])*1e-7,y:P===`category`?1:(Y[1]-Y[0])*1e-7},percent:I,stacks:w.map(e=>e.stack!==void 0&&(e.type===`bar`||e.type===`line`||e.type===`area`||!e.type)?`${e.type===`bar`?`bar`:`line`}:${e.stack}`:null)}},ce=(e,t)=>e.barTop?e.barTop[t]:e.stackTop?e.stackTop[t]:e.cols.y[t],j=new WeakMap,M=e=>{let t=j.get(e.cols);return t||(t=new o.GridIndex(e.cols.x,e.cols.y,e.cols.count),j.set(e.cols,t)),t};exports.alignedDomain=y,exports.buildModel=se,exports.detectXType=l,exports.fromPlotX=D,exports.fromPlotY=T,exports.gridOf=M,exports.heatPosition=ae,exports.heatmapStops=oe,exports.plottedY=ce,exports.toPlotX=E,exports.toPlotY=w,exports.viewFromValues=k,exports.viewToValues=O;
2
2
  //# sourceMappingURL=model.cjs.map