@unovis/ts 1.0.0-alpha.4

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 (504) hide show
  1. package/LICENSE +193 -0
  2. package/components/area/config.d.ts +25 -0
  3. package/components/area/config.js +16 -0
  4. package/components/area/config.js.map +1 -0
  5. package/components/area/index.d.ts +19 -0
  6. package/components/area/index.js +103 -0
  7. package/components/area/index.js.map +1 -0
  8. package/components/area/style.d.ts +3 -0
  9. package/components/area/style.js +32 -0
  10. package/components/area/style.js.map +1 -0
  11. package/components/area/types.d.ts +6 -0
  12. package/components/axis/config.d.ts +74 -0
  13. package/components/axis/config.js +33 -0
  14. package/components/axis/config.js.map +1 -0
  15. package/components/axis/index.d.ts +51 -0
  16. package/components/axis/index.js +291 -0
  17. package/components/axis/index.js.map +1 -0
  18. package/components/axis/modules/tick.d.ts +5 -0
  19. package/components/axis/modules/tick.js +48 -0
  20. package/components/axis/modules/tick.js.map +1 -0
  21. package/components/axis/style.d.ts +9 -0
  22. package/components/axis/style.js +95 -0
  23. package/components/axis/style.js.map +1 -0
  24. package/components/axis/types.d.ts +4 -0
  25. package/components/axis/types.js +8 -0
  26. package/components/axis/types.js.map +1 -0
  27. package/components/brush/config.d.ts +42 -0
  28. package/components/brush/config.js +24 -0
  29. package/components/brush/config.js.map +1 -0
  30. package/components/brush/index.d.ts +28 -0
  31. package/components/brush/index.js +199 -0
  32. package/components/brush/index.js.map +1 -0
  33. package/components/brush/style.d.ts +5 -0
  34. package/components/brush/style.js +63 -0
  35. package/components/brush/style.js.map +1 -0
  36. package/components/brush/types.d.ts +7 -0
  37. package/components/brush/types.js +8 -0
  38. package/components/brush/types.js.map +1 -0
  39. package/components/bullet-legend/config.d.ts +24 -0
  40. package/components/bullet-legend/config.js +16 -0
  41. package/components/bullet-legend/config.js.map +1 -0
  42. package/components/bullet-legend/index.d.ts +19 -0
  43. package/components/bullet-legend/index.js +79 -0
  44. package/components/bullet-legend/index.js.map +1 -0
  45. package/components/bullet-legend/style.d.ts +6 -0
  46. package/components/bullet-legend/style.js +66 -0
  47. package/components/bullet-legend/style.js.map +1 -0
  48. package/components/bullet-legend/types.d.ts +7 -0
  49. package/components/chord-diagram/config.d.ts +42 -0
  50. package/components/chord-diagram/config.js +25 -0
  51. package/components/chord-diagram/config.js.map +1 -0
  52. package/components/chord-diagram/index.d.ts +52 -0
  53. package/components/chord-diagram/index.js +280 -0
  54. package/components/chord-diagram/index.js.map +1 -0
  55. package/components/chord-diagram/modules/label.d.ts +8 -0
  56. package/components/chord-diagram/modules/label.js +128 -0
  57. package/components/chord-diagram/modules/label.js.map +1 -0
  58. package/components/chord-diagram/modules/link.d.ts +20 -0
  59. package/components/chord-diagram/modules/link.js +35 -0
  60. package/components/chord-diagram/modules/link.js.map +1 -0
  61. package/components/chord-diagram/modules/node.d.ts +17 -0
  62. package/components/chord-diagram/modules/node.js +52 -0
  63. package/components/chord-diagram/modules/node.js.map +1 -0
  64. package/components/chord-diagram/style.d.ts +13 -0
  65. package/components/chord-diagram/style.js +88 -0
  66. package/components/chord-diagram/style.js.map +1 -0
  67. package/components/chord-diagram/types.d.ts +40 -0
  68. package/components/chord-diagram/types.js +8 -0
  69. package/components/chord-diagram/types.js.map +1 -0
  70. package/components/crosshair/config.d.ts +43 -0
  71. package/components/crosshair/config.js +19 -0
  72. package/components/crosshair/config.js.map +1 -0
  73. package/components/crosshair/index.d.ts +35 -0
  74. package/components/crosshair/index.js +180 -0
  75. package/components/crosshair/index.js.map +1 -0
  76. package/components/crosshair/style.d.ts +4 -0
  77. package/components/crosshair/style.js +25 -0
  78. package/components/crosshair/style.js.map +1 -0
  79. package/components/crosshair/types.d.ts +13 -0
  80. package/components/donut/config.d.ts +45 -0
  81. package/components/donut/config.js +25 -0
  82. package/components/donut/config.js.map +1 -0
  83. package/components/donut/index.d.ts +20 -0
  84. package/components/donut/index.js +84 -0
  85. package/components/donut/index.js.map +1 -0
  86. package/components/donut/modules/arc.d.ts +10 -0
  87. package/components/donut/modules/arc.js +53 -0
  88. package/components/donut/modules/arc.js.map +1 -0
  89. package/components/donut/style.d.ts +6 -0
  90. package/components/donut/style.js +53 -0
  91. package/components/donut/style.js.map +1 -0
  92. package/components/donut/types.d.ts +12 -0
  93. package/components/flow-legend/config.d.ts +26 -0
  94. package/components/flow-legend/config.js +17 -0
  95. package/components/flow-legend/config.js.map +1 -0
  96. package/components/flow-legend/index.d.ts +16 -0
  97. package/components/flow-legend/index.js +73 -0
  98. package/components/flow-legend/index.js.map +1 -0
  99. package/components/flow-legend/style.d.ts +8 -0
  100. package/components/flow-legend/style.js +80 -0
  101. package/components/flow-legend/style.js.map +1 -0
  102. package/components/flow-legend/types.d.ts +9 -0
  103. package/components/flow-legend/types.js +8 -0
  104. package/components/flow-legend/types.js.map +1 -0
  105. package/components/free-brush/config.d.ts +45 -0
  106. package/components/free-brush/config.js +24 -0
  107. package/components/free-brush/config.js.map +1 -0
  108. package/components/free-brush/index.d.ts +20 -0
  109. package/components/free-brush/index.js +191 -0
  110. package/components/free-brush/index.js.map +1 -0
  111. package/components/free-brush/style.d.ts +4 -0
  112. package/components/free-brush/style.js +50 -0
  113. package/components/free-brush/style.js.map +1 -0
  114. package/components/free-brush/types.d.ts +7 -0
  115. package/components/free-brush/types.js +9 -0
  116. package/components/free-brush/types.js.map +1 -0
  117. package/components/graph/config.d.ts +207 -0
  118. package/components/graph/config.js +75 -0
  119. package/components/graph/config.js.map +1 -0
  120. package/components/graph/index.d.ts +125 -0
  121. package/components/graph/index.js +653 -0
  122. package/components/graph/index.js.map +1 -0
  123. package/components/graph/modules/layout-helpers.d.ts +2 -0
  124. package/components/graph/modules/layout-helpers.js +11 -0
  125. package/components/graph/modules/layout-helpers.js.map +1 -0
  126. package/components/graph/modules/layout.d.ts +9 -0
  127. package/components/graph/modules/layout.js +343 -0
  128. package/components/graph/modules/layout.js.map +1 -0
  129. package/components/graph/modules/link/helper.d.ts +25 -0
  130. package/components/graph/modules/link/helper.js +78 -0
  131. package/components/graph/modules/link/helper.js.map +1 -0
  132. package/components/graph/modules/link/index.d.ts +12 -0
  133. package/components/graph/modules/link/index.js +201 -0
  134. package/components/graph/modules/link/index.js.map +1 -0
  135. package/components/graph/modules/link/style.d.ts +15 -0
  136. package/components/graph/modules/link/style.js +112 -0
  137. package/components/graph/modules/link/style.js.map +1 -0
  138. package/components/graph/modules/node/helper.d.ts +21 -0
  139. package/components/graph/modules/node/helper.js +127 -0
  140. package/components/graph/modules/node/helper.js.map +1 -0
  141. package/components/graph/modules/node/index.d.ts +12 -0
  142. package/components/graph/modules/node/index.js +248 -0
  143. package/components/graph/modules/node/index.js.map +1 -0
  144. package/components/graph/modules/node/style.d.ts +24 -0
  145. package/components/graph/modules/node/style.js +273 -0
  146. package/components/graph/modules/node/style.js.map +1 -0
  147. package/components/graph/modules/panel/helper.d.ts +16 -0
  148. package/components/graph/modules/panel/helper.js +110 -0
  149. package/components/graph/modules/panel/helper.js.map +1 -0
  150. package/components/graph/modules/panel/index.d.ts +7 -0
  151. package/components/graph/modules/panel/index.js +103 -0
  152. package/components/graph/modules/panel/index.js.map +1 -0
  153. package/components/graph/modules/panel/style.d.ts +14 -0
  154. package/components/graph/modules/panel/style.js +123 -0
  155. package/components/graph/modules/panel/style.js.map +1 -0
  156. package/components/graph/modules/shape.d.ts +7 -0
  157. package/components/graph/modules/shape.js +80 -0
  158. package/components/graph/modules/shape.js.map +1 -0
  159. package/components/graph/modules/zoom-levels.d.ts +6 -0
  160. package/components/graph/modules/zoom-levels.js +10 -0
  161. package/components/graph/modules/zoom-levels.js.map +1 -0
  162. package/components/graph/style.d.ts +6 -0
  163. package/components/graph/style.js +66 -0
  164. package/components/graph/style.js.map +1 -0
  165. package/components/graph/types.d.ts +120 -0
  166. package/components/graph/types.js +29 -0
  167. package/components/graph/types.js.map +1 -0
  168. package/components/grouped-bar/config.d.ts +36 -0
  169. package/components/grouped-bar/config.js +20 -0
  170. package/components/grouped-bar/config.js.map +1 -0
  171. package/components/grouped-bar/index.d.ts +30 -0
  172. package/components/grouped-bar/index.js +231 -0
  173. package/components/grouped-bar/index.js.map +1 -0
  174. package/components/grouped-bar/style.d.ts +5 -0
  175. package/components/grouped-bar/style.js +36 -0
  176. package/components/grouped-bar/style.js.map +1 -0
  177. package/components/leaflet-flow-map/config.d.ts +46 -0
  178. package/components/leaflet-flow-map/config.js +25 -0
  179. package/components/leaflet-flow-map/config.js.map +1 -0
  180. package/components/leaflet-flow-map/index.d.ts +51 -0
  181. package/components/leaflet-flow-map/index.js +219 -0
  182. package/components/leaflet-flow-map/index.js.map +1 -0
  183. package/components/leaflet-flow-map/renderer-utils.d.ts +5 -0
  184. package/components/leaflet-flow-map/renderer-utils.js +15 -0
  185. package/components/leaflet-flow-map/renderer-utils.js.map +1 -0
  186. package/components/leaflet-flow-map/renderer.d.ts +26 -0
  187. package/components/leaflet-flow-map/renderer.js +117 -0
  188. package/components/leaflet-flow-map/renderer.js.map +1 -0
  189. package/components/leaflet-flow-map/shaders.d.ts +2 -0
  190. package/components/leaflet-flow-map/shaders.js +27 -0
  191. package/components/leaflet-flow-map/shaders.js.map +1 -0
  192. package/components/leaflet-flow-map/types.d.ts +23 -0
  193. package/components/leaflet-map/config.d.ts +175 -0
  194. package/components/leaflet-map/config.js +67 -0
  195. package/components/leaflet-map/config.js.map +1 -0
  196. package/components/leaflet-map/index.d.ts +95 -0
  197. package/components/leaflet-map/index.js +648 -0
  198. package/components/leaflet-map/index.js.map +1 -0
  199. package/components/leaflet-map/leaflet.css.js +4 -0
  200. package/components/leaflet-map/leaflet.css.js.map +1 -0
  201. package/components/leaflet-map/modules/clusterBackground.d.ts +4 -0
  202. package/components/leaflet-map/modules/clusterBackground.js +27 -0
  203. package/components/leaflet-map/modules/clusterBackground.js.map +1 -0
  204. package/components/leaflet-map/modules/donut.d.ts +3 -0
  205. package/components/leaflet-map/modules/donut.js +25 -0
  206. package/components/leaflet-map/modules/donut.js.map +1 -0
  207. package/components/leaflet-map/modules/map.d.ts +13 -0
  208. package/components/leaflet-map/modules/map.js +143 -0
  209. package/components/leaflet-map/modules/map.js.map +1 -0
  210. package/components/leaflet-map/modules/node.d.ts +8 -0
  211. package/components/leaflet-map/modules/node.js +148 -0
  212. package/components/leaflet-map/modules/node.js.map +1 -0
  213. package/components/leaflet-map/modules/selectionRing.d.ts +6 -0
  214. package/components/leaflet-map/modules/selectionRing.js +41 -0
  215. package/components/leaflet-map/modules/selectionRing.js.map +1 -0
  216. package/components/leaflet-map/modules/utils.d.ts +49 -0
  217. package/components/leaflet-map/modules/utils.js +206 -0
  218. package/components/leaflet-map/modules/utils.js.map +1 -0
  219. package/components/leaflet-map/renderer/leaflet-maplibre-gl.js +273 -0
  220. package/components/leaflet-map/renderer/leaflet-maplibre-gl.js.map +1 -0
  221. package/components/leaflet-map/renderer/map-style.d.ts +4 -0
  222. package/components/leaflet-map/renderer/map-style.js +15 -0
  223. package/components/leaflet-map/renderer/map-style.js.map +1 -0
  224. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-dark-theme.json.js +40 -0
  225. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-dark-theme.json.js.map +1 -0
  226. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-light-theme.json.js +40 -0
  227. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-light-theme.json.js.map +1 -0
  228. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-settings.json.js +4987 -0
  229. package/components/leaflet-map/renderer/mapboxgl/mapboxgl-settings.json.js.map +1 -0
  230. package/components/leaflet-map/renderer/mapboxgl-layer.d.ts +7 -0
  231. package/components/leaflet-map/renderer/mapboxgl-layer.js +27 -0
  232. package/components/leaflet-map/renderer/mapboxgl-layer.js.map +1 -0
  233. package/components/leaflet-map/renderer/mapboxgl-utils.d.ts +5 -0
  234. package/components/leaflet-map/renderer/mapboxgl-utils.js +39 -0
  235. package/components/leaflet-map/renderer/mapboxgl-utils.js.map +1 -0
  236. package/components/leaflet-map/renderer/maplibre-gl.css.js +4 -0
  237. package/components/leaflet-map/renderer/maplibre-gl.css.js.map +1 -0
  238. package/components/leaflet-map/style.d.ts +19 -0
  239. package/components/leaflet-map/style.js +192 -0
  240. package/components/leaflet-map/style.js.map +1 -0
  241. package/components/leaflet-map/types.d.ts +70 -0
  242. package/components/leaflet-map/types.js +10 -0
  243. package/components/leaflet-map/types.js.map +1 -0
  244. package/components/line/config.d.ts +30 -0
  245. package/components/line/config.js +17 -0
  246. package/components/line/config.js.map +1 -0
  247. package/components/line/index.d.ts +27 -0
  248. package/components/line/index.js +139 -0
  249. package/components/line/index.js.map +1 -0
  250. package/components/line/style.d.ts +6 -0
  251. package/components/line/style.js +35 -0
  252. package/components/line/style.js.map +1 -0
  253. package/components/line/types.d.ts +12 -0
  254. package/components/radial-dendrogram/config.d.ts +34 -0
  255. package/components/radial-dendrogram/config.js +20 -0
  256. package/components/radial-dendrogram/config.js.map +1 -0
  257. package/components/radial-dendrogram/index.d.ts +22 -0
  258. package/components/radial-dendrogram/index.js +98 -0
  259. package/components/radial-dendrogram/index.js.map +1 -0
  260. package/components/radial-dendrogram/modules/label.d.ts +8 -0
  261. package/components/radial-dendrogram/modules/label.js +70 -0
  262. package/components/radial-dendrogram/modules/label.js.map +1 -0
  263. package/components/radial-dendrogram/modules/link.d.ts +19 -0
  264. package/components/radial-dendrogram/modules/link.js +59 -0
  265. package/components/radial-dendrogram/modules/link.js.map +1 -0
  266. package/components/radial-dendrogram/modules/node.d.ts +16 -0
  267. package/components/radial-dendrogram/modules/node.js +51 -0
  268. package/components/radial-dendrogram/modules/node.js.map +1 -0
  269. package/components/radial-dendrogram/style.d.ts +6 -0
  270. package/components/radial-dendrogram/style.js +54 -0
  271. package/components/radial-dendrogram/style.js.map +1 -0
  272. package/components/radial-dendrogram/types.d.ts +34 -0
  273. package/components/sankey/config.d.ts +162 -0
  274. package/components/sankey/config.js +65 -0
  275. package/components/sankey/config.js.map +1 -0
  276. package/components/sankey/index.d.ts +59 -0
  277. package/components/sankey/index.js +299 -0
  278. package/components/sankey/index.js.map +1 -0
  279. package/components/sankey/modules/label.d.ts +23 -0
  280. package/components/sankey/modules/label.js +164 -0
  281. package/components/sankey/modules/label.js.map +1 -0
  282. package/components/sankey/modules/link.d.ts +13 -0
  283. package/components/sankey/modules/link.js +108 -0
  284. package/components/sankey/modules/link.js.map +1 -0
  285. package/components/sankey/modules/node.d.ts +10 -0
  286. package/components/sankey/modules/node.js +156 -0
  287. package/components/sankey/modules/node.js.map +1 -0
  288. package/components/sankey/style.d.ts +20 -0
  289. package/components/sankey/style.js +164 -0
  290. package/components/sankey/style.js.map +1 -0
  291. package/components/sankey/types.d.ts +84 -0
  292. package/components/sankey/types.js +34 -0
  293. package/components/sankey/types.js.map +1 -0
  294. package/components/scatter/config.d.ts +44 -0
  295. package/components/scatter/config.js +23 -0
  296. package/components/scatter/config.js.map +1 -0
  297. package/components/scatter/index.d.ts +19 -0
  298. package/components/scatter/index.js +123 -0
  299. package/components/scatter/index.js.map +1 -0
  300. package/components/scatter/modules/point.d.ts +7 -0
  301. package/components/scatter/modules/point.js +98 -0
  302. package/components/scatter/modules/point.js.map +1 -0
  303. package/components/scatter/style.d.ts +5 -0
  304. package/components/scatter/style.js +53 -0
  305. package/components/scatter/style.js.map +1 -0
  306. package/components/scatter/types.d.ts +13 -0
  307. package/components/stacked-bar/config.d.ts +38 -0
  308. package/components/stacked-bar/config.js +20 -0
  309. package/components/stacked-bar/config.js.map +1 -0
  310. package/components/stacked-bar/index.d.ts +27 -0
  311. package/components/stacked-bar/index.js +193 -0
  312. package/components/stacked-bar/index.js.map +1 -0
  313. package/components/stacked-bar/style.d.ts +5 -0
  314. package/components/stacked-bar/style.js +36 -0
  315. package/components/stacked-bar/style.js.map +1 -0
  316. package/components/stacked-bar/types.d.ts +5 -0
  317. package/components/timeline/config.d.ts +43 -0
  318. package/components/timeline/config.js +23 -0
  319. package/components/timeline/config.js.map +1 -0
  320. package/components/timeline/index.d.ts +43 -0
  321. package/components/timeline/index.js +235 -0
  322. package/components/timeline/index.js.map +1 -0
  323. package/components/timeline/style.d.ts +12 -0
  324. package/components/timeline/style.js +86 -0
  325. package/components/timeline/style.js.map +1 -0
  326. package/components/tooltip/config.d.ts +46 -0
  327. package/components/tooltip/config.js +19 -0
  328. package/components/tooltip/config.js.map +1 -0
  329. package/components/tooltip/index.d.ts +34 -0
  330. package/components/tooltip/index.js +147 -0
  331. package/components/tooltip/index.js.map +1 -0
  332. package/components/tooltip/style.js +72 -0
  333. package/components/tooltip/style.js.map +1 -0
  334. package/components/topojson-map/config.d.ts +99 -0
  335. package/components/topojson-map/config.js +42 -0
  336. package/components/topojson-map/config.js.map +1 -0
  337. package/components/topojson-map/index.d.ts +52 -0
  338. package/components/topojson-map/index.js +355 -0
  339. package/components/topojson-map/index.js.map +1 -0
  340. package/components/topojson-map/style.d.ts +11 -0
  341. package/components/topojson-map/style.js +97 -0
  342. package/components/topojson-map/style.js.map +1 -0
  343. package/components/topojson-map/types.d.ts +48 -0
  344. package/components/topojson-map/types.js +45 -0
  345. package/components/topojson-map/types.js.map +1 -0
  346. package/components/topojson-map/utils.d.ts +3 -0
  347. package/components/topojson-map/utils.js +30 -0
  348. package/components/topojson-map/utils.js.map +1 -0
  349. package/components/vis-controls/config.d.ts +12 -0
  350. package/components/vis-controls/config.js +13 -0
  351. package/components/vis-controls/config.js.map +1 -0
  352. package/components/vis-controls/index.d.ts +14 -0
  353. package/components/vis-controls/index.js +52 -0
  354. package/components/vis-controls/index.js.map +1 -0
  355. package/components/vis-controls/style.d.ts +11 -0
  356. package/components/vis-controls/style.js +75 -0
  357. package/components/vis-controls/style.js.map +1 -0
  358. package/components/vis-controls/types.d.ts +13 -0
  359. package/components/vis-controls/types.js +8 -0
  360. package/components/vis-controls/types.js.map +1 -0
  361. package/components/xy-labels/config.d.ts +48 -0
  362. package/components/xy-labels/config.js +25 -0
  363. package/components/xy-labels/config.js.map +1 -0
  364. package/components/xy-labels/index.d.ts +15 -0
  365. package/components/xy-labels/index.js +86 -0
  366. package/components/xy-labels/index.js.map +1 -0
  367. package/components/xy-labels/modules/label.d.ts +9 -0
  368. package/components/xy-labels/modules/label.js +105 -0
  369. package/components/xy-labels/modules/label.js.map +1 -0
  370. package/components/xy-labels/style.d.ts +5 -0
  371. package/components/xy-labels/style.js +53 -0
  372. package/components/xy-labels/style.js.map +1 -0
  373. package/components/xy-labels/types.d.ts +23 -0
  374. package/components/xy-labels/types.js +9 -0
  375. package/components/xy-labels/types.js.map +1 -0
  376. package/components.d.ts +52 -0
  377. package/containers/single-container/config.d.ts +12 -0
  378. package/containers/single-container/config.js +12 -0
  379. package/containers/single-container/config.js.map +1 -0
  380. package/containers/single-container/index.d.ts +17 -0
  381. package/containers/single-container/index.js +115 -0
  382. package/containers/single-container/index.js.map +1 -0
  383. package/containers/xy-container/config.d.ts +99 -0
  384. package/containers/xy-container/config.js +30 -0
  385. package/containers/xy-container/config.js.map +1 -0
  386. package/containers/xy-container/index.d.ts +33 -0
  387. package/containers/xy-container/index.js +322 -0
  388. package/containers/xy-container/index.js.map +1 -0
  389. package/containers.d.ts +6 -0
  390. package/core/component/config.d.ts +58 -0
  391. package/core/component/config.js +14 -0
  392. package/core/component/config.js.map +1 -0
  393. package/core/component/index.d.ts +38 -0
  394. package/core/component/index.js +112 -0
  395. package/core/component/index.js.map +1 -0
  396. package/core/component/types.d.ts +2 -0
  397. package/core/config/index.d.ts +3 -0
  398. package/core/config/index.js +16 -0
  399. package/core/config/index.js.map +1 -0
  400. package/core/container/config.d.ts +38 -0
  401. package/core/container/config.js +29 -0
  402. package/core/container/config.js.map +1 -0
  403. package/core/container/index.d.ts +25 -0
  404. package/core/container/index.js +92 -0
  405. package/core/container/index.js.map +1 -0
  406. package/core/xy-component/config.d.ts +38 -0
  407. package/core/xy-component/config.js +20 -0
  408. package/core/xy-component/config.js.map +1 -0
  409. package/core/xy-component/index.d.ts +25 -0
  410. package/core/xy-component/index.js +65 -0
  411. package/core/xy-component/index.js.map +1 -0
  412. package/data-models/core.d.ts +6 -0
  413. package/data-models/core.js +14 -0
  414. package/data-models/core.js.map +1 -0
  415. package/data-models/graph.d.ts +24 -0
  416. package/data-models/graph.js +101 -0
  417. package/data-models/graph.js.map +1 -0
  418. package/data-models/map-graph.d.ts +23 -0
  419. package/data-models/map-graph.js +59 -0
  420. package/data-models/map-graph.js.map +1 -0
  421. package/data-models/map.d.ts +5 -0
  422. package/data-models/map.js +12 -0
  423. package/data-models/map.js.map +1 -0
  424. package/data-models/series.d.ts +6 -0
  425. package/data-models/series.js +19 -0
  426. package/data-models/series.js.map +1 -0
  427. package/index.d.ts +4 -0
  428. package/index.js +49 -0
  429. package/index.js.map +1 -0
  430. package/maps/china-provinces.json.js +140373 -0
  431. package/maps/fr-regions.json.js +14162 -0
  432. package/maps/germany-regions.json.js +35760 -0
  433. package/maps/ind-regions.json.js +290584 -0
  434. package/maps/uk-regions.json.js +96233 -0
  435. package/maps/us-counties.json.js +206318 -0
  436. package/maps/us-states.json.js +16345 -0
  437. package/maps/world-110m-alpha.json.js +251366 -0
  438. package/maps/world-simple.json.js +89428 -0
  439. package/maps/world-simplest.json.js +28175 -0
  440. package/maps.d.ts +60 -0
  441. package/maps.js +23 -0
  442. package/package.json +58 -0
  443. package/styles/colors.d.ts +4 -0
  444. package/styles/colors.js +11 -0
  445. package/styles/colors.js.map +1 -0
  446. package/styles/css-variables.d.ts +2 -0
  447. package/styles/css-variables.js +16 -0
  448. package/styles/css-variables.js.map +1 -0
  449. package/types/accessor.d.ts +5 -0
  450. package/types/component.d.ts +13 -0
  451. package/types/component.js +14 -0
  452. package/types/component.js.map +1 -0
  453. package/types/curve.d.ts +40 -0
  454. package/types/curve.js +46 -0
  455. package/types/curve.js.map +1 -0
  456. package/types/data.d.ts +7 -0
  457. package/types/direction.d.ts +6 -0
  458. package/types/direction.js +10 -0
  459. package/types/direction.js.map +1 -0
  460. package/types/graph.d.ts +35 -0
  461. package/types/map.d.ts +4 -0
  462. package/types/misc.d.ts +8 -0
  463. package/types/position.d.ts +20 -0
  464. package/types/position.js +27 -0
  465. package/types/position.js.map +1 -0
  466. package/types/scale.d.ts +23 -0
  467. package/types/scale.js +27 -0
  468. package/types/scale.js.map +1 -0
  469. package/types/shape.d.ts +7 -0
  470. package/types/shape.js +11 -0
  471. package/types/shape.js.map +1 -0
  472. package/types/spacing.d.ts +6 -0
  473. package/types/symbol.d.ts +18 -0
  474. package/types/symbol.js +24 -0
  475. package/types/symbol.js.map +1 -0
  476. package/types/text.d.ts +38 -0
  477. package/types/text.js +31 -0
  478. package/types/text.js.map +1 -0
  479. package/types.d.ts +28 -0
  480. package/utils/color.d.ts +9 -0
  481. package/utils/color.js +26 -0
  482. package/utils/color.js.map +1 -0
  483. package/utils/d3.d.ts +3 -0
  484. package/utils/d3.js +16 -0
  485. package/utils/d3.js.map +1 -0
  486. package/utils/data.d.ts +123 -0
  487. package/utils/data.js +193 -0
  488. package/utils/data.js.map +1 -0
  489. package/utils/html.d.ts +1 -0
  490. package/utils/html.js +15 -0
  491. package/utils/html.js.map +1 -0
  492. package/utils/map.d.ts +2 -0
  493. package/utils/map.js +20 -0
  494. package/utils/map.js.map +1 -0
  495. package/utils/misc.d.ts +16 -0
  496. package/utils/misc.js +42 -0
  497. package/utils/misc.js.map +1 -0
  498. package/utils/path.d.ts +21 -0
  499. package/utils/path.js +144 -0
  500. package/utils/path.js.map +1 -0
  501. package/utils/scale.d.ts +1 -0
  502. package/utils/text.d.ts +17 -0
  503. package/utils/text.js +196 -0
  504. package/utils/text.js.map +1 -0
