@fusedashlabs/widgets 0.3.1 → 0.4.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 (342) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +1 -1
  3. package/dist/components/chart-renderer/element/ui9000-chart-renderer.d.ts +1 -0
  4. package/dist/components/chart-renderer/element/ui9000-chart-renderer.d.ts.map +1 -1
  5. package/dist/components/chart-renderer/element/ui9000-chart-renderer.js +12 -1
  6. package/dist/components/chart-renderer/element/ui9000-chart-renderer.js.map +1 -1
  7. package/dist/components/chart-renderer/lib/registry.d.ts.map +1 -1
  8. package/dist/components/chart-renderer/lib/registry.js +17 -4
  9. package/dist/components/chart-renderer/lib/registry.js.map +1 -1
  10. package/dist/components/chart-renderer/lib/types.d.ts +5 -0
  11. package/dist/components/chart-renderer/lib/types.d.ts.map +1 -1
  12. package/dist/components/donut-chart/element/ui9000-donut-chart.js +1 -1
  13. package/dist/components/donut-chart/element/ui9000-donut-chart.js.map +1 -1
  14. package/dist/components/lollipop/element/styles.d.ts.map +1 -1
  15. package/dist/components/lollipop/element/styles.js +19 -1
  16. package/dist/components/lollipop/element/styles.js.map +1 -1
  17. package/dist/components/lollipop/element/ui9000-lollipop.d.ts +6 -1
  18. package/dist/components/lollipop/element/ui9000-lollipop.d.ts.map +1 -1
  19. package/dist/components/lollipop/element/ui9000-lollipop.js +68 -7
  20. package/dist/components/lollipop/element/ui9000-lollipop.js.map +1 -1
  21. package/dist/components/lollipop/index.d.ts +1 -1
  22. package/dist/components/lollipop/index.d.ts.map +1 -1
  23. package/dist/components/lollipop/index.js +2 -0
  24. package/dist/components/lollipop/index.js.map +1 -1
  25. package/dist/components/lollipop/lib/domain.d.ts +16 -1
  26. package/dist/components/lollipop/lib/domain.d.ts.map +1 -1
  27. package/dist/components/lollipop/lib/domain.js +56 -1
  28. package/dist/components/lollipop/lib/domain.js.map +1 -1
  29. package/dist/components/lollipop/lib/index.d.ts +3 -2
  30. package/dist/components/lollipop/lib/index.d.ts.map +1 -1
  31. package/dist/components/lollipop/lib/layout.d.ts +16 -0
  32. package/dist/components/lollipop/lib/layout.d.ts.map +1 -0
  33. package/dist/components/lollipop/lib/layout.js +16 -0
  34. package/dist/components/lollipop/lib/layout.js.map +1 -0
  35. package/dist/components/lollipop/lib/types.d.ts +5 -0
  36. package/dist/components/lollipop/lib/types.d.ts.map +1 -1
  37. package/dist/components/lollipop/metadata.json.d.ts +10 -0
  38. package/dist/components/lollipop/metadata.json.js +4 -1
  39. package/dist/components/lollipop/metadata.json.js.map +1 -1
  40. package/dist/components/lollipop/render/draw.d.ts +8 -1
  41. package/dist/components/lollipop/render/draw.d.ts.map +1 -1
  42. package/dist/components/lollipop/render/draw.js +155 -84
  43. package/dist/components/lollipop/render/draw.js.map +1 -1
  44. package/dist/components/map-chart/element/styles.d.ts +2 -0
  45. package/dist/components/map-chart/element/styles.d.ts.map +1 -0
  46. package/dist/components/map-chart/element/styles.js +372 -0
  47. package/dist/components/map-chart/element/styles.js.map +1 -0
  48. package/dist/components/map-chart/element/ui9000-map-chart.d.ts +54 -0
  49. package/dist/components/map-chart/element/ui9000-map-chart.d.ts.map +1 -0
  50. package/dist/components/map-chart/element/ui9000-map-chart.js +539 -0
  51. package/dist/components/map-chart/element/ui9000-map-chart.js.map +1 -0
  52. package/dist/components/map-chart/index.d.ts +5 -0
  53. package/dist/components/map-chart/index.d.ts.map +1 -0
  54. package/dist/components/map-chart/index.js +29 -0
  55. package/dist/components/map-chart/index.js.map +1 -0
  56. package/dist/components/map-chart/lib/constants.d.ts +34 -0
  57. package/dist/components/map-chart/lib/constants.d.ts.map +1 -0
  58. package/dist/components/map-chart/lib/constants.js +122 -0
  59. package/dist/components/map-chart/lib/constants.js.map +1 -0
  60. package/dist/components/map-chart/lib/domain.d.ts +12 -0
  61. package/dist/components/map-chart/lib/domain.d.ts.map +1 -0
  62. package/dist/components/map-chart/lib/domain.js +105 -0
  63. package/dist/components/map-chart/lib/domain.js.map +1 -0
  64. package/dist/components/map-chart/lib/format.d.ts +8 -0
  65. package/dist/components/map-chart/lib/format.d.ts.map +1 -0
  66. package/dist/components/map-chart/lib/format.js +45 -0
  67. package/dist/components/map-chart/lib/format.js.map +1 -0
  68. package/dist/components/map-chart/lib/geo-index.d.ts +7 -0
  69. package/dist/components/map-chart/lib/geo-index.d.ts.map +1 -0
  70. package/dist/components/map-chart/lib/geo-index.js +200 -0
  71. package/dist/components/map-chart/lib/geo-index.js.map +1 -0
  72. package/dist/components/map-chart/lib/geojson.d.ts +5 -0
  73. package/dist/components/map-chart/lib/geojson.d.ts.map +1 -0
  74. package/dist/components/map-chart/lib/geojson.js +47 -0
  75. package/dist/components/map-chart/lib/geojson.js.map +1 -0
  76. package/dist/components/map-chart/lib/index.d.ts +13 -0
  77. package/dist/components/map-chart/lib/index.d.ts.map +1 -0
  78. package/dist/components/map-chart/lib/join.d.ts +7 -0
  79. package/dist/components/map-chart/lib/join.d.ts.map +1 -0
  80. package/dist/components/map-chart/lib/join.js +156 -0
  81. package/dist/components/map-chart/lib/join.js.map +1 -0
  82. package/dist/components/map-chart/lib/legend.d.ts +45 -0
  83. package/dist/components/map-chart/lib/legend.d.ts.map +1 -0
  84. package/dist/components/map-chart/lib/legend.js +108 -0
  85. package/dist/components/map-chart/lib/legend.js.map +1 -0
  86. package/dist/components/map-chart/lib/normalize.d.ts +3 -0
  87. package/dist/components/map-chart/lib/normalize.d.ts.map +1 -0
  88. package/dist/components/map-chart/lib/normalize.js +177 -0
  89. package/dist/components/map-chart/lib/normalize.js.map +1 -0
  90. package/dist/components/map-chart/lib/pmtiles.d.ts +41 -0
  91. package/dist/components/map-chart/lib/pmtiles.d.ts.map +1 -0
  92. package/dist/components/map-chart/lib/pmtiles.js +112 -0
  93. package/dist/components/map-chart/lib/pmtiles.js.map +1 -0
  94. package/dist/components/map-chart/lib/types.d.ts +128 -0
  95. package/dist/components/map-chart/lib/types.d.ts.map +1 -0
  96. package/dist/components/map-chart/metadata.json.d.ts +83 -0
  97. package/dist/components/map-chart/metadata.json.js +42 -0
  98. package/dist/components/map-chart/metadata.json.js.map +1 -0
  99. package/dist/components/map-chart/render/draw.d.ts +24 -0
  100. package/dist/components/map-chart/render/draw.d.ts.map +1 -0
  101. package/dist/components/map-chart/render/draw.js +455 -0
  102. package/dist/components/map-chart/render/draw.js.map +1 -0
  103. package/dist/components/map-chart/render/index.d.ts +2 -0
  104. package/dist/components/map-chart/render/index.d.ts.map +1 -0
  105. package/dist/components/matrix-chart/element/styles.d.ts +2 -0
  106. package/dist/components/matrix-chart/element/styles.d.ts.map +1 -0
  107. package/dist/components/matrix-chart/element/styles.js +97 -0
  108. package/dist/components/matrix-chart/element/styles.js.map +1 -0
  109. package/dist/components/matrix-chart/element/ui9000-matrix-chart.d.ts +39 -0
  110. package/dist/components/matrix-chart/element/ui9000-matrix-chart.d.ts.map +1 -0
  111. package/dist/components/matrix-chart/element/ui9000-matrix-chart.js +238 -0
  112. package/dist/components/matrix-chart/element/ui9000-matrix-chart.js.map +1 -0
  113. package/dist/components/matrix-chart/index.d.ts +5 -0
  114. package/dist/components/matrix-chart/index.d.ts.map +1 -0
  115. package/dist/components/matrix-chart/index.js +20 -0
  116. package/dist/components/matrix-chart/lib/domain.d.ts +7 -0
  117. package/dist/components/matrix-chart/lib/domain.d.ts.map +1 -0
  118. package/dist/components/matrix-chart/lib/domain.js +58 -0
  119. package/dist/components/matrix-chart/lib/domain.js.map +1 -0
  120. package/dist/components/matrix-chart/lib/format.d.ts +5 -0
  121. package/dist/components/matrix-chart/lib/format.d.ts.map +1 -0
  122. package/dist/components/matrix-chart/lib/format.js +16 -0
  123. package/dist/components/matrix-chart/lib/format.js.map +1 -0
  124. package/dist/components/matrix-chart/lib/index.d.ts +5 -0
  125. package/dist/components/matrix-chart/lib/index.d.ts.map +1 -0
  126. package/dist/components/matrix-chart/lib/normalize.d.ts +5 -0
  127. package/dist/components/matrix-chart/lib/normalize.d.ts.map +1 -0
  128. package/dist/components/matrix-chart/lib/normalize.js +165 -0
  129. package/dist/components/matrix-chart/lib/normalize.js.map +1 -0
  130. package/dist/components/matrix-chart/lib/types.d.ts +33 -0
  131. package/dist/components/matrix-chart/lib/types.d.ts.map +1 -0
  132. package/dist/components/matrix-chart/metadata.json.d.ts +110 -0
  133. package/dist/components/matrix-chart/metadata.json.js +42 -0
  134. package/dist/components/matrix-chart/metadata.json.js.map +1 -0
  135. package/dist/components/matrix-chart/render/draw.d.ts +63 -0
  136. package/dist/components/matrix-chart/render/draw.d.ts.map +1 -0
  137. package/dist/components/matrix-chart/render/draw.js +225 -0
  138. package/dist/components/matrix-chart/render/draw.js.map +1 -0
  139. package/dist/components/matrix-chart/render/index.d.ts +2 -0
  140. package/dist/components/matrix-chart/render/index.d.ts.map +1 -0
  141. package/dist/components/network-graph/element/styles.d.ts.map +1 -1
  142. package/dist/components/network-graph/element/styles.js +177 -57
  143. package/dist/components/network-graph/element/styles.js.map +1 -1
  144. package/dist/components/network-graph/element/ui9000-network-graph.d.ts +4 -0
  145. package/dist/components/network-graph/element/ui9000-network-graph.d.ts.map +1 -1
  146. package/dist/components/network-graph/element/ui9000-network-graph.js +116 -39
  147. package/dist/components/network-graph/element/ui9000-network-graph.js.map +1 -1
  148. package/dist/components/network-graph/lib/domain.d.ts +2 -2
  149. package/dist/components/network-graph/lib/domain.js.map +1 -1
  150. package/dist/components/network-graph/lib/index.d.ts +1 -0
  151. package/dist/components/network-graph/lib/index.d.ts.map +1 -1
  152. package/dist/components/network-graph/lib/legend.d.ts +15 -0
  153. package/dist/components/network-graph/lib/legend.d.ts.map +1 -0
  154. package/dist/components/network-graph/lib/legend.js +35 -0
  155. package/dist/components/network-graph/lib/legend.js.map +1 -0
  156. package/dist/components/network-graph/render/draw.d.ts +4 -1
  157. package/dist/components/network-graph/render/draw.d.ts.map +1 -1
  158. package/dist/components/network-graph/render/draw.js +34 -9
  159. package/dist/components/network-graph/render/draw.js.map +1 -1
  160. package/dist/components/pie-chart/element/styles.d.ts.map +1 -1
  161. package/dist/components/pie-chart/element/styles.js +34 -1
  162. package/dist/components/pie-chart/element/styles.js.map +1 -1
  163. package/dist/components/pie-chart/element/ui9000-pie-chart.d.ts +0 -2
  164. package/dist/components/pie-chart/element/ui9000-pie-chart.d.ts.map +1 -1
  165. package/dist/components/pie-chart/element/ui9000-pie-chart.js +2 -8
  166. package/dist/components/pie-chart/element/ui9000-pie-chart.js.map +1 -1
  167. package/dist/components/pie-chart/metadata.json.d.ts +1 -7
  168. package/dist/components/pie-chart/metadata.json.js +2 -2
  169. package/dist/components/polar-area-chart/element/styles.d.ts +1 -1
  170. package/dist/components/polar-area-chart/element/styles.d.ts.map +1 -1
  171. package/dist/components/{donut-group-chart → polar-area-chart}/element/styles.js +9 -27
  172. package/dist/components/polar-area-chart/element/styles.js.map +1 -0
  173. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.d.ts.map +1 -1
  174. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js +4 -3
  175. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js.map +1 -1
  176. package/dist/components/polar-area-chart/index.d.ts +1 -1
  177. package/dist/components/polar-area-chart/index.d.ts.map +1 -1
  178. package/dist/components/polar-area-chart/index.js +2 -1
  179. package/dist/components/polar-area-chart/lib/domain.d.ts +8 -0
  180. package/dist/components/polar-area-chart/lib/domain.d.ts.map +1 -1
  181. package/dist/components/polar-area-chart/lib/domain.js +20 -0
  182. package/dist/components/polar-area-chart/lib/domain.js.map +1 -1
  183. package/dist/components/polar-area-chart/lib/index.d.ts +1 -1
  184. package/dist/components/polar-area-chart/lib/index.d.ts.map +1 -1
  185. package/dist/components/polar-area-chart/lib/normalize.d.ts.map +1 -1
  186. package/dist/components/polar-area-chart/lib/normalize.js +72 -6
  187. package/dist/components/polar-area-chart/lib/normalize.js.map +1 -1
  188. package/dist/components/polar-area-chart/lib/types.d.ts +6 -1
  189. package/dist/components/polar-area-chart/lib/types.d.ts.map +1 -1
  190. package/dist/components/polar-area-chart/metadata.json.d.ts +1 -1
  191. package/dist/components/polar-area-chart/metadata.json.js +1 -1
  192. package/dist/components/polar-area-chart/render/draw.d.ts.map +1 -1
  193. package/dist/components/polar-area-chart/render/draw.js +2 -2
  194. package/dist/components/polar-area-chart/render/draw.js.map +1 -1
  195. package/dist/components/punchcard-chart/metadata.json.d.ts +1 -1
  196. package/dist/components/punchcard-chart/metadata.json.js +1 -1
  197. package/dist/components/sankey-chart/element/styles.d.ts.map +1 -1
  198. package/dist/components/sankey-chart/element/styles.js +7 -27
  199. package/dist/components/sankey-chart/element/styles.js.map +1 -1
  200. package/dist/components/sankey-chart/element/ui9000-sankey-chart.d.ts +5 -5
  201. package/dist/components/sankey-chart/element/ui9000-sankey-chart.d.ts.map +1 -1
  202. package/dist/components/sankey-chart/element/ui9000-sankey-chart.js +37 -35
  203. package/dist/components/sankey-chart/element/ui9000-sankey-chart.js.map +1 -1
  204. package/dist/components/treemap-chart/element/styles.d.ts +2 -0
  205. package/dist/components/treemap-chart/element/styles.d.ts.map +1 -0
  206. package/dist/components/treemap-chart/element/styles.js +141 -0
  207. package/dist/components/treemap-chart/element/styles.js.map +1 -0
  208. package/dist/components/treemap-chart/element/ui9000-treemap-chart.d.ts +35 -0
  209. package/dist/components/treemap-chart/element/ui9000-treemap-chart.d.ts.map +1 -0
  210. package/dist/components/treemap-chart/element/ui9000-treemap-chart.js +177 -0
  211. package/dist/components/treemap-chart/element/ui9000-treemap-chart.js.map +1 -0
  212. package/dist/components/treemap-chart/index.d.ts +5 -0
  213. package/dist/components/treemap-chart/index.d.ts.map +1 -0
  214. package/dist/components/treemap-chart/index.js +22 -0
  215. package/dist/components/treemap-chart/index.js.map +1 -0
  216. package/dist/components/treemap-chart/lib/color.d.ts +25 -0
  217. package/dist/components/treemap-chart/lib/color.d.ts.map +1 -0
  218. package/dist/components/treemap-chart/lib/color.js +67 -0
  219. package/dist/components/treemap-chart/lib/color.js.map +1 -0
  220. package/dist/components/treemap-chart/lib/format.d.ts +7 -0
  221. package/dist/components/treemap-chart/lib/format.d.ts.map +1 -0
  222. package/dist/components/treemap-chart/lib/format.js +9 -0
  223. package/dist/components/treemap-chart/lib/format.js.map +1 -0
  224. package/dist/components/treemap-chart/lib/index.d.ts +6 -0
  225. package/dist/components/treemap-chart/lib/index.d.ts.map +1 -0
  226. package/dist/components/treemap-chart/lib/layout.d.ts +18 -0
  227. package/dist/components/treemap-chart/lib/layout.d.ts.map +1 -0
  228. package/dist/components/treemap-chart/lib/layout.js +31 -0
  229. package/dist/components/treemap-chart/lib/layout.js.map +1 -0
  230. package/dist/components/treemap-chart/lib/normalize.d.ts +4 -0
  231. package/dist/components/treemap-chart/lib/normalize.d.ts.map +1 -0
  232. package/dist/components/treemap-chart/lib/normalize.js +182 -0
  233. package/dist/components/treemap-chart/lib/normalize.js.map +1 -0
  234. package/dist/components/treemap-chart/lib/types.d.ts +63 -0
  235. package/dist/components/treemap-chart/lib/types.d.ts.map +1 -0
  236. package/dist/components/treemap-chart/metadata.json.d.ts +126 -0
  237. package/dist/components/treemap-chart/metadata.json.js +45 -0
  238. package/dist/components/treemap-chart/render/draw.d.ts +24 -0
  239. package/dist/components/treemap-chart/render/draw.d.ts.map +1 -0
  240. package/dist/components/treemap-chart/render/draw.js +124 -0
  241. package/dist/components/treemap-chart/render/draw.js.map +1 -0
  242. package/dist/components/treemap-chart/render/index.d.ts +2 -0
  243. package/dist/components/treemap-chart/render/index.d.ts.map +1 -0
  244. package/dist/element/chart-legend-render.d.ts +5 -0
  245. package/dist/element/chart-legend-render.d.ts.map +1 -1
  246. package/dist/element/chart-legend-render.js +19 -1
  247. package/dist/element/chart-legend-render.js.map +1 -1
  248. package/dist/element/chart-shell-styles.d.ts.map +1 -1
  249. package/dist/element/chart-shell-styles.js +35 -0
  250. package/dist/element/chart-shell-styles.js.map +1 -1
  251. package/dist/index.d.ts +8 -4
  252. package/dist/index.d.ts.map +1 -1
  253. package/dist/index.js +73 -39
  254. package/dist/index.js.map +1 -1
  255. package/dist/lazy/index.d.ts +4 -2
  256. package/dist/lazy/index.d.ts.map +1 -1
  257. package/dist/lazy/index.js +24 -8
  258. package/dist/lazy/index.js.map +1 -1
  259. package/dist/lazy/map-chart.d.ts +4 -0
  260. package/dist/lazy/map-chart.d.ts.map +1 -0
  261. package/dist/lazy/map-chart.js +5 -0
  262. package/dist/lazy/map-chart.js.map +1 -0
  263. package/dist/lazy/matrix-chart.d.ts +4 -0
  264. package/dist/lazy/matrix-chart.d.ts.map +1 -0
  265. package/dist/lazy/matrix-chart.js +5 -0
  266. package/dist/lazy/matrix-chart.js.map +1 -0
  267. package/dist/lazy/treemap-chart.d.ts +4 -0
  268. package/dist/lazy/treemap-chart.d.ts.map +1 -0
  269. package/dist/lazy/treemap-chart.js +5 -0
  270. package/dist/lazy/treemap-chart.js.map +1 -0
  271. package/dist/node_modules/lit-html/directive.js +28 -0
  272. package/dist/node_modules/lit-html/directive.js.map +1 -0
  273. package/dist/node_modules/lit-html/directives/style-map.js +37 -0
  274. package/dist/node_modules/lit-html/directives/style-map.js.map +1 -0
  275. package/dist/node_modules/lit-html/lit-html.js +231 -0
  276. package/dist/node_modules/lit-html/lit-html.js.map +1 -0
  277. package/dist/utils/axis-units.d.ts +15 -0
  278. package/dist/utils/axis-units.d.ts.map +1 -0
  279. package/dist/utils/axis-units.js +27 -0
  280. package/dist/utils/axis-units.js.map +1 -0
  281. package/dist/utils/chart-helpers.d.ts +4 -6
  282. package/dist/utils/chart-helpers.d.ts.map +1 -1
  283. package/dist/utils/chart-helpers.js +16 -15
  284. package/dist/utils/chart-helpers.js.map +1 -1
  285. package/dist/utils/format-text.d.ts +5 -0
  286. package/dist/utils/format-text.d.ts.map +1 -1
  287. package/dist/utils/format-text.js +7 -0
  288. package/dist/utils/format-text.js.map +1 -1
  289. package/dist/utils/fuse-palette.d.ts +12 -0
  290. package/dist/utils/fuse-palette.d.ts.map +1 -1
  291. package/dist/utils/fuse-palette.js +23 -1
  292. package/dist/utils/fuse-palette.js.map +1 -1
  293. package/dist/utils/fuse-widget.d.ts +13 -4
  294. package/dist/utils/fuse-widget.d.ts.map +1 -1
  295. package/dist/utils/fuse-widget.js.map +1 -1
  296. package/dist/utils/fusedash-visual.d.ts +65 -52
  297. package/dist/utils/fusedash-visual.d.ts.map +1 -1
  298. package/dist/utils/fusedash-visual.js +48 -29
  299. package/dist/utils/fusedash-visual.js.map +1 -1
  300. package/package.json +38 -11
  301. package/dist/components/donut-group-chart/element/styles.d.ts +0 -2
  302. package/dist/components/donut-group-chart/element/styles.d.ts.map +0 -1
  303. package/dist/components/donut-group-chart/element/styles.js.map +0 -1
  304. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.d.ts +0 -34
  305. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.d.ts.map +0 -1
  306. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.js +0 -169
  307. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.js.map +0 -1
  308. package/dist/components/donut-group-chart/index.d.ts +0 -5
  309. package/dist/components/donut-group-chart/index.d.ts.map +0 -1
  310. package/dist/components/donut-group-chart/index.js +0 -23
  311. package/dist/components/donut-group-chart/lib/domain.d.ts +0 -39
  312. package/dist/components/donut-group-chart/lib/domain.d.ts.map +0 -1
  313. package/dist/components/donut-group-chart/lib/domain.js +0 -51
  314. package/dist/components/donut-group-chart/lib/domain.js.map +0 -1
  315. package/dist/components/donut-group-chart/lib/format.d.ts +0 -7
  316. package/dist/components/donut-group-chart/lib/format.d.ts.map +0 -1
  317. package/dist/components/donut-group-chart/lib/format.js +0 -21
  318. package/dist/components/donut-group-chart/lib/format.js.map +0 -1
  319. package/dist/components/donut-group-chart/lib/index.d.ts +0 -5
  320. package/dist/components/donut-group-chart/lib/index.d.ts.map +0 -1
  321. package/dist/components/donut-group-chart/lib/normalize.d.ts +0 -14
  322. package/dist/components/donut-group-chart/lib/normalize.d.ts.map +0 -1
  323. package/dist/components/donut-group-chart/lib/normalize.js +0 -98
  324. package/dist/components/donut-group-chart/lib/normalize.js.map +0 -1
  325. package/dist/components/donut-group-chart/lib/types.d.ts +0 -49
  326. package/dist/components/donut-group-chart/lib/types.d.ts.map +0 -1
  327. package/dist/components/donut-group-chart/metadata.json.d.ts +0 -113
  328. package/dist/components/donut-group-chart/metadata.json.js +0 -45
  329. package/dist/components/donut-group-chart/render/draw.d.ts +0 -44
  330. package/dist/components/donut-group-chart/render/draw.d.ts.map +0 -1
  331. package/dist/components/donut-group-chart/render/draw.js +0 -194
  332. package/dist/components/donut-group-chart/render/draw.js.map +0 -1
  333. package/dist/components/donut-group-chart/render/index.d.ts +0 -2
  334. package/dist/components/donut-group-chart/render/index.d.ts.map +0 -1
  335. package/dist/components/donut-group-chart/tests/fixtures.d.ts +0 -33
  336. package/dist/components/donut-group-chart/tests/fixtures.d.ts.map +0 -1
  337. package/dist/lazy/donut-group-chart.d.ts +0 -4
  338. package/dist/lazy/donut-group-chart.d.ts.map +0 -1
  339. package/dist/lazy/donut-group-chart.js +0 -5
  340. package/dist/lazy/donut-group-chart.js.map +0 -1
  341. /package/dist/components/{donut-group-chart → matrix-chart}/index.js.map +0 -0
  342. /package/dist/components/{donut-group-chart → treemap-chart}/metadata.json.js.map +0 -0
