minerva-design 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (824) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +3072 -611
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1491 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +595 -5
  7. package/dist/charts/canvas.d.cts +4 -3
  8. package/dist/charts/canvas.d.ts +4 -3
  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 +155 -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 +370 -255
  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 +34 -1
  34. package/dist/charts/engine/controller.d.ts +34 -1
  35. package/dist/charts/engine/controller.js +318 -273
  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 +1708 -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 +339 -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 +76 -0
  82. package/dist/charts/engine/graph/force.d.ts +76 -0
  83. package/dist/charts/engine/graph/force.js +423 -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 +50 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +50 -0
  89. package/dist/charts/engine/graph/geometry.js +197 -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 +52 -0
  104. package/dist/charts/engine/graph/model.d.ts +52 -0
  105. package/dist/charts/engine/graph/model.js +108 -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 +640 -0
  120. package/dist/charts/engine/graph/types.d.ts +640 -0
  121. package/dist/charts/engine/graph/worker.cjs +52 -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 +135 -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.d.cts +17 -0
  136. package/dist/charts/engine/labels.d.ts +17 -0
  137. package/dist/charts/engine/labels.js +28 -4
  138. package/dist/charts/engine/labels.js.map +1 -1
  139. package/dist/charts/engine/layout.cjs +1 -1
  140. package/dist/charts/engine/layout.cjs.map +1 -1
  141. package/dist/charts/engine/layout.d.cts +9 -0
  142. package/dist/charts/engine/layout.d.ts +9 -0
  143. package/dist/charts/engine/layout.js +11 -2
  144. package/dist/charts/engine/layout.js.map +1 -1
  145. package/dist/charts/engine/model.cjs +1 -1
  146. package/dist/charts/engine/model.cjs.map +1 -1
  147. package/dist/charts/engine/model.d.cts +73 -3
  148. package/dist/charts/engine/model.d.ts +73 -3
  149. package/dist/charts/engine/model.js +258 -154
  150. package/dist/charts/engine/model.js.map +1 -1
  151. package/dist/charts/engine/orderbook/field.cjs +37 -0
  152. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  153. package/dist/charts/engine/orderbook/field.d.cts +92 -0
  154. package/dist/charts/engine/orderbook/field.d.ts +92 -0
  155. package/dist/charts/engine/orderbook/field.js +297 -0
  156. package/dist/charts/engine/orderbook/field.js.map +1 -0
  157. package/dist/charts/engine/orderbook/format.cjs +1 -1
  158. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  159. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  160. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  161. package/dist/charts/engine/orderbook/format.js +5 -5
  162. package/dist/charts/engine/orderbook/format.js.map +1 -1
  163. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  164. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  165. package/dist/charts/engine/orderbook/heatmap.js +566 -475
  166. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  167. package/dist/charts/engine/orderbook/host.cjs +1 -1
  168. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  169. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  170. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  171. package/dist/charts/engine/orderbook/host.js +27 -5
  172. package/dist/charts/engine/orderbook/host.js.map +1 -1
  173. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  174. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  175. package/dist/charts/engine/orderbook/ladder.js +1 -1
  176. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  177. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  178. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  179. package/dist/charts/engine/orderbook/layout.d.cts +42 -0
  180. package/dist/charts/engine/orderbook/layout.d.ts +42 -0
  181. package/dist/charts/engine/orderbook/layout.js +76 -0
  182. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  183. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  184. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  185. package/dist/charts/engine/orderbook/tape.js +4 -4
  186. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  187. package/dist/charts/engine/orderbook/types.d.cts +27 -3
  188. package/dist/charts/engine/orderbook/types.d.ts +27 -3
  189. package/dist/charts/engine/overlay.cjs +1 -1
  190. package/dist/charts/engine/overlay.cjs.map +1 -1
  191. package/dist/charts/engine/overlay.d.cts +27 -0
  192. package/dist/charts/engine/overlay.d.ts +27 -0
  193. package/dist/charts/engine/overlay.js +34 -12
  194. package/dist/charts/engine/overlay.js.map +1 -1
  195. package/dist/charts/engine/presets.cjs +2 -2
  196. package/dist/charts/engine/presets.cjs.map +1 -1
  197. package/dist/charts/engine/presets.d.cts +35 -3
  198. package/dist/charts/engine/presets.d.ts +35 -3
  199. package/dist/charts/engine/presets.js +121 -101
  200. package/dist/charts/engine/presets.js.map +1 -1
  201. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  202. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  203. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  204. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  205. package/dist/charts/engine/renderers/detect.cjs +1 -1
  206. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  207. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  208. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  209. package/dist/charts/engine/renderers/detect.js +23 -21
  210. package/dist/charts/engine/renderers/detect.js.map +1 -1
  211. package/dist/charts/engine/renderers/follow.cjs +2 -0
  212. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  213. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  214. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  215. package/dist/charts/engine/renderers/follow.js +10 -0
  216. package/dist/charts/engine/renderers/follow.js.map +1 -0
  217. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  218. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  219. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  220. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  221. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  222. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  223. package/dist/charts/engine/renderers/gl.cjs +1 -1
  224. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  225. package/dist/charts/engine/renderers/gl.js +1 -1
  226. package/dist/charts/engine/renderers/gl.js.map +1 -1
  227. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  228. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  229. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  230. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  231. package/dist/charts/engine/renderers/shaders.js +9 -6
  232. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  233. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  234. package/dist/charts/engine/renderers/types.d.cts +2 -0
  235. package/dist/charts/engine/renderers/types.d.ts +2 -0
  236. package/dist/charts/engine/renderers/types.js.map +1 -1
  237. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  238. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  239. package/dist/charts/engine/renderers/webgl.js +85 -64
  240. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  241. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  242. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  243. package/dist/charts/engine/renderers/webgl2.js +72 -58
  244. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  245. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  246. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  247. package/dist/charts/engine/renderers/webgpu.js +1 -1
  248. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  249. package/dist/charts/engine/scene.cjs +1 -1
  250. package/dist/charts/engine/scene.cjs.map +1 -1
  251. package/dist/charts/engine/scene.d.cts +104 -4
  252. package/dist/charts/engine/scene.d.ts +104 -4
  253. package/dist/charts/engine/scene.js +412 -193
  254. package/dist/charts/engine/scene.js.map +1 -1
  255. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  256. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  257. package/dist/charts/engine/shapes/bullet.js +110 -110
  258. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  259. package/dist/charts/engine/shapes/chart.cjs +1 -1
  260. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  261. package/dist/charts/engine/shapes/chart.js +4 -1
  262. package/dist/charts/engine/shapes/chart.js.map +1 -1
  263. package/dist/charts/engine/shapes/chord.cjs +2 -0
  264. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  265. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  266. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  267. package/dist/charts/engine/shapes/chord.js +419 -0
  268. package/dist/charts/engine/shapes/chord.js.map +1 -0
  269. package/dist/charts/engine/shapes/draw.cjs +1 -1
  270. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  271. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  272. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  273. package/dist/charts/engine/shapes/draw.js +47 -17
  274. package/dist/charts/engine/shapes/draw.js.map +1 -1
  275. package/dist/charts/engine/shapes/hit.cjs +1 -1
  276. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  277. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  278. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  279. package/dist/charts/engine/shapes/hit.js +75 -46
  280. package/dist/charts/engine/shapes/hit.js.map +1 -1
  281. package/dist/charts/engine/shapes/index.d.cts +3 -2
  282. package/dist/charts/engine/shapes/index.d.ts +3 -2
  283. package/dist/charts/engine/shapes/labels.cjs +1 -1
  284. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  285. package/dist/charts/engine/shapes/labels.js +12 -4
  286. package/dist/charts/engine/shapes/labels.js.map +1 -1
  287. package/dist/charts/engine/shapes/layout.cjs +2 -2
  288. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  289. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  290. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  291. package/dist/charts/engine/shapes/layout.js +106 -78
  292. package/dist/charts/engine/shapes/layout.js.map +1 -1
  293. package/dist/charts/engine/shapes/scene.cjs +1 -1
  294. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  295. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  296. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  297. package/dist/charts/engine/shapes/scene.js +62 -19
  298. package/dist/charts/engine/shapes/scene.js.map +1 -1
  299. package/dist/charts/engine/shapes/types.d.cts +121 -8
  300. package/dist/charts/engine/shapes/types.d.ts +121 -8
  301. package/dist/charts/engine/signature.cjs +1 -1
  302. package/dist/charts/engine/signature.cjs.map +1 -1
  303. package/dist/charts/engine/signature.js +1 -1
  304. package/dist/charts/engine/signature.js.map +1 -1
  305. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  306. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  307. package/dist/charts/engine/three-d/canvas2d.d.cts +41 -3
  308. package/dist/charts/engine/three-d/canvas2d.d.ts +41 -3
  309. package/dist/charts/engine/three-d/canvas2d.js +166 -67
  310. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  311. package/dist/charts/engine/three-d/chart.cjs +1 -1
  312. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  313. package/dist/charts/engine/three-d/chart.js +219 -215
  314. package/dist/charts/engine/three-d/chart.js.map +1 -1
  315. package/dist/charts/engine/three-d/detect.cjs +1 -1
  316. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  317. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  318. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  319. package/dist/charts/engine/three-d/detect.js +22 -20
  320. package/dist/charts/engine/three-d/detect.js.map +1 -1
  321. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  322. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  323. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  324. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  325. package/dist/charts/engine/three-d/geometry.js +106 -90
  326. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  327. package/dist/charts/engine/three-d/model.cjs +1 -1
  328. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  329. package/dist/charts/engine/three-d/model.d.cts +2 -0
  330. package/dist/charts/engine/three-d/model.d.ts +2 -0
  331. package/dist/charts/engine/three-d/model.js +2 -0
  332. package/dist/charts/engine/three-d/model.js.map +1 -1
  333. package/dist/charts/engine/three-d/oit.cjs +109 -0
  334. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  335. package/dist/charts/engine/three-d/oit.d.cts +34 -0
  336. package/dist/charts/engine/three-d/oit.d.ts +34 -0
  337. package/dist/charts/engine/three-d/oit.js +111 -0
  338. package/dist/charts/engine/three-d/oit.js.map +1 -0
  339. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  340. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  341. package/dist/charts/engine/three-d/overlay.js +43 -36
  342. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  343. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  344. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  345. package/dist/charts/engine/three-d/render-types.d.cts +37 -3
  346. package/dist/charts/engine/three-d/render-types.d.ts +37 -3
  347. package/dist/charts/engine/three-d/render-types.js +6 -10
  348. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  349. package/dist/charts/engine/three-d/shaders.cjs +109 -48
  350. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  351. package/dist/charts/engine/three-d/shaders.d.cts +12 -5
  352. package/dist/charts/engine/three-d/shaders.d.ts +12 -5
  353. package/dist/charts/engine/three-d/shaders.js +118 -55
  354. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  355. package/dist/charts/engine/three-d/sort.cjs +1 -1
  356. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  357. package/dist/charts/engine/three-d/sort.d.cts +18 -5
  358. package/dist/charts/engine/three-d/sort.d.ts +18 -5
  359. package/dist/charts/engine/three-d/sort.js +129 -43
  360. package/dist/charts/engine/three-d/sort.js.map +1 -1
  361. package/dist/charts/engine/three-d/types.d.cts +36 -0
  362. package/dist/charts/engine/three-d/types.d.ts +36 -0
  363. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  364. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  365. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  366. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  367. package/dist/charts/engine/three-d/webgl.js +199 -74
  368. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  369. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  370. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  371. package/dist/charts/engine/three-d/webgpu.js +231 -94
  372. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  373. package/dist/charts/engine/trading/chart.cjs +1 -1
  374. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  375. package/dist/charts/engine/trading/chart.d.cts +10 -1
  376. package/dist/charts/engine/trading/chart.d.ts +10 -1
  377. package/dist/charts/engine/trading/chart.js +1677 -813
  378. package/dist/charts/engine/trading/chart.js.map +1 -1
  379. package/dist/charts/engine/trading/drawings.cjs +2 -1
  380. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  381. package/dist/charts/engine/trading/drawings.d.cts +53 -9
  382. package/dist/charts/engine/trading/drawings.d.ts +53 -9
  383. package/dist/charts/engine/trading/drawings.js +346 -71
  384. package/dist/charts/engine/trading/drawings.js.map +1 -1
  385. package/dist/charts/engine/trading/format.cjs +1 -1
  386. package/dist/charts/engine/trading/format.cjs.map +1 -1
  387. package/dist/charts/engine/trading/format.d.cts +19 -0
  388. package/dist/charts/engine/trading/format.d.ts +19 -0
  389. package/dist/charts/engine/trading/format.js +65 -21
  390. package/dist/charts/engine/trading/format.js.map +1 -1
  391. package/dist/charts/engine/trading/geometry.cjs +1 -1
  392. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  393. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  394. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  395. package/dist/charts/engine/trading/geometry.js +19 -4
  396. package/dist/charts/engine/trading/geometry.js.map +1 -1
  397. package/dist/charts/engine/trading/index.cjs +1 -1
  398. package/dist/charts/engine/trading/index.d.cts +2 -1
  399. package/dist/charts/engine/trading/index.d.ts +2 -1
  400. package/dist/charts/engine/trading/index.js +4 -3
  401. package/dist/charts/engine/trading/indicators.cjs +1 -1
  402. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  403. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  404. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  405. package/dist/charts/engine/trading/indicators.js +449 -173
  406. package/dist/charts/engine/trading/indicators.js.map +1 -1
  407. package/dist/charts/engine/trading/labels.cjs +1 -1
  408. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  409. package/dist/charts/engine/trading/labels.js +104 -4
  410. package/dist/charts/engine/trading/labels.js.map +1 -1
  411. package/dist/charts/engine/trading/store.cjs +1 -1
  412. package/dist/charts/engine/trading/store.cjs.map +1 -1
  413. package/dist/charts/engine/trading/store.d.cts +21 -0
  414. package/dist/charts/engine/trading/store.d.ts +21 -0
  415. package/dist/charts/engine/trading/store.js +22 -1
  416. package/dist/charts/engine/trading/store.js.map +1 -1
  417. package/dist/charts/engine/trading/studies.cjs +1 -1
  418. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  419. package/dist/charts/engine/trading/studies.d.cts +49 -8
  420. package/dist/charts/engine/trading/studies.d.ts +49 -8
  421. package/dist/charts/engine/trading/studies.js +352 -93
  422. package/dist/charts/engine/trading/studies.js.map +1 -1
  423. package/dist/charts/engine/trading/sync.cjs +2 -0
  424. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  425. package/dist/charts/engine/trading/sync.d.cts +8 -0
  426. package/dist/charts/engine/trading/sync.d.ts +8 -0
  427. package/dist/charts/engine/trading/sync.js +25 -0
  428. package/dist/charts/engine/trading/sync.js.map +1 -0
  429. package/dist/charts/engine/trading/types.d.cts +514 -16
  430. package/dist/charts/engine/trading/types.d.ts +514 -16
  431. package/dist/charts/engine/types.d.cts +106 -11
  432. package/dist/charts/engine/types.d.ts +106 -11
  433. package/dist/charts/index.cjs +1 -1
  434. package/dist/charts/index.d.cts +3 -2
  435. package/dist/charts/index.d.ts +3 -2
  436. package/dist/charts/index.js +30 -22
  437. package/dist/charts/react/charts.cjs +1 -1
  438. package/dist/charts/react/charts.cjs.map +1 -1
  439. package/dist/charts/react/charts.js +51 -34
  440. package/dist/charts/react/charts.js.map +1 -1
  441. package/dist/charts/react/graph.cjs +2 -0
  442. package/dist/charts/react/graph.cjs.map +1 -0
  443. package/dist/charts/react/graph.d.cts +219 -0
  444. package/dist/charts/react/graph.d.ts +219 -0
  445. package/dist/charts/react/graph.js +160 -0
  446. package/dist/charts/react/graph.js.map +1 -0
  447. package/dist/charts/react/orderbook.cjs +1 -1
  448. package/dist/charts/react/orderbook.cjs.map +1 -1
  449. package/dist/charts/react/orderbook.d.cts +3 -1
  450. package/dist/charts/react/orderbook.d.ts +3 -1
  451. package/dist/charts/react/orderbook.js +1 -0
  452. package/dist/charts/react/orderbook.js.map +1 -1
  453. package/dist/charts/react/shapes.cjs +1 -1
  454. package/dist/charts/react/shapes.cjs.map +1 -1
  455. package/dist/charts/react/shapes.d.cts +88 -4
  456. package/dist/charts/react/shapes.d.ts +88 -4
  457. package/dist/charts/react/shapes.js +55 -12
  458. package/dist/charts/react/shapes.js.map +1 -1
  459. package/dist/charts/react/three-d.cjs +1 -1
  460. package/dist/charts/react/three-d.cjs.map +1 -1
  461. package/dist/charts/react/three-d.d.cts +7 -0
  462. package/dist/charts/react/three-d.d.ts +7 -0
  463. package/dist/charts/react/three-d.js +14 -13
  464. package/dist/charts/react/three-d.js.map +1 -1
  465. package/dist/charts/react/trading.cjs +1 -1
  466. package/dist/charts/react/trading.cjs.map +1 -1
  467. package/dist/charts/react/trading.d.cts +54 -2
  468. package/dist/charts/react/trading.d.ts +54 -2
  469. package/dist/charts/react/trading.js +68 -37
  470. package/dist/charts/react/trading.js.map +1 -1
  471. package/dist/charts/react/types.d.cts +11 -0
  472. package/dist/charts/react/types.d.ts +11 -0
  473. package/dist/core/contracts.cjs +1 -1
  474. package/dist/core/contracts.cjs.map +1 -1
  475. package/dist/core/contracts.js +1 -1
  476. package/dist/core/contracts.js.map +1 -1
  477. package/dist/native/charts/src/canvas.cjs +1 -1
  478. package/dist/native/charts/src/canvas.js +5 -4
  479. package/dist/native/charts/src/engine/axis.cjs +1 -1
  480. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  481. package/dist/native/charts/src/engine/axis.js +42 -19
  482. package/dist/native/charts/src/engine/axis.js.map +1 -1
  483. package/dist/native/charts/src/engine/color.cjs +1 -1
  484. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  485. package/dist/native/charts/src/engine/color.js +47 -5
  486. package/dist/native/charts/src/engine/color.js.map +1 -1
  487. package/dist/native/charts/src/engine/controller.cjs +2 -2
  488. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  489. package/dist/native/charts/src/engine/controller.js +296 -251
  490. package/dist/native/charts/src/engine/controller.js.map +1 -1
  491. package/dist/native/charts/src/engine/data.cjs +1 -1
  492. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  493. package/dist/native/charts/src/engine/data.js +6 -4
  494. package/dist/native/charts/src/engine/data.js.map +1 -1
  495. package/dist/native/charts/src/engine/format.cjs +1 -1
  496. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  497. package/dist/native/charts/src/engine/format.js +15 -2
  498. package/dist/native/charts/src/engine/format.js.map +1 -1
  499. package/dist/native/charts/src/engine/labels.cjs +1 -1
  500. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  501. package/dist/native/charts/src/engine/labels.js +42 -5
  502. package/dist/native/charts/src/engine/labels.js.map +1 -1
  503. package/dist/native/charts/src/engine/layout.cjs +1 -1
  504. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  505. package/dist/native/charts/src/engine/layout.js +11 -2
  506. package/dist/native/charts/src/engine/layout.js.map +1 -1
  507. package/dist/native/charts/src/engine/model.cjs +1 -1
  508. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  509. package/dist/native/charts/src/engine/model.js +278 -174
  510. package/dist/native/charts/src/engine/model.js.map +1 -1
  511. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  512. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  513. package/dist/native/charts/src/engine/presets.cjs +2 -2
  514. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  515. package/dist/native/charts/src/engine/presets.js +110 -90
  516. package/dist/native/charts/src/engine/presets.js.map +1 -1
  517. package/dist/native/charts/src/engine/scene.cjs +1 -1
  518. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  519. package/dist/native/charts/src/engine/scene.js +421 -202
  520. package/dist/native/charts/src/engine/scene.js.map +1 -1
  521. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  522. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  523. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  524. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  525. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  526. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  527. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  528. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  529. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  530. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  531. package/dist/native/charts/src/engine/shapes/chord.js +419 -0
  532. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  533. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  534. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  535. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  536. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  537. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  538. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  539. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  540. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  541. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  542. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  543. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  544. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  545. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  546. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  547. package/dist/native/charts/src/engine/shapes/layout.js +136 -94
  548. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  549. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  550. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  551. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  552. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  553. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  554. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  555. package/dist/native/components/Chart/ChartBase.js +127 -115
  556. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  557. package/dist/native/components/Chart/charts.cjs +1 -1
  558. package/dist/native/components/Chart/charts.cjs.map +1 -1
  559. package/dist/native/components/Chart/charts.js +8 -5
  560. package/dist/native/components/Chart/charts.js.map +1 -1
  561. package/dist/native/components/Chart/scene.cjs +1 -1
  562. package/dist/native/components/Chart/scene.cjs.map +1 -1
  563. package/dist/native/components/Chart/scene.d.cts +6 -1
  564. package/dist/native/components/Chart/scene.d.ts +6 -1
  565. package/dist/native/components/Chart/scene.js +226 -108
  566. package/dist/native/components/Chart/scene.js.map +1 -1
  567. package/dist/native/components/Chart/types.d.cts +7 -1
  568. package/dist/native/components/Chart/types.d.ts +7 -1
  569. package/dist/native/components/Charts/charts.cjs +1 -1
  570. package/dist/native/components/Charts/charts.cjs.map +1 -1
  571. package/dist/native/components/Charts/charts.js +60 -43
  572. package/dist/native/components/Charts/charts.js.map +1 -1
  573. package/dist/native/components/Charts/types.d.cts +11 -0
  574. package/dist/native/components/Charts/types.d.ts +11 -0
  575. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  576. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  577. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  578. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  579. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -106
  580. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  581. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  582. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  583. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  584. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  585. package/dist/native/components/ShapeChart/charts.js +138 -96
  586. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  587. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  588. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  589. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  590. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  591. package/dist/native/components/ShapeChart/draw.js +26 -17
  592. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  593. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  594. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  595. package/dist/native/components/ShapeChart/geometry.js +233 -70
  596. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  597. package/dist/native/components/ShapeChart/index.cjs +1 -1
  598. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  599. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  600. package/dist/native/components/ShapeChart/index.js +2 -2
  601. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  602. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  603. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  604. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  605. package/dist/native/components/ShapeChart/recorder.js +19 -10
  606. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  607. package/dist/native/components/ShapeChart/types.d.cts +95 -8
  608. package/dist/native/components/ShapeChart/types.d.ts +95 -8
  609. package/dist/native/index.cjs +1 -1
  610. package/dist/native/index.js +2 -2
  611. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  612. package/dist/native/source/components/Chart/charts.tsx +10 -3
  613. package/dist/native/source/components/Chart/scene.tsx +243 -14
  614. package/dist/native/source/components/Chart/types.ts +7 -0
  615. package/dist/native/source/components/Charts/charts.tsx +37 -2
  616. package/dist/native/source/components/Charts/types.ts +11 -0
  617. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -34
  618. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  619. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  620. package/dist/native/source/components/ShapeChart/geometry.ts +376 -25
  621. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  622. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  623. package/dist/native/source/components/ShapeChart/types.ts +99 -6
  624. package/dist/native/source/manifest.ts +1 -0
  625. package/dist/taro/chart-a11y.d.ts +7 -0
  626. package/dist/taro/charts.d.ts +29 -6
  627. package/dist/taro/index.js +3129 -1902
  628. package/dist/taro/shape-charts.d.ts +99 -5
  629. package/dist/uni/AreaChart.vue +2 -1
  630. package/dist/uni/AreaChart.vue.d.ts +5 -1
  631. package/dist/uni/Badge.vue.d.ts +1 -1
  632. package/dist/uni/BarChart.vue +2 -1
  633. package/dist/uni/BarChart.vue.d.ts +5 -1
  634. package/dist/uni/BoxPlotChart.vue +2 -1
  635. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  636. package/dist/uni/BubbleChart.vue +2 -1
  637. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  638. package/dist/uni/BulletChart.vue.d.ts +4 -0
  639. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  640. package/dist/uni/CandlestickChart.vue +2 -1
  641. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  642. package/dist/uni/Chart.vue +2 -1
  643. package/dist/uni/Chart.vue.d.ts +4 -0
  644. package/dist/uni/ChordChart.vue +93 -0
  645. package/dist/uni/ChordChart.vue.d.ts +136 -0
  646. package/dist/uni/Divider.vue.d.ts +1 -1
  647. package/dist/uni/DonutChart.vue.d.ts +5 -1
  648. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  649. package/dist/uni/GanttChart.vue +2 -1
  650. package/dist/uni/GanttChart.vue.d.ts +15 -0
  651. package/dist/uni/GaugeChart.vue.d.ts +5 -1
  652. package/dist/uni/HeatmapChart.vue +2 -1
  653. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  654. package/dist/uni/HistogramChart.vue +2 -1
  655. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  656. package/dist/uni/HorizontalBarChart.vue +2 -1
  657. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  658. package/dist/uni/LineChart.vue +2 -1
  659. package/dist/uni/LineChart.vue.d.ts +4 -0
  660. package/dist/uni/MixedChart.vue +2 -1
  661. package/dist/uni/MixedChart.vue.d.ts +4 -0
  662. package/dist/uni/PieChart.vue.d.ts +5 -1
  663. package/dist/uni/QuadrantChart.vue +2 -1
  664. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  665. package/dist/uni/RadarChart.vue.d.ts +4 -0
  666. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  667. package/dist/uni/RangeAreaChart.vue +2 -1
  668. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  669. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  670. package/dist/uni/ScatterChart.vue +2 -1
  671. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  672. package/dist/uni/Sparkline.vue +2 -1
  673. package/dist/uni/Sparkline.vue.d.ts +4 -0
  674. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  675. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  676. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  677. package/dist/uni/WaterfallChart.vue +2 -1
  678. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  679. package/dist/uni/chart-a11y.d.ts +7 -0
  680. package/dist/uni/chart-a11y.js +29 -0
  681. package/dist/uni/chart-canvas.d.ts +12 -0
  682. package/dist/uni/chart-canvas.js +15 -1
  683. package/dist/uni/chart-types.d.ts +36 -5
  684. package/dist/uni/chart-types.js +31 -3
  685. package/dist/uni/charts-canvas.js +3 -2
  686. package/dist/uni/index.d.ts +2 -1
  687. package/dist/uni/index.js +1 -0
  688. package/dist/uni/manifest.d.ts +7 -0
  689. package/dist/uni/manifest.js +10 -0
  690. package/dist/uni/named-chart-options.d.ts +11 -2
  691. package/dist/uni/named-chart-options.js +21 -1
  692. package/dist/uni/shape-chart-canvas.d.ts +3 -3
  693. package/dist/uni/shape-chart-canvas.js +17 -58
  694. package/dist/uni/shape-chart-types.d.ts +53 -3
  695. package/dist/uni/shape-chart-types.js +45 -1
  696. package/dist/vue/charts-global.d.ts +48 -0
  697. package/dist/vue/charts.d.ts +18 -0
  698. package/dist/vue/charts.js +56 -0
  699. package/dist/vue/charts.js.map +1 -0
  700. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  701. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  702. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  703. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  704. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  705. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  706. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  707. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  708. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  709. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  710. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +181 -0
  711. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  712. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  713. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  714. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  715. package/dist/vue/components/Chart/GanttChart.vue.d.ts +19 -0
  716. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  717. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +12 -1
  718. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  719. package/dist/vue/components/Chart/GraphChart.vue.d.ts +186 -0
  720. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  721. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  722. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  723. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  724. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  725. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  726. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  727. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  728. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  729. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  730. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  731. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  732. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  733. package/dist/vue/components/Chart/TradingChart.vue.d.ts +58 -1
  734. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  735. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  736. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  737. package/dist/vue/components/Chart/TreeChart.vue.d.ts +174 -0
  738. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  739. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  740. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  741. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  742. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  743. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  744. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  745. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  746. package/dist/vue/components/Chart/graph.d.ts +156 -0
  747. package/dist/vue/components/Chart/graph.js +137 -0
  748. package/dist/vue/components/Chart/graph.js.map +1 -0
  749. package/dist/vue/components/Chart/index.d.ts +5 -1
  750. package/dist/vue/components/Chart/index.js +5 -1
  751. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  752. package/dist/vue/components/Chart/orderbook.js +2 -0
  753. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  754. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  755. package/dist/vue/components/Chart/three-d.js +2 -0
  756. package/dist/vue/components/Chart/three-d.js.map +1 -1
  757. package/dist/vue/components/Chart/trading.d.ts +30 -3
  758. package/dist/vue/components/Chart/trading.js +9 -0
  759. package/dist/vue/components/Chart/trading.js.map +1 -1
  760. package/dist/vue/components/Chart/types.d.ts +74 -2
  761. package/dist/vue/global.d.ts +2 -38
  762. package/dist/vue/groups/charts.js +10 -2
  763. package/dist/vue/groups/charts.js.map +1 -1
  764. package/dist/vue/index.js +6 -2
  765. package/dist/vue/internal/register.d.ts +7 -0
  766. package/dist/vue/internal/register.js +14 -0
  767. package/dist/vue/internal/register.js.map +1 -0
  768. package/dist/vue/plugin.d.ts +9 -4
  769. package/dist/vue/plugin.js +6 -11
  770. package/dist/vue/plugin.js.map +1 -1
  771. package/dist/weapp/area-chart/index.wxml +1 -1
  772. package/dist/weapp/bar-chart/index.wxml +1 -1
  773. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  774. package/dist/weapp/bubble-chart/index.wxml +1 -1
  775. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  776. package/dist/weapp/chart/index.wxml +1 -1
  777. package/dist/weapp/charts/canvas.js +1987 -175
  778. package/dist/weapp/charts/core.js +3 -0
  779. package/dist/weapp/chord-chart/index.js +1 -0
  780. package/dist/weapp/chord-chart/index.json +1 -0
  781. package/dist/weapp/chord-chart/index.wxml +1 -0
  782. package/dist/weapp/chord-chart/index.wxss +1 -0
  783. package/dist/weapp/controls.js +148 -57
  784. package/dist/weapp/gantt-chart/index.wxml +1 -1
  785. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  786. package/dist/weapp/histogram-chart/index.wxml +1 -1
  787. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  788. package/dist/weapp/line-chart/index.wxml +1 -1
  789. package/dist/weapp/mixed-chart/index.wxml +1 -1
  790. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  791. package/dist/weapp/range-area-chart/index.wxml +1 -1
  792. package/dist/weapp/scatter-chart/index.wxml +1 -1
  793. package/dist/weapp/sparkline/index.wxml +1 -1
  794. package/dist/weapp/types.d.ts +96 -4
  795. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  796. package/dist/web-components/components/chart/charts.d.ts +4 -2
  797. package/dist/web-components/components/chart/charts.js +8 -1
  798. package/dist/web-components/components/chart/charts.js.map +1 -1
  799. package/dist/web-components/components/chart/extended.d.ts +21 -7
  800. package/dist/web-components/components/chart/extended.js +29 -9
  801. package/dist/web-components/components/chart/extended.js.map +1 -1
  802. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  803. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  804. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  805. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  806. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  807. package/dist/web-components/components/graph/graph.d.ts +156 -0
  808. package/dist/web-components/components/graph/graph.js +150 -0
  809. package/dist/web-components/components/graph/graph.js.map +1 -0
  810. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  811. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  812. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  813. package/dist/web-components/elements/chart.d.ts +1 -1
  814. package/dist/web-components/elements/chart.js +6 -5
  815. package/dist/web-components/elements/chart.js.map +1 -1
  816. package/dist/web-components/elements/graph.d.ts +2 -0
  817. package/dist/web-components/elements/graph.js +12 -0
  818. package/dist/web-components/elements/graph.js.map +1 -0
  819. package/dist/web-components/html-custom-data.json +318 -4
  820. package/dist/web-components/types/react.d.ts +63 -4
  821. package/dist/web-components/types/solid.d.ts +55 -8
  822. package/dist/web-components/types/svelte.d.ts +55 -8
  823. package/dist/web-components/types/vue.d.ts +55 -4
  824. package/package.json +16 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chart.js","names":["LAYOUTS","TREE_TYPES","HALO_LIMIT","PARALLEL_BOW","EDGE_INDEX_MIN","TWEEN_MS","VIEW_TWEEN_MS","BOX_FONT_MIN","KEY_ZOOM","BUTTON_ZOOM","wheelFactor","pixels","deltaMode","deltaY","pinch","ease","t","pointBuffer","data","length","ensure","extra","next","x","y","points","i","resolveLayout","layout","layoutSignature","o","createGraphChart","doc","container","win","dom","createGraphDom","stage","options","initialOptions","theme","readTheme","dark","isDark","loc","graphLocale","destroyed","listeners","emit","type","fn","event","listening","reducedMotion","now","model","buildModel","layoutType","direction","layoutSig","sizing","X","Y","TX","TY","FX","FY","visible","prevVisible","tween","tweenT","tree","dag","circ","runner","forcePending","collapsedIds","hiddenGroups","critical","descendants","paths","pathsDirty","geometryVersion","sceneDirty","items","version","nodeColor","edgeColor","edgeWidth","edgeArrow","edgeDashed","groupColor","criticalColor","edgeLabelWidth","k","tx","ty","viewTween","userMoved","needsFit","fitAnimate","drawnOnce","followLayout","width","height","hover","focusIndex","focusVisible","selection","highlight","highlightKey","renderer","rendererToken","resolveReady","ready","resolve","frameId","interaction","c","isTree","collapsible","animationMs","a","highlightMode","edgeStyle","s","flow","resolveColor","value","fallback","parseColor","mix","measureCtx","measure","font","text","snapshot","map","stopRunner","collapsedSet","set","id","treeInput","w","h","startForce","follow","fixed","known","node","p","prev","e","j","radius","range","weight","mean","v","edge","alpha","sw","sh","init","forceInit","f","animate","workerOption","useWorker","sim","forceKernel","emitLayoutEnd","createForceRunner","invalidate","wasPending","runLayout","previousType","n","depth","ones","tidyTreeLayout","computeSizing","nextVisible","tx2","ty2","d","layeredLayout","levelGap","TREE_LEVEL_GAP","spacing","input","arcPositions","circularPositions","oldVisible","countDescendants","ms","from","refreshCritical","refreshColors","updateAccessibility","renderLegend","counts","order","q","option","nodes","edges","path","longestPath","ids","bg","palette","g","branch","roots","stack","b","neutral","mode","wOption","eRange","wMin","wMax","arrows","fade","isBox","NodeKind","port","vertical","sign","trimmed","ux","uy","l0","ex","ey","endDirection","boundaryDistance","trimPath","loopAngle","angles","dx","dy","end","best","angle","gap","loopSize","loopOf","box","at","loopPath","edgePath","arrow","bend","parallel","rise","arcPath","bow","style","mx","my","quadraticPath","tension","cx","cy","rs","rt","as","rm","out","cubicPoints","route","pts","along","dir","bottom","left","bus","mid","roundCorners","orthogonalPath","splinePath","refreshPaths","straightEnds","len","updateHighlight","sources","edgeHover","key","lineage","neighborhood","buildScene","minPx","hl","layers","bucket","packColor","color","layer","arrowLen","filledLen","filled","heads","tmp","head","arrowHead","GAP","buf","filledArrow","ends","l","line","dashPath","item","nodeFill","halo","fills","rings","collapsedFill","selRings","avatars","boxBuckets","outlines","radiusPx","showHalo","drawOrder","selected","hovered","hasVisibleChild","solid","crit","border","body","pad","okey","list","scatter","count","buffer","f32","u32","bars","half","late","frame","transform","dpr","animating","target","fitView","approachView","k0","x0","y0","k1","x1","y1","kk","c0x","c0y","c1x","c1y","bw","bh","sizeCanvas","drawOverlay","positionTooltip","screenX","screenY","ellipsize","max","ctx","lo","hi","textColorOn","luminance","family","toCss","muted","bgCss","cols","rows","grid","free","c0","c1","r0","r1","mark","r","onScreen","sx","margin","sy","showBoxText","natural","size","avatar","maxWidth","subSize","block","subtitle","titleY","label","labelOf","sub","initial","collapsed","active","bx","by","label2","priority","drawn","budget","drawLabel","force","strong","dim","raw","tw","place","placement","bx0","by0","bx1","by1","edgeMode","shownEdges","lit","pointAt","pathLength","lw","all","below","radial","flip","inner","right","maxLabel","hw","hh","reach","lx","ly","pl","pr","pt","pb","aw","ah","ox","oy","zoomLimits","fit","to","rate","setView","zoomAround","nk","factor","ratio","legendKey","named","show","config","toggle","focused","hidden","toggleGroup","swatch","group","fill","setHover","role","labels","keyboard","ia","lines","names","controls","pickGrid","pickCell","maxExtent","pickKey","buildPickGrid","pickNode","wx","px","wy","py","tol","minR","bestD","pickEdge","test","distanceToPath","index","edgeIndex","cell","visit","start","stamp","edgeGrid","current","m","segment","segments","span","register","ax","ay","steps","pass","cursor","pickAt","tooltipEnabled","hoverEvent","offsetX","offsetY","hit","sameHit","renderTooltip","tooltipTarget","tip","custom","content","defaultTooltip","ev","th","row","el","name","header","title","fragment","tag","dot","hoverFrame","pendingHover","scheduleHover","drag","setSelection","notify","selectNode","multi","additive","setCollapsed","collapse","kept","pointers","local","pinchInfo","onPointerDown","center","base","onPointerMove","scale","distance","nx","ny","startForceFrom","onPointerUp","was","handleClick","onPointerCancel","onPointerLeave","hintTimer","showHint","mac","onWheel","onDoubleClick","instance","onFocus","onBlur","drawnNodes","setFocus","degree","neighborInDirection","bestScore","vx","vy","across","score","startingNode","first","onKeyDown","onZoomIn","onZoomOut","onFit","resizeObserver","refreshTheme","fontChanged","themeColorsChanged","unwatchTheme","watchTheme","unwatchLocale","watchLocale","resolveLocale","initRenderer","token","createRenderer","canvas","kind","exclude","initialState","applySelectedOption","unfollowDefault","followDefaultRenderer","replaceData","focusId","dataChanged","previous","sig","changed","opts","nodeId","listener"],"sources":["../../../../../charts/src/engine/graph/chart.ts"],"sourcesContent":["// createGraphChart: relationship networks, dependency DAGs and trees. Nodes\n// and edges are drawn by a GPU backend (WebGPU -> WebGL2 -> WebGL) or by\n// Canvas2D through the shared renderer contract (edges = polylines, nodes =\n// discs and rounded boxes); labels, badges and the focus ring are a 2D\n// canvas above them. Layouts: force (Barnes–Hut, optional worker), layered\n// DAG, tidy / radial / mind map / org trees, circular and arc diagrams.\n\nimport {\n luminance,\n mix,\n packColor,\n parseColor,\n toCss,\n type Rgba,\n} from \"../color\";\nimport { resolveLocale, watchLocale } from \"../locale\";\nimport { createRenderer } from \"../renderers/detect\";\nimport { followDefaultRenderer } from \"../renderers/follow\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n GAP,\n SCATTER_STRIDE,\n type AreaItem,\n type BarItem,\n type ChartRenderer,\n type LineItem,\n type RenderItem,\n type ScatterItem,\n} from \"../renderers/types\";\nimport {\n readTheme,\n themeColorsChanged,\n watchTheme,\n type ChartTheme,\n} from \"../theme\";\nimport type { ChartRendererKind } from \"../types\";\nimport { arcPositions, circularPositions } from \"./circular\";\nimport { layeredLayout, longestPath } from \"./dag\";\nimport { createGraphDom, sizeCanvas, style, swatch } from \"./dom\";\nimport { forceInit, forceKernel } from \"./force\";\nimport {\n arcPath,\n arrowHead,\n boundaryDistance,\n cubicPoints,\n dashPath,\n distanceToPath,\n endDirection,\n filledArrow,\n loopPath,\n orthogonalPath,\n pathLength,\n pointAt,\n quadraticPath,\n roundCorners,\n splinePath,\n trimPath,\n} from \"./geometry\";\nimport { fill, graphLocale, type GraphLocale } from \"./labels\";\nimport { buildModel, lineage, neighborhood, type GraphModel } from \"./model\";\nimport {\n LABEL_FONT_SIZE,\n NodeKind,\n computeSizing,\n labelOf,\n type NodeSizing,\n} from \"./sizing\";\nimport { TREE_LEVEL_GAP, tidyTreeLayout, type TreeType } from \"./tree\";\nimport type {\n GraphCircularLayoutResult,\n GraphDagLayoutResult,\n GraphChartEventMap,\n GraphChartInstance,\n GraphChartOptions,\n GraphDirection,\n GraphEdgeStyle,\n GraphHoverEvent,\n GraphInteractionOptions,\n GraphLayoutType,\n GraphPoint,\n GraphTreeLayoutResult,\n} from \"./types\";\nimport {\n WORKER_THRESHOLD,\n createForceRunner,\n type ForceRunner,\n} from \"./worker\";\n\nconst LAYOUTS: readonly GraphLayoutType[] = [\n \"force\",\n \"dag\",\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n \"circular\",\n \"arc\",\n \"none\",\n];\n\nconst TREE_TYPES = new Set<GraphLayoutType>([\n \"tree\",\n \"radial\",\n \"mindmap\",\n \"org\",\n]);\n\n/** Node halos are skipped above this number of nodes */\nconst HALO_LIMIT = 5000;\n/** Sideways bow of parallel edges per slot, relative to their length */\nconst PARALLEL_BOW = 0.4;\n/** Edge picking uses a spatial index from this number of edges */\nconst EDGE_INDEX_MIN = 2000;\nconst TWEEN_MS = 450;\nconst VIEW_TWEEN_MS = 320;\n/** Smallest font (px) of the text inside boxes when zoomed out */\nconst BOX_FONT_MIN = 9;\nconst KEY_ZOOM = 1.25;\nconst BUTTON_ZOOM = 1.4;\n\nconst wheelFactor = (deltaY: number, deltaMode: number, pinch: boolean) => {\n const pixels =\n deltaMode === 1 ? deltaY * 16 : deltaMode === 2 ? deltaY * 400 : deltaY;\n const speed = pinch ? 0.01 : 0.0025;\n return Math.exp(Math.max(-1, Math.min(1, pixels * speed)));\n};\n\nconst ease = (t: number) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n/** Grows a Float32Array of interleaved points */\nconst pointBuffer = () => {\n let data = new Float32Array(1024);\n let length = 0;\n const ensure = (extra: number) => {\n if (length + extra <= data.length) return;\n const next = new Float32Array(Math.max(data.length * 2, length + extra));\n next.set(data.subarray(0, length));\n data = next;\n };\n return {\n push(x: number, y: number) {\n ensure(2);\n data[length++] = x;\n data[length++] = y;\n },\n pushAll(points: readonly number[]) {\n ensure(points.length);\n for (let i = 0; i < points.length; i++) data[length++] = points[i];\n },\n count: () => length / 2,\n points: () => data.subarray(0, length),\n };\n};\n\ntype PointBuffer = ReturnType<typeof pointBuffer>;\n\ninterface Hit {\n type: \"node\" | \"edge\";\n index: number;\n}\n\ninterface Snapshot {\n x: number;\n y: number;\n visible: boolean;\n}\n\nexport const resolveLayout = (\n layout: GraphLayoutType | undefined,\n): GraphLayoutType => (layout && LAYOUTS.includes(layout) ? layout : \"force\");\n\nconst layoutSignature = (o: GraphChartOptions): string =>\n JSON.stringify([\n resolveLayout(o.layout),\n o.direction ?? \"\",\n o.force ?? null,\n o.dag\n ? { ...o.dag, criticalPath: undefined, criticalColor: undefined }\n : null,\n o.tree ?? null,\n o.circular ?? null,\n o.nodeSize ?? null,\n o.nodeShape ?? null,\n o.nodeLabels === false,\n ]);\n\nexport const createGraphChart = (\n container: HTMLElement,\n initialOptions: GraphChartOptions,\n): GraphChartInstance => {\n const doc = container.ownerDocument;\n const win = doc.defaultView;\n const dom = createGraphDom(container);\n const stage = dom.stage;\n let options = initialOptions;\n let theme: ChartTheme = readTheme(dom.root, options.palette);\n let dark = isDark(theme);\n let loc: GraphLocale = graphLocale(options.locale, options.labels);\n let destroyed = false;\n\n const listeners = new Map<\n keyof GraphChartEventMap,\n Set<(e: never) => void>\n >();\n const emit = <K extends keyof GraphChartEventMap>(\n type: K,\n event: GraphChartEventMap[K],\n ) => {\n listeners\n .get(type)\n ?.forEach((fn) => (fn as (e: GraphChartEventMap[K]) => void)(event));\n };\n const listening = (type: keyof GraphChartEventMap) =>\n !!listeners.get(type)?.size;\n\n const reducedMotion =\n typeof win?.matchMedia === \"function\"\n ? win.matchMedia(\"(prefers-reduced-motion: reduce)\")\n : null;\n const now = () => win?.performance?.now() ?? Date.now();\n\n // --------------------------------------------------------------- state\n\n let model: GraphModel = buildModel(\n options.nodes ?? [],\n options.edges ?? [],\n options.groups,\n );\n let layoutType: GraphLayoutType = resolveLayout(options.layout);\n let direction: GraphDirection = \"TB\";\n let layoutSig = layoutSignature(options);\n let sizing: NodeSizing;\n let X: Float64Array = new Float64Array(0);\n let Y: Float64Array = new Float64Array(0);\n let TX: Float64Array = new Float64Array(0);\n let TY: Float64Array = new Float64Array(0);\n let FX: Float64Array = new Float64Array(0);\n let FY: Float64Array = new Float64Array(0);\n let visible = new Uint8Array(0);\n let prevVisible: Uint8Array | null = null;\n let tween: { start: number; duration: number } | null = null;\n let tweenT = 1;\n let tree: GraphTreeLayoutResult | null = null;\n let dag: GraphDagLayoutResult | null = null;\n let circ: GraphCircularLayoutResult | null = null;\n let runner: ForceRunner | null = null;\n let forcePending = false;\n const collapsedIds = new Set<string>();\n const hiddenGroups = new Set<string>();\n let critical: { nodes: Uint8Array; edges: Uint8Array } | null = null;\n let descendants = new Int32Array(0);\n let paths: (number[] | null)[] = [];\n let pathsDirty = true;\n /** Changes with the edge geometry (see the edge index) */\n let geometryVersion = 0;\n let sceneDirty = true;\n let items: RenderItem[] = [];\n let version = 0;\n\n // colors\n let nodeColor: Rgba[] = [];\n let edgeColor: Rgba[] = [];\n let edgeWidth = new Float64Array(0);\n let edgeArrow = new Uint8Array(0);\n let edgeDashed = new Uint8Array(0);\n let groupColor: Rgba[] = [];\n let criticalColor: Rgba = [0.94, 0.27, 0.27, 1];\n let edgeLabelWidth = new Float64Array(0);\n\n // view: screen = world * k + t (CSS pixels)\n let k = 1;\n let tx = 0;\n let ty = 0;\n let viewTween: {\n from: [number, number, number];\n to: [number, number, number];\n start: number;\n } | null = null;\n let userMoved = false;\n let needsFit = true;\n /** The next fit animates (layout changes after the first frame) */\n let fitAnimate = false;\n let drawnOnce = false;\n /** The view follows the running force layout (unless the user moved it) */\n let followLayout = false;\n let width = 0;\n let height = 0;\n\n // interaction\n let hover: Hit | null = null;\n let focusIndex = -1;\n let focusVisible = false;\n const selection = new Set<number>();\n let highlight: { nodes: Uint8Array; edges: Uint8Array; accent: Rgba } | null =\n null;\n let highlightKey = \"\";\n\n let renderer: ChartRenderer | null = null;\n let rendererToken = 0;\n let resolveReady: (kind: ChartRendererKind | null) => void = () => {};\n const ready = new Promise<ChartRendererKind | null>((resolve) => {\n resolveReady = resolve;\n });\n let frameId = 0;\n\n // ------------------------------------------------------------ options\n\n const interaction = (): Required<GraphInteractionOptions> | null => {\n const o = options.interaction;\n if (o === false) return null;\n const c = typeof o === \"object\" ? o : {};\n return {\n pan: c.pan ?? true,\n zoom: c.zoom ?? true,\n wheel: c.wheel ?? \"modifier\",\n drag:\n c.drag ??\n (layoutType === \"force\" ||\n layoutType === \"none\" ||\n layoutType === \"circular\"),\n select: c.select ?? true,\n keyboard: c.keyboard ?? true,\n zoomRange: c.zoomRange ?? [0.02, 8],\n };\n };\n\n const isTree = () => TREE_TYPES.has(layoutType);\n const collapsible = () => isTree() && options.tree?.collapsible !== false;\n const animationMs = () => {\n const a = options.animation;\n if (a === false || reducedMotion?.matches) return 0;\n return typeof a === \"number\" && a >= 0 ? a : TWEEN_MS;\n };\n const highlightMode = () =>\n options.highlight ?? (layoutType === \"dag\" ? \"lineage\" : \"neighbors\");\n\n const edgeStyle = (): GraphEdgeStyle => {\n const s = options.edgeStyle;\n const flow = layoutType === \"dag\" || isTree();\n if (s === \"straight\" || s === \"curve\") return s;\n if ((s === \"spline\" || s === \"orthogonal\") && flow) return s;\n if (s) return \"curve\";\n switch (layoutType) {\n case \"dag\":\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n return \"spline\";\n case \"org\":\n return \"orthogonal\";\n case \"circular\":\n case \"arc\":\n return \"curve\";\n default:\n return \"straight\";\n }\n };\n\n const resolveColor = (value: string, fallback: Rgba): Rgba => {\n const c = theme.resolve\n ? theme.resolve(value, fallback)\n : (parseColor(value) ?? fallback);\n return c[3] < 1 ? mix(theme.background, [c[0], c[1], c[2], 1], c[3]) : c;\n };\n\n // ----------------------------------------------------------- measure\n\n const measureCtx = dom.foreground.getContext(\"2d\");\n const measure = (text: string, font: string) => {\n if (!measureCtx) return text.length * 7;\n measureCtx.font = font;\n return measureCtx.measureText(text).width;\n };\n\n // ------------------------------------------------------------- layout\n\n const snapshot = (): Map<string, Snapshot> => {\n const map = new Map<string, Snapshot>();\n if (X.length !== model.n) return map;\n for (let i = 0; i < model.n; i++) {\n if (!Number.isFinite(X[i])) continue;\n map.set(model.nodes[i].id, {\n x: X[i],\n y: Y[i],\n visible: !!visible[i] && !forcePending,\n });\n }\n return map;\n };\n\n const stopRunner = () => {\n runner?.destroy();\n runner = null;\n forcePending = false;\n };\n\n const collapsedSet = () => {\n const set = new Set<number>();\n for (const id of collapsedIds) {\n const i = model.index.get(id);\n if (i !== undefined) set.add(i);\n }\n return set;\n };\n\n const treeInput = (\n type: TreeType,\n w: ArrayLike<number>,\n h: ArrayLike<number>,\n levelGap: number,\n ) => {\n const t = options.tree ?? {};\n return {\n n: model.n,\n source: model.source,\n target: model.target,\n width: w,\n height: h,\n type,\n direction,\n root: t.root !== undefined ? (model.index.get(t.root) ?? -1) : -1,\n levelGap,\n siblingGap:\n t.siblingGap ?? (type === \"org\" ? 20 : type === \"mindmap\" ? 10 : 12),\n collapsed: collapsedSet(),\n compact: t.compact,\n };\n };\n\n const startForce = (prev: Map<string, Snapshot>, follow = true) => {\n followLayout = follow;\n const n = model.n;\n const x = new Float64Array(n).fill(NaN);\n const y = new Float64Array(n).fill(NaN);\n const fixed = new Uint8Array(n);\n let known = 0;\n for (let i = 0; i < n; i++) {\n const node = model.nodes[i];\n const p = prev.get(node.id);\n if (p) {\n x[i] = p.x;\n y[i] = p.y;\n known++;\n } else if (Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n known++;\n }\n if (node.fixed && Number.isFinite(node.x) && Number.isFinite(node.y)) {\n x[i] = node.x!;\n y[i] = node.y!;\n fixed[i] = 1;\n }\n }\n // new nodes start next to a known neighbor\n if (known && known < n) {\n for (let i = 0; i < n; i++) {\n if (Number.isFinite(x[i])) continue;\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (Number.isFinite(x[j])) {\n x[i] = x[j] + ((i * 7919) % 17) - 8;\n y[i] = y[j] + ((i * 104729) % 17) - 8;\n break;\n }\n }\n }\n }\n const radius = new Float64Array(n);\n for (let i = 0; i < n; i++)\n radius[i] = Math.max(sizing.width[i], sizing.height[i]) / 2;\n const range = model.edgeValueRange;\n const weight = new Float64Array(model.m).fill(1);\n if (range) {\n const mean = (range[0] + range[1]) / 2 || 1;\n model.edges.forEach((edge, e) => {\n const v = edge.value;\n if (Number.isFinite(v) && v! > 0)\n weight[e] = Math.max(0.5, Math.min(2, Math.sqrt(v! / mean)));\n });\n }\n const alpha = known === 0 ? 1 : known === n ? 0.3 : 0.6;\n const sw = stage.clientWidth;\n const sh = stage.clientHeight;\n const init = forceInit(n, model.source, model.target, options.force, {\n x,\n y,\n radius,\n fixed,\n weight,\n alpha,\n aspect: sw > 0 && sh > 0 ? sw / sh : 1,\n });\n const f = options.force ?? {};\n const animate = f.animate !== false;\n const workerOption = f.worker ?? \"auto\";\n const useWorker =\n workerOption === true ||\n (workerOption === \"auto\" && n >= WORKER_THRESHOLD);\n X = x;\n Y = y;\n TX = x;\n TY = y;\n if (!animate && !useWorker) {\n const sim = forceKernel()(init);\n while (sim.tick(50));\n sim.settle();\n emitLayoutEnd();\n return;\n }\n forcePending = !animate;\n runner = createForceRunner(init, {\n worker: useWorker,\n stream: animate,\n now,\n onTick: () => {\n pathsDirty = true;\n invalidate();\n },\n onEnd: () => {\n const wasPending = forcePending;\n forcePending = false;\n pathsDirty = true;\n if (!userMoved && followLayout) {\n needsFit = true;\n // nothing was shown yet: appear fitted, otherwise glide to the fit\n fitAnimate = !wasPending;\n }\n followLayout = false;\n emitLayoutEnd();\n invalidate();\n },\n });\n };\n\n const emitLayoutEnd = () => {\n // after the current call stack (listeners may call the instance)\n void Promise.resolve().then(() => {\n if (!destroyed) emit(\"layoutEnd\", { layout: layoutType });\n });\n };\n\n const runLayout = (prev: Map<string, Snapshot>, animate: boolean) => {\n stopRunner();\n const previousType = layoutType;\n layoutType = resolveLayout(options.layout);\n direction = options.direction ?? (layoutType === \"tree\" ? \"LR\" : \"TB\");\n if (previousType !== layoutType) needsFit = true;\n const n = model.n;\n tree = null;\n dag = null;\n circ = null;\n\n let depth: Int32Array | null = null;\n if (layoutType === \"mindmap\") {\n const ones = new Float64Array(n).fill(1);\n depth = tidyTreeLayout(treeInput(\"mindmap\", ones, ones, 1)).depth;\n }\n sizing = computeSizing(\n model,\n layoutType,\n options,\n depth,\n measure,\n theme.fontFamily,\n );\n const nextVisible = new Uint8Array(n).fill(1);\n let tx2: Float64Array = new Float64Array(n);\n let ty2: Float64Array = new Float64Array(n);\n\n switch (layoutType) {\n case \"dag\": {\n const d = options.dag ?? {};\n dag = layeredLayout({\n n,\n source: model.source,\n target: model.target,\n width: sizing.width,\n height: sizing.height,\n direction,\n layerGap: d.layerGap ?? 56,\n nodeGap: d.nodeGap ?? 24,\n sweeps: d.sweeps ?? 8,\n });\n tx2 = dag.x;\n ty2 = dag.y;\n break;\n }\n case \"tree\":\n case \"radial\":\n case \"mindmap\":\n case \"org\": {\n const type = layoutType as TreeType;\n const levelGap =\n options.tree?.levelGap ??\n Math.max(TREE_LEVEL_GAP[type], sizing.levelGap);\n tree = tidyTreeLayout(\n treeInput(type, sizing.layoutWidth, sizing.layoutHeight, levelGap),\n );\n tx2 = tree.x;\n ty2 = tree.y;\n nextVisible.set(tree.visible);\n break;\n }\n case \"circular\":\n case \"arc\": {\n let spacing = 0;\n for (let i = 0; i < n; i++)\n spacing = Math.max(\n spacing,\n sizing.layoutWidth[i] + (layoutType === \"arc\" ? 8 : 10),\n );\n const input = {\n n,\n source: model.source,\n target: model.target,\n group: model.groupOf,\n order: options.circular?.order ?? \"group\",\n spacing: Math.max(layoutType === \"arc\" ? 16 : 18, spacing),\n };\n circ =\n layoutType === \"arc\" ? arcPositions(input) : circularPositions(input);\n tx2 = circ.x;\n ty2 = circ.y;\n break;\n }\n case \"none\": {\n model.nodes.forEach((node, i) => {\n const p = prev.get(node.id);\n tx2[i] = Number.isFinite(node.x) ? node.x! : (p?.x ?? 0);\n ty2[i] = Number.isFinite(node.y) ? node.y! : (p?.y ?? 0);\n });\n break;\n }\n default:\n break;\n }\n\n const oldVisible = new Uint8Array(n);\n for (let i = 0; i < n; i++)\n oldVisible[i] = prev.get(model.nodes[i].id)?.visible ? 1 : 0;\n visible = nextVisible;\n descendants = countDescendants();\n\n if (layoutType === \"force\") {\n startForce(prev);\n tween = null;\n prevVisible = null;\n } else {\n TX = tx2;\n TY = ty2;\n X = new Float64Array(n);\n Y = new Float64Array(n);\n const ms = animate && prev.size ? animationMs() : 0;\n if (ms > 0) {\n FX = new Float64Array(n);\n FY = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const p = prev.get(model.nodes[i].id);\n if (p && p.visible) {\n FX[i] = p.x;\n FY[i] = p.y;\n continue;\n }\n // entering nodes grow out of their closest previously shown ancestor\n let a = tree ? tree.parent[i] : -1;\n let from: Snapshot | undefined;\n while (a >= 0 && !(from = prev.get(model.nodes[a].id))?.visible)\n a = tree!.parent[a];\n FX[i] = from?.visible ? from.x : TX[i];\n FY[i] = from?.visible ? from.y : TY[i];\n }\n X.set(FX);\n Y.set(FY);\n prevVisible = oldVisible;\n tween = { start: now(), duration: ms };\n tweenT = 0;\n } else {\n X.set(TX);\n Y.set(TY);\n tween = null;\n prevVisible = null;\n }\n }\n if (!userMoved) {\n needsFit = true;\n fitAnimate = prev.size > 0 && animate && layoutType !== \"force\";\n }\n refreshCritical();\n refreshColors();\n edgeLabelWidth = new Float64Array(model.m).fill(NaN);\n edgeGrid = null;\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n updateAccessibility();\n renderLegend();\n invalidate();\n if (layoutType !== \"force\") emitLayoutEnd();\n };\n\n const countDescendants = () => {\n const counts = new Int32Array(model.n);\n if (!tree) return counts;\n const order: number[] = [];\n tree.parent.forEach((p, i) => {\n if (p < 0) order.push(i);\n });\n for (let q = 0; q < order.length; q++)\n order.push(...tree.children[order[q]]);\n for (let q = order.length - 1; q >= 0; q--) {\n const v = order[q];\n const p = tree.parent[v];\n if (p >= 0) counts[p] += counts[v] + 1;\n }\n return counts;\n };\n\n const refreshCritical = () => {\n critical = null;\n const option = options.dag?.criticalPath;\n if (!option || layoutType !== \"dag\") return;\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (option === true) {\n const path = longestPath(model.n, model.source, model.target, (i) => {\n const v = model.nodes[i].value;\n return Number.isFinite(v) && v! >= 0 ? v! : 1;\n });\n path.nodes.forEach((i) => (nodes[i] = 1));\n path.edges.forEach((e) => (edges[e] = 1));\n } else {\n const ids = option.map((id) => model.index.get(id) ?? -1);\n ids.forEach((i) => {\n if (i >= 0) nodes[i] = 1;\n });\n for (let e = 0; e < model.m; e++) {\n const s = ids.indexOf(model.source[e]);\n if (s >= 0 && ids[s + 1] === model.target[e]) edges[e] = 1;\n }\n }\n critical = { nodes, edges };\n };\n\n // ------------------------------------------------------------- colors\n\n const refreshColors = () => {\n const bg = theme.background;\n dark = isDark(theme);\n const palette = theme.palette.length ? theme.palette : [theme.primary];\n groupColor = model.groups.map((g, i) =>\n g.color\n ? resolveColor(g.color, palette[i % palette.length])\n : palette[i % palette.length],\n );\n criticalColor = resolveColor(\n options.dag?.criticalColor ?? \"var(--danger-color, #ef4444)\",\n [0.94, 0.27, 0.27, 1],\n );\n // mind maps color each branch\n const branch = new Int32Array(model.n).fill(-1);\n if (layoutType === \"mindmap\" && tree) {\n const roots: number[] = [];\n tree.parent.forEach((p, i) => p < 0 && roots.push(i));\n const firstLevel = roots.length\n ? [...tree.children[roots[0]], ...roots.slice(1)]\n : [];\n firstLevel.forEach((c, b) => {\n const stack = [c];\n while (stack.length) {\n const v = stack.pop()!;\n branch[v] = b;\n stack.push(...tree!.children[v]);\n }\n });\n }\n nodeColor = model.nodes.map((node, i) => {\n if (node.color) return resolveColor(node.color, theme.primary);\n const g = model.groupOf[i];\n if (g >= 0) return groupColor[g];\n if (branch[i] >= 0) return palette[(branch[i] + 1) % palette.length];\n return theme.primary;\n });\n const neutral = mix(bg, theme.textMuted, dark ? 0.42 : 0.36);\n const mode = options.edgeColor ?? \"neutral\";\n const wOption = options.edgeWidth;\n const eRange = model.edgeValueRange;\n const [wMin, wMax] = Array.isArray(wOption)\n ? (wOption as readonly [number, number])\n : typeof wOption === \"number\"\n ? [wOption, wOption]\n : eRange && eRange[1] > eRange[0]\n ? [1, 5]\n : [1.25, 1.25];\n edgeColor = [];\n edgeWidth = new Float64Array(model.m);\n edgeArrow = new Uint8Array(model.m);\n edgeDashed = new Uint8Array(model.m);\n const arrows = options.arrows ?? layoutType === \"dag\";\n model.edges.forEach((edge, e) => {\n const s = model.source[e];\n const t = model.target[e];\n let c = neutral;\n if (edge.color) c = resolveColor(edge.color, neutral);\n else if (mode === \"source\") c = mix(bg, nodeColor[s], 0.55);\n else if (mode === \"target\") c = mix(bg, nodeColor[t], 0.55);\n else if (layoutType === \"mindmap\") c = mix(bg, nodeColor[t], 0.7);\n edgeColor.push(c);\n let w = wMin;\n if (Number.isFinite(edge.width) && edge.width! > 0) w = edge.width!;\n else if (eRange && eRange[1] > eRange[0] && Number.isFinite(edge.value))\n w =\n wMin +\n (wMax - wMin) *\n Math.sqrt((edge.value! - eRange[0]) / (eRange[1] - eRange[0]));\n else if (layoutType === \"mindmap\" && tree && wOption === undefined)\n w = Math.max(1.25, 3.4 - tree.depth[t] * 0.75);\n edgeWidth[e] = w;\n edgeArrow[e] = (edge.directed ?? arrows) ? 1 : 0;\n edgeDashed[e] = edge.dashed ? 1 : 0;\n });\n sceneDirty = true;\n };\n\n // --------------------------------------------------------------- paths\n\n const fade = (i: number): number => {\n if (forcePending) return 0;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) return 0;\n const v = visible[i];\n const p = prevVisible ? prevVisible[i] : v;\n if (tween) {\n if (v && p) return 1;\n if (v) return tweenT;\n if (p) return 1 - tweenT;\n return 0;\n }\n return v;\n };\n\n const isBox = (i: number) => sizing.kind[i] !== NodeKind.Circle;\n\n /** Port of a node on the flow axis (sign +1 = outgoing side) */\n const port = (\n i: number,\n vertical: boolean,\n sign: number,\n ): [number, number] =>\n vertical\n ? [X[i], Y[i] + (sign * sizing.height[i]) / 2]\n : [X[i] + (sign * sizing.width[i]) / 2, Y[i]];\n\n const flow = (): { vertical: boolean; sign: number } => {\n const d = layoutType === \"org\" ? \"TB\" : direction;\n return {\n vertical: layoutType !== \"mindmap\" && (d === \"TB\" || d === \"BT\"),\n sign: d === \"BT\" || d === \"RL\" ? -1 : 1,\n };\n };\n\n const trimmed = (\n points: number[],\n s: number,\n t: number,\n arrow: boolean,\n ): number[] => {\n if (points.length < 4) return points;\n const [ux, uy] = [points[2] - points[0], points[3] - points[1]];\n const l0 = Math.hypot(ux, uy) || 1;\n const [ex, ey] = endDirection(points);\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux / l0,\n uy / l0,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ex, ey) +\n (arrow ? 1 : 0);\n return trimPath(points, a, b);\n };\n\n /** Direction of the self-loops of a node: the middle of its widest free angle */\n const loopAngle = (i: number): number => {\n const angles: number[] = [];\n // the label of a circle sits below it: keep that side free too\n if (sizing.kind[i] === NodeKind.Circle && options.nodeLabels !== false)\n angles.push(Math.PI / 2);\n for (let a = model.adjStart[i]; a < model.adjStart[i + 1]; a++) {\n const e = model.adjEdge[a];\n const j = model.source[e] === i ? model.target[e] : model.source[e];\n if (j === i || fade(j) <= 0) continue;\n const dx = X[j] - X[i];\n const dy = Y[j] - Y[i];\n if (dx * dx + dy * dy > 1e-12) angles.push(Math.atan2(dy, dx));\n }\n if (!angles.length) return -Math.PI / 2;\n angles.sort((a, b) => a - b);\n const end = angles[angles.length - 1];\n let best = angles[0] + Math.PI * 2 - end;\n let angle = end + best / 2;\n for (let k = 1; k < angles.length; k++) {\n const gap = angles[k] - angles[k - 1];\n if (gap > best + 1e-9) {\n best = gap;\n angle = angles[k - 1] + gap / 2;\n }\n }\n return angle;\n };\n\n /** Reach of the self-loops of a node beyond its boundary */\n const loopSize = (i: number) =>\n Math.max(\n 12,\n Math.min(40, Math.min(sizing.width[i], sizing.height[i]) * 0.9),\n );\n\n /** Self-loop of an edge whose ends are the same node */\n const loopOf = (e: number): number[] => {\n const i = model.source[e];\n const angle = loopAngle(i);\n const w = sizing.width[i];\n const h = sizing.height[i];\n const box = isBox(i);\n const at = (a: number) =>\n boundaryDistance(box, w, h, Math.cos(a), Math.sin(a));\n return loopPath(\n X[i],\n Y[i],\n angle,\n at(angle - 0.42),\n at(angle + 0.42) + (edgeArrow[e] ? 1 : 0),\n loopSize(i) * (1 + 0.6 * model.bend[e]),\n );\n };\n\n /** Polyline of a curved edge (straight edges are built on the fly) */\n const edgePath = (e: number, style: GraphEdgeStyle): number[] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const arrow = !!edgeArrow[e];\n if (s === t) return loopOf(e);\n // parallel edges: their own offsets (NaN: a single edge)\n const bend = model.bend[e];\n const parallel = Number.isFinite(bend);\n if (layoutType === \"arc\") {\n // higher and lower arcs, by slot from the lower to the higher index\n const rise = parallel ? 1 + 0.25 * (s < t ? bend : -bend) : 1;\n return trimmed(arcPath(X[s], X[t], Y[s], rise), s, t, arrow);\n }\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const bow = parallel ? bend * PARALLEL_BOW : 0;\n if (style === \"straight\") {\n if (!bow) return null;\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * bow, my + dx * bow, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"circular\" && style === \"curve\") {\n const tension = Math.max(\n 0,\n Math.min(1, options.circular?.tension ?? 0.8),\n );\n const cx = ((X[s] + X[t]) / 2) * (1 - tension) - dy * bow;\n const cy = ((Y[s] + Y[t]) / 2) * (1 - tension) + dx * bow;\n return trimmed(\n quadraticPath(X[s], Y[s], cx, cy, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n }\n if (layoutType === \"radial\" && style === \"spline\") {\n const rs = Math.hypot(X[s], Y[s]);\n const rt = Math.hypot(X[t], Y[t]);\n const as = Math.atan2(Y[s], X[s]);\n const at = Math.atan2(Y[t], X[t]);\n const rm = (rs + rt) / 2;\n const out = [X[s], Y[s]];\n cubicPoints(\n out,\n X[s],\n Y[s],\n rs < 1e-6 ? X[s] : rm * Math.cos(as),\n rs < 1e-6 ? Y[s] : rm * Math.sin(as),\n rm * Math.cos(at),\n rm * Math.sin(at),\n X[t],\n Y[t],\n );\n return trimmed(out, s, t, arrow);\n }\n if (style === \"spline\" || style === \"orthogonal\") {\n const f = flow();\n let sign = f.sign;\n if (layoutType === \"mindmap\") sign = X[t] >= X[s] ? 1 : -1;\n const route = dag && !tween ? dag.routes[e] : null;\n let pts: number[];\n if (route && route.length >= 4) pts = route;\n else {\n const along = f.vertical ? Y[t] - Y[s] : X[t] - X[s];\n const dir =\n layoutType === \"mindmap\" ? sign : along * sign >= 0 ? sign : -sign;\n pts = [...port(s, f.vertical, dir), ...port(t, f.vertical, -dir)];\n }\n if (style === \"orthogonal\") {\n if (layoutType === \"org\" && tree?.stacked[t] && tree.parent[t] === s) {\n // compact column: down from the parent, along a bus on the left\n const bottom = Y[s] + sizing.height[s] / 2;\n const left = X[t] - sizing.width[t] / 2;\n const bus = left - 10;\n const mid = bottom + 14;\n return roundCorners(\n [X[s], bottom, X[s], mid, bus, mid, bus, Y[t], left, Y[t]],\n 6,\n );\n }\n if (layoutType === \"org\" && pts.length === 4) {\n const mid = (pts[1] + pts[3]) / 2;\n return roundCorners(\n [pts[0], pts[1], pts[0], mid, pts[2], mid, pts[2], pts[3]],\n 6,\n );\n }\n return orthogonalPath(pts, f.vertical, 8);\n }\n return splinePath(pts, f.vertical);\n }\n // curve\n const mx = (X[s] + X[t]) / 2;\n const my = (Y[s] + Y[t]) / 2;\n const c = parallel ? bow : 0.18;\n return trimmed(\n quadraticPath(X[s], Y[s], mx - dy * c, my + dx * c, X[t], Y[t]),\n s,\n t,\n arrow,\n );\n };\n\n const refreshPaths = () => {\n const style = edgeStyle();\n paths = new Array(model.m);\n for (let e = 0; e < model.m; e++) {\n paths[e] =\n fade(model.source[e]) > 0 && fade(model.target[e]) > 0\n ? edgePath(e, style)\n : null;\n }\n pathsDirty = false;\n geometryVersion++;\n };\n\n /** Ends of a straight edge, trimmed at the node boundaries */\n const straightEnds = (e: number): [number, number, number, number] | null => {\n const s = model.source[e];\n const t = model.target[e];\n const dx = X[t] - X[s];\n const dy = Y[t] - Y[s];\n const len = Math.hypot(dx, dy);\n if (len < 1e-9) return null;\n const ux = dx / len;\n const uy = dy / len;\n const a = boundaryDistance(\n isBox(s),\n sizing.width[s],\n sizing.height[s],\n ux,\n uy,\n );\n const b =\n boundaryDistance(isBox(t), sizing.width[t], sizing.height[t], ux, uy) +\n (edgeArrow[e] ? 1 : 0);\n if (a + b >= len) return null;\n return [X[s] + ux * a, Y[s] + uy * a, X[t] - ux * b, Y[t] - uy * b];\n };\n\n // ------------------------------------------------------------ highlight\n\n const updateHighlight = () => {\n const sources =\n hover?.type === \"node\"\n ? [hover.index]\n : focusIndex >= 0\n ? [focusIndex]\n : [...selection];\n const mode = highlightMode();\n const edgeHover = hover?.type === \"edge\" ? hover.index : -1;\n const key = `${mode}|${sources.join(\",\")}|${edgeHover}`;\n if (key === highlightKey) return;\n highlightKey = key;\n sceneDirty = true;\n if ((mode === \"none\" || !sources.length) && edgeHover < 0) {\n highlight = null;\n return;\n }\n const nodes = new Uint8Array(model.n);\n const edges = new Uint8Array(model.m);\n if (mode !== \"none\") {\n for (const s of sources) {\n if (mode === \"lineage\") lineage(model, s, nodes, edges);\n else neighborhood(model, s, nodes, edges);\n }\n }\n if (edgeHover >= 0) {\n edges[edgeHover] = 1;\n nodes[model.source[edgeHover]] = 1;\n nodes[model.target[edgeHover]] = 1;\n }\n const accent =\n mode === \"lineage\" || sources.length !== 1\n ? theme.primary\n : nodeColor[sources[0]];\n highlight = { nodes, edges, accent: accent ?? theme.primary };\n };\n\n // --------------------------------------------------------------- scene\n\n const buildScene = (): RenderItem[] => {\n version++;\n const bg = theme.background;\n const out: RenderItem[] = [];\n const style = edgeStyle();\n const minPx = model.n > 2000 ? 2 : 3;\n const hl = highlight;\n\n // ----- edges: three layers (dimmed, normal, highlighted)\n const layers = [\n new Map<string, { color: Rgba; width: number; buf: PointBuffer }>(),\n new Map(),\n new Map(),\n ] as Map<string, { color: Rgba; width: number; buf: PointBuffer }>[];\n const bucket = (layer: number, color: Rgba, w: number) => {\n const key = `${packColor(color)}|${Math.round(w * 4)}`;\n let b = layers[layer].get(key);\n if (!b) {\n b = { color, width: w, buf: pointBuffer() };\n layers[layer].set(key, b);\n }\n return b.buf;\n };\n const arrowLen = (w: number) => (6 + w * 1.6) / k;\n const filledLen = (w: number) => (8 + w * 2.2) / k;\n const filled = options.arrowStyle === \"filled\";\n // filled heads: flat area triangles per layer and color, outlined by a\n // thin line (anti-aliased edges on every backend)\n const heads = [new Map(), new Map(), new Map()] as Map<\n number,\n { color: Rgba; points: number[] }\n >[];\n const tmp: number[] = [];\n const head = (\n buf: PointBuffer,\n layer: number,\n color: Rgba,\n w: number,\n x: number,\n y: number,\n ux: number,\n uy: number,\n ) => {\n tmp.length = 0;\n if (!filled) {\n arrowHead(tmp, x, y, ux, uy, arrowLen(w), GAP);\n buf.pushAll(tmp);\n return;\n }\n const key = packColor(color);\n let h = heads[layer].get(key);\n if (!h) {\n h = { color, points: [] };\n heads[layer].set(key, h);\n }\n filledArrow(h.points, tmp, x, y, ux, uy, filledLen(w), GAP);\n bucket(layer, color, Math.min(w, 1)).pushAll(tmp);\n };\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n let color = edgeColor[e];\n let w = edgeWidth[e];\n let layer = 1;\n if (critical?.edges[e]) {\n color = criticalColor;\n w += 1;\n }\n if (hl) {\n if (hl.edges[e]) {\n layer = 2;\n if (!critical?.edges[e]) color = mix(bg, hl.accent, 0.9);\n w += 0.75;\n } else {\n layer = 0;\n color = mix(bg, color, 0.22);\n }\n }\n if (f < 1) color = mix(bg, color, f);\n const buf = bucket(layer, color, w);\n let points: number[] | null = paths[e] ?? null;\n if (!points) {\n if (style !== \"straight\" || layoutType === \"arc\") continue;\n const ends = straightEnds(e);\n if (!ends) continue;\n if (!edgeDashed[e] && !(filled && edgeArrow[e])) {\n buf.push(ends[0], ends[1]);\n buf.push(ends[2], ends[3]);\n buf.push(GAP, GAP);\n if (edgeArrow[e]) {\n const l = Math.hypot(ends[2] - ends[0], ends[3] - ends[1]) || 1;\n head(\n buf,\n layer,\n color,\n w,\n ends[2],\n ends[3],\n (ends[2] - ends[0]) / l,\n (ends[3] - ends[1]) / l,\n );\n }\n continue;\n }\n points = [ends[0], ends[1], ends[2], ends[3]];\n }\n if (points.length < 4) continue;\n let line = points;\n // a filled head covers the end: the line stops at its notch\n if (filled && edgeArrow[e])\n line = trimPath(points.slice(), 0, filledLen(w) * 0.72);\n if (edgeDashed[e]) buf.pushAll(dashPath(line, 5 / k, 4 / k, GAP));\n else {\n buf.pushAll(line);\n buf.push(GAP, GAP);\n }\n if (edgeArrow[e]) {\n const [ux, uy] = endDirection(points);\n head(\n buf,\n layer,\n color,\n w,\n points[points.length - 2],\n points[points.length - 1],\n ux,\n uy,\n );\n }\n }\n layers.forEach((map, layer) => {\n for (const [key, b] of map) {\n if (b.buf.count() < 2) continue;\n const item: LineItem = {\n kind: \"line\",\n key: `edges:${layer}:${key}`,\n version,\n color: b.color,\n points: b.buf.points(),\n count: b.buf.count(),\n width: b.width,\n sorted: false,\n };\n out.push(item);\n }\n for (const [key, h] of heads[layer]) {\n const item: AreaItem = {\n kind: \"area\",\n key: `heads:${layer}:${key}`,\n version,\n color: h.color,\n points: Float32Array.from(h.points),\n count: h.points.length / AREA_STRIDE,\n opacity: 1,\n sorted: false,\n flat: true,\n };\n out.push(item);\n }\n });\n\n // ----- nodes\n const nodeFill = (i: number, f: number): Rgba => {\n let c = nodeColor[i];\n if (hl && !hl.nodes[i]) c = mix(bg, c, 0.2);\n return f < 1 ? mix(bg, c, f) : c;\n };\n const halo: number[] = [];\n const fills: number[] = [];\n const rings: number[] = [];\n const collapsedFill: number[] = [];\n const selRings: number[] = [];\n const avatars: number[] = [];\n const boxBuckets = new Map<\n string,\n { half: number; inset: number; border: number[]; fill: number[] }\n >();\n const outlines = new Map<string, number[]>();\n const radiusPx =\n layoutType === \"mindmap\"\n ? 999\n : Math.max(\n 1,\n Math.min(\n layoutType === \"org\" ? 10 : 8,\n (layoutType === \"org\" ? 10 : 7) * k,\n ),\n );\n const showHalo = model.n <= HALO_LIMIT;\n for (const i of drawOrder()) {\n const f = fade(i);\n if (f <= 0) continue;\n const x = X[i];\n const y = Y[i];\n const color = nodeFill(i, f);\n const selected = selection.has(i);\n const hovered = hover?.type === \"node\" && hover.index === i;\n if (sizing.kind[i] === NodeKind.Circle) {\n const d = Math.max(minPx, sizing.width[i] * k);\n if (showHalo) halo.push(x, y, d + 3, packColor(bg));\n const isCollapsed =\n collapsible() && tree && descendants[i] > 0 && !hasVisibleChild(i);\n if (isCollapsed) {\n collapsedFill.push(x, y, d, packColor(color));\n } else fills.push(x, y, d, packColor(color));\n if (selected) selRings.push(x, y, d + 7, packColor(theme.primary));\n else if (hovered)\n rings.push(x, y, d + 6, packColor(mix(bg, nodeColor[i], 0.7)));\n continue;\n }\n // boxes\n const w = sizing.width[i];\n const h = sizing.height[i];\n const solid = sizing.kind[i] === NodeKind.Solid;\n const crit = !!critical?.nodes[i];\n let border = solid ? color : mix(bg, color, crit ? 1 : dark ? 0.62 : 0.5);\n let body = solid ? color : mix(bg, color, dark ? 0.2 : 0.09);\n if (crit) border = mix(bg, criticalColor, f);\n if (hl && !hl.nodes[i]) {\n body = mix(bg, body, 0.5);\n if (!solid) border = mix(bg, border, 0.4);\n }\n const key = `${Math.round(w * 2) / 2}|${crit ? 2 : 1.25}`;\n let b = boxBuckets.get(key);\n if (!b) {\n b = { half: w / 2, inset: crit ? 2 : 1.25, border: [], fill: [] };\n boxBuckets.set(key, b);\n }\n b.border.push(x, y - h / 2, y + h / 2, packColor(border));\n b.fill.push(x, y - h / 2, y + h / 2, packColor(body));\n if (selected || hovered) {\n const pad = (selected ? 3 : 2.5) / k;\n const okey = `${Math.round((w / 2 + pad) * 64)}`;\n let list = outlines.get(okey);\n if (!list) outlines.set(okey, (list = []));\n list.push(\n w / 2 + pad,\n x,\n y - h / 2 - pad,\n y + h / 2 + pad,\n packColor(selected ? theme.primary : mix(bg, nodeColor[i], 0.55)),\n );\n }\n if (sizing.kind[i] === NodeKind.Card && w * k >= 96) {\n avatars.push(\n x - w / 2 + 26,\n y,\n Math.min(32, h - 16) * k,\n packColor(color),\n );\n }\n }\n const scatter = (\n key: string,\n data: number[],\n opacity: number,\n stroke: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * SCATTER_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: ScatterItem = {\n kind: \"scatter\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n opacity,\n stroke,\n };\n out.push(item);\n };\n const bars = (\n key: string,\n data: number[],\n half: number,\n inset: number,\n radius: number,\n ) => {\n if (!data.length) return;\n const count = data.length / 4;\n const buffer = new ArrayBuffer(count * BAR_STRIDE);\n const f32 = new Float32Array(buffer);\n const u32 = new Uint32Array(buffer);\n for (let j = 0; j < count; j++) {\n f32[j * 4] = data[j * 4];\n f32[j * 4 + 1] = data[j * 4 + 1];\n f32[j * 4 + 2] = data[j * 4 + 2];\n u32[j * 4 + 3] = data[j * 4 + 3];\n }\n const item: BarItem = {\n kind: \"bar\",\n key,\n version,\n color: theme.primary,\n instances: buffer,\n count,\n halfWidth: half,\n radius,\n inset,\n minHalf: 0,\n sorted: false,\n };\n out.push(item);\n };\n scatter(\"halo\", halo, 1, 0);\n scatter(\"nodes\", fills, 1, 0);\n scatter(\"collapsed\", collapsedFill, 0.28, 2);\n scatter(\"hover-rings\", rings, 0, 2);\n scatter(\"selection\", selRings, 0, 2.25);\n for (const [key, list] of outlines) {\n const data: number[] = [];\n for (let j = 0; j < list.length; j += 5)\n data.push(list[j + 1], list[j + 2], list[j + 3], list[j + 4]);\n bars(\n `outline:${key}`,\n data,\n list[0],\n 0,\n radiusPx === 999 ? 999 : radiusPx + 3,\n );\n }\n for (const [key, b] of boxBuckets) {\n bars(`border:${key}`, b.border, b.half, 0, radiusPx);\n bars(\n `fill:${key}`,\n b.fill,\n b.half,\n b.inset,\n radiusPx === 999 ? 999 : Math.max(0, radiusPx - 1),\n );\n }\n scatter(\"avatars\", avatars, 1, 0);\n return out;\n };\n\n /** Hovered / selected nodes last (on top) */\n const drawOrder = (): number[] => {\n const order: number[] = [];\n const late: number[] = [];\n for (let i = 0; i < model.n; i++) {\n if (\n selection.has(i) ||\n (hover?.type === \"node\" && hover.index === i) ||\n i === focusIndex\n )\n late.push(i);\n else order.push(i);\n }\n return order.concat(late);\n };\n\n const hasVisibleChild = (i: number) =>\n !!tree && tree.children[i].some((c) => visible[c]);\n\n // -------------------------------------------------------------- frame\n\n function invalidate() {\n if (destroyed || frameId || !win) return;\n frameId = win.requestAnimationFrame(frame);\n }\n\n const transform = () => ({\n xScale: (2 * k) / width,\n xOffset: (2 * tx) / width - 1,\n yScale: (-2 * k) / height,\n yOffset: 1 - (2 * ty) / height,\n });\n\n function frame() {\n frameId = 0;\n if (destroyed) return;\n const w = stage.clientWidth;\n const h = stage.clientHeight;\n if (w <= 0 || h <= 0) return;\n if (w !== width || h !== height) {\n width = w;\n height = h;\n if (!userMoved) needsFit = true;\n sceneDirty = true;\n }\n const dpr = win?.devicePixelRatio || 1;\n let animating = false;\n\n let follow = false;\n if (runner?.running()) {\n runner.step(8);\n pathsDirty = true;\n animating = runner.running() && !runner.threaded();\n follow = runner.running() && followLayout && !userMoved && !forcePending;\n }\n if (tween) {\n const t = Math.min(\n 1,\n (now() - tween.start) / Math.max(1, tween.duration),\n );\n tweenT = ease(t);\n for (let i = 0; i < model.n; i++) {\n X[i] = FX[i] + (TX[i] - FX[i]) * tweenT;\n Y[i] = FY[i] + (TY[i] - FY[i]) * tweenT;\n }\n if (t >= 1) {\n tween = null;\n prevVisible = null;\n tweenT = 1;\n }\n pathsDirty = true;\n animating = true;\n }\n if (needsFit) {\n needsFit = false;\n const target = fitView();\n if (target && fitAnimate && drawnOnce && !reducedMotion?.matches) {\n viewTween = { from: [k, tx, ty], to: target, start: now() };\n } else if (target) [k, tx, ty] = target;\n fitAnimate = false;\n sceneDirty = true;\n } else if (follow) {\n // glide toward the fit of the expanding layout (the final fit animates\n // once it has settled)\n const target = fitView();\n if (target) {\n viewTween = null;\n if (!drawnOnce || reducedMotion?.matches) [k, tx, ty] = target;\n else if (approachView(target, 0.25)) animating = true;\n sceneDirty = true;\n }\n }\n if (viewTween) {\n const t = Math.min(1, (now() - viewTween.start) / VIEW_TWEEN_MS);\n const e = ease(t);\n const [k0, x0, y0] = viewTween.from;\n const [k1, x1, y1] = viewTween.to;\n const kk = k0 * Math.pow(k1 / k0, e);\n // keep the zoom geometric and the screen center consistent\n const c0x = (width / 2 - x0) / k0;\n const c0y = (height / 2 - y0) / k0;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const cx = c0x + (c1x - c0x) * e;\n const cy = c0y + (c1y - c0y) * e;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n if (t >= 1) {\n [k, tx, ty] = viewTween.to;\n viewTween = null;\n }\n sceneDirty = true;\n animating = true;\n }\n if (pathsDirty) {\n refreshPaths();\n sceneDirty = true;\n }\n updateHighlight();\n if (renderer) {\n if (sceneDirty) {\n items = forcePending ? [] : buildScene();\n sceneDirty = false;\n }\n const bw = Math.max(1, Math.round(w * dpr));\n const bh = Math.max(1, Math.round(h * dpr));\n if (renderer.canvas.width !== bw || renderer.canvas.height !== bh)\n renderer.resize(bw, bh);\n renderer.canvas.style.width = `${w}px`;\n renderer.canvas.style.height = `${h}px`;\n renderer.render(items, {\n transform: transform(),\n width: bw,\n height: bh,\n dpr,\n });\n drawnOnce = true;\n }\n sizeCanvas(dom.foreground, w, h, dpr);\n drawOverlay(dpr);\n if (hover) positionTooltip();\n if (animating) invalidate();\n }\n\n // ------------------------------------------------------------ overlay\n\n const screenX = (i: number) => X[i] * k + tx;\n const screenY = (i: number) => Y[i] * k + ty;\n\n const ellipsize = (\n ctx: CanvasRenderingContext2D,\n text: string,\n max: number,\n ) => {\n if (max <= 8) return \"\";\n if (ctx.measureText(text).width <= max) return text;\n let lo = 0;\n let hi = text.length;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (ctx.measureText(`${text.slice(0, mid)}…`).width <= max) lo = mid;\n else hi = mid - 1;\n }\n return lo ? `${text.slice(0, lo)}…` : \"\";\n };\n\n const textColorOn = (c: Rgba): string =>\n luminance(c) > 0.6 ? \"#111827\" : \"#ffffff\";\n\n const drawOverlay = (dpr: number) => {\n const ctx = dom.foreground.getContext(\"2d\");\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, width, height);\n if (forcePending || !model.n) return;\n const family = theme.fontFamily;\n const text = toCss(theme.text);\n const muted = toCss(theme.textMuted);\n const bgCss = toCss(theme.background);\n const hl = highlight;\n const cell = 8;\n const cols = Math.ceil(width / cell) + 1;\n const rows = Math.ceil(height / cell) + 1;\n const grid = new Uint8Array(cols * rows);\n const free = (\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n mark: boolean,\n ) => {\n const c0 = Math.max(0, Math.floor(x0 / cell));\n const c1 = Math.min(cols - 1, Math.floor(x1 / cell));\n const r0 = Math.max(0, Math.floor(y0 / cell));\n const r1 = Math.min(rows - 1, Math.floor(y1 / cell));\n if (c0 > c1 || r0 > r1) return false;\n if (!mark) {\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) if (grid[r * cols + c]) return false;\n return true;\n }\n for (let r = r0; r <= r1; r++)\n for (let c = c0; c <= c1; c++) grid[r * cols + c] = 1;\n return true;\n };\n const onScreen = (sx: number, sy: number, margin: number) =>\n sx > -margin &&\n sy > -margin &&\n sx < width + margin &&\n sy < height + margin;\n\n // ----- text inside boxes: a readable minimum size, shortened with an\n // ellipsis; hidden only when the box cannot hold any text\n const showBoxText = options.nodeLabels !== false;\n for (let i = 0; i < model.n; i++) {\n if (sizing.kind[i] === NodeKind.Circle) continue;\n const f = fade(i);\n if (f <= 0) continue;\n const sx = screenX(i);\n const sy = screenY(i);\n const bw = sizing.width[i] * k;\n const bh = sizing.height[i] * k;\n if (!onScreen(sx, sy, Math.max(bw, bh))) continue;\n free(sx - bw / 2, sy - bh / 2, sx + bw / 2, sy + bh / 2, true);\n const natural = sizing.font[i] * k;\n const size = Math.max(BOX_FONT_MIN, natural);\n const node = model.nodes[i];\n const dim = hl && !hl.nodes[i];\n ctx.globalAlpha = f * (dim ? 0.45 : 1);\n const solid = sizing.kind[i] === NodeKind.Solid;\n const card = sizing.kind[i] === NodeKind.Card;\n const avatar = card && bw >= 96;\n if (showBoxText && bh >= size + 1) {\n const left = avatar ? sx - bw / 2 + 48 * k : sx;\n const maxWidth = avatar ? bw - 56 * k : bw - Math.max(4, 12 * k);\n ctx.textAlign = avatar ? \"left\" : \"center\";\n ctx.textBaseline = \"middle\";\n // the subtitle needs room for both lines\n const subSize = Math.max(BOX_FONT_MIN - 0.5, natural * 0.88);\n const gap = Math.max(2, natural * 0.6);\n const block = size + gap + subSize;\n const subtitle = node.subtitle && block <= bh - 4 ? node.subtitle : \"\";\n const titleY = subtitle ? sy - block / 2 + size / 2 : sy;\n ctx.font = `${sizing.weight[i]} ${size}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : text;\n const label = ellipsize(ctx, labelOf(model, i), maxWidth);\n if (label) ctx.fillText(label, left, titleY);\n if (subtitle && label) {\n ctx.font = `${subSize}px ${family}`;\n ctx.fillStyle = solid ? textColorOn(nodeColor[i]) : muted;\n const sub = ellipsize(ctx, subtitle, maxWidth);\n if (sub) ctx.fillText(sub, left, sy + block / 2 - subSize / 2);\n }\n }\n if (avatar) {\n const initial = Array.from(labelOf(model, i).trim())[0] ?? \"\";\n ctx.textAlign = \"center\";\n ctx.font = `600 ${Math.max(8, 13 * k)}px ${family}`;\n ctx.fillStyle = textColorOn(nodeColor[i]);\n ctx.fillText(initial.toUpperCase(), sx - bw / 2 + 26 * k, sy);\n }\n // collapse badge of boxes\n if (collapsible() && tree && tree.children[i].length) {\n const collapsed = !hasVisibleChild(i);\n const active =\n (hover?.type === \"node\" && hover.index === i) || focusIndex === i;\n if (collapsed || active) {\n const vertical = layoutType === \"org\";\n const out =\n layoutType === \"mindmap\" ? (tree.side[i] < 0 ? -1 : 1) : 1;\n const bx = vertical ? sx : sx + out * (bw / 2 + 9);\n const by = vertical ? sy + bh / 2 + 9 : sy;\n const label2 = collapsed ? String(descendants[i]) : \"−\";\n ctx.font = `600 10px ${family}`;\n const r = Math.max(8, ctx.measureText(label2).width / 2 + 5);\n ctx.globalAlpha = f;\n ctx.beginPath();\n ctx.fillStyle = bgCss;\n ctx.strokeStyle = toCss(mix(theme.background, nodeColor[i], 0.75));\n ctx.lineWidth = 1.25;\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(bx - r, by - 8, r * 2, 16, 8);\n else ctx.rect(bx - r, by - 8, r * 2, 16);\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = text;\n ctx.textAlign = \"center\";\n ctx.fillText(label2, bx, by + 0.5);\n }\n }\n }\n ctx.globalAlpha = 1;\n\n // ----- labels of circles\n const mode = options.nodeLabels ?? \"auto\";\n const priority = (i: number) =>\n selection.has(i) ||\n i === focusIndex ||\n (hover?.type === \"node\" && hover.index === i) ||\n (!!hl && !!hl.nodes[i]);\n const drawn = new Uint8Array(model.n);\n let budget = 700;\n const drawLabel = (i: number, force: boolean) => {\n if (drawn[i] || sizing.kind[i] !== NodeKind.Circle || mode === false)\n return;\n const f = fade(i);\n if (f <= 0) return;\n const sx = screenX(i);\n const sy = screenY(i);\n if (!onScreen(sx, sy, 160)) return;\n const r = Math.max(model.n > 2000 ? 1 : 1.5, (sizing.width[i] * k) / 2);\n // tiny nodes of networks lose their label first (other layouts rely on the collisions)\n const network = layoutType === \"force\" || layoutType === \"none\";\n if (!force && mode === \"auto\" && network && r * 2 < 5) return;\n const strong = priority(i);\n const dim = hl && !hl.nodes[i];\n const raw = labelOf(model, i);\n const tw = Math.min(180, sizing.labelWidth[i] * (strong ? 1.06 : 1));\n const place = placement(i, sx, sy, r);\n // collision box: the whole label, or its start for rotated labels\n let bx0: number;\n let by0: number;\n let bx1: number;\n let by1: number;\n if (place.angle !== 0) {\n const cx =\n place.x + Math.cos(place.angle) * (place.align === \"left\" ? 7 : -7);\n const cy =\n place.y + Math.sin(place.angle) * (place.align === \"left\" ? 7 : -7);\n bx0 = cx - 6;\n bx1 = cx + 6;\n by0 = cy - 6;\n by1 = cy + 6;\n } else {\n bx0 =\n place.align === \"left\"\n ? place.x\n : place.align === \"right\"\n ? place.x - tw\n : place.x - tw / 2;\n bx1 = bx0 + tw;\n by0 =\n place.baseline === \"top\"\n ? place.y\n : place.baseline === \"bottom\"\n ? place.y - 14\n : place.y - 7;\n by1 = by0 + 14;\n }\n if (!force && !free(bx0 - 2, by0, bx1 + 2, by1, false)) return;\n free(bx0 - 2, by0, bx1 + 2, by1, true);\n drawn[i] = 1;\n budget--;\n ctx.save();\n ctx.globalAlpha = f * (dim ? 0.35 : 1);\n ctx.font = `${strong ? 600 : 400} ${LABEL_FONT_SIZE}px ${family}`;\n ctx.textAlign = place.align;\n ctx.textBaseline = place.baseline;\n ctx.translate(place.x, place.y);\n if (place.angle) ctx.rotate(place.angle);\n const label = sizing.labelWidth[i] > 180 ? ellipsize(ctx, raw, 180) : raw;\n ctx.lineJoin = \"round\";\n ctx.lineWidth = 3;\n ctx.strokeStyle = bgCss;\n ctx.strokeText(label, 0, 0);\n ctx.fillStyle = strong ? text : dim ? muted : text;\n ctx.fillText(label, 0, 0);\n ctx.restore();\n };\n for (let i = 0; i < model.n; i++) if (priority(i)) drawLabel(i, true);\n\n // ----- edge labels\n const edgeMode = options.edgeLabels ?? \"auto\";\n if (edgeMode !== false) {\n ctx.font = `11px ${family}`;\n ctx.textAlign = \"center\";\n ctx.textBaseline = \"middle\";\n let shownEdges = 0;\n for (let e = 0; e < model.m && shownEdges < 400; e++) {\n const label = model.edges[e].label;\n if (!label) continue;\n const s = model.source[e];\n const t = model.target[e];\n const f = Math.min(fade(s), fade(t));\n if (f <= 0) continue;\n const lit = !!hl?.edges[e];\n if (edgeMode === \"hover\" && !lit) continue;\n if (edgeMode === \"auto\" && !lit && (k < 0.75 || (hl && !lit))) continue;\n let mx: number;\n let my: number;\n const path = paths[e];\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0] * k + tx;\n my = p[1] * k + ty;\n if (s === t) {\n // beyond the far end of a loop (the pill would hide it)\n const dx = mx - (X[s] * k + tx);\n const dy = my - (Y[s] * k + ty);\n const l = Math.hypot(dx, dy) || 1;\n mx += (dx / l) * 10;\n my += (dy / l) * 10;\n }\n } else {\n mx = ((X[s] + X[t]) / 2) * k + tx;\n my = ((Y[s] + Y[t]) / 2) * k + ty;\n }\n if (!onScreen(mx, my, 40)) continue;\n if (Number.isNaN(edgeLabelWidth[e]))\n edgeLabelWidth[e] = ctx.measureText(label).width;\n const lw = edgeLabelWidth[e] + 10;\n if (!lit && !free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, false))\n continue;\n free(mx - lw / 2, my - 8, mx + lw / 2, my + 8, true);\n shownEdges++;\n ctx.globalAlpha = f;\n ctx.fillStyle = bgCss;\n ctx.beginPath();\n if (typeof ctx.roundRect === \"function\")\n ctx.roundRect(mx - lw / 2, my - 8, lw, 16, 8);\n else ctx.rect(mx - lw / 2, my - 8, lw, 16);\n ctx.fill();\n if (lit) {\n ctx.strokeStyle = toCss(\n mix(theme.background, highlight?.accent ?? theme.primary, 0.6),\n );\n ctx.lineWidth = 1;\n ctx.stroke();\n }\n ctx.fillStyle = lit ? text : muted;\n ctx.fillText(label, mx, my + 0.5);\n }\n ctx.globalAlpha = 1;\n }\n\n // ----- other labels, most important first\n if (mode !== false) {\n const all = mode === true;\n for (let r = 0; r < model.rank.length && budget > 0; r++) {\n const i = model.rank[r];\n drawLabel(i, false);\n if (!all && r > 4000) break;\n }\n }\n\n // ----- keyboard focus ring\n if (focusVisible && focusIndex >= 0 && fade(focusIndex) > 0) {\n const sx = screenX(focusIndex);\n const sy = screenY(focusIndex);\n ctx.save();\n ctx.strokeStyle = toCss(theme.primary);\n ctx.lineWidth = 2;\n ctx.setLineDash([4, 3]);\n ctx.beginPath();\n if (sizing.kind[focusIndex] === NodeKind.Circle) {\n const r = Math.max(3, (sizing.width[focusIndex] * k) / 2) + 6;\n ctx.arc(sx, sy, r, 0, Math.PI * 2);\n } else {\n const bw = sizing.width[focusIndex] * k + 10;\n const bh = sizing.height[focusIndex] * k + 10;\n ctx.rect(sx - bw / 2, sy - bh / 2, bw, bh);\n }\n ctx.stroke();\n ctx.restore();\n }\n };\n\n /** Where the label of a circle goes */\n const placement = (\n i: number,\n sx: number,\n sy: number,\n r: number,\n ): {\n x: number;\n y: number;\n align: CanvasTextAlign;\n baseline: CanvasTextBaseline;\n angle: number;\n } => {\n const below = {\n x: sx,\n y: sy + r + 3,\n align: \"center\" as const,\n baseline: \"top\" as const,\n angle: 0,\n };\n const radial = (a: number) => {\n const flip = Math.cos(a) < 0;\n return {\n x: sx + Math.cos(a) * (r + 4),\n y: sy + Math.sin(a) * (r + 4),\n align: (flip ? \"right\" : \"left\") as CanvasTextAlign,\n baseline: \"middle\" as const,\n angle: flip ? a + Math.PI : a,\n };\n };\n switch (layoutType) {\n case \"tree\": {\n const inner = hasVisibleChild(i);\n if (direction === \"LR\" || direction === \"RL\") {\n const right = (direction === \"LR\") !== inner;\n return {\n x: sx + (right ? r + 5 : -r - 5),\n y: sy,\n align: right ? \"left\" : \"right\",\n baseline: \"middle\",\n angle: 0,\n };\n }\n if (direction === \"BT\")\n return {\n x: sx,\n y: sy - r - 3,\n align: \"center\",\n baseline: \"bottom\",\n angle: 0,\n };\n return below;\n }\n case \"radial\":\n // inner nodes: horizontal label below (their children fan out around them)\n if (\n tree &&\n (hasVisibleChild(i) ||\n (tree.depth[i] === 0 && Math.hypot(X[i], Y[i]) < 1e-6))\n )\n return below;\n return radial(tree ? tree.side[i] : 0);\n case \"circular\":\n return radial(circ ? circ.angle[i] : 0);\n case \"arc\":\n return {\n x: sx,\n y: sy + r + 4,\n align: \"left\",\n baseline: \"middle\",\n angle: Math.PI / 2,\n };\n default:\n return below;\n }\n };\n\n // ----------------------------------------------------------------- fit\n\n const fitView = (): [number, number, number] | null => {\n if (width <= 0 || height <= 0) return null;\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let maxLabel = 0;\n for (let i = 0; i < model.n; i++) {\n if (!visible[i] || !Number.isFinite(TX[i])) continue;\n const g = model.groupOf[i];\n if (g >= 0 && hiddenGroups.has(model.groups[g].id)) continue;\n const hw = sizing.width[i] / 2;\n const hh = sizing.height[i] / 2;\n x0 = Math.min(x0, TX[i] - hw);\n x1 = Math.max(x1, TX[i] + hw);\n y0 = Math.min(y0, TY[i] - hh);\n y1 = Math.max(y1, TY[i] + hh);\n if (sizing.kind[i] === NodeKind.Circle)\n maxLabel = Math.max(maxLabel, sizing.labelWidth[i]);\n }\n if (!(x0 <= x1)) return null;\n // arcs rise above the line by half their span\n if (layoutType === \"arc\") {\n for (let e = 0; e < model.m; e++) {\n const s = model.source[e];\n const t = model.target[e];\n if (!visible[s] || !visible[t]) continue;\n const b = model.bend[e];\n const rise = s !== t && Number.isFinite(b) ? 1 + 0.25 * Math.abs(b) : 1;\n y0 = Math.min(y0, TY[s] - (Math.abs(TX[t] - TX[s]) / 2) * rise);\n }\n }\n // self-loops stick out of their node\n if (model.hasLoops) {\n for (let e = 0; e < model.m; e++) {\n const i = model.source[e];\n if (i !== model.target[e] || !visible[i]) continue;\n const a = loopAngle(i);\n const size = loopSize(i);\n const reach =\n Math.max(sizing.width[i], sizing.height[i]) / 2 +\n size * (1 + 0.6 * model.bend[e]);\n const lx = TX[i] + Math.cos(a) * reach;\n const ly = TY[i] + Math.sin(a) * reach;\n x0 = Math.min(x0, lx - size / 2);\n x1 = Math.max(x1, lx + size / 2);\n y0 = Math.min(y0, ly - size / 2);\n y1 = Math.max(y1, ly + size / 2);\n }\n }\n const pad = options.fitPadding ?? 24;\n let [pl, pr, pt, pb] = [pad, pad, pad, pad];\n const label =\n options.nodeLabels === false ? 0 : Math.min(140, maxLabel) + 8;\n const circles = sizing.kind.some((c) => c === NodeKind.Circle);\n if (circles && label > 8) {\n if (layoutType === \"tree\" && (direction === \"LR\" || direction === \"RL\")) {\n // leaves are labeled outside, inner nodes (the roots first) inside\n let inner = 0;\n for (let i = 0; i < model.n; i++) {\n if (tree && tree.parent[i] < 0 && visible[i] && hasVisibleChild(i))\n inner = Math.max(inner, Math.min(140, sizing.labelWidth[i]) + 8);\n }\n if (direction === \"LR\") {\n pr += label;\n pl += inner;\n } else {\n pl += label;\n pr += inner;\n }\n } else if (layoutType === \"radial\" || layoutType === \"circular\") {\n pl += label;\n pr += label;\n pt += label * 0.6;\n pb += label * 0.6;\n } else if (layoutType === \"arc\") pb += label;\n else pb += 16;\n }\n if (layoutType === \"org\" || layoutType === \"mindmap\") pb += 10;\n const aw = Math.max(10, width - pl - pr);\n const ah = Math.max(10, height - pt - pb);\n const bw = Math.max(1e-6, x1 - x0);\n const bh = Math.max(1e-6, y1 - y0);\n const range = interaction()?.zoomRange ?? [0.02, 8];\n let kk = Math.min(aw / bw, ah / bh, 1.6, range[1]);\n kk = Math.max(kk, 1e-4);\n const ox = pl + (aw - bw * kk) / 2 - x0 * kk;\n const oy = pt + (ah - bh * kk) / 2 - y0 * kk;\n return [kk, ox, oy];\n };\n\n const zoomLimits = (): [number, number] => {\n const range = interaction()?.zoomRange ?? [0.02, 8];\n const fit = fitView();\n return [Math.min(range[0], fit ? fit[0] * 0.5 : range[0]), range[1]];\n };\n\n /**\n * Moves the view a `rate` of the way to `to` (geometric zoom, consistent\n * center); `true` while it has not arrived yet\n */\n const approachView = (to: [number, number, number], rate: number) => {\n const [k1, x1, y1] = to;\n const c0x = (width / 2 - tx) / k;\n const c0y = (height / 2 - ty) / k;\n const c1x = (width / 2 - x1) / k1;\n const c1y = (height / 2 - y1) / k1;\n const far =\n Math.abs(Math.log(k1 / k)) > 0.002 ||\n Math.hypot(c1x - c0x, c1y - c0y) * k1 > 0.5;\n if (!far) {\n [k, tx, ty] = to;\n return false;\n }\n const kk = k * Math.pow(k1 / k, rate);\n const cx = c0x + (c1x - c0x) * rate;\n const cy = c0y + (c1y - c0y) * rate;\n k = kk;\n tx = width / 2 - cx * kk;\n ty = height / 2 - cy * kk;\n return true;\n };\n\n const setView = (next: [number, number, number], animate: boolean) => {\n viewTween = null;\n if (animate && !reducedMotion?.matches && width > 0) {\n viewTween = { from: [k, tx, ty], to: next, start: now() };\n } else {\n [k, tx, ty] = next;\n }\n sceneDirty = true;\n invalidate();\n };\n\n const zoomAround = (\n factor: number,\n cx: number,\n cy: number,\n animate = false,\n ) => {\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, k * factor));\n const ratio = nk / k;\n setView([nk, cx - (cx - tx) * ratio, cy - (cy - ty) * ratio], animate);\n userMoved = true;\n };\n\n // ------------------------------------------------------------- legend\n\n let legendKey = \"\";\n const renderLegend = () => {\n const o = options.legend;\n const named = model.groups.filter((g) => g.count > 0);\n const show = o === undefined ? named.length > 1 : !!o && named.length > 0;\n const config = typeof o === \"object\" ? o : {};\n const toggle = config.toggle ?? true;\n const bottom = config.position === \"bottom\";\n let key = `${show}|${bottom}|${toggle}`;\n if (show) {\n for (const g of named) {\n const i = model.groups.indexOf(g);\n key += `\\n${g.id}\\u0001${g.name}\\u0001${toCss(groupColor[i] ?? theme.primary)}\\u0001${hiddenGroups.has(g.id)}`;\n }\n }\n if (key === legendKey) return;\n legendKey = key;\n const focused = [...dom.legend.children].indexOf(\n doc.activeElement as Element,\n );\n dom.legend.replaceChildren();\n dom.legend.style.display = show ? \"flex\" : \"none\";\n if (!show) return;\n dom.legend.style.order = bottom ? \"1\" : \"0\";\n dom.legend.style.padding = bottom ? \"8px 4px 0\" : \"0 4px 8px\";\n for (const g of named) {\n const i = model.groups.indexOf(g);\n const hidden = hiddenGroups.has(g.id);\n const item = doc.createElement(toggle ? \"button\" : \"span\");\n if (item instanceof HTMLButtonElement) {\n item.type = \"button\";\n item.setAttribute(\"aria-pressed\", String(!hidden));\n item.addEventListener(\"click\", () => toggleGroup(g.id));\n }\n style(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: toggle ? \"pointer\" : \"default\",\n opacity: hidden ? \"0.45\" : \"1\",\n textDecoration: hidden ? \"line-through\" : \"none\",\n });\n item.append(\n swatch(doc, toCss(groupColor[i] ?? theme.primary)),\n doc.createTextNode(g.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 toggleGroup = (id: string) => {\n const g = model.groups.find((group) => group.id === id);\n if (!g) return;\n const hidden = !hiddenGroups.has(id);\n if (hidden) hiddenGroups.add(id);\n else hiddenGroups.delete(id);\n dom.live.textContent = fill(hidden ? loc.labels.hidden : loc.labels.shown, {\n name: g.name,\n });\n // hidden nodes leave the selection and the focus\n for (const i of [...selection])\n if (\n fade(i) <= 0 &&\n model.groupOf[i] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[i]].id)\n )\n selection.delete(i);\n if (\n focusIndex >= 0 &&\n model.groupOf[focusIndex] >= 0 &&\n hiddenGroups.has(model.groups[model.groupOf[focusIndex]].id)\n )\n focusIndex = -1;\n if (hover) setHover(null);\n pathsDirty = true;\n sceneDirty = true;\n highlightKey = \"\";\n renderLegend();\n invalidate();\n emit(\"groupToggle\", { group: id, hidden });\n };\n\n // ------------------------------------------------------ accessibility\n\n const updateAccessibility = () => {\n const { labels, count } = loc;\n const role =\n layoutType === \"dag\" ? labels.dag : isTree() ? labels.tree : labels.chart;\n stage.setAttribute(\"aria-roledescription\", role);\n stage.setAttribute(\"aria-label\", options.ariaLabel ?? role);\n const keyboard = interaction()?.keyboard;\n if (keyboard) stage.tabIndex = 0;\n else stage.removeAttribute(\"tabindex\");\n const ia = interaction();\n stage.style.cursor = ia?.pan ? \"grab\" : \"default\";\n const lines = [\n fill(labels.summary, { nodes: count(model.n), edges: count(model.m) }),\n ];\n const names = model.groups.filter((g) => g.count > 0).map((g) => g.name);\n if (names.length)\n lines.push(\n fill(labels.groupsSummary, {\n groups: names.join(labels.listSeparator),\n }),\n );\n if (keyboard) lines.push(labels.keyboardHelp);\n dom.summary.textContent = lines.join(\" \");\n const controls = options.controls !== false && !!ia?.zoom;\n dom.controls.style.display = controls ? \"flex\" : \"none\";\n dom.zoomIn.setAttribute(\"aria-label\", labels.zoomIn);\n dom.zoomIn.title = labels.zoomIn;\n dom.zoomOut.setAttribute(\"aria-label\", labels.zoomOut);\n dom.zoomOut.title = labels.zoomOut;\n dom.fit.setAttribute(\"aria-label\", labels.fit);\n dom.fit.title = labels.fit;\n };\n\n // ------------------------------------------------------------- picking\n\n let pickGrid: Map<number, number[]> | null = null;\n let pickCell = 32;\n let maxExtent = 0;\n const pickKey = (cx: number, cy: number) =>\n (cx + 2097152) * 4194304 + (cy + 2097152);\n\n const buildPickGrid = () => {\n maxExtent = 0;\n for (let i = 0; i < model.n; i++)\n maxExtent = Math.max(maxExtent, sizing.width[i], sizing.height[i]);\n pickCell = Math.max(16, maxExtent);\n const grid = new Map<number, number[]>();\n for (let i = 0; i < model.n; i++) {\n if (fade(i) <= 0) continue;\n const key = pickKey(\n Math.floor(X[i] / pickCell),\n Math.floor(Y[i] / pickCell),\n );\n let list = grid.get(key);\n if (!list) grid.set(key, (list = []));\n list.push(i);\n }\n pickGrid = grid;\n };\n\n const pickNode = (px: number, py: number): number => {\n if (forcePending || !model.n) return -1;\n buildPickGrid();\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 3 / k;\n const minR = (model.n > 2000 ? 1 : 1.5) / k;\n const reach = Math.ceil((maxExtent / 2 + tol + minR) / pickCell);\n const cx = Math.floor(wx / pickCell);\n const cy = Math.floor(wy / pickCell);\n let best = -1;\n let bestD = Infinity;\n for (let oy = -reach; oy <= reach; oy++) {\n for (let ox = -reach; ox <= reach; ox++) {\n const list = pickGrid!.get(pickKey(cx + ox, cy + oy));\n if (!list) continue;\n for (const i of list) {\n const dx = wx - X[i];\n const dy = wy - Y[i];\n if (sizing.kind[i] === NodeKind.Circle) {\n const r = Math.max(sizing.width[i] / 2, minR) + tol;\n const d = dx * dx + dy * dy;\n if (d <= r * r && d <= bestD) {\n best = i;\n bestD = d;\n }\n } else if (\n Math.abs(dx) <= sizing.width[i] / 2 + tol &&\n Math.abs(dy) <= sizing.height[i] / 2 + tol\n ) {\n const d = dx * dx + dy * dy;\n if (d <= bestD) {\n best = i;\n bestD = d;\n }\n }\n }\n }\n }\n return best;\n };\n\n const pickEdge = (px: number, py: number): number => {\n if (forcePending) return -1;\n const wx = (px - tx) / k;\n const wy = (py - ty) / k;\n const tol = 4 / k;\n let best = -1;\n let bestD = tol * tol;\n const test = (e: number) => {\n if (Math.min(fade(model.source[e]), fade(model.target[e])) <= 0) return;\n let points: readonly number[] | null = paths[e] ?? null;\n if (!points) {\n const ends = straightEnds(e);\n if (!ends) return;\n points = ends;\n }\n const d = distanceToPath(points, wx, wy);\n if (d <= bestD) {\n best = e;\n bestD = d;\n }\n };\n if (model.m < EDGE_INDEX_MIN) {\n for (let e = 0; e < model.m; e++) test(e);\n return best;\n }\n const index = edgeIndex();\n if (!index) return -1;\n // candidates from the buckets around the pointer, exact distances\n const { cell, x0, y0, cols, rows, start, items, stamp } = index;\n const c0 = Math.max(0, Math.floor((wx - tol - x0) / cell));\n const c1 = Math.min(cols - 1, Math.floor((wx + tol - x0) / cell));\n const r0 = Math.max(0, Math.floor((wy - tol - y0) / cell));\n const r1 = Math.min(rows - 1, Math.floor((wy + tol - y0) / cell));\n const visit = ++index.visit;\n for (let r = r0; r <= r1; r++) {\n for (let c = c0; c <= c1; c++) {\n const b = r * cols + c;\n for (let q = start[b]; q < start[b + 1]; q++) {\n const e = items[q];\n if (stamp[e] === visit) continue;\n stamp[e] = visit;\n test(e);\n }\n }\n }\n return best;\n };\n\n // ---- spatial index of the edges (large graphs): every segment is\n // registered in the grid cells it crosses (CSR typed arrays)\n interface EdgeIndex {\n cell: number;\n x0: number;\n y0: number;\n cols: number;\n rows: number;\n start: Int32Array;\n items: Int32Array;\n stamp: Int32Array;\n visit: number;\n geometry: number;\n built: number;\n }\n let edgeGrid: EdgeIndex | null = null;\n\n const edgeIndex = (): EdgeIndex | null => {\n const current = edgeGrid;\n if (current && current.geometry === geometryVersion) return current;\n // a layout still moving: the last index stays good enough for the\n // candidates for a moment (the distances are always exact)\n if (current && runner?.running() && now() - current.built < 250)\n return current;\n const m = model.m;\n const segment = (e: number): readonly number[] | null =>\n Math.min(fade(model.source[e]), fade(model.target[e])) <= 0\n ? null\n : (paths[e] ?? straightEnds(e));\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n let length = 0;\n let segments = 0;\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 0; i < p.length; i += 2) {\n x0 = Math.min(x0, p[i]);\n x1 = Math.max(x1, p[i]);\n y0 = Math.min(y0, p[i + 1]);\n y1 = Math.max(y1, p[i + 1]);\n if (i) length += Math.hypot(p[i] - p[i - 2], p[i + 1] - p[i - 1]);\n }\n segments += p.length / 2 - 1;\n }\n if (!(x0 <= x1 && y0 <= y1)) return null;\n // about two cells per segment on average, at most 512 x 512 cells\n const span = Math.max(x1 - x0, y1 - y0, 1e-6);\n const cell = Math.max(\n span / 512,\n (length / Math.max(1, segments)) * 0.5,\n 1e-6,\n );\n const cols = Math.min(512, Math.floor((x1 - x0) / cell) + 1);\n const rows = Math.min(512, Math.floor((y1 - y0) / cell) + 1);\n const counts = new Int32Array(cols * rows + 1);\n const register = (pass: (b: number, e: number) => void) => {\n for (let e = 0; e < m; e++) {\n const p = segment(e);\n if (!p) continue;\n for (let i = 2; i < p.length; i += 2) {\n // long segments are walked in steps of one cell\n const ax = p[i - 2];\n const ay = p[i - 1];\n const steps = Math.max(\n 1,\n Math.ceil(Math.hypot(p[i] - ax, p[i + 1] - ay) / cell),\n );\n let prev = -1;\n for (let s = 0; s < steps; s++) {\n const bx0 = ax + ((p[i] - ax) * s) / steps;\n const by0 = ay + ((p[i + 1] - ay) * s) / steps;\n const bx1 = ax + ((p[i] - ax) * (s + 1)) / steps;\n const by1 = ay + ((p[i + 1] - ay) * (s + 1)) / steps;\n const c0 = Math.floor((Math.min(bx0, bx1) - x0) / cell);\n const c1 = Math.floor((Math.max(bx0, bx1) - x0) / cell);\n const r0 = Math.floor((Math.min(by0, by1) - y0) / cell);\n const r1 = Math.floor((Math.max(by0, by1) - y0) / cell);\n for (let r = Math.max(0, r0); r <= Math.min(rows - 1, r1); r++) {\n for (let c = Math.max(0, c0); c <= Math.min(cols - 1, c1); c++) {\n const b = r * cols + c;\n // consecutive pieces mostly share their cell\n if (b === prev) continue;\n prev = b;\n pass(b, e);\n }\n }\n }\n }\n }\n };\n register((b) => counts[b + 1]++);\n for (let b = 0; b < cols * rows; b++) counts[b + 1] += counts[b];\n const items = new Int32Array(counts[cols * rows]);\n const cursor = counts.slice(0, cols * rows);\n register((b, e) => {\n items[cursor[b]++] = e;\n });\n edgeGrid = {\n cell,\n x0,\n y0,\n cols,\n rows,\n start: counts,\n items,\n stamp: new Int32Array(m),\n visit: 0,\n geometry: geometryVersion,\n built: now(),\n };\n return edgeGrid;\n };\n\n const pickAt = (px: number, py: number): Hit | null => {\n const i = pickNode(px, py);\n if (i >= 0) return { type: \"node\", index: i };\n const wantsEdges =\n tooltipEnabled() || listening(\"hover\") || listening(\"click\");\n const e = wantsEdges ? pickEdge(px, py) : -1;\n return e >= 0 ? { type: \"edge\", index: e } : null;\n };\n\n // -------------------------------------------------------------- events\n\n const tooltipEnabled = () => options.tooltip !== false;\n\n const hoverEvent = (hit: Hit): GraphHoverEvent => {\n const offsetX = stage.offsetLeft;\n const offsetY = stage.offsetTop;\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n const g = model.groupOf[i];\n return {\n type: \"node\",\n id: node.id,\n node,\n index: model.nodeInput[i],\n group: g >= 0 ? model.groups[g].id : undefined,\n color: toCss(nodeColor[i]),\n degree: model.inDegree[i] + model.outDegree[i],\n clientX: screenX(i) + offsetX,\n clientY: screenY(i) + offsetY,\n };\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const path = paths[e];\n let mx = (X[s] + X[t]) / 2;\n let my = (Y[s] + Y[t]) / 2;\n if (path) {\n const p = pointAt(path, pathLength(path) / 2);\n mx = p[0];\n my = p[1];\n }\n return {\n type: \"edge\",\n id: `${edge.source}→${edge.target}`,\n edge,\n index: model.edgeInput[e],\n color: toCss(edgeColor[e]),\n clientX: mx * k + tx + offsetX,\n clientY: my * k + ty + offsetY,\n };\n };\n\n const sameHit = (a: Hit | null, b: Hit | null) =>\n a === b || (!!a && !!b && a.type === b.type && a.index === b.index);\n\n const setHover = (hit: Hit | null) => {\n if (sameHit(hit, hover)) {\n if (hit) positionTooltip();\n return;\n }\n hover = hit;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n emit(\"hover\", hit ? hoverEvent(hit) : null);\n };\n\n const tooltipTarget = (): Hit | null =>\n hover ??\n (focusVisible && focusIndex >= 0\n ? { type: \"node\", index: focusIndex }\n : null);\n\n const renderTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || !tooltipEnabled()) {\n tip.style.display = \"none\";\n return;\n }\n const event = hoverEvent(hit);\n const custom =\n typeof options.tooltip === \"object\" ? options.tooltip.render : undefined;\n const content = custom ? custom(event) : defaultTooltip(hit);\n if (content === null) {\n tip.style.display = \"none\";\n return;\n }\n if (typeof content === \"string\") tip.textContent = content;\n else tip.replaceChildren(content);\n tip.style.display = \"block\";\n positionTooltip();\n };\n\n const positionTooltip = () => {\n const tip = dom.tooltip;\n const hit = tooltipTarget();\n if (!hit || tip.style.display === \"none\") return;\n let ax: number;\n let ay: number;\n let gap = 14;\n if (hit.type === \"node\") {\n ax = screenX(hit.index);\n ay = screenY(hit.index);\n gap += (Math.max(sizing.width[hit.index], 0) * k) / 2;\n } else {\n const ev = hoverEvent(hit);\n ax = ev.clientX - stage.offsetLeft;\n ay = ev.clientY - stage.offsetTop;\n }\n const tw = tip.offsetWidth;\n const th = tip.offsetHeight;\n let x = ax + gap;\n if (x + tw > width - 4) x = ax - gap - tw;\n x = Math.max(4, Math.min(width - tw - 4, x));\n const y = Math.max(4, Math.min(height - th - 4, ay - th / 2));\n tip.style.transform = `translate(${Math.round(x)}px, ${Math.round(y)}px)`;\n };\n\n const row = (name: string, value: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n });\n const n = style(doc.createElement(\"span\"), {\n flex: \"1 1 auto\",\n color: \"var(--text-secondary-color, #6b7280)\",\n });\n n.textContent = name;\n const v = style(doc.createElement(\"span\"), {\n fontWeight: \"600\",\n fontVariantNumeric: \"tabular-nums\",\n marginLeft: \"12px\",\n });\n v.textContent = value;\n el.append(n, v);\n return el;\n };\n\n const header = (color: string, title: string) => {\n const el = style(doc.createElement(\"div\"), {\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n fontWeight: \"600\",\n marginBottom: \"2px\",\n color: \"var(--text-color, #1f2937)\",\n });\n el.append(swatch(doc, color), doc.createTextNode(title));\n return el;\n };\n\n const defaultTooltip = (hit: Hit): Node => {\n const { labels } = loc;\n const fragment = doc.createDocumentFragment();\n if (hit.type === \"node\") {\n const i = hit.index;\n const node = model.nodes[i];\n fragment.append(header(toCss(nodeColor[i]), labelOf(model, i)));\n if (node.subtitle) {\n const sub = style(doc.createElement(\"div\"), {\n color: \"var(--text-secondary-color, #6b7280)\",\n marginBottom: \"2px\",\n });\n sub.textContent = node.subtitle;\n fragment.append(sub);\n }\n const g = model.groupOf[i];\n if (g >= 0) fragment.append(row(labels.group, model.groups[g].name));\n if (Number.isFinite(node.value))\n fragment.append(row(labels.value, loc.value(node.value!)));\n const directed =\n layoutType === \"dag\" ||\n options.arrows ||\n model.edges.some((e) => e.directed);\n if (directed && !isTree()) {\n fragment.append(row(labels.incoming, loc.count(model.inDegree[i])));\n fragment.append(row(labels.outgoing, loc.count(model.outDegree[i])));\n } else if (!isTree()) {\n fragment.append(\n row(labels.degree, loc.count(model.inDegree[i] + model.outDegree[i])),\n );\n }\n if (isTree() && descendants[i] > 0 && !hasVisibleChild(i))\n fragment.append(row(labels.hiddenChildren, loc.count(descendants[i])));\n if (critical?.nodes[i]) {\n // a badge: full subtle border, tinted fill and a colored dot\n const color = toCss(criticalColor);\n const tag = style(doc.createElement(\"div\"), {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"5px\",\n marginTop: \"4px\",\n padding: \"0 8px\",\n borderRadius: \"999px\",\n border: `1px solid color-mix(in srgb, ${color} 35%, transparent)`,\n background: `color-mix(in srgb, ${color} 10%, transparent)`,\n color: \"var(--text-color, #1f2937)\",\n fontWeight: \"500\",\n lineHeight: \"18px\",\n });\n tag.className = \"minerva-chart-badge\";\n const dot = swatch(doc, color);\n style(dot, { width: \"7px\", height: \"7px\" });\n tag.append(dot, doc.createTextNode(labels.critical));\n fragment.append(tag);\n }\n return fragment;\n }\n const e = hit.index;\n const edge = model.edges[e];\n const s = model.source[e];\n const t = model.target[e];\n const arrow = edgeArrow[e] ? \" → \" : \" — \";\n fragment.append(\n header(\n toCss(edgeColor[e]),\n `${labelOf(model, s)}${arrow}${labelOf(model, t)}`,\n ),\n );\n if (edge.label) {\n const el = doc.createElement(\"div\");\n el.textContent = edge.label;\n fragment.append(el);\n }\n if (Number.isFinite(edge.value))\n fragment.append(row(labels.value, loc.value(edge.value!)));\n return fragment;\n };\n\n let hoverFrame = 0;\n let pendingHover: { x: number; y: number } | null = null;\n const scheduleHover = (x: number, y: number) => {\n pendingHover = { x, y };\n if (hoverFrame || !win) return;\n hoverFrame = win.requestAnimationFrame(() => {\n hoverFrame = 0;\n const p = pendingHover;\n pendingHover = null;\n if (!p || destroyed || drag) return;\n const hit = pickAt(p.x, p.y);\n setHover(hit);\n stage.style.cursor =\n hit?.type === \"node\"\n ? \"pointer\"\n : interaction()?.pan\n ? \"grab\"\n : \"default\";\n });\n };\n\n // --------------------------------------------------------- selection\n\n const setSelection = (next: Set<number>, notify: boolean) => {\n const same =\n next.size === selection.size && [...next].every((i) => selection.has(i));\n if (same) return;\n selection.clear();\n next.forEach((i) => selection.add(i));\n sceneDirty = true;\n invalidate();\n dom.live.textContent = selection.size\n ? fill(loc.labels.selected, { count: loc.count(selection.size) })\n : loc.labels.selectionCleared;\n if (notify)\n emit(\"select\", { ids: [...selection].map((i) => model.nodes[i].id) });\n };\n\n const selectNode = (i: number, additive: boolean) => {\n const ia = interaction();\n if (!ia?.select) return;\n const multi = ia.select === \"multiple\" || additive;\n const next = new Set(multi ? selection : []);\n if (multi && next.has(i)) next.delete(i);\n else next.add(i);\n setSelection(next, true);\n };\n\n // ------------------------------------------------------ collapse\n\n const setCollapsed = (i: number, collapse: boolean, notify: boolean) => {\n if (!tree || !tree.children[i]?.length) return false;\n const id = model.nodes[i].id;\n if (collapse === collapsedIds.has(id)) return false;\n if (collapse) collapsedIds.add(id);\n else collapsedIds.delete(id);\n const prev = snapshot();\n runLayout(prev, true);\n // hidden nodes leave the selection\n const kept = new Set([...selection].filter((j) => visible[j]));\n if (kept.size !== selection.size) setSelection(kept, true);\n if (focusIndex >= 0 && !visible[focusIndex]) focusIndex = i;\n dom.live.textContent = collapse\n ? fill(loc.labels.collapsed, {\n name: labelOf(model, i),\n count: loc.count(descendants[i]),\n })\n : fill(loc.labels.expanded, { name: labelOf(model, i) });\n if (notify) emit(\"toggle\", { id, collapsed: collapse });\n return true;\n };\n\n // -------------------------------------------------------- interaction\n\n interface DragState {\n mode: \"node\" | \"pan\" | \"pinch\";\n index: number;\n origin: { x: number; y: number };\n view: [number, number, number];\n offset: [number, number];\n distance: number;\n moved: boolean;\n button: number;\n }\n let drag: DragState | null = null;\n const pointers = new Map<number, { x: number; y: number }>();\n\n const local = (e: { clientX: number; clientY: number }) => {\n const r = stage.getBoundingClientRect();\n return { x: e.clientX - r.left, y: e.clientY - r.top };\n };\n\n const pinchInfo = () => {\n const pts = [...pointers.values()];\n const a = pts[0] ?? { x: 0, y: 0 };\n const b = pts[1] ?? a;\n return {\n distance: Math.hypot(a.x - b.x, a.y - b.y),\n center: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 },\n };\n };\n\n const onPointerDown = (e: PointerEvent) => {\n const ia = interaction();\n if (!ia) return;\n if ((e.target as Element | null)?.closest?.(\"button\")) return;\n const p = local(e);\n pointers.set(e.pointerId, p);\n stage.setPointerCapture?.(e.pointerId);\n viewTween = null;\n if (pointers.size === 2 && (ia.zoom || ia.pan)) {\n const { distance, center } = pinchInfo();\n drag = {\n mode: \"pinch\",\n index: -1,\n origin: center,\n view: [k, tx, ty],\n offset: [0, 0],\n distance,\n moved: true,\n button: 0,\n };\n return;\n }\n if (pointers.size > 1) return;\n const i = e.button === 0 ? pickNode(p.x, p.y) : -1;\n const base = {\n origin: p,\n view: [k, tx, ty] as [number, number, number],\n distance: 0,\n moved: false,\n button: e.button,\n };\n if (i >= 0 && ia.drag) {\n drag = {\n ...base,\n mode: \"node\",\n index: i,\n offset: [(p.x - tx) / k - X[i], (p.y - ty) / k - Y[i]],\n };\n } else {\n drag = { ...base, mode: \"pan\", index: i, offset: [0, 0] };\n }\n if (e.button === 1) e.preventDefault();\n };\n\n const onPointerMove = (e: PointerEvent) => {\n const p = local(e);\n if (pointers.has(e.pointerId)) pointers.set(e.pointerId, p);\n if (!drag) {\n if (e.pointerType === \"touch\" && pointers.size) return;\n scheduleHover(p.x, p.y);\n return;\n }\n const ia = interaction();\n if (!ia) return;\n if (drag.mode === \"pinch\") {\n const { distance, center } = pinchInfo();\n const [k0, x0, y0] = drag.view;\n const [lo, hi] = zoomLimits();\n const scale = ia.zoom && drag.distance > 0 ? distance / drag.distance : 1;\n const nk = Math.max(lo, Math.min(hi, k0 * scale));\n const ratio = nk / k0;\n const ox = drag.origin.x;\n const oy = drag.origin.y;\n const nx = ia.pan ? center.x : ox;\n const ny = ia.pan ? center.y : oy;\n k = nk;\n tx = nx - (ox - x0) * ratio;\n ty = ny - (oy - y0) * ratio;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n return;\n }\n const dx = p.x - drag.origin.x;\n const dy = p.y - drag.origin.y;\n if (!drag.moved && Math.hypot(dx, dy) < 3) return;\n if (!drag.moved) {\n drag.moved = true;\n if (hover) setHover(null);\n stage.style.cursor = drag.mode === \"node\" ? \"grabbing\" : \"grabbing\";\n }\n if (drag.mode === \"node\") {\n const i = drag.index;\n // the node stays under the pointer: stop following the layout\n followLayout = false;\n const wx = (p.x - tx) / k - drag.offset[0];\n const wy = (p.y - ty) / k - drag.offset[1];\n if (runner) runner.drag(i, wx, wy);\n else if (layoutType === \"force\") {\n // the simulation has finished: warm it up again from the current positions\n const prev = snapshot();\n startForceFrom(prev);\n (runner as ForceRunner | null)?.drag(i, wx, wy);\n }\n X[i] = TX[i] = wx;\n Y[i] = TY[i] = wy;\n pathsDirty = true;\n invalidate();\n return;\n }\n if (!ia.pan) return;\n const [k0, x0, y0] = drag.view;\n k = k0;\n tx = x0 + dx;\n ty = y0 + dy;\n userMoved = true;\n sceneDirty = true;\n invalidate();\n };\n\n const startForceFrom = (prev: Map<string, Snapshot>) => {\n stopRunner();\n // a drag warms the layout up again: the view stays where it is\n startForce(prev, false);\n };\n\n const onPointerUp = (e: PointerEvent) => {\n const was = drag;\n pointers.delete(e.pointerId);\n if (stage.hasPointerCapture?.(e.pointerId))\n stage.releasePointerCapture(e.pointerId);\n if (pointers.size) {\n if (was?.mode === \"pinch\") drag = null;\n return;\n }\n drag = null;\n stage.style.cursor = interaction()?.pan ? \"grab\" : \"default\";\n if (!was) return;\n if (was.mode === \"node\" && was.moved) {\n runner?.release(was.index, !!model.nodes[was.index].fixed);\n return;\n }\n if (was.moved || was.button !== 0) return;\n const p = local(e);\n const hit = pickAt(p.x, p.y);\n handleClick(hit, e.ctrlKey || e.metaKey || e.shiftKey);\n };\n\n const handleClick = (hit: Hit | null, additive: boolean) => {\n if (!hit) {\n if (selection.size && interaction()?.select)\n setSelection(new Set(), true);\n return;\n }\n const event = hoverEvent(hit);\n emit(\"click\", event);\n if (hit.type !== \"node\") return;\n const i = hit.index;\n if (collapsible() && tree?.children[i]?.length)\n setCollapsed(i, hasVisibleChild(i), true);\n selectNode(i, additive);\n };\n\n const onPointerCancel = (e: PointerEvent) => {\n pointers.delete(e.pointerId);\n if (!pointers.size) {\n if (drag?.mode === \"node\")\n runner?.release(drag.index, !!model.nodes[drag.index].fixed);\n drag = null;\n }\n };\n\n const onPointerLeave = () => {\n pendingHover = null;\n if (!drag && hover) setHover(null);\n };\n\n let hintTimer: ReturnType<typeof setTimeout> | 0 = 0;\n const showHint = () => {\n const mac = /Mac|iPhone|iPad/.test(win?.navigator?.platform ?? \"\");\n dom.hint.textContent = fill(loc.labels.zoomHint, {\n key: mac ? \"⌘\" : \"Ctrl\",\n });\n dom.hint.style.opacity = \"1\";\n if (hintTimer) clearTimeout(hintTimer);\n hintTimer = setTimeout(() => {\n hintTimer = 0;\n dom.hint.style.opacity = \"0\";\n }, 1200);\n };\n\n const onWheel = (e: WheelEvent) => {\n const ia = interaction();\n if (!ia?.zoom) return;\n const pinch = e.ctrlKey && !e.metaKey;\n if (ia.wheel === \"modifier\" && !e.ctrlKey && !e.metaKey) {\n if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) showHint();\n return;\n }\n e.preventDefault();\n const p = local(e);\n viewTween = null;\n zoomAround(1 / wheelFactor(e.deltaY, e.deltaMode, pinch), p.x, p.y);\n if (hover) setHover(null);\n };\n\n const onDoubleClick = (e: MouseEvent) => {\n if (!interaction()) return;\n const p = local(e);\n if (pickNode(p.x, p.y) >= 0) return;\n e.preventDefault();\n instance.fit(true);\n };\n\n const onFocus = () => {\n let keyboard: boolean;\n try {\n keyboard = stage.matches(\":focus-visible\");\n } catch {\n keyboard = true;\n }\n focusVisible = keyboard;\n if (keyboard)\n stage.style.boxShadow = \"0 0 0 2px var(--primary-color, #4f46e5)\";\n };\n\n const onBlur = () => {\n stage.style.boxShadow = \"\";\n focusVisible = false;\n if (focusIndex >= 0) {\n focusIndex = -1;\n renderTooltip();\n sceneDirty = true;\n invalidate();\n }\n };\n\n const drawnNodes = () => {\n const list: number[] = [];\n for (let i = 0; i < model.n; i++)\n if (fade(i) > 0 && !(tween && !visible[i])) list.push(i);\n return list;\n };\n\n const setFocus = (i: number) => {\n if (i === focusIndex) return;\n focusIndex = i;\n focusVisible = true;\n sceneDirty = true;\n // keep it in view\n const sx = screenX(i);\n const sy = screenY(i);\n const margin = 40;\n if (\n sx < margin ||\n sy < margin ||\n sx > width - margin ||\n sy > height - margin\n ) {\n setView([k, tx + width / 2 - sx, ty + height / 2 - sy], true);\n }\n const g = model.groupOf[i];\n const degree = model.inDegree[i] + model.outDegree[i];\n dom.live.textContent =\n g >= 0\n ? fill(loc.labels.nodeFocusGroup, {\n name: labelOf(model, i),\n group: model.groups[g].name,\n degree: loc.count(degree),\n })\n : fill(loc.labels.nodeFocus, {\n name: labelOf(model, i),\n degree: loc.count(degree),\n });\n renderTooltip();\n invalidate();\n emit(\"hover\", hoverEvent({ type: \"node\", index: i }));\n };\n\n /** Closest node in a direction (screen space) */\n const neighborInDirection = (\n from: number,\n dx: number,\n dy: number,\n ): number => {\n const sx = screenX(from);\n const sy = screenY(from);\n let best = -1;\n let bestScore = Infinity;\n for (const i of drawnNodes()) {\n if (i === from) continue;\n const vx = screenX(i) - sx;\n const vy = screenY(i) - sy;\n const along = vx * dx + vy * dy;\n if (along <= 0.5) continue;\n const across = Math.abs(vx * dy - vy * dx);\n if (across > along * 2.5) continue;\n const score = along + across * 2;\n if (score < bestScore) {\n bestScore = score;\n best = i;\n }\n }\n return best;\n };\n\n const startingNode = () => {\n const first = [...selection].find((i) => fade(i) > 0);\n if (first !== undefined) return first;\n for (const i of model.rank) if (fade(i) > 0) return i;\n return -1;\n };\n\n const onKeyDown = (e: KeyboardEvent) => {\n const ia = interaction();\n if (!ia?.keyboard) return;\n const dirs: Record<string, [number, number]> = {\n ArrowLeft: [-1, 0],\n ArrowRight: [1, 0],\n ArrowUp: [0, -1],\n ArrowDown: [0, 1],\n };\n const dir = dirs[e.key];\n if (dir) {\n e.preventDefault();\n if (focusIndex < 0 || fade(focusIndex) <= 0) {\n const start = startingNode();\n if (start >= 0) setFocus(start);\n return;\n }\n const next = neighborInDirection(focusIndex, dir[0], dir[1]);\n if (next >= 0) setFocus(next);\n return;\n }\n switch (e.key) {\n case \"Enter\":\n case \" \":\n if (focusIndex < 0) return;\n e.preventDefault();\n if (\n e.key === \"Enter\" &&\n collapsible() &&\n tree?.children[focusIndex]?.length\n )\n setCollapsed(focusIndex, hasVisibleChild(focusIndex), true);\n emit(\"click\", hoverEvent({ type: \"node\", index: focusIndex }));\n selectNode(focusIndex, e.ctrlKey || e.metaKey || e.key === \" \");\n return;\n case \"+\":\n case \"=\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"-\":\n case \"_\":\n if (!ia.zoom) return;\n e.preventDefault();\n zoomAround(1 / KEY_ZOOM, width / 2, height / 2, true);\n return;\n case \"0\":\n case \"Home\":\n e.preventDefault();\n instance.fit(true);\n return;\n case \"Escape\": {\n const had = focusIndex >= 0 || selection.size > 0 || !!hover;\n if (!had) return;\n e.preventDefault();\n focusIndex = -1;\n if (hover) setHover(null);\n setSelection(new Set(), true);\n renderTooltip();\n sceneDirty = true;\n invalidate();\n return;\n }\n default:\n }\n };\n\n const onZoomIn = () => zoomAround(BUTTON_ZOOM, width / 2, height / 2, true);\n const onZoomOut = () =>\n zoomAround(1 / BUTTON_ZOOM, width / 2, height / 2, true);\n const onFit = () => instance.fit(true);\n\n stage.addEventListener(\"pointerdown\", onPointerDown);\n stage.addEventListener(\"pointermove\", onPointerMove);\n stage.addEventListener(\"pointerup\", onPointerUp);\n stage.addEventListener(\"pointercancel\", onPointerCancel);\n stage.addEventListener(\"pointerleave\", onPointerLeave);\n stage.addEventListener(\"wheel\", onWheel, { passive: false });\n stage.addEventListener(\"dblclick\", onDoubleClick);\n stage.addEventListener(\"keydown\", onKeyDown);\n stage.addEventListener(\"focus\", onFocus);\n stage.addEventListener(\"blur\", onBlur);\n dom.zoomIn.addEventListener(\"click\", onZoomIn);\n dom.zoomOut.addEventListener(\"click\", onZoomOut);\n dom.fit.addEventListener(\"click\", onFit);\n\n // ----------------------------------------------------------- watchers\n\n const resizeObserver =\n typeof ResizeObserver === \"function\"\n ? new ResizeObserver(() => invalidate())\n : null;\n resizeObserver?.observe(stage);\n\n const refreshTheme = () => {\n if (destroyed) return;\n const next = readTheme(dom.root, options.palette);\n const fontChanged = next.fontFamily !== theme.fontFamily;\n if (!themeColorsChanged(theme, next) && !fontChanged) return;\n theme = next;\n if (fontChanged) {\n runLayout(snapshot(), false);\n return;\n }\n refreshColors();\n legendKey = \"\";\n renderLegend();\n highlightKey = \"\";\n invalidate();\n };\n const unwatchTheme = watchTheme(refreshTheme);\n\n const unwatchLocale = watchLocale(() => {\n if (destroyed || resolveLocale(options.locale) === loc.locale) return;\n loc = graphLocale(options.locale, options.labels);\n updateAccessibility();\n if (hover || focusIndex >= 0) renderTooltip();\n });\n\n // ----------------------------------------------------------- renderer\n\n const initRenderer = async (exclude: Set<ChartRendererKind> = new Set()) => {\n const token = ++rendererToken;\n const next = await createRenderer(\n options.renderer ?? \"auto\",\n () => {\n const canvas = style(doc.createElement(\"canvas\"), {\n position: \"absolute\",\n left: \"0\",\n top: \"0\",\n pointerEvents: \"none\",\n });\n canvas.setAttribute(\"aria-hidden\", \"true\");\n canvas.className = \"minerva-chart-data\";\n return canvas;\n },\n (kind) => {\n if (destroyed || renderer?.kind !== kind) return;\n renderer.destroy();\n renderer.canvas.remove();\n renderer = null;\n void initRenderer(new Set([...exclude, kind]));\n },\n exclude,\n );\n if (destroyed || token !== rendererToken) {\n next?.destroy();\n return;\n }\n if (renderer) {\n renderer.destroy();\n renderer.canvas.remove();\n }\n renderer = next;\n sceneDirty = true;\n if (next) {\n dom.root.dataset.renderer = next.kind;\n stage.insertBefore(next.canvas, dom.foreground);\n emit(\"renderer\", next.kind);\n } else {\n delete dom.root.dataset.renderer;\n }\n resolveReady(next?.kind ?? null);\n invalidate();\n };\n\n // ---------------------------------------------------------- startup\n\n const initialState = (o: GraphChartOptions) => {\n collapsedIds.clear();\n for (const node of o.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n hiddenGroups.clear();\n for (const g of o.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n };\n\n const applySelectedOption = () => {\n if (!options.selected) return;\n const next = new Set<number>();\n for (const id of options.selected) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n selection.clear();\n next.forEach((i) => selection.add(i));\n highlightKey = \"\";\n sceneDirty = true;\n };\n\n initialState(options);\n runLayout(new Map(), false);\n applySelectedOption();\n void initRenderer();\n const unfollowDefault = followDefaultRenderer(\n () => options.renderer,\n () => void initRenderer(),\n );\n\n // ---------------------------------------------------------------- api\n\n const replaceData = (next: GraphChartOptions, dataChanged: boolean) => {\n const prev = snapshot();\n const ids = [...selection].map((i) => model.nodes[i].id);\n const focusId = focusIndex >= 0 ? model.nodes[focusIndex].id : null;\n if (dataChanged) {\n // collapsed / hidden flags of the new data\n for (const node of next.nodes ?? [])\n if (node?.collapsed) collapsedIds.add(node.id);\n model = buildModel(next.nodes ?? [], next.edges ?? [], next.groups);\n for (const g of next.groups ?? []) if (g?.hidden) hiddenGroups.add(g.id);\n selection.clear();\n for (const id of ids) {\n const i = model.index.get(id);\n if (i !== undefined) selection.add(i);\n }\n focusIndex = focusId !== null ? (model.index.get(focusId) ?? -1) : -1;\n hover = null;\n dom.tooltip.style.display = \"none\";\n }\n runLayout(prev, true);\n };\n\n const instance: GraphChartInstance = {\n setOptions(next) {\n if (destroyed) return;\n const previous = options;\n options = next;\n if ((next.palette ?? []).join() !== (previous.palette ?? []).join()) {\n theme = readTheme(dom.root, next.palette);\n }\n if (next.locale !== previous.locale || next.labels !== previous.labels) {\n loc = graphLocale(next.locale, next.labels);\n }\n const dataChanged =\n next.nodes !== previous.nodes ||\n next.edges !== previous.edges ||\n next.groups !== previous.groups;\n const sig = layoutSignature(next);\n if (dataChanged || sig !== layoutSig) {\n layoutSig = sig;\n replaceData(next, dataChanged);\n } else {\n refreshCritical();\n refreshColors();\n pathsDirty = true;\n highlightKey = \"\";\n legendKey = \"\";\n renderLegend();\n updateAccessibility();\n invalidate();\n }\n if (\n (next.selected ?? []).join(\"\\u0001\") !==\n (previous.selected ?? []).join(\"\\u0001\")\n )\n applySelectedOption();\n if ((next.renderer ?? \"auto\") !== (previous.renderer ?? \"auto\"))\n void initRenderer();\n },\n setData(data) {\n if (destroyed) return;\n instance.setOptions({\n ...options,\n nodes: data.nodes,\n edges: data.edges,\n groups: data.groups ?? options.groups,\n });\n },\n fit(animate = true) {\n if (destroyed) return;\n userMoved = false;\n // keep the view fitted while the layout still moves\n if (runner?.running()) followLayout = true;\n const target = fitView();\n if (target) setView(target, animate);\n else needsFit = true;\n invalidate();\n },\n focusNode(id, opts = {}) {\n if (destroyed) return;\n let i = model.index.get(id);\n if (i === undefined) return;\n // expand the collapsed ancestors first\n if (tree && !visible[i]) {\n let changed = false;\n for (let a = tree.parent[i]; a >= 0; a = tree.parent[a]) {\n if (collapsedIds.delete(model.nodes[a].id)) changed = true;\n }\n if (changed) runLayout(snapshot(), opts.animate !== false);\n i = model.index.get(id)!;\n }\n const kk = opts.zoom ?? Math.max(k, 1);\n const [lo, hi] = zoomLimits();\n const nk = Math.max(lo, Math.min(hi, kk));\n userMoved = true;\n const w = width || stage.clientWidth;\n const h = height || stage.clientHeight;\n setView(\n [nk, w / 2 - TX[i] * nk, h / 2 - TY[i] * nk],\n opts.animate !== false,\n );\n focusIndex = i;\n highlightKey = \"\";\n sceneDirty = true;\n invalidate();\n },\n select(ids) {\n if (destroyed) return;\n const list = ids === null ? [] : typeof ids === \"string\" ? [ids] : ids;\n const next = new Set<number>();\n for (const id of list) {\n const i = model.index.get(id);\n if (i !== undefined) next.add(i);\n }\n setSelection(next, true);\n },\n getSelection: () => [...selection].map((i) => model.nodes[i].id),\n expand(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!collapsedIds.size) return;\n const ids = [...collapsedIds];\n collapsedIds.clear();\n runLayout(snapshot(), true);\n for (const c of ids) {\n if (model.index.has(c)) emit(\"toggle\", { id: c, collapsed: false });\n }\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, false, true);\n else collapsedIds.delete(id);\n },\n collapse(id) {\n if (destroyed) return;\n if (id === undefined) {\n if (!tree) return;\n const changed: string[] = [];\n tree.children.forEach((list, i) => {\n const nodeId = model.nodes[i].id;\n if (\n list.length &&\n tree!.parent[i] >= 0 &&\n !collapsedIds.has(nodeId)\n ) {\n collapsedIds.add(nodeId);\n changed.push(nodeId);\n }\n });\n if (!changed.length) return;\n runLayout(snapshot(), true);\n for (const c of changed) emit(\"toggle\", { id: c, collapsed: true });\n return;\n }\n const i = model.index.get(id);\n if (i !== undefined) setCollapsed(i, true, true);\n },\n toggle(id) {\n const i = model.index.get(id);\n if (i === undefined || destroyed) return;\n setCollapsed(i, hasVisibleChild(i), true);\n },\n getPositions() {\n const out: Record<string, GraphPoint> = {};\n for (let i = 0; i < model.n; i++) {\n out[model.nodes[i].id] = { x: TX[i], y: TY[i] };\n }\n return out;\n },\n relayout() {\n if (destroyed) return;\n runLayout(layoutType === \"force\" ? new Map() : snapshot(), true);\n },\n resize() {\n invalidate();\n },\n getRenderer: () => renderer?.kind ?? null,\n ready,\n refreshTheme,\n on(type, listener) {\n let set = listeners.get(type);\n if (!set) {\n set = new Set();\n listeners.set(type, set);\n }\n set.add(listener as (e: never) => void);\n return () => {\n set.delete(listener as (e: never) => void);\n };\n },\n destroy() {\n if (destroyed) return;\n destroyed = true;\n rendererToken++;\n if (frameId) win?.cancelAnimationFrame(frameId);\n if (hoverFrame) win?.cancelAnimationFrame(hoverFrame);\n if (hintTimer) clearTimeout(hintTimer);\n frameId = 0;\n hoverFrame = 0;\n stopRunner();\n resizeObserver?.disconnect();\n unfollowDefault();\n unwatchTheme();\n unwatchLocale();\n stage.removeEventListener(\"pointerdown\", onPointerDown);\n stage.removeEventListener(\"pointermove\", onPointerMove);\n stage.removeEventListener(\"pointerup\", onPointerUp);\n stage.removeEventListener(\"pointercancel\", onPointerCancel);\n stage.removeEventListener(\"pointerleave\", onPointerLeave);\n stage.removeEventListener(\"wheel\", onWheel);\n stage.removeEventListener(\"dblclick\", onDoubleClick);\n stage.removeEventListener(\"keydown\", onKeyDown);\n stage.removeEventListener(\"focus\", onFocus);\n stage.removeEventListener(\"blur\", onBlur);\n dom.zoomIn.removeEventListener(\"click\", onZoomIn);\n dom.zoomOut.removeEventListener(\"click\", onZoomOut);\n dom.fit.removeEventListener(\"click\", onFit);\n renderer?.destroy();\n renderer = null;\n listeners.clear();\n resolveReady(null);\n dom.root.remove();\n },\n };\n return instance;\n};\n\nfunction isDark(theme: ChartTheme): boolean {\n return luminance(theme.background) < 0.4 || luminance(theme.text) > 0.6;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require("./force.cjs");var t=e=>{let{n:t}=e,n=new Int32Array(t);for(let r=0;r<e.source.length;r++){let i=e.source[r],a=e.target[r];i<0||a<0||i>=t||a>=t||(n[i]++,n[a]++)}let r=Array.from({length:t},(e,t)=>t);if(e.order===`none`)return r;let i=t=>{let n=e.group[t];return n<0?2**53-1:n};return r.sort((t,r)=>e.order===`group`?i(t)-i(r)||t-r:n[r]-n[t]||t-r)},n=e=>{let n=t(e),{n:r}=e,i=Math.max(40,r*e.spacing/(2*Math.PI)),a=new Float64Array(r),o=new Float64Array(r),s=new Float64Array(r),c=[];n.forEach((t,r)=>{r&&e.group[t]!==e.group[n[r-1]]&&c.push(r)});let l=e.order===`group`&&c.length>0,u=r+(l?c.length+1:0),d=0;return n.forEach((e,t)=>{l&&c.includes(t)&&d++;let n=d/Math.max(1,u)*Math.PI*2-Math.PI/2;s[e]=n,a[e]=r>1?i*Math.cos(n):0,o[e]=r>1?i*Math.sin(n):0,d++}),{x:a,y:o,angle:s,order:n,radius:r>1?i:0}},r=e=>{let n=t(e),{n:r}=e,i=new Float64Array(r),a=new Float64Array(r),o=(r-1)*e.spacing;return n.forEach((t,n)=>{i[t]=n*e.spacing-o/2}),{x:i,y:a,angle:new Float64Array(r),order:n,radius:0}},i=(t,n,r)=>{let{source:i,target:a}=e.indexGraph(t,n),o=new Map,s=t.map(e=>{if(e.group===void 0)return-1;let t=o.get(e.group);return t===void 0&&o.set(e.group,t=o.size),t});return{n:t.length,source:i,target:a,group:s,order:r.order??`group`,spacing:r.spacing??18}},a=(e,t,r={})=>n(i(e,t,r)),o=(e,t,n={})=>r(i(e,t,n));exports.arcLayout=o,exports.arcPositions=r,exports.circularLayout=a,exports.circularPositions=n;
