minerva-design 1.0.2 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +21 -19
  3. package/dist/charts/canvas.d.cts +7 -0
  4. package/dist/charts/canvas.d.ts +7 -0
  5. package/dist/charts/core.cjs +1 -0
  6. package/dist/charts/core.d.cts +7 -0
  7. package/dist/charts/core.d.ts +7 -0
  8. package/dist/charts/core.js +6 -0
  9. package/dist/charts/engine/axis.cjs +2 -0
  10. package/dist/charts/engine/axis.cjs.map +1 -0
  11. package/dist/charts/engine/axis.d.cts +13 -0
  12. package/dist/charts/engine/axis.d.ts +13 -0
  13. package/dist/charts/engine/axis.js +38 -0
  14. package/dist/charts/engine/axis.js.map +1 -0
  15. package/dist/charts/engine/canvas.cjs +2 -0
  16. package/dist/charts/engine/canvas.cjs.map +1 -0
  17. package/dist/charts/engine/canvas.d.cts +85 -0
  18. package/dist/charts/engine/canvas.d.ts +85 -0
  19. package/dist/charts/engine/canvas.js +165 -0
  20. package/dist/charts/engine/canvas.js.map +1 -0
  21. package/dist/charts/engine/chart.cjs +3 -0
  22. package/dist/charts/engine/chart.cjs.map +1 -0
  23. package/dist/charts/engine/chart.d.cts +6 -0
  24. package/dist/charts/engine/chart.d.ts +6 -0
  25. package/dist/charts/engine/chart.js +566 -0
  26. package/dist/charts/engine/chart.js.map +1 -0
  27. package/dist/charts/engine/color.cjs +2 -0
  28. package/dist/charts/engine/color.cjs.map +1 -0
  29. package/dist/charts/engine/color.d.cts +33 -0
  30. package/dist/charts/engine/color.d.ts +33 -0
  31. package/dist/charts/engine/color.js +167 -0
  32. package/dist/charts/engine/color.js.map +1 -0
  33. package/dist/charts/engine/controller.cjs +3 -0
  34. package/dist/charts/engine/controller.cjs.map +1 -0
  35. package/dist/charts/engine/controller.d.cts +182 -0
  36. package/dist/charts/engine/controller.d.ts +182 -0
  37. package/dist/charts/engine/controller.js +528 -0
  38. package/dist/charts/engine/controller.js.map +1 -0
  39. package/dist/charts/engine/data.cjs +2 -0
  40. package/dist/charts/engine/data.cjs.map +1 -0
  41. package/dist/charts/engine/data.d.cts +29 -0
  42. package/dist/charts/engine/data.d.ts +29 -0
  43. package/dist/charts/engine/data.js +104 -0
  44. package/dist/charts/engine/data.js.map +1 -0
  45. package/dist/charts/engine/decimate.cjs +2 -0
  46. package/dist/charts/engine/decimate.cjs.map +1 -0
  47. package/dist/charts/engine/decimate.d.cts +13 -0
  48. package/dist/charts/engine/decimate.d.ts +13 -0
  49. package/dist/charts/engine/decimate.js +28 -0
  50. package/dist/charts/engine/decimate.js.map +1 -0
  51. package/dist/charts/engine/dom.cjs +2 -0
  52. package/dist/charts/engine/dom.cjs.map +1 -0
  53. package/dist/charts/engine/dom.d.cts +21 -0
  54. package/dist/charts/engine/dom.d.ts +21 -0
  55. package/dist/charts/engine/dom.js +125 -0
  56. package/dist/charts/engine/dom.js.map +1 -0
  57. package/dist/charts/engine/format.cjs +2 -0
  58. package/dist/charts/engine/format.cjs.map +1 -0
  59. package/dist/charts/engine/format.d.cts +9 -0
  60. package/dist/charts/engine/format.d.ts +9 -0
  61. package/dist/charts/engine/format.js +34 -0
  62. package/dist/charts/engine/format.js.map +1 -0
  63. package/dist/charts/engine/items.cjs +2 -0
  64. package/dist/charts/engine/items.cjs.map +1 -0
  65. package/dist/charts/engine/items.d.cts +8 -0
  66. package/dist/charts/engine/items.d.ts +8 -0
  67. package/dist/charts/engine/items.js +91 -0
  68. package/dist/charts/engine/items.js.map +1 -0
  69. package/dist/charts/engine/layout.cjs +2 -0
  70. package/dist/charts/engine/layout.cjs.map +1 -0
  71. package/dist/charts/engine/layout.d.cts +37 -0
  72. package/dist/charts/engine/layout.d.ts +37 -0
  73. package/dist/charts/engine/layout.js +26 -0
  74. package/dist/charts/engine/layout.js.map +1 -0
  75. package/dist/charts/engine/model.cjs +2 -0
  76. package/dist/charts/engine/model.cjs.map +1 -0
  77. package/dist/charts/engine/model.d.cts +74 -0
  78. package/dist/charts/engine/model.d.ts +74 -0
  79. package/dist/charts/engine/model.js +175 -0
  80. package/dist/charts/engine/model.js.map +1 -0
  81. package/dist/charts/engine/overlay.cjs +2 -0
  82. package/dist/charts/engine/overlay.cjs.map +1 -0
  83. package/dist/charts/engine/overlay.d.cts +78 -0
  84. package/dist/charts/engine/overlay.d.ts +78 -0
  85. package/dist/charts/engine/overlay.js +137 -0
  86. package/dist/charts/engine/overlay.js.map +1 -0
  87. package/dist/charts/engine/presets.cjs +3 -0
  88. package/dist/charts/engine/presets.cjs.map +1 -0
  89. package/dist/charts/engine/presets.d.cts +103 -0
  90. package/dist/charts/engine/presets.d.ts +103 -0
  91. package/dist/charts/engine/presets.js +153 -0
  92. package/dist/charts/engine/presets.js.map +1 -0
  93. package/dist/charts/engine/renderers/canvas2d.cjs +2 -0
  94. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -0
  95. package/dist/charts/engine/renderers/canvas2d.d.cts +20 -0
  96. package/dist/charts/engine/renderers/canvas2d.d.ts +20 -0
  97. package/dist/charts/engine/renderers/canvas2d.js +193 -0
  98. package/dist/charts/engine/renderers/canvas2d.js.map +1 -0
  99. package/dist/charts/engine/renderers/detect.cjs +2 -0
  100. package/dist/charts/engine/renderers/detect.cjs.map +1 -0
  101. package/dist/charts/engine/renderers/detect.d.cts +12 -0
  102. package/dist/charts/engine/renderers/detect.d.ts +12 -0
  103. package/dist/charts/engine/renderers/detect.js +33 -0
  104. package/dist/charts/engine/renderers/detect.js.map +1 -0
  105. package/dist/charts/engine/renderers/range.cjs +2 -0
  106. package/dist/charts/engine/renderers/range.cjs.map +1 -0
  107. package/dist/charts/engine/renderers/range.d.cts +5 -0
  108. package/dist/charts/engine/renderers/range.d.ts +5 -0
  109. package/dist/charts/engine/renderers/range.js +32 -0
  110. package/dist/charts/engine/renderers/range.js.map +1 -0
  111. package/dist/charts/engine/renderers/shaders.cjs +266 -0
  112. package/dist/charts/engine/renderers/shaders.cjs.map +1 -0
  113. package/dist/charts/engine/renderers/shaders.d.cts +20 -0
  114. package/dist/charts/engine/renderers/shaders.d.ts +20 -0
  115. package/dist/charts/engine/renderers/shaders.js +251 -0
  116. package/dist/charts/engine/renderers/shaders.js.map +1 -0
  117. package/dist/charts/engine/renderers/types.cjs +2 -0
  118. package/dist/charts/engine/renderers/types.cjs.map +1 -0
  119. package/dist/charts/engine/renderers/types.d.cts +83 -0
  120. package/dist/charts/engine/renderers/types.d.ts +83 -0
  121. package/dist/charts/engine/renderers/types.js +6 -0
  122. package/dist/charts/engine/renderers/types.js.map +1 -0
  123. package/dist/charts/engine/renderers/webgl2.cjs +2 -0
  124. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -0
  125. package/dist/charts/engine/renderers/webgl2.d.cts +5 -0
  126. package/dist/charts/engine/renderers/webgl2.d.ts +5 -0
  127. package/dist/charts/engine/renderers/webgl2.js +134 -0
  128. package/dist/charts/engine/renderers/webgl2.js.map +1 -0
  129. package/dist/charts/engine/renderers/webgpu.cjs +2 -0
  130. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -0
  131. package/dist/charts/engine/renderers/webgpu.d.cts +6 -0
  132. package/dist/charts/engine/renderers/webgpu.d.ts +6 -0
  133. package/dist/charts/engine/renderers/webgpu.js +220 -0
  134. package/dist/charts/engine/renderers/webgpu.js.map +1 -0
  135. package/dist/charts/engine/scale.cjs +2 -0
  136. package/dist/charts/engine/scale.cjs.map +1 -0
  137. package/dist/charts/engine/scale.d.cts +13 -0
  138. package/dist/charts/engine/scale.d.ts +13 -0
  139. package/dist/charts/engine/scale.js +37 -0
  140. package/dist/charts/engine/scale.js.map +1 -0
  141. package/dist/charts/engine/scene.cjs +2 -0
  142. package/dist/charts/engine/scene.cjs.map +1 -0
  143. package/dist/charts/engine/scene.d.cts +89 -0
  144. package/dist/charts/engine/scene.d.ts +89 -0
  145. package/dist/charts/engine/scene.js +241 -0
  146. package/dist/charts/engine/scene.js.map +1 -0
  147. package/dist/charts/engine/spatial.cjs +2 -0
  148. package/dist/charts/engine/spatial.cjs.map +1 -0
  149. package/dist/charts/engine/spatial.d.cts +18 -0
  150. package/dist/charts/engine/spatial.d.ts +18 -0
  151. package/dist/charts/engine/spatial.js +53 -0
  152. package/dist/charts/engine/spatial.js.map +1 -0
  153. package/dist/charts/engine/theme.cjs +2 -0
  154. package/dist/charts/engine/theme.cjs.map +1 -0
  155. package/dist/charts/engine/theme.d.cts +45 -0
  156. package/dist/charts/engine/theme.d.ts +45 -0
  157. package/dist/charts/engine/theme.js +86 -0
  158. package/dist/charts/engine/theme.js.map +1 -0
  159. package/dist/charts/engine/time.cjs +2 -0
  160. package/dist/charts/engine/time.cjs.map +1 -0
  161. package/dist/charts/engine/time.d.cts +10 -0
  162. package/dist/charts/engine/time.d.ts +10 -0
  163. package/dist/charts/engine/time.js +189 -0
  164. package/dist/charts/engine/time.js.map +1 -0
  165. package/dist/charts/engine/types.d.cts +356 -0
  166. package/dist/charts/engine/types.d.ts +356 -0
  167. package/dist/charts/engine/viewport.cjs +2 -0
  168. package/dist/charts/engine/viewport.cjs.map +1 -0
  169. package/dist/charts/engine/viewport.d.cts +12 -0
  170. package/dist/charts/engine/viewport.d.ts +12 -0
  171. package/dist/charts/engine/viewport.js +15 -0
  172. package/dist/charts/engine/viewport.js.map +1 -0
  173. package/dist/charts/index.cjs +1 -0
  174. package/dist/charts/index.d.cts +4 -0
  175. package/dist/charts/index.d.ts +4 -0
  176. package/dist/charts/index.js +10 -0
  177. package/dist/charts/react/Chart.cjs +2 -0
  178. package/dist/charts/react/Chart.cjs.map +1 -0
  179. package/dist/charts/react/Chart.d.cts +35 -0
  180. package/dist/charts/react/Chart.d.ts +35 -0
  181. package/dist/charts/react/Chart.js +117 -0
  182. package/dist/charts/react/Chart.js.map +1 -0
  183. package/dist/charts/react/charts.cjs +2 -0
  184. package/dist/charts/react/charts.cjs.map +1 -0
  185. package/dist/charts/react/charts.d.cts +13 -0
  186. package/dist/charts/react/charts.d.ts +13 -0
  187. package/dist/charts/react/charts.js +133 -0
  188. package/dist/charts/react/charts.js.map +1 -0
  189. package/dist/charts/react/types.d.cts +136 -0
  190. package/dist/charts/react/types.d.ts +136 -0
  191. package/dist/native/charts/src/canvas.cjs +1 -0
  192. package/dist/native/charts/src/canvas.js +6 -0
  193. package/dist/native/charts/src/engine/axis.cjs +2 -0
  194. package/dist/native/charts/src/engine/axis.cjs.map +1 -0
  195. package/dist/native/charts/src/engine/axis.js +38 -0
  196. package/dist/native/charts/src/engine/axis.js.map +1 -0
  197. package/dist/native/charts/src/engine/canvas.cjs +1 -0
  198. package/dist/native/charts/src/engine/canvas.js +1 -0
  199. package/dist/native/charts/src/engine/color.cjs +2 -0
  200. package/dist/native/charts/src/engine/color.cjs.map +1 -0
  201. package/dist/native/charts/src/engine/color.js +130 -0
  202. package/dist/native/charts/src/engine/color.js.map +1 -0
  203. package/dist/native/charts/src/engine/controller.cjs +3 -0
  204. package/dist/native/charts/src/engine/controller.cjs.map +1 -0
  205. package/dist/native/charts/src/engine/controller.js +528 -0
  206. package/dist/native/charts/src/engine/controller.js.map +1 -0
  207. package/dist/native/charts/src/engine/data.cjs +2 -0
  208. package/dist/native/charts/src/engine/data.cjs.map +1 -0
  209. package/dist/native/charts/src/engine/data.js +104 -0
  210. package/dist/native/charts/src/engine/data.js.map +1 -0
  211. package/dist/native/charts/src/engine/decimate.cjs +2 -0
  212. package/dist/native/charts/src/engine/decimate.cjs.map +1 -0
  213. package/dist/native/charts/src/engine/decimate.js +28 -0
  214. package/dist/native/charts/src/engine/decimate.js.map +1 -0
  215. package/dist/native/charts/src/engine/format.cjs +2 -0
  216. package/dist/native/charts/src/engine/format.cjs.map +1 -0
  217. package/dist/native/charts/src/engine/format.js +34 -0
  218. package/dist/native/charts/src/engine/format.js.map +1 -0
  219. package/dist/native/charts/src/engine/layout.cjs +2 -0
  220. package/dist/native/charts/src/engine/layout.cjs.map +1 -0
  221. package/dist/native/charts/src/engine/layout.js +26 -0
  222. package/dist/native/charts/src/engine/layout.js.map +1 -0
  223. package/dist/native/charts/src/engine/model.cjs +2 -0
  224. package/dist/native/charts/src/engine/model.cjs.map +1 -0
  225. package/dist/native/charts/src/engine/model.js +175 -0
  226. package/dist/native/charts/src/engine/model.js.map +1 -0
  227. package/dist/native/charts/src/engine/overlay.cjs +2 -0
  228. package/dist/native/charts/src/engine/overlay.cjs.map +1 -0
  229. package/dist/native/charts/src/engine/overlay.js +49 -0
  230. package/dist/native/charts/src/engine/overlay.js.map +1 -0
  231. package/dist/native/charts/src/engine/presets.cjs +3 -0
  232. package/dist/native/charts/src/engine/presets.cjs.map +1 -0
  233. package/dist/native/charts/src/engine/presets.js +147 -0
  234. package/dist/native/charts/src/engine/presets.js.map +1 -0
  235. package/dist/native/charts/src/engine/scale.cjs +2 -0
  236. package/dist/native/charts/src/engine/scale.cjs.map +1 -0
  237. package/dist/native/charts/src/engine/scale.js +37 -0
  238. package/dist/native/charts/src/engine/scale.js.map +1 -0
  239. package/dist/native/charts/src/engine/scene.cjs +2 -0
  240. package/dist/native/charts/src/engine/scene.cjs.map +1 -0
  241. package/dist/native/charts/src/engine/scene.js +241 -0
  242. package/dist/native/charts/src/engine/scene.js.map +1 -0
  243. package/dist/native/charts/src/engine/spatial.cjs +2 -0
  244. package/dist/native/charts/src/engine/spatial.cjs.map +1 -0
  245. package/dist/native/charts/src/engine/spatial.js +53 -0
  246. package/dist/native/charts/src/engine/spatial.js.map +1 -0
  247. package/dist/native/charts/src/engine/theme.cjs +2 -0
  248. package/dist/native/charts/src/engine/theme.cjs.map +1 -0
  249. package/dist/native/charts/src/engine/theme.js +62 -0
  250. package/dist/native/charts/src/engine/theme.js.map +1 -0
  251. package/dist/native/charts/src/engine/time.cjs +2 -0
  252. package/dist/native/charts/src/engine/time.cjs.map +1 -0
  253. package/dist/native/charts/src/engine/time.js +189 -0
  254. package/dist/native/charts/src/engine/time.js.map +1 -0
  255. package/dist/native/charts/src/engine/viewport.cjs +2 -0
  256. package/dist/native/charts/src/engine/viewport.cjs.map +1 -0
  257. package/dist/native/charts/src/engine/viewport.js +12 -0
  258. package/dist/native/charts/src/engine/viewport.js.map +1 -0
  259. package/dist/native/components/Chart/ChartBase.cjs +2 -0
  260. package/dist/native/components/Chart/ChartBase.cjs.map +1 -0
  261. package/dist/native/components/Chart/ChartBase.d.cts +29 -0
  262. package/dist/native/components/Chart/ChartBase.d.ts +29 -0
  263. package/dist/native/components/Chart/ChartBase.js +287 -0
  264. package/dist/native/components/Chart/ChartBase.js.map +1 -0
  265. package/dist/native/components/Chart/charts.cjs +2 -0
  266. package/dist/native/components/Chart/charts.cjs.map +1 -0
  267. package/dist/native/components/Chart/charts.d.cts +19 -0
  268. package/dist/native/components/Chart/charts.d.ts +19 -0
  269. package/dist/native/components/Chart/charts.js +173 -0
  270. package/dist/native/components/Chart/charts.js.map +1 -0
  271. package/dist/native/components/Chart/index.cjs +1 -0
  272. package/dist/native/components/Chart/index.d.cts +2 -0
  273. package/dist/native/components/Chart/index.d.ts +2 -0
  274. package/dist/native/components/Chart/index.js +2 -0
  275. package/dist/native/components/Chart/measure.cjs +2 -0
  276. package/dist/native/components/Chart/measure.cjs.map +1 -0
  277. package/dist/native/components/Chart/measure.d.cts +5 -0
  278. package/dist/native/components/Chart/measure.d.ts +5 -0
  279. package/dist/native/components/Chart/measure.js +11 -0
  280. package/dist/native/components/Chart/measure.js.map +1 -0
  281. package/dist/native/components/Chart/scene.cjs +2 -0
  282. package/dist/native/components/Chart/scene.cjs.map +1 -0
  283. package/dist/native/components/Chart/scene.d.cts +41 -0
  284. package/dist/native/components/Chart/scene.d.ts +41 -0
  285. package/dist/native/components/Chart/scene.js +419 -0
  286. package/dist/native/components/Chart/scene.js.map +1 -0
  287. package/dist/native/components/Chart/theme.cjs +2 -0
  288. package/dist/native/components/Chart/theme.cjs.map +1 -0
  289. package/dist/native/components/Chart/theme.d.cts +10 -0
  290. package/dist/native/components/Chart/theme.d.ts +10 -0
  291. package/dist/native/components/Chart/theme.js +10 -0
  292. package/dist/native/components/Chart/theme.js.map +1 -0
  293. package/dist/native/components/Chart/types.d.cts +129 -0
  294. package/dist/native/components/Chart/types.d.ts +129 -0
  295. package/dist/native/index.cjs +1 -1
  296. package/dist/native/index.d.cts +1 -0
  297. package/dist/native/index.d.ts +1 -0
  298. package/dist/native/index.js +6 -4
  299. package/dist/native/manifest.d.cts +7 -0
  300. package/dist/native/manifest.d.ts +7 -0
  301. package/dist/native/source/components/Chart/ChartBase.tsx +545 -0
  302. package/dist/native/source/components/Chart/charts.tsx +291 -0
  303. package/dist/native/source/components/Chart/index.ts +8 -0
  304. package/dist/native/source/components/Chart/measure.ts +50 -0
  305. package/dist/native/source/components/Chart/scene.tsx +987 -0
  306. package/dist/native/source/components/Chart/theme.ts +16 -0
  307. package/dist/native/source/components/Chart/types.ts +194 -0
  308. package/dist/native/source/index.ts +1 -0
  309. package/dist/native/source/manifest.ts +14 -0
  310. package/dist/taro/charts.d.ts +144 -0
  311. package/dist/taro/index.d.ts +1 -0
  312. package/dist/taro/index.js +3064 -618
  313. package/dist/uni/BarChart.vue +75 -0
  314. package/dist/uni/BarChart.vue.d.ts +111 -0
  315. package/dist/uni/Chart.vue +68 -0
  316. package/dist/uni/Chart.vue.d.ts +100 -0
  317. package/dist/uni/LineChart.vue +75 -0
  318. package/dist/uni/LineChart.vue.d.ts +111 -0
  319. package/dist/uni/ProgressIndicator.vue.d.ts +1 -1
  320. package/dist/uni/QuadrantChart.vue +184 -0
  321. package/dist/uni/QuadrantChart.vue.d.ts +173 -0
  322. package/dist/uni/ScatterChart.vue +69 -0
  323. package/dist/uni/ScatterChart.vue.d.ts +100 -0
  324. package/dist/uni/chart-canvas.d.ts +68 -0
  325. package/dist/uni/chart-canvas.js +363 -0
  326. package/dist/uni/chart-types.d.ts +135 -0
  327. package/dist/uni/chart-types.js +84 -0
  328. package/dist/uni/charts-canvas.d.ts +1 -0
  329. package/dist/uni/charts-canvas.js +8 -0
  330. package/dist/uni/index.d.ts +6 -0
  331. package/dist/uni/index.js +6 -0
  332. package/dist/weapp/bar-chart/index.js +1 -0
  333. package/dist/weapp/bar-chart/index.json +1 -0
  334. package/dist/weapp/bar-chart/index.wxml +1 -0
  335. package/dist/weapp/bar-chart/index.wxss +1 -0
  336. package/dist/weapp/chart/index.js +1 -0
  337. package/dist/weapp/chart/index.json +1 -0
  338. package/dist/weapp/chart/index.wxml +1 -0
  339. package/dist/weapp/chart/index.wxss +1 -0
  340. package/dist/weapp/controls.js +4019 -266
  341. package/dist/weapp/line-chart/index.js +1 -0
  342. package/dist/weapp/line-chart/index.json +1 -0
  343. package/dist/weapp/line-chart/index.wxml +1 -0
  344. package/dist/weapp/line-chart/index.wxss +1 -0
  345. package/dist/weapp/quadrant-chart/index.js +1 -0
  346. package/dist/weapp/quadrant-chart/index.json +1 -0
  347. package/dist/weapp/quadrant-chart/index.wxml +1 -0
  348. package/dist/weapp/quadrant-chart/index.wxss +1 -0
  349. package/dist/weapp/scatter-chart/index.js +1 -0
  350. package/dist/weapp/scatter-chart/index.json +1 -0
  351. package/dist/weapp/scatter-chart/index.wxml +1 -0
  352. package/dist/weapp/scatter-chart/index.wxss +1 -0
  353. package/dist/weapp/types.d.ts +295 -0
  354. package/package.json +48 -2