@@ -132,6 +132,26 @@ function punchcardScaledRadius(value, ranges, layoutMaxR) {
132
132
  Math.min(layoutMaxR, raw * Math.min(1, scale))
133
133
  );
134
134
  }
135
+ function generateSequentialColorRanges(values, variations = SEQUENTIAL_1, ranges) {
136
+ if (!variations.length || !values.length) return [];
137
+ const sortedValues = [...new Set(values)].sort((a, b) => a - b);
138
+ const steps = generateBreakPoints(sortedValues);
139
+ const count = Math.min(steps.length, variations.length);
140
+ const out = [];
141
+ for (let i = 0; i < count; i += 1) {
142
+ out.push({
143
+ color: variations[i],
144
+ start: Number(steps[i]),
145
+ end: i === count - 1 ? sortedValues[sortedValues.length - 1] : Number(steps[i + 1])
146
+ });
147
+ }
148
+ return out;
149
+ }
150
+ function sequentialColorForValue(value, ranges) {
151
+ if (!ranges.length) return null;
152
+ const range = ranges.find((r) => value >= r.start && value <= r.end);
153
+ return (range == null ? void 0 : range.color) ?? ranges[0].color;
154
+ }
135
155
  export {
136
156
  PUNCHCARD_BOTTOM_MARGIN,
137
157
  PUNCHCARD_LABEL_GUTTER_PAD,
@@ -147,12 +167,14 @@ export {
147
167
  generateBreakPoints,
148
168
  generateBubbleColorRanges,
149
169
  generatePunchcardColorRanges,
170
+ generateSequentialColorRanges,
150
171
  pickQualitativePalette,
151
172
  punchcardColorForValue,
152
173
  punchcardLayoutMaxRadius,
153
174
  punchcardLeftGutter,
154
175
  punchcardRadiusForValue,
155
176
  punchcardScaledRadius,
156
- resolveFormattingColor
177
+ resolveFormattingColor,
178
+ sequentialColorForValue
157
179
  };
158
180
  //# sourceMappingURL=fuse-palette.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fuse-palette.js","sources":["../../src/utils/fuse-palette.ts"],"sourcesContent":["/**\n * FuseDash palette resolution — mirrors\n * `client/.../getQualitativePalette` + `getCurrentColor` + SequentialColors1.\n */\n\nexport type FuseFormattingEntry = { key?: string; color?: string | number };\n\nexport const QUALITATIVE_2: string[] = ['#473DD9', '#36C4A5'];\n\nexport const QUALITATIVE_4: string[] = [\n '#473DD9',\n '#36C4A5',\n '#FF8C47',\n '#56546D',\n];\n\n/** Qualitative12Colors.default */\nexport const QUALITATIVE_12: string[] = [\n '#473DD9',\n '#938CFF',\n '#36C4A5',\n '#ADF4E5',\n '#BDBCC8',\n '#56546D',\n '#FF8C47',\n '#FFCEB0',\n '#FF4781',\n '#FFB0C9',\n '#47B0FF',\n '#B0DDFF',\n];\n\n/** SequentialColors1.default — punchcard magnitude bands */\nexport const SEQUENTIAL_1: string[] = [\n '#D6D3FF',\n '#B5B0FF',\n '#938CFF',\n '#7369FF',\n '#5448FF',\n '#473DD9',\n '#3C33B5',\n];\n\n/** FuseDash punchcard discrete radii per color band */\nexport const PUNCHCARD_RADII = [5, 10, 14, 17, 20, 24, 26] as const;\n\n/** Client PunchcardChart bubble + frame tokens */\nexport const PUNCHCARD_MAX_BUBBLE_RADIUS = 30;\nexport const PUNCHCARD_MIN_BUBBLE_RADIUS = 8;\nexport const PUNCHCARD_MIN_LABEL_RADIUS = 16;\nexport const PUNCHCARD_BOTTOM_MARGIN = 21;\nexport const PUNCHCARD_LABEL_GUTTER_PAD = 10;\n\n/** Tight left gutter from longest Y category (years ≈ 40px, not fixed 80). */\nexport function punchcardLeftGutter(\n categories: string[],\n fontSize = 11,\n): number {\n const longest = categories.reduce(\n (max, c) => Math.max(max, String(c).length),\n 0,\n );\n const chars = Math.max(longest, 3);\n return Math.ceil(chars * fontSize * 0.6) + PUNCHCARD_LABEL_GUTTER_PAD + 8;\n}\n\n/** @deprecated Use punchcardLeftGutter() */\nexport const PUNCHCARD_LEFT_MARGIN = 80;\n\n/** Max bubble radius that fits the plot without clipping (FuseDash range inset). */\nexport function punchcardLayoutMaxRadius(\n plotWidth: number,\n plotHeight: number,\n xCount: number,\n yCount: number,\n): number {\n if (xCount <= 0 || yCount <= 0) return PUNCHCARD_MAX_BUBBLE_RADIUS;\n const byX = plotWidth / xCount / 2;\n const byY = plotHeight / yCount / 2;\n return Math.min(PUNCHCARD_MAX_BUBBLE_RADIUS, byX, byY);\n}\n\n/**\n * Client rule: formatting.length ≤2 → Q2, 3–4 → Q4, >4 → Q12.\n * Falls back to seriesCount when formatting is empty.\n */\nexport function pickQualitativePalette(\n formattingCount: number,\n seriesCount = 1,\n): string[] {\n const n = formattingCount > 0 ? formattingCount : seriesCount;\n if (n > 4) return QUALITATIVE_12;\n if (n > 2) return QUALITATIVE_4;\n return QUALITATIVE_2;\n}\n\n/**\n * Resolve hex for a formatting key (group / category / \"default\").\n * Color indices are 1-based strings matching palette `key`.\n */\nexport function resolveFormattingColor(\n formatting: FuseFormattingEntry[] | null | undefined,\n key: string,\n seriesCount = 1,\n): string {\n const colors = formatting?.length\n ? formatting\n : [{ key: 'default', color: '1' }];\n const palette = pickQualitativePalette(colors.length, seriesCount);\n const entry = colors.find((item) => String(item.key) === String(key));\n const raw = entry?.color ?? colors[0]?.color ?? 1;\n const colorIndex = Number(raw);\n const idx = Number.isFinite(colorIndex) ? colorIndex : 1;\n // Client: find by key string first, else cycle (colorIndex - 1) % length\n const direct = palette[idx - 1];\n if (direct) return direct;\n return palette[(((idx - 1) % palette.length) + palette.length) % palette.length];\n}\n\n/** Apply qualitative colors onto a list of series/group ids. */\nexport function colorMapForKeys(\n keys: string[],\n formatting?: FuseFormattingEntry[] | null,\n): Map<string, string> {\n const map = new Map<string, string>();\n for (const key of keys) {\n map.set(key, resolveFormattingColor(formatting, key, keys.length));\n }\n return map;\n}\n\nexport type PunchcardColorRange = {\n color: string;\n radius: number;\n start: number;\n end: number;\n};\n\n/** Mirrors client `generateBreakPoints` (quantile ladder, default 7). */\nexport function generateBreakPoints(\n values: number[],\n numBreaks = 7,\n): number[] {\n const sorted = values\n .map((v) => (typeof v === 'number' ? v : Number(v)))\n .filter((v) => Number.isFinite(v))\n .slice()\n .sort((a, b) => a - b);\n if (!sorted.length || numBreaks < 2) return [];\n\n const breakPoints: number[] = [];\n for (let i = 0; i < numBreaks; i++) {\n const quantilePosition = (i / (numBreaks - 1)) * (sorted.length - 1);\n const lowerIndex = Math.max(0, Math.floor(quantilePosition));\n const upperIndex = Math.min(sorted.length - 1, Math.ceil(quantilePosition));\n const weight = quantilePosition - lowerIndex;\n breakPoints.push(\n sorted[lowerIndex] * (1 - weight) + sorted[upperIndex] * weight,\n );\n }\n return breakPoints;\n}\n\n/** Mirrors client `generateColorRanges` for punchcard bubbles. */\nexport function generatePunchcardColorRanges(\n values: number[],\n variations: string[] = SEQUENTIAL_1,\n): PunchcardColorRange[] {\n if (!variations.length || !values.length) return [];\n\n const sortedValues = [...new Set(values.map(Math.abs))].sort((a, b) => a - b);\n const steps = generateBreakPoints(sortedValues);\n if (!steps.length) return [];\n\n return steps.map((_step, i) => ({\n color: variations[i] ?? variations[variations.length - 1] ?? '#473DD9',\n radius: PUNCHCARD_RADII[i] ?? PUNCHCARD_RADII[PUNCHCARD_RADII.length - 1],\n start:\n -Math.ceil(\n i === steps.length - 1\n ? sortedValues[sortedValues.length - 1]\n : steps[i + 1],\n ) - 1,\n end:\n Math.ceil(\n i === steps.length - 1\n ? sortedValues[sortedValues.length - 1]\n : steps[i + 1],\n ) + 1,\n }));\n}\n\nexport function punchcardColorForValue(\n value: number,\n ranges: PunchcardColorRange[],\n): string {\n if (!ranges.length) return SEQUENTIAL_1[0];\n if (!value) return ranges[0].color;\n const range = ranges.find((r) => value >= r.start && value <= r.end);\n return range?.color ?? ranges[0].color;\n}\n\nexport function punchcardRadiusForValue(\n value: number,\n ranges: PunchcardColorRange[],\n): number {\n if (!ranges.length) return 5;\n const abs = Math.abs(value);\n const range = ranges.find((r) => abs >= r.start && abs <= r.end);\n return range?.radius ?? 5;\n}\n\n/** Mirrors client BubbleChart `generateColorRanges` — transparent bands, radius-only. */\nexport function generateBubbleColorRanges(\n values: number[],\n ranges?: number[] | null,\n): PunchcardColorRange[] {\n if (!values.length) return [];\n\n const absValues = [...new Set(values.map(Math.abs))].sort((a, b) => a - b);\n const absCount = absValues.length;\n const steps = ranges?.length ? ranges : generateBreakPoints(absValues);\n if (!steps.length) return [];\n\n return steps.map((step, i) => ({\n color: 'transparent',\n radius: PUNCHCARD_RADII[i] ?? PUNCHCARD_RADII[PUNCHCARD_RADII.length - 1],\n start: step,\n end:\n i === steps.length - 1\n ? absCount > 0\n ? absValues[absCount - 1]\n : 0\n : steps[i + 1],\n }));\n}\n\n/** Alias — bubble radii use the same abs(y) band lookup as punchcard. */\nexport const bubbleRadiusForValue = punchcardRadiusForValue;\n\n/** Scale discrete band radii when plot is shorter than FuseDash default height. */\nexport function punchcardScaledRadius(\n value: number,\n ranges: PunchcardColorRange[],\n layoutMaxR: number,\n): number {\n const raw = punchcardRadiusForValue(value, ranges);\n const bandMax = Math.max(...ranges.map((r) => r.radius), PUNCHCARD_MIN_BUBBLE_RADIUS);\n const scale = layoutMaxR / Math.max(bandMax, PUNCHCARD_MIN_BUBBLE_RADIUS);\n return Math.max(\n PUNCHCARD_MIN_BUBBLE_RADIUS,\n Math.min(layoutMaxR, raw * Math.min(1, scale)),\n );\n}\n"],"names":[],"mappings":"AAOO,MAAM,gBAA0B,CAAC,WAAW,SAAS;AAErD,MAAM,gBAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,iBAA2B;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,eAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,kBAAkB,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAGlD,MAAM,8BAA8B;AACpC,MAAM,8BAA8B;AACpC,MAAM,6BAA6B;AACnC,MAAM,0BAA0B;AAChC,MAAM,6BAA6B;AAGnC,SAAS,oBACd,YACA,WAAW,IACH;AACR,QAAM,UAAU,WAAW;AAAA,IACzB,CAAC,KAAK,MAAM,KAAK,IAAI,KAAK,OAAO,CAAC,EAAE,MAAM;AAAA,IAC1C;AAAA,EAAA;AAEF,QAAM,QAAQ,KAAK,IAAI,SAAS,CAAC;AACjC,SAAO,KAAK,KAAK,QAAQ,WAAW,GAAG,IAAI,6BAA6B;AAC1E;AAMO,SAAS,yBACd,WACA,YACA,QACA,QACQ;AACR,MAAI,UAAU,KAAK,UAAU,EAAG,QAAO;AACvC,QAAM,MAAM,YAAY,SAAS;AACjC,QAAM,MAAM,aAAa,SAAS;AAClC,SAAO,KAAK,IAAI,6BAA6B,KAAK,GAAG;AACvD;AAMO,SAAS,uBACd,iBACA,cAAc,GACJ;AACV,QAAM,IAAI,kBAAkB,IAAI,kBAAkB;AAClD,MAAI,IAAI,EAAG,QAAO;AAClB,MAAI,IAAI,EAAG,QAAO;AAClB,SAAO;AACT;AAMO,SAAS,uBACd,YACA,KACA,cAAc,GACN;AAjGH;AAkGL,QAAM,UAAS,yCAAY,UACvB,aACA,CAAC,EAAE,KAAK,WAAW,OAAO,KAAK;AACnC,QAAM,UAAU,uBAAuB,OAAO,QAAQ,WAAW;AACjE,QAAM,QAAQ,OAAO,KAAK,CAAC,SAAS,OAAO,KAAK,GAAG,MAAM,OAAO,GAAG,CAAC;AACpE,QAAM,OAAM,+BAAO,YAAS,YAAO,CAAC,MAAR,mBAAW,UAAS;AAChD,QAAM,aAAa,OAAO,GAAG;AAC7B,QAAM,MAAM,OAAO,SAAS,UAAU,IAAI,aAAa;AAEvD,QAAM,SAAS,QAAQ,MAAM,CAAC;AAC9B,MAAI,OAAQ,QAAO;AACnB,SAAO,UAAW,MAAM,KAAK,QAAQ,SAAU,QAAQ,UAAU,QAAQ,MAAM;AACjF;AAsBO,SAAS,oBACd,QACA,YAAY,GACF;AACV,QAAM,SAAS,OACZ,IAAI,CAAC,MAAO,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC,CAAE,EAClD,OAAO,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC,EAChC,QACA,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACvB,MAAI,CAAC,OAAO,UAAU,YAAY,UAAU,CAAA;AAE5C,QAAM,cAAwB,CAAA;AAC9B,WAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,UAAM,mBAAoB,KAAK,YAAY,MAAO,OAAO,SAAS;AAClE,UAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,CAAC;AAC3D,UAAM,aAAa,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,KAAK,gBAAgB,CAAC;AAC1E,UAAM,SAAS,mBAAmB;AAClC,gBAAY;AAAA,MACV,OAAO,UAAU,KAAK,IAAI,UAAU,OAAO,UAAU,IAAI;AAAA,IAAA;AAAA,EAE7D;AACA,SAAO;AACT;AAGO,SAAS,6BACd,QACA,aAAuB,cACA;AACvB,MAAI,CAAC,WAAW,UAAU,CAAC,OAAO,eAAe,CAAA;AAEjD,QAAM,eAAe,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC5E,QAAM,QAAQ,oBAAoB,YAAY;AAC9C,MAAI,CAAC,MAAM,OAAQ,QAAO,CAAA;AAE1B,SAAO,MAAM,IAAI,CAAC,OAAO,OAAO;AAAA,IAC9B,OAAO,WAAW,CAAC,KAAK,WAAW,WAAW,SAAS,CAAC,KAAK;AAAA,IAC7D,QAAQ,gBAAgB,CAAC,KAAK,gBAAgB,gBAAgB,SAAS,CAAC;AAAA,IACxE,OACE,CAAC,KAAK;AAAA,MACJ,MAAM,MAAM,SAAS,IACjB,aAAa,aAAa,SAAS,CAAC,IACpC,MAAM,IAAI,CAAC;AAAA,IAAA,IACb;AAAA,IACN,KACE,KAAK;AAAA,MACH,MAAM,MAAM,SAAS,IACjB,aAAa,aAAa,SAAS,CAAC,IACpC,MAAM,IAAI,CAAC;AAAA,IAAA,IACb;AAAA,EAAA,EACN;AACJ;AAEO,SAAS,uBACd,OACA,QACQ;AACR,MAAI,CAAC,OAAO,OAAQ,QAAO,aAAa,CAAC;AACzC,MAAI,CAAC,MAAO,QAAO,OAAO,CAAC,EAAE;AAC7B,QAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,SAAS,EAAE,SAAS,SAAS,EAAE,GAAG;AACnE,UAAO,+BAAO,UAAS,OAAO,CAAC,EAAE;AACnC;AAEO,SAAS,wBACd,OACA,QACQ;AACR,MAAI,CAAC,OAAO,OAAQ,QAAO;AAC3B,QAAM,MAAM,KAAK,IAAI,KAAK;AAC1B,QAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,OAAO,EAAE,SAAS,OAAO,EAAE,GAAG;AAC/D,UAAO,+BAAO,WAAU;AAC1B;AAGO,SAAS,0BACd,QACA,QACuB;AACvB,MAAI,CAAC,OAAO,OAAQ,QAAO,CAAA;AAE3B,QAAM,YAAY,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACzE,QAAM,WAAW,UAAU;AAC3B,QAAM,SAAQ,iCAAQ,UAAS,SAAS,oBAAoB,SAAS;AACrE,MAAI,CAAC,MAAM,OAAQ,QAAO,CAAA;AAE1B,SAAO,MAAM,IAAI,CAAC,MAAM,OAAO;AAAA,IAC7B,OAAO;AAAA,IACP,QAAQ,gBAAgB,CAAC,KAAK,gBAAgB,gBAAgB,SAAS,CAAC;AAAA,IACxE,OAAO;AAAA,IACP,KACE,MAAM,MAAM,SAAS,IACjB,WAAW,IACT,UAAU,WAAW,CAAC,IACtB,IACF,MAAM,IAAI,CAAC;AAAA,EAAA,EACjB;AACJ;AAGO,MAAM,uBAAuB;AAG7B,SAAS,sBACd,OACA,QACA,YACQ;AACR,QAAM,MAAM,wBAAwB,OAAO,MAAM;AACjD,QAAM,UAAU,KAAK,IAAI,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,2BAA2B;AACpF,QAAM,QAAQ,aAAa,KAAK,IAAI,SAAS,2BAA2B;AACxE,SAAO,KAAK;AAAA,IACV;AAAA,IACA,KAAK,IAAI,YAAY,MAAM,KAAK,IAAI,GAAG,KAAK,CAAC;AAAA,EAAA;AAEjD;"}
1
+ {"version":3,"file":"fuse-palette.js","sources":["../../src/utils/fuse-palette.ts"],"sourcesContent":["/**\n * FuseDash palette resolution — mirrors\n * `client/.../getQualitativePalette` + `getCurrentColor` + SequentialColors1.\n */\n\nexport type FuseFormattingEntry = { key?: string; color?: string | number };\n\nexport const QUALITATIVE_2: string[] = ['#473DD9', '#36C4A5'];\n\nexport const QUALITATIVE_4: string[] = [\n '#473DD9',\n '#36C4A5',\n '#FF8C47',\n '#56546D',\n];\n\n/** Qualitative12Colors.default */\nexport const QUALITATIVE_12: string[] = [\n '#473DD9',\n '#938CFF',\n '#36C4A5',\n '#ADF4E5',\n '#BDBCC8',\n '#56546D',\n '#FF8C47',\n '#FFCEB0',\n '#FF4781',\n '#FFB0C9',\n '#47B0FF',\n '#B0DDFF',\n];\n\n/** SequentialColors1.default — punchcard magnitude bands */\nexport const SEQUENTIAL_1: string[] = [\n '#D6D3FF',\n '#B5B0FF',\n '#938CFF',\n '#7369FF',\n '#5448FF',\n '#473DD9',\n '#3C33B5',\n];\n\n/** FuseDash punchcard discrete radii per color band */\nexport const PUNCHCARD_RADII = [5, 10, 14, 17, 20, 24, 26] as const;\n\n/** Client PunchcardChart bubble + frame tokens */\nexport const PUNCHCARD_MAX_BUBBLE_RADIUS = 30;\nexport const PUNCHCARD_MIN_BUBBLE_RADIUS = 8;\nexport const PUNCHCARD_MIN_LABEL_RADIUS = 16;\nexport const PUNCHCARD_BOTTOM_MARGIN = 21;\nexport const PUNCHCARD_LABEL_GUTTER_PAD = 10;\n\n/** Tight left gutter from longest Y category (years ≈ 40px, not fixed 80). */\nexport function punchcardLeftGutter(\n categories: string[],\n fontSize = 11,\n): number {\n const longest = categories.reduce(\n (max, c) => Math.max(max, String(c).length),\n 0,\n );\n const chars = Math.max(longest, 3);\n return Math.ceil(chars * fontSize * 0.6) + PUNCHCARD_LABEL_GUTTER_PAD + 8;\n}\n\n/** @deprecated Use punchcardLeftGutter() */\nexport const PUNCHCARD_LEFT_MARGIN = 80;\n\n/** Max bubble radius that fits the plot without clipping (FuseDash range inset). */\nexport function punchcardLayoutMaxRadius(\n plotWidth: number,\n plotHeight: number,\n xCount: number,\n yCount: number,\n): number {\n if (xCount <= 0 || yCount <= 0) return PUNCHCARD_MAX_BUBBLE_RADIUS;\n const byX = plotWidth / xCount / 2;\n const byY = plotHeight / yCount / 2;\n return Math.min(PUNCHCARD_MAX_BUBBLE_RADIUS, byX, byY);\n}\n\n/**\n * Client rule: formatting.length ≤2 → Q2, 3–4 → Q4, >4 → Q12.\n * Falls back to seriesCount when formatting is empty.\n */\nexport function pickQualitativePalette(\n formattingCount: number,\n seriesCount = 1,\n): string[] {\n const n = formattingCount > 0 ? formattingCount : seriesCount;\n if (n > 4) return QUALITATIVE_12;\n if (n > 2) return QUALITATIVE_4;\n return QUALITATIVE_2;\n}\n\n/**\n * Resolve hex for a formatting key (group / category / \"default\").\n * Color indices are 1-based strings matching palette `key`.\n */\nexport function resolveFormattingColor(\n formatting: FuseFormattingEntry[] | null | undefined,\n key: string,\n seriesCount = 1,\n): string {\n const colors = formatting?.length\n ? formatting\n : [{ key: 'default', color: '1' }];\n const palette = pickQualitativePalette(colors.length, seriesCount);\n const entry = colors.find((item) => String(item.key) === String(key));\n const raw = entry?.color ?? colors[0]?.color ?? 1;\n const colorIndex = Number(raw);\n const idx = Number.isFinite(colorIndex) ? colorIndex : 1;\n // Client: find by key string first, else cycle (colorIndex - 1) % length\n const direct = palette[idx - 1];\n if (direct) return direct;\n return palette[(((idx - 1) % palette.length) + palette.length) % palette.length];\n}\n\n/** Apply qualitative colors onto a list of series/group ids. */\nexport function colorMapForKeys(\n keys: string[],\n formatting?: FuseFormattingEntry[] | null,\n): Map<string, string> {\n const map = new Map<string, string>();\n for (const key of keys) {\n map.set(key, resolveFormattingColor(formatting, key, keys.length));\n }\n return map;\n}\n\nexport type PunchcardColorRange = {\n color: string;\n radius: number;\n start: number;\n end: number;\n};\n\n/** Mirrors client `generateBreakPoints` (quantile ladder, default 7). */\nexport function generateBreakPoints(\n values: number[],\n numBreaks = 7,\n): number[] {\n const sorted = values\n .map((v) => (typeof v === 'number' ? v : Number(v)))\n .filter((v) => Number.isFinite(v))\n .slice()\n .sort((a, b) => a - b);\n if (!sorted.length || numBreaks < 2) return [];\n\n const breakPoints: number[] = [];\n for (let i = 0; i < numBreaks; i++) {\n const quantilePosition = (i / (numBreaks - 1)) * (sorted.length - 1);\n const lowerIndex = Math.max(0, Math.floor(quantilePosition));\n const upperIndex = Math.min(sorted.length - 1, Math.ceil(quantilePosition));\n const weight = quantilePosition - lowerIndex;\n breakPoints.push(\n sorted[lowerIndex] * (1 - weight) + sorted[upperIndex] * weight,\n );\n }\n return breakPoints;\n}\n\n/** Mirrors client `generateColorRanges` for punchcard bubbles. */\nexport function generatePunchcardColorRanges(\n values: number[],\n variations: string[] = SEQUENTIAL_1,\n): PunchcardColorRange[] {\n if (!variations.length || !values.length) return [];\n\n const sortedValues = [...new Set(values.map(Math.abs))].sort((a, b) => a - b);\n const steps = generateBreakPoints(sortedValues);\n if (!steps.length) return [];\n\n return steps.map((_step, i) => ({\n color: variations[i] ?? variations[variations.length - 1] ?? '#473DD9',\n radius: PUNCHCARD_RADII[i] ?? PUNCHCARD_RADII[PUNCHCARD_RADII.length - 1],\n start:\n -Math.ceil(\n i === steps.length - 1\n ? sortedValues[sortedValues.length - 1]\n : steps[i + 1],\n ) - 1,\n end:\n Math.ceil(\n i === steps.length - 1\n ? sortedValues[sortedValues.length - 1]\n : steps[i + 1],\n ) + 1,\n }));\n}\n\nexport function punchcardColorForValue(\n value: number,\n ranges: PunchcardColorRange[],\n): string {\n if (!ranges.length) return SEQUENTIAL_1[0];\n if (!value) return ranges[0].color;\n const range = ranges.find((r) => value >= r.start && value <= r.end);\n return range?.color ?? ranges[0].color;\n}\n\nexport function punchcardRadiusForValue(\n value: number,\n ranges: PunchcardColorRange[],\n): number {\n if (!ranges.length) return 5;\n const abs = Math.abs(value);\n const range = ranges.find((r) => abs >= r.start && abs <= r.end);\n return range?.radius ?? 5;\n}\n\n/** Mirrors client BubbleChart `generateColorRanges` — transparent bands, radius-only. */\nexport function generateBubbleColorRanges(\n values: number[],\n ranges?: number[] | null,\n): PunchcardColorRange[] {\n if (!values.length) return [];\n\n const absValues = [...new Set(values.map(Math.abs))].sort((a, b) => a - b);\n const absCount = absValues.length;\n const steps = ranges?.length ? ranges : generateBreakPoints(absValues);\n if (!steps.length) return [];\n\n return steps.map((step, i) => ({\n color: 'transparent',\n radius: PUNCHCARD_RADII[i] ?? PUNCHCARD_RADII[PUNCHCARD_RADII.length - 1],\n start: step,\n end:\n i === steps.length - 1\n ? absCount > 0\n ? absValues[absCount - 1]\n : 0\n : steps[i + 1],\n }));\n}\n\n/** Alias — bubble radii use the same abs(y) band lookup as punchcard. */\nexport const bubbleRadiusForValue = punchcardRadiusForValue;\n\n/** Scale discrete band radii when plot is shorter than FuseDash default height. */\nexport function punchcardScaledRadius(\n value: number,\n ranges: PunchcardColorRange[],\n layoutMaxR: number,\n): number {\n const raw = punchcardRadiusForValue(value, ranges);\n const bandMax = Math.max(...ranges.map((r) => r.radius), PUNCHCARD_MIN_BUBBLE_RADIUS);\n const scale = layoutMaxR / Math.max(bandMax, PUNCHCARD_MIN_BUBBLE_RADIUS);\n return Math.max(\n PUNCHCARD_MIN_BUBBLE_RADIUS,\n Math.min(layoutMaxR, raw * Math.min(1, scale)),\n );\n}\n\nexport type SequentialColorRange = {\n color: string;\n start: number;\n end: number;\n};\n\n/**\n * Mirrors client `generateColorRanges` (MatrixChart / palette legend):\n * a quantile ladder over the distinct values, one band per palette color.\n */\nexport function generateSequentialColorRanges(\n values: number[],\n variations: string[] = SEQUENTIAL_1,\n ranges?: number[] | null,\n): SequentialColorRange[] {\n if (!variations.length || !values.length) return [];\n\n const sortedValues = [...new Set(values)].sort((a, b) => a - b);\n const steps = ranges?.length ? ranges : generateBreakPoints(sortedValues);\n const count = Math.min(steps.length, variations.length);\n\n const out: SequentialColorRange[] = [];\n for (let i = 0; i < count; i += 1) {\n out.push({\n color: variations[i],\n start: Number(steps[i]),\n end:\n i === count - 1\n ? sortedValues[sortedValues.length - 1]\n : Number(steps[i + 1]),\n });\n }\n return out;\n}\n\n/** Client `getColor`: first band containing the value, else the lowest band. */\nexport function sequentialColorForValue(\n value: number,\n ranges: SequentialColorRange[],\n): string | null {\n if (!ranges.length) return null;\n const range = ranges.find((r) => value >= r.start && value <= r.end);\n return range?.color ?? ranges[0].color;\n}\n"],"names":[],"mappings":"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"}
@@ -1,10 +1,17 @@
1
+ import { AxisDetail } from './axis-units.js';
1
2
  import { FuseFormattingEntry } from './fuse-palette.js';
3
+ import { FuseAxisDetail } from './format-text.js';
4
+ export type { FuseAxisDetail };
2
5
  export type FuseWidgetLike = {
3
6
  chartType?: string;
4
7
  stacked?: boolean;
5
8
  xAxe?: string | string[] | null;
6
9
  yAxe?: string | string[] | null;
7
10
  groupBy?: string | string[] | null;
11
+ /** Treemap nests this second dimension inside each `groupBy` card */
12
+ subgroup?: string | null;
13
+ /** Treemap / KPI measured column — takes precedence over `yAxe` */
14
+ metric?: string | string[] | null;
8
15
  uniqueValues?: Record<string, string[]> | null;
9
16
  orientation?: string | null;
10
17
  formatting?: FuseFormattingEntry[] | null;
@@ -12,10 +19,12 @@ export type FuseWidgetLike = {
12
19
  key?: string;
13
20
  shape?: string;
14
21
  }> | null;
15
- axisDetails?: Record<string, {
16
- label?: string;
17
- measure_unit_symbol?: string;
18
- }> | null;
22
+ axisDetails?: Record<string, AxisDetail> | null;
23
+ /** Widget palette overrides — `range` pins the treemap color break points */
24
+ palette?: {
25
+ paletteId?: string;
26
+ range?: number[];
27
+ } | null;
19
28
  data?: unknown;
20
29
  };
21
30
  export declare function firstField(value: string | string[] | null | undefined): string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"fuse-widget.d.ts","sourceRoot":"","sources":["../../src/utils/fuse-widget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACtF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAC1C,MAAM,GAAG,SAAS,CAOpB;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAI3E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAK5E;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAKxE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAI7D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACzD,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,EAAE,CAsBV;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,GACrB,MAAM,EAAE,GAAG,SAAS,CAItB"}
1
+ {"version":3,"file":"fuse-widget.d.ts","sourceRoot":"","sources":["../../src/utils/fuse-widget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAC/C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;IAChD,6EAA6E;IAC7E,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC1D,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAC1C,MAAM,GAAG,SAAS,CAOpB;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAI3E;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,CAK5E;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAKxE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAI7D;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC1B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACzD,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,EAAE,CAsBV;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,cAAc,GACrB,MAAM,EAAE,GAAG,SAAS,CAItB"}
@@ -1 +1 @@
1
- {"version":3,"file":"fuse-widget.js","sources":["../../src/utils/fuse-widget.ts"],"sourcesContent":["/**\n * Shared helpers for FuseDash WidgetItem-shaped payloads from\n * `client/apps/charts/src/app/constants/default*.ts`.\n */\n\nimport type { FuseFormattingEntry } from './fuse-palette.js';\n\nexport type FuseWidgetLike = {\n chartType?: string;\n stacked?: boolean;\n xAxe?: string | string[] | null;\n yAxe?: string | string[] | null;\n groupBy?: string | string[] | null;\n uniqueValues?: Record<string, string[]> | null;\n orientation?: string | null;\n formatting?: FuseFormattingEntry[] | null;\n markers?: Array<{ key?: string; shape?: string }> | null;\n axisDetails?: Record<string, { label?: string; measure_unit_symbol?: string }> | null;\n data?: unknown;\n};\n\nexport function firstField(\n value: string | string[] | null | undefined,\n): string | undefined {\n if (Array.isArray(value)) {\n const v = value[0];\n return v != null && String(v) !== '' ? String(v) : undefined;\n }\n if (value == null || value === '') return undefined;\n return String(value);\n}\n\n/** True when payload looks like a FuseDash widget (`data` rows + axes). */\nexport function isFuseWidgetPayload(input: unknown): input is FuseWidgetLike {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return false;\n const o = input as FuseWidgetLike;\n return Array.isArray(o.data);\n}\n\n/**\n * Categorical key for punchcard Y / grouping — mirrors client PunchcardChart:\n * `groupBy?.[0] ?? Object.keys(uniqueValues)[0]`.\n */\nexport function resolveGroupByKey(widget: FuseWidgetLike): string | undefined {\n const fromGroup = firstField(widget.groupBy ?? undefined);\n if (fromGroup) return fromGroup;\n const keys = widget.uniqueValues ? Object.keys(widget.uniqueValues) : [];\n return keys[0];\n}\n\nexport function rowsOf(widget: FuseWidgetLike): Record<string, unknown>[] {\n if (!Array.isArray(widget.data)) return [];\n return widget.data.filter(\n (r): r is Record<string, unknown> => !!r && typeof r === 'object' && !Array.isArray(r),\n );\n}\n\nexport function filterTruthyValues(values: string[]): string[] {\n return values.filter(\n (v) => v != null && v !== '' && v !== 'null' && v !== 'undefined',\n );\n}\n\n/**\n * Order categorical keys by FuseDash `uniqueValues[fieldKey]`, keeping any\n * extra data keys at the end in first-seen order.\n */\nexport function resolveUniqueValuesOrder(\n dataKeys: Iterable<string>,\n uniqueValues: Record<string, string[]> | null | undefined,\n fieldKey: string | undefined,\n): string[] {\n const dataSet = new Set(dataKeys);\n const fromUv =\n fieldKey && uniqueValues?.[fieldKey]?.length\n ? filterTruthyValues(uniqueValues[fieldKey].map(String))\n : null;\n if (fromUv?.length) {\n const ordered = fromUv.filter((k) => dataSet.has(k));\n for (const k of dataSet) {\n if (!ordered.includes(k)) ordered.push(k);\n }\n return ordered;\n }\n const seen = new Set<string>();\n const out: string[] = [];\n for (const k of dataKeys) {\n if (!seen.has(k)) {\n seen.add(k);\n out.push(k);\n }\n }\n return out;\n}\n\n/** Categorical x-axis order from a FuseDash widget mock. */\nexport function xDomainHintFromWidget(\n widget: FuseWidgetLike,\n): string[] | undefined {\n const xKey = firstField(widget.xAxe ?? undefined);\n if (!xKey || !widget.uniqueValues?.[xKey]?.length) return undefined;\n return filterTruthyValues(widget.uniqueValues[xKey].map(String));\n}\n"],"names":[],"mappings":"AAqBO,SAAS,WACd,OACoB;AACpB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,IAAI,MAAM,CAAC;AACjB,WAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI;AAAA,EACrD;AACA,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,SAAO,OAAO,KAAK;AACrB;AAGO,SAAS,oBAAoB,OAAyC;AAC3E,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,IAAI;AACV,SAAO,MAAM,QAAQ,EAAE,IAAI;AAC7B;AAMO,SAAS,kBAAkB,QAA4C;AAC5E,QAAM,YAAY,WAAW,OAAO,WAAW,MAAS;AACxD,MAAI,UAAW,QAAO;AACtB,QAAM,OAAO,OAAO,eAAe,OAAO,KAAK,OAAO,YAAY,IAAI,CAAA;AACtE,SAAO,KAAK,CAAC;AACf;AAEO,SAAS,OAAO,QAAmD;AACxE,MAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAA;AACxC,SAAO,OAAO,KAAK;AAAA,IACjB,CAAC,MAAoC,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAAA,EAAA;AAEzF;AAEO,SAAS,mBAAmB,QAA4B;AAC7D,SAAO,OAAO;AAAA,IACZ,CAAC,MAAM,KAAK,QAAQ,MAAM,MAAM,MAAM,UAAU,MAAM;AAAA,EAAA;AAE1D;AAMO,SAAS,yBACd,UACA,cACA,UACU;AAlDL;AAmDL,QAAM,UAAU,IAAI,IAAI,QAAQ;AAChC,QAAM,SACJ,cAAY,kDAAe,cAAf,mBAA0B,UAClC,mBAAmB,aAAa,QAAQ,EAAE,IAAI,MAAM,CAAC,IACrD;AACN,MAAI,iCAAQ,QAAQ;AAClB,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AACnD,eAAW,KAAK,SAAS;AACvB,UAAI,CAAC,QAAQ,SAAS,CAAC,EAAG,SAAQ,KAAK,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACA,QAAM,2BAAW,IAAA;AACjB,QAAM,MAAgB,CAAA;AACtB,aAAW,KAAK,UAAU;AACxB,QAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAChB,WAAK,IAAI,CAAC;AACV,UAAI,KAAK,CAAC;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,sBACd,QACsB;AA7EjB;AA8EL,QAAM,OAAO,WAAW,OAAO,QAAQ,MAAS;AAChD,MAAI,CAAC,QAAQ,GAAC,kBAAO,iBAAP,mBAAsB,UAAtB,mBAA6B,QAAQ,QAAO;AAC1D,SAAO,mBAAmB,OAAO,aAAa,IAAI,EAAE,IAAI,MAAM,CAAC;AACjE;"}
1
+ {"version":3,"file":"fuse-widget.js","sources":["../../src/utils/fuse-widget.ts"],"sourcesContent":["/**\n * Shared helpers for FuseDash WidgetItem-shaped payloads from\n * `client/apps/charts/src/app/constants/default*.ts`.\n */\n\nimport type { AxisDetail } from './axis-units.js';\nimport type { FuseFormattingEntry } from './fuse-palette.js';\nimport type { FuseAxisDetail } from './format-text.js';\n\nexport type { FuseAxisDetail };\n\nexport type FuseWidgetLike = {\n chartType?: string;\n stacked?: boolean;\n xAxe?: string | string[] | null;\n yAxe?: string | string[] | null;\n groupBy?: string | string[] | null;\n /** Treemap nests this second dimension inside each `groupBy` card */\n subgroup?: string | null;\n /** Treemap / KPI measured column — takes precedence over `yAxe` */\n metric?: string | string[] | null;\n uniqueValues?: Record<string, string[]> | null;\n orientation?: string | null;\n formatting?: FuseFormattingEntry[] | null;\n markers?: Array<{ key?: string; shape?: string }> | null;\n axisDetails?: Record<string, AxisDetail> | null;\n /** Widget palette overrides — `range` pins the treemap color break points */\n palette?: { paletteId?: string; range?: number[] } | null;\n data?: unknown;\n};\n\nexport function firstField(\n value: string | string[] | null | undefined,\n): string | undefined {\n if (Array.isArray(value)) {\n const v = value[0];\n return v != null && String(v) !== '' ? String(v) : undefined;\n }\n if (value == null || value === '') return undefined;\n return String(value);\n}\n\n/** True when payload looks like a FuseDash widget (`data` rows + axes). */\nexport function isFuseWidgetPayload(input: unknown): input is FuseWidgetLike {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return false;\n const o = input as FuseWidgetLike;\n return Array.isArray(o.data);\n}\n\n/**\n * Categorical key for punchcard Y / grouping — mirrors client PunchcardChart:\n * `groupBy?.[0] ?? Object.keys(uniqueValues)[0]`.\n */\nexport function resolveGroupByKey(widget: FuseWidgetLike): string | undefined {\n const fromGroup = firstField(widget.groupBy ?? undefined);\n if (fromGroup) return fromGroup;\n const keys = widget.uniqueValues ? Object.keys(widget.uniqueValues) : [];\n return keys[0];\n}\n\nexport function rowsOf(widget: FuseWidgetLike): Record<string, unknown>[] {\n if (!Array.isArray(widget.data)) return [];\n return widget.data.filter(\n (r): r is Record<string, unknown> => !!r && typeof r === 'object' && !Array.isArray(r),\n );\n}\n\nexport function filterTruthyValues(values: string[]): string[] {\n return values.filter(\n (v) => v != null && v !== '' && v !== 'null' && v !== 'undefined',\n );\n}\n\n/**\n * Order categorical keys by FuseDash `uniqueValues[fieldKey]`, keeping any\n * extra data keys at the end in first-seen order.\n */\nexport function resolveUniqueValuesOrder(\n dataKeys: Iterable<string>,\n uniqueValues: Record<string, string[]> | null | undefined,\n fieldKey: string | undefined,\n): string[] {\n const dataSet = new Set(dataKeys);\n const fromUv =\n fieldKey && uniqueValues?.[fieldKey]?.length\n ? filterTruthyValues(uniqueValues[fieldKey].map(String))\n : null;\n if (fromUv?.length) {\n const ordered = fromUv.filter((k) => dataSet.has(k));\n for (const k of dataSet) {\n if (!ordered.includes(k)) ordered.push(k);\n }\n return ordered;\n }\n const seen = new Set<string>();\n const out: string[] = [];\n for (const k of dataKeys) {\n if (!seen.has(k)) {\n seen.add(k);\n out.push(k);\n }\n }\n return out;\n}\n\n/** Categorical x-axis order from a FuseDash widget mock. */\nexport function xDomainHintFromWidget(\n widget: FuseWidgetLike,\n): string[] | undefined {\n const xKey = firstField(widget.xAxe ?? undefined);\n if (!xKey || !widget.uniqueValues?.[xKey]?.length) return undefined;\n return filterTruthyValues(widget.uniqueValues[xKey].map(String));\n}\n"],"names":[],"mappings":"AA+BO,SAAS,WACd,OACoB;AACpB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,IAAI,MAAM,CAAC;AACjB,WAAO,KAAK,QAAQ,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,IAAI;AAAA,EACrD;AACA,MAAI,SAAS,QAAQ,UAAU,GAAI,QAAO;AAC1C,SAAO,OAAO,KAAK;AACrB;AAGO,SAAS,oBAAoB,OAAyC;AAC3E,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,IAAI;AACV,SAAO,MAAM,QAAQ,EAAE,IAAI;AAC7B;AAMO,SAAS,kBAAkB,QAA4C;AAC5E,QAAM,YAAY,WAAW,OAAO,WAAW,MAAS;AACxD,MAAI,UAAW,QAAO;AACtB,QAAM,OAAO,OAAO,eAAe,OAAO,KAAK,OAAO,YAAY,IAAI,CAAA;AACtE,SAAO,KAAK,CAAC;AACf;AAEO,SAAS,OAAO,QAAmD;AACxE,MAAI,CAAC,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAA;AACxC,SAAO,OAAO,KAAK;AAAA,IACjB,CAAC,MAAoC,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAAA,EAAA;AAEzF;AAEO,SAAS,mBAAmB,QAA4B;AAC7D,SAAO,OAAO;AAAA,IACZ,CAAC,MAAM,KAAK,QAAQ,MAAM,MAAM,MAAM,UAAU,MAAM;AAAA,EAAA;AAE1D;AAMO,SAAS,yBACd,UACA,cACA,UACU;AAlDL;AAmDL,QAAM,UAAU,IAAI,IAAI,QAAQ;AAChC,QAAM,SACJ,cAAY,kDAAe,cAAf,mBAA0B,UAClC,mBAAmB,aAAa,QAAQ,EAAE,IAAI,MAAM,CAAC,IACrD;AACN,MAAI,iCAAQ,QAAQ;AAClB,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,QAAQ,IAAI,CAAC,CAAC;AACnD,eAAW,KAAK,SAAS;AACvB,UAAI,CAAC,QAAQ,SAAS,CAAC,EAAG,SAAQ,KAAK,CAAC;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AACA,QAAM,2BAAW,IAAA;AACjB,QAAM,MAAgB,CAAA;AACtB,aAAW,KAAK,UAAU;AACxB,QAAI,CAAC,KAAK,IAAI,CAAC,GAAG;AAChB,WAAK,IAAI,CAAC;AACV,UAAI,KAAK,CAAC;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,sBACd,QACsB;AA7EjB;AA8EL,QAAM,OAAO,WAAW,OAAO,QAAQ,MAAS;AAChD,MAAI,CAAC,QAAQ,GAAC,kBAAO,iBAAP,mBAAsB,UAAtB,mBAA6B,QAAQ,QAAO;AAC1D,SAAO,mBAAmB,OAAO,aAAa,IAAI,EAAE,IAAI,MAAM,CAAC;AACjE;"}
@@ -49,6 +49,33 @@ export declare const FD: {
49
49
  readonly bottom: 21;
50
50
  readonly left: 80;
51
51
  };
52
+ /** Client MatrixChart DEFAULT_MARGIN */
53
+ readonly matrixMargin: {
54
+ readonly top: 20;
55
+ readonly right: 0;
56
+ readonly bottom: 30;
57
+ readonly left: 80;
58
+ };
59
+ /** MatrixChart cell gutter + corner (client `rectPadding`) */
60
+ readonly matrixCellPadding: 3;
61
+ readonly matrixCellRadius: 2;
62
+ /** Rows never shrink below this — the plot scrolls instead */
63
+ readonly matrixMinCellHeight: 16;
64
+ /** Top header: font + tick + label spacing reserve (client `topAxisHeight`) */
65
+ readonly matrixTopTickLength: 8;
66
+ readonly matrixTopLabelsSpacing: 12;
67
+ /** Above this many rows the top axis is pinned and the rows scroll */
68
+ readonly matrixSeparateAxisRowLimit: 7;
69
+ /** Negative cells are flat grey; zero / missing cells get the hatch pattern */
70
+ readonly matrixNegativeFill: "#DADAE1";
71
+ readonly matrixNoDataLight: "#f0f1f2";
72
+ readonly matrixNoDataDark: "#33373d";
73
+ readonly matrixNoDataStripeLight: "#ffffff";
74
+ readonly matrixNoDataStripeDark: "#000000";
75
+ /** Client AxisLeft `TickLabel length={9}` */
76
+ readonly matrixYLabelMaxChars: 9;
77
+ /** Client `MAX_LABEL_LENGTH` for the top header labels */
78
+ readonly matrixTopLabelMaxChars: 25;
52
79
  readonly stepLineMargin: {
53
80
  readonly top: 10;
54
81
  readonly right: 1;
@@ -184,20 +211,6 @@ export declare const FD: {
184
211
  readonly barLabelGutter: 28;
185
212
  readonly barLabelGutterMin: 56;
186
213
  readonly barLabelGutterMax: 180;
187
- /** DonutGroupChart — a row of gauges, each with a KPI block in the hole */
188
- readonly donutMargin: {
189
- readonly top: 10;
190
- readonly right: 8;
191
- readonly bottom: 10;
192
- readonly left: 8;
193
- };
194
- /** FuseDash uses a flat 16px band; it is capped at half the radius here */
195
- readonly donutThickness: 16;
196
- readonly donutMinThickness: 4;
197
- readonly donutCellPadding: 6;
198
- readonly donutMinCellWidth: 140;
199
- /** Gauges assume a 0–100 scale when the row carries no `maximalValue` */
200
- readonly donutDefaultMax: 100;
201
214
  /** Resting / dimmed / hovered arc opacity (FuseDash settles on 0.8) */
202
215
  readonly donutArcOpacity: 0.8;
203
216
  readonly donutArcOpacityDimmed: 0.2;
@@ -334,45 +347,45 @@ export declare const FD: {
334
347
  readonly donutSliceStroke: "#ffffff";
335
348
  readonly donutSliceStrokeDark: "#1a1b1f";
336
349
  readonly donutSliceStrokeWidth: 2;
337
- /** Unfilled part of a gauge — the neutral background FuseDash falls back to */
338
- readonly donutTrackFill: "#EAECF0";
339
- readonly donutTrackFillDark: "#2C2D33";
340
- /** Divider between donuts (FuseDash `border-left: neutralBorderWeakest`) */
341
- readonly donutDivider: "#E4E6EA";
342
- readonly donutDividerDark: "#2C2D33";
343
- /** KPI block in the hole: 30/12/12px, sized down with the ring */
344
- readonly donutValueSize: 30;
345
- readonly donutValueWeight: 600;
346
- readonly donutBadgeSize: 12;
347
- readonly donutLabelSize: 12;
348
- readonly donutStatusColors: {
349
- readonly positive: {
350
- readonly background: "#E6F6EF";
351
- readonly text: "#067647";
352
- };
353
- readonly negative: {
354
- readonly background: "#FEE4E2";
355
- readonly text: "#B42318";
356
- };
357
- readonly neutral: {
358
- readonly background: "#F2F4F7";
359
- readonly text: "#475467";
360
- };
361
- };
362
- readonly donutStatusColorsDark: {
363
- readonly positive: {
364
- readonly background: "#0C2C21";
365
- readonly text: "#4ED8A6";
366
- };
367
- readonly negative: {
368
- readonly background: "#3B1513";
369
- readonly text: "#F5817A";
370
- };
371
- readonly neutral: {
372
- readonly background: "#2C2D33";
373
- readonly text: "#C3C7CE";
374
- };
350
+ /** Treemap — d3 `treemapBinary` tiles, no axes so the plot fills the body */
351
+ readonly treemapMargin: {
352
+ readonly top: 0;
353
+ readonly right: 0;
354
+ readonly bottom: 0;
355
+ readonly left: 0;
375
356
  };
357
+ readonly treemapPaddingInner: 2;
358
+ readonly treemapTileRadius: 6;
359
+ /** Tile fill fades from the band color to 80% alpha at the bottom edge */
360
+ readonly treemapGradientBottomOpacity: 0.8;
361
+ /** White scanlines every 5px, fading out toward the bottom of the tile */
362
+ readonly treemapStripeColor: "#FFFFFF";
363
+ readonly treemapStripeSpacing: 5;
364
+ readonly treemapStripeOpacity: 0.14;
365
+ readonly treemapStripeFalloff: 0.8;
366
+ /** Client `hasLightColor` label colors */
367
+ readonly treemapLabelOnLight: "#0B101A";
368
+ readonly treemapLabelOnDark: "#FFFFFF";
369
+ readonly treemapLabelPadding: 4;
370
+ readonly treemapLabelSize: 14;
371
+ readonly treemapValueSize: 12;
372
+ /** A tile only gets a name below this, and a value below `MinValueHeight` */
373
+ readonly treemapMinLabelWidth: 40;
374
+ readonly treemapMinLabelHeight: 20;
375
+ readonly treemapMinValueHeight: 30;
376
+ /** Grouped mode: one card per group in the client's grid-template-areas */
377
+ readonly treemapCardGap: 8;
378
+ readonly treemapCardRadius: 8;
379
+ readonly treemapCardPadding: 8;
380
+ readonly treemapGroupsMarginTop: 10;
381
+ /** Rows in the >5 group fallback list, which scrolls instead of squeezing */
382
+ readonly treemapCardMinHeight: 140;
383
+ /** Sibling tiles fade while one is hovered (chat-only affordance) */
384
+ readonly treemapDimOpacity: 0.4;
385
+ /** `getTreemapRangeColors`: 7 shades from +55% white to -35% black */
386
+ readonly treemapRangeSteps: 7;
387
+ readonly treemapRangeMinShift: 0.55;
388
+ readonly treemapRangeMaxShift: -0.35;
376
389
  /** Sankey: layout extent inset, node gap, and the two node-rule colors */
377
390
  readonly sankeyPadding: 4.5;
378
391
  readonly sankeyNodePadding: 14;
@@ -1 +1 @@
1
- {"version":3,"file":"fusedash-visual.d.ts","sourceRoot":"","sources":["../../src/utils/fusedash-visual.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fusedash-visual.d.ts","sourceRoot":"","sources":["../../src/utils/fusedash-visual.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,28 @@ const FD = {
40
40
  radarTickLabelFill: "#f1f4f7",
41
41
  /** Client PunchcardChart DEFAULT_MARGIN */
42
42
  punchcardMargin: { top: 0, right: 0, bottom: 21, left: 80 },
43
+ /** Client MatrixChart DEFAULT_MARGIN */
44
+ matrixMargin: { top: 20, right: 0, bottom: 30, left: 80 },
45
+ /** MatrixChart cell gutter + corner (client `rectPadding`) */
46
+ matrixCellPadding: 3,
47
+ matrixCellRadius: 2,
48
+ /** Rows never shrink below this — the plot scrolls instead */
49
+ matrixMinCellHeight: 16,
50
+ /** Top header: font + tick + label spacing reserve (client `topAxisHeight`) */
51
+ matrixTopTickLength: 8,
52
+ matrixTopLabelsSpacing: 12,
53
+ /** Above this many rows the top axis is pinned and the rows scroll */
54
+ matrixSeparateAxisRowLimit: 7,
55
+ /** Negative cells are flat grey; zero / missing cells get the hatch pattern */
56
+ matrixNegativeFill: "#DADAE1",
57
+ matrixNoDataLight: "#f0f1f2",
58
+ matrixNoDataDark: "#33373d",
59
+ matrixNoDataStripeLight: "#ffffff",
60
+ matrixNoDataStripeDark: "#000000",
61
+ /** Client AxisLeft `TickLabel length={9}` */
62
+ matrixYLabelMaxChars: 9,
63
+ /** Client `MAX_LABEL_LENGTH` for the top header labels */
64
+ matrixTopLabelMaxChars: 25,
43
65
  stepLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },
44
66
  /** SparkLineChart — same frame as StepLineChart */
45
67
  sparkLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },
@@ -120,15 +142,6 @@ const FD = {
120
142
  /** Hovered category column: animated dot pattern + solid guide */
121
143
  barHoverDotFill: "#CFD2D6",
122
144
  barHoverGuideWidth: 2,
123
- /** DonutGroupChart — a row of gauges, each with a KPI block in the hole */
124
- donutMargin: { top: 10, right: 8, bottom: 10, left: 8 },
125
- /** FuseDash uses a flat 16px band; it is capped at half the radius here */
126
- donutThickness: 16,
127
- donutMinThickness: 4,
128
- donutCellPadding: 6,
129
- donutMinCellWidth: 140,
130
- /** Gauges assume a 0–100 scale when the row carries no `maximalValue` */
131
- donutDefaultMax: 100,
132
145
  /** Resting / dimmed / hovered arc opacity (FuseDash settles on 0.8) */
133
146
  donutArcOpacity: 0.8,
134
147
  donutArcOpacityDimmed: 0.2,
@@ -230,26 +243,32 @@ const FD = {
230
243
  donutSliceStroke: "#ffffff",
231
244
  donutSliceStrokeDark: "#1a1b1f",
232
245
  donutSliceStrokeWidth: 2,
233
- /** Unfilled part of a gauge — the neutral background FuseDash falls back to */
234
- donutTrackFill: "#EAECF0",
235
- donutTrackFillDark: "#2C2D33",
236
- /** Divider between donuts (FuseDash `border-left: neutralBorderWeakest`) */
237
- donutDivider: "#E4E6EA",
238
- donutDividerDark: "#2C2D33",
239
- /** KPI block in the hole: 30/12/12px, sized down with the ring */
240
- donutValueSize: 30,
241
- donutValueWeight: 600,
242
- donutLabelSize: 12,
243
- donutStatusColors: {
244
- positive: { background: "#E6F6EF", text: "#067647" },
245
- negative: { background: "#FEE4E2", text: "#B42318" },
246
- neutral: { background: "#F2F4F7", text: "#475467" }
247
- },
248
- donutStatusColorsDark: {
249
- positive: { background: "#0C2C21", text: "#4ED8A6" },
250
- negative: { background: "#3B1513", text: "#F5817A" },
251
- neutral: { background: "#2C2D33", text: "#C3C7CE" }
252
- },
246
+ /** Treemap — d3 `treemapBinary` tiles, no axes so the plot fills the body */
247
+ treemapMargin: { top: 0, right: 0, bottom: 0, left: 0 },
248
+ treemapPaddingInner: 2,
249
+ treemapTileRadius: 6,
250
+ /** Tile fill fades from the band color to 80% alpha at the bottom edge */
251
+ treemapGradientBottomOpacity: 0.8,
252
+ /** White scanlines every 5px, fading out toward the bottom of the tile */
253
+ treemapStripeColor: "#FFFFFF",
254
+ treemapStripeSpacing: 5,
255
+ treemapStripeOpacity: 0.14,
256
+ treemapStripeFalloff: 0.8,
257
+ /** Client `hasLightColor` label colors */
258
+ treemapLabelOnLight: "#0B101A",
259
+ treemapLabelOnDark: "#FFFFFF",
260
+ /** A tile only gets a name below this, and a value below `MinValueHeight` */
261
+ treemapMinLabelWidth: 40,
262
+ treemapMinLabelHeight: 20,
263
+ treemapMinValueHeight: 30,
264
+ /** Rows in the >5 group fallback list, which scrolls instead of squeezing */
265
+ treemapCardMinHeight: 140,
266
+ /** Sibling tiles fade while one is hovered (chat-only affordance) */
267
+ treemapDimOpacity: 0.4,
268
+ /** `getTreemapRangeColors`: 7 shades from +55% white to -35% black */
269
+ treemapRangeSteps: 7,
270
+ treemapRangeMinShift: 0.55,
271
+ treemapRangeMaxShift: -0.35,
253
272
  /** Sankey: layout extent inset, node gap, and the two node-rule colors */
254
273
  sankeyPadding: 4.5,
255
274
  sankeyNodePadding: 14,
@@ -1 +1 @@
1
- {"version":3,"file":"fusedash-visual.js","sources":["../../src/utils/fusedash-visual.ts"],"sourcesContent":["import type { Selection } from 'd3-selection';\n\n/** FuseDash Widgets visual tokens — keep charts looking 1:1 with client. */\n\nexport const FD = {\n gridStroke: '#afb3bb',\n gridDash: '1 2',\n axisLabelFill: '#6c7584',\n axisLabelSize: 11,\n axisStroke: '#afb3bb',\n hoverGuideLight: '#6c7584',\n hoverGuideDark: '#ffffff',\n /**\n * Qualitative12Colors.default — used when series count unknown.\n * Prefer `resolveFormattingColor` / `pickQualitativePalette` for FuseDash widgets.\n */\n series: [\n '#473DD9',\n '#938CFF',\n '#36C4A5',\n '#ADF4E5',\n '#BDBCC8',\n '#56546D',\n '#FF8C47',\n '#FFCEB0',\n '#FF4781',\n '#FFB0C9',\n '#47B0FF',\n '#B0DDFF',\n ],\n lineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n lollipopMargin: { top: 10, right: 3, bottom: 21, left: 40 },\n /** FuseDash RadarChart (useNewDesign) frame */\n radarMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n radarScaleSteps: 5,\n radarDomainPadFactor: 1.1,\n radarMarkerSize: 50,\n radarMarkerHoverSize: 70,\n radarSpokeDash: '2,2',\n radarCapRadius: 3,\n radarLabelOffset: 12,\n radarGradientEdgeOpacity: 0.3,\n radarStrokeWidth: 2,\n radarTickLabelFill: '#f1f4f7',\n /** Client PunchcardChart DEFAULT_MARGIN */\n punchcardMargin: { top: 0, right: 0, bottom: 21, left: 80 },\n stepLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n /** SparkLineChart — same frame as StepLineChart */\n sparkLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n sparkLineStrokeWidth: 1.5,\n sparkDomainPadFactor: 1.2,\n sparkGuideDash: '5,2',\n sparkHoverDotRadius: 4,\n boxPlotMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n histogramMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n /** Client VerticalWaterfallChart margin */\n waterfallVerticalMargin: { top: 10, right: 0, bottom: 21, left: 40 },\n /** Client HorizontalWaterfallChart base margin (left is sized from labels) */\n waterfallHorizontalMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n waterfallBarThickness: 16,\n waterfallBarRadius: 2,\n waterfallArrow: 5,\n waterfallDomainPadFactor: 1.2,\n /** Client hard-coded fills (formatting keys are ignored for paint) */\n waterfallPositive: '#938CFF',\n waterfallNegative: '#FF8C47',\n waterfallTotal: '#BDBCC8',\n waterfallHoverDim: 0.2,\n waterfallMinBand: 32,\n /** Client VerticalViolinChart DEFAULT_MARGIN */\n violinVerticalMargin: { top: 10, right: 16, bottom: 28, left: 44 },\n /** Client HorizontalViolinChart DEFAULT_MARGIN */\n violinHorizontalMargin: { top: 10, right: 24, bottom: 28, left: 44 },\n /** Client Horizontal/Vertical BoxPlot */\n boxPlotDomainPadFactor: 1.1,\n boxPlotBorderRadius: 2,\n lineStrokeWidth: 2,\n lineStrokeAlphaPct: 80,\n /** FuseDash AreaChart linearGradient stops (new design) */\n areaGradientTopOpacity: 0.6,\n areaGradientBottomOpacity: 0.1,\n lollipopStemWidth: 3,\n lollipopStemAlphaPct: 50,\n markerRadius: 4,\n /** StepLineChart: plain stroke, no alpha / glow / markers */\n stepStrokeWidth: 1.5,\n /** StepLineChart y-domain is padded by 1.2x before `.nice()` */\n stepDomainPadFactor: 1.2,\n /** KS-plot \"Ideal\" overlay */\n stepIdealColor: '#2ecc71',\n stepIdealWidth: 3,\n /** ROC \"Random guessing\" diagonal */\n stepGuessWidth: 2,\n stepGuessDash: '5,5',\n /** Max-deviation marker (KS distance) */\n stepDeviationFill: '#2c2d33',\n /** Tooltip crosshair on the step chart */\n stepGuideDash: '5,2',\n stepHoverDotRadius: 4,\n /** Barchart — shared frame + bar geometry (all six FuseDash variants) */\n barMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n barCornerRadius: 4,\n /** Bar fill is a gradient from the series color to a faded stop */\n barFadeOpacity: 0.6,\n barFadeOpacityHovered: 0.7,\n /** Vertical single-series: bandwidth * 0.4, capped, with a visible floor */\n barBandFraction: 0.4,\n barMaxWidth: 40,\n barMinHeight: 6,\n /** Vertical grouped: floor(clamp(plotWidth / categories / series)) + 1px gap */\n barGroupMinWidth: 4,\n barGroupMaxWidth: 24,\n barGroupGap: 1,\n /** Vertical stacked: bandwidth * 0.85, same clamp as grouped */\n barStackedBandFraction: 0.85,\n /** Horizontal: fixed row thickness, gutter, and a floor for tiny values */\n barRowThickness: 24,\n barRowSpacing: 16,\n barMinWidth: 6,\n /** Y (vertical) / X (horizontal) domain headroom */\n barDomainPadFactor: 1.2,\n barHorizontalPadFactor: 1.1,\n /** Stacked totals get a flat 10% pad instead */\n barStackedPadFraction: 0.1,\n /** Cumulative overlay line (FuseDash `cumulativeLine`) */\n barCumulativeColor: '#6d6df7',\n barCumulativeWidth: 2,\n barCumulativeDotRadius: 3,\n /** Hovered category column: animated dot pattern + solid guide */\n barHoverDotFill: '#CFD2D6',\n barHoverGuideWidth: 2,\n /** Client `calculatedLeftMargin` (unused in chat — shared LEFT_GUTTER_MARGIN) */\n barLabelCharWidth: 5,\n barLabelGutter: 28,\n barLabelGutterMin: 56,\n barLabelGutterMax: 180,\n /** DonutGroupChart — a row of gauges, each with a KPI block in the hole */\n donutMargin: { top: 10, right: 8, bottom: 10, left: 8 },\n /** FuseDash uses a flat 16px band; it is capped at half the radius here */\n donutThickness: 16,\n donutMinThickness: 4,\n donutCellPadding: 6,\n donutMinCellWidth: 140,\n /** Gauges assume a 0–100 scale when the row carries no `maximalValue` */\n donutDefaultMax: 100,\n /** Resting / dimmed / hovered arc opacity (FuseDash settles on 0.8) */\n donutArcOpacity: 0.8,\n donutArcOpacityDimmed: 0.2,\n /** PieChart — FuseDash uses zero margin; pie is a square inscribed in the body */\n pieMargin: { top: 0, right: 0, bottom: 0, left: 0 },\n pieMinArcLengthPx: 5,\n /** PolarAreaChart — FuseDash margin around the centred disc */\n polarAreaMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n /** Concentric grid rings; opacity ramps 0.2 → 1.0 outward */\n polarRadialSteps: 5,\n polarGridStroke: '#939ba7',\n polarGridStepOpacity: 0.2,\n /** Dashed spoke from the centre to each category boundary, with a round cap */\n polarSpokeDash: '2,2',\n polarSpokeCapRadius: 3,\n /** Category labels sit just outside the outermost ring */\n polarCategoryLabelFill: '#5f6877',\n polarCategoryLabelSize: 12,\n polarCategoryLabelOffset: 12,\n /** Side room reserved for those labels, measured off the longest one */\n polarLabelCharWidth: 0.55,\n polarLabelGutterMin: 40,\n polarLabelGutterMax: 120,\n polarLabelGutterMaxFraction: 0.28,\n /** Below this radius the label ring collides with itself — drop it */\n polarMinLabelRadius: 40,\n /** Sectors: 0.8 at rest, siblings drop to 0.2 on hover */\n polarSectorOpacity: 0.8,\n polarSectorOpacityDimmed: 0.2,\n /** Radial tick pills are hidden when the disc is too short to fit them */\n polarTickPillRowHeight: 21,\n polarTickPillPadX: 7,\n polarTickPillPadY: 3,\n polarTickPillRadius: 4,\n polarTickPill: '#ffffff',\n polarTickPillDark: '#1a1b1f',\n /** RadialBarChart — client margin; the plot is a circle inscribed in the body */\n radialBarMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n /** Hole is 20% of the outer radius; rings sweep 270° clockwise from 12 o'clock */\n radialBarInnerRadiusRatio: 0.2,\n radialBarSweepDeg: 270,\n radialBarTicks: 5,\n /** Ring thickness clamp around `((outer - inner - rings) / rings) * 0.5` */\n radialBarMinArcWidth: 4,\n radialBarMaxArcWidth: 24,\n radialBarArcCornerRadius: 1,\n /** Resting / dimmed arc opacity */\n radialBarArcOpacity: 0.8,\n radialBarArcOpacityDimmed: 0.2,\n /** Client draws the rings and the radial axes in one darker grey */\n radialBarGridStroke: '#939ba7',\n radialBarTickDash: '4,4',\n radialBarLabelFill: '#5f6877',\n radialBarTickLabelSize: 12,\n radialBarRingLabelSize: 11,\n /** Value labels sit 12px outside the outer ring */\n radialBarTickLabelOffset: 12,\n /** Ring labels are cut at `(outer - inner) / 8` characters */\n radialBarLabelCharWidth: 8,\n /** ScatterPlot — FuseDash DEFAULT_MARGIN */\n scatterMargin: { top: 10, right: 5, bottom: 21, left: 40 },\n /** AreaGroupedBarChart — client DEFAULT_MARGIN */\n areaGroupedBarMargin: { top: 10, right: 5, bottom: 21, left: 40 },\n /** Area fill under the line (client stopOpacity 0.35 → 0) */\n areaGroupedBarGradientTopOpacity: 0.35,\n areaGroupedBarGradientBottomOpacity: 0,\n areaGroupedBarMarkerRadius: 3,\n areaGroupedBarDimOpacity: 0.3,\n areaGroupedBarBarOpacity: 0.85,\n /** BubbleChart — BASE_MARGIN + MAX_BUBBLE_RADIUS/2 inset on top/right */\n bubbleBaseMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n bubbleMaxRadius: 30,\n bubbleNegativeFill: '#DADAE1',\n scatterMarkerSize: 40,\n scatterReferenceLine: '#56546D',\n /** BiasVarianceTradeoffChart — the client widget carries its own frame/palette */\n biasVarianceMargin: { top: 24, right: 24, bottom: 36, left: 48 },\n biasVarianceSeries: ['#6366f1', '#22c55e', '#f59e0b', '#06b6d4', '#ef4444'],\n biasVarianceGridStroke: '#d1d5db',\n biasVarianceGridDash: '2,4',\n biasVarianceAxisStroke: '#9ca3af',\n biasVarianceLabelFill: '#6b7280',\n biasVarianceLineWidth: 2,\n biasVarianceLineOpacity: 0.95,\n /** Sibling curves fade while one is hovered (FuseDash line-hover convention) */\n biasVarianceLineOpacityDimmed: 0.2,\n /** Y domain is `[0, max * 1.1]` before `.nice()` */\n biasVarianceDomainPadFactor: 1.1,\n biasVarianceXTicks: 8,\n biasVarianceYTicks: 6,\n /** Shared `DomainsLimits` overlay (reference lines / bands) */\n domainLimitColor: '#6C8CF5',\n domainLimitFillOpacity: 0.12,\n domainLimitDash: '4,4',\n domainLimitArrow: 8,\n domainLimitLabelFill: '#141c2ce6',\n domainLimitLabelText: '#ffffff',\n domainLimitLabelSize: 10,\n donutSliceStroke: '#ffffff',\n donutSliceStrokeDark: '#1a1b1f',\n donutSliceStrokeWidth: 2,\n /** Unfilled part of a gauge — the neutral background FuseDash falls back to */\n donutTrackFill: '#EAECF0',\n donutTrackFillDark: '#2C2D33',\n /** Divider between donuts (FuseDash `border-left: neutralBorderWeakest`) */\n donutDivider: '#E4E6EA',\n donutDividerDark: '#2C2D33',\n /** KPI block in the hole: 30/12/12px, sized down with the ring */\n donutValueSize: 30,\n donutValueWeight: 600,\n donutBadgeSize: 12,\n donutLabelSize: 12,\n donutStatusColors: {\n positive: { background: '#E6F6EF', text: '#067647' },\n negative: { background: '#FEE4E2', text: '#B42318' },\n neutral: { background: '#F2F4F7', text: '#475467' },\n },\n donutStatusColorsDark: {\n positive: { background: '#0C2C21', text: '#4ED8A6' },\n negative: { background: '#3B1513', text: '#F5817A' },\n neutral: { background: '#2C2D33', text: '#C3C7CE' },\n },\n /** Sankey: layout extent inset, node gap, and the two node-rule colors */\n sankeyPadding: 4.5,\n sankeyNodePadding: 14,\n sankeyNodeWidth: 70,\n sankeyNodeWidthSmall: 65,\n sankeyNodeRule: '#D3DBE3',\n sankeyNodeRuleActive: '#939BA7',\n /** Ribbons sit at 50% alpha until hovered or focused */\n sankeyLinkAlphaPct: 50,\n sankeyLinkInset: 3,\n sankeyDimOpacity: 0.5,\n /** ParallelCoordinates — client Horizontal/Vertical frames */\n parallelMargin: { top: 10, right: 1, bottom: 8, left: 1 },\n parallelVerticalMargin: { top: 10, right: 1, bottom: 1, left: 1 },\n /** Horizontal: one 72px band per dimension, so the plot scrolls past ~5 axes */\n parallelAxisSpacing: 72,\n /** Vertical: gutter kept free under the axes for the bottom tick row */\n parallelColorScaleHeight: 44,\n /** Right gutter reserved for the colour ramp + its tick labels */\n parallelLegendOffsetRight: 20,\n parallelLegendWidth: 10,\n parallelLegendTickLabelWidth: 44,\n parallelLegendRadius: 6,\n /** Resting / dimmed / hovered polyline stroke */\n parallelLineWidth: 1,\n parallelLineWidthHovered: 5,\n parallelLineOpacity: 0.4,\n parallelLineOpacityDimmed: 0.05,\n /** Client draws these axes a shade darker than the shared FD axis tokens */\n parallelAxisStroke: '#939ba7',\n parallelAxisLabelFill: '#5f6877',\n parallelTitleSize: 11,\n parallelTitleSizeActive: 13,\n /** GiniImpurityEntropyChart — client DEFAULT_MARGIN */\n giniMargin: { top: 20, right: 24, bottom: 28, left: 44 },\n /** Curves are drawn as smooth Catmull-Rom splines with this tension */\n giniCurveAlpha: 0.5,\n /** p-hat guide + confidence-interval band */\n giniOverlayColor: '#4c6ef5',\n giniOverlayBandOpacity: 0.08,\n giniOverlayDash: '5,5',\n /** Split annotation markers on the Gini curve */\n giniSplitMarkerFill: '#12b886',\n giniSplitMarkerStroke: '#ffffff',\n giniSplitMarkerRadius: 4,\n giniSplitLabelOffset: 8,\n /** Hovering one curve fades the others so the read is unambiguous */\n giniCurveDimOpacity: 0.2,\n} as const;\n\n/** SequentialColors1 for the `default` styleId — low → high. */\nexport const FD_SEQUENTIAL = [\n '#D6D3FF',\n '#B5B0FF',\n '#938CFF',\n '#7369FF',\n '#5448FF',\n '#473DD9',\n '#3C33B5',\n] as const;\n\nexport type MarkerShape =\n | 'donut'\n | 'circle'\n | 'square'\n | 'rhombus'\n | 'triangle'\n | 'disabled';\n\n/** Mirrors client `lightenColor` — blend hex toward white (amount 0–1). */\nexport function lightenColor(hex: string, amount: number): string {\n let clean = hex.replace('#', '');\n if (clean.length === 3) {\n clean = clean\n .split('')\n .map((c) => c + c)\n .join('');\n }\n if (!/^[0-9A-Fa-f]{6}$/.test(clean)) return hex;\n const t = Math.max(0, Math.min(1, amount));\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n const lr = Math.round(r + (255 - r) * t);\n const lg = Math.round(g + (255 - g) * t);\n const lb = Math.round(b + (255 - b) * t);\n return `#${lr.toString(16).padStart(2, '0')}${lg.toString(16).padStart(2, '0')}${lb.toString(16).padStart(2, '0')}`;\n}\n\n/** Mirrors client `hexToHexWithAlpha` (opacity 0–100). */\nexport function hexWithAlpha(hex: string, opacityPct: number): string {\n let clean = hex.replace('#', '').toUpperCase();\n if (clean.length === 3) {\n clean = clean\n .split('')\n .map((c) => c + c)\n .join('');\n }\n if (!/^[0-9A-F]{6}$/.test(clean)) return hex;\n const alpha = Math.round((Math.max(0, Math.min(100, opacityPct)) / 100) * 255)\n .toString(16)\n .padStart(2, '0')\n .toUpperCase();\n return `#${clean}${alpha}`;\n}\n\n/** Mirrors client `calculateScaleLinearDomain`. */\nexport function calculateScaleLinearDomain(data: number[]): [number, number] {\n if (!data.length) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (const v of data) {\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0, 1];\n if (min < 0 && max > 0) {\n const absMax = Math.max(Math.abs(min), Math.abs(max));\n return [-absMax, absMax];\n }\n return [Math.min(0, min), Math.max(0, max)];\n}\n\n/** Mirrors client Y-tick formatting. */\nexport function formatCompactNumber(value: number, decimals = 2): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000_000) return `${(value / 1_000_000_000).toFixed(1)}B`;\n if (abs >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${(value / 1_000).toFixed(1)}K`;\n if (Number.isInteger(value) && abs < 1000) return String(value);\n return value.toFixed(decimals);\n}\n\nexport function seriesColor(index: number, override?: string): string {\n if (override) return override;\n return FD.series[index % FD.series.length];\n}\n\n/** Line markers: donut = hollow ring (FuseDash default). */\nexport function markerAppearance(\n shape: MarkerShape,\n color: string,\n themeMode: 'light' | 'dark' = 'light',\n): { fill: string; stroke: string } {\n const outline = themeMode === 'dark' ? '#000' : '#fff';\n if (shape === 'donut' || shape === 'disabled') {\n return { fill: outline, stroke: color };\n }\n return { fill: color, stroke: outline };\n}\n\nexport function appendGlowFilter(\n svg: Selection<SVGSVGElement, unknown, null, undefined>,\n id = 'ui9000-glow',\n): string {\n let defs = svg.select<SVGDefsElement>('defs');\n if (defs.empty()) defs = svg.append('defs');\n if (defs.select(`#${id}`).empty()) {\n const filter = defs\n .append('filter')\n .attr('id', id)\n .attr('x', '-50%')\n .attr('y', '-50%')\n .attr('width', '200%')\n .attr('height', '200%');\n filter.append('feGaussianBlur').attr('stdDeviation', 3).attr('result', 'coloredBlur');\n const merge = filter.append('feMerge');\n merge.append('feMergeNode').attr('in', 'coloredBlur');\n merge.append('feMergeNode').attr('in', 'SourceGraphic');\n }\n return `url(#${id})`;\n}\n\nexport function calculateNumTicks(height: number): number {\n if (height < 120) return 3;\n if (height < 220) return 4;\n if (height < 360) return 5;\n return 6;\n}\n\n/** Append FuseDash-style line/area marker at (cx, cy). */\nexport function appendLineMarker(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: Selection<any, any, any, any>,\n opts: {\n shape: MarkerShape;\n color: string;\n cx: number;\n cy: number;\n r?: number;\n themeMode?: 'light' | 'dark';\n hovered?: boolean;\n },\n): void {\n const {\n shape,\n color,\n cx,\n cy,\n r = FD.markerRadius,\n themeMode = 'light',\n hovered = false,\n } = opts;\n if (shape === 'disabled') return;\n\n const { fill, stroke } = markerAppearance(shape, color, themeMode);\n const strokeWidth = hovered ? 3 : 1;\n\n if (shape === 'square') {\n const size = 7;\n parent\n .append('rect')\n .attr('x', cx - size / 2)\n .attr('y', cy - size / 2)\n .attr('width', size)\n .attr('height', size)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n return;\n }\n\n if (shape === 'rhombus') {\n const size = 9;\n parent\n .append('rect')\n .attr('x', cx - size / 2)\n .attr('y', cy - size / 2)\n .attr('width', size)\n .attr('height', size)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth)\n .attr('transform', `rotate(45, ${cx}, ${cy})`);\n return;\n }\n\n if (shape === 'triangle') {\n const s = 4;\n parent\n .append('polygon')\n .attr(\n 'points',\n `${cx},${cy - s} ${cx - s},${cy + s} ${cx + s},${cy + s}`,\n )\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n return;\n }\n\n parent\n .append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', r)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n}\n\n/**\n * Lollipop head — FuseDash Vertical markers (default = rhombus diamond path).\n */\nexport function appendLollipopMarkerVertical(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: Selection<any, any, any, any>,\n opts: { shape: MarkerShape; color: string; cx: number; cy: number },\n): void {\n const { shape, color, cx, cy } = opts;\n if (shape === 'disabled') return;\n\n if (shape === 'donut') {\n parent\n .append('path')\n .attr(\n 'd',\n `M ${cx}, ${cy - 5} a 5,5 0 1,0 0,10 a 5,5 0 1,0 0,-10 M ${cx}, ${cy - 2} a 2,2 0 1,1 0,4 a 2,2 0 1,1 0,-4`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n parent.append('circle').attr('cx', cx).attr('cy', cy).attr('r', 2).attr('fill', '#fff');\n return;\n }\n\n if (shape === 'circle') {\n parent\n .append('path')\n .attr('d', `M ${cx}, ${cy - 5} a 5,5 0 1,0 0,10 a 5,5 0 1,0 0,-10`)\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n if (shape === 'square') {\n parent\n .append('path')\n .attr(\n 'd',\n `M${cx - 5}, ${cy + 5} L${cx + 5}, ${cy + 5} L${cx + 5}, ${cy - 5} L${cx - 5}, ${cy - 5} Z`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n if (shape === 'triangle') {\n parent\n .append('path')\n .attr('d', `M${cx}, ${cy - 5} L${cx - 5}, ${cy + 5} L${cx + 5}, ${cy + 5} Z`)\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n // default / rhombus\n parent\n .append('path')\n .attr(\n 'd',\n `M${cx}, ${cy + 5} L${cx + 5}, ${cy} L${cx}, ${cy - 5} L${cx - 5}, ${cy}Z`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fusedash-visual.js","sources":["../../src/utils/fusedash-visual.ts"],"sourcesContent":["import type { Selection } from 'd3-selection';\n\n/** FuseDash Widgets visual tokens — keep charts looking 1:1 with client. */\n\nexport const FD = {\n gridStroke: '#afb3bb',\n gridDash: '1 2',\n axisLabelFill: '#6c7584',\n axisLabelSize: 11,\n axisStroke: '#afb3bb',\n hoverGuideLight: '#6c7584',\n hoverGuideDark: '#ffffff',\n /**\n * Qualitative12Colors.default — used when series count unknown.\n * Prefer `resolveFormattingColor` / `pickQualitativePalette` for FuseDash widgets.\n */\n series: [\n '#473DD9',\n '#938CFF',\n '#36C4A5',\n '#ADF4E5',\n '#BDBCC8',\n '#56546D',\n '#FF8C47',\n '#FFCEB0',\n '#FF4781',\n '#FFB0C9',\n '#47B0FF',\n '#B0DDFF',\n ],\n lineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n lollipopMargin: { top: 10, right: 3, bottom: 21, left: 40 },\n /** FuseDash RadarChart (useNewDesign) frame */\n radarMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n radarScaleSteps: 5,\n radarDomainPadFactor: 1.1,\n radarMarkerSize: 50,\n radarMarkerHoverSize: 70,\n radarSpokeDash: '2,2',\n radarCapRadius: 3,\n radarLabelOffset: 12,\n radarGradientEdgeOpacity: 0.3,\n radarStrokeWidth: 2,\n radarTickLabelFill: '#f1f4f7',\n /** Client PunchcardChart DEFAULT_MARGIN */\n punchcardMargin: { top: 0, right: 0, bottom: 21, left: 80 },\n /** Client MatrixChart DEFAULT_MARGIN */\n matrixMargin: { top: 20, right: 0, bottom: 30, left: 80 },\n /** MatrixChart cell gutter + corner (client `rectPadding`) */\n matrixCellPadding: 3,\n matrixCellRadius: 2,\n /** Rows never shrink below this — the plot scrolls instead */\n matrixMinCellHeight: 16,\n /** Top header: font + tick + label spacing reserve (client `topAxisHeight`) */\n matrixTopTickLength: 8,\n matrixTopLabelsSpacing: 12,\n /** Above this many rows the top axis is pinned and the rows scroll */\n matrixSeparateAxisRowLimit: 7,\n /** Negative cells are flat grey; zero / missing cells get the hatch pattern */\n matrixNegativeFill: '#DADAE1',\n matrixNoDataLight: '#f0f1f2',\n matrixNoDataDark: '#33373d',\n matrixNoDataStripeLight: '#ffffff',\n matrixNoDataStripeDark: '#000000',\n /** Client AxisLeft `TickLabel length={9}` */\n matrixYLabelMaxChars: 9,\n /** Client `MAX_LABEL_LENGTH` for the top header labels */\n matrixTopLabelMaxChars: 25,\n stepLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n /** SparkLineChart — same frame as StepLineChart */\n sparkLineMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n sparkLineStrokeWidth: 1.5,\n sparkDomainPadFactor: 1.2,\n sparkGuideDash: '5,2',\n sparkHoverDotRadius: 4,\n boxPlotMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n histogramMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n /** Client VerticalWaterfallChart margin */\n waterfallVerticalMargin: { top: 10, right: 0, bottom: 21, left: 40 },\n /** Client HorizontalWaterfallChart base margin (left is sized from labels) */\n waterfallHorizontalMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n waterfallBarThickness: 16,\n waterfallBarRadius: 2,\n waterfallArrow: 5,\n waterfallDomainPadFactor: 1.2,\n /** Client hard-coded fills (formatting keys are ignored for paint) */\n waterfallPositive: '#938CFF',\n waterfallNegative: '#FF8C47',\n waterfallTotal: '#BDBCC8',\n waterfallHoverDim: 0.2,\n waterfallMinBand: 32,\n /** Client VerticalViolinChart DEFAULT_MARGIN */\n violinVerticalMargin: { top: 10, right: 16, bottom: 28, left: 44 },\n /** Client HorizontalViolinChart DEFAULT_MARGIN */\n violinHorizontalMargin: { top: 10, right: 24, bottom: 28, left: 44 },\n /** Client Horizontal/Vertical BoxPlot */\n boxPlotDomainPadFactor: 1.1,\n boxPlotBorderRadius: 2,\n lineStrokeWidth: 2,\n lineStrokeAlphaPct: 80,\n /** FuseDash AreaChart linearGradient stops (new design) */\n areaGradientTopOpacity: 0.6,\n areaGradientBottomOpacity: 0.1,\n lollipopStemWidth: 3,\n lollipopStemAlphaPct: 50,\n markerRadius: 4,\n /** StepLineChart: plain stroke, no alpha / glow / markers */\n stepStrokeWidth: 1.5,\n /** StepLineChart y-domain is padded by 1.2x before `.nice()` */\n stepDomainPadFactor: 1.2,\n /** KS-plot \"Ideal\" overlay */\n stepIdealColor: '#2ecc71',\n stepIdealWidth: 3,\n /** ROC \"Random guessing\" diagonal */\n stepGuessWidth: 2,\n stepGuessDash: '5,5',\n /** Max-deviation marker (KS distance) */\n stepDeviationFill: '#2c2d33',\n /** Tooltip crosshair on the step chart */\n stepGuideDash: '5,2',\n stepHoverDotRadius: 4,\n /** Barchart — shared frame + bar geometry (all six FuseDash variants) */\n barMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n barCornerRadius: 4,\n /** Bar fill is a gradient from the series color to a faded stop */\n barFadeOpacity: 0.6,\n barFadeOpacityHovered: 0.7,\n /** Vertical single-series: bandwidth * 0.4, capped, with a visible floor */\n barBandFraction: 0.4,\n barMaxWidth: 40,\n barMinHeight: 6,\n /** Vertical grouped: floor(clamp(plotWidth / categories / series)) + 1px gap */\n barGroupMinWidth: 4,\n barGroupMaxWidth: 24,\n barGroupGap: 1,\n /** Vertical stacked: bandwidth * 0.85, same clamp as grouped */\n barStackedBandFraction: 0.85,\n /** Horizontal: fixed row thickness, gutter, and a floor for tiny values */\n barRowThickness: 24,\n barRowSpacing: 16,\n barMinWidth: 6,\n /** Y (vertical) / X (horizontal) domain headroom */\n barDomainPadFactor: 1.2,\n barHorizontalPadFactor: 1.1,\n /** Stacked totals get a flat 10% pad instead */\n barStackedPadFraction: 0.1,\n /** Cumulative overlay line (FuseDash `cumulativeLine`) */\n barCumulativeColor: '#6d6df7',\n barCumulativeWidth: 2,\n barCumulativeDotRadius: 3,\n /** Hovered category column: animated dot pattern + solid guide */\n barHoverDotFill: '#CFD2D6',\n barHoverGuideWidth: 2,\n /** Client `calculatedLeftMargin` (unused in chat — shared LEFT_GUTTER_MARGIN) */\n barLabelCharWidth: 5,\n barLabelGutter: 28,\n barLabelGutterMin: 56,\n barLabelGutterMax: 180,\n /** Resting / dimmed / hovered arc opacity (FuseDash settles on 0.8) */\n donutArcOpacity: 0.8,\n donutArcOpacityDimmed: 0.2,\n /** PieChart — FuseDash uses zero margin; pie is a square inscribed in the body */\n pieMargin: { top: 0, right: 0, bottom: 0, left: 0 },\n pieMinArcLengthPx: 5,\n /** PolarAreaChart — FuseDash margin around the centred disc */\n polarAreaMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n /** Concentric grid rings; opacity ramps 0.2 → 1.0 outward */\n polarRadialSteps: 5,\n polarGridStroke: '#939ba7',\n polarGridStepOpacity: 0.2,\n /** Dashed spoke from the centre to each category boundary, with a round cap */\n polarSpokeDash: '2,2',\n polarSpokeCapRadius: 3,\n /** Category labels sit just outside the outermost ring */\n polarCategoryLabelFill: '#5f6877',\n polarCategoryLabelSize: 12,\n polarCategoryLabelOffset: 12,\n /** Side room reserved for those labels, measured off the longest one */\n polarLabelCharWidth: 0.55,\n polarLabelGutterMin: 40,\n polarLabelGutterMax: 120,\n polarLabelGutterMaxFraction: 0.28,\n /** Below this radius the label ring collides with itself — drop it */\n polarMinLabelRadius: 40,\n /** Sectors: 0.8 at rest, siblings drop to 0.2 on hover */\n polarSectorOpacity: 0.8,\n polarSectorOpacityDimmed: 0.2,\n /** Radial tick pills are hidden when the disc is too short to fit them */\n polarTickPillRowHeight: 21,\n polarTickPillPadX: 7,\n polarTickPillPadY: 3,\n polarTickPillRadius: 4,\n polarTickPill: '#ffffff',\n polarTickPillDark: '#1a1b1f',\n /** RadialBarChart — client margin; the plot is a circle inscribed in the body */\n radialBarMargin: { top: 25, right: 5, bottom: 25, left: 5 },\n /** Hole is 20% of the outer radius; rings sweep 270° clockwise from 12 o'clock */\n radialBarInnerRadiusRatio: 0.2,\n radialBarSweepDeg: 270,\n radialBarTicks: 5,\n /** Ring thickness clamp around `((outer - inner - rings) / rings) * 0.5` */\n radialBarMinArcWidth: 4,\n radialBarMaxArcWidth: 24,\n radialBarArcCornerRadius: 1,\n /** Resting / dimmed arc opacity */\n radialBarArcOpacity: 0.8,\n radialBarArcOpacityDimmed: 0.2,\n /** Client draws the rings and the radial axes in one darker grey */\n radialBarGridStroke: '#939ba7',\n radialBarTickDash: '4,4',\n radialBarLabelFill: '#5f6877',\n radialBarTickLabelSize: 12,\n radialBarRingLabelSize: 11,\n /** Value labels sit 12px outside the outer ring */\n radialBarTickLabelOffset: 12,\n /** Ring labels are cut at `(outer - inner) / 8` characters */\n radialBarLabelCharWidth: 8,\n /** ScatterPlot — FuseDash DEFAULT_MARGIN */\n scatterMargin: { top: 10, right: 5, bottom: 21, left: 40 },\n /** AreaGroupedBarChart — client DEFAULT_MARGIN */\n areaGroupedBarMargin: { top: 10, right: 5, bottom: 21, left: 40 },\n /** Area fill under the line (client stopOpacity 0.35 → 0) */\n areaGroupedBarGradientTopOpacity: 0.35,\n areaGroupedBarGradientBottomOpacity: 0,\n areaGroupedBarMarkerRadius: 3,\n areaGroupedBarDimOpacity: 0.3,\n areaGroupedBarBarOpacity: 0.85,\n /** BubbleChart — BASE_MARGIN + MAX_BUBBLE_RADIUS/2 inset on top/right */\n bubbleBaseMargin: { top: 10, right: 1, bottom: 21, left: 40 },\n bubbleMaxRadius: 30,\n bubbleNegativeFill: '#DADAE1',\n scatterMarkerSize: 40,\n scatterReferenceLine: '#56546D',\n /** BiasVarianceTradeoffChart — the client widget carries its own frame/palette */\n biasVarianceMargin: { top: 24, right: 24, bottom: 36, left: 48 },\n biasVarianceSeries: ['#6366f1', '#22c55e', '#f59e0b', '#06b6d4', '#ef4444'],\n biasVarianceGridStroke: '#d1d5db',\n biasVarianceGridDash: '2,4',\n biasVarianceAxisStroke: '#9ca3af',\n biasVarianceLabelFill: '#6b7280',\n biasVarianceLineWidth: 2,\n biasVarianceLineOpacity: 0.95,\n /** Sibling curves fade while one is hovered (FuseDash line-hover convention) */\n biasVarianceLineOpacityDimmed: 0.2,\n /** Y domain is `[0, max * 1.1]` before `.nice()` */\n biasVarianceDomainPadFactor: 1.1,\n biasVarianceXTicks: 8,\n biasVarianceYTicks: 6,\n /** Shared `DomainsLimits` overlay (reference lines / bands) */\n domainLimitColor: '#6C8CF5',\n domainLimitFillOpacity: 0.12,\n domainLimitDash: '4,4',\n domainLimitArrow: 8,\n domainLimitLabelFill: '#141c2ce6',\n domainLimitLabelText: '#ffffff',\n domainLimitLabelSize: 10,\n donutSliceStroke: '#ffffff',\n donutSliceStrokeDark: '#1a1b1f',\n donutSliceStrokeWidth: 2,\n /** Treemap — d3 `treemapBinary` tiles, no axes so the plot fills the body */\n treemapMargin: { top: 0, right: 0, bottom: 0, left: 0 },\n treemapPaddingInner: 2,\n treemapTileRadius: 6,\n /** Tile fill fades from the band color to 80% alpha at the bottom edge */\n treemapGradientBottomOpacity: 0.8,\n /** White scanlines every 5px, fading out toward the bottom of the tile */\n treemapStripeColor: '#FFFFFF',\n treemapStripeSpacing: 5,\n treemapStripeOpacity: 0.14,\n treemapStripeFalloff: 0.8,\n /** Client `hasLightColor` label colors */\n treemapLabelOnLight: '#0B101A',\n treemapLabelOnDark: '#FFFFFF',\n treemapLabelPadding: 4,\n treemapLabelSize: 14,\n treemapValueSize: 12,\n /** A tile only gets a name below this, and a value below `MinValueHeight` */\n treemapMinLabelWidth: 40,\n treemapMinLabelHeight: 20,\n treemapMinValueHeight: 30,\n /** Grouped mode: one card per group in the client's grid-template-areas */\n treemapCardGap: 8,\n treemapCardRadius: 8,\n treemapCardPadding: 8,\n treemapGroupsMarginTop: 10,\n /** Rows in the >5 group fallback list, which scrolls instead of squeezing */\n treemapCardMinHeight: 140,\n /** Sibling tiles fade while one is hovered (chat-only affordance) */\n treemapDimOpacity: 0.4,\n /** `getTreemapRangeColors`: 7 shades from +55% white to -35% black */\n treemapRangeSteps: 7,\n treemapRangeMinShift: 0.55,\n treemapRangeMaxShift: -0.35,\n /** Sankey: layout extent inset, node gap, and the two node-rule colors */\n sankeyPadding: 4.5,\n sankeyNodePadding: 14,\n sankeyNodeWidth: 70,\n sankeyNodeWidthSmall: 65,\n sankeyNodeRule: '#D3DBE3',\n sankeyNodeRuleActive: '#939BA7',\n /** Ribbons sit at 50% alpha until hovered or focused */\n sankeyLinkAlphaPct: 50,\n sankeyLinkInset: 3,\n sankeyDimOpacity: 0.5,\n /** ParallelCoordinates — client Horizontal/Vertical frames */\n parallelMargin: { top: 10, right: 1, bottom: 8, left: 1 },\n parallelVerticalMargin: { top: 10, right: 1, bottom: 1, left: 1 },\n /** Horizontal: one 72px band per dimension, so the plot scrolls past ~5 axes */\n parallelAxisSpacing: 72,\n /** Vertical: gutter kept free under the axes for the bottom tick row */\n parallelColorScaleHeight: 44,\n /** Right gutter reserved for the colour ramp + its tick labels */\n parallelLegendOffsetRight: 20,\n parallelLegendWidth: 10,\n parallelLegendTickLabelWidth: 44,\n parallelLegendRadius: 6,\n /** Resting / dimmed / hovered polyline stroke */\n parallelLineWidth: 1,\n parallelLineWidthHovered: 5,\n parallelLineOpacity: 0.4,\n parallelLineOpacityDimmed: 0.05,\n /** Client draws these axes a shade darker than the shared FD axis tokens */\n parallelAxisStroke: '#939ba7',\n parallelAxisLabelFill: '#5f6877',\n parallelTitleSize: 11,\n parallelTitleSizeActive: 13,\n /** GiniImpurityEntropyChart — client DEFAULT_MARGIN */\n giniMargin: { top: 20, right: 24, bottom: 28, left: 44 },\n /** Curves are drawn as smooth Catmull-Rom splines with this tension */\n giniCurveAlpha: 0.5,\n /** p-hat guide + confidence-interval band */\n giniOverlayColor: '#4c6ef5',\n giniOverlayBandOpacity: 0.08,\n giniOverlayDash: '5,5',\n /** Split annotation markers on the Gini curve */\n giniSplitMarkerFill: '#12b886',\n giniSplitMarkerStroke: '#ffffff',\n giniSplitMarkerRadius: 4,\n giniSplitLabelOffset: 8,\n /** Hovering one curve fades the others so the read is unambiguous */\n giniCurveDimOpacity: 0.2,\n} as const;\n\n/** SequentialColors1 for the `default` styleId — low → high. */\nexport const FD_SEQUENTIAL = [\n '#D6D3FF',\n '#B5B0FF',\n '#938CFF',\n '#7369FF',\n '#5448FF',\n '#473DD9',\n '#3C33B5',\n] as const;\n\nexport type MarkerShape =\n | 'donut'\n | 'circle'\n | 'square'\n | 'rhombus'\n | 'triangle'\n | 'disabled';\n\n/** Mirrors client `lightenColor` — blend hex toward white (amount 0–1). */\nexport function lightenColor(hex: string, amount: number): string {\n let clean = hex.replace('#', '');\n if (clean.length === 3) {\n clean = clean\n .split('')\n .map((c) => c + c)\n .join('');\n }\n if (!/^[0-9A-Fa-f]{6}$/.test(clean)) return hex;\n const t = Math.max(0, Math.min(1, amount));\n const r = parseInt(clean.slice(0, 2), 16);\n const g = parseInt(clean.slice(2, 4), 16);\n const b = parseInt(clean.slice(4, 6), 16);\n const lr = Math.round(r + (255 - r) * t);\n const lg = Math.round(g + (255 - g) * t);\n const lb = Math.round(b + (255 - b) * t);\n return `#${lr.toString(16).padStart(2, '0')}${lg.toString(16).padStart(2, '0')}${lb.toString(16).padStart(2, '0')}`;\n}\n\n/** Mirrors client `hexToHexWithAlpha` (opacity 0–100). */\nexport function hexWithAlpha(hex: string, opacityPct: number): string {\n let clean = hex.replace('#', '').toUpperCase();\n if (clean.length === 3) {\n clean = clean\n .split('')\n .map((c) => c + c)\n .join('');\n }\n if (!/^[0-9A-F]{6}$/.test(clean)) return hex;\n const alpha = Math.round((Math.max(0, Math.min(100, opacityPct)) / 100) * 255)\n .toString(16)\n .padStart(2, '0')\n .toUpperCase();\n return `#${clean}${alpha}`;\n}\n\n/** Mirrors client `calculateScaleLinearDomain`. */\nexport function calculateScaleLinearDomain(data: number[]): [number, number] {\n if (!data.length) return [0, 1];\n let min = Infinity;\n let max = -Infinity;\n for (const v of data) {\n if (!Number.isFinite(v)) continue;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0, 1];\n if (min < 0 && max > 0) {\n const absMax = Math.max(Math.abs(min), Math.abs(max));\n return [-absMax, absMax];\n }\n return [Math.min(0, min), Math.max(0, max)];\n}\n\n/** Mirrors client Y-tick formatting. */\nexport function formatCompactNumber(value: number, decimals = 2): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000_000) return `${(value / 1_000_000_000).toFixed(1)}B`;\n if (abs >= 1_000_000) return `${(value / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${(value / 1_000).toFixed(1)}K`;\n if (Number.isInteger(value) && abs < 1000) return String(value);\n return value.toFixed(decimals);\n}\n\nexport function seriesColor(index: number, override?: string): string {\n if (override) return override;\n return FD.series[index % FD.series.length];\n}\n\n/** Line markers: donut = hollow ring (FuseDash default). */\nexport function markerAppearance(\n shape: MarkerShape,\n color: string,\n themeMode: 'light' | 'dark' = 'light',\n): { fill: string; stroke: string } {\n const outline = themeMode === 'dark' ? '#000' : '#fff';\n if (shape === 'donut' || shape === 'disabled') {\n return { fill: outline, stroke: color };\n }\n return { fill: color, stroke: outline };\n}\n\nexport function appendGlowFilter(\n svg: Selection<SVGSVGElement, unknown, null, undefined>,\n id = 'ui9000-glow',\n): string {\n let defs = svg.select<SVGDefsElement>('defs');\n if (defs.empty()) defs = svg.append('defs');\n if (defs.select(`#${id}`).empty()) {\n const filter = defs\n .append('filter')\n .attr('id', id)\n .attr('x', '-50%')\n .attr('y', '-50%')\n .attr('width', '200%')\n .attr('height', '200%');\n filter.append('feGaussianBlur').attr('stdDeviation', 3).attr('result', 'coloredBlur');\n const merge = filter.append('feMerge');\n merge.append('feMergeNode').attr('in', 'coloredBlur');\n merge.append('feMergeNode').attr('in', 'SourceGraphic');\n }\n return `url(#${id})`;\n}\n\nexport function calculateNumTicks(height: number): number {\n if (height < 120) return 3;\n if (height < 220) return 4;\n if (height < 360) return 5;\n return 6;\n}\n\n/** Append FuseDash-style line/area marker at (cx, cy). */\nexport function appendLineMarker(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: Selection<any, any, any, any>,\n opts: {\n shape: MarkerShape;\n color: string;\n cx: number;\n cy: number;\n r?: number;\n themeMode?: 'light' | 'dark';\n hovered?: boolean;\n },\n): void {\n const {\n shape,\n color,\n cx,\n cy,\n r = FD.markerRadius,\n themeMode = 'light',\n hovered = false,\n } = opts;\n if (shape === 'disabled') return;\n\n const { fill, stroke } = markerAppearance(shape, color, themeMode);\n const strokeWidth = hovered ? 3 : 1;\n\n if (shape === 'square') {\n const size = 7;\n parent\n .append('rect')\n .attr('x', cx - size / 2)\n .attr('y', cy - size / 2)\n .attr('width', size)\n .attr('height', size)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n return;\n }\n\n if (shape === 'rhombus') {\n const size = 9;\n parent\n .append('rect')\n .attr('x', cx - size / 2)\n .attr('y', cy - size / 2)\n .attr('width', size)\n .attr('height', size)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth)\n .attr('transform', `rotate(45, ${cx}, ${cy})`);\n return;\n }\n\n if (shape === 'triangle') {\n const s = 4;\n parent\n .append('polygon')\n .attr(\n 'points',\n `${cx},${cy - s} ${cx - s},${cy + s} ${cx + s},${cy + s}`,\n )\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n return;\n }\n\n parent\n .append('circle')\n .attr('cx', cx)\n .attr('cy', cy)\n .attr('r', r)\n .attr('fill', fill)\n .attr('stroke', stroke)\n .attr('stroke-width', strokeWidth);\n}\n\n/**\n * Lollipop head — FuseDash Vertical markers (default = rhombus diamond path).\n */\nexport function appendLollipopMarkerVertical(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: Selection<any, any, any, any>,\n opts: { shape: MarkerShape; color: string; cx: number; cy: number },\n): void {\n const { shape, color, cx, cy } = opts;\n if (shape === 'disabled') return;\n\n if (shape === 'donut') {\n parent\n .append('path')\n .attr(\n 'd',\n `M ${cx}, ${cy - 5} a 5,5 0 1,0 0,10 a 5,5 0 1,0 0,-10 M ${cx}, ${cy - 2} a 2,2 0 1,1 0,4 a 2,2 0 1,1 0,-4`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n parent.append('circle').attr('cx', cx).attr('cy', cy).attr('r', 2).attr('fill', '#fff');\n return;\n }\n\n if (shape === 'circle') {\n parent\n .append('path')\n .attr('d', `M ${cx}, ${cy - 5} a 5,5 0 1,0 0,10 a 5,5 0 1,0 0,-10`)\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n if (shape === 'square') {\n parent\n .append('path')\n .attr(\n 'd',\n `M${cx - 5}, ${cy + 5} L${cx + 5}, ${cy + 5} L${cx + 5}, ${cy - 5} L${cx - 5}, ${cy - 5} Z`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n if (shape === 'triangle') {\n parent\n .append('path')\n .attr('d', `M${cx}, ${cy - 5} L${cx - 5}, ${cy + 5} L${cx + 5}, ${cy + 5} Z`)\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n return;\n }\n\n // default / rhombus\n parent\n .append('path')\n .attr(\n 'd',\n `M${cx}, ${cy + 5} L${cx + 5}, ${cy} L${cx}, ${cy - 5} L${cx - 5}, ${cy}Z`,\n )\n .attr('fill', color)\n .attr('stroke', '#fff')\n .attr('stroke-width', 1);\n}\n"],"names":[],"mappings":"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"}