minerva-design 1.4.0 → 1.5.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 (670) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +4047 -1703
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1436 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +573 -4
  7. package/dist/charts/canvas.d.cts +2 -2
  8. package/dist/charts/canvas.d.ts +2 -2
  9. package/dist/charts/core.cjs +1 -1
  10. package/dist/charts/core.d.cts +6 -4
  11. package/dist/charts/core.d.ts +6 -4
  12. package/dist/charts/core.js +24 -16
  13. package/dist/charts/engine/axis.cjs +1 -1
  14. package/dist/charts/engine/axis.cjs.map +1 -1
  15. package/dist/charts/engine/axis.js +42 -19
  16. package/dist/charts/engine/axis.js.map +1 -1
  17. package/dist/charts/engine/canvas.cjs +1 -1
  18. package/dist/charts/engine/canvas.cjs.map +1 -1
  19. package/dist/charts/engine/canvas.js +154 -127
  20. package/dist/charts/engine/canvas.js.map +1 -1
  21. package/dist/charts/engine/chart.cjs +1 -1
  22. package/dist/charts/engine/chart.cjs.map +1 -1
  23. package/dist/charts/engine/chart.js +365 -251
  24. package/dist/charts/engine/chart.js.map +1 -1
  25. package/dist/charts/engine/color.cjs +1 -1
  26. package/dist/charts/engine/color.cjs.map +1 -1
  27. package/dist/charts/engine/color.d.cts +18 -0
  28. package/dist/charts/engine/color.d.ts +18 -0
  29. package/dist/charts/engine/color.js +48 -2
  30. package/dist/charts/engine/color.js.map +1 -1
  31. package/dist/charts/engine/controller.cjs +2 -2
  32. package/dist/charts/engine/controller.cjs.map +1 -1
  33. package/dist/charts/engine/controller.d.cts +32 -1
  34. package/dist/charts/engine/controller.d.ts +32 -1
  35. package/dist/charts/engine/controller.js +310 -263
  36. package/dist/charts/engine/controller.js.map +1 -1
  37. package/dist/charts/engine/data.cjs +1 -1
  38. package/dist/charts/engine/data.cjs.map +1 -1
  39. package/dist/charts/engine/data.d.cts +3 -1
  40. package/dist/charts/engine/data.d.ts +3 -1
  41. package/dist/charts/engine/data.js +6 -4
  42. package/dist/charts/engine/data.js.map +1 -1
  43. package/dist/charts/engine/defaults.cjs +2 -0
  44. package/dist/charts/engine/defaults.cjs.map +1 -0
  45. package/dist/charts/engine/defaults.d.cts +20 -0
  46. package/dist/charts/engine/defaults.d.ts +20 -0
  47. package/dist/charts/engine/defaults.js +35 -0
  48. package/dist/charts/engine/defaults.js.map +1 -0
  49. package/dist/charts/engine/format.cjs +1 -1
  50. package/dist/charts/engine/format.cjs.map +1 -1
  51. package/dist/charts/engine/format.d.cts +6 -0
  52. package/dist/charts/engine/format.d.ts +6 -0
  53. package/dist/charts/engine/format.js +15 -2
  54. package/dist/charts/engine/format.js.map +1 -1
  55. package/dist/charts/engine/graph/chart.cjs +2 -0
  56. package/dist/charts/engine/graph/chart.cjs.map +1 -0
  57. package/dist/charts/engine/graph/chart.d.cts +3 -0
  58. package/dist/charts/engine/graph/chart.d.ts +3 -0
  59. package/dist/charts/engine/graph/chart.js +1565 -0
  60. package/dist/charts/engine/graph/chart.js.map +1 -0
  61. package/dist/charts/engine/graph/circular.cjs +2 -0
  62. package/dist/charts/engine/graph/circular.cjs.map +1 -0
  63. package/dist/charts/engine/graph/circular.d.cts +16 -0
  64. package/dist/charts/engine/graph/circular.d.ts +16 -0
  65. package/dist/charts/engine/graph/circular.js +62 -0
  66. package/dist/charts/engine/graph/circular.js.map +1 -0
  67. package/dist/charts/engine/graph/dag.cjs +2 -0
  68. package/dist/charts/engine/graph/dag.cjs.map +1 -0
  69. package/dist/charts/engine/graph/dag.d.cts +34 -0
  70. package/dist/charts/engine/graph/dag.d.ts +34 -0
  71. package/dist/charts/engine/graph/dag.js +314 -0
  72. package/dist/charts/engine/graph/dag.js.map +1 -0
  73. package/dist/charts/engine/graph/dom.cjs +2 -0
  74. package/dist/charts/engine/graph/dom.cjs.map +1 -0
  75. package/dist/charts/engine/graph/dom.d.cts +23 -0
  76. package/dist/charts/engine/graph/dom.d.ts +23 -0
  77. package/dist/charts/engine/graph/dom.js +158 -0
  78. package/dist/charts/engine/graph/dom.js.map +1 -0
  79. package/dist/charts/engine/graph/force.cjs +2 -0
  80. package/dist/charts/engine/graph/force.cjs.map +1 -0
  81. package/dist/charts/engine/graph/force.d.cts +67 -0
  82. package/dist/charts/engine/graph/force.d.ts +67 -0
  83. package/dist/charts/engine/graph/force.js +325 -0
  84. package/dist/charts/engine/graph/force.js.map +1 -0
  85. package/dist/charts/engine/graph/geometry.cjs +2 -0
  86. package/dist/charts/engine/graph/geometry.cjs.map +1 -0
  87. package/dist/charts/engine/graph/geometry.d.cts +37 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +37 -0
  89. package/dist/charts/engine/graph/geometry.js +144 -0
  90. package/dist/charts/engine/graph/geometry.js.map +1 -0
  91. package/dist/charts/engine/graph/index.cjs +1 -0
  92. package/dist/charts/engine/graph/index.d.cts +6 -0
  93. package/dist/charts/engine/graph/index.d.ts +6 -0
  94. package/dist/charts/engine/graph/index.js +6 -0
  95. package/dist/charts/engine/graph/labels.cjs +2 -0
  96. package/dist/charts/engine/graph/labels.cjs.map +1 -0
  97. package/dist/charts/engine/graph/labels.d.cts +12 -0
  98. package/dist/charts/engine/graph/labels.d.ts +12 -0
  99. package/dist/charts/engine/graph/labels.js +128 -0
  100. package/dist/charts/engine/graph/labels.js.map +1 -0
  101. package/dist/charts/engine/graph/model.cjs +2 -0
  102. package/dist/charts/engine/graph/model.cjs.map +1 -0
  103. package/dist/charts/engine/graph/model.d.cts +43 -0
  104. package/dist/charts/engine/graph/model.d.ts +43 -0
  105. package/dist/charts/engine/graph/model.js +88 -0
  106. package/dist/charts/engine/graph/model.js.map +1 -0
  107. package/dist/charts/engine/graph/sizing.cjs +2 -0
  108. package/dist/charts/engine/graph/sizing.cjs.map +1 -0
  109. package/dist/charts/engine/graph/sizing.d.cts +33 -0
  110. package/dist/charts/engine/graph/sizing.d.ts +33 -0
  111. package/dist/charts/engine/graph/sizing.js +60 -0
  112. package/dist/charts/engine/graph/sizing.js.map +1 -0
  113. package/dist/charts/engine/graph/tree.cjs +2 -0
  114. package/dist/charts/engine/graph/tree.cjs.map +1 -0
  115. package/dist/charts/engine/graph/tree.d.cts +30 -0
  116. package/dist/charts/engine/graph/tree.d.ts +30 -0
  117. package/dist/charts/engine/graph/tree.js +218 -0
  118. package/dist/charts/engine/graph/tree.js.map +1 -0
  119. package/dist/charts/engine/graph/types.d.cts +626 -0
  120. package/dist/charts/engine/graph/types.d.ts +626 -0
  121. package/dist/charts/engine/graph/worker.cjs +46 -0
  122. package/dist/charts/engine/graph/worker.cjs.map +1 -0
  123. package/dist/charts/engine/graph/worker.d.cts +36 -0
  124. package/dist/charts/engine/graph/worker.d.ts +36 -0
  125. package/dist/charts/engine/graph/worker.js +129 -0
  126. package/dist/charts/engine/graph/worker.js.map +1 -0
  127. package/dist/charts/engine/items.cjs +1 -1
  128. package/dist/charts/engine/items.cjs.map +1 -1
  129. package/dist/charts/engine/items.d.cts +15 -2
  130. package/dist/charts/engine/items.d.ts +15 -2
  131. package/dist/charts/engine/items.js +131 -112
  132. package/dist/charts/engine/items.js.map +1 -1
  133. package/dist/charts/engine/labels.cjs +1 -1
  134. package/dist/charts/engine/labels.cjs.map +1 -1
  135. package/dist/charts/engine/labels.js +28 -4
  136. package/dist/charts/engine/labels.js.map +1 -1
  137. package/dist/charts/engine/layout.cjs +1 -1
  138. package/dist/charts/engine/layout.cjs.map +1 -1
  139. package/dist/charts/engine/layout.d.cts +9 -0
  140. package/dist/charts/engine/layout.d.ts +9 -0
  141. package/dist/charts/engine/layout.js +11 -2
  142. package/dist/charts/engine/layout.js.map +1 -1
  143. package/dist/charts/engine/model.cjs +1 -1
  144. package/dist/charts/engine/model.cjs.map +1 -1
  145. package/dist/charts/engine/model.d.cts +40 -3
  146. package/dist/charts/engine/model.d.ts +40 -3
  147. package/dist/charts/engine/model.js +246 -165
  148. package/dist/charts/engine/model.js.map +1 -1
  149. package/dist/charts/engine/orderbook/format.cjs +1 -1
  150. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  151. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  152. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  153. package/dist/charts/engine/orderbook/format.js +5 -5
  154. package/dist/charts/engine/orderbook/format.js.map +1 -1
  155. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  156. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  157. package/dist/charts/engine/orderbook/heatmap.js +527 -408
  158. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  159. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  160. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  161. package/dist/charts/engine/orderbook/layout.d.cts +37 -0
  162. package/dist/charts/engine/orderbook/layout.d.ts +37 -0
  163. package/dist/charts/engine/orderbook/layout.js +70 -0
  164. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  165. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  166. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  167. package/dist/charts/engine/orderbook/tape.js +1 -1
  168. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  169. package/dist/charts/engine/orderbook/types.d.cts +18 -2
  170. package/dist/charts/engine/orderbook/types.d.ts +18 -2
  171. package/dist/charts/engine/overlay.cjs +1 -1
  172. package/dist/charts/engine/overlay.cjs.map +1 -1
  173. package/dist/charts/engine/overlay.d.cts +10 -0
  174. package/dist/charts/engine/overlay.d.ts +10 -0
  175. package/dist/charts/engine/overlay.js +6 -0
  176. package/dist/charts/engine/overlay.js.map +1 -1
  177. package/dist/charts/engine/presets.cjs +2 -2
  178. package/dist/charts/engine/presets.cjs.map +1 -1
  179. package/dist/charts/engine/presets.d.cts +25 -3
  180. package/dist/charts/engine/presets.d.ts +25 -3
  181. package/dist/charts/engine/presets.js +115 -101
  182. package/dist/charts/engine/presets.js.map +1 -1
  183. package/dist/charts/engine/renderers/detect.cjs +1 -1
  184. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  185. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  186. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  187. package/dist/charts/engine/renderers/detect.js +23 -21
  188. package/dist/charts/engine/renderers/detect.js.map +1 -1
  189. package/dist/charts/engine/scene.cjs +1 -1
  190. package/dist/charts/engine/scene.cjs.map +1 -1
  191. package/dist/charts/engine/scene.d.cts +57 -4
  192. package/dist/charts/engine/scene.d.ts +57 -4
  193. package/dist/charts/engine/scene.js +335 -182
  194. package/dist/charts/engine/scene.js.map +1 -1
  195. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  196. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  197. package/dist/charts/engine/shapes/bullet.js +110 -110
  198. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  199. package/dist/charts/engine/shapes/chart.cjs +1 -1
  200. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  201. package/dist/charts/engine/shapes/chart.js +4 -1
  202. package/dist/charts/engine/shapes/chart.js.map +1 -1
  203. package/dist/charts/engine/shapes/chord.cjs +2 -0
  204. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  205. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  206. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  207. package/dist/charts/engine/shapes/chord.js +414 -0
  208. package/dist/charts/engine/shapes/chord.js.map +1 -0
  209. package/dist/charts/engine/shapes/draw.cjs +1 -1
  210. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  211. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  212. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  213. package/dist/charts/engine/shapes/draw.js +47 -17
  214. package/dist/charts/engine/shapes/draw.js.map +1 -1
  215. package/dist/charts/engine/shapes/hit.cjs +1 -1
  216. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  217. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  218. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  219. package/dist/charts/engine/shapes/hit.js +75 -46
  220. package/dist/charts/engine/shapes/hit.js.map +1 -1
  221. package/dist/charts/engine/shapes/index.d.cts +3 -2
  222. package/dist/charts/engine/shapes/index.d.ts +3 -2
  223. package/dist/charts/engine/shapes/labels.cjs +1 -1
  224. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  225. package/dist/charts/engine/shapes/labels.js +12 -4
  226. package/dist/charts/engine/shapes/labels.js.map +1 -1
  227. package/dist/charts/engine/shapes/layout.cjs +2 -2
  228. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  229. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  230. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  231. package/dist/charts/engine/shapes/layout.js +106 -78
  232. package/dist/charts/engine/shapes/layout.js.map +1 -1
  233. package/dist/charts/engine/shapes/scene.cjs +1 -1
  234. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  235. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  236. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  237. package/dist/charts/engine/shapes/scene.js +62 -19
  238. package/dist/charts/engine/shapes/scene.js.map +1 -1
  239. package/dist/charts/engine/shapes/types.d.cts +119 -8
  240. package/dist/charts/engine/shapes/types.d.ts +119 -8
  241. package/dist/charts/engine/signature.cjs +1 -1
  242. package/dist/charts/engine/signature.cjs.map +1 -1
  243. package/dist/charts/engine/signature.js +1 -1
  244. package/dist/charts/engine/signature.js.map +1 -1
  245. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  246. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  247. package/dist/charts/engine/three-d/canvas2d.d.cts +5 -2
  248. package/dist/charts/engine/three-d/canvas2d.d.ts +5 -2
  249. package/dist/charts/engine/three-d/canvas2d.js +89 -65
  250. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  251. package/dist/charts/engine/three-d/detect.cjs +1 -1
  252. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  253. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  254. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  255. package/dist/charts/engine/three-d/detect.js +22 -20
  256. package/dist/charts/engine/three-d/detect.js.map +1 -1
  257. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  258. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  259. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  260. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  261. package/dist/charts/engine/three-d/geometry.js +106 -90
  262. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  263. package/dist/charts/engine/three-d/model.cjs +1 -1
  264. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  265. package/dist/charts/engine/three-d/model.d.cts +2 -0
  266. package/dist/charts/engine/three-d/model.d.ts +2 -0
  267. package/dist/charts/engine/three-d/model.js +2 -0
  268. package/dist/charts/engine/three-d/model.js.map +1 -1
  269. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  270. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  271. package/dist/charts/engine/three-d/overlay.js +43 -36
  272. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  273. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  274. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  275. package/dist/charts/engine/three-d/render-types.d.cts +24 -3
  276. package/dist/charts/engine/three-d/render-types.d.ts +24 -3
  277. package/dist/charts/engine/three-d/render-types.js +6 -7
  278. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  279. package/dist/charts/engine/three-d/shaders.cjs +63 -28
  280. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  281. package/dist/charts/engine/three-d/shaders.d.cts +2 -3
  282. package/dist/charts/engine/three-d/shaders.d.ts +2 -3
  283. package/dist/charts/engine/three-d/shaders.js +41 -22
  284. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  285. package/dist/charts/engine/three-d/sort.cjs +1 -1
  286. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  287. package/dist/charts/engine/three-d/sort.d.cts +15 -4
  288. package/dist/charts/engine/three-d/sort.d.ts +15 -4
  289. package/dist/charts/engine/three-d/sort.js +117 -43
  290. package/dist/charts/engine/three-d/sort.js.map +1 -1
  291. package/dist/charts/engine/three-d/types.d.cts +27 -0
  292. package/dist/charts/engine/three-d/types.d.ts +27 -0
  293. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  294. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  295. package/dist/charts/engine/three-d/webgl.js +15 -13
  296. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  297. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  298. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  299. package/dist/charts/engine/three-d/webgpu.js +50 -39
  300. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  301. package/dist/charts/engine/trading/chart.cjs +1 -1
  302. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  303. package/dist/charts/engine/trading/chart.d.cts +10 -0
  304. package/dist/charts/engine/trading/chart.d.ts +10 -0
  305. package/dist/charts/engine/trading/chart.js +1475 -776
  306. package/dist/charts/engine/trading/chart.js.map +1 -1
  307. package/dist/charts/engine/trading/drawings.cjs +2 -1
  308. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  309. package/dist/charts/engine/trading/drawings.d.cts +47 -9
  310. package/dist/charts/engine/trading/drawings.d.ts +47 -9
  311. package/dist/charts/engine/trading/drawings.js +338 -75
  312. package/dist/charts/engine/trading/drawings.js.map +1 -1
  313. package/dist/charts/engine/trading/format.cjs +1 -1
  314. package/dist/charts/engine/trading/format.cjs.map +1 -1
  315. package/dist/charts/engine/trading/format.d.cts +13 -0
  316. package/dist/charts/engine/trading/format.d.ts +13 -0
  317. package/dist/charts/engine/trading/format.js +51 -19
  318. package/dist/charts/engine/trading/format.js.map +1 -1
  319. package/dist/charts/engine/trading/index.cjs +1 -1
  320. package/dist/charts/engine/trading/index.d.cts +2 -1
  321. package/dist/charts/engine/trading/index.d.ts +2 -1
  322. package/dist/charts/engine/trading/index.js +4 -3
  323. package/dist/charts/engine/trading/indicators.cjs +1 -1
  324. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  325. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  326. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  327. package/dist/charts/engine/trading/indicators.js +449 -173
  328. package/dist/charts/engine/trading/indicators.js.map +1 -1
  329. package/dist/charts/engine/trading/labels.cjs +1 -1
  330. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  331. package/dist/charts/engine/trading/labels.js +84 -4
  332. package/dist/charts/engine/trading/labels.js.map +1 -1
  333. package/dist/charts/engine/trading/store.cjs +1 -1
  334. package/dist/charts/engine/trading/store.cjs.map +1 -1
  335. package/dist/charts/engine/trading/store.d.cts +21 -0
  336. package/dist/charts/engine/trading/store.d.ts +21 -0
  337. package/dist/charts/engine/trading/store.js +22 -1
  338. package/dist/charts/engine/trading/store.js.map +1 -1
  339. package/dist/charts/engine/trading/studies.cjs +1 -1
  340. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  341. package/dist/charts/engine/trading/studies.d.cts +41 -8
  342. package/dist/charts/engine/trading/studies.d.ts +41 -8
  343. package/dist/charts/engine/trading/studies.js +349 -93
  344. package/dist/charts/engine/trading/studies.js.map +1 -1
  345. package/dist/charts/engine/trading/sync.cjs +2 -0
  346. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  347. package/dist/charts/engine/trading/sync.d.cts +8 -0
  348. package/dist/charts/engine/trading/sync.d.ts +8 -0
  349. package/dist/charts/engine/trading/sync.js +25 -0
  350. package/dist/charts/engine/trading/sync.js.map +1 -0
  351. package/dist/charts/engine/trading/types.d.cts +484 -9
  352. package/dist/charts/engine/trading/types.d.ts +484 -9
  353. package/dist/charts/engine/types.d.cts +82 -8
  354. package/dist/charts/engine/types.d.ts +82 -8
  355. package/dist/charts/index.cjs +1 -1
  356. package/dist/charts/index.d.cts +3 -2
  357. package/dist/charts/index.d.ts +3 -2
  358. package/dist/charts/index.js +30 -22
  359. package/dist/charts/react/charts.cjs +1 -1
  360. package/dist/charts/react/charts.cjs.map +1 -1
  361. package/dist/charts/react/charts.js +46 -34
  362. package/dist/charts/react/charts.js.map +1 -1
  363. package/dist/charts/react/graph.cjs +2 -0
  364. package/dist/charts/react/graph.cjs.map +1 -0
  365. package/dist/charts/react/graph.d.cts +213 -0
  366. package/dist/charts/react/graph.d.ts +213 -0
  367. package/dist/charts/react/graph.js +159 -0
  368. package/dist/charts/react/graph.js.map +1 -0
  369. package/dist/charts/react/shapes.cjs +1 -1
  370. package/dist/charts/react/shapes.cjs.map +1 -1
  371. package/dist/charts/react/shapes.d.cts +87 -4
  372. package/dist/charts/react/shapes.d.ts +87 -4
  373. package/dist/charts/react/shapes.js +55 -12
  374. package/dist/charts/react/shapes.js.map +1 -1
  375. package/dist/charts/react/trading.cjs +1 -1
  376. package/dist/charts/react/trading.cjs.map +1 -1
  377. package/dist/charts/react/trading.d.cts +53 -1
  378. package/dist/charts/react/trading.d.ts +53 -1
  379. package/dist/charts/react/trading.js +68 -37
  380. package/dist/charts/react/trading.js.map +1 -1
  381. package/dist/charts/react/types.d.cts +11 -0
  382. package/dist/charts/react/types.d.ts +11 -0
  383. package/dist/core/contracts.cjs +1 -1
  384. package/dist/core/contracts.cjs.map +1 -1
  385. package/dist/core/contracts.js +1 -1
  386. package/dist/core/contracts.js.map +1 -1
  387. package/dist/native/charts/src/canvas.cjs +1 -1
  388. package/dist/native/charts/src/canvas.js +3 -3
  389. package/dist/native/charts/src/engine/axis.cjs +1 -1
  390. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  391. package/dist/native/charts/src/engine/axis.js +42 -19
  392. package/dist/native/charts/src/engine/axis.js.map +1 -1
  393. package/dist/native/charts/src/engine/color.cjs +1 -1
  394. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  395. package/dist/native/charts/src/engine/color.js +47 -5
  396. package/dist/native/charts/src/engine/color.js.map +1 -1
  397. package/dist/native/charts/src/engine/controller.cjs +2 -2
  398. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  399. package/dist/native/charts/src/engine/controller.js +300 -253
  400. package/dist/native/charts/src/engine/controller.js.map +1 -1
  401. package/dist/native/charts/src/engine/data.cjs +1 -1
  402. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  403. package/dist/native/charts/src/engine/data.js +6 -4
  404. package/dist/native/charts/src/engine/data.js.map +1 -1
  405. package/dist/native/charts/src/engine/format.cjs +1 -1
  406. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  407. package/dist/native/charts/src/engine/format.js +15 -2
  408. package/dist/native/charts/src/engine/format.js.map +1 -1
  409. package/dist/native/charts/src/engine/labels.cjs +1 -1
  410. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  411. package/dist/native/charts/src/engine/labels.js +28 -4
  412. package/dist/native/charts/src/engine/labels.js.map +1 -1
  413. package/dist/native/charts/src/engine/layout.cjs +1 -1
  414. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  415. package/dist/native/charts/src/engine/layout.js +11 -2
  416. package/dist/native/charts/src/engine/layout.js.map +1 -1
  417. package/dist/native/charts/src/engine/model.cjs +1 -1
  418. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  419. package/dist/native/charts/src/engine/model.js +252 -171
  420. package/dist/native/charts/src/engine/model.js.map +1 -1
  421. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  422. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  423. package/dist/native/charts/src/engine/presets.cjs +2 -2
  424. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  425. package/dist/native/charts/src/engine/presets.js +104 -90
  426. package/dist/native/charts/src/engine/presets.js.map +1 -1
  427. package/dist/native/charts/src/engine/scene.cjs +1 -1
  428. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  429. package/dist/native/charts/src/engine/scene.js +341 -188
  430. package/dist/native/charts/src/engine/scene.js.map +1 -1
  431. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  432. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  433. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  434. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  435. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  436. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  437. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  438. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  439. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  440. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  441. package/dist/native/charts/src/engine/shapes/chord.js +414 -0
  442. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  443. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  444. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  445. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  446. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  447. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  448. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  449. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  450. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  451. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  452. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  453. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  454. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  455. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  456. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  457. package/dist/native/charts/src/engine/shapes/layout.js +117 -90
  458. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  459. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  460. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  461. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  462. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  463. package/dist/native/components/Chart/scene.cjs +1 -1
  464. package/dist/native/components/Chart/scene.cjs.map +1 -1
  465. package/dist/native/components/Chart/scene.js +140 -71
  466. package/dist/native/components/Chart/scene.js.map +1 -1
  467. package/dist/native/components/Charts/charts.cjs +1 -1
  468. package/dist/native/components/Charts/charts.cjs.map +1 -1
  469. package/dist/native/components/Charts/charts.js +54 -42
  470. package/dist/native/components/Charts/charts.js.map +1 -1
  471. package/dist/native/components/Charts/types.d.cts +11 -0
  472. package/dist/native/components/Charts/types.d.ts +11 -0
  473. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  474. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  475. package/dist/native/components/ShapeChart/ShapeChartBase.js +1 -0
  476. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  477. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  478. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  479. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  480. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  481. package/dist/native/components/ShapeChart/charts.js +138 -96
  482. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  483. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  484. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  485. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  486. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  487. package/dist/native/components/ShapeChart/draw.js +26 -17
  488. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  489. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  490. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  491. package/dist/native/components/ShapeChart/geometry.js +138 -59
  492. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  493. package/dist/native/components/ShapeChart/index.cjs +1 -1
  494. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  495. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  496. package/dist/native/components/ShapeChart/index.js +2 -2
  497. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  498. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  499. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  500. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  501. package/dist/native/components/ShapeChart/recorder.js +19 -10
  502. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  503. package/dist/native/components/ShapeChart/types.d.cts +92 -7
  504. package/dist/native/components/ShapeChart/types.d.ts +92 -7
  505. package/dist/native/index.cjs +1 -1
  506. package/dist/native/index.js +2 -2
  507. package/dist/native/source/components/Chart/scene.tsx +158 -14
  508. package/dist/native/source/components/Charts/charts.tsx +30 -2
  509. package/dist/native/source/components/Charts/types.ts +11 -0
  510. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +2 -0
  511. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  512. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  513. package/dist/native/source/components/ShapeChart/geometry.ts +189 -8
  514. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  515. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  516. package/dist/native/source/components/ShapeChart/types.ts +96 -5
  517. package/dist/native/source/manifest.ts +1 -0
  518. package/dist/taro/charts.d.ts +25 -5
  519. package/dist/taro/index.js +3900 -2836
  520. package/dist/taro/shape-charts.d.ts +96 -4
  521. package/dist/uni/AreaChart.vue.d.ts +5 -1
  522. package/dist/uni/Badge.vue.d.ts +1 -1
  523. package/dist/uni/BarChart.vue.d.ts +5 -1
  524. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  525. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  526. package/dist/uni/BulletChart.vue.d.ts +4 -0
  527. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  528. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  529. package/dist/uni/Chart.vue.d.ts +4 -0
  530. package/dist/uni/ChordChart.vue +93 -0
  531. package/dist/uni/ChordChart.vue.d.ts +136 -0
  532. package/dist/uni/DonutChart.vue.d.ts +4 -0
  533. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  534. package/dist/uni/GanttChart.vue.d.ts +4 -0
  535. package/dist/uni/GaugeChart.vue.d.ts +4 -0
  536. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  537. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  538. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  539. package/dist/uni/LineChart.vue.d.ts +4 -0
  540. package/dist/uni/MixedChart.vue.d.ts +4 -0
  541. package/dist/uni/PieChart.vue.d.ts +4 -0
  542. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  543. package/dist/uni/RadarChart.vue.d.ts +4 -0
  544. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  545. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  546. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  547. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  548. package/dist/uni/Sparkline.vue.d.ts +4 -0
  549. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  550. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  551. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  552. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  553. package/dist/uni/chart-canvas.d.ts +3 -0
  554. package/dist/uni/chart-canvas.js +4 -0
  555. package/dist/uni/chart-types.d.ts +28 -4
  556. package/dist/uni/chart-types.js +26 -2
  557. package/dist/uni/charts-canvas.js +1 -1
  558. package/dist/uni/index.d.ts +2 -1
  559. package/dist/uni/index.js +1 -0
  560. package/dist/uni/manifest.d.ts +7 -0
  561. package/dist/uni/manifest.js +10 -0
  562. package/dist/uni/named-chart-options.d.ts +9 -2
  563. package/dist/uni/named-chart-options.js +18 -1
  564. package/dist/uni/shape-chart-canvas.d.ts +3 -1
  565. package/dist/uni/shape-chart-canvas.js +15 -24
  566. package/dist/uni/shape-chart-types.d.ts +52 -2
  567. package/dist/uni/shape-chart-types.js +44 -0
  568. package/dist/vue/charts-global.d.ts +48 -0
  569. package/dist/vue/charts.d.ts +18 -0
  570. package/dist/vue/charts.js +56 -0
  571. package/dist/vue/charts.js.map +1 -0
  572. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  573. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  574. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  575. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  576. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  577. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  578. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  579. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  580. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  581. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +179 -0
  582. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  583. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  584. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  585. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  586. package/dist/vue/components/Chart/GanttChart.vue.d.ts +4 -0
  587. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  588. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +4 -1
  589. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  590. package/dist/vue/components/Chart/GraphChart.vue.d.ts +184 -0
  591. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  592. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  593. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  594. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  595. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  596. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  597. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  598. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  599. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  600. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  601. package/dist/vue/components/Chart/TradingChart.vue.d.ts +49 -1
  602. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  603. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  604. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  605. package/dist/vue/components/Chart/TreeChart.vue.d.ts +172 -0
  606. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  607. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  608. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  609. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  610. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  611. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  612. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  613. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  614. package/dist/vue/components/Chart/graph.d.ts +153 -0
  615. package/dist/vue/components/Chart/graph.js +135 -0
  616. package/dist/vue/components/Chart/graph.js.map +1 -0
  617. package/dist/vue/components/Chart/index.d.ts +5 -1
  618. package/dist/vue/components/Chart/index.js +5 -1
  619. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  620. package/dist/vue/components/Chart/orderbook.js +2 -0
  621. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  622. package/dist/vue/components/Chart/trading.d.ts +24 -2
  623. package/dist/vue/components/Chart/trading.js +8 -0
  624. package/dist/vue/components/Chart/trading.js.map +1 -1
  625. package/dist/vue/components/Chart/types.d.ts +74 -2
  626. package/dist/vue/global.d.ts +2 -38
  627. package/dist/vue/groups/charts.js +10 -2
  628. package/dist/vue/groups/charts.js.map +1 -1
  629. package/dist/vue/index.js +6 -2
  630. package/dist/vue/internal/register.d.ts +7 -0
  631. package/dist/vue/internal/register.js +14 -0
  632. package/dist/vue/internal/register.js.map +1 -0
  633. package/dist/vue/plugin.d.ts +9 -4
  634. package/dist/vue/plugin.js +6 -11
  635. package/dist/vue/plugin.js.map +1 -1
  636. package/dist/weapp/charts/canvas.js +1687 -147
  637. package/dist/weapp/charts/core.js +1 -0
  638. package/dist/weapp/chord-chart/index.js +1 -0
  639. package/dist/weapp/chord-chart/index.json +1 -0
  640. package/dist/weapp/chord-chart/index.wxml +1 -0
  641. package/dist/weapp/chord-chart/index.wxss +1 -0
  642. package/dist/weapp/controls.js +92 -32
  643. package/dist/weapp/types.d.ts +87 -4
  644. package/dist/web-components/components/chart/charts.d.ts +4 -2
  645. package/dist/web-components/components/chart/charts.js +8 -1
  646. package/dist/web-components/components/chart/charts.js.map +1 -1
  647. package/dist/web-components/components/chart/extended.d.ts +17 -7
  648. package/dist/web-components/components/chart/extended.js +23 -9
  649. package/dist/web-components/components/chart/extended.js.map +1 -1
  650. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  651. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  652. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  653. package/dist/web-components/components/graph/graph.d.ts +154 -0
  654. package/dist/web-components/components/graph/graph.js +149 -0
  655. package/dist/web-components/components/graph/graph.js.map +1 -0
  656. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  657. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  658. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  659. package/dist/web-components/elements/chart.d.ts +1 -1
  660. package/dist/web-components/elements/chart.js +6 -5
  661. package/dist/web-components/elements/chart.js.map +1 -1
  662. package/dist/web-components/elements/graph.d.ts +2 -0
  663. package/dist/web-components/elements/graph.js +12 -0
  664. package/dist/web-components/elements/graph.js.map +1 -0
  665. package/dist/web-components/html-custom-data.json +273 -4
  666. package/dist/web-components/types/react.d.ts +63 -4
  667. package/dist/web-components/types/solid.d.ts +55 -8
  668. package/dist/web-components/types/svelte.d.ts +55 -8
  669. package/dist/web-components/types/vue.d.ts +55 -4
  670. package/package.json +16 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chart.cjs","names":["createChartDom","createShapeRuntime","readTheme","estimateText","tooltipContent","swatch","hoverEvent","hoverAnchor","placeShapeTooltip","sameHover","now","describeScene","shapeLegend","legendConfig","describeChart","hitTestShapes","describeItem","stepHover","watchTheme","require_dom","require_theme","require_scene","require_draw","require_hit","require_layout","require_runtime","TAP_SLOP","uid","createShapeChart","doc","container","win","dom","canvas","ctx","runtime","initial","options","theme","scene","hover","tipKey","destroyed","frameId","frameIsTimeout","press","listeners","emit","listener","type","event","description","fontSet","measure","f","text","cancelFrame","schedule","render","tooltipOptions","tooltipNode","custom","content","fragment","header","row","el","n","v","updateTooltip","tip","key","force","anchor","stageW","stageH","left","top","setHover","changed","next","keyboard","width","height","dpr","pw","ph","frame","it","renderLegend","entries","config","focused","bottom","entry","item","toggle","updateAccessibility","index","drill","path","activate","hit","local","rect","hitAt","x","y","onPointerMove","onPointerDown","onPointerUp","p","onPointerCancel","onPointerLeave","focusItem","onKeyDown","current","direction","items","e","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","unwatchTheme","previous"],"sources":["../../../../../charts/src/engine/shapes/chart.ts"],"sourcesContent":["// createShapeChart: DOM host of the shape charts. One Canvas2D layer sized\n// with the device pixel ratio, the house legend / tooltip / live region of\n// createChartDom, pointer + keyboard interaction, resize and theme watching.\n\nimport { createChartDom, styleElement, swatch } from \"../dom\";\nimport { readTheme, watchTheme, type ChartTheme } from \"../theme\";\nimport { drawShapeScene } from \"./draw\";\nimport { hitTestShapes, hoverAnchor, stepHover } from \"./hit\";\nimport {\n describeChart,\n describeItem,\n describeScene,\n hoverEvent,\n legendConfig,\n placeShapeTooltip,\n sameHover,\n shapeLegend,\n tooltipContent,\n} from \"./layout\";\nimport { createShapeRuntime, now } from \"./runtime\";\nimport {\n estimateText,\n type MeasureText,\n type ShapeHover,\n type ShapeScene,\n} from \"./scene\";\nimport type {\n ShapeChartEventMap,\n ShapeChartInstance,\n ShapeChartOptions,\n ShapeHoverEvent,\n} from \"./types\";\n\n/** Pointer travel (px) under which a press counts as a click / tap */\nconst TAP_SLOP = 6;\n\nlet uid = 0;\n\ninterface HoverState {\n hover: ShapeHover;\n x: number;\n y: number;\n keyboard: boolean;\n}\n\n/**\n * Creates a pie / donut, radar, gauge, funnel, treemap, sankey, sunburst,\n * radial bar, calendar heatmap or bullet chart in `container` (drawn with\n * Canvas2D, themed by the Minerva CSS variables).\n */\nexport const createShapeChart = (\n container: HTMLElement,\n initial: ShapeChartOptions,\n): ShapeChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createChartDom(container);\n dom.root.classList.add(\"minerva-shape-chart\");\n dom.foreground.style.display = \"none\";\n dom.hover.style.display = \"none\";\n const canvas = dom.background;\n let ctx: CanvasRenderingContext2D | null = null;\n try {\n ctx = canvas.getContext(\"2d\");\n } catch {\n ctx = null;\n }\n\n const runtime = createShapeRuntime(initial);\n let options = initial;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let scene: ShapeScene | null = null;\n let hover: HoverState | null = null;\n let tipKey = \"\";\n let destroyed = false;\n let frameId: number | null = null;\n let frameIsTimeout = false;\n let press: {\n x: number;\n y: number;\n id: number;\n touch: boolean;\n moved: boolean;\n } | null = null;\n\n const listeners: {\n [K in keyof ShapeChartEventMap]: Set<\n (event: ShapeChartEventMap[K]) => void\n >;\n } = {\n hover: new Set(),\n click: new Set(),\n toggle: new Set(),\n drill: new Set(),\n };\n const emit = <K extends keyof ShapeChartEventMap>(\n type: K,\n event: ShapeChartEventMap[K],\n ) => {\n for (const listener of [...listeners[type]]) listener(event);\n };\n\n // screen-reader summary of the data\n const description = doc.createElement(\"div\");\n description.id = `minerva-shape-chart-${++uid}`;\n styleElement(description, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n dom.stage.appendChild(description);\n dom.stage.setAttribute(\"aria-describedby\", description.id);\n dom.stage.tabIndex = 0;\n\n let fontSet = \"\";\n const measure: MeasureText = (text, f) => {\n if (!ctx) return estimateText(text, f);\n if (f !== fontSet) {\n ctx.font = f;\n fontSet = f;\n }\n return ctx.measureText(text).width;\n };\n\n // ------------------------------------------------------------- frames\n\n const cancelFrame = () => {\n if (frameId === null) return;\n if (frameIsTimeout) clearTimeout(frameId);\n else win?.cancelAnimationFrame?.(frameId);\n frameId = null;\n };\n\n const schedule = () => {\n if (destroyed || frameId !== null) return;\n if (win && typeof win.requestAnimationFrame === \"function\") {\n frameIsTimeout = false;\n frameId = win.requestAnimationFrame(() => render());\n } else {\n frameIsTimeout = true;\n frameId = setTimeout(() => render(), 16) as unknown as number;\n }\n };\n\n const tooltipOptions = () =>\n options.tooltip === false\n ? null\n : typeof options.tooltip === \"object\"\n ? options.tooltip\n : {};\n\n const tooltipNode = (event: ShapeHoverEvent): Node | string | null => {\n const custom = tooltipOptions()?.render;\n if (custom) return custom(event);\n if (!scene || !hover) return null;\n const content = tooltipContent(scene, hover.hover);\n if (!content) return null;\n const fragment = doc.createDocumentFragment();\n const header = doc.createElement(\"div\");\n styleElement(header, {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"4px\",\n color: \"var(--text-color, #1f2937)\",\n });\n if (content.color) header.appendChild(swatch(doc, content.color, \"dot\"));\n header.appendChild(doc.createTextNode(content.title));\n fragment.append(header);\n for (const row of content.rows) {\n const el = doc.createElement(\"div\");\n styleElement(el, { display: \"flex\", alignItems: \"center\", gap: \"8px\" });\n if (row.color) el.appendChild(swatch(doc, row.color, \"dot\"));\n const n = doc.createElement(\"span\");\n styleElement(n, {\n flex: \"1 1 auto\",\n color: row.strong\n ? \"var(--text-color, #1f2937)\"\n : \"var(--text-secondary-color, #6b7280)\",\n fontWeight: row.strong ? \"600\" : \"400\",\n });\n n.textContent = row.name;\n const v = doc.createElement(\"span\");\n styleElement(v, {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = row.value;\n el.append(n, v);\n fragment.append(el);\n }\n return fragment;\n };\n\n /** Fills (when the hovered item changed) and places the tooltip */\n const updateTooltip = (force = false) => {\n const tip = dom.tooltip;\n const event = scene && hover ? hoverEvent(scene, hover.hover) : null;\n if (!event || !scene || !hover || !tooltipOptions() || press?.moved) {\n tip.style.display = \"none\";\n tipKey = \"\";\n return;\n }\n const key = `${event.index}:${event.indicator ?? \"\"}`;\n if (force || key !== tipKey) {\n tipKey = key;\n const content = tooltipNode(event);\n if (content === null || content === \"\") {\n tip.replaceChildren();\n tipKey = \"\";\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") {\n tip.textContent = content;\n tip.style.whiteSpace = \"pre\";\n } else {\n tip.replaceChildren(content);\n tip.style.whiteSpace = \"nowrap\";\n }\n } else if (!tip.firstChild) {\n return;\n }\n tip.style.display = \"block\";\n const anchor = hover.keyboard\n ? (hoverAnchor(scene, hover.hover) ?? hover)\n : hover;\n const stageW = dom.stage.clientWidth;\n const stageH = dom.stage.clientHeight;\n const { x: left, y: top } = placeShapeTooltip(\n scene,\n hover.hover,\n anchor,\n tip.offsetWidth,\n tip.offsetHeight,\n stageW,\n stageH,\n );\n tip.style.transform = `translate(${Math.round(left)}px, ${Math.round(top)}px)`;\n };\n\n const setHover = (\n next: ShapeHover | null,\n x: number,\n y: number,\n keyboard: boolean,\n ) => {\n const changed = !sameHover(hover?.hover ?? null, next);\n hover = next ? { hover: next, x, y, keyboard } : null;\n dom.stage.style.cursor = next && !keyboard ? \"pointer\" : \"\";\n updateTooltip();\n if (!changed) return;\n schedule();\n emit(\"hover\", scene && next ? hoverEvent(scene, next) : null);\n };\n\n function render() {\n frameId = null;\n if (destroyed) return;\n const width = dom.stage.clientWidth;\n const height = dom.stage.clientHeight;\n if (!(width > 0 && height > 0)) return;\n const dpr = win?.devicePixelRatio || 1;\n const pw = Math.max(1, Math.round(width * dpr));\n const ph = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== pw) canvas.width = pw;\n if (canvas.height !== ph) canvas.height = ph;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n fontSet = \"\";\n const frame = runtime.frame(now(), { theme, width, height, measure });\n scene = frame.scene;\n if (hover && !scene.items.some((it) => it.index === hover?.hover.index)) {\n hover = null;\n dom.stage.style.cursor = \"\";\n emit(\"hover\", null);\n }\n if (ctx) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, pw, ph);\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n drawShapeScene(ctx, scene, hover?.hover ?? null);\n fontSet = \"\";\n }\n updateTooltip();\n if (!frame.animating) {\n const text = describeScene(scene);\n if (description.textContent !== text) description.textContent = text;\n } else schedule();\n }\n\n // ------------------------------------------------------------- legend\n\n const renderLegend = () => {\n const entries = shapeLegend(options, theme, runtime.hidden);\n const config = legendConfig(options);\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = entries ? \"flex\" : \"none\";\n if (!entries) return;\n const bottom = config.position === \"bottom\";\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n dom.legend.style.justifyContent = \"center\";\n for (const entry of entries) {\n const item = doc.createElement(config.toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!entry.hidden));\n item.addEventListener(\"click\", () => toggle(entry.index));\n }\n styleElement(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: config.toggle ? \"pointer\" : \"default\",\n opacity: entry.hidden ? \"0.45\" : \"1\",\n textDecoration: entry.hidden ? \"line-through\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n });\n item.append(\n swatch(doc, entry.color, \"dot\"),\n doc.createTextNode(entry.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const updateAccessibility = () => {\n dom.stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? describeChart(options),\n );\n };\n\n function toggle(index: number) {\n if (destroyed) return;\n const event = runtime.toggle(index);\n if (!event) return;\n if (!options.hidden) {\n renderLegend();\n tipKey = \"\";\n schedule();\n }\n emit(\"toggle\", event);\n }\n\n function drill(path: readonly string[]) {\n if (destroyed) return;\n const event = runtime.drill(path);\n if (!event) return;\n if (options.type === \"sunburst\" && !options.drillPath) {\n tipKey = \"\";\n schedule();\n }\n emit(\"drill\", event);\n }\n\n /** Sunburst: drills into / out of an activated item */\n const activate = (hit: ShapeHover) => {\n if (options.type !== \"sunburst\" || options.drill === false || !scene)\n return;\n const item = scene.items.find((it) => it.index === hit.index);\n if (item?.drill) drill(item.drill);\n };\n\n // -------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = dom.stage.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const hitAt = (x: number, y: number) =>\n scene ? hitTestShapes(scene, x, y, hover?.hover ?? null) : null;\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n if (press && press.id === event.pointerId) {\n if (Math.hypot(x - press.x, y - press.y) > TAP_SLOP) press.moved = true;\n if (press.touch) return;\n } else if (event.pointerType === \"touch\") return;\n setHover(hitAt(x, y), x, y, false);\n };\n\n const onPointerDown = (event: PointerEvent) => {\n const { x, y } = local(event);\n press = {\n x,\n y,\n id: event.pointerId,\n touch: event.pointerType === \"touch\",\n moved: false,\n };\n };\n\n const onPointerUp = (event: PointerEvent) => {\n const p = press;\n press = null;\n if (!p || p.id !== event.pointerId || p.moved) {\n updateTooltip();\n return;\n }\n const { x, y } = local(event);\n const hit = hitAt(x, y);\n // a tap shows the tooltip (there is no hover on touch screens)\n setHover(hit, x, y, false);\n if (hit && scene) {\n const e = hoverEvent(scene, hit);\n if (e) emit(\"click\", e);\n activate(hit);\n }\n };\n\n const onPointerCancel = () => {\n press = null;\n updateTooltip();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (event.pointerType === \"touch\") return;\n press = null;\n if (hover && !hover.keyboard) setHover(null, 0, 0, false);\n };\n\n const focusItem = (next: ShapeHover | null) => {\n if (!scene || !next) return;\n const anchor = hoverAnchor(scene, next) ?? { x: 0, y: 0 };\n setHover(next, anchor.x, anchor.y, true);\n dom.live.textContent = describeItem(scene, next);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!scene) return;\n const current = hover?.hover ?? null;\n const keys: Record<string, \"next\" | \"prev\" | \"up\" | \"down\"> = {\n ArrowRight: \"next\",\n ArrowLeft: \"prev\",\n ArrowUp: \"up\",\n ArrowDown: \"down\",\n };\n const direction = keys[event.key];\n if (direction) {\n event.preventDefault();\n focusItem(stepHover(scene, current, direction));\n return;\n }\n switch (event.key) {\n case \"Home\":\n case \"End\": {\n const items = scene.items;\n if (!items.length) return;\n event.preventDefault();\n const it = event.key === \"Home\" ? items[0] : items[items.length - 1];\n focusItem(\n scene.type === \"radar\"\n ? { index: it.index, indicator: current?.indicator ?? 0 }\n : { index: it.index },\n );\n break;\n }\n case \"Enter\":\n case \" \": {\n if (!current) return;\n const e = hoverEvent(scene, current);\n if (!e) return;\n event.preventDefault();\n emit(\"click\", e);\n activate(current);\n break;\n }\n case \"Backspace\": {\n if (options.type !== \"sunburst\" || options.drill === false) return;\n const path = runtime.drillPath();\n if (!path.length) return;\n event.preventDefault();\n drill(path.slice(0, -1));\n break;\n }\n case \"Escape\":\n if (hover) {\n event.preventDefault();\n setHover(null, 0, 0, false);\n }\n break;\n default:\n break;\n }\n };\n\n const onFocus = () => {\n let visible: boolean;\n try {\n visible = dom.stage.matches(\":focus-visible\");\n } catch {\n visible = true;\n }\n // inset, like an outline drawn inside the stage edge: the drawing keeps a\n // padding, so the ring never covers labels or leader lines\n if (visible)\n dom.stage.style.boxShadow =\n \"inset 0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n dom.stage.style.boxShadow = \"\";\n if (hover?.keyboard) setHover(null, 0, 0, false);\n };\n\n const stage = dom.stage;\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => schedule())\n : null;\n resizeObserver?.observe(dom.stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n theme = readTheme(dom.root, options.palette);\n renderLegend();\n tipKey = \"\";\n schedule();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n renderLegend();\n updateAccessibility();\n render();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n runtime.setOptions(next);\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join())\n theme = readTheme(dom.root, next.palette);\n if (next.type !== previous.type && hover) setHover(null, 0, 0, false);\n renderLegend();\n updateAccessibility();\n tipKey = \"\";\n schedule();\n },\n resize() {\n if (destroyed) return;\n cancelFrame();\n render();\n },\n refreshTheme,\n toggle,\n getHidden: () => runtime.hiddenIndexes(),\n drill,\n getDrillPath: () => runtime.drillPath(),\n on(type, listener) {\n listeners[type].add(listener);\n return () => {\n listeners[type].delete(listener);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n cancelFrame();\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n resizeObserver?.disconnect();\n unwatchTheme();\n listeners.hover.clear();\n listeners.click.clear();\n listeners.toggle.clear();\n listeners.drill.clear();\n dom.root.remove();\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart.cjs","names":["createChartDom","createShapeRuntime","readTheme","estimateText","tooltipContent","swatch","hoverEvent","hoverAnchor","placeShapeTooltip","sameHover","now","describeScene","shapeLegend","legendConfig","describeChart","hitTestShapes","describeItem","stepHover","watchTheme","require_dom","require_theme","require_scene","require_draw","require_hit","require_layout","require_runtime","TAP_SLOP","uid","createShapeChart","doc","container","win","dom","canvas","ctx","runtime","initial","options","theme","scene","hover","tipKey","destroyed","frameId","frameIsTimeout","press","listeners","emit","listener","type","event","description","fontSet","measure","f","text","cancelFrame","schedule","render","tooltipOptions","tooltipNode","custom","content","fragment","header","row","el","n","v","updateTooltip","tip","key","force","anchor","stageW","stageH","left","top","setHover","changed","next","keyboard","width","height","dpr","pw","ph","frame","it","renderLegend","entries","config","focused","bottom","entry","item","toggle","updateAccessibility","index","drill","path","activate","hit","local","rect","hitAt","x","y","onPointerMove","onPointerDown","onPointerUp","p","onPointerCancel","onPointerLeave","focusItem","onKeyDown","current","direction","items","e","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","unwatchTheme","previous"],"sources":["../../../../../charts/src/engine/shapes/chart.ts"],"sourcesContent":["// createShapeChart: DOM host of the shape charts. One Canvas2D layer sized\n// with the device pixel ratio, the house legend / tooltip / live region of\n// createChartDom, pointer + keyboard interaction, resize and theme watching.\n\nimport { createChartDom, styleElement, swatch } from \"../dom\";\nimport { readTheme, watchTheme, type ChartTheme } from \"../theme\";\nimport { drawShapeScene } from \"./draw\";\nimport { hitTestShapes, hoverAnchor, stepHover } from \"./hit\";\nimport {\n describeChart,\n describeItem,\n describeScene,\n hoverEvent,\n legendConfig,\n placeShapeTooltip,\n sameHover,\n shapeLegend,\n tooltipContent,\n} from \"./layout\";\nimport { createShapeRuntime, now } from \"./runtime\";\nimport {\n estimateText,\n type MeasureText,\n type ShapeHover,\n type ShapeScene,\n} from \"./scene\";\nimport type {\n ShapeChartEventMap,\n ShapeChartInstance,\n ShapeChartOptions,\n ShapeHoverEvent,\n} from \"./types\";\n\n/** Pointer travel (px) under which a press counts as a click / tap */\nconst TAP_SLOP = 6;\n\nlet uid = 0;\n\ninterface HoverState {\n hover: ShapeHover;\n x: number;\n y: number;\n keyboard: boolean;\n}\n\n/**\n * Creates a pie / donut, radar, gauge, funnel, treemap, sankey, sunburst,\n * radial bar, calendar heatmap or bullet chart in `container` (drawn with\n * Canvas2D, themed by the Minerva CSS variables).\n */\nexport const createShapeChart = (\n container: HTMLElement,\n initial: ShapeChartOptions,\n): ShapeChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createChartDom(container);\n dom.root.classList.add(\"minerva-shape-chart\");\n dom.foreground.style.display = \"none\";\n dom.hover.style.display = \"none\";\n const canvas = dom.background;\n let ctx: CanvasRenderingContext2D | null = null;\n try {\n ctx = canvas.getContext(\"2d\");\n } catch {\n ctx = null;\n }\n\n const runtime = createShapeRuntime(initial);\n let options = initial;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let scene: ShapeScene | null = null;\n let hover: HoverState | null = null;\n let tipKey = \"\";\n let destroyed = false;\n let frameId: number | null = null;\n let frameIsTimeout = false;\n let press: {\n x: number;\n y: number;\n id: number;\n touch: boolean;\n moved: boolean;\n } | null = null;\n\n const listeners: {\n [K in keyof ShapeChartEventMap]: Set<\n (event: ShapeChartEventMap[K]) => void\n >;\n } = {\n hover: new Set(),\n click: new Set(),\n toggle: new Set(),\n drill: new Set(),\n };\n const emit = <K extends keyof ShapeChartEventMap>(\n type: K,\n event: ShapeChartEventMap[K],\n ) => {\n for (const listener of [...listeners[type]]) listener(event);\n };\n\n // screen-reader summary of the data\n const description = doc.createElement(\"div\");\n description.id = `minerva-shape-chart-${++uid}`;\n styleElement(description, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n dom.stage.appendChild(description);\n dom.stage.setAttribute(\"aria-describedby\", description.id);\n dom.stage.tabIndex = 0;\n\n let fontSet = \"\";\n const measure: MeasureText = (text, f) => {\n if (!ctx) return estimateText(text, f);\n if (f !== fontSet) {\n ctx.font = f;\n fontSet = f;\n }\n return ctx.measureText(text).width;\n };\n\n // ------------------------------------------------------------- frames\n\n const cancelFrame = () => {\n if (frameId === null) return;\n if (frameIsTimeout) clearTimeout(frameId);\n else win?.cancelAnimationFrame?.(frameId);\n frameId = null;\n };\n\n const schedule = () => {\n if (destroyed || frameId !== null) return;\n if (win && typeof win.requestAnimationFrame === \"function\") {\n frameIsTimeout = false;\n frameId = win.requestAnimationFrame(() => render());\n } else {\n frameIsTimeout = true;\n frameId = setTimeout(() => render(), 16) as unknown as number;\n }\n };\n\n const tooltipOptions = () =>\n options.tooltip === false\n ? null\n : typeof options.tooltip === \"object\"\n ? options.tooltip\n : {};\n\n const tooltipNode = (event: ShapeHoverEvent): Node | string | null => {\n const custom = tooltipOptions()?.render;\n if (custom) return custom(event);\n if (!scene || !hover) return null;\n const content = tooltipContent(scene, hover.hover);\n if (!content) return null;\n const fragment = doc.createDocumentFragment();\n const header = doc.createElement(\"div\");\n styleElement(header, {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"4px\",\n color: \"var(--text-color, #1f2937)\",\n // long titles (full names of truncated labels) wrap\n whiteSpace: \"normal\",\n maxWidth: \"260px\",\n overflowWrap: \"anywhere\",\n });\n if (content.color) header.appendChild(swatch(doc, content.color, \"dot\"));\n header.appendChild(doc.createTextNode(content.title));\n fragment.append(header);\n for (const row of content.rows) {\n const el = doc.createElement(\"div\");\n styleElement(el, { display: \"flex\", alignItems: \"center\", gap: \"8px\" });\n if (row.color) el.appendChild(swatch(doc, row.color, \"dot\"));\n const n = doc.createElement(\"span\");\n styleElement(n, {\n flex: \"1 1 auto\",\n color: row.strong\n ? \"var(--text-color, #1f2937)\"\n : \"var(--text-secondary-color, #6b7280)\",\n fontWeight: row.strong ? \"600\" : \"400\",\n });\n n.textContent = row.name;\n const v = doc.createElement(\"span\");\n styleElement(v, {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = row.value;\n el.append(n, v);\n fragment.append(el);\n }\n return fragment;\n };\n\n /** Fills (when the hovered item changed) and places the tooltip */\n const updateTooltip = (force = false) => {\n const tip = dom.tooltip;\n const event = scene && hover ? hoverEvent(scene, hover.hover) : null;\n if (!event || !scene || !hover || !tooltipOptions() || press?.moved) {\n tip.style.display = \"none\";\n tipKey = \"\";\n return;\n }\n const key = `${event.index}:${event.indicator ?? \"\"}`;\n if (force || key !== tipKey) {\n tipKey = key;\n const content = tooltipNode(event);\n if (content === null || content === \"\") {\n tip.replaceChildren();\n tipKey = \"\";\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") {\n tip.textContent = content;\n tip.style.whiteSpace = \"pre\";\n } else {\n tip.replaceChildren(content);\n tip.style.whiteSpace = \"nowrap\";\n }\n } else if (!tip.firstChild) {\n return;\n }\n tip.style.display = \"block\";\n const anchor = hover.keyboard\n ? (hoverAnchor(scene, hover.hover) ?? hover)\n : hover;\n const stageW = dom.stage.clientWidth;\n const stageH = dom.stage.clientHeight;\n const { x: left, y: top } = placeShapeTooltip(\n scene,\n hover.hover,\n anchor,\n tip.offsetWidth,\n tip.offsetHeight,\n stageW,\n stageH,\n );\n tip.style.transform = `translate(${Math.round(left)}px, ${Math.round(top)}px)`;\n };\n\n const setHover = (\n next: ShapeHover | null,\n x: number,\n y: number,\n keyboard: boolean,\n ) => {\n const changed = !sameHover(hover?.hover ?? null, next);\n hover = next ? { hover: next, x, y, keyboard } : null;\n dom.stage.style.cursor = next && !keyboard ? \"pointer\" : \"\";\n updateTooltip();\n if (!changed) return;\n schedule();\n emit(\"hover\", scene && next ? hoverEvent(scene, next) : null);\n };\n\n function render() {\n frameId = null;\n if (destroyed) return;\n const width = dom.stage.clientWidth;\n const height = dom.stage.clientHeight;\n if (!(width > 0 && height > 0)) return;\n const dpr = win?.devicePixelRatio || 1;\n const pw = Math.max(1, Math.round(width * dpr));\n const ph = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== pw) canvas.width = pw;\n if (canvas.height !== ph) canvas.height = ph;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n fontSet = \"\";\n const frame = runtime.frame(now(), { theme, width, height, measure });\n scene = frame.scene;\n if (hover && !scene.items.some((it) => it.index === hover?.hover.index)) {\n hover = null;\n dom.stage.style.cursor = \"\";\n emit(\"hover\", null);\n }\n if (ctx) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, pw, ph);\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n drawShapeScene(ctx, scene, hover?.hover ?? null);\n fontSet = \"\";\n }\n updateTooltip();\n if (!frame.animating) {\n const text = describeScene(scene);\n if (description.textContent !== text) description.textContent = text;\n } else schedule();\n }\n\n // ------------------------------------------------------------- legend\n\n const renderLegend = () => {\n const entries = shapeLegend(options, theme, runtime.hidden);\n const config = legendConfig(options);\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = entries ? \"flex\" : \"none\";\n if (!entries) return;\n const bottom = config.position === \"bottom\";\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n dom.legend.style.justifyContent = \"center\";\n for (const entry of entries) {\n const item = doc.createElement(config.toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!entry.hidden));\n item.addEventListener(\"click\", () => toggle(entry.index));\n }\n styleElement(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: config.toggle ? \"pointer\" : \"default\",\n opacity: entry.hidden ? \"0.45\" : \"1\",\n textDecoration: entry.hidden ? \"line-through\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n });\n item.append(\n swatch(doc, entry.color, \"dot\"),\n doc.createTextNode(entry.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const updateAccessibility = () => {\n dom.stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? describeChart(options),\n );\n };\n\n function toggle(index: number) {\n if (destroyed) return;\n const event = runtime.toggle(index);\n if (!event) return;\n if (!options.hidden) {\n renderLegend();\n tipKey = \"\";\n schedule();\n }\n emit(\"toggle\", event);\n }\n\n function drill(path: readonly string[]) {\n if (destroyed) return;\n const event = runtime.drill(path);\n if (!event) return;\n if (options.type === \"sunburst\" && !options.drillPath) {\n tipKey = \"\";\n schedule();\n }\n emit(\"drill\", event);\n }\n\n /** Sunburst: drills into / out of an activated item */\n const activate = (hit: ShapeHover) => {\n if (options.type !== \"sunburst\" || options.drill === false || !scene)\n return;\n const item = scene.items.find((it) => it.index === hit.index);\n if (item?.drill) drill(item.drill);\n };\n\n // -------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = dom.stage.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const hitAt = (x: number, y: number) =>\n scene ? hitTestShapes(scene, x, y, hover?.hover ?? null) : null;\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n if (press && press.id === event.pointerId) {\n if (Math.hypot(x - press.x, y - press.y) > TAP_SLOP) press.moved = true;\n if (press.touch) return;\n } else if (event.pointerType === \"touch\") return;\n setHover(hitAt(x, y), x, y, false);\n };\n\n const onPointerDown = (event: PointerEvent) => {\n const { x, y } = local(event);\n press = {\n x,\n y,\n id: event.pointerId,\n touch: event.pointerType === \"touch\",\n moved: false,\n };\n };\n\n const onPointerUp = (event: PointerEvent) => {\n const p = press;\n press = null;\n if (!p || p.id !== event.pointerId || p.moved) {\n updateTooltip();\n return;\n }\n const { x, y } = local(event);\n const hit = hitAt(x, y);\n // a tap shows the tooltip (there is no hover on touch screens)\n setHover(hit, x, y, false);\n if (hit && scene) {\n const e = hoverEvent(scene, hit);\n if (e) emit(\"click\", e);\n activate(hit);\n }\n };\n\n const onPointerCancel = () => {\n press = null;\n updateTooltip();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (event.pointerType === \"touch\") return;\n press = null;\n if (hover && !hover.keyboard) setHover(null, 0, 0, false);\n };\n\n const focusItem = (next: ShapeHover | null) => {\n if (!scene || !next) return;\n const anchor = hoverAnchor(scene, next) ?? { x: 0, y: 0 };\n setHover(next, anchor.x, anchor.y, true);\n dom.live.textContent = describeItem(scene, next);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!scene) return;\n const current = hover?.hover ?? null;\n const keys: Record<string, \"next\" | \"prev\" | \"up\" | \"down\"> = {\n ArrowRight: \"next\",\n ArrowLeft: \"prev\",\n ArrowUp: \"up\",\n ArrowDown: \"down\",\n };\n const direction = keys[event.key];\n if (direction) {\n event.preventDefault();\n focusItem(stepHover(scene, current, direction));\n return;\n }\n switch (event.key) {\n case \"Home\":\n case \"End\": {\n const items = scene.items;\n if (!items.length) return;\n event.preventDefault();\n const it = event.key === \"Home\" ? items[0] : items[items.length - 1];\n focusItem(\n scene.type === \"radar\"\n ? { index: it.index, indicator: current?.indicator ?? 0 }\n : { index: it.index },\n );\n break;\n }\n case \"Enter\":\n case \" \": {\n if (!current) return;\n const e = hoverEvent(scene, current);\n if (!e) return;\n event.preventDefault();\n emit(\"click\", e);\n activate(current);\n break;\n }\n case \"Backspace\": {\n if (options.type !== \"sunburst\" || options.drill === false) return;\n const path = runtime.drillPath();\n if (!path.length) return;\n event.preventDefault();\n drill(path.slice(0, -1));\n break;\n }\n case \"Escape\":\n if (hover) {\n event.preventDefault();\n setHover(null, 0, 0, false);\n }\n break;\n default:\n break;\n }\n };\n\n const onFocus = () => {\n let visible: boolean;\n try {\n visible = dom.stage.matches(\":focus-visible\");\n } catch {\n visible = true;\n }\n // inset, like an outline drawn inside the stage edge: the drawing keeps a\n // padding, so the ring never covers labels or leader lines\n if (visible)\n dom.stage.style.boxShadow =\n \"inset 0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n dom.stage.style.boxShadow = \"\";\n if (hover?.keyboard) setHover(null, 0, 0, false);\n };\n\n const stage = dom.stage;\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => schedule())\n : null;\n resizeObserver?.observe(dom.stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n theme = readTheme(dom.root, options.palette);\n renderLegend();\n tipKey = \"\";\n schedule();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n renderLegend();\n updateAccessibility();\n render();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n runtime.setOptions(next);\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join())\n theme = readTheme(dom.root, next.palette);\n if (next.type !== previous.type && hover) setHover(null, 0, 0, false);\n renderLegend();\n updateAccessibility();\n tipKey = \"\";\n schedule();\n },\n resize() {\n if (destroyed) return;\n cancelFrame();\n render();\n },\n refreshTheme,\n toggle,\n getHidden: () => runtime.hiddenIndexes(),\n drill,\n getDrillPath: () => runtime.drillPath(),\n on(type, listener) {\n listeners[type].add(listener);\n return () => {\n listeners[type].delete(listener);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n cancelFrame();\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n resizeObserver?.disconnect();\n unwatchTheme();\n listeners.hover.clear();\n listeners.click.clear();\n listeners.toggle.clear();\n listeners.drill.clear();\n dom.root.remove();\n },\n };\n};\n"],"mappings":"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"}