@@ -0,0 +1,241 @@
1
+ import { nearestIndex as e } from "./data.js";
2
+ import { mix as t, toCss as n } from "./color.js";
3
+ import { computePlot as r, createScales as i } from "./layout.js";
4
+ import { gridOf as a } from "./model.js";
5
+ import { axisTicks as o } from "./axis.js";
6
+ var s = {
7
+ top: 12,
8
+ right: 16,
9
+ bottom: 4,
10
+ left: 4
11
+ }, c = (e, t) => t, l = (e, n) => {
12
+ let r = n.resolve ?? c;
13
+ return (e ?? []).map((e) => {
14
+ if (e.type === "rect") {
15
+ let i = e.color ? r(e.color, n.primary) : n.primary;
16
+ return {
17
+ type: "rect",
18
+ x0: e.x0,
19
+ x1: e.x1,
20
+ y0: e.y0,
21
+ y1: e.y1,
22
+ color: i,
23
+ opacity: e.opacity ?? .08,
24
+ label: e.label,
25
+ labelPosition: e.labelPosition ?? "top-left",
26
+ labelColor: e.labelColor ? r(e.labelColor, i) : t(i, n.text, .2)
27
+ };
28
+ }
29
+ return e.type === "text" ? {
30
+ type: "text",
31
+ x: e.x,
32
+ y: e.y,
33
+ text: e.text,
34
+ anchor: e.anchor ?? "center",
35
+ color: e.color ? r(e.color, n.textMuted) : n.textMuted,
36
+ weight: e.weight ?? 500
37
+ } : {
38
+ type: "line",
39
+ axis: e.axis,
40
+ value: e.value,
41
+ color: e.color ? r(e.color, n.textMuted) : n.textMuted,
42
+ width: e.width ?? 1,
43
+ dash: [...e.dash ?? [4, 4]],
44
+ label: e.label
45
+ };
46
+ });
47
+ }, u = (e) => {
48
+ let { model: t, view: n, theme: a, width: c, height: l, measure: u } = e, d = t.y.tickCount ?? (l >= 220 ? 5 : Math.max(2, Math.round((l - 48) / 52))), f = o(t.y, n.y, d), p = 0;
49
+ if (t.y.visible) for (let e of f.labels) p = Math.max(p, u(e));
50
+ let m = 48;
51
+ if (t.x.type === "category") {
52
+ m = 0;
53
+ let e = Math.max(1, Math.floor(t.x.categories.length / 200));
54
+ for (let n = 0; n < t.x.categories.length; n += e) m = Math.max(m, u(t.x.categories[n]));
55
+ }
56
+ let h = {
57
+ ...s,
58
+ ...e.padding
59
+ }, g = r({
60
+ width: c,
61
+ height: l,
62
+ padding: h,
63
+ yLabelWidth: t.y.visible ? Math.ceil(p) : 0,
64
+ xAxisVisible: t.x.visible,
65
+ xTitle: !!t.x.title && t.x.visible,
66
+ yTitle: !!t.y.title && t.y.visible,
67
+ fontSize: a.fontSize
68
+ });
69
+ e.top && (g.y += e.top);
70
+ let _ = t.x.type === "category" ? Math.max(1, Math.floor(g.width / (m + 14))) : t.x.tickCount ?? Math.max(2, Math.floor(g.width / 96)), v = o(t.x, n.x, _);
71
+ return {
72
+ plot: g,
73
+ scales: i(g, n, t.x.reverse, t.y.reverse),
74
+ xTicks: v,
75
+ yTicks: f
76
+ };
77
+ }, d = (e, t, n) => {
78
+ let r = [];
79
+ for (let i of e.series) {
80
+ if (i.hidden || i.type !== "scatter" || !i.showLabels) continue;
81
+ let { x: e, y: a, count: o, labels: s, size: c } = i.cols;
82
+ if (s) for (let l = 0; l < o && r.length < 300; l++) {
83
+ let o = s[l];
84
+ if (!o) continue;
85
+ let u = e[l], d = a[l];
86
+ if (u < t.x[0] || u > t.x[1] || d < t.y[0] || d > t.y[1]) continue;
87
+ let f = c && c[l] > 0 ? c[l] : i.pointSize;
88
+ r.push({
89
+ x: n.xToPx(u),
90
+ y: n.yToPx(d),
91
+ r: f / 2,
92
+ text: o
93
+ });
94
+ }
95
+ }
96
+ return r;
97
+ }, f = (e, t, n) => {
98
+ let r = e.cols.x[t] + (e.type === "bar" ? e.barOffset : 0), i = e.type === "bar" && e.barTop ? e.barTop[t] : e.cols.y[t];
99
+ return {
100
+ px: n.xToPx(r),
101
+ py: n.yToPx(i)
102
+ };
103
+ }, p = (e, t, n, r, i) => {
104
+ let a = f(e, t, i), o = !1;
105
+ if (e.type === "bar" && e.barBase) {
106
+ let s = e.barHalfWidth / i.xPerPx, c = i.yToPx(e.barBase[t]);
107
+ o = Math.abs(n - a.px) <= s && r >= Math.min(c, a.py) - 2 && r <= Math.max(c, a.py) + 2;
108
+ }
109
+ return {
110
+ series: e,
111
+ index: t,
112
+ px: a.px,
113
+ py: a.py,
114
+ dx: Math.abs(i.xToPx(e.cols.x[t]) - n),
115
+ dist: o ? 0 : Math.hypot(a.px - n, a.py - r),
116
+ inside: o
117
+ };
118
+ }, m = (e, t) => e.cols.size && e.cols.size[t] > 0 ? e.cols.size[t] : e.pointSize, h = (e, t, n, r, i) => {
119
+ let o = Math.max(e.pointSize / 2 + 6, 10) + i, s = r.pxToX(t), c = r.pxToY(n), l = o * r.xPerPx, u = o * r.yPerPx, d = -1, f = Infinity, { x: p, y: h } = e.cols;
120
+ return a(e).query(s - l, s + l, c - u, c + u, (a) => {
121
+ let o = Math.hypot(r.xToPx(p[a]) - t, r.yToPx(h[a]) - n);
122
+ o <= Math.max(m(e, a) / 2 + 4, 8) + i && o <= f && (f = o, d = a);
123
+ }), d;
124
+ }, g = (t, n) => {
125
+ let { x: r, y: i, count: a, sorted: o } = t.cols;
126
+ if (o) return e(r, i, a, n);
127
+ let s = -1, c = Infinity;
128
+ for (let e = 0; e < a; e++) {
129
+ if (!Number.isFinite(i[e])) continue;
130
+ let t = Math.abs(r[e] - n);
131
+ t < c && (c = t, s = e);
132
+ }
133
+ return s;
134
+ }, _ = (e, t) => {
135
+ let r = e.pointColors?.[t], i = e.cols.labels?.[t];
136
+ return {
137
+ seriesIndex: e.index,
138
+ seriesId: e.id,
139
+ seriesName: e.name,
140
+ index: t,
141
+ x: e.cols.x[t],
142
+ y: e.cols.y[t],
143
+ color: r ? n(r) : e.colorCss,
144
+ ...i === void 0 ? {} : { label: i }
145
+ };
146
+ }, v = (e, t) => {
147
+ if (!e.length) return null;
148
+ e.sort((e, t) => e.series.index - t.series.index);
149
+ let n = e.map((e) => _(e.series, e.index)), r = n[0].x;
150
+ return {
151
+ items: n,
152
+ x: r,
153
+ xLabel: t?.formatValue(r) ?? String(r)
154
+ };
155
+ }, y = (e, t, n, r, i, a = 0) => {
156
+ let { plot: o } = t, s = 6 + a;
157
+ if (r < o.x - s || r > o.x + o.width + s || i < o.y - s || i > o.y + o.height + s) return null;
158
+ let c = t.pxToX(r), l = [], u = [];
159
+ for (let n of e.series) if (!(n.hidden || n.cols.count === 0)) {
160
+ if (n.type === "scatter") {
161
+ let e = h(n, r, i, t, a);
162
+ e >= 0 && l.push(p(n, e, r, i, t));
163
+ } else {
164
+ let e = g(n, c);
165
+ e >= 0 && u.push(p(n, e, r, i, t));
166
+ }
167
+ }
168
+ if (e.tooltipMode === "nearest") {
169
+ let e = [...l, ...u].filter((e) => e.inside || e.series.type === "scatter" || e.dist <= 32 + a);
170
+ return e.length ? v([e.reduce((e, t) => t.dist <= e.dist ? t : e)], n) : null;
171
+ }
172
+ if (!u.length) return l.length ? v([l.reduce((e, t) => t.dist <= e.dist ? t : e)], n) : null;
173
+ let d = Math.min(...u.map((e) => e.dx)), f = e.x.type === "category" ? .5 / t.xPerPx : 0, m = u.filter((e) => e.dx <= d + Math.max(1, f)), y = m.reduce((e, t) => t.dx < e.dx ? t : e), b = v([
174
+ y,
175
+ ...m.filter((e) => e !== y),
176
+ ...l
177
+ ], n);
178
+ return b && (b.x = _(y.series, y.index).x, b.xLabel = n?.formatValue(b.x) ?? String(b.x)), b;
179
+ }, b = (e, t) => e === t || !!e && !!t && e.items.length === t.items.length && e.items.every((e, n) => e.index === t.items[n].index && e.seriesIndex === t.items[n].seriesIndex), x = (e, t, n) => {
180
+ let r = n?.formatValue ?? String;
181
+ if (t.items.every((t) => e.series[t.seriesIndex].type === "scatter") && t.items.length === 1) {
182
+ let n = t.items[0], i = [{
183
+ color: null,
184
+ name: e.x.title ?? "x",
185
+ value: t.xLabel
186
+ }, {
187
+ color: null,
188
+ name: e.y.title ?? "y",
189
+ value: r(n.y)
190
+ }];
191
+ return n.label !== void 0 && e.series.length > 1 && i.push({
192
+ color: null,
193
+ name: "",
194
+ value: n.seriesName
195
+ }), {
196
+ title: n.label ?? n.seriesName,
197
+ titleColor: n.color,
198
+ rows: i
199
+ };
200
+ }
201
+ return {
202
+ title: t.xLabel,
203
+ titleColor: null,
204
+ rows: t.items.map((e) => ({
205
+ color: e.color,
206
+ name: e.label ? `${e.seriesName} · ${e.label}` : e.seriesName,
207
+ value: r(e.y)
208
+ }))
209
+ };
210
+ }, S = (e, t, n) => {
211
+ let r = [], { plot: i } = t;
212
+ for (let a of n.items) {
213
+ let n = e.series[a.seriesIndex];
214
+ if (n.type === "bar" && n.barBase && n.barTop) {
215
+ let e = t.xToPx(a.x + n.barOffset), i = Math.max(n.barHalfWidth / t.xPerPx, 1), o = t.yToPx(n.barBase[a.index]), s = t.yToPx(n.barTop[a.index]);
216
+ r.push({
217
+ kind: "bar",
218
+ x: e - i,
219
+ y: Math.min(o, s),
220
+ width: i * 2,
221
+ height: Math.max(1, Math.abs(o - s))
222
+ });
223
+ continue;
224
+ }
225
+ let o = t.xToPx(a.x), s = t.yToPx(a.y);
226
+ if (o < i.x - 1 || o > i.x + i.width + 1 || s < i.y - 1 || s > i.y + i.height + 1) continue;
227
+ let c = n.type === "scatter" ? m(n, a.index) + 6 : Math.max(10, n.lineWidth * 2 + 6);
228
+ r.push({
229
+ kind: "dot",
230
+ x: o,
231
+ y: s,
232
+ size: c,
233
+ color: a.color
234
+ });
235
+ }
236
+ return r;
237
+ }, C = (e, t, n) => n ?? (e.tooltipMode === "axis" && t.items.some((t) => e.series[t.seriesIndex].type !== "scatter"));
238
+ //#endregion
239
+ export { s as DEFAULT_PADDING, d as collectPointLabels, m as dotSize, c as fallbackResolve, y as hitTest, _ as hoverItemOf, S as hoverMarks, u as layoutChart, f as pointOf, l as resolveAnnotations, b as sameHover, C as showsCrosshair, x as tooltipContent };
240
+
241
+ //# sourceMappingURL=scene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scene.js","names":["DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","annotations","a","color","mix","layoutChart","input","yCount","model","height","yTicks","axisTicks","view","yLabelWidth","label","measure","categoryWidth","step","i","padding","plot","computePlot","xCount","xTicks","createScales","collectPointLabels","labels","series","texts","count","text","xi","x","yi","y","d","size","s","pointOf","xv","yv","sc","candidateOf","p","inside","half","base","px","py","dotSize","nearestScatter","radius","slop","rx","ry","best","bestDist","gridOf","nearestX","sorted","nearestIndex","bestD","hoverItemOf","pc","index","toCss","eventOf","candidates","b","items","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","tooltipContent","yFormat","rows","hoverMarks","marks","cx","showsCrosshair","crosshair"],"sources":["../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { mix, toCss, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { computePlot, createScales, type Rect, type Scales } from \"./layout\";\nimport { gridOf, type ChartModel, type SeriesModel } from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAnnotation,\n ChartHoverEvent,\n ChartHoverItem,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/** Annotation colors resolved against the theme */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: a.x0,\n x1: a.x1,\n y0: a.y0,\n y1: a.y1,\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: a.x,\n y: a.y,\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.value,\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts\n const yCount =\n model.y.tickCount ??\n (height >= 220 ? 5 : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(2, Math.floor(plot.width / 96)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks };\n};\n\n/** Labels of the visible scatter points (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n for (const series of model.series) {\n if (series.hidden || series.type !== \"scatter\" || !series.showLabels)\n continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n labels.push({ x: s.xToPx(xi), y: s.yToPx(yi), r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n dx: number;\n dist: number;\n inside: boolean;\n}\n\n/** Pixel position of a point (the top of a bar) */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const xv = s.cols.x[i] + (s.type === \"bar\" ? s.barOffset : 0);\n const yv = s.type === \"bar\" && s.barTop ? s.barTop[i] : s.cols.y[i];\n return { px: sc.xToPx(xv), py: sc.yToPx(yv) };\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n let inside = false;\n if (s.type === \"bar\" && s.barBase) {\n const half = s.barHalfWidth / sc.xPerPx;\n const base = sc.yToPx(s.barBase[i]);\n inside =\n Math.abs(px - p.px) <= half &&\n py >= Math.min(base, p.py) - 2 &&\n py <= Math.max(base, p.py) + 2;\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - px),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(s.pointSize / 2 + 6, 10) + slop;\n const xv = sc.pxToX(px);\n const yv = sc.pxToY(py);\n const rx = radius * sc.xPerPx;\n const ry = radius * sc.yPerPx;\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(xv - rx, xv + rx, yv - ry, yv + ry, (i) => {\n const d = Math.hypot(sc.xToPx(x[i]) - px, sc.yToPx(y[i]) - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const label = s.cols.labels?.[index];\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.cols.x[index],\n y: s.cols.y[index],\n color: pc ? toCss(pc) : s.colorCss,\n ...(label !== undefined ? { label } : {}),\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => hoverItemOf(c.series, c.index));\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const xv = sc.pxToX(px);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else {\n const i = nearestX(s, xv);\n if (i >= 0) others.push(candidateOf(s, i, px, py, sc));\n }\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / sc.xPerPx : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point) */\n titleColor: string | null;\n rows: TooltipRow[];\n}\n\n/** Default tooltip content of a hover payload */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? \"x\", value: event.xLabel },\n { color: null, name: model.y.title ?? \"y\", value: yFormat(it.y) },\n ];\n if (it.label !== undefined && model.series.length > 1)\n rows.push({ color: null, name: \"\", value: it.seriesName });\n return { title: it.label ?? it.seriesName, titleColor: it.color, rows };\n }\n return {\n title: event.xLabel,\n titleColor: null,\n rows: event.items.map((it) => ({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: yFormat(it.y),\n })),\n };\n};\n\n/** Shape of the hover marker of an item: a ring on a point, or a bar highlight */\nexport type HoverMark =\n | { kind: \"dot\"; x: number; y: number; size: number; color: string }\n | { kind: \"bar\"; x: number; y: number; width: number; height: number };\n\n/** Markers of the hovered points (pixels of the stage) */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const cx = sc.xToPx(it.x + s.barOffset);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 1);\n const a = sc.yToPx(s.barBase[it.index]);\n const b = sc.yToPx(s.barTop[it.index]);\n marks.push({\n kind: \"bar\",\n x: cx - half,\n y: Math.min(a, b),\n width: half * 2,\n height: Math.max(1, Math.abs(a - b)),\n });\n continue;\n }\n const px = sc.xToPx(it.x);\n const py = sc.yToPx(it.y);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 6\n : Math.max(10, s.lineWidth * 2 + 6);\n marks.push({ kind: \"dot\", x: px, y: py, size, color: it.color });\n }\n return marks;\n};\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => model.series[it.seriesIndex].type !== \"scatter\"));\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ var e=class{constructor(e,t,n,r=4){let i=1/0,a=-1/0,o=1/0,s=-1/0,c=0;for(let r=0;r<n;r++){let n=e[r],l=t[r];Number.isFinite(n)&&Number.isFinite(l)&&(c++,n<i&&(i=n),n>a&&(a=n),l<o&&(o=l),l>s&&(s=l))}let l=Math.min(1024,Math.max(1,Math.ceil(Math.sqrt(c/r))));this.cols=l,this.rows=l,this.x0=c?i:0,this.y0=c?o:0,this.cellW=c&&a>i?(a-i)/l:1,this.cellH=c&&s>o?(s-o)/l:1;let u=new Int32Array(n),d=new Uint32Array(l*l+1);for(let r=0;r<n;r++){let n=e[r],i=t[r];if(!Number.isFinite(n)||!Number.isFinite(i)){u[r]=-1;continue}let a=this.cellOf(n,i);u[r]=a,d[a+1]++}for(let e=1;e<d.length;e++)d[e]+=d[e-1];this.starts=d.slice();let f=d;this.order=new Uint32Array(c);for(let e=0;e<n;e++){let t=u[e];t>=0&&(this.order[f[t]++]=e)}}column(e){let t=Math.floor((e-this.x0)/this.cellW);return t<0?0:t>=this.cols?this.cols-1:t}row(e){let t=Math.floor((e-this.y0)/this.cellH);return t<0?0:t>=this.rows?this.rows-1:t}cellOf(e,t){return this.row(t)*this.cols+this.column(e)}query(e,t,n,r,i){if(this.order.length===0)return;let a=this.column(Math.min(e,t)),o=this.column(Math.max(e,t)),s=this.row(Math.min(n,r)),c=this.row(Math.max(n,r));for(let e=s;e<=c;e++)for(let t=a;t<=o;t++){let n=e*this.cols+t;for(let e=this.starts[n];e<this.starts[n+1];e++)i(this.order[e])}}};exports.GridIndex=e;
2
+ //# sourceMappingURL=spatial.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial.cjs","names":["GridIndex","xMin","xMax","yMin","yMax","valid","i","count","xi","x","yi","y","side","pointsPerCell","cells","counts","cell","c","cursor","r","c0","c1","r0","r1","k","visit"],"sources":["../../../../charts/src/engine/spatial.ts"],"sourcesContent":["// Uniform grid index of scattered points: hit testing among millions of\n// points only looks at the cells around the pointer.\n\nexport class GridIndex {\n readonly cols: number;\n readonly rows: number;\n private readonly x0: number;\n private readonly y0: number;\n private readonly cellW: number;\n private readonly cellH: number;\n /** Start of each cell in `order` (length cols * rows + 1) */\n private readonly starts: Uint32Array;\n /** Point indices grouped by cell */\n private readonly order: Uint32Array;\n\n constructor(\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n pointsPerCell = 4,\n ) {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let valid = 0;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n const yi = y[i];\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) continue;\n valid++;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n }\n const side = Math.min(\n 1024,\n Math.max(1, Math.ceil(Math.sqrt(valid / pointsPerCell))),\n );\n this.cols = side;\n this.rows = side;\n this.x0 = valid ? xMin : 0;\n this.y0 = valid ? yMin : 0;\n this.cellW = valid && xMax > xMin ? (xMax - xMin) / side : 1;\n this.cellH = valid && yMax > yMin ? (yMax - yMin) / side : 1;\n\n const cells = new Int32Array(count);\n const counts = new Uint32Array(side * side + 1);\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n const yi = y[i];\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n cells[i] = -1;\n continue;\n }\n const cell = this.cellOf(xi, yi);\n cells[i] = cell;\n counts[cell + 1]++;\n }\n for (let c = 1; c < counts.length; c++) counts[c] += counts[c - 1];\n this.starts = counts.slice();\n const cursor = counts;\n this.order = new Uint32Array(valid);\n for (let i = 0; i < count; i++) {\n const cell = cells[i];\n if (cell >= 0) this.order[cursor[cell]++] = i;\n }\n }\n\n private column(xi: number) {\n const c = Math.floor((xi - this.x0) / this.cellW);\n return c < 0 ? 0 : c >= this.cols ? this.cols - 1 : c;\n }\n\n private row(yi: number) {\n const r = Math.floor((yi - this.y0) / this.cellH);\n return r < 0 ? 0 : r >= this.rows ? this.rows - 1 : r;\n }\n\n private cellOf(xi: number, yi: number) {\n return this.row(yi) * this.cols + this.column(xi);\n }\n\n /** Calls `visit` with every point that may lie inside the box */\n query(\n xMin: number,\n xMax: number,\n yMin: number,\n yMax: number,\n visit: (index: number) => void,\n ): void {\n if (this.order.length === 0) return;\n const c0 = this.column(Math.min(xMin, xMax));\n const c1 = this.column(Math.max(xMin, xMax));\n const r0 = this.row(Math.min(yMin, yMax));\n const r1 = this.row(Math.max(yMin, yMax));\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const cell = r * this.cols + c;\n for (let k = this.starts[cell]; k < this.starts[cell + 1]; k++) {\n visit(this.order[k]);\n }\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export declare class GridIndex {
2
+ readonly cols: number;
3
+ readonly rows: number;
4
+ private readonly x0;
5
+ private readonly y0;
6
+ private readonly cellW;
7
+ private readonly cellH;
8
+ /** Start of each cell in `order` (length cols * rows + 1) */
9
+ private readonly starts;
10
+ /** Point indices grouped by cell */
11
+ private readonly order;
12
+ constructor(x: ArrayLike<number>, y: ArrayLike<number>, count: number, pointsPerCell?: number);
13
+ private column;
14
+ private row;
15
+ private cellOf;
16
+ /** Calls `visit` with every point that may lie inside the box */
17
+ query(xMin: number, xMax: number, yMin: number, yMax: number, visit: (index: number) => void): void;
18
+ }
@@ -0,0 +1,18 @@
1
+ export declare class GridIndex {
2
+ readonly cols: number;
3
+ readonly rows: number;
4
+ private readonly x0;
5
+ private readonly y0;
6
+ private readonly cellW;
7
+ private readonly cellH;
8
+ /** Start of each cell in `order` (length cols * rows + 1) */
9
+ private readonly starts;
10
+ /** Point indices grouped by cell */
11
+ private readonly order;
12
+ constructor(x: ArrayLike<number>, y: ArrayLike<number>, count: number, pointsPerCell?: number);
13
+ private column;
14
+ private row;
15
+ private cellOf;
16
+ /** Calls `visit` with every point that may lie inside the box */
17
+ query(xMin: number, xMax: number, yMin: number, yMax: number, visit: (index: number) => void): void;
18
+ }
@@ -0,0 +1,53 @@
1
+ //#region src/engine/spatial.ts
2
+ var e = class {
3
+ constructor(e, t, n, r = 4) {
4
+ let i = Infinity, a = -Infinity, o = Infinity, s = -Infinity, c = 0;
5
+ for (let r = 0; r < n; r++) {
6
+ let n = e[r], l = t[r];
7
+ Number.isFinite(n) && Number.isFinite(l) && (c++, n < i && (i = n), n > a && (a = n), l < o && (o = l), l > s && (s = l));
8
+ }
9
+ let l = Math.min(1024, Math.max(1, Math.ceil(Math.sqrt(c / r))));
10
+ this.cols = l, this.rows = l, this.x0 = c ? i : 0, this.y0 = c ? o : 0, this.cellW = c && a > i ? (a - i) / l : 1, this.cellH = c && s > o ? (s - o) / l : 1;
11
+ let u = new Int32Array(n), d = new Uint32Array(l * l + 1);
12
+ for (let r = 0; r < n; r++) {
13
+ let n = e[r], i = t[r];
14
+ if (!Number.isFinite(n) || !Number.isFinite(i)) {
15
+ u[r] = -1;
16
+ continue;
17
+ }
18
+ let a = this.cellOf(n, i);
19
+ u[r] = a, d[a + 1]++;
20
+ }
21
+ for (let e = 1; e < d.length; e++) d[e] += d[e - 1];
22
+ this.starts = d.slice();
23
+ let f = d;
24
+ this.order = new Uint32Array(c);
25
+ for (let e = 0; e < n; e++) {
26
+ let t = u[e];
27
+ t >= 0 && (this.order[f[t]++] = e);
28
+ }
29
+ }
30
+ column(e) {
31
+ let t = Math.floor((e - this.x0) / this.cellW);
32
+ return t < 0 ? 0 : t >= this.cols ? this.cols - 1 : t;
33
+ }
34
+ row(e) {
35
+ let t = Math.floor((e - this.y0) / this.cellH);
36
+ return t < 0 ? 0 : t >= this.rows ? this.rows - 1 : t;
37
+ }
38
+ cellOf(e, t) {
39
+ return this.row(t) * this.cols + this.column(e);
40
+ }
41
+ query(e, t, n, r, i) {
42
+ if (this.order.length === 0) return;
43
+ let a = this.column(Math.min(e, t)), o = this.column(Math.max(e, t)), s = this.row(Math.min(n, r)), c = this.row(Math.max(n, r));
44
+ for (let e = s; e <= c; e++) for (let t = a; t <= o; t++) {
45
+ let n = e * this.cols + t;
46
+ for (let e = this.starts[n]; e < this.starts[n + 1]; e++) i(this.order[e]);
47
+ }
48
+ }
49
+ };
50
+ //#endregion
51
+ export { e as GridIndex };
52
+
53
+ //# sourceMappingURL=spatial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial.js","names":["GridIndex","xMin","xMax","yMin","yMax","valid","i","count","xi","x","yi","y","side","pointsPerCell","cells","counts","cell","c","cursor","r","c0","c1","r0","r1","k"],"sources":["../../../../charts/src/engine/spatial.ts"],"sourcesContent":["// Uniform grid index of scattered points: hit testing among millions of\n// points only looks at the cells around the pointer.\n\nexport class GridIndex {\n readonly cols: number;\n readonly rows: number;\n private readonly x0: number;\n private readonly y0: number;\n private readonly cellW: number;\n private readonly cellH: number;\n /** Start of each cell in `order` (length cols * rows + 1) */\n private readonly starts: Uint32Array;\n /** Point indices grouped by cell */\n private readonly order: Uint32Array;\n\n constructor(\n x: ArrayLike<number>,\n y: ArrayLike<number>,\n count: number,\n pointsPerCell = 4,\n ) {\n let xMin = Infinity;\n let xMax = -Infinity;\n let yMin = Infinity;\n let yMax = -Infinity;\n let valid = 0;\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n const yi = y[i];\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) continue;\n valid++;\n if (xi < xMin) xMin = xi;\n if (xi > xMax) xMax = xi;\n if (yi < yMin) yMin = yi;\n if (yi > yMax) yMax = yi;\n }\n const side = Math.min(\n 1024,\n Math.max(1, Math.ceil(Math.sqrt(valid / pointsPerCell))),\n );\n this.cols = side;\n this.rows = side;\n this.x0 = valid ? xMin : 0;\n this.y0 = valid ? yMin : 0;\n this.cellW = valid && xMax > xMin ? (xMax - xMin) / side : 1;\n this.cellH = valid && yMax > yMin ? (yMax - yMin) / side : 1;\n\n const cells = new Int32Array(count);\n const counts = new Uint32Array(side * side + 1);\n for (let i = 0; i < count; i++) {\n const xi = x[i];\n const yi = y[i];\n if (!Number.isFinite(xi) || !Number.isFinite(yi)) {\n cells[i] = -1;\n continue;\n }\n const cell = this.cellOf(xi, yi);\n cells[i] = cell;\n counts[cell + 1]++;\n }\n for (let c = 1; c < counts.length; c++) counts[c] += counts[c - 1];\n this.starts = counts.slice();\n const cursor = counts;\n this.order = new Uint32Array(valid);\n for (let i = 0; i < count; i++) {\n const cell = cells[i];\n if (cell >= 0) this.order[cursor[cell]++] = i;\n }\n }\n\n private column(xi: number) {\n const c = Math.floor((xi - this.x0) / this.cellW);\n return c < 0 ? 0 : c >= this.cols ? this.cols - 1 : c;\n }\n\n private row(yi: number) {\n const r = Math.floor((yi - this.y0) / this.cellH);\n return r < 0 ? 0 : r >= this.rows ? this.rows - 1 : r;\n }\n\n private cellOf(xi: number, yi: number) {\n return this.row(yi) * this.cols + this.column(xi);\n }\n\n /** Calls `visit` with every point that may lie inside the box */\n query(\n xMin: number,\n xMax: number,\n yMin: number,\n yMax: number,\n visit: (index: number) => void,\n ): void {\n if (this.order.length === 0) return;\n const c0 = this.column(Math.min(xMin, xMax));\n const c1 = this.column(Math.max(xMin, xMax));\n const r0 = this.row(Math.min(yMin, yMax));\n const r1 = this.row(Math.max(yMin, yMax));\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const cell = r * this.cols + c;\n for (let k = this.starts[cell]; k < this.starts[cell + 1]; k++) {\n visit(this.order[k]);\n }\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("./color.cjs");var t=[`#4f46e5`,`#10b981`,`#f59e0b`,`#ef4444`,`#0ea5e9`,`#8b5cf6`,`#14b8a6`,`#f97316`],n=(e,t)=>e?.getPropertyValue(t).trim()??``,r=(t,r)=>{let i=t&&typeof getComputedStyle==`function`?getComputedStyle(t):null;return o(e=>n(i,e),e.domColorResolver(t),r,i?.fontFamily??``)},i=(e={},t)=>{let n=e.variables??{};return{...o(e=>n[e]?.trim()??``,a(n),t?.length?t:e.palette,``),...e.fontFamily?{fontFamily:e.fontFamily}:{},...e.fontSize?{fontSize:e.fontSize}:{}}},a=t=>(n,r)=>e.resolveStaticColor(n,t,r),o=(n,r,i,a)=>{let o=[.4,.4,.4,1],s=e=>r(e,o),c=(e,t)=>{for(let t of e)if(n(t))return s(`var(${t})`);return s(t)},l=c([`--surface-color`,`--background-color`],`#ffffff`),u=c([`--text-color`],`#1f2937`),d=c([`--text-secondary-color`,`--text-muted-color`],`#6b7280`),f=c([`--border-color`],`#e5e7eb`),p;if(i&&i.length)p=i.map(e=>s(e));else{let e=[];for(let t=1;t<=8;t++){let r=`--chart-series-${t}`;n(r)&&e.push(s(`var(${r})`))}p=e.length?e:[...[`--primary-color`,`--success-color`,`--warning-color`,`--danger-color`,`--info-color`].map((e,r)=>n(e)?s(`var(${e})`):s(t[r])),...t.slice(5).map(e=>s(e))]}let m=n(`--font-family-sans`)||a||`system-ui, -apple-system, 'Segoe UI', sans-serif`;return{palette:p,text:u,textMuted:d,grid:e.mix(l,f,.75),axis:f,background:l,surface:l,primary:p[0],fontFamily:m,fontSize:11,resolve:r}},s=e=>{if(typeof document>`u`)return()=>{};let t=[];if(typeof MutationObserver==`function`){let n=new MutationObserver(e);for(let e of[document.documentElement,document.body])e&&n.observe(e,{attributes:!0,attributeFilter:[`class`,`style`,`data-theme`,`data-mode`]});t.push(()=>n.disconnect())}if(typeof matchMedia==`function`){let n=matchMedia(`(prefers-color-scheme: dark)`);n.addEventListener?.(`change`,e),t.push(()=>n.removeEventListener?.(`change`,e))}return()=>t.forEach(e=>e())};exports.createTheme=i,exports.readTheme=r,exports.staticColorResolver=a,exports.watchTheme=s;
2
+ //# sourceMappingURL=theme.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.cjs","names":["domColorResolver","resolveStaticColor","mix","require_color","DEFAULT_PALETTE","readVar","style","name","readTheme","element","buildTheme","palette","createTheme","variables","input","staticColorResolver","value","fallback","fallbackGray","resolveColor","resolve","color","names","readVariable","background","text","textMuted","border","colors","c","custom","i","fontFamily","inheritedFont","watchTheme","cleanups","observer","onChange","node","query","fn"],"sources":["../../../../charts/src/engine/theme.ts"],"sourcesContent":["// Chart colors and fonts read from the Minerva CSS variables.\n\nimport {\n domColorResolver,\n mix,\n resolveStaticColor,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\n\nexport interface ChartTheme {\n palette: Rgba[];\n text: Rgba;\n textMuted: Rgba;\n grid: Rgba;\n axis: Rgba;\n background: Rgba;\n surface: Rgba;\n primary: Rgba;\n fontFamily: string;\n /** Tick label font size in CSS pixels */\n fontSize: number;\n /** Resolves the colors of the options (`var(--x)` included); static colors only when omitted */\n resolve?: ColorResolver;\n}\n\n/** Used when no CSS variable is defined (e.g. without the Minerva stylesheet) */\nconst DEFAULT_PALETTE = [\n \"#4f46e5\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#8b5cf6\",\n \"#14b8a6\",\n \"#f97316\",\n];\n\nconst readVar = (style: CSSStyleDeclaration | null, name: string) =>\n style?.getPropertyValue(name).trim() ?? \"\";\n\n/** Reads the theme from the computed style of `element` */\nexport const readTheme = (\n element: Element | null,\n palette?: readonly string[],\n): ChartTheme => {\n const style =\n element && typeof getComputedStyle === \"function\"\n ? getComputedStyle(element)\n : null;\n return buildTheme(\n (name) => readVar(style, name),\n domColorResolver(element),\n palette,\n style?.fontFamily ?? \"\",\n );\n};\n\n/** Theme of the charts drawn without a DOM (mini-programs, React Native) */\nexport interface ChartThemeInput {\n /**\n * Values of the Minerva CSS variables (`--primary-color`, `--text-color`,\n * `--chart-series-1`, ...) used for the theme colors and to resolve\n * `var(--name)` colors of the options\n */\n variables?: Readonly<Record<string, string>>;\n /** Series colors (hex / rgb) */\n palette?: readonly string[];\n /** Font family of the labels */\n fontFamily?: string;\n /**\n * Font size of the tick labels, in pixels\n * @default 11\n */\n fontSize?: number;\n}\n\n/** Builds a theme from plain values (no DOM) */\nexport const createTheme = (\n input: ChartThemeInput = {},\n palette?: readonly string[],\n): ChartTheme => {\n const variables = input.variables ?? {};\n const theme = buildTheme(\n (name) => variables[name]?.trim() ?? \"\",\n staticColorResolver(variables),\n palette?.length ? palette : input.palette,\n \"\",\n );\n return {\n ...theme,\n ...(input.fontFamily ? { fontFamily: input.fontFamily } : {}),\n ...(input.fontSize ? { fontSize: input.fontSize } : {}),\n };\n};\n\n/** Resolver of `var(--name, fallback)` colors against plain variables */\nexport const staticColorResolver =\n (variables: Readonly<Record<string, string>>): ColorResolver =>\n (value, fallback) =>\n resolveStaticColor(value, variables, fallback);\n\nconst buildTheme = (\n readVariable: (name: string) => string,\n resolve: ColorResolver,\n palette: readonly string[] | undefined,\n inheritedFont: string,\n): ChartTheme => {\n const fallbackGray: Rgba = [0.4, 0.4, 0.4, 1];\n const resolveColor = (value: string) => resolve(value, fallbackGray);\n const color = (names: string[], fallback: string): Rgba => {\n for (const name of names) {\n if (readVariable(name)) return resolveColor(`var(${name})`);\n }\n return resolveColor(fallback);\n };\n\n const background = color(\n [\"--surface-color\", \"--background-color\"],\n \"#ffffff\",\n );\n const text = color([\"--text-color\"], \"#1f2937\");\n const textMuted = color(\n [\"--text-secondary-color\", \"--text-muted-color\"],\n \"#6b7280\",\n );\n const border = color([\"--border-color\"], \"#e5e7eb\");\n\n let colors: Rgba[];\n if (palette && palette.length) {\n colors = palette.map((c) => resolveColor(c));\n } else {\n const custom: Rgba[] = [];\n for (let i = 1; i <= 8; i++) {\n const name = `--chart-series-${i}`;\n if (readVariable(name)) custom.push(resolveColor(`var(${name})`));\n }\n if (custom.length) {\n colors = custom;\n } else {\n const themed = [\n \"--primary-color\",\n \"--success-color\",\n \"--warning-color\",\n \"--danger-color\",\n \"--info-color\",\n ].map((name, i) =>\n readVariable(name)\n ? resolveColor(`var(${name})`)\n : resolveColor(DEFAULT_PALETTE[i]),\n );\n colors = [\n ...themed,\n ...DEFAULT_PALETTE.slice(5).map((c) => resolveColor(c)),\n ];\n }\n }\n\n const fontFamily =\n readVariable(\"--font-family-sans\") ||\n inheritedFont ||\n \"system-ui, -apple-system, 'Segoe UI', sans-serif\";\n\n return {\n palette: colors,\n text,\n textMuted,\n grid: mix(background, border, 0.75),\n axis: border,\n background,\n surface: background,\n primary: colors[0],\n fontFamily,\n fontSize: 11,\n resolve,\n };\n};\n\n/**\n * Calls `onChange` when the theme may have changed: attributes of `<html>` /\n * `<body>` (class, style, data-theme) and the color scheme.\n */\nexport const watchTheme = (onChange: () => void): (() => void) => {\n if (typeof document === \"undefined\") return () => {};\n const cleanups: (() => void)[] = [];\n if (typeof MutationObserver === \"function\") {\n const observer = new MutationObserver(onChange);\n for (const node of [document.documentElement, document.body]) {\n if (node) {\n observer.observe(node, {\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"data-theme\", \"data-mode\"],\n });\n }\n }\n cleanups.push(() => observer.disconnect());\n }\n if (typeof matchMedia === \"function\") {\n const query = matchMedia(\"(prefers-color-scheme: dark)\");\n query.addEventListener?.(\"change\", onChange);\n cleanups.push(() => query.removeEventListener?.(\"change\", onChange));\n }\n return () => cleanups.forEach((fn) => fn());\n};\n"],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { ColorResolver, Rgba } from './color.cjs';
2
+ export interface ChartTheme {
3
+ palette: Rgba[];
4
+ text: Rgba;
5
+ textMuted: Rgba;
6
+ grid: Rgba;
7
+ axis: Rgba;
8
+ background: Rgba;
9
+ surface: Rgba;
10
+ primary: Rgba;
11
+ fontFamily: string;
12
+ /** Tick label font size in CSS pixels */
13
+ fontSize: number;
14
+ /** Resolves the colors of the options (`var(--x)` included); static colors only when omitted */
15
+ resolve?: ColorResolver;
16
+ }
17
+ /** Reads the theme from the computed style of `element` */
18
+ export declare const readTheme: (element: Element | null, palette?: readonly string[]) => ChartTheme;
19
+ /** Theme of the charts drawn without a DOM (mini-programs, React Native) */
20
+ export interface ChartThemeInput {
21
+ /**
22
+ * Values of the Minerva CSS variables (`--primary-color`, `--text-color`,
23
+ * `--chart-series-1`, ...) used for the theme colors and to resolve
24
+ * `var(--name)` colors of the options
25
+ */
26
+ variables?: Readonly<Record<string, string>>;
27
+ /** Series colors (hex / rgb) */
28
+ palette?: readonly string[];
29
+ /** Font family of the labels */
30
+ fontFamily?: string;
31
+ /**
32
+ * Font size of the tick labels, in pixels
33
+ * @default 11
34
+ */
35
+ fontSize?: number;
36
+ }
37
+ /** Builds a theme from plain values (no DOM) */
38
+ export declare const createTheme: (input?: ChartThemeInput, palette?: readonly string[]) => ChartTheme;
39
+ /** Resolver of `var(--name, fallback)` colors against plain variables */
40
+ export declare const staticColorResolver: (variables: Readonly<Record<string, string>>) => ColorResolver;
41
+ /**
42
+ * Calls `onChange` when the theme may have changed: attributes of `<html>` /
43
+ * `<body>` (class, style, data-theme) and the color scheme.
44
+ */
45
+ export declare const watchTheme: (onChange: () => void) => (() => void);
@@ -0,0 +1,45 @@
1
+ import { ColorResolver, Rgba } from './color.js';
2
+ export interface ChartTheme {
3
+ palette: Rgba[];
4
+ text: Rgba;
5
+ textMuted: Rgba;
6
+ grid: Rgba;
7
+ axis: Rgba;
8
+ background: Rgba;
9
+ surface: Rgba;
10
+ primary: Rgba;
11
+ fontFamily: string;
12
+ /** Tick label font size in CSS pixels */
13
+ fontSize: number;
14
+ /** Resolves the colors of the options (`var(--x)` included); static colors only when omitted */
15
+ resolve?: ColorResolver;
16
+ }
17
+ /** Reads the theme from the computed style of `element` */
18
+ export declare const readTheme: (element: Element | null, palette?: readonly string[]) => ChartTheme;
19
+ /** Theme of the charts drawn without a DOM (mini-programs, React Native) */
20
+ export interface ChartThemeInput {
21
+ /**
22
+ * Values of the Minerva CSS variables (`--primary-color`, `--text-color`,
23
+ * `--chart-series-1`, ...) used for the theme colors and to resolve
24
+ * `var(--name)` colors of the options
25
+ */
26
+ variables?: Readonly<Record<string, string>>;
27
+ /** Series colors (hex / rgb) */
28
+ palette?: readonly string[];
29
+ /** Font family of the labels */
30
+ fontFamily?: string;
31
+ /**
32
+ * Font size of the tick labels, in pixels
33
+ * @default 11
34
+ */
35
+ fontSize?: number;
36
+ }
37
+ /** Builds a theme from plain values (no DOM) */
38
+ export declare const createTheme: (input?: ChartThemeInput, palette?: readonly string[]) => ChartTheme;
39
+ /** Resolver of `var(--name, fallback)` colors against plain variables */
40
+ export declare const staticColorResolver: (variables: Readonly<Record<string, string>>) => ColorResolver;
41
+ /**
42
+ * Calls `onChange` when the theme may have changed: attributes of `<html>` /
43
+ * `<body>` (class, style, data-theme) and the color scheme.
44
+ */
45
+ export declare const watchTheme: (onChange: () => void) => (() => void);
@@ -0,0 +1,86 @@
1
+ import { domColorResolver as e, mix as t, resolveStaticColor as n } from "./color.js";
2
+ //#region src/engine/theme.ts
3
+ var r = [
4
+ "#4f46e5",
5
+ "#10b981",
6
+ "#f59e0b",
7
+ "#ef4444",
8
+ "#0ea5e9",
9
+ "#8b5cf6",
10
+ "#14b8a6",
11
+ "#f97316"
12
+ ], i = (e, t) => e?.getPropertyValue(t).trim() ?? "", a = (t, n) => {
13
+ let r = t && typeof getComputedStyle == "function" ? getComputedStyle(t) : null;
14
+ return c((e) => i(r, e), e(t), n, r?.fontFamily ?? "");
15
+ }, o = (e = {}, t) => {
16
+ let n = e.variables ?? {};
17
+ return {
18
+ ...c((e) => n[e]?.trim() ?? "", s(n), t?.length ? t : e.palette, ""),
19
+ ...e.fontFamily ? { fontFamily: e.fontFamily } : {},
20
+ ...e.fontSize ? { fontSize: e.fontSize } : {}
21
+ };
22
+ }, s = (e) => (t, r) => n(t, e, r), c = (e, n, i, a) => {
23
+ let o = [
24
+ .4,
25
+ .4,
26
+ .4,
27
+ 1
28
+ ], s = (e) => n(e, o), c = (t, n) => {
29
+ for (let n of t) if (e(n)) return s(`var(${n})`);
30
+ return s(n);
31
+ }, l = c(["--surface-color", "--background-color"], "#ffffff"), u = c(["--text-color"], "#1f2937"), d = c(["--text-secondary-color", "--text-muted-color"], "#6b7280"), f = c(["--border-color"], "#e5e7eb"), p;
32
+ if (i && i.length) p = i.map((e) => s(e));
33
+ else {
34
+ let t = [];
35
+ for (let n = 1; n <= 8; n++) {
36
+ let r = `--chart-series-${n}`;
37
+ e(r) && t.push(s(`var(${r})`));
38
+ }
39
+ p = t.length ? t : [...[
40
+ "--primary-color",
41
+ "--success-color",
42
+ "--warning-color",
43
+ "--danger-color",
44
+ "--info-color"
45
+ ].map((t, n) => e(t) ? s(`var(${t})`) : s(r[n])), ...r.slice(5).map((e) => s(e))];
46
+ }
47
+ let m = e("--font-family-sans") || a || "system-ui, -apple-system, 'Segoe UI', sans-serif";
48
+ return {
49
+ palette: p,
50
+ text: u,
51
+ textMuted: d,
52
+ grid: t(l, f, .75),
53
+ axis: f,
54
+ background: l,
55
+ surface: l,
56
+ primary: p[0],
57
+ fontFamily: m,
58
+ fontSize: 11,
59
+ resolve: n
60
+ };
61
+ }, l = (e) => {
62
+ if (typeof document > "u") return () => {};
63
+ let t = [];
64
+ if (typeof MutationObserver == "function") {
65
+ let n = new MutationObserver(e);
66
+ for (let e of [document.documentElement, document.body]) e && n.observe(e, {
67
+ attributes: !0,
68
+ attributeFilter: [
69
+ "class",
70
+ "style",
71
+ "data-theme",
72
+ "data-mode"
73
+ ]
74
+ });
75
+ t.push(() => n.disconnect());
76
+ }
77
+ if (typeof matchMedia == "function") {
78
+ let n = matchMedia("(prefers-color-scheme: dark)");
79
+ n.addEventListener?.("change", e), t.push(() => n.removeEventListener?.("change", e));
80
+ }
81
+ return () => t.forEach((e) => e());
82
+ };
83
+ //#endregion
84
+ export { o as createTheme, a as readTheme, s as staticColorResolver, l as watchTheme };
85
+
86
+ //# sourceMappingURL=theme.js.map