@@ -0,0 +1,42 @@
1
+ import { ComponentConfigInterface, ComponentConfig } from "../../core/component/config";
2
+ import { ColorAccessor, NumericAccessor, StringAccessor } from "../../types/accessor";
3
+ import { CurveType } from "../../types/curve";
4
+ import { ChordInputLink, ChordInputNode, ChordLabelAlignment, ChordNode } from './types';
5
+ export interface ChordDiagramConfigInterface<N extends ChordInputNode, L extends ChordInputLink> extends ComponentConfigInterface {
6
+ /** Link value accessor function. Default: `l => l.value` */
7
+ linkValue?: NumericAccessor<L>;
8
+ /** Array of node hierarchy levels. Data records are supposed to have corresponding properties, e.g. ['level1', 'level2']. Default: `[]` */
9
+ nodeLevels?: string[];
10
+ /** Node width in pixels. Default: `15` */
11
+ nodeWidth?: number;
12
+ /** Node color accessor function ot constant value. Default: `d => d.color` */
13
+ nodeColor?: ColorAccessor<ChordNode<N>>;
14
+ /** Node label accessor function. Default: `d => d.label ?? d.key` */
15
+ nodeLabel?: StringAccessor<N>;
16
+ /** Node label alignment. Default: `ChordLabelAlignment.Along` */
17
+ nodeLabelAlignment?: ChordLabelAlignment | string;
18
+ /** Pad angle in radians. Constant value or accessor function. Default: `0.02` */
19
+ padAngle?: NumericAccessor<N>;
20
+ /** Corner radius constant value or accessor function. Default: `2` */
21
+ cornerRadius?: NumericAccessor<N>;
22
+ /** Angular range of the diagram. Default: `[0, 2 * Math.PI]` */
23
+ angleRange?: [number, number];
24
+ /** Curve type. Default: `CurveType.CatmullRom` */
25
+ curveType?: CurveType;
26
+ /** The exponent property of the radius scale. Default: `2` */
27
+ radiusScaleExponent?: number;
28
+ }
29
+ export declare class ChordDiagramConfig<N extends ChordInputNode, L extends ChordInputLink> extends ComponentConfig implements ChordDiagramConfigInterface<N, L> {
30
+ duration: number;
31
+ linkValue: (d: L) => number;
32
+ nodeLevels: any[];
33
+ nodeWidth: number;
34
+ nodeColor: any;
35
+ nodeLabel: (d: N) => string;
36
+ nodeLabelAlignment: ChordLabelAlignment;
37
+ padAngle: number;
38
+ cornerRadius: number;
39
+ angleRange: [number, number];
40
+ curveType: CurveType;
41
+ radiusScaleExponent: number;
42
+ }
@@ -0,0 +1,25 @@
1
+ import { ComponentConfig } from '../../core/component/config.js';
2
+ import { CurveType } from '../../types/curve.js';
3
+ import { ChordLabelAlignment } from './types.js';
4
+
5
+ /* eslint-disable dot-notation */
6
+ class ChordDiagramConfig extends ComponentConfig {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.duration = 800;
10
+ this.linkValue = (d) => d['value'];
11
+ this.nodeLevels = [];
12
+ this.nodeWidth = 15;
13
+ this.nodeColor = undefined;
14
+ this.nodeLabel = (d) => { var _a; return (_a = d['label']) !== null && _a !== void 0 ? _a : d['key']; };
15
+ this.nodeLabelAlignment = ChordLabelAlignment.Along;
16
+ this.padAngle = 0.02;
17
+ this.cornerRadius = 2;
18
+ this.angleRange = [0, 2 * Math.PI];
19
+ this.curveType = CurveType.CatmullRom;
20
+ this.radiusScaleExponent = 2;
21
+ }
22
+ }
23
+
24
+ export { ChordDiagramConfig };
25
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sources":["../../../src/components/chord-diagram/config.ts"],"sourcesContent":["/* eslint-disable dot-notation */\n\n// Core\nimport { ComponentConfigInterface, ComponentConfig } from 'core/component/config'\n\n// Types\nimport { ColorAccessor, NumericAccessor, StringAccessor } from 'types/accessor'\nimport { CurveType } from 'types/curve'\n\n// Local Types\nimport { ChordInputLink, ChordInputNode, ChordLabelAlignment, ChordNode } from './types'\n\nexport interface ChordDiagramConfigInterface<N extends ChordInputNode, L extends ChordInputLink> extends ComponentConfigInterface {\n /** Link value accessor function. Default: `l => l.value` */\n linkValue?: NumericAccessor<L>;\n /** Array of node hierarchy levels. Data records are supposed to have corresponding properties, e.g. ['level1', 'level2']. Default: `[]` */\n nodeLevels?: string[];\n /** Node width in pixels. Default: `15` */\n nodeWidth?: number;\n /** Node color accessor function ot constant value. Default: `d => d.color` */\n nodeColor?: ColorAccessor<ChordNode<N>>;\n /** Node label accessor function. Default: `d => d.label ?? d.key` */\n nodeLabel?: StringAccessor<N>;\n /** Node label alignment. Default: `ChordLabelAlignment.Along` */\n nodeLabelAlignment?: ChordLabelAlignment | string;\n /** Pad angle in radians. Constant value or accessor function. Default: `0.02` */\n padAngle?: NumericAccessor<N>;\n /** Corner radius constant value or accessor function. Default: `2` */\n cornerRadius?: NumericAccessor<N>;\n /** Angular range of the diagram. Default: `[0, 2 * Math.PI]` */\n angleRange?: [number, number];\n /** Curve type. Default: `CurveType.CatmullRom` */\n curveType?: CurveType;\n /** The exponent property of the radius scale. Default: `2` */\n radiusScaleExponent?: number;\n}\n\nexport class ChordDiagramConfig<N extends ChordInputNode, L extends ChordInputLink> extends ComponentConfig implements ChordDiagramConfigInterface<N, L> {\n duration = 800\n linkValue = (d: L): number => d['value']\n nodeLevels = []\n nodeWidth = 15\n nodeColor = undefined\n nodeLabel = (d: N): string => d['label'] ?? d['key']\n nodeLabelAlignment = ChordLabelAlignment.Along\n padAngle = 0.02\n cornerRadius = 2\n angleRange: [number, number] = [0, 2 * Math.PI]\n curveType = CurveType.CatmullRom\n radiusScaleExponent = 2\n}\n"],"names":[],"mappings":";;;;AAAA;AAqCM,MAAO,kBAAuE,SAAQ,eAAe,CAAA;AAA3G,IAAA,WAAA,GAAA;;QACE,IAAQ,CAAA,QAAA,GAAG,GAAG,CAAA;QACd,IAAS,CAAA,SAAA,GAAG,CAAC,CAAI,KAAa,CAAC,CAAC,OAAO,CAAC,CAAA;QACxC,IAAU,CAAA,UAAA,GAAG,EAAE,CAAA;QACf,IAAS,CAAA,SAAA,GAAG,EAAE,CAAA;QACd,IAAS,CAAA,SAAA,GAAG,SAAS,CAAA;AACrB,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,CAAI,KAAY,EAAA,IAAA,EAAA,CAAA,CAAC,OAAA,CAAA,EAAA,GAAA,CAAC,CAAC,OAAO,CAAC,mCAAI,CAAC,CAAC,KAAK,CAAC,CAAA,EAAA,CAAA;AACpD,QAAA,IAAA,CAAA,kBAAkB,GAAG,mBAAmB,CAAC,KAAK,CAAA;QAC9C,IAAQ,CAAA,QAAA,GAAG,IAAI,CAAA;QACf,IAAY,CAAA,YAAA,GAAG,CAAC,CAAA;QAChB,IAAU,CAAA,UAAA,GAAqB,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;AAC/C,QAAA,IAAA,CAAA,SAAS,GAAG,SAAS,CAAC,UAAU,CAAA;QAChC,IAAmB,CAAA,mBAAA,GAAG,CAAC,CAAA;KACxB;AAAA;;;;"}
@@ -0,0 +1,52 @@
1
+ import { Selection } from 'd3-selection';
2
+ import { ScalePower } from 'd3-scale';
3
+ import { ComponentCore } from "../../core/component";
4
+ import { GraphDataModel } from "../../data-models/graph";
5
+ import { Spacing } from "../../types/spacing";
6
+ import { ChordInputNode, ChordInputLink, ChordNode, ChordRibbon, ChordRibbonPoint } from './types';
7
+ import { ChordDiagramConfig, ChordDiagramConfigInterface } from './config';
8
+ import * as s from './style';
9
+ export declare class ChordDiagram<N extends ChordInputNode, L extends ChordInputLink> extends ComponentCore<{
10
+ nodes: N[];
11
+ links?: L[];
12
+ }> {
13
+ static selectors: typeof s;
14
+ config: ChordDiagramConfig<N, L>;
15
+ datamodel: GraphDataModel<N, L>;
16
+ nodeGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>;
17
+ linkGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>;
18
+ labelGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>;
19
+ arcGen: import("d3-shape").Arc<any, ChordNode<N>>;
20
+ radiusScale: ScalePower<number, number>;
21
+ linkAreaGen: import("d3-shape").Area<ChordRibbonPoint>;
22
+ private _nodes;
23
+ private _links;
24
+ private _rootNode;
25
+ private _hierarchyNodes;
26
+ events: {
27
+ [x: string]: {
28
+ mouseover: (d: ChordNode<N>) => void;
29
+ mouseout: () => void;
30
+ } | {
31
+ mouseover: (d: ChordRibbon<N>) => void;
32
+ mouseout: () => void;
33
+ };
34
+ };
35
+ constructor(config?: ChordDiagramConfigInterface<N, L>);
36
+ setData(data: {
37
+ nodes: N[];
38
+ links?: L[];
39
+ }): void;
40
+ setConfig(config: ChordDiagramConfigInterface<N, L>): void;
41
+ get bleed(): Spacing;
42
+ _render(customDuration?: number): void;
43
+ private _getHierarchyNodes;
44
+ private _getRibbons;
45
+ private _convertRadialToCartesian;
46
+ private _calculateRadialPosition;
47
+ private _onNodeMouseOver;
48
+ private _onNodeMouseOut;
49
+ private _onLinkMouseOver;
50
+ private _onLinkMouseOut;
51
+ private _highlightOnHover;
52
+ }
@@ -0,0 +1,280 @@
1
+ import { nest } from 'd3-collection';
2
+ import { hierarchy, partition } from 'd3-hierarchy';
3
+ import { arc, area } from 'd3-shape';
4
+ import { scalePow } from 'd3-scale';
5
+ import { max } from 'd3-array';
6
+ import { ComponentCore } from '../../core/component/index.js';
7
+ import { GraphDataModel } from '../../data-models/graph.js';
8
+ import { isNumber, getNumber, groupBy } from '../../utils/data.js';
9
+ import { Curve } from '../../types/curve.js';
10
+ import { ChordLabelAlignment } from './types.js';
11
+ import { ChordDiagramConfig } from './config.js';
12
+ import { createNode, updateNode, removeNode } from './modules/node.js';
13
+ import { createLabel, updateLabel, removeLabel } from './modules/label.js';
14
+ import { createLink, updateLink, removeLink } from './modules/link.js';
15
+ import * as style from './style.js';
16
+ import { nodes, links, labels, link, node, gLabel, labelExit, hoveredNode, hoveredLink, transparent } from './style.js';
17
+
18
+ class ChordDiagram extends ComponentCore {
19
+ constructor(config) {
20
+ super();
21
+ this.config = new ChordDiagramConfig();
22
+ this.datamodel = new GraphDataModel();
23
+ this.arcGen = arc();
24
+ this.radiusScale = scalePow();
25
+ this.linkAreaGen = area();
26
+ this._nodes = [];
27
+ this._links = [];
28
+ this.events = {
29
+ [ChordDiagram.selectors.node]: {
30
+ mouseover: this._onNodeMouseOver.bind(this),
31
+ mouseout: this._onNodeMouseOut.bind(this),
32
+ },
33
+ [ChordDiagram.selectors.link]: {
34
+ mouseover: this._onLinkMouseOver.bind(this),
35
+ mouseout: this._onLinkMouseOut.bind(this),
36
+ },
37
+ };
38
+ if (config)
39
+ this.config.init(config);
40
+ this.linkGroup = this.g.append('g').attr('class', nodes);
41
+ this.nodeGroup = this.g.append('g').attr('class', links);
42
+ this.labelGroup = this.g.append('g').attr('class', labels);
43
+ }
44
+ setData(data) {
45
+ this.datamodel.data = data;
46
+ this._hierarchyNodes = this._getHierarchyNodes();
47
+ }
48
+ setConfig(config) {
49
+ super.setConfig(config);
50
+ this._hierarchyNodes = this._getHierarchyNodes();
51
+ }
52
+ get bleed() {
53
+ return { top: 4, bottom: 4, left: 4, right: 4 };
54
+ }
55
+ _render(customDuration) {
56
+ var _a, _b;
57
+ super._render(customDuration);
58
+ const { config, config: { nodeLabelAlignment, radiusScaleExponent }, radiusScale } = this;
59
+ const nodes = this._hierarchyNodes;
60
+ const duration = isNumber(customDuration) ? customDuration : config.duration;
61
+ this.arcGen
62
+ .startAngle(d => d.x0)
63
+ .endAngle(d => d.x1)
64
+ .cornerRadius(d => getNumber(d, config.cornerRadius))
65
+ .innerRadius(d => this.radiusScale(d.y1) - getNumber(d, config.nodeWidth))
66
+ .outerRadius(d => this.radiusScale(d.y1));
67
+ const curveGen = Curve[config.curveType];
68
+ if ('alpha' in curveGen)
69
+ (_b = (_a = curveGen).alpha) === null || _b === void 0 ? void 0 : _b.call(_a, 0.25);
70
+ this.linkAreaGen
71
+ .x0(d => d.x0)
72
+ .x1(d => d.x1)
73
+ .y0(d => d.y0)
74
+ .y1(d => d.y1)
75
+ .curve(curveGen);
76
+ const hierarchyData = hierarchy(nodes, (d) => d.values);
77
+ hierarchyData.sum((d) => {
78
+ var _a;
79
+ return (_a = d._state) === null || _a === void 0 ? void 0 : _a.value;
80
+ });
81
+ let radius = Math.min(this._width, this._height) / 2 - max([this.bleed.top, this.bleed.bottom, this.bleed.left, this.bleed.right]);
82
+ let labelWidth = nodeLabelAlignment === ChordLabelAlignment.Perpendicular ? radius / (hierarchyData.height + 1) - config.nodeWidth : 0;
83
+ radius = radius - labelWidth;
84
+ radiusScale
85
+ .exponent(radiusScaleExponent)
86
+ .range([0, radius]);
87
+ labelWidth -= labelWidth / (hierarchyData.height + 1);
88
+ const partitionData = partition().size([config.angleRange[1], 1])(hierarchyData);
89
+ this._calculateRadialPosition(partitionData);
90
+ const partitionDataWithRoot = partitionData.descendants();
91
+ this._rootNode = partitionDataWithRoot.find(d => d.depth === 0);
92
+ this._nodes = partitionDataWithRoot.filter(d => d.depth !== 0); // Filter out the root node
93
+ this._links = this._getRibbons(partitionData);
94
+ // Create Node and Link state objects
95
+ this._nodes.forEach(node => { node._state = {}; });
96
+ this._links.forEach(link => { link._state = {}; });
97
+ // Center the view
98
+ this.g.attr('transform', `translate(${this._width / 2},${this._height / 2})`);
99
+ // Links
100
+ const linksSelection = this.linkGroup
101
+ .selectAll(`.${link}`)
102
+ .data(this._links);
103
+ const linksEnter = linksSelection.enter().append('path')
104
+ .attr('class', link)
105
+ .call(createLink, this.linkAreaGen);
106
+ const linksMerged = linksSelection.merge(linksEnter);
107
+ linksMerged.call(updateLink, this.linkAreaGen, duration);
108
+ linksSelection.exit()
109
+ .call(removeLink, duration);
110
+ // Nodes
111
+ const nodesSelection = this.nodeGroup
112
+ .selectAll(`.${node}`)
113
+ .data(this._nodes);
114
+ const nodesEnter = nodesSelection.enter().append('path')
115
+ .attr('class', node)
116
+ .call(createNode, config);
117
+ const nodesMerged = nodesSelection.merge(nodesEnter);
118
+ nodesMerged.call(updateNode, config, this.arcGen, duration);
119
+ nodesSelection.exit()
120
+ .call(removeNode, duration);
121
+ // Labels
122
+ const labels = this.labelGroup
123
+ .selectAll(`.${gLabel}`)
124
+ .data(this._nodes);
125
+ const labelEnter = labels.enter().append('g')
126
+ .attr('class', gLabel)
127
+ .call(createLabel, config, radiusScale);
128
+ const labelsMerged = labels.merge(labelEnter);
129
+ labelsMerged.call(updateLabel, config, labelWidth, radiusScale, duration);
130
+ labels.exit()
131
+ .attr('class', labelExit)
132
+ .call(removeLabel, duration);
133
+ }
134
+ _getHierarchyNodes() {
135
+ const { config, datamodel: { nodes, links } } = this;
136
+ nodes.forEach(n => { delete n._state.value; });
137
+ links.forEach(l => {
138
+ delete l._state.points;
139
+ l.source._state.value = (l.source._state.value || 0) + getNumber(l, config.linkValue);
140
+ l.target._state.value = (l.target._state.value || 0) + getNumber(l, config.linkValue);
141
+ });
142
+ // Todo: replace with d3 group
143
+ const nestGen = nest();
144
+ config.nodeLevels.forEach(levelAccessor => {
145
+ nestGen.key(d => d[levelAccessor]);
146
+ });
147
+ return { key: 'root', values: nestGen.entries(nodes) };
148
+ }
149
+ _getRibbons(partitionData) {
150
+ const { config, datamodel: { links } } = this;
151
+ const findNode = (nodes, id) => nodes.find(n => n.data.id === id);
152
+ const leafNodes = partitionData.leaves();
153
+ const groupedBySource = groupBy(links, d => d.source.id);
154
+ const groupedByTarget = groupBy(links, d => d.target.id);
155
+ const getNodesInRibbon = (source, target, partitionHeight, nodes = []) => {
156
+ nodes[source.height] = source;
157
+ nodes[partitionHeight * 2 - target.height] = target;
158
+ if (source.parent && target.parent)
159
+ getNodesInRibbon(source.parent, target.parent, partitionHeight, nodes);
160
+ return nodes;
161
+ };
162
+ const calculatePoints = (links, type, depth) => {
163
+ links.forEach(link => {
164
+ var _a;
165
+ if (!link._state.points)
166
+ link._state.points = [];
167
+ const sourceLeaf = findNode(leafNodes, link.source.id);
168
+ const targetLeaf = findNode(leafNodes, link.target.id);
169
+ const nodesInRibbon = getNodesInRibbon(type === 'out' ? sourceLeaf : targetLeaf, type === 'out' ? targetLeaf : sourceLeaf, partitionData.height);
170
+ const currNode = nodesInRibbon[depth];
171
+ const len = currNode.x1 - currNode.x0;
172
+ const x0 = (_a = currNode._prevX1) !== null && _a !== void 0 ? _a : currNode.x0;
173
+ const x1 = x0 + len * getNumber(link, config.linkValue) / currNode.value;
174
+ currNode._prevX1 = x1;
175
+ const converted = this._convertRadialToCartesian(type === 'out' ? x0 : x1, type === 'out' ? x1 : x0, currNode.y1, 0);
176
+ const pointIdx = type === 'out' ? depth : partitionData.height * 2 - 1 - depth;
177
+ link._state.points[pointIdx] = { x0: converted.x0, x1: converted.x1, y0: converted.y0, y1: converted.y1 };
178
+ });
179
+ };
180
+ leafNodes.forEach(leafNode => {
181
+ const outLinks = groupedBySource[leafNode.data.id] || [];
182
+ const inLinks = groupedByTarget[leafNode.data.id] || [];
183
+ for (let depth = 0; depth < partitionData.height; depth += 1) {
184
+ calculatePoints(outLinks, 'out', depth);
185
+ calculatePoints(inLinks, 'in', depth);
186
+ }
187
+ });
188
+ const ribbons = links.map((l) => {
189
+ const sourceNode = findNode(leafNodes, l.source.id);
190
+ const targetNode = findNode(leafNodes, l.target.id);
191
+ return {
192
+ source: sourceNode,
193
+ target: targetNode,
194
+ points: l._state.points,
195
+ _state: {},
196
+ };
197
+ });
198
+ return ribbons;
199
+ }
200
+ _convertRadialToCartesian(x0, x1, y, nodeWidth) {
201
+ const r0 = this.radiusScale(y) - nodeWidth / 2;
202
+ const a0 = x0 - Math.PI / 2;
203
+ const r1 = this.radiusScale(y) - nodeWidth / 2;
204
+ const a1 = x1 - Math.PI / 2;
205
+ return {
206
+ x0: r0 * Math.cos(a0),
207
+ x1: r1 * Math.cos(a1),
208
+ y0: r0 * Math.sin(a0),
209
+ y1: r1 * Math.sin(a1),
210
+ };
211
+ }
212
+ _calculateRadialPosition(hierarchyNode, scalingCoeff = 0.95, nodePadding = 0.02) {
213
+ if (!hierarchyNode.children)
214
+ return;
215
+ // Calculate x0 and x1
216
+ const nodeLength = (hierarchyNode.x1 - hierarchyNode.x0);
217
+ const scaledNodeLength = nodeLength * scalingCoeff;
218
+ const delta = nodeLength - scaledNodeLength;
219
+ let x0 = hierarchyNode.x0 + delta / 2;
220
+ for (const node of hierarchyNode.children) {
221
+ const childX0 = x0;
222
+ const childX1 = x0 + (node.value / hierarchyNode.value) * scaledNodeLength - nodePadding / 2;
223
+ const childNodeLength = childX1 - childX0;
224
+ const scaledChildNodeLength = childNodeLength * scalingCoeff;
225
+ const childDelta = childNodeLength - scaledChildNodeLength;
226
+ node.x0 = childX0 + childDelta / 2;
227
+ node.x1 = node.x0 + scaledChildNodeLength;
228
+ x0 = childX1 + nodePadding / 2 + childDelta / 2;
229
+ }
230
+ // Go deeper in the hierarchy
231
+ for (const node of hierarchyNode.children) {
232
+ this._calculateRadialPosition(node, scalingCoeff, nodePadding);
233
+ }
234
+ }
235
+ _onNodeMouseOver(d) {
236
+ let ribbons;
237
+ if (d.children) {
238
+ const leaves = d.leaves();
239
+ ribbons = this._links.filter(l => leaves.find(leaf => l.source.data.id === leaf.data.id || l.target.data.id === leaf.data.id));
240
+ }
241
+ else {
242
+ const leaf = d;
243
+ ribbons = this._links.filter(l => l.source.data.id === leaf.data.id || l.target.data.id === leaf.data.id);
244
+ }
245
+ this._highlightOnHover(ribbons);
246
+ }
247
+ _onNodeMouseOut() {
248
+ this._highlightOnHover();
249
+ }
250
+ _onLinkMouseOver(d) {
251
+ this._highlightOnHover([d]);
252
+ }
253
+ _onLinkMouseOut() {
254
+ this._highlightOnHover();
255
+ }
256
+ _highlightOnHover(links) {
257
+ if (links) {
258
+ links.forEach(l => {
259
+ l._state.hovered = true;
260
+ const sourcePath = l.source.path(this._rootNode);
261
+ const targetPath = l.target.path(this._rootNode);
262
+ sourcePath.forEach(n => { if (n.depth)
263
+ n._state.hovered = true; });
264
+ targetPath.forEach(n => { if (n.depth)
265
+ n._state.hovered = true; });
266
+ });
267
+ }
268
+ else {
269
+ this._nodes.forEach(n => { delete n._state.hovered; });
270
+ this._links.forEach(l => { delete l._state.hovered; });
271
+ }
272
+ this.nodeGroup.selectAll(`.${node}`).classed(hoveredNode, (d) => d._state.hovered);
273
+ this.linkGroup.selectAll(`.${link}`).classed(hoveredLink, (d) => d._state.hovered);
274
+ this.g.classed(transparent, !!links);
275
+ }
276
+ }
277
+ ChordDiagram.selectors = style;
278
+
279
+ export { ChordDiagram };
280
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../src/components/chord-diagram/index.ts"],"sourcesContent":["import { Selection } from 'd3-selection'\nimport { nest } from 'd3-collection'\nimport { hierarchy, partition } from 'd3-hierarchy'\nimport { arc, area, CurveCatmullRomFactory, CurveFactory } from 'd3-shape'\nimport { scalePow, ScalePower } from 'd3-scale'\nimport { max } from 'd3-array'\n\n// Core\nimport { ComponentCore } from 'core/component'\nimport { GraphDataModel } from 'data-models/graph'\n\n// Utils\nimport { getNumber, isNumber, groupBy } from 'utils/data'\n\n// Types\nimport { GraphNodeCore } from 'types/graph'\nimport { Spacing } from 'types/spacing'\nimport { Curve } from 'types/curve'\n\n// Local Types\nimport { ChordInputNode, ChordInputLink, ChordHierarchy, ChordNode, ChordRibbon, ChordLabelAlignment, ChordLeafNode, ChordRibbonPoint } from './types'\n\n// Config\nimport { ChordDiagramConfig, ChordDiagramConfigInterface } from './config'\n\n// Modules\nimport { createNode, updateNode, removeNode } from './modules/node'\nimport { createLabel, updateLabel, removeLabel } from './modules/label'\nimport { createLink, updateLink, removeLink } from './modules/link'\n\n// Styles\nimport * as s from './style'\n\nexport class ChordDiagram<N extends ChordInputNode, L extends ChordInputLink> extends ComponentCore<{ nodes: N[]; links?: L[] }> {\n static selectors = s\n config: ChordDiagramConfig<N, L> = new ChordDiagramConfig()\n datamodel: GraphDataModel<N, L> = new GraphDataModel()\n\n nodeGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n linkGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n labelGroup: Selection<SVGGElement, unknown, SVGGElement, unknown>\n arcGen = arc<ChordNode<N>>()\n radiusScale: ScalePower<number, number> = scalePow()\n linkAreaGen = area<ChordRibbonPoint>()\n private _nodes: ChordNode<N>[] = []\n private _links: ChordRibbon<N>[] = []\n private _rootNode: ChordNode<N>\n private _hierarchyNodes: ChordHierarchy<GraphNodeCore<N, L>>\n\n events = {\n [ChordDiagram.selectors.node]: {\n mouseover: this._onNodeMouseOver.bind(this),\n mouseout: this._onNodeMouseOut.bind(this),\n },\n [ChordDiagram.selectors.link]: {\n mouseover: this._onLinkMouseOver.bind(this),\n mouseout: this._onLinkMouseOut.bind(this),\n },\n }\n\n constructor (config?: ChordDiagramConfigInterface<N, L>) {\n super()\n if (config) this.config.init(config)\n this.linkGroup = this.g.append('g').attr('class', s.nodes)\n this.nodeGroup = this.g.append('g').attr('class', s.links)\n this.labelGroup = this.g.append('g').attr('class', s.labels)\n }\n\n setData (data: { nodes: N[]; links?: L[] }): void {\n this.datamodel.data = data\n this._hierarchyNodes = this._getHierarchyNodes()\n }\n\n setConfig (config: ChordDiagramConfigInterface<N, L>): void {\n super.setConfig(config)\n this._hierarchyNodes = this._getHierarchyNodes()\n }\n\n get bleed (): Spacing {\n return { top: 4, bottom: 4, left: 4, right: 4 }\n }\n\n _render (customDuration?: number): void {\n super._render(customDuration)\n const { config, config: { nodeLabelAlignment, radiusScaleExponent }, radiusScale } = this\n const nodes = this._hierarchyNodes\n const duration = isNumber(customDuration) ? customDuration : config.duration\n\n this.arcGen\n .startAngle(d => d.x0)\n .endAngle(d => d.x1)\n .cornerRadius(d => getNumber(d, config.cornerRadius))\n .innerRadius(d => this.radiusScale(d.y1) - getNumber(d, config.nodeWidth))\n .outerRadius(d => this.radiusScale(d.y1))\n\n const curveGen = Curve[config.curveType]\n if ('alpha' in curveGen) (curveGen as CurveCatmullRomFactory).alpha?.(0.25)\n this.linkAreaGen\n .x0(d => d.x0)\n .x1(d => d.x1)\n .y0(d => d.y0)\n .y1(d => d.y1)\n .curve(curveGen as CurveFactory)\n\n const hierarchyData = hierarchy(nodes, (d: ChordHierarchy<GraphNodeCore<N, L>>) => d.values)\n hierarchyData.sum((d) => {\n return (d as GraphNodeCore<N, L>)._state?.value\n })\n\n let radius = Math.min(this._width, this._height) / 2 - max([this.bleed.top, this.bleed.bottom, this.bleed.left, this.bleed.right])\n let labelWidth = nodeLabelAlignment === ChordLabelAlignment.Perpendicular ? radius / (hierarchyData.height + 1) - config.nodeWidth : 0\n radius = radius - labelWidth\n radiusScale\n .exponent(radiusScaleExponent)\n .range([0, radius])\n labelWidth -= labelWidth / (hierarchyData.height + 1)\n\n const partitionData = partition<N | ChordHierarchy<GraphNodeCore<N, L>>>().size([config.angleRange[1], 1])(hierarchyData) as ChordNode<N>\n this._calculateRadialPosition(partitionData)\n\n const partitionDataWithRoot = partitionData.descendants()\n this._rootNode = partitionDataWithRoot.find(d => d.depth === 0)\n this._nodes = partitionDataWithRoot.filter(d => d.depth !== 0) // Filter out the root node\n this._links = this._getRibbons(partitionData)\n\n // Create Node and Link state objects\n this._nodes.forEach(node => { node._state = {} })\n this._links.forEach(link => { link._state = {} })\n\n // Center the view\n this.g.attr('transform', `translate(${this._width / 2},${this._height / 2})`)\n\n // Links\n const linksSelection = this.linkGroup\n .selectAll(`.${s.link}`)\n .data(this._links)\n\n const linksEnter = linksSelection.enter().append('path')\n .attr('class', s.link)\n .call(createLink, this.linkAreaGen)\n\n const linksMerged = linksSelection.merge(linksEnter)\n linksMerged.call(updateLink, this.linkAreaGen, duration)\n\n linksSelection.exit()\n .call(removeLink, duration)\n\n // Nodes\n const nodesSelection = this.nodeGroup\n .selectAll(`.${s.node}`)\n .data(this._nodes)\n\n const nodesEnter = nodesSelection.enter().append('path')\n .attr('class', s.node)\n .call(createNode, config)\n\n const nodesMerged = nodesSelection.merge(nodesEnter)\n nodesMerged.call(updateNode, config, this.arcGen, duration)\n\n nodesSelection.exit()\n .call(removeNode, duration)\n\n // Labels\n const labels = this.labelGroup\n .selectAll(`.${s.gLabel}`)\n .data(this._nodes)\n\n const labelEnter = labels.enter().append('g')\n .attr('class', s.gLabel)\n .call(createLabel, config, radiusScale)\n\n const labelsMerged = labels.merge(labelEnter)\n labelsMerged.call(updateLabel, config, labelWidth, radiusScale, duration)\n\n labels.exit()\n .attr('class', s.labelExit)\n .call(removeLabel, duration)\n }\n\n private _getHierarchyNodes (): ChordHierarchy<GraphNodeCore<N, L>> {\n const { config, datamodel: { nodes, links } } = this\n nodes.forEach(n => { delete n._state.value })\n links.forEach(l => {\n delete l._state.points\n l.source._state.value = (l.source._state.value || 0) + getNumber(l, config.linkValue)\n l.target._state.value = (l.target._state.value || 0) + getNumber(l, config.linkValue)\n })\n\n // Todo: replace with d3 group\n const nestGen = nest<N>()\n config.nodeLevels.forEach(levelAccessor => {\n nestGen.key(d => d[levelAccessor])\n })\n\n return { key: 'root', values: nestGen.entries(nodes) }\n }\n\n private _getRibbons (partitionData: ChordNode<N>): ChordRibbon<N>[] {\n const { config, datamodel: { links } } = this\n const findNode = (\n nodes: ChordLeafNode<N>[],\n id: string\n ): ChordLeafNode<N> => nodes.find(n => n.data.id === id)\n const leafNodes = partitionData.leaves() as ChordLeafNode<N>[]\n\n type LinksArrayType = typeof links\n const groupedBySource: Record<string, LinksArrayType> = groupBy(links, d => d.source.id)\n const groupedByTarget: Record<string, LinksArrayType> = groupBy(links, d => d.target.id)\n\n const getNodesInRibbon = (\n source: ChordLeafNode<N>,\n target: ChordLeafNode<N>,\n partitionHeight: number,\n nodes: ChordLeafNode<N>[] = []\n ): ChordNode<N>[] => {\n nodes[source.height] = source\n nodes[partitionHeight * 2 - target.height] = target\n if (source.parent && target.parent) getNodesInRibbon(source.parent, target.parent, partitionHeight, nodes)\n return nodes\n }\n\n const calculatePoints = (\n links: LinksArrayType,\n type: 'in' | 'out',\n depth: number\n ): void => {\n links.forEach(link => {\n if (!link._state.points) link._state.points = []\n const sourceLeaf = findNode(leafNodes, link.source.id)\n const targetLeaf = findNode(leafNodes, link.target.id)\n const nodesInRibbon = getNodesInRibbon(\n type === 'out' ? sourceLeaf : targetLeaf,\n type === 'out' ? targetLeaf : sourceLeaf,\n partitionData.height)\n const currNode = nodesInRibbon[depth]\n const len = currNode.x1 - currNode.x0\n const x0 = currNode._prevX1 ?? currNode.x0\n const x1 = x0 + len * getNumber(link, config.linkValue) / currNode.value\n currNode._prevX1 = x1\n\n const converted = this._convertRadialToCartesian(\n type === 'out' ? x0 : x1,\n type === 'out' ? x1 : x0,\n currNode.y1, 0)\n const pointIdx = type === 'out' ? depth : partitionData.height * 2 - 1 - depth\n link._state.points[pointIdx] = { x0: converted.x0, x1: converted.x1, y0: converted.y0, y1: converted.y1 }\n })\n }\n\n leafNodes.forEach(leafNode => {\n const outLinks = groupedBySource[leafNode.data.id] || []\n const inLinks = groupedByTarget[leafNode.data.id] || []\n for (let depth = 0; depth < partitionData.height; depth += 1) {\n calculatePoints(outLinks, 'out', depth)\n calculatePoints(inLinks, 'in', depth)\n }\n })\n\n const ribbons = links.map((l) => {\n const sourceNode = findNode(leafNodes, l.source.id)\n const targetNode = findNode(leafNodes, l.target.id)\n\n return {\n source: sourceNode,\n target: targetNode,\n points: l._state.points,\n _state: {},\n }\n })\n\n return ribbons\n }\n\n private _convertRadialToCartesian (x0: number, x1: number, y: number, nodeWidth: number): { x0: number; x1: number; y0: number; y1: number } {\n const r0 = this.radiusScale(y) - nodeWidth / 2\n const a0 = x0 - Math.PI / 2\n const r1 = this.radiusScale(y) - nodeWidth / 2\n const a1 = x1 - Math.PI / 2\n\n return {\n x0: r0 * Math.cos(a0),\n x1: r1 * Math.cos(a1),\n y0: r0 * Math.sin(a0),\n y1: r1 * Math.sin(a1),\n }\n }\n\n private _calculateRadialPosition (\n hierarchyNode: ChordNode<N>,\n scalingCoeff = 0.95,\n nodePadding = 0.02\n ): void {\n if (!hierarchyNode.children) return\n\n // Calculate x0 and x1\n const nodeLength = (hierarchyNode.x1 - hierarchyNode.x0)\n const scaledNodeLength = nodeLength * scalingCoeff\n const delta = nodeLength - scaledNodeLength\n let x0 = hierarchyNode.x0 + delta / 2\n for (const node of hierarchyNode.children) {\n const childX0 = x0\n const childX1 = x0 + (node.value / hierarchyNode.value) * scaledNodeLength - nodePadding / 2\n const childNodeLength = childX1 - childX0\n const scaledChildNodeLength = childNodeLength * scalingCoeff\n const childDelta = childNodeLength - scaledChildNodeLength\n node.x0 = childX0 + childDelta / 2\n node.x1 = node.x0 + scaledChildNodeLength\n x0 = childX1 + nodePadding / 2 + childDelta / 2\n }\n // Go deeper in the hierarchy\n for (const node of hierarchyNode.children) {\n this._calculateRadialPosition(node, scalingCoeff, nodePadding)\n }\n }\n\n private _onNodeMouseOver (d: ChordNode<N>): void {\n let ribbons: ChordRibbon<N>[]\n if (d.children) {\n const leaves = d.leaves() as ChordLeafNode<N>[]\n ribbons = this._links.filter(l =>\n leaves.find(leaf => l.source.data.id === leaf.data.id || l.target.data.id === leaf.data.id)\n )\n } else {\n const leaf = d as ChordLeafNode<N>\n ribbons = this._links.filter(l => l.source.data.id === leaf.data.id || l.target.data.id === leaf.data.id)\n }\n this._highlightOnHover(ribbons)\n }\n\n private _onNodeMouseOut (): void {\n this._highlightOnHover()\n }\n\n private _onLinkMouseOver (d: ChordRibbon<N>): void {\n this._highlightOnHover([d])\n }\n\n private _onLinkMouseOut (): void {\n this._highlightOnHover()\n }\n\n private _highlightOnHover (links?: ChordRibbon<N>[]): void {\n if (links) {\n links.forEach(l => {\n l._state.hovered = true\n const sourcePath = (l.source as ChordNode<N>).path(this._rootNode)\n const targetPath = (l.target as ChordNode<N>).path(this._rootNode)\n sourcePath.forEach(n => { if (n.depth) n._state.hovered = true })\n targetPath.forEach(n => { if (n.depth) n._state.hovered = true })\n })\n } else {\n this._nodes.forEach(n => { delete n._state.hovered })\n this._links.forEach(l => { delete l._state.hovered })\n }\n\n this.nodeGroup.selectAll(`.${s.node}`).classed(s.hoveredNode, (d: ChordNode<N>) => d._state.hovered)\n this.linkGroup.selectAll(`.${s.link}`).classed(s.hoveredLink, (d: ChordRibbon<N>) => d._state.hovered)\n this.g.classed(s.transparent, !!links)\n }\n}\n"],"names":["s.nodes","s.links","s.labels","s.link","s.node","s.gLabel","s.labelExit","s.hoveredNode","s.hoveredLink","s.transparent","s"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Selection } from 'd3-selection';
2
+ import { ScaleContinuousNumeric } from 'd3-scale';
3
+ import { ChordDiagramConfig } from '../config';
4
+ import { ChordInputLink, ChordInputNode, ChordNode } from '../types';
5
+ export declare const LABEL_PADDING = 3;
6
+ export declare function createLabel<N extends ChordInputNode, L extends ChordInputLink>(selection: Selection<SVGGElement, ChordNode<N>, SVGGElement, unknown>, config: ChordDiagramConfig<N, L>, radiusScale: ScaleContinuousNumeric<number, number>): void;
7
+ export declare function updateLabel<N extends ChordInputNode, L extends ChordInputLink>(selection: Selection<SVGElement, ChordNode<N>, SVGGElement, unknown>, config: ChordDiagramConfig<N, L>, width: number, radiusScale: ScaleContinuousNumeric<number, number>, duration: number): void;
8
+ export declare function removeLabel<N extends ChordInputNode, L extends ChordInputLink>(selection: Selection<SVGElement, ChordNode<N>, SVGGElement, unknown>, duration: number): void;
@@ -0,0 +1,128 @@
1
+ import { select } from 'd3-selection';
2
+ import { color } from 'd3-color';
3
+ import { getCSSColorVariable } from '../../../styles/colors.js';
4
+ import { wrapTextElement } from '../../../utils/text.js';
5
+ import { smartTransition } from '../../../utils/d3.js';
6
+ import { getString, getNumber } from '../../../utils/data.js';
7
+ import { getColor, hexToBrightness } from '../../../utils/color.js';
8
+ import { ChordLabelAlignment } from '../types.js';
9
+ import { label } from '../style.js';
10
+
11
+ const LABEL_PADDING = 3;
12
+ function createLabel(selection, config, radiusScale) {
13
+ selection.style('opacity', 0);
14
+ if (config.nodeLabelAlignment === ChordLabelAlignment.Perpendicular) {
15
+ selection.attr('transform', d => {
16
+ const angleCenter = (d.x0 + d.x1) / 2;
17
+ const angle = angleCenter - Math.PI / 2;
18
+ const r = radiusScale(d.y1) + LABEL_PADDING;
19
+ const x = r * Math.cos(angle);
20
+ const y = r * Math.sin(angle);
21
+ return `translate(${x}, ${y})`;
22
+ });
23
+ }
24
+ selection.append('text')
25
+ .attr('class', label)
26
+ .style('fill', d => getColor(d, config.nodeColor, d.depth));
27
+ }
28
+ function getLabelFillColor(d, config, context) {
29
+ const { nodeLabelAlignment, nodeColor } = config;
30
+ switch (nodeLabelAlignment) {
31
+ case ChordLabelAlignment.Perpendicular: {
32
+ return getColor(d, nodeColor, d.depth);
33
+ }
34
+ case ChordLabelAlignment.Along: {
35
+ const c = getColor(d, nodeColor) || window.getComputedStyle(context).getPropertyValue(getCSSColorVariable(d.depth));
36
+ const colorParsed = color(c);
37
+ const brightness = colorParsed ? hexToBrightness(colorParsed.hex()) : 0;
38
+ return brightness > 0.65 ? 'var(--vis-chord-diagram-label-text-fill-color-dark)' : 'var(--vis-chord-diagram-label-text-fill-color-bright)';
39
+ }
40
+ }
41
+ }
42
+ function getLabelTextAnchor(d, config) {
43
+ const { nodeLabelAlignment } = config;
44
+ switch (nodeLabelAlignment) {
45
+ case ChordLabelAlignment.Perpendicular: {
46
+ const angleCenter = (d.x0 + d.x1) / 2;
47
+ const angleDegree = angleCenter * 180 / Math.PI;
48
+ return angleDegree < 180 ? 'start' : 'end';
49
+ }
50
+ case ChordLabelAlignment.Along: {
51
+ return null;
52
+ }
53
+ }
54
+ }
55
+ function updateLabel(selection, config, width, radiusScale, duration) {
56
+ const { nodeLabel, nodeWidth, nodeLabelAlignment } = config;
57
+ selection.style('opacity', 0);
58
+ const selTransition = smartTransition(selection, duration)
59
+ .style('opacity', 1);
60
+ if (nodeLabelAlignment === ChordLabelAlignment.Perpendicular) {
61
+ selTransition.attr('transform', d => {
62
+ const angleCenter = (d.x0 + d.x1) / 2;
63
+ const angle = angleCenter - Math.PI / 2;
64
+ const r = radiusScale(d.y1) + LABEL_PADDING;
65
+ const x = r * Math.cos(angle);
66
+ const y = r * Math.sin(angle);
67
+ return `translate(${x}, ${y})`;
68
+ });
69
+ }
70
+ else {
71
+ selection.attr('transform', null);
72
+ }
73
+ const label$1 = selection.select(`.${label}`);
74
+ label$1.select('textPath').remove();
75
+ label$1
76
+ .text(d => getString(d.data, nodeLabel))
77
+ .style('display', d => {
78
+ if (config.nodeLabelAlignment === ChordLabelAlignment.Perpendicular)
79
+ return null;
80
+ const radianArcLength = d.x1 - d.x0 - getNumber(d, config.padAngle) * 2;
81
+ const radius = radiusScale(d.y1) - getNumber(d, config.nodeWidth) / 2;
82
+ const arcLength = radius * radianArcLength;
83
+ // Hide label if the length of node arc is less then 70 px
84
+ return arcLength < 70 ? 'none' : null;
85
+ });
86
+ label$1
87
+ .style('fill', d => getLabelFillColor(d, config, label$1.node()))
88
+ .style('text-anchor', d => getLabelTextAnchor(d, config));
89
+ label$1
90
+ .each((d, i, elements) => {
91
+ let textWidth = width;
92
+ if (nodeLabelAlignment === ChordLabelAlignment.Along) {
93
+ const radianArcLength = d.x1 - d.x0 - getNumber(d, config.padAngle) * 2;
94
+ const radius = radiusScale(d.y1) - getNumber(d, config.nodeWidth) / 2;
95
+ textWidth = radius * radianArcLength;
96
+ }
97
+ select(elements[i]).call(wrapTextElement, { width: textWidth - LABEL_PADDING * 2, trimOnly: true });
98
+ if (nodeLabelAlignment === ChordLabelAlignment.Along) {
99
+ const labelText = select(elements[i]).text();
100
+ select(elements[i])
101
+ .attr('dx', LABEL_PADDING)
102
+ .attr('dy', getNumber(d, nodeWidth) / 2)
103
+ .text('');
104
+ select(elements[i]).append('textPath')
105
+ .attr('xlink:href', `#chord-node-${i}`)
106
+ .text(labelText);
107
+ }
108
+ });
109
+ if (nodeLabelAlignment === ChordLabelAlignment.Perpendicular) {
110
+ smartTransition(label$1, duration)
111
+ .attr('transform', d => {
112
+ const angleCenter = (d.x0 + d.x1) / 2;
113
+ const angleDegree = angleCenter * 180 / Math.PI;
114
+ return `rotate(${angleDegree < 180 ? angleDegree - 90 : angleDegree + 90})`;
115
+ });
116
+ }
117
+ else {
118
+ label$1.attr('transform', null);
119
+ }
120
+ }
121
+ function removeLabel(selection, duration) {
122
+ smartTransition(selection, duration)
123
+ .style('opacity', 0)
124
+ .remove();
125
+ }
126
+
127
+ export { LABEL_PADDING, createLabel, removeLabel, updateLabel };
128
+ //# sourceMappingURL=label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"label.js","sources":["../../../../src/components/chord-diagram/modules/label.ts"],"sourcesContent":["import { select, Selection } from 'd3-selection'\nimport { ScaleContinuousNumeric } from 'd3-scale'\nimport { color } from 'd3-color'\n\n// Core\nimport { getCSSColorVariable } from 'styles/colors'\n\n// Utils\nimport { wrapTextElement } from 'utils/text'\nimport { smartTransition } from 'utils/d3'\nimport { getNumber, getString } from 'utils/data'\nimport { getColor, hexToBrightness } from 'utils/color'\n\n// Config\nimport { ChordDiagramConfig } from '../config'\n\n// Local Types\nimport { ChordInputLink, ChordInputNode, ChordLabelAlignment, ChordNode } from '../types'\n\n// Styles\nimport * as s from '../style'\n\nexport const LABEL_PADDING = 3\n\nexport function createLabel<N extends ChordInputNode, L extends ChordInputLink> (\n selection: Selection<SVGGElement, ChordNode<N>, SVGGElement, unknown>,\n config: ChordDiagramConfig<N, L>,\n radiusScale: ScaleContinuousNumeric<number, number>\n): void {\n selection.style('opacity', 0)\n\n if (config.nodeLabelAlignment === ChordLabelAlignment.Perpendicular) {\n selection.attr('transform', d => {\n const angleCenter = (d.x0 + d.x1) / 2\n const angle = angleCenter - Math.PI / 2\n const r = radiusScale(d.y1) + LABEL_PADDING\n const x = r * Math.cos(angle)\n const y = r * Math.sin(angle)\n return `translate(${x}, ${y})`\n })\n }\n\n selection.append('text')\n .attr('class', s.label)\n .style('fill', d => getColor(d, config.nodeColor, d.depth))\n}\n\nfunction getLabelFillColor<N extends ChordInputNode, L extends ChordInputLink> (\n d: ChordNode<N>,\n config: ChordDiagramConfig<N, L>,\n context: SVGTextElement\n): string {\n const { nodeLabelAlignment, nodeColor } = config\n switch (nodeLabelAlignment) {\n case ChordLabelAlignment.Perpendicular: {\n return getColor(d, nodeColor, d.depth)\n }\n case ChordLabelAlignment.Along: {\n const c = getColor(d, nodeColor) || window.getComputedStyle(context).getPropertyValue(getCSSColorVariable(d.depth))\n const colorParsed = color(c)\n const brightness = colorParsed ? hexToBrightness(colorParsed.hex()) : 0\n return brightness > 0.65 ? 'var(--vis-chord-diagram-label-text-fill-color-dark)' : 'var(--vis-chord-diagram-label-text-fill-color-bright)'\n }\n }\n}\n\nfunction getLabelTextAnchor<N extends ChordInputNode, L extends ChordInputLink> (\n d: ChordNode<N>,\n config: ChordDiagramConfig<N, L>\n): string | null {\n const { nodeLabelAlignment } = config\n switch (nodeLabelAlignment) {\n case ChordLabelAlignment.Perpendicular: {\n const angleCenter = (d.x0 + d.x1) / 2\n const angleDegree = angleCenter * 180 / Math.PI\n return angleDegree < 180 ? 'start' : 'end'\n }\n case ChordLabelAlignment.Along: {\n return null\n }\n }\n}\n\nexport function updateLabel<N extends ChordInputNode, L extends ChordInputLink> (\n selection: Selection<SVGElement, ChordNode<N>, SVGGElement, unknown>,\n config: ChordDiagramConfig<N, L>,\n width: number,\n radiusScale: ScaleContinuousNumeric<number, number>,\n duration: number\n): void {\n const { nodeLabel, nodeWidth, nodeLabelAlignment } = config\n selection.style('opacity', 0)\n const selTransition = smartTransition(selection, duration)\n .style('opacity', 1)\n if (nodeLabelAlignment === ChordLabelAlignment.Perpendicular) {\n selTransition.attr('transform', d => {\n const angleCenter = (d.x0 + d.x1) / 2\n const angle = angleCenter - Math.PI / 2\n const r = radiusScale(d.y1) + LABEL_PADDING\n const x = r * Math.cos(angle)\n const y = r * Math.sin(angle)\n return `translate(${x}, ${y})`\n })\n } else {\n selection.attr('transform', null)\n }\n\n const label: Selection<SVGTextElement, ChordNode<N>, SVGElement, unknown> = selection.select(`.${s.label}`)\n label.select('textPath').remove()\n label\n .text(d => getString(d.data, nodeLabel))\n .style('display', d => {\n if (config.nodeLabelAlignment === ChordLabelAlignment.Perpendicular) return null\n const radianArcLength = d.x1 - d.x0 - getNumber(d, config.padAngle) * 2\n const radius = radiusScale(d.y1) - getNumber(d, config.nodeWidth) / 2\n const arcLength = radius * radianArcLength\n // Hide label if the length of node arc is less then 70 px\n return arcLength < 70 ? 'none' : null\n })\n\n label\n .style('fill', d => getLabelFillColor(d, config, label.node()))\n .style('text-anchor', d => getLabelTextAnchor(d, config))\n\n label\n .each((d: any, i, elements) => {\n let textWidth = width\n if (nodeLabelAlignment === ChordLabelAlignment.Along) {\n const radianArcLength = d.x1 - d.x0 - getNumber(d, config.padAngle) * 2\n const radius = radiusScale(d.y1) - getNumber(d, config.nodeWidth) / 2\n textWidth = radius * radianArcLength\n }\n\n select(elements[i]).call(wrapTextElement, { width: textWidth - LABEL_PADDING * 2, trimOnly: true })\n\n if (nodeLabelAlignment === ChordLabelAlignment.Along) {\n const labelText = select(elements[i]).text()\n select(elements[i])\n .attr('dx', LABEL_PADDING)\n .attr('dy', getNumber(d, nodeWidth) / 2)\n .text('')\n\n select(elements[i]).append('textPath')\n .attr('xlink:href', `#chord-node-${i}`)\n .text(labelText)\n }\n })\n\n if (nodeLabelAlignment === ChordLabelAlignment.Perpendicular) {\n smartTransition(label, duration)\n .attr('transform', d => {\n const angleCenter = (d.x0 + d.x1) / 2\n const angleDegree = angleCenter * 180 / Math.PI\n\n return `rotate(${angleDegree < 180 ? angleDegree - 90 : angleDegree + 90})`\n })\n } else {\n label.attr('transform', null)\n }\n}\n\nexport function removeLabel<N extends ChordInputNode, L extends ChordInputLink> (\n selection: Selection<SVGElement, ChordNode<N>, SVGGElement, unknown>,\n duration: number\n): void {\n smartTransition(selection, duration)\n .style('opacity', 0)\n .remove()\n}\n"],"names":["s.label","label"],"mappings":"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"}