@@ -49,7 +49,10 @@ var ue = 6, de = 0, d = (d, f) => {
49
49
  gap: "6px",
50
50
  fontWeight: "600",
51
51
  marginBottom: "4px",
52
- color: "var(--text-color, #1f2937)"
52
+ color: "var(--text-color, #1f2937)",
53
+ whiteSpace: "normal",
54
+ maxWidth: "260px",
55
+ overflowWrap: "anywhere"
53
56
  }), i.color && o.appendChild(n(p, i.color, "dot")), o.appendChild(p.createTextNode(i.title)), a.append(o);
54
57
  for (let e of i.rows) {
55
58
  let r = p.createElement("div");
@@ -1 +1 @@
1
- {"version":3,"file":"chart.js","names":["assign","TAP_SLOP","uid","createShapeChart","doc","container","win","dom","createChartDom","canvas","ctx","runtime","createShapeRuntime","initial","options","theme","readTheme","scene","hover","tipKey","destroyed","frameId","frameIsTimeout","press","listeners","emit","listener","type","event","description","fontSet","measure","f","text","estimateText","cancelFrame","schedule","render","tooltipOptions","tooltipNode","custom","content","tooltipContent","fragment","header","swatch","row","el","n","v","updateTooltip","tip","hoverEvent","key","force","anchor","hoverAnchor","stageW","stageH","left","top","placeShapeTooltip","setHover","changed","sameHover","next","keyboard","width","height","dpr","pw","ph","frame","now","it","drawShapeScene","describeScene","renderLegend","entries","shapeLegend","config","legendConfig","focused","bottom","entry","item","toggle","updateAccessibility","describeChart","index","drill","path","activate","hit","local","rect","hitAt","hitTestShapes","x","y","onPointerMove","onPointerDown","onPointerUp","p","onPointerCancel","onPointerLeave","focusItem","describeItem","onKeyDown","current","direction","stepHover","items","e","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","unwatchTheme","watchTheme","previous"],"sources":["../../../../../charts/src/engine/shapes/chart.ts"],"sourcesContent":["// createShapeChart: DOM host of the shape charts. One Canvas2D layer sized\n// with the device pixel ratio, the house legend / tooltip / live region of\n// createChartDom, pointer + keyboard interaction, resize and theme watching.\n\nimport { createChartDom, styleElement, swatch } from \"../dom\";\nimport { readTheme, watchTheme, type ChartTheme } from \"../theme\";\nimport { drawShapeScene } from \"./draw\";\nimport { hitTestShapes, hoverAnchor, stepHover } from \"./hit\";\nimport {\n describeChart,\n describeItem,\n describeScene,\n hoverEvent,\n legendConfig,\n placeShapeTooltip,\n sameHover,\n shapeLegend,\n tooltipContent,\n} from \"./layout\";\nimport { createShapeRuntime, now } from \"./runtime\";\nimport {\n estimateText,\n type MeasureText,\n type ShapeHover,\n type ShapeScene,\n} from \"./scene\";\nimport type {\n ShapeChartEventMap,\n ShapeChartInstance,\n ShapeChartOptions,\n ShapeHoverEvent,\n} from \"./types\";\n\n/** Pointer travel (px) under which a press counts as a click / tap */\nconst TAP_SLOP = 6;\n\nlet uid = 0;\n\ninterface HoverState {\n hover: ShapeHover;\n x: number;\n y: number;\n keyboard: boolean;\n}\n\n/**\n * Creates a pie / donut, radar, gauge, funnel, treemap, sankey, sunburst,\n * radial bar, calendar heatmap or bullet chart in `container` (drawn with\n * Canvas2D, themed by the Minerva CSS variables).\n */\nexport const createShapeChart = (\n container: HTMLElement,\n initial: ShapeChartOptions,\n): ShapeChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createChartDom(container);\n dom.root.classList.add(\"minerva-shape-chart\");\n dom.foreground.style.display = \"none\";\n dom.hover.style.display = \"none\";\n const canvas = dom.background;\n let ctx: CanvasRenderingContext2D | null = null;\n try {\n ctx = canvas.getContext(\"2d\");\n } catch {\n ctx = null;\n }\n\n const runtime = createShapeRuntime(initial);\n let options = initial;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let scene: ShapeScene | null = null;\n let hover: HoverState | null = null;\n let tipKey = \"\";\n let destroyed = false;\n let frameId: number | null = null;\n let frameIsTimeout = false;\n let press: {\n x: number;\n y: number;\n id: number;\n touch: boolean;\n moved: boolean;\n } | null = null;\n\n const listeners: {\n [K in keyof ShapeChartEventMap]: Set<\n (event: ShapeChartEventMap[K]) => void\n >;\n } = {\n hover: new Set(),\n click: new Set(),\n toggle: new Set(),\n drill: new Set(),\n };\n const emit = <K extends keyof ShapeChartEventMap>(\n type: K,\n event: ShapeChartEventMap[K],\n ) => {\n for (const listener of [...listeners[type]]) listener(event);\n };\n\n // screen-reader summary of the data\n const description = doc.createElement(\"div\");\n description.id = `minerva-shape-chart-${++uid}`;\n styleElement(description, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n dom.stage.appendChild(description);\n dom.stage.setAttribute(\"aria-describedby\", description.id);\n dom.stage.tabIndex = 0;\n\n let fontSet = \"\";\n const measure: MeasureText = (text, f) => {\n if (!ctx) return estimateText(text, f);\n if (f !== fontSet) {\n ctx.font = f;\n fontSet = f;\n }\n return ctx.measureText(text).width;\n };\n\n // ------------------------------------------------------------- frames\n\n const cancelFrame = () => {\n if (frameId === null) return;\n if (frameIsTimeout) clearTimeout(frameId);\n else win?.cancelAnimationFrame?.(frameId);\n frameId = null;\n };\n\n const schedule = () => {\n if (destroyed || frameId !== null) return;\n if (win && typeof win.requestAnimationFrame === \"function\") {\n frameIsTimeout = false;\n frameId = win.requestAnimationFrame(() => render());\n } else {\n frameIsTimeout = true;\n frameId = setTimeout(() => render(), 16) as unknown as number;\n }\n };\n\n const tooltipOptions = () =>\n options.tooltip === false\n ? null\n : typeof options.tooltip === \"object\"\n ? options.tooltip\n : {};\n\n const tooltipNode = (event: ShapeHoverEvent): Node | string | null => {\n const custom = tooltipOptions()?.render;\n if (custom) return custom(event);\n if (!scene || !hover) return null;\n const content = tooltipContent(scene, hover.hover);\n if (!content) return null;\n const fragment = doc.createDocumentFragment();\n const header = doc.createElement(\"div\");\n styleElement(header, {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"4px\",\n color: \"var(--text-color, #1f2937)\",\n });\n if (content.color) header.appendChild(swatch(doc, content.color, \"dot\"));\n header.appendChild(doc.createTextNode(content.title));\n fragment.append(header);\n for (const row of content.rows) {\n const el = doc.createElement(\"div\");\n styleElement(el, { display: \"flex\", alignItems: \"center\", gap: \"8px\" });\n if (row.color) el.appendChild(swatch(doc, row.color, \"dot\"));\n const n = doc.createElement(\"span\");\n styleElement(n, {\n flex: \"1 1 auto\",\n color: row.strong\n ? \"var(--text-color, #1f2937)\"\n : \"var(--text-secondary-color, #6b7280)\",\n fontWeight: row.strong ? \"600\" : \"400\",\n });\n n.textContent = row.name;\n const v = doc.createElement(\"span\");\n styleElement(v, {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = row.value;\n el.append(n, v);\n fragment.append(el);\n }\n return fragment;\n };\n\n /** Fills (when the hovered item changed) and places the tooltip */\n const updateTooltip = (force = false) => {\n const tip = dom.tooltip;\n const event = scene && hover ? hoverEvent(scene, hover.hover) : null;\n if (!event || !scene || !hover || !tooltipOptions() || press?.moved) {\n tip.style.display = \"none\";\n tipKey = \"\";\n return;\n }\n const key = `${event.index}:${event.indicator ?? \"\"}`;\n if (force || key !== tipKey) {\n tipKey = key;\n const content = tooltipNode(event);\n if (content === null || content === \"\") {\n tip.replaceChildren();\n tipKey = \"\";\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") {\n tip.textContent = content;\n tip.style.whiteSpace = \"pre\";\n } else {\n tip.replaceChildren(content);\n tip.style.whiteSpace = \"nowrap\";\n }\n } else if (!tip.firstChild) {\n return;\n }\n tip.style.display = \"block\";\n const anchor = hover.keyboard\n ? (hoverAnchor(scene, hover.hover) ?? hover)\n : hover;\n const stageW = dom.stage.clientWidth;\n const stageH = dom.stage.clientHeight;\n const { x: left, y: top } = placeShapeTooltip(\n scene,\n hover.hover,\n anchor,\n tip.offsetWidth,\n tip.offsetHeight,\n stageW,\n stageH,\n );\n tip.style.transform = `translate(${Math.round(left)}px, ${Math.round(top)}px)`;\n };\n\n const setHover = (\n next: ShapeHover | null,\n x: number,\n y: number,\n keyboard: boolean,\n ) => {\n const changed = !sameHover(hover?.hover ?? null, next);\n hover = next ? { hover: next, x, y, keyboard } : null;\n dom.stage.style.cursor = next && !keyboard ? \"pointer\" : \"\";\n updateTooltip();\n if (!changed) return;\n schedule();\n emit(\"hover\", scene && next ? hoverEvent(scene, next) : null);\n };\n\n function render() {\n frameId = null;\n if (destroyed) return;\n const width = dom.stage.clientWidth;\n const height = dom.stage.clientHeight;\n if (!(width > 0 && height > 0)) return;\n const dpr = win?.devicePixelRatio || 1;\n const pw = Math.max(1, Math.round(width * dpr));\n const ph = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== pw) canvas.width = pw;\n if (canvas.height !== ph) canvas.height = ph;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n fontSet = \"\";\n const frame = runtime.frame(now(), { theme, width, height, measure });\n scene = frame.scene;\n if (hover && !scene.items.some((it) => it.index === hover?.hover.index)) {\n hover = null;\n dom.stage.style.cursor = \"\";\n emit(\"hover\", null);\n }\n if (ctx) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, pw, ph);\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n drawShapeScene(ctx, scene, hover?.hover ?? null);\n fontSet = \"\";\n }\n updateTooltip();\n if (!frame.animating) {\n const text = describeScene(scene);\n if (description.textContent !== text) description.textContent = text;\n } else schedule();\n }\n\n // ------------------------------------------------------------- legend\n\n const renderLegend = () => {\n const entries = shapeLegend(options, theme, runtime.hidden);\n const config = legendConfig(options);\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = entries ? \"flex\" : \"none\";\n if (!entries) return;\n const bottom = config.position === \"bottom\";\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n dom.legend.style.justifyContent = \"center\";\n for (const entry of entries) {\n const item = doc.createElement(config.toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!entry.hidden));\n item.addEventListener(\"click\", () => toggle(entry.index));\n }\n styleElement(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: config.toggle ? \"pointer\" : \"default\",\n opacity: entry.hidden ? \"0.45\" : \"1\",\n textDecoration: entry.hidden ? \"line-through\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n });\n item.append(\n swatch(doc, entry.color, \"dot\"),\n doc.createTextNode(entry.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const updateAccessibility = () => {\n dom.stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? describeChart(options),\n );\n };\n\n function toggle(index: number) {\n if (destroyed) return;\n const event = runtime.toggle(index);\n if (!event) return;\n if (!options.hidden) {\n renderLegend();\n tipKey = \"\";\n schedule();\n }\n emit(\"toggle\", event);\n }\n\n function drill(path: readonly string[]) {\n if (destroyed) return;\n const event = runtime.drill(path);\n if (!event) return;\n if (options.type === \"sunburst\" && !options.drillPath) {\n tipKey = \"\";\n schedule();\n }\n emit(\"drill\", event);\n }\n\n /** Sunburst: drills into / out of an activated item */\n const activate = (hit: ShapeHover) => {\n if (options.type !== \"sunburst\" || options.drill === false || !scene)\n return;\n const item = scene.items.find((it) => it.index === hit.index);\n if (item?.drill) drill(item.drill);\n };\n\n // -------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = dom.stage.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const hitAt = (x: number, y: number) =>\n scene ? hitTestShapes(scene, x, y, hover?.hover ?? null) : null;\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n if (press && press.id === event.pointerId) {\n if (Math.hypot(x - press.x, y - press.y) > TAP_SLOP) press.moved = true;\n if (press.touch) return;\n } else if (event.pointerType === \"touch\") return;\n setHover(hitAt(x, y), x, y, false);\n };\n\n const onPointerDown = (event: PointerEvent) => {\n const { x, y } = local(event);\n press = {\n x,\n y,\n id: event.pointerId,\n touch: event.pointerType === \"touch\",\n moved: false,\n };\n };\n\n const onPointerUp = (event: PointerEvent) => {\n const p = press;\n press = null;\n if (!p || p.id !== event.pointerId || p.moved) {\n updateTooltip();\n return;\n }\n const { x, y } = local(event);\n const hit = hitAt(x, y);\n // a tap shows the tooltip (there is no hover on touch screens)\n setHover(hit, x, y, false);\n if (hit && scene) {\n const e = hoverEvent(scene, hit);\n if (e) emit(\"click\", e);\n activate(hit);\n }\n };\n\n const onPointerCancel = () => {\n press = null;\n updateTooltip();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (event.pointerType === \"touch\") return;\n press = null;\n if (hover && !hover.keyboard) setHover(null, 0, 0, false);\n };\n\n const focusItem = (next: ShapeHover | null) => {\n if (!scene || !next) return;\n const anchor = hoverAnchor(scene, next) ?? { x: 0, y: 0 };\n setHover(next, anchor.x, anchor.y, true);\n dom.live.textContent = describeItem(scene, next);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!scene) return;\n const current = hover?.hover ?? null;\n const keys: Record<string, \"next\" | \"prev\" | \"up\" | \"down\"> = {\n ArrowRight: \"next\",\n ArrowLeft: \"prev\",\n ArrowUp: \"up\",\n ArrowDown: \"down\",\n };\n const direction = keys[event.key];\n if (direction) {\n event.preventDefault();\n focusItem(stepHover(scene, current, direction));\n return;\n }\n switch (event.key) {\n case \"Home\":\n case \"End\": {\n const items = scene.items;\n if (!items.length) return;\n event.preventDefault();\n const it = event.key === \"Home\" ? items[0] : items[items.length - 1];\n focusItem(\n scene.type === \"radar\"\n ? { index: it.index, indicator: current?.indicator ?? 0 }\n : { index: it.index },\n );\n break;\n }\n case \"Enter\":\n case \" \": {\n if (!current) return;\n const e = hoverEvent(scene, current);\n if (!e) return;\n event.preventDefault();\n emit(\"click\", e);\n activate(current);\n break;\n }\n case \"Backspace\": {\n if (options.type !== \"sunburst\" || options.drill === false) return;\n const path = runtime.drillPath();\n if (!path.length) return;\n event.preventDefault();\n drill(path.slice(0, -1));\n break;\n }\n case \"Escape\":\n if (hover) {\n event.preventDefault();\n setHover(null, 0, 0, false);\n }\n break;\n default:\n break;\n }\n };\n\n const onFocus = () => {\n let visible: boolean;\n try {\n visible = dom.stage.matches(\":focus-visible\");\n } catch {\n visible = true;\n }\n // inset, like an outline drawn inside the stage edge: the drawing keeps a\n // padding, so the ring never covers labels or leader lines\n if (visible)\n dom.stage.style.boxShadow =\n \"inset 0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n dom.stage.style.boxShadow = \"\";\n if (hover?.keyboard) setHover(null, 0, 0, false);\n };\n\n const stage = dom.stage;\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => schedule())\n : null;\n resizeObserver?.observe(dom.stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n theme = readTheme(dom.root, options.palette);\n renderLegend();\n tipKey = \"\";\n schedule();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n renderLegend();\n updateAccessibility();\n render();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n runtime.setOptions(next);\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join())\n theme = readTheme(dom.root, next.palette);\n if (next.type !== previous.type && hover) setHover(null, 0, 0, false);\n renderLegend();\n updateAccessibility();\n tipKey = \"\";\n schedule();\n },\n resize() {\n if (destroyed) return;\n cancelFrame();\n render();\n },\n refreshTheme,\n toggle,\n getHidden: () => runtime.hiddenIndexes(),\n drill,\n getDrillPath: () => runtime.drillPath(),\n on(type, listener) {\n listeners[type].add(listener);\n return () => {\n listeners[type].delete(listener);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n cancelFrame();\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n resizeObserver?.disconnect();\n unwatchTheme();\n listeners.hover.clear();\n listeners.click.clear();\n listeners.toggle.clear();\n listeners.drill.clear();\n dom.root.remove();\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart.js","names":["assign","TAP_SLOP","uid","createShapeChart","doc","container","win","dom","createChartDom","canvas","ctx","runtime","createShapeRuntime","initial","options","theme","readTheme","scene","hover","tipKey","destroyed","frameId","frameIsTimeout","press","listeners","emit","listener","type","event","description","fontSet","measure","f","text","estimateText","cancelFrame","schedule","render","tooltipOptions","tooltipNode","custom","content","tooltipContent","fragment","header","swatch","row","el","n","v","updateTooltip","tip","hoverEvent","key","force","anchor","hoverAnchor","stageW","stageH","left","top","placeShapeTooltip","setHover","changed","sameHover","next","keyboard","width","height","dpr","pw","ph","frame","now","it","drawShapeScene","describeScene","renderLegend","entries","shapeLegend","config","legendConfig","focused","bottom","entry","item","toggle","updateAccessibility","describeChart","index","drill","path","activate","hit","local","rect","hitAt","hitTestShapes","x","y","onPointerMove","onPointerDown","onPointerUp","p","onPointerCancel","onPointerLeave","focusItem","describeItem","onKeyDown","current","direction","stepHover","items","e","onFocus","visible","onBlur","stage","resizeObserver","refreshTheme","unwatchTheme","watchTheme","previous"],"sources":["../../../../../charts/src/engine/shapes/chart.ts"],"sourcesContent":["// createShapeChart: DOM host of the shape charts. One Canvas2D layer sized\n// with the device pixel ratio, the house legend / tooltip / live region of\n// createChartDom, pointer + keyboard interaction, resize and theme watching.\n\nimport { createChartDom, styleElement, swatch } from \"../dom\";\nimport { readTheme, watchTheme, type ChartTheme } from \"../theme\";\nimport { drawShapeScene } from \"./draw\";\nimport { hitTestShapes, hoverAnchor, stepHover } from \"./hit\";\nimport {\n describeChart,\n describeItem,\n describeScene,\n hoverEvent,\n legendConfig,\n placeShapeTooltip,\n sameHover,\n shapeLegend,\n tooltipContent,\n} from \"./layout\";\nimport { createShapeRuntime, now } from \"./runtime\";\nimport {\n estimateText,\n type MeasureText,\n type ShapeHover,\n type ShapeScene,\n} from \"./scene\";\nimport type {\n ShapeChartEventMap,\n ShapeChartInstance,\n ShapeChartOptions,\n ShapeHoverEvent,\n} from \"./types\";\n\n/** Pointer travel (px) under which a press counts as a click / tap */\nconst TAP_SLOP = 6;\n\nlet uid = 0;\n\ninterface HoverState {\n hover: ShapeHover;\n x: number;\n y: number;\n keyboard: boolean;\n}\n\n/**\n * Creates a pie / donut, radar, gauge, funnel, treemap, sankey, sunburst,\n * radial bar, calendar heatmap or bullet chart in `container` (drawn with\n * Canvas2D, themed by the Minerva CSS variables).\n */\nexport const createShapeChart = (\n container: HTMLElement,\n initial: ShapeChartOptions,\n): ShapeChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createChartDom(container);\n dom.root.classList.add(\"minerva-shape-chart\");\n dom.foreground.style.display = \"none\";\n dom.hover.style.display = \"none\";\n const canvas = dom.background;\n let ctx: CanvasRenderingContext2D | null = null;\n try {\n ctx = canvas.getContext(\"2d\");\n } catch {\n ctx = null;\n }\n\n const runtime = createShapeRuntime(initial);\n let options = initial;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let scene: ShapeScene | null = null;\n let hover: HoverState | null = null;\n let tipKey = \"\";\n let destroyed = false;\n let frameId: number | null = null;\n let frameIsTimeout = false;\n let press: {\n x: number;\n y: number;\n id: number;\n touch: boolean;\n moved: boolean;\n } | null = null;\n\n const listeners: {\n [K in keyof ShapeChartEventMap]: Set<\n (event: ShapeChartEventMap[K]) => void\n >;\n } = {\n hover: new Set(),\n click: new Set(),\n toggle: new Set(),\n drill: new Set(),\n };\n const emit = <K extends keyof ShapeChartEventMap>(\n type: K,\n event: ShapeChartEventMap[K],\n ) => {\n for (const listener of [...listeners[type]]) listener(event);\n };\n\n // screen-reader summary of the data\n const description = doc.createElement(\"div\");\n description.id = `minerva-shape-chart-${++uid}`;\n styleElement(description, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n clip: \"rect(0 0 0 0)\",\n clipPath: \"inset(50%)\",\n whiteSpace: \"nowrap\",\n });\n dom.stage.appendChild(description);\n dom.stage.setAttribute(\"aria-describedby\", description.id);\n dom.stage.tabIndex = 0;\n\n let fontSet = \"\";\n const measure: MeasureText = (text, f) => {\n if (!ctx) return estimateText(text, f);\n if (f !== fontSet) {\n ctx.font = f;\n fontSet = f;\n }\n return ctx.measureText(text).width;\n };\n\n // ------------------------------------------------------------- frames\n\n const cancelFrame = () => {\n if (frameId === null) return;\n if (frameIsTimeout) clearTimeout(frameId);\n else win?.cancelAnimationFrame?.(frameId);\n frameId = null;\n };\n\n const schedule = () => {\n if (destroyed || frameId !== null) return;\n if (win && typeof win.requestAnimationFrame === \"function\") {\n frameIsTimeout = false;\n frameId = win.requestAnimationFrame(() => render());\n } else {\n frameIsTimeout = true;\n frameId = setTimeout(() => render(), 16) as unknown as number;\n }\n };\n\n const tooltipOptions = () =>\n options.tooltip === false\n ? null\n : typeof options.tooltip === \"object\"\n ? options.tooltip\n : {};\n\n const tooltipNode = (event: ShapeHoverEvent): Node | string | null => {\n const custom = tooltipOptions()?.render;\n if (custom) return custom(event);\n if (!scene || !hover) return null;\n const content = tooltipContent(scene, hover.hover);\n if (!content) return null;\n const fragment = doc.createDocumentFragment();\n const header = doc.createElement(\"div\");\n styleElement(header, {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"4px\",\n color: \"var(--text-color, #1f2937)\",\n // long titles (full names of truncated labels) wrap\n whiteSpace: \"normal\",\n maxWidth: \"260px\",\n overflowWrap: \"anywhere\",\n });\n if (content.color) header.appendChild(swatch(doc, content.color, \"dot\"));\n header.appendChild(doc.createTextNode(content.title));\n fragment.append(header);\n for (const row of content.rows) {\n const el = doc.createElement(\"div\");\n styleElement(el, { display: \"flex\", alignItems: \"center\", gap: \"8px\" });\n if (row.color) el.appendChild(swatch(doc, row.color, \"dot\"));\n const n = doc.createElement(\"span\");\n styleElement(n, {\n flex: \"1 1 auto\",\n color: row.strong\n ? \"var(--text-color, #1f2937)\"\n : \"var(--text-secondary-color, #6b7280)\",\n fontWeight: row.strong ? \"600\" : \"400\",\n });\n n.textContent = row.name;\n const v = doc.createElement(\"span\");\n styleElement(v, {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = row.value;\n el.append(n, v);\n fragment.append(el);\n }\n return fragment;\n };\n\n /** Fills (when the hovered item changed) and places the tooltip */\n const updateTooltip = (force = false) => {\n const tip = dom.tooltip;\n const event = scene && hover ? hoverEvent(scene, hover.hover) : null;\n if (!event || !scene || !hover || !tooltipOptions() || press?.moved) {\n tip.style.display = \"none\";\n tipKey = \"\";\n return;\n }\n const key = `${event.index}:${event.indicator ?? \"\"}`;\n if (force || key !== tipKey) {\n tipKey = key;\n const content = tooltipNode(event);\n if (content === null || content === \"\") {\n tip.replaceChildren();\n tipKey = \"\";\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") {\n tip.textContent = content;\n tip.style.whiteSpace = \"pre\";\n } else {\n tip.replaceChildren(content);\n tip.style.whiteSpace = \"nowrap\";\n }\n } else if (!tip.firstChild) {\n return;\n }\n tip.style.display = \"block\";\n const anchor = hover.keyboard\n ? (hoverAnchor(scene, hover.hover) ?? hover)\n : hover;\n const stageW = dom.stage.clientWidth;\n const stageH = dom.stage.clientHeight;\n const { x: left, y: top } = placeShapeTooltip(\n scene,\n hover.hover,\n anchor,\n tip.offsetWidth,\n tip.offsetHeight,\n stageW,\n stageH,\n );\n tip.style.transform = `translate(${Math.round(left)}px, ${Math.round(top)}px)`;\n };\n\n const setHover = (\n next: ShapeHover | null,\n x: number,\n y: number,\n keyboard: boolean,\n ) => {\n const changed = !sameHover(hover?.hover ?? null, next);\n hover = next ? { hover: next, x, y, keyboard } : null;\n dom.stage.style.cursor = next && !keyboard ? \"pointer\" : \"\";\n updateTooltip();\n if (!changed) return;\n schedule();\n emit(\"hover\", scene && next ? hoverEvent(scene, next) : null);\n };\n\n function render() {\n frameId = null;\n if (destroyed) return;\n const width = dom.stage.clientWidth;\n const height = dom.stage.clientHeight;\n if (!(width > 0 && height > 0)) return;\n const dpr = win?.devicePixelRatio || 1;\n const pw = Math.max(1, Math.round(width * dpr));\n const ph = Math.max(1, Math.round(height * dpr));\n if (canvas.width !== pw) canvas.width = pw;\n if (canvas.height !== ph) canvas.height = ph;\n canvas.style.width = `${width}px`;\n canvas.style.height = `${height}px`;\n fontSet = \"\";\n const frame = runtime.frame(now(), { theme, width, height, measure });\n scene = frame.scene;\n if (hover && !scene.items.some((it) => it.index === hover?.hover.index)) {\n hover = null;\n dom.stage.style.cursor = \"\";\n emit(\"hover\", null);\n }\n if (ctx) {\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, pw, ph);\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n drawShapeScene(ctx, scene, hover?.hover ?? null);\n fontSet = \"\";\n }\n updateTooltip();\n if (!frame.animating) {\n const text = describeScene(scene);\n if (description.textContent !== text) description.textContent = text;\n } else schedule();\n }\n\n // ------------------------------------------------------------- legend\n\n const renderLegend = () => {\n const entries = shapeLegend(options, theme, runtime.hidden);\n const config = legendConfig(options);\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = entries ? \"flex\" : \"none\";\n if (!entries) return;\n const bottom = config.position === \"bottom\";\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n dom.legend.style.justifyContent = \"center\";\n for (const entry of entries) {\n const item = doc.createElement(config.toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!entry.hidden));\n item.addEventListener(\"click\", () => toggle(entry.index));\n }\n styleElement(item, {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"6px\",\n padding: \"2px 4px\",\n margin: \"0\",\n border: \"0\",\n borderRadius: \"4px\",\n background: \"none\",\n font: \"inherit\",\n color: \"var(--text-secondary-color, #6b7280)\",\n cursor: config.toggle ? \"pointer\" : \"default\",\n opacity: entry.hidden ? \"0.45\" : \"1\",\n textDecoration: entry.hidden ? \"line-through\" : \"none\",\n transition: \"opacity 120ms ease-out\",\n });\n item.append(\n swatch(doc, entry.color, \"dot\"),\n doc.createTextNode(entry.name),\n );\n dom.legend.appendChild(item);\n }\n if (focused >= 0)\n (dom.legend.children[focused] as HTMLElement | undefined)?.focus();\n };\n\n const updateAccessibility = () => {\n dom.stage.setAttribute(\n \"aria-label\",\n options.ariaLabel ?? describeChart(options),\n );\n };\n\n function toggle(index: number) {\n if (destroyed) return;\n const event = runtime.toggle(index);\n if (!event) return;\n if (!options.hidden) {\n renderLegend();\n tipKey = \"\";\n schedule();\n }\n emit(\"toggle\", event);\n }\n\n function drill(path: readonly string[]) {\n if (destroyed) return;\n const event = runtime.drill(path);\n if (!event) return;\n if (options.type === \"sunburst\" && !options.drillPath) {\n tipKey = \"\";\n schedule();\n }\n emit(\"drill\", event);\n }\n\n /** Sunburst: drills into / out of an activated item */\n const activate = (hit: ShapeHover) => {\n if (options.type !== \"sunburst\" || options.drill === false || !scene)\n return;\n const item = scene.items.find((it) => it.index === hit.index);\n if (item?.drill) drill(item.drill);\n };\n\n // -------------------------------------------------------- interaction\n\n const local = (event: { clientX: number; clientY: number }) => {\n const rect = dom.stage.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n };\n\n const hitAt = (x: number, y: number) =>\n scene ? hitTestShapes(scene, x, y, hover?.hover ?? null) : null;\n\n const onPointerMove = (event: PointerEvent) => {\n const { x, y } = local(event);\n if (press && press.id === event.pointerId) {\n if (Math.hypot(x - press.x, y - press.y) > TAP_SLOP) press.moved = true;\n if (press.touch) return;\n } else if (event.pointerType === \"touch\") return;\n setHover(hitAt(x, y), x, y, false);\n };\n\n const onPointerDown = (event: PointerEvent) => {\n const { x, y } = local(event);\n press = {\n x,\n y,\n id: event.pointerId,\n touch: event.pointerType === \"touch\",\n moved: false,\n };\n };\n\n const onPointerUp = (event: PointerEvent) => {\n const p = press;\n press = null;\n if (!p || p.id !== event.pointerId || p.moved) {\n updateTooltip();\n return;\n }\n const { x, y } = local(event);\n const hit = hitAt(x, y);\n // a tap shows the tooltip (there is no hover on touch screens)\n setHover(hit, x, y, false);\n if (hit && scene) {\n const e = hoverEvent(scene, hit);\n if (e) emit(\"click\", e);\n activate(hit);\n }\n };\n\n const onPointerCancel = () => {\n press = null;\n updateTooltip();\n };\n\n const onPointerLeave = (event: PointerEvent) => {\n if (event.pointerType === \"touch\") return;\n press = null;\n if (hover && !hover.keyboard) setHover(null, 0, 0, false);\n };\n\n const focusItem = (next: ShapeHover | null) => {\n if (!scene || !next) return;\n const anchor = hoverAnchor(scene, next) ?? { x: 0, y: 0 };\n setHover(next, anchor.x, anchor.y, true);\n dom.live.textContent = describeItem(scene, next);\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!scene) return;\n const current = hover?.hover ?? null;\n const keys: Record<string, \"next\" | \"prev\" | \"up\" | \"down\"> = {\n ArrowRight: \"next\",\n ArrowLeft: \"prev\",\n ArrowUp: \"up\",\n ArrowDown: \"down\",\n };\n const direction = keys[event.key];\n if (direction) {\n event.preventDefault();\n focusItem(stepHover(scene, current, direction));\n return;\n }\n switch (event.key) {\n case \"Home\":\n case \"End\": {\n const items = scene.items;\n if (!items.length) return;\n event.preventDefault();\n const it = event.key === \"Home\" ? items[0] : items[items.length - 1];\n focusItem(\n scene.type === \"radar\"\n ? { index: it.index, indicator: current?.indicator ?? 0 }\n : { index: it.index },\n );\n break;\n }\n case \"Enter\":\n case \" \": {\n if (!current) return;\n const e = hoverEvent(scene, current);\n if (!e) return;\n event.preventDefault();\n emit(\"click\", e);\n activate(current);\n break;\n }\n case \"Backspace\": {\n if (options.type !== \"sunburst\" || options.drill === false) return;\n const path = runtime.drillPath();\n if (!path.length) return;\n event.preventDefault();\n drill(path.slice(0, -1));\n break;\n }\n case \"Escape\":\n if (hover) {\n event.preventDefault();\n setHover(null, 0, 0, false);\n }\n break;\n default:\n break;\n }\n };\n\n const onFocus = () => {\n let visible: boolean;\n try {\n visible = dom.stage.matches(\":focus-visible\");\n } catch {\n visible = true;\n }\n // inset, like an outline drawn inside the stage edge: the drawing keeps a\n // padding, so the ring never covers labels or leader lines\n if (visible)\n dom.stage.style.boxShadow =\n \"inset 0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n dom.stage.style.boxShadow = \"\";\n if (hover?.keyboard) setHover(null, 0, 0, false);\n };\n\n const stage = dom.stage;\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => schedule())\n : null;\n resizeObserver?.observe(dom.stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n theme = readTheme(dom.root, options.palette);\n renderLegend();\n tipKey = \"\";\n schedule();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n renderLegend();\n updateAccessibility();\n render();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n runtime.setOptions(next);\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join())\n theme = readTheme(dom.root, next.palette);\n if (next.type !== previous.type && hover) setHover(null, 0, 0, false);\n renderLegend();\n updateAccessibility();\n tipKey = \"\";\n schedule();\n },\n resize() {\n if (destroyed) return;\n cancelFrame();\n render();\n },\n refreshTheme,\n toggle,\n getHidden: () => runtime.hiddenIndexes(),\n drill,\n getDrillPath: () => runtime.drillPath(),\n on(type, listener) {\n listeners[type].add(listener);\n return () => {\n listeners[type].delete(listener);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n cancelFrame();\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n resizeObserver?.disconnect();\n unwatchTheme();\n listeners.hover.clear();\n listeners.click.clear();\n listeners.toggle.clear();\n listeners.drill.clear();\n dom.root.remove();\n },\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("../color.cjs"),t=require("../overlay.cjs"),n=require("./labels.cjs"),r=require("./scene.cjs");var i=e=>{let t=[],n=[],i=new Map;for(let r of e.groups??[]){let e=typeof r==`string`?{name:r}:r;e&&typeof e.name==`string`&&(i.has(e.name)||i.set(e.name,t.length),t.push(e.name),n.push(e.color))}let a=new Map;if(e.links){let o=t.length,s=e=>{if(typeof e==`number`)return Number.isInteger(e)&&e>=0&&e<o?e:-1;if(typeof e!=`string`)return-1;let r=i.get(e);return r===void 0?(i.set(e,t.length),t.push(e),n.push(void 0),t.length-1):r},c=[];for(let t of e.links){if(!t)continue;let e=s(t.source),n=s(t.target);e<0||n<0||c.push([e,n,r.positive(t.value),t.color])}let l=t.length,u=t.map(()=>Array(l).fill(0));for(let[e,t,n,r]of c)u[e][t]+=n,r&&a.set(e*l+t,r);return{names:t,colors:n,matrix:u,cellColors:a}}let o=e.matrix??[],s=Math.max(t.length,o.length);for(let e=t.length;e<s;e++)t.push(String(e+1)),n.push(void 0);return{names:t,colors:n,matrix:t.map((e,n)=>t.map((e,t)=>r.positive(o[n]?.[t]))),cellColors:a}},a=e=>{let t=r.uniqueKeys(e.names);return{group:e=>`~${t[e]}`,cell:(e,n)=>`${t[e]}\u2192${t[n]}`}},o=(e,t,n,r)=>e.matrix[n][r]>0&&!(t&&n===r),s=(e,t,n)=>{let r=i(e),s=a(r),c=!!e.directed;r.names.forEach((e,i)=>{n.set(s.group(i),+!t.has(i)),r.names.forEach((e,a)=>{o(r,c,i,a)&&n.set(s.cell(i,a),t.has(i)||t.has(a)?0:r.matrix[i][a])})})},c=(e,t)=>{let n=e.length,r=Array(n).fill(0),i=Array(n).fill(0);for(let a=0;a<n;a++)for(let o=0;o<n;o++)t&&a===o||(r[a]+=e[a][o],i[o]+=e[a][o]);return{out:r,inc:i,value:r.map((e,n)=>t?e+i[n]:e)}},l=e=>{if(!(e>0)||!Number.isFinite(e))return 0;let t=10**Math.floor(Math.log10(e));for(let n of[1,2,5,10])if(n*t>=e*(1-1e-9))return n*t;return 10*t},u=12,d=22,f=(s,f)=>{let{theme:p,area:m,measure:h,hidden:g}=f,_=i(s),{names:v,matrix:y}=_,b=v.length;if(!b)return r.emptyLayout(f);let x=!!s.directed,ee=a(_),S=(e,t)=>o(_,x,e,t),te=y.map((e,t)=>e.map((e,n)=>S(t,n)?Math.max(0,f.value(ee.cell(t,n),g.has(t)||g.has(n)?0:e)):0)),C=y.map((e,t)=>e.map((e,n)=>S(t,n)&&!g.has(t)&&!g.has(n)?e:0)),w=c(te,x),T=c(C,x),ne=T.value.reduce((e,t)=>e+t,0),E=v.map((e,t)=>T.value[t]>0||w.value[t]>1e-9?r.clamp(f.value(ee.group(t),+!g.has(t)),0,1):0),D=w.value.reduce((e,t)=>e+t,0);if(D<=1e-12)return r.emptyLayout(f);let O=c(y.map((e,t)=>e.map((e,n)=>S(t,n)?e:0)),x).value,k=v.map((e,t)=>t);if(s.sortGroups===`ascending`||s.sortGroups===`descending`){let e=s.sortGroups===`ascending`?1:-1;k.sort((t,n)=>e*(O[t]-O[n])||t-n)}let A=Array(b);k.forEach((e,t)=>A[e]=t);let j=m.x+m.width/2,M=m.y+m.height/2,N=Math.min(m.width,m.height)/2,P=s.labels??`auto`,F=t.font(p,u,500),re=t.font(p,10),I=s.ticks,ie=I===!1?!1:typeof I==`number`?I>0:N>=150,L=ie?d:0,R=r.clamp(r.finite(s.padAngle,2),0,45)*(Math.PI/180),z=R*E.reduce((e,t)=>e+t,0),B=z>r.TAU*.5?r.TAU*.5/z:1,V=(r.TAU-z*B)/D,ae=-Math.PI/2+r.finite(s.startAngle)*Math.PI/180,H=Array(b);{let e=ae+R*B*(E[k[0]]??0)/2;for(let t of k){let n=e,r=n+w.value[t]*V;H[t]={a0:n,a1:r},e=r+R*B*E[t]}}let U=e=>H[e].a1-H[e].a0>1e-6,oe=v.map(e=>h(e,F)),se=e=>k.every(t=>!U(t)||oe[t]+6<=(H[t].a1-H[t].a0+R*B*.8)*e),W=P===`none`?`none`:P===`radial`?`radial`:`tangential`;P===`auto`&&!se(Math.max(1,N-12))&&(W=`radial`);let ce=e=>{let t=Math.abs(Math.cos(e)),n=Math.abs(Math.sin(e));return Math.min(t>1e-6?(m.width/2-2)/t:1/0,n>1e-6?(m.height/2-u/2-1)/n:1/0)},le=e=>(H[e].a0+H[e].a1)/2,ue=e=>Math.abs(Math.sin(e))>.92,G;if(W===`radial`){G=N-L-8;for(let e of k)if(U(e)&&E[e]>.5){let t=le(e),n=ue(t)?14:oe[e];G=Math.min(G,ce(t)-n-L-10)}G=Math.max(N*.5,G)}else G=N-L-(W===`none`?0:22)-2;G=Math.max(16,G);let de=r.clamp(r.finite(s.arcWidth,r.clamp(G*.06,8,18)),2,G*.5),fe=G-de,K=Math.max(4,fe-2),q=v.map(()=>[]);for(let e=0;e<b;e++)for(let t=0;t<b;t++)x?S(e,t)&&(q[e].push({j:t,dir:`out`,raw:y[e][t],a0:0,a1:0}),q[t].push({j:e,dir:`in`,raw:y[e][t],a0:0,a1:0})):(S(e,t)||S(t,e))&&q[e].push({j:t,dir:`out`,raw:y[e][t],a0:0,a1:0});let J=s.sortSubgroups??`auto`;q.forEach((e,t)=>{let n=e=>{let n=(A[e]-A[t]+b)%b;return n===0?b/2:n};e.sort((e,t)=>{let r=Number(e.dir===`in`)-Number(t.dir===`in`);return J===`ascending`||J===`descending`?(J===`ascending`?1:-1)*(e.raw-t.raw)||A[e.j]-A[t.j]||r:J===`none`?A[e.j]-A[t.j]||r:n(t.j)-n(e.j)||r});let r=H[t].a0;for(let n of e){let e=n.dir===`out`?te[t][n.j]:te[n.j][t];n.a0=r,n.a1=r+e*V,r=n.a1}});let Y=(e,t,n)=>q[e].find(e=>e.j===t&&e.dir===n),X=v.map((e,t)=>f.color(_.colors[t],t)).map(t=>e.toCss(t)),pe=e.toCss(e.mix(p.grid,p.textMuted,.45)),me=s.ribbonColor??`gradient`,he=r.clamp(r.finite(s.ribbonOpacity,.65),.02,1),ge=Math.min(1,he+.25),_e=s.arrows??x?r.clamp(K*.07,5,12):0,Z=[],ve=(e,t)=>b+e*b+t;for(let e=0;e<b;e++)for(let t=x?0:e;t<b;t++)if(x){if(!S(e,t))continue;let n=Y(e,t,`out`),r=Y(t,e,`in`);n&&r&&Z.push({index:ve(e,t),s:e,t,src:n,tgt:r})}else{if(!S(e,t)&&!S(t,e))continue;let[n,r]=y[t][e]>y[e][t]?[t,e]:[e,t],i=Y(n,r,`out`),a=Y(r,n,`out`);i&&a&&Z.push({index:ve(n,r),s:n,t:r,src:i,tgt:a})}let Q=v.map(()=>[]);for(let e of Z)Q[e.s].push(e.index),e.t!==e.s&&Q[e.t].push(e.index);let $=[],ye=e=>e.src.a1-e.src.a0+(e.tgt.a1-e.tgt.a0);for(let t of Z.slice().sort((e,t)=>ye(t)-ye(e))){if(ye(t)<=1e-6)continue;let n=_.cellColors.get(t.s*b+t.t)??(x?void 0:_.cellColors.get(t.t*b+t.s)),r,i;n?r=i=e.toCss(f.color(n,t.s)):me===`source`?r=i=X[t.s]:me===`target`?r=i=X[t.t]:me===`neutral`?r=i=pe:(r=X[t.s],i=X[t.t]),$.push({kind:`ribbon`,cx:j,cy:M,r:K,s0:t.src.a0,s1:t.src.a1,t0:t.tgt.a0,t1:t.tgt.a1,head:t.s===t.t?0:_e,color0:r,color1:i,alpha:he,activeAlpha:ge,hit:t.index,also:t.s===t.t?[t.s]:[t.s,t.t]})}for(let e of k)U(e)&&$.push({kind:`sector`,cx:j,cy:M,r0:fe,r1:G,a0:H[e].a0,a1:H[e].a1,pad:0,corner:Math.min(2,de/4),fill:X[e],hit:e,also:Q[e],alpha:E[e]});let be=e.toCss(p.textMuted),xe=e.toCss(p.textMuted,.7);if(ie){let e=V*G,t=s.tickFormat??n.localeFormat(f.locale),i=h(t(Math.max(...O)),re)+14,a=typeof I==`number`?I:l(i/Math.max(e,1e-12)),o=D/Math.max(a,1e-12);(!(a>0)||o>240)&&(a=l(D/240));let c=a/5*e>=5?a/5:a/2*e>=5?a/2:a,u=Math.round(a/c),d=G+2,p=G+15,m=-1/0,g=null;for(let n of k){if(!U(n))continue;let{a0:i,a1:a}=H[n],o=Q[n];for(let s=0;;s++){let l=i+s*c*V;if(l>a+1e-9)break;let f=s%u===0,_=f?5:3;if((e*c>=3||f)&&$.push({kind:`line`,points:[j+d*Math.cos(l),M+d*Math.sin(l),j+(d+_)*Math.cos(l),M+(d+_)*Math.sin(l)],color:xe,width:1,hit:n,also:o}),!f)continue;let v=t(s*c),y=(h(v,re)/2+3)/p;l-y<m||g!==null&&l+y>g+r.TAU||(g===null&&(g=l-y),m=l+y,$.push({kind:`text`,x:j+p*Math.cos(l),y:M+p*Math.sin(l),text:v,font:re,color:be,align:`center`,baseline:`middle`,rotate:r.upright(l+Math.PI/2),hit:n,also:o}))}}}if(W!==`none`){let t=G+L+6,n=e.toCss(p.text),i=[],a=(e,t,n,r,i)=>{let a=[],o=Math.max(1,Math.ceil(i/6));for(let s=0;s<=o;s++)a.push([e+n*i*s/o,t+r*i*s/o]);return a},o=e=>i.some(t=>t.some(([t,n])=>e.some(([e,r])=>Math.hypot(t-e,n-r)<15))),s=k.filter(e=>U(e)&&E[e]>.5).sort((e,t)=>w.value[t]-w.value[e]);for(let e of s){let{a0:s,a1:c}=H[e],l=(s+c)/2;if(W===`tangential`){let i=(c-s+R*B*.8)*(t+6)-6,a=r.ellipsize(v[e],i,F,h);if(!a)continue;$.push({kind:`text`,x:j+(t+6)*Math.cos(l),y:M+(t+6)*Math.sin(l),text:a,font:F,color:n,align:`center`,baseline:`middle`,rotate:r.upright(l+Math.PI/2),hit:e,also:Q[e]});continue}let u=j+t*Math.cos(l),d=M+t*Math.sin(l);if(ue(l)){let s=d+Math.sign(Math.sin(l))*7,c=Math.cos(l)>=0?`left`:`right`,f=[`center`,c,c===`left`?`right`:`left`],p=e=>e.every(([e,n])=>Math.hypot(e-j,n-M)>=t+2);for(let t of f){let c=t===`center`?2*Math.min(u-m.x,m.x+m.width-u)-4:t===`left`?m.x+m.width-u-2:u-m.x-2,l=r.ellipsize(v[e],c,F,h);if(!l)continue;let d=h(l,F),f=a(t===`left`?u:t===`right`?u-d:u-d/2,s,1,0,d);if(p(f)&&!o(f)){i.push(f),$.push({kind:`text`,x:u,y:s,text:l,font:F,color:n,align:t,baseline:`middle`,hit:e,also:Q[e]});break}}continue}let f=r.ellipsize(v[e],ce(l)-t-2,F,h);if(!f)continue;let p=a(u,d,Math.cos(l),Math.sin(l),h(f,F));if(o(p))continue;i.push(p);let g=Math.cos(l)>=0;$.push({kind:`text`,x:u,y:d,text:f,font:F,color:n,align:g?`left`:`right`,baseline:`middle`,rotate:g?l:l+Math.PI,hit:e,also:Q[e]})}}let Se=[],Ce=x||y.some((e,t)=>e.some((e,n)=>Math.abs(e-y[n][t])>1e-12));for(let e of k){let t=T.value[e];if(!(t>0)||g.has(e))continue;let n=ne>0?t/ne:0,r=(H[e].a0+H[e].a1)/2;Se.push({index:e,name:v[e],value:t,percent:n,share:f.percent(n),color:X[e],x:j+G*Math.cos(r),y:M+G*Math.sin(r),rows:[...x||!Ce?[{name:f.labels.value,value:f.format(t)}]:[],...Ce?[{name:f.labels.outgoing,value:f.format(T.out[e])},{name:f.labels.incoming,value:f.format(T.inc[e])}]:[],{name:f.labels.share,value:f.percent(n)}]})}let we=C.reduce((e,t)=>e+t.reduce((e,t)=>e+t,0),0),Te=Z.filter(e=>C[e.s][e.t]>0||C[e.t][e.s]>0).sort((e,t)=>A[e.s]-A[t.s]||e.src.a0-t.src.a0||A[e.t]-A[t.t]);for(let e of Te){let t=C[e.s][e.t],n=e.s!==e.t&&C[e.s][e.t]+C[e.t][e.s]>0?y[e.t][e.s]:0,r=we>0?t/we:0,i=v[e.s],a=v[e.t],o=(e.src.a0+e.src.a1)/2,s=(e.tgt.a0+e.tgt.a1)/2,c=e.s===e.t?j+K*.7*Math.cos(o):.25*(j+K*Math.cos(o))+.5*j+.25*(j+K*Math.cos(s)),l=e.s===e.t?M+K*.7*Math.sin(o):.25*(M+K*Math.sin(o))+.5*M+.25*(M+K*Math.sin(s));Se.push({index:e.index,name:e.s===e.t?i:`${i} \u2192 ${a}`,value:t,percent:r,share:f.percent(r),color:X[e.s],x:c,y:l,rows:[{name:f.labels.value,value:f.format(t)},...e.s!==e.t&&(!x||n>0)?[{name:f.labels.reverse,value:f.format(n)}]:[],{name:f.labels.share,value:f.percent(r)}],event:{source:i,target:a,reverseValue:n}})}let Ee=r.clamp(f.enter,0,1);return{nodes:$,items:Se,dim:.25,empty:!1,...Ee<1?{enter:{alpha:Ee,scale:.94+.06*Ee,cx:j,cy:M}}:{}}};exports.chordValues=s,exports.layoutChord=f,exports.resolveChord=i;
2
+ //# sourceMappingURL=chord.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chord.cjs","names":["positive","uniqueKeys","emptyLayout","clamp","font","finite","TAU","toCss","mix","localeFormat","upright","ellipsize","require_color","require_overlay","require_labels","require_scene","resolveChord","names","colors","byName","g","o","group","cellColors","declared","resolve","end","known","flows","l","s","t","n","matrix","v","color","rows","i","j","chordKeys","keys","m","isFlow","directed","chordValues","k","out","hidden","totals","inc","niceCeil","raw","base","f","LABEL_FONT_SIZE","TICK_BAND","layoutChord","c","model","flow","shown","row","target","now","goal","whole","a","b","visibleWeight","sumNow","allGoal","order","sign","pos","p","cx","area","cy","half","labelMode","nameFont","theme","tickFont","tickOption","showTicks","tickBand","pad","padTotal","padScale","start","arcs","a0","a1","drawnGroup","nameW","measure","name","fitsTangential","r","mode","reach","cos","sin","midOf","horizontal","outer","need","arcWidth","inner","ribbonR","segments","sortSub","offset","d","list","dir","segment","css","col","neutral","colorMode","opacity","activeAlpha","head","ribbons","ribbonIndex","src","tgt","ribbonsOf","nodes","width","own","c0","c1","muted","tickColor","unitPx","tickFormat","labelPx","major","count","minor","perMajor","tickR","labelR","lastEnd","firstStart","also","isMajor","len","text","halfAngle","nameR","placed","samples","pts","steps","length","x","dx","y","dy","collides","other","u","byValue","mid","room","ax","ay","outward","aligns","clear","py","align","w","right","items","asymmetric","value","percent","flowTotal","ribbonItems","reverse","source","ms","mt","enter"],"sources":["../../../../../charts/src/engine/shapes/chord.ts"],"sourcesContent":["// Chord diagram layout: groups as arcs around a circle (sized by their\n// flows), flows as ribbons between the arcs. Undirected: one ribbon per pair\n// whose ends are as wide as the flow leaving each end; directed: one ribbon\n// per direction, optionally with an arrowhead at the target. Ribbon ends are\n// ordered along each arc so that ribbons cross as little as possible.\n\nimport { mix, toCss, type Rgba } from \"../color\";\nimport { font } from \"../overlay\";\nimport { localeFormat } from \"./labels\";\nimport {\n clamp,\n ellipsize,\n emptyLayout,\n finite,\n positive,\n TAU,\n uniqueKeys,\n upright,\n type LayoutContext,\n type LayoutResult,\n type ShapeItem,\n type ShapeNode,\n} from \"./scene\";\nimport type { ChordChartOptions } from \"./types\";\n\n/** Groups, flow matrix and ribbon colors of a chord diagram */\nexport interface ChordModel {\n names: string[];\n colors: (string | undefined)[];\n /** `matrix[i][j]`: flow from group i to group j (non-negative) */\n matrix: number[][];\n /** Custom ribbon colors, by `i * n + j` */\n cellColors: Map<number, string>;\n}\n\n/**\n * Resolves the groups (declared, then the ones only named by links) and\n * the square flow matrix (from `links`, else `matrix`)\n */\nexport const resolveChord = (o: ChordChartOptions): ChordModel => {\n const names: string[] = [];\n const colors: (string | undefined)[] = [];\n const byName = new Map<string, number>();\n for (const g of o.groups ?? []) {\n const group = typeof g === \"string\" ? { name: g } : g;\n if (!group || typeof group.name !== \"string\") continue;\n if (!byName.has(group.name)) byName.set(group.name, names.length);\n names.push(group.name);\n colors.push(group.color);\n }\n const cellColors = new Map<number, string>();\n if (o.links) {\n const declared = names.length;\n const resolve = (end: string | number): number => {\n if (typeof end === \"number\")\n return Number.isInteger(end) && end >= 0 && end < declared ? end : -1;\n if (typeof end !== \"string\") return -1;\n const known = byName.get(end);\n if (known !== undefined) return known;\n byName.set(end, names.length);\n names.push(end);\n colors.push(undefined);\n return names.length - 1;\n };\n const flows: [number, number, number, string | undefined][] = [];\n for (const l of o.links) {\n if (!l) continue;\n const s = resolve(l.source);\n const t = resolve(l.target);\n if (s < 0 || t < 0) continue;\n flows.push([s, t, positive(l.value), l.color]);\n }\n const n = names.length;\n const matrix = names.map(() => new Array<number>(n).fill(0));\n for (const [s, t, v, color] of flows) {\n matrix[s][t] += v;\n if (color) cellColors.set(s * n + t, color);\n }\n return { names, colors, matrix, cellColors };\n }\n const rows = o.matrix ?? [];\n const n = Math.max(names.length, rows.length);\n for (let i = names.length; i < n; i++) {\n names.push(String(i + 1));\n colors.push(undefined);\n }\n const matrix = names.map((_, i) =>\n names.map((__, j) => positive(rows[i]?.[j])),\n );\n return { names, colors, matrix, cellColors };\n};\n\n/** Keys of the animated quantities: `~group` (shown 0-1) and `group→group` */\nconst chordKeys = (m: ChordModel) => {\n const keys = uniqueKeys(m.names);\n return {\n group: (i: number) => `~${keys[i]}`,\n cell: (i: number, j: number) => `${keys[i]}\\u2192${keys[j]}`,\n };\n};\n\n/** Whether a cell is a flow of the diagram (directed: self flows are ignored) */\nconst isFlow = (m: ChordModel, directed: boolean, i: number, j: number) =>\n m.matrix[i][j] > 0 && !(directed && i === j);\n\nexport const chordValues = (\n o: ChordChartOptions,\n hidden: ReadonlySet<number>,\n out: Map<string, number>,\n) => {\n const m = resolveChord(o);\n const k = chordKeys(m);\n const directed = !!o.directed;\n m.names.forEach((_, i) => {\n out.set(k.group(i), hidden.has(i) ? 0 : 1);\n m.names.forEach((__, j) => {\n if (isFlow(m, directed, i, j))\n out.set(\n k.cell(i, j),\n hidden.has(i) || hidden.has(j) ? 0 : m.matrix[i][j],\n );\n });\n });\n};\n\n/** Totals of a matrix: outgoing, incoming and arc value of every group */\nconst totals = (matrix: readonly (readonly number[])[], directed: boolean) => {\n const n = matrix.length;\n const out = new Array<number>(n).fill(0);\n const inc = new Array<number>(n).fill(0);\n for (let i = 0; i < n; i++)\n for (let j = 0; j < n; j++) {\n if (directed && i === j) continue;\n out[i] += matrix[i][j];\n inc[j] += matrix[i][j];\n }\n return {\n out,\n inc,\n value: out.map((v, i) => (directed ? v + inc[i] : v)),\n };\n};\n\n/** Smallest of 1, 2, 5 × 10^k not below `raw` */\nconst niceCeil = (raw: number) => {\n if (!(raw > 0) || !Number.isFinite(raw)) return 0;\n const base = Math.pow(10, Math.floor(Math.log10(raw)));\n for (const f of [1, 2, 5, 10])\n if (f * base >= raw * (1 - 1e-9)) return f * base;\n return 10 * base;\n};\n\n/** An end of a ribbon on an arc */\ninterface Segment {\n /** Other group of the flow */\n j: number;\n /** `out`: flow from this group to `j`; `in`: flow from `j` to this group */\n dir: \"out\" | \"in\";\n /** Target (not animated) size, used to sort */\n raw: number;\n a0: number;\n a1: number;\n}\n\nconst LABEL_FONT_SIZE = 12;\nconst TICK_BAND = 22;\n\nexport const layoutChord = (\n o: ChordChartOptions,\n c: LayoutContext,\n): LayoutResult => {\n const { theme, area, measure, hidden } = c;\n const model = resolveChord(o);\n const { names, matrix: raw } = model;\n const n = names.length;\n if (!n) return emptyLayout(c);\n const directed = !!o.directed;\n const keys = chordKeys(model);\n const flow = (i: number, j: number) => isFlow(model, directed, i, j);\n\n // displayed (animated) flows, and the targets (hidden groups count as 0)\n const shown = raw.map((row, i) =>\n row.map((v, j) =>\n flow(i, j)\n ? Math.max(\n 0,\n c.value(keys.cell(i, j), hidden.has(i) || hidden.has(j) ? 0 : v),\n )\n : 0,\n ),\n );\n const target = raw.map((row, i) =>\n row.map((v, j) => (flow(i, j) && !hidden.has(i) && !hidden.has(j) ? v : 0)),\n );\n const now = totals(shown, directed);\n const goal = totals(target, directed);\n const whole = goal.value.reduce((a, b) => a + b, 0);\n const visibleWeight = names.map((_, i) =>\n goal.value[i] > 0 || now.value[i] > 1e-9\n ? clamp(c.value(keys.group(i), hidden.has(i) ? 0 : 1), 0, 1)\n : 0,\n );\n const sumNow = now.value.reduce((a, b) => a + b, 0);\n if (sumNow <= 1e-12) return emptyLayout(c);\n\n // order of the groups around the circle\n const allGoal = totals(\n raw.map((row, i) => row.map((v, j) => (flow(i, j) ? v : 0))),\n directed,\n ).value;\n const order = names.map((_, i) => i);\n if (o.sortGroups === \"ascending\" || o.sortGroups === \"descending\") {\n const sign = o.sortGroups === \"ascending\" ? 1 : -1;\n order.sort((a, b) => sign * (allGoal[a] - allGoal[b]) || a - b);\n }\n const pos = new Array<number>(n);\n order.forEach((g, p) => (pos[g] = p));\n\n // radii: arcs, ticks and labels from the center out\n const cx = area.x + area.width / 2;\n const cy = area.y + area.height / 2;\n const half = Math.min(area.width, area.height) / 2;\n const labelMode = o.labels ?? \"auto\";\n const nameFont = font(theme, LABEL_FONT_SIZE, 500);\n const tickFont = font(theme, 10);\n const tickOption = o.ticks;\n const showTicks =\n tickOption === false\n ? false\n : typeof tickOption === \"number\"\n ? tickOption > 0\n : half >= 150;\n const tickBand = showTicks ? TICK_BAND : 0;\n const pad = clamp(finite(o.padAngle, 2), 0, 45) * (Math.PI / 180);\n const padTotal = pad * visibleWeight.reduce((a, b) => a + b, 0);\n const padScale = padTotal > TAU * 0.5 ? (TAU * 0.5) / padTotal : 1;\n const k = (TAU - padTotal * padScale) / sumNow;\n const start = -Math.PI / 2 + (finite(o.startAngle) * Math.PI) / 180;\n\n // group arcs (angles only; the radius comes with the labels)\n const arcs: { a0: number; a1: number }[] = new Array(n);\n {\n let a = start + (pad * padScale * (visibleWeight[order[0]] ?? 0)) / 2;\n for (const g of order) {\n const a0 = a;\n const a1 = a0 + now.value[g] * k;\n arcs[g] = { a0, a1 };\n a = a1 + pad * padScale * visibleWeight[g];\n }\n }\n const drawnGroup = (g: number) => arcs[g].a1 - arcs[g].a0 > 1e-6;\n\n // labels: tangential when every name fits its arc (auto), else radial\n const nameW = names.map((name) => measure(name, nameFont));\n const fitsTangential = (r: number) =>\n order.every(\n (g) =>\n !drawnGroup(g) ||\n nameW[g] + 6 <= (arcs[g].a1 - arcs[g].a0 + pad * padScale * 0.8) * r,\n );\n let mode: \"tangential\" | \"radial\" | \"none\" =\n labelMode === \"none\"\n ? \"none\"\n : labelMode === \"radial\"\n ? \"radial\"\n : \"tangential\";\n const tangentialRoom = LABEL_FONT_SIZE + 10;\n if (labelMode === \"auto\" && !fitsTangential(Math.max(1, half - 12)))\n mode = \"radial\";\n // distance from the center to the edge of the area along an angle\n const reach = (a: number) => {\n const cos = Math.abs(Math.cos(a));\n const sin = Math.abs(Math.sin(a));\n return Math.min(\n cos > 1e-6 ? (area.width / 2 - 2) / cos : Infinity,\n sin > 1e-6 ? (area.height / 2 - LABEL_FONT_SIZE / 2 - 1) / sin : Infinity,\n );\n };\n const midOf = (g: number) => (arcs[g].a0 + arcs[g].a1) / 2;\n // radial names near 12 and 6 o'clock are written horizontally: they then\n // need one line of height instead of their whole width\n const horizontal = (a: number) => Math.abs(Math.sin(a)) > 0.92;\n let outer: number;\n if (mode === \"radial\") {\n // the largest radius leaving each name room along its ray (a wide area\n // gives the names on the sides more room), but not below half the size;\n // names that still do not fit are shortened\n outer = half - tickBand - 8;\n for (const g of order)\n if (drawnGroup(g) && visibleWeight[g] > 0.5) {\n const a = midOf(g);\n const need = horizontal(a) ? LABEL_FONT_SIZE + 2 : nameW[g];\n outer = Math.min(outer, reach(a) - need - tickBand - 10);\n }\n outer = Math.max(half * 0.5, outer);\n } else {\n outer = half - tickBand - (mode === \"none\" ? 0 : tangentialRoom) - 2;\n }\n outer = Math.max(16, outer);\n const arcWidth = clamp(\n finite(o.arcWidth, clamp(outer * 0.06, 8, 18)),\n 2,\n outer * 0.5,\n );\n const inner = outer - arcWidth;\n const ribbonR = Math.max(4, inner - 2);\n\n // ribbon ends along each arc\n const segments: Segment[][] = names.map(() => []);\n for (let i = 0; i < n; i++)\n for (let j = 0; j < n; j++) {\n if (directed) {\n if (flow(i, j)) {\n segments[i].push({ j, dir: \"out\", raw: raw[i][j], a0: 0, a1: 0 });\n segments[j].push({ j: i, dir: \"in\", raw: raw[i][j], a0: 0, a1: 0 });\n }\n } else if (flow(i, j) || flow(j, i)) {\n segments[i].push({ j, dir: \"out\", raw: raw[i][j], a0: 0, a1: 0 });\n }\n }\n const sortSub = o.sortSubgroups ?? \"auto\";\n segments.forEach((list, i) => {\n // `auto`: flows toward the groups just after this one (clockwise) end\n // the arc, those toward the groups just before start it\n const offset = (j: number) => {\n const d = (pos[j] - pos[i] + n) % n;\n return d === 0 ? n / 2 : d;\n };\n list.sort((a, b) => {\n const dir = Number(a.dir === \"in\") - Number(b.dir === \"in\");\n if (sortSub === \"ascending\" || sortSub === \"descending\") {\n const s = sortSub === \"ascending\" ? 1 : -1;\n return s * (a.raw - b.raw) || pos[a.j] - pos[b.j] || dir;\n }\n if (sortSub === \"none\") return pos[a.j] - pos[b.j] || dir;\n return offset(b.j) - offset(a.j) || dir;\n });\n let a = arcs[i].a0;\n for (const s of list) {\n const v = s.dir === \"out\" ? shown[i][s.j] : shown[s.j][i];\n s.a0 = a;\n s.a1 = a + v * k;\n a = s.a1;\n }\n });\n const segment = (g: number, j: number, dir: \"out\" | \"in\") =>\n segments[g].find((s) => s.j === j && s.dir === dir);\n\n // colors\n const colors: Rgba[] = names.map((_, i) => c.color(model.colors[i], i));\n const css = colors.map((col) => toCss(col));\n const neutral = toCss(mix(theme.grid, theme.textMuted, 0.45));\n const colorMode = o.ribbonColor ?? \"gradient\";\n const opacity = clamp(finite(o.ribbonOpacity, 0.65), 0.02, 1);\n const activeAlpha = Math.min(1, opacity + 0.25);\n const head = (o.arrows ?? directed) ? clamp(ribbonR * 0.07, 5, 12) : 0;\n\n // ribbons: [source, target] by item index\n interface Ribbon {\n index: number;\n s: number;\n t: number;\n src: Segment;\n tgt: Segment;\n }\n const ribbons: Ribbon[] = [];\n const ribbonIndex = (s: number, t: number) => n + s * n + t;\n for (let i = 0; i < n; i++)\n for (let j = directed ? 0 : i; j < n; j++) {\n if (directed) {\n if (!flow(i, j)) continue;\n const src = segment(i, j, \"out\");\n const tgt = segment(j, i, \"in\");\n if (src && tgt)\n ribbons.push({ index: ribbonIndex(i, j), s: i, t: j, src, tgt });\n } else {\n if (!flow(i, j) && !flow(j, i)) continue;\n // the larger direction is the source\n const [s, t] = raw[j][i] > raw[i][j] ? [j, i] : [i, j];\n const src = segment(s, t, \"out\");\n const tgt = segment(t, s, \"out\");\n if (src && tgt)\n ribbons.push({ index: ribbonIndex(s, t), s, t, src, tgt });\n }\n }\n const ribbonsOf = names.map(() => [] as number[]);\n for (const r of ribbons) {\n ribbonsOf[r.s].push(r.index);\n if (r.t !== r.s) ribbonsOf[r.t].push(r.index);\n }\n\n const nodes: ShapeNode[] = [];\n const width = (r: Ribbon) => r.src.a1 - r.src.a0 + (r.tgt.a1 - r.tgt.a0);\n for (const r of ribbons.slice().sort((a, b) => width(b) - width(a))) {\n if (width(r) <= 1e-6) continue;\n const own =\n model.cellColors.get(r.s * n + r.t) ??\n (directed ? undefined : model.cellColors.get(r.t * n + r.s));\n let c0: string;\n let c1: string;\n if (own) c0 = c1 = toCss(c.color(own, r.s));\n else if (colorMode === \"source\") c0 = c1 = css[r.s];\n else if (colorMode === \"target\") c0 = c1 = css[r.t];\n else if (colorMode === \"neutral\") c0 = c1 = neutral;\n else {\n c0 = css[r.s];\n c1 = css[r.t];\n }\n nodes.push({\n kind: \"ribbon\",\n cx,\n cy,\n r: ribbonR,\n s0: r.src.a0,\n s1: r.src.a1,\n t0: r.tgt.a0,\n t1: r.tgt.a1,\n head: r.s === r.t ? 0 : head,\n color0: c0,\n color1: c1,\n alpha: opacity,\n activeAlpha,\n hit: r.index,\n also: r.s === r.t ? [r.s] : [r.s, r.t],\n });\n }\n\n // group arcs\n for (const g of order) {\n if (!drawnGroup(g)) continue;\n nodes.push({\n kind: \"sector\",\n cx,\n cy,\n r0: inner,\n r1: outer,\n a0: arcs[g].a0,\n a1: arcs[g].a1,\n pad: 0,\n corner: Math.min(2, arcWidth / 4),\n fill: css[g],\n hit: g,\n also: ribbonsOf[g],\n alpha: visibleWeight[g],\n });\n }\n\n // value ticks: minor ticks, labelled major ticks where the labels fit\n const muted = toCss(theme.textMuted);\n const tickColor = toCss(theme.textMuted, 0.7);\n if (showTicks) {\n const unitPx = k * outer;\n const tickFormat = o.tickFormat ?? localeFormat(c.locale);\n const sample = tickFormat(Math.max(...allGoal));\n const labelPx = measure(sample, tickFont) + 14;\n let major =\n typeof tickOption === \"number\"\n ? tickOption\n : niceCeil(labelPx / Math.max(unitPx, 1e-12));\n // keep the number of ticks reasonable\n const count = sumNow / Math.max(major, 1e-12);\n if (!(major > 0) || count > 240) major = niceCeil(sumNow / 240);\n const minor =\n (major / 5) * unitPx >= 5\n ? major / 5\n : (major / 2) * unitPx >= 5\n ? major / 2\n : major;\n const perMajor = Math.round(major / minor);\n const tickR = outer + 2;\n const labelR = outer + 15;\n let lastEnd = -Infinity;\n let firstStart: number | null = null;\n for (const g of order) {\n if (!drawnGroup(g)) continue;\n const { a0, a1 } = arcs[g];\n const also = ribbonsOf[g];\n for (let m = 0; ; m++) {\n const a = a0 + m * minor * k;\n if (a > a1 + 1e-9) break;\n const isMajor = m % perMajor === 0;\n const len = isMajor ? 5 : 3;\n if (unitPx * minor >= 3 || isMajor)\n nodes.push({\n kind: \"line\",\n points: [\n cx + tickR * Math.cos(a),\n cy + tickR * Math.sin(a),\n cx + (tickR + len) * Math.cos(a),\n cy + (tickR + len) * Math.sin(a),\n ],\n color: tickColor,\n width: 1,\n hit: g,\n also,\n });\n if (!isMajor) continue;\n const text = tickFormat(m * minor);\n const halfAngle = (measure(text, tickFont) / 2 + 3) / labelR;\n if (a - halfAngle < lastEnd) continue;\n if (firstStart !== null && a + halfAngle > firstStart + TAU) continue;\n if (firstStart === null) firstStart = a - halfAngle;\n lastEnd = a + halfAngle;\n nodes.push({\n kind: \"text\",\n x: cx + labelR * Math.cos(a),\n y: cy + labelR * Math.sin(a),\n text,\n font: tickFont,\n color: muted,\n align: \"center\",\n baseline: \"middle\",\n rotate: upright(a + Math.PI / 2),\n hit: g,\n also,\n });\n }\n }\n }\n\n // group names\n if (mode !== \"none\") {\n const nameR = outer + tickBand + 6;\n const color = toCss(theme.text);\n // placed names as sample points along their baseline: two names collide\n // when samples are closer than a line height (works for any rotation)\n const placed: [number, number][][] = [];\n const lineGap = LABEL_FONT_SIZE + 3;\n const samples = (\n x: number,\n y: number,\n dx: number,\n dy: number,\n length: number,\n ) => {\n const pts: [number, number][] = [];\n const steps = Math.max(1, Math.ceil(length / 6));\n for (let s = 0; s <= steps; s++)\n pts.push([\n x + (dx * length * s) / steps,\n y + (dy * length * s) / steps,\n ]);\n return pts;\n };\n const collides = (pts: [number, number][]) =>\n placed.some((other) =>\n other.some(([x, y]) =>\n pts.some(([u, v]) => Math.hypot(x - u, y - v) < lineGap),\n ),\n );\n // biggest first, so collisions drop the small groups\n const byValue = order\n .filter((g) => drawnGroup(g) && visibleWeight[g] > 0.5)\n .sort((a, b) => now.value[b] - now.value[a]);\n for (const g of byValue) {\n const { a0, a1 } = arcs[g];\n const mid = (a0 + a1) / 2;\n if (mode === \"tangential\") {\n const room = (a1 - a0 + pad * padScale * 0.8) * (nameR + 6) - 6;\n const text = ellipsize(names[g], room, nameFont, measure);\n if (!text) continue;\n nodes.push({\n kind: \"text\",\n x: cx + (nameR + 6) * Math.cos(mid),\n y: cy + (nameR + 6) * Math.sin(mid),\n text,\n font: nameFont,\n color,\n align: \"center\",\n baseline: \"middle\",\n rotate: upright(mid + Math.PI / 2),\n hit: g,\n also: ribbonsOf[g],\n });\n continue;\n }\n const ax = cx + nameR * Math.cos(mid);\n const ay = cy + nameR * Math.sin(mid);\n if (horizontal(mid)) {\n // above (12 o'clock) or below (6 o'clock): centered on the arc, else\n // extending away from the vertical axis, else toward it; the text must\n // clear the tick ring and the names already placed\n const y = ay + Math.sign(Math.sin(mid)) * (LABEL_FONT_SIZE / 2 + 1);\n const outward = Math.cos(mid) >= 0 ? \"left\" : \"right\";\n const aligns: (\"center\" | \"left\" | \"right\")[] = [\n \"center\",\n outward,\n outward === \"left\" ? \"right\" : \"left\",\n ];\n const clear = (pts: [number, number][]) =>\n pts.every(([x, py]) => Math.hypot(x - cx, py - cy) >= nameR + 2);\n for (const align of aligns) {\n const room =\n align === \"center\"\n ? 2 * Math.min(ax - area.x, area.x + area.width - ax) - 4\n : align === \"left\"\n ? area.x + area.width - ax - 2\n : ax - area.x - 2;\n const text = ellipsize(names[g], room, nameFont, measure);\n if (!text) continue;\n const w = measure(text, nameFont);\n const x0 =\n align === \"left\" ? ax : align === \"right\" ? ax - w : ax - w / 2;\n const pts = samples(x0, y, 1, 0, w);\n if (!clear(pts) || collides(pts)) continue;\n placed.push(pts);\n nodes.push({\n kind: \"text\",\n x: ax,\n y,\n text,\n font: nameFont,\n color,\n align,\n baseline: \"middle\",\n hit: g,\n also: ribbonsOf[g],\n });\n break;\n }\n continue;\n }\n const text = ellipsize(\n names[g],\n reach(mid) - nameR - 2,\n nameFont,\n measure,\n );\n if (!text) continue;\n const pts = samples(\n ax,\n ay,\n Math.cos(mid),\n Math.sin(mid),\n measure(text, nameFont),\n );\n if (collides(pts)) continue;\n placed.push(pts);\n const right = Math.cos(mid) >= 0;\n nodes.push({\n kind: \"text\",\n x: ax,\n y: ay,\n text,\n font: nameFont,\n color,\n align: right ? \"left\" : \"right\",\n baseline: \"middle\",\n rotate: right ? mid : mid + Math.PI,\n hit: g,\n also: ribbonsOf[g],\n });\n }\n }\n\n // items: groups around the circle, then the ribbons by source\n const items: ShapeItem[] = [];\n const asymmetric =\n directed ||\n raw.some((row, i) => row.some((v, j) => Math.abs(v - raw[j][i]) > 1e-12));\n for (const g of order) {\n const value = goal.value[g];\n if (!(value > 0) || hidden.has(g)) continue;\n const percent = whole > 0 ? value / whole : 0;\n const mid = (arcs[g].a0 + arcs[g].a1) / 2;\n items.push({\n index: g,\n name: names[g],\n value,\n percent,\n share: c.percent(percent),\n color: css[g],\n x: cx + outer * Math.cos(mid),\n y: cy + outer * Math.sin(mid),\n rows: [\n ...(directed || !asymmetric\n ? [{ name: c.labels.value, value: c.format(value) }]\n : []),\n ...(asymmetric\n ? [\n { name: c.labels.outgoing, value: c.format(goal.out[g]) },\n { name: c.labels.incoming, value: c.format(goal.inc[g]) },\n ]\n : []),\n { name: c.labels.share, value: c.percent(percent) },\n ],\n });\n }\n const flowTotal = target.reduce(\n (s, row) => s + row.reduce((a, b) => a + b, 0),\n 0,\n );\n const ribbonItems = ribbons\n .filter((r) => target[r.s][r.t] > 0 || target[r.t][r.s] > 0)\n .sort(\n (a, b) =>\n pos[a.s] - pos[b.s] || a.src.a0 - b.src.a0 || pos[a.t] - pos[b.t],\n );\n for (const r of ribbonItems) {\n const value = target[r.s][r.t];\n const reverse =\n r.s !== r.t && target[r.s][r.t] + target[r.t][r.s] > 0\n ? raw[r.t][r.s]\n : 0;\n const percent = flowTotal > 0 ? value / flowTotal : 0;\n const source = names[r.s];\n const tgt = names[r.t];\n const ms = (r.src.a0 + r.src.a1) / 2;\n const mt = (r.tgt.a0 + r.tgt.a1) / 2;\n // middle of the quadratic curve between the two ends\n const x =\n r.s === r.t\n ? cx + ribbonR * 0.7 * Math.cos(ms)\n : 0.25 * (cx + ribbonR * Math.cos(ms)) +\n 0.5 * cx +\n 0.25 * (cx + ribbonR * Math.cos(mt));\n const y =\n r.s === r.t\n ? cy + ribbonR * 0.7 * Math.sin(ms)\n : 0.25 * (cy + ribbonR * Math.sin(ms)) +\n 0.5 * cy +\n 0.25 * (cy + ribbonR * Math.sin(mt));\n items.push({\n index: r.index,\n name: r.s === r.t ? source : `${source} \\u2192 ${tgt}`,\n value,\n percent,\n share: c.percent(percent),\n color: css[r.s],\n x,\n y,\n rows: [\n { name: c.labels.value, value: c.format(value) },\n ...(r.s !== r.t && (!directed || reverse > 0)\n ? [{ name: c.labels.reverse, value: c.format(reverse) }]\n : []),\n { name: c.labels.share, value: c.percent(percent) },\n ],\n event: { source, target: tgt, reverseValue: reverse },\n });\n }\n\n const enter = clamp(c.enter, 0, 1);\n return {\n nodes,\n items,\n dim: 0.25,\n empty: false,\n ...(enter < 1\n ? { enter: { alpha: enter, scale: 0.94 + 0.06 * enter, cx, cy } }\n : {}),\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { LayoutContext, LayoutResult } from './scene.cjs';
2
+ import { ChordChartOptions } from './types.cjs';
3
+ /** Groups, flow matrix and ribbon colors of a chord diagram */
4
+ export interface ChordModel {
5
+ names: string[];
6
+ colors: (string | undefined)[];
7
+ /** `matrix[i][j]`: flow from group i to group j (non-negative) */
8
+ matrix: number[][];
9
+ /** Custom ribbon colors, by `i * n + j` */
10
+ cellColors: Map<number, string>;
11
+ }
12
+ /**
13
+ * Resolves the groups (declared, then the ones only named by links) and
14
+ * the square flow matrix (from `links`, else `matrix`)
15
+ */
16
+ export declare const resolveChord: (o: ChordChartOptions) => ChordModel;
17
+ export declare const chordValues: (o: ChordChartOptions, hidden: ReadonlySet<number>, out: Map<string, number>) => void;
18
+ export declare const layoutChord: (o: ChordChartOptions, c: LayoutContext) => LayoutResult;
@@ -0,0 +1,18 @@
1
+ import { LayoutContext, LayoutResult } from './scene.js';
2
+ import { ChordChartOptions } from './types.js';
3
+ /** Groups, flow matrix and ribbon colors of a chord diagram */
4
+ export interface ChordModel {
5
+ names: string[];
6
+ colors: (string | undefined)[];
7
+ /** `matrix[i][j]`: flow from group i to group j (non-negative) */
8
+ matrix: number[][];
9
+ /** Custom ribbon colors, by `i * n + j` */
10
+ cellColors: Map<number, string>;
11
+ }
12
+ /**
13
+ * Resolves the groups (declared, then the ones only named by links) and
14
+ * the square flow matrix (from `links`, else `matrix`)
15
+ */
16
+ export declare const resolveChord: (o: ChordChartOptions) => ChordModel;
17
+ export declare const chordValues: (o: ChordChartOptions, hidden: ReadonlySet<number>, out: Map<string, number>) => void;
18
+ export declare const layoutChord: (o: ChordChartOptions, c: LayoutContext) => LayoutResult;