2
+ //# sourceMappingURL=circular.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circular.cjs","names":["indexGraph","require_force","placementOrder","input","degree","n","e","s","t","order","i","groupKey","g","a","b","circularPositions","radius","x","y","angle","groupBreaks","k","v","useBreaks","slots","slot","arcPositions","width","inputOf","nodes","edges","groups","group","node","options","circularLayout","arcLayout"],"sources":["../../../../../charts/src/engine/graph/circular.ts"],"sourcesContent":["// Circular layout (nodes on a circle, grouped) and arc diagram (nodes on a\n// line, edges as arcs). No DOM.\n\nimport { indexGraph } from \"./force\";\nimport type {\n GraphCircularLayoutOptions,\n GraphCircularLayoutResult,\n GraphEdge,\n GraphNode,\n} from \"./types\";\n\nexport interface CircularInput {\n n: number;\n source: ArrayLike<number>;\n target: ArrayLike<number>;\n /** Group index of each node (-1 = none) */\n group: ArrayLike<number>;\n order: \"group\" | \"degree\" | \"none\";\n spacing: number;\n}\n\n/** Placement order of the nodes */\nconst placementOrder = (input: CircularInput): number[] => {\n const { n } = input;\n const degree = new Int32Array(n);\n for (let e = 0; e < input.source.length; e++) {\n const s = input.source[e];\n const t = input.target[e];\n if (s < 0 || t < 0 || s >= n || t >= n) continue;\n degree[s]++;\n degree[t]++;\n }\n const order = Array.from({ length: n }, (_, i) => i);\n if (input.order === \"none\") return order;\n const groupKey = (i: number) => {\n const g = input.group[i];\n return g < 0 ? Number.MAX_SAFE_INTEGER : g;\n };\n return order.sort((a, b) =>\n input.order === \"group\"\n ? groupKey(a) - groupKey(b) || a - b\n : degree[b] - degree[a] || a - b,\n );\n};\n\nexport const circularPositions = (\n input: CircularInput,\n): GraphCircularLayoutResult => {\n const order = placementOrder(input);\n const { n } = input;\n const radius = Math.max(40, (n * input.spacing) / (2 * Math.PI));\n const x = new Float64Array(n);\n const y = new Float64Array(n);\n const angle = new Float64Array(n);\n // a small gap between groups makes them readable\n const groupBreaks: number[] = [];\n order.forEach((v, k) => {\n if (k && input.group[v] !== input.group[order[k - 1]]) groupBreaks.push(k);\n });\n const useBreaks = input.order === \"group\" && groupBreaks.length > 0;\n const slots = n + (useBreaks ? groupBreaks.length + 1 : 0);\n let slot = 0;\n order.forEach((v, k) => {\n if (useBreaks && groupBreaks.includes(k)) slot++;\n const a = (slot / Math.max(1, slots)) * Math.PI * 2 - Math.PI / 2;\n angle[v] = a;\n x[v] = n > 1 ? radius * Math.cos(a) : 0;\n y[v] = n > 1 ? radius * Math.sin(a) : 0;\n slot++;\n });\n return { x, y, angle, order, radius: n > 1 ? radius : 0 };\n};\n\nexport const arcPositions = (\n input: CircularInput,\n): GraphCircularLayoutResult => {\n const order = placementOrder(input);\n const { n } = input;\n const x = new Float64Array(n);\n const y = new Float64Array(n);\n const width = (n - 1) * input.spacing;\n order.forEach((v, k) => {\n x[v] = k * input.spacing - width / 2;\n });\n return { x, y, angle: new Float64Array(n), order, radius: 0 };\n};\n\nconst inputOf = (\n nodes: readonly GraphNode[],\n edges: readonly GraphEdge[],\n options: GraphCircularLayoutOptions,\n): CircularInput => {\n const { source, target } = indexGraph(nodes, edges);\n const groups = new Map<string, number>();\n const group = nodes.map((node) => {\n if (node.group === undefined) return -1;\n let g = groups.get(node.group);\n if (g === undefined) groups.set(node.group, (g = groups.size));\n return g;\n });\n return {\n n: nodes.length,\n source,\n target,\n group,\n order: options.order ?? \"group\",\n spacing: options.spacing ?? 18,\n };\n};\n\n/** Nodes on a circle, ordered by group (or degree) */\nexport const circularLayout = (\n nodes: readonly GraphNode[],\n edges: readonly GraphEdge[],\n options: GraphCircularLayoutOptions = {},\n): GraphCircularLayoutResult =>\n circularPositions(inputOf(nodes, edges, options));\n\n/** Nodes on a horizontal line (arc diagram), ordered by group (or degree) */\nexport const arcLayout = (\n nodes: readonly GraphNode[],\n edges: readonly GraphEdge[],\n options: GraphCircularLayoutOptions = {},\n): GraphCircularLayoutResult => arcPositions(inputOf(nodes, edges, options));\n"],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { GraphCircularLayoutOptions, GraphCircularLayoutResult, GraphEdge, GraphNode } from './types.cjs';
2
+ export interface CircularInput {
3
+ n: number;
4
+ source: ArrayLike<number>;
5
+ target: ArrayLike<number>;
6
+ /** Group index of each node (-1 = none) */
7
+ group: ArrayLike<number>;
8
+ order: "group" | "degree" | "none";
9
+ spacing: number;
10
+ }
11
+ export declare const circularPositions: (input: CircularInput) => GraphCircularLayoutResult;
12
+ export declare const arcPositions: (input: CircularInput) => GraphCircularLayoutResult;
13
+ /** Nodes on a circle, ordered by group (or degree) */
14
+ export declare const circularLayout: (nodes: readonly GraphNode[], edges: readonly GraphEdge[], options?: GraphCircularLayoutOptions) => GraphCircularLayoutResult;
15
+ /** Nodes on a horizontal line (arc diagram), ordered by group (or degree) */
16
+ export declare const arcLayout: (nodes: readonly GraphNode[], edges: readonly GraphEdge[], options?: GraphCircularLayoutOptions) => GraphCircularLayoutResult;
@@ -0,0 +1,16 @@
1
+ import { GraphCircularLayoutOptions, GraphCircularLayoutResult, GraphEdge, GraphNode } from './types.js';
2
+ export interface CircularInput {
3
+ n: number;
4
+ source: ArrayLike<number>;
5
+ target: ArrayLike<number>;
6
+ /** Group index of each node (-1 = none) */
7
+ group: ArrayLike<number>;
8
+ order: "group" | "degree" | "none";
9
+ spacing: number;
10
+ }
11
+ export declare const circularPositions: (input: CircularInput) => GraphCircularLayoutResult;
12
+ export declare const arcPositions: (input: CircularInput) => GraphCircularLayoutResult;
13
+ /** Nodes on a circle, ordered by group (or degree) */
14
+ export declare const circularLayout: (nodes: readonly GraphNode[], edges: readonly GraphEdge[], options?: GraphCircularLayoutOptions) => GraphCircularLayoutResult;
15
+ /** Nodes on a horizontal line (arc diagram), ordered by group (or degree) */
16
+ export declare const arcLayout: (nodes: readonly GraphNode[], edges: readonly GraphEdge[], options?: GraphCircularLayoutOptions) => GraphCircularLayoutResult;