@fusedashlabs/widgets 0.3.1 → 0.4.1

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 (409) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/README.md +1 -1
  3. package/dist/components/chart-renderer/element/ui9000-chart-renderer.d.ts +2 -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 +23 -2
  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 +20 -5
  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/kpi-widget/element/styles.d.ts.map +1 -1
  15. package/dist/components/kpi-widget/element/styles.js +268 -5
  16. package/dist/components/kpi-widget/element/styles.js.map +1 -1
  17. package/dist/components/kpi-widget/element/ui9000-kpi-widget.d.ts +10 -1
  18. package/dist/components/kpi-widget/element/ui9000-kpi-widget.d.ts.map +1 -1
  19. package/dist/components/kpi-widget/element/ui9000-kpi-widget.js +154 -27
  20. package/dist/components/kpi-widget/element/ui9000-kpi-widget.js.map +1 -1
  21. package/dist/components/kpi-widget/index.d.ts +1 -1
  22. package/dist/components/kpi-widget/index.d.ts.map +1 -1
  23. package/dist/components/kpi-widget/index.js +7 -4
  24. package/dist/components/kpi-widget/lib/extract.d.ts +5 -1
  25. package/dist/components/kpi-widget/lib/extract.d.ts.map +1 -1
  26. package/dist/components/kpi-widget/lib/extract.js +110 -34
  27. package/dist/components/kpi-widget/lib/extract.js.map +1 -1
  28. package/dist/components/kpi-widget/lib/format.d.ts +5 -0
  29. package/dist/components/kpi-widget/lib/format.d.ts.map +1 -1
  30. package/dist/components/kpi-widget/lib/format.js +10 -1
  31. package/dist/components/kpi-widget/lib/format.js.map +1 -1
  32. package/dist/components/kpi-widget/lib/grid.d.ts +5 -0
  33. package/dist/components/kpi-widget/lib/grid.d.ts.map +1 -1
  34. package/dist/components/kpi-widget/lib/grid.js +18 -0
  35. package/dist/components/kpi-widget/lib/grid.js.map +1 -1
  36. package/dist/components/kpi-widget/lib/index.d.ts +5 -5
  37. package/dist/components/kpi-widget/lib/index.d.ts.map +1 -1
  38. package/dist/components/kpi-widget/lib/normalize.d.ts +2 -0
  39. package/dist/components/kpi-widget/lib/normalize.d.ts.map +1 -1
  40. package/dist/components/kpi-widget/lib/normalize.js +73 -12
  41. package/dist/components/kpi-widget/lib/normalize.js.map +1 -1
  42. package/dist/components/kpi-widget/lib/types.d.ts +41 -0
  43. package/dist/components/kpi-widget/lib/types.d.ts.map +1 -1
  44. package/dist/components/kpi-widget/metadata.json.d.ts +1 -1
  45. package/dist/components/kpi-widget/metadata.json.js +1 -1
  46. package/dist/components/lollipop/element/styles.d.ts.map +1 -1
  47. package/dist/components/lollipop/element/styles.js +19 -1
  48. package/dist/components/lollipop/element/styles.js.map +1 -1
  49. package/dist/components/lollipop/element/ui9000-lollipop.d.ts +6 -1
  50. package/dist/components/lollipop/element/ui9000-lollipop.d.ts.map +1 -1
  51. package/dist/components/lollipop/element/ui9000-lollipop.js +68 -7
  52. package/dist/components/lollipop/element/ui9000-lollipop.js.map +1 -1
  53. package/dist/components/lollipop/index.d.ts +1 -1
  54. package/dist/components/lollipop/index.d.ts.map +1 -1
  55. package/dist/components/lollipop/index.js +2 -0
  56. package/dist/components/lollipop/index.js.map +1 -1
  57. package/dist/components/lollipop/lib/domain.d.ts +16 -1
  58. package/dist/components/lollipop/lib/domain.d.ts.map +1 -1
  59. package/dist/components/lollipop/lib/domain.js +56 -1
  60. package/dist/components/lollipop/lib/domain.js.map +1 -1
  61. package/dist/components/lollipop/lib/index.d.ts +3 -2
  62. package/dist/components/lollipop/lib/index.d.ts.map +1 -1
  63. package/dist/components/lollipop/lib/layout.d.ts +16 -0
  64. package/dist/components/lollipop/lib/layout.d.ts.map +1 -0
  65. package/dist/components/lollipop/lib/layout.js +16 -0
  66. package/dist/components/lollipop/lib/layout.js.map +1 -0
  67. package/dist/components/lollipop/lib/types.d.ts +5 -0
  68. package/dist/components/lollipop/lib/types.d.ts.map +1 -1
  69. package/dist/components/lollipop/metadata.json.d.ts +10 -0
  70. package/dist/components/lollipop/metadata.json.js +4 -1
  71. package/dist/components/lollipop/metadata.json.js.map +1 -1
  72. package/dist/components/lollipop/render/draw.d.ts +8 -1
  73. package/dist/components/lollipop/render/draw.d.ts.map +1 -1
  74. package/dist/components/lollipop/render/draw.js +155 -84
  75. package/dist/components/lollipop/render/draw.js.map +1 -1
  76. package/dist/components/map-chart/element/styles.d.ts +2 -0
  77. package/dist/components/map-chart/element/styles.d.ts.map +1 -0
  78. package/dist/components/map-chart/element/styles.js +372 -0
  79. package/dist/components/map-chart/element/styles.js.map +1 -0
  80. package/dist/components/map-chart/element/ui9000-map-chart.d.ts +54 -0
  81. package/dist/components/map-chart/element/ui9000-map-chart.d.ts.map +1 -0
  82. package/dist/components/map-chart/element/ui9000-map-chart.js +539 -0
  83. package/dist/components/map-chart/element/ui9000-map-chart.js.map +1 -0
  84. package/dist/components/map-chart/index.d.ts +5 -0
  85. package/dist/components/map-chart/index.d.ts.map +1 -0
  86. package/dist/components/map-chart/index.js +29 -0
  87. package/dist/components/map-chart/index.js.map +1 -0
  88. package/dist/components/map-chart/lib/constants.d.ts +34 -0
  89. package/dist/components/map-chart/lib/constants.d.ts.map +1 -0
  90. package/dist/components/map-chart/lib/constants.js +122 -0
  91. package/dist/components/map-chart/lib/constants.js.map +1 -0
  92. package/dist/components/map-chart/lib/domain.d.ts +12 -0
  93. package/dist/components/map-chart/lib/domain.d.ts.map +1 -0
  94. package/dist/components/map-chart/lib/domain.js +105 -0
  95. package/dist/components/map-chart/lib/domain.js.map +1 -0
  96. package/dist/components/map-chart/lib/format.d.ts +8 -0
  97. package/dist/components/map-chart/lib/format.d.ts.map +1 -0
  98. package/dist/components/map-chart/lib/format.js +45 -0
  99. package/dist/components/map-chart/lib/format.js.map +1 -0
  100. package/dist/components/map-chart/lib/geo-index.d.ts +7 -0
  101. package/dist/components/map-chart/lib/geo-index.d.ts.map +1 -0
  102. package/dist/components/map-chart/lib/geo-index.js +200 -0
  103. package/dist/components/map-chart/lib/geo-index.js.map +1 -0
  104. package/dist/components/map-chart/lib/geojson.d.ts +5 -0
  105. package/dist/components/map-chart/lib/geojson.d.ts.map +1 -0
  106. package/dist/components/map-chart/lib/geojson.js +47 -0
  107. package/dist/components/map-chart/lib/geojson.js.map +1 -0
  108. package/dist/components/map-chart/lib/index.d.ts +13 -0
  109. package/dist/components/map-chart/lib/index.d.ts.map +1 -0
  110. package/dist/components/map-chart/lib/join.d.ts +7 -0
  111. package/dist/components/map-chart/lib/join.d.ts.map +1 -0
  112. package/dist/components/map-chart/lib/join.js +156 -0
  113. package/dist/components/map-chart/lib/join.js.map +1 -0
  114. package/dist/components/map-chart/lib/legend.d.ts +45 -0
  115. package/dist/components/map-chart/lib/legend.d.ts.map +1 -0
  116. package/dist/components/map-chart/lib/legend.js +108 -0
  117. package/dist/components/map-chart/lib/legend.js.map +1 -0
  118. package/dist/components/map-chart/lib/normalize.d.ts +3 -0
  119. package/dist/components/map-chart/lib/normalize.d.ts.map +1 -0
  120. package/dist/components/map-chart/lib/normalize.js +177 -0
  121. package/dist/components/map-chart/lib/normalize.js.map +1 -0
  122. package/dist/components/map-chart/lib/pmtiles.d.ts +41 -0
  123. package/dist/components/map-chart/lib/pmtiles.d.ts.map +1 -0
  124. package/dist/components/map-chart/lib/pmtiles.js +112 -0
  125. package/dist/components/map-chart/lib/pmtiles.js.map +1 -0
  126. package/dist/components/map-chart/lib/types.d.ts +128 -0
  127. package/dist/components/map-chart/lib/types.d.ts.map +1 -0
  128. package/dist/components/map-chart/metadata.json.d.ts +83 -0
  129. package/dist/components/map-chart/metadata.json.js +42 -0
  130. package/dist/components/map-chart/metadata.json.js.map +1 -0
  131. package/dist/components/map-chart/render/draw.d.ts +24 -0
  132. package/dist/components/map-chart/render/draw.d.ts.map +1 -0
  133. package/dist/components/map-chart/render/draw.js +456 -0
  134. package/dist/components/map-chart/render/draw.js.map +1 -0
  135. package/dist/components/map-chart/render/index.d.ts +2 -0
  136. package/dist/components/map-chart/render/index.d.ts.map +1 -0
  137. package/dist/components/matrix-chart/element/styles.d.ts +2 -0
  138. package/dist/components/matrix-chart/element/styles.d.ts.map +1 -0
  139. package/dist/components/matrix-chart/element/styles.js +97 -0
  140. package/dist/components/matrix-chart/element/styles.js.map +1 -0
  141. package/dist/components/matrix-chart/element/ui9000-matrix-chart.d.ts +39 -0
  142. package/dist/components/matrix-chart/element/ui9000-matrix-chart.d.ts.map +1 -0
  143. package/dist/components/matrix-chart/element/ui9000-matrix-chart.js +238 -0
  144. package/dist/components/matrix-chart/element/ui9000-matrix-chart.js.map +1 -0
  145. package/dist/components/matrix-chart/index.d.ts +5 -0
  146. package/dist/components/matrix-chart/index.d.ts.map +1 -0
  147. package/dist/components/matrix-chart/index.js +20 -0
  148. package/dist/components/matrix-chart/lib/domain.d.ts +7 -0
  149. package/dist/components/matrix-chart/lib/domain.d.ts.map +1 -0
  150. package/dist/components/matrix-chart/lib/domain.js +58 -0
  151. package/dist/components/matrix-chart/lib/domain.js.map +1 -0
  152. package/dist/components/matrix-chart/lib/format.d.ts +5 -0
  153. package/dist/components/matrix-chart/lib/format.d.ts.map +1 -0
  154. package/dist/components/matrix-chart/lib/format.js +16 -0
  155. package/dist/components/matrix-chart/lib/format.js.map +1 -0
  156. package/dist/components/matrix-chart/lib/index.d.ts +5 -0
  157. package/dist/components/matrix-chart/lib/index.d.ts.map +1 -0
  158. package/dist/components/matrix-chart/lib/normalize.d.ts +5 -0
  159. package/dist/components/matrix-chart/lib/normalize.d.ts.map +1 -0
  160. package/dist/components/matrix-chart/lib/normalize.js +165 -0
  161. package/dist/components/matrix-chart/lib/normalize.js.map +1 -0
  162. package/dist/components/matrix-chart/lib/types.d.ts +33 -0
  163. package/dist/components/matrix-chart/lib/types.d.ts.map +1 -0
  164. package/dist/components/matrix-chart/metadata.json.d.ts +110 -0
  165. package/dist/components/matrix-chart/metadata.json.js +42 -0
  166. package/dist/components/matrix-chart/metadata.json.js.map +1 -0
  167. package/dist/components/matrix-chart/render/draw.d.ts +63 -0
  168. package/dist/components/matrix-chart/render/draw.d.ts.map +1 -0
  169. package/dist/components/matrix-chart/render/draw.js +225 -0
  170. package/dist/components/matrix-chart/render/draw.js.map +1 -0
  171. package/dist/components/matrix-chart/render/index.d.ts +2 -0
  172. package/dist/components/matrix-chart/render/index.d.ts.map +1 -0
  173. package/dist/components/network-graph/element/styles.d.ts.map +1 -1
  174. package/dist/components/network-graph/element/styles.js +177 -57
  175. package/dist/components/network-graph/element/styles.js.map +1 -1
  176. package/dist/components/network-graph/element/ui9000-network-graph.d.ts +4 -0
  177. package/dist/components/network-graph/element/ui9000-network-graph.d.ts.map +1 -1
  178. package/dist/components/network-graph/element/ui9000-network-graph.js +116 -39
  179. package/dist/components/network-graph/element/ui9000-network-graph.js.map +1 -1
  180. package/dist/components/network-graph/lib/domain.d.ts +2 -2
  181. package/dist/components/network-graph/lib/domain.js.map +1 -1
  182. package/dist/components/network-graph/lib/index.d.ts +1 -0
  183. package/dist/components/network-graph/lib/index.d.ts.map +1 -1
  184. package/dist/components/network-graph/lib/legend.d.ts +15 -0
  185. package/dist/components/network-graph/lib/legend.d.ts.map +1 -0
  186. package/dist/components/network-graph/lib/legend.js +35 -0
  187. package/dist/components/network-graph/lib/legend.js.map +1 -0
  188. package/dist/components/network-graph/render/draw.d.ts +4 -1
  189. package/dist/components/network-graph/render/draw.d.ts.map +1 -1
  190. package/dist/components/network-graph/render/draw.js +34 -9
  191. package/dist/components/network-graph/render/draw.js.map +1 -1
  192. package/dist/components/partial-dependence-chart/element/styles.d.ts +2 -0
  193. package/dist/components/partial-dependence-chart/element/styles.d.ts.map +1 -0
  194. package/dist/components/partial-dependence-chart/element/styles.js +48 -0
  195. package/dist/components/partial-dependence-chart/element/styles.js.map +1 -0
  196. package/dist/components/partial-dependence-chart/element/ui9000-partial-dependence-chart.d.ts +30 -0
  197. package/dist/components/partial-dependence-chart/element/ui9000-partial-dependence-chart.d.ts.map +1 -0
  198. package/dist/components/partial-dependence-chart/element/ui9000-partial-dependence-chart.js +163 -0
  199. package/dist/components/partial-dependence-chart/element/ui9000-partial-dependence-chart.js.map +1 -0
  200. package/dist/components/partial-dependence-chart/index.d.ts +5 -0
  201. package/dist/components/partial-dependence-chart/index.d.ts.map +1 -0
  202. package/dist/components/partial-dependence-chart/index.js +18 -0
  203. package/dist/components/partial-dependence-chart/index.js.map +1 -0
  204. package/dist/components/partial-dependence-chart/lib/domain.d.ts +6 -0
  205. package/dist/components/partial-dependence-chart/lib/domain.d.ts.map +1 -0
  206. package/dist/components/partial-dependence-chart/lib/domain.js +16 -0
  207. package/dist/components/partial-dependence-chart/lib/domain.js.map +1 -0
  208. package/dist/components/partial-dependence-chart/lib/index.d.ts +5 -0
  209. package/dist/components/partial-dependence-chart/lib/index.d.ts.map +1 -0
  210. package/dist/components/partial-dependence-chart/lib/normalize.d.ts +4 -0
  211. package/dist/components/partial-dependence-chart/lib/normalize.d.ts.map +1 -0
  212. package/dist/components/partial-dependence-chart/lib/normalize.js +167 -0
  213. package/dist/components/partial-dependence-chart/lib/normalize.js.map +1 -0
  214. package/dist/components/partial-dependence-chart/lib/series.d.ts +15 -0
  215. package/dist/components/partial-dependence-chart/lib/series.d.ts.map +1 -0
  216. package/dist/components/partial-dependence-chart/lib/series.js +63 -0
  217. package/dist/components/partial-dependence-chart/lib/series.js.map +1 -0
  218. package/dist/components/partial-dependence-chart/lib/types.d.ts +50 -0
  219. package/dist/components/partial-dependence-chart/lib/types.d.ts.map +1 -0
  220. package/dist/components/partial-dependence-chart/metadata.json.d.ts +80 -0
  221. package/dist/components/partial-dependence-chart/metadata.json.js +42 -0
  222. package/dist/components/partial-dependence-chart/metadata.json.js.map +1 -0
  223. package/dist/components/partial-dependence-chart/render/draw.d.ts +34 -0
  224. package/dist/components/partial-dependence-chart/render/draw.d.ts.map +1 -0
  225. package/dist/components/partial-dependence-chart/render/draw.js +95 -0
  226. package/dist/components/partial-dependence-chart/render/draw.js.map +1 -0
  227. package/dist/components/partial-dependence-chart/render/index.d.ts +2 -0
  228. package/dist/components/partial-dependence-chart/render/index.d.ts.map +1 -0
  229. package/dist/components/pie-chart/element/styles.d.ts.map +1 -1
  230. package/dist/components/pie-chart/element/styles.js +34 -1
  231. package/dist/components/pie-chart/element/styles.js.map +1 -1
  232. package/dist/components/pie-chart/element/ui9000-pie-chart.d.ts +0 -2
  233. package/dist/components/pie-chart/element/ui9000-pie-chart.d.ts.map +1 -1
  234. package/dist/components/pie-chart/element/ui9000-pie-chart.js +2 -8
  235. package/dist/components/pie-chart/element/ui9000-pie-chart.js.map +1 -1
  236. package/dist/components/pie-chart/metadata.json.d.ts +1 -7
  237. package/dist/components/pie-chart/metadata.json.js +2 -2
  238. package/dist/components/polar-area-chart/element/styles.d.ts +1 -1
  239. package/dist/components/polar-area-chart/element/styles.d.ts.map +1 -1
  240. package/dist/components/{donut-group-chart → polar-area-chart}/element/styles.js +9 -27
  241. package/dist/components/polar-area-chart/element/styles.js.map +1 -0
  242. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.d.ts.map +1 -1
  243. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js +4 -3
  244. package/dist/components/polar-area-chart/element/ui9000-polar-area-chart.js.map +1 -1
  245. package/dist/components/polar-area-chart/index.d.ts +1 -1
  246. package/dist/components/polar-area-chart/index.d.ts.map +1 -1
  247. package/dist/components/polar-area-chart/index.js +2 -1
  248. package/dist/components/polar-area-chart/lib/domain.d.ts +8 -0
  249. package/dist/components/polar-area-chart/lib/domain.d.ts.map +1 -1
  250. package/dist/components/polar-area-chart/lib/domain.js +20 -0
  251. package/dist/components/polar-area-chart/lib/domain.js.map +1 -1
  252. package/dist/components/polar-area-chart/lib/index.d.ts +1 -1
  253. package/dist/components/polar-area-chart/lib/index.d.ts.map +1 -1
  254. package/dist/components/polar-area-chart/lib/normalize.d.ts.map +1 -1
  255. package/dist/components/polar-area-chart/lib/normalize.js +72 -6
  256. package/dist/components/polar-area-chart/lib/normalize.js.map +1 -1
  257. package/dist/components/polar-area-chart/lib/types.d.ts +6 -1
  258. package/dist/components/polar-area-chart/lib/types.d.ts.map +1 -1
  259. package/dist/components/polar-area-chart/metadata.json.d.ts +1 -1
  260. package/dist/components/polar-area-chart/metadata.json.js +1 -1
  261. package/dist/components/polar-area-chart/render/draw.d.ts.map +1 -1
  262. package/dist/components/polar-area-chart/render/draw.js +2 -2
  263. package/dist/components/polar-area-chart/render/draw.js.map +1 -1
  264. package/dist/components/punchcard-chart/metadata.json.d.ts +1 -1
  265. package/dist/components/punchcard-chart/metadata.json.js +1 -1
  266. package/dist/components/sankey-chart/element/styles.d.ts.map +1 -1
  267. package/dist/components/sankey-chart/element/styles.js +7 -27
  268. package/dist/components/sankey-chart/element/styles.js.map +1 -1
  269. package/dist/components/sankey-chart/element/ui9000-sankey-chart.d.ts +5 -5
  270. package/dist/components/sankey-chart/element/ui9000-sankey-chart.d.ts.map +1 -1
  271. package/dist/components/sankey-chart/element/ui9000-sankey-chart.js +37 -35
  272. package/dist/components/sankey-chart/element/ui9000-sankey-chart.js.map +1 -1
  273. package/dist/components/treemap-chart/element/styles.d.ts +2 -0
  274. package/dist/components/treemap-chart/element/styles.d.ts.map +1 -0
  275. package/dist/components/treemap-chart/element/styles.js +141 -0
  276. package/dist/components/treemap-chart/element/styles.js.map +1 -0
  277. package/dist/components/treemap-chart/element/ui9000-treemap-chart.d.ts +35 -0
  278. package/dist/components/treemap-chart/element/ui9000-treemap-chart.d.ts.map +1 -0
  279. package/dist/components/treemap-chart/element/ui9000-treemap-chart.js +177 -0
  280. package/dist/components/treemap-chart/element/ui9000-treemap-chart.js.map +1 -0
  281. package/dist/components/treemap-chart/index.d.ts +5 -0
  282. package/dist/components/treemap-chart/index.d.ts.map +1 -0
  283. package/dist/components/treemap-chart/index.js +22 -0
  284. package/dist/components/treemap-chart/index.js.map +1 -0
  285. package/dist/components/treemap-chart/lib/color.d.ts +25 -0
  286. package/dist/components/treemap-chart/lib/color.d.ts.map +1 -0
  287. package/dist/components/treemap-chart/lib/color.js +67 -0
  288. package/dist/components/treemap-chart/lib/color.js.map +1 -0
  289. package/dist/components/treemap-chart/lib/format.d.ts +7 -0
  290. package/dist/components/treemap-chart/lib/format.d.ts.map +1 -0
  291. package/dist/components/treemap-chart/lib/format.js +9 -0
  292. package/dist/components/treemap-chart/lib/format.js.map +1 -0
  293. package/dist/components/treemap-chart/lib/index.d.ts +6 -0
  294. package/dist/components/treemap-chart/lib/index.d.ts.map +1 -0
  295. package/dist/components/treemap-chart/lib/layout.d.ts +18 -0
  296. package/dist/components/treemap-chart/lib/layout.d.ts.map +1 -0
  297. package/dist/components/treemap-chart/lib/layout.js +31 -0
  298. package/dist/components/treemap-chart/lib/layout.js.map +1 -0
  299. package/dist/components/treemap-chart/lib/normalize.d.ts +4 -0
  300. package/dist/components/treemap-chart/lib/normalize.d.ts.map +1 -0
  301. package/dist/components/treemap-chart/lib/normalize.js +182 -0
  302. package/dist/components/treemap-chart/lib/normalize.js.map +1 -0
  303. package/dist/components/treemap-chart/lib/types.d.ts +63 -0
  304. package/dist/components/treemap-chart/lib/types.d.ts.map +1 -0
  305. package/dist/components/treemap-chart/metadata.json.d.ts +126 -0
  306. package/dist/components/treemap-chart/metadata.json.js +45 -0
  307. package/dist/components/treemap-chart/render/draw.d.ts +24 -0
  308. package/dist/components/treemap-chart/render/draw.d.ts.map +1 -0
  309. package/dist/components/treemap-chart/render/draw.js +124 -0
  310. package/dist/components/treemap-chart/render/draw.js.map +1 -0
  311. package/dist/components/treemap-chart/render/index.d.ts +2 -0
  312. package/dist/components/treemap-chart/render/index.d.ts.map +1 -0
  313. package/dist/element/chart-legend-render.d.ts +5 -0
  314. package/dist/element/chart-legend-render.d.ts.map +1 -1
  315. package/dist/element/chart-legend-render.js +19 -1
  316. package/dist/element/chart-legend-render.js.map +1 -1
  317. package/dist/element/chart-shell-styles.d.ts.map +1 -1
  318. package/dist/element/chart-shell-styles.js +35 -0
  319. package/dist/element/chart-shell-styles.js.map +1 -1
  320. package/dist/index.d.ts +11 -5
  321. package/dist/index.d.ts.map +1 -1
  322. package/dist/index.js +91 -42
  323. package/dist/index.js.map +1 -1
  324. package/dist/lazy/index.d.ts +5 -2
  325. package/dist/lazy/index.d.ts.map +1 -1
  326. package/dist/lazy/index.js +32 -8
  327. package/dist/lazy/index.js.map +1 -1
  328. package/dist/lazy/map-chart.d.ts +4 -0
  329. package/dist/lazy/map-chart.d.ts.map +1 -0
  330. package/dist/lazy/map-chart.js +5 -0
  331. package/dist/lazy/map-chart.js.map +1 -0
  332. package/dist/lazy/matrix-chart.d.ts +4 -0
  333. package/dist/lazy/matrix-chart.d.ts.map +1 -0
  334. package/dist/lazy/matrix-chart.js +5 -0
  335. package/dist/lazy/matrix-chart.js.map +1 -0
  336. package/dist/lazy/partial-dependence-chart.d.ts +4 -0
  337. package/dist/lazy/partial-dependence-chart.d.ts.map +1 -0
  338. package/dist/lazy/partial-dependence-chart.js +5 -0
  339. package/dist/lazy/partial-dependence-chart.js.map +1 -0
  340. package/dist/lazy/treemap-chart.d.ts +4 -0
  341. package/dist/lazy/treemap-chart.d.ts.map +1 -0
  342. package/dist/lazy/treemap-chart.js +5 -0
  343. package/dist/lazy/treemap-chart.js.map +1 -0
  344. package/dist/utils/axis-units.d.ts +15 -0
  345. package/dist/utils/axis-units.d.ts.map +1 -0
  346. package/dist/utils/axis-units.js +27 -0
  347. package/dist/utils/axis-units.js.map +1 -0
  348. package/dist/utils/chart-helpers.d.ts +6 -6
  349. package/dist/utils/chart-helpers.d.ts.map +1 -1
  350. package/dist/utils/chart-helpers.js +31 -15
  351. package/dist/utils/chart-helpers.js.map +1 -1
  352. package/dist/utils/format-text.d.ts +5 -0
  353. package/dist/utils/format-text.d.ts.map +1 -1
  354. package/dist/utils/format-text.js +7 -0
  355. package/dist/utils/format-text.js.map +1 -1
  356. package/dist/utils/fuse-palette.d.ts +12 -0
  357. package/dist/utils/fuse-palette.d.ts.map +1 -1
  358. package/dist/utils/fuse-palette.js +23 -1
  359. package/dist/utils/fuse-palette.js.map +1 -1
  360. package/dist/utils/fuse-widget.d.ts +13 -4
  361. package/dist/utils/fuse-widget.d.ts.map +1 -1
  362. package/dist/utils/fuse-widget.js.map +1 -1
  363. package/dist/utils/fusedash-visual.d.ts +77 -52
  364. package/dist/utils/fusedash-visual.d.ts.map +1 -1
  365. package/dist/utils/fusedash-visual.js +55 -29
  366. package/dist/utils/fusedash-visual.js.map +1 -1
  367. package/package.json +48 -12
  368. package/dist/components/donut-group-chart/element/styles.d.ts +0 -2
  369. package/dist/components/donut-group-chart/element/styles.d.ts.map +0 -1
  370. package/dist/components/donut-group-chart/element/styles.js.map +0 -1
  371. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.d.ts +0 -34
  372. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.d.ts.map +0 -1
  373. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.js +0 -169
  374. package/dist/components/donut-group-chart/element/ui9000-donut-group-chart.js.map +0 -1
  375. package/dist/components/donut-group-chart/index.d.ts +0 -5
  376. package/dist/components/donut-group-chart/index.d.ts.map +0 -1
  377. package/dist/components/donut-group-chart/index.js +0 -23
  378. package/dist/components/donut-group-chart/lib/domain.d.ts +0 -39
  379. package/dist/components/donut-group-chart/lib/domain.d.ts.map +0 -1
  380. package/dist/components/donut-group-chart/lib/domain.js +0 -51
  381. package/dist/components/donut-group-chart/lib/domain.js.map +0 -1
  382. package/dist/components/donut-group-chart/lib/format.d.ts +0 -7
  383. package/dist/components/donut-group-chart/lib/format.d.ts.map +0 -1
  384. package/dist/components/donut-group-chart/lib/format.js +0 -21
  385. package/dist/components/donut-group-chart/lib/format.js.map +0 -1
  386. package/dist/components/donut-group-chart/lib/index.d.ts +0 -5
  387. package/dist/components/donut-group-chart/lib/index.d.ts.map +0 -1
  388. package/dist/components/donut-group-chart/lib/normalize.d.ts +0 -14
  389. package/dist/components/donut-group-chart/lib/normalize.d.ts.map +0 -1
  390. package/dist/components/donut-group-chart/lib/normalize.js +0 -98
  391. package/dist/components/donut-group-chart/lib/normalize.js.map +0 -1
  392. package/dist/components/donut-group-chart/lib/types.d.ts +0 -49
  393. package/dist/components/donut-group-chart/lib/types.d.ts.map +0 -1
  394. package/dist/components/donut-group-chart/metadata.json.d.ts +0 -113
  395. package/dist/components/donut-group-chart/metadata.json.js +0 -45
  396. package/dist/components/donut-group-chart/render/draw.d.ts +0 -44
  397. package/dist/components/donut-group-chart/render/draw.d.ts.map +0 -1
  398. package/dist/components/donut-group-chart/render/draw.js +0 -194
  399. package/dist/components/donut-group-chart/render/draw.js.map +0 -1
  400. package/dist/components/donut-group-chart/render/index.d.ts +0 -2
  401. package/dist/components/donut-group-chart/render/index.d.ts.map +0 -1
  402. package/dist/components/donut-group-chart/tests/fixtures.d.ts +0 -33
  403. package/dist/components/donut-group-chart/tests/fixtures.d.ts.map +0 -1
  404. package/dist/lazy/donut-group-chart.d.ts +0 -4
  405. package/dist/lazy/donut-group-chart.d.ts.map +0 -1
  406. package/dist/lazy/donut-group-chart.js +0 -5
  407. package/dist/lazy/donut-group-chart.js.map +0 -1
  408. /package/dist/components/{donut-group-chart → matrix-chart}/index.js.map +0 -0
  409. /package/dist/components/{donut-group-chart → treemap-chart}/metadata.json.js.map +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"ui9000-kpi-widget.js","sources":["../../../../src/components/kpi-widget/element/ui9000-kpi-widget.ts"],"sourcesContent":["import { html, nothing, type PropertyValues } from 'lit';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { chartShellStyles, Ui9000ChartElement } from '../../../element/ui9000-chart-base.js';\nimport type { WidgetScale } from '../../../types/index.js';\nimport { parseJsonAttr } from '../../../utils/chart-helpers.js';\nimport {\n getKpiGridColumns,\n getKpiGridScrollAxis,\n MIN_KPI_CELL_WIDTH,\n normalizeKpiData,\n type KpiCardModel,\n type KpiGridScrollAxis,\n type KpiWidgetData,\n} from '../lib/index.js';\nimport { kpiWidgetStyles } from './styles.js';\n\n@customElement('ui9000-kpi-widget')\nexport class Ui9000KpiWidget extends Ui9000ChartElement {\n static override styles = [kpiWidgetStyles, chartShellStyles];\n\n @property({ type: String, attribute: 'scale' })\n scale: WidgetScale = 'default';\n\n @state()\n private _cards: KpiCardModel[] = [];\n\n @state()\n private _gridColumns = 1;\n\n @state()\n private _scrollAxis: KpiGridScrollAxis = 'vertical';\n\n private _resizeObserver?: ResizeObserver;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver(() => this.updateGridLayout());\n this._resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n this._resizeObserver?.disconnect();\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('dataJson')) {\n const model = normalizeKpiData(parseJsonAttr<KpiWidgetData>(this.dataJson, null));\n this._cards = model.cards;\n this.updateGridLayout();\n }\n }\n\n private updateGridLayout(): void {\n const count = this._cards.length;\n const columns = getKpiGridColumns(this.clientWidth, count);\n const scrollAxis = getKpiGridScrollAxis(columns, count);\n if (columns !== this._gridColumns) this._gridColumns = columns;\n if (scrollAxis !== this._scrollAxis) this._scrollAxis = scrollAxis;\n }\n\n private renderValue(card: KpiCardModel) {\n const label = card.label;\n const unitLeft = label?.position === 'left' && label.text;\n const unitRight = label?.position === 'right' && label.text;\n\n return html`\n <div class=\"kpi-value-row\">\n ${unitLeft ? html`<span class=\"kpi-unit\">${unitLeft}</span>` : nothing}\n <h2 class=\"kpi-value\">${card.value}</h2>\n ${unitRight ? html`<span class=\"kpi-unit\">${unitRight}</span>` : nothing}\n ${card.indicator ? html`<span class=\"kpi-indicator\">${card.indicator}</span>` : nothing}\n </div>\n `;\n }\n\n private renderCard(card: KpiCardModel) {\n return html`\n <article class=\"kpi-card\" aria-label=${card.name}>\n <p class=\"kpi-name\">${card.name}</p>\n ${this.renderValue(card)}\n ${card.subtitle ? html`<p class=\"kpi-subtitle\">${card.subtitle}</p>` : nothing}\n </article>\n `;\n }\n\n override render() {\n const title = this.headerTitle();\n const single = this._cards.length <= 1;\n\n const gridStyle = single\n ? nothing\n : styleMap({\n gridTemplateColumns: `repeat(${this._gridColumns}, minmax(${MIN_KPI_CELL_WIDTH}px, 1fr))`,\n });\n\n return html`\n <div class=\"kpi-root\" data-single=${single ? 'true' : 'false'}>\n ${this.renderShellHeader(title)}\n ${this._cards.length === 0\n ? html`<div class=\"empty\">No KPI data</div>`\n : html`\n <div\n class=\"kpi-grid\"\n data-layout=${single ? 'single' : 'grid'}\n data-scroll=${this._scrollAxis}\n ${gridStyle}\n >\n ${this._cards.map((card) => this.renderCard(card))}\n </div>\n `}\n ${this.renderShellLabelTooltip()}\n </div>\n `;\n }\n}\n\nexport function registerKpiWidget(): void {\n if (!customElements.get('ui9000-kpi-widget')) {\n customElements.define('ui9000-kpi-widget', Ui9000KpiWidget);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui9000-kpi-widget': Ui9000KpiWidget;\n }\n}\n"],"names":["styleMap"],"mappings":"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"}
1
+ {"version":3,"file":"ui9000-kpi-widget.js","sources":["../../../../src/components/kpi-widget/element/ui9000-kpi-widget.ts"],"sourcesContent":["import { html, nothing, type PropertyValues } from 'lit';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { chartShellStyles, Ui9000ChartElement } from '../../../element/ui9000-chart-base.js';\nimport type { WidgetScale } from '../../../types/index.js';\nimport { parseJsonAttr } from '../../../utils/chart-helpers.js';\nimport {\n getAdvancedSplitLayout,\n getKpiGridColumns,\n getKpiGridScrollAxis,\n MIN_KPI_CELL_WIDTH,\n visualisationChartType,\n normalizeKpiData,\n type AdvancedSplitLayout,\n type KpiCardModel,\n type KpiCardRole,\n type KpiGridScrollAxis,\n type KpiWidgetData,\n type KpiWidgetModel,\n} from '../lib/index.js';\nimport { kpiWidgetStyles } from './styles.js';\n\n@customElement('ui9000-kpi-widget')\nexport class Ui9000KpiWidget extends Ui9000ChartElement {\n static override styles = [kpiWidgetStyles, chartShellStyles];\n\n @property({ type: String, attribute: 'scale' })\n scale: WidgetScale = 'default';\n\n @state()\n private _model: KpiWidgetModel = { layout: 'empty', cards: [], supporting: [] };\n\n @state()\n private _gridColumns = 1;\n\n @state()\n private _scrollAxis: KpiGridScrollAxis = 'vertical';\n\n @state()\n private _advancedSplit: AdvancedSplitLayout = 'horizontal';\n\n private _resizeObserver?: ResizeObserver;\n private _raf = 0;\n private _rendererLoading = false;\n\n override connectedCallback(): void {\n super.connectedCallback();\n this._resizeObserver = new ResizeObserver(() => this.scheduleLayout());\n this._resizeObserver.observe(this);\n }\n\n override disconnectedCallback(): void {\n this._resizeObserver?.disconnect();\n cancelAnimationFrame(this._raf);\n super.disconnectedCallback();\n }\n\n override updated(changed: PropertyValues): void {\n if (changed.has('dataJson')) {\n this._model = normalizeKpiData(parseJsonAttr<KpiWidgetData>(this.dataJson, null));\n this.updateGridLayout();\n this.ensureChartRenderer();\n }\n }\n\n /** Nested viz uses `<ui9000-chart-renderer>` — load it only for advanced KPIs. */\n private ensureChartRenderer(): void {\n if (\n this._rendererLoading ||\n this._model.layout !== 'advanced' ||\n !this._model.visualisation\n ) {\n return;\n }\n this._rendererLoading = true;\n void import('../../chart-renderer/index.js').then(() => this.requestUpdate());\n }\n\n private scheduleLayout(): void {\n cancelAnimationFrame(this._raf);\n this._raf = requestAnimationFrame(() => this.updateGridLayout());\n }\n\n private updateGridLayout(): void {\n const layout = this._model.layout;\n const count =\n layout === 'advanced' ? this._model.supporting.length : this._model.cards.length;\n const columns = getKpiGridColumns(this.clientWidth, Math.max(count, 1));\n const scrollAxis = getKpiGridScrollAxis(columns, count);\n const split = getAdvancedSplitLayout(\n this.clientWidth,\n this.clientHeight,\n this._advancedSplit,\n );\n if (columns !== this._gridColumns) this._gridColumns = columns;\n if (scrollAxis !== this._scrollAxis) this._scrollAxis = scrollAxis;\n if (split !== this._advancedSplit) this._advancedSplit = split;\n }\n\n private renderBadge(card: KpiCardModel) {\n if (!card.status) return nothing;\n return html`\n <span class=\"kpi-badge\" data-variant=${card.status.variant}>${card.status.text}</span>\n `;\n }\n\n private renderValue(card: KpiCardModel) {\n const label = card.label;\n const unitLeft = label?.position === 'left' && label.text;\n const unitRight = label?.position === 'right' && label.text;\n const showIndicator = Boolean(card.showPercentage && card.indicator);\n\n return html`\n <div class=\"kpi-value-row\">\n ${unitLeft ? html`<span class=\"kpi-unit\">${unitLeft}</span>` : nothing}\n <h2 class=\"kpi-value\">${card.value}</h2>\n ${card.suffix ? html`<span class=\"kpi-suffix\">${card.suffix}</span>` : nothing}\n ${unitRight ? html`<span class=\"kpi-unit\">${unitRight}</span>` : nothing}\n ${showIndicator\n ? html`\n <span class=\"kpi-indicator\">\n <span class=\"kpi-indicator-arrow\" aria-hidden=\"true\">›</span>\n ${card.indicator}\n </span>\n `\n : nothing}\n </div>\n `;\n }\n\n private renderCard(card: KpiCardModel, role: KpiCardRole) {\n const showName = !card.hideName;\n const showHeaderBadge = Boolean(card.status) && (role === 'single' || role === 'main');\n const showInlineBadge = Boolean(card.status) && !showHeaderBadge;\n\n return html`\n <article class=\"kpi-card\" data-role=${role} aria-label=${card.name}>\n ${showName || showHeaderBadge\n ? html`\n <div class=\"kpi-header\">\n ${showName ? html`<p class=\"kpi-name\">${card.name}</p>` : html`<span></span>`}\n ${showHeaderBadge ? this.renderBadge(card) : nothing}\n </div>\n `\n : nothing}\n ${this.renderValue(card)}\n ${showInlineBadge || card.subtitle\n ? html`\n <div class=\"kpi-subtitle-row\">\n ${showInlineBadge ? this.renderBadge(card) : nothing}\n ${card.subtitle ? html`<p class=\"kpi-subtitle\">${card.subtitle}</p>` : nothing}\n </div>\n `\n : nothing}\n </article>\n `;\n }\n\n private renderFooter() {\n const { target, showTimestamp, updatedAt } = this._model;\n const hasTarget = Boolean(target && String(target).length);\n const updated =\n showTimestamp && updatedAt\n ? new Date(updatedAt).toLocaleDateString('en-US')\n : '';\n if (!hasTarget && !updated) return nothing;\n\n return html`\n <div class=\"kpi-footer\">\n ${hasTarget\n ? html`\n <div class=\"kpi-footer-block\">\n <span class=\"kpi-footer-label\">Target</span>\n <span class=\"kpi-footer-value\">${target}</span>\n </div>\n `\n : html`<span></span>`}\n ${updated\n ? html`\n <div class=\"kpi-footer-block\">\n <span class=\"kpi-footer-label\">Updated</span>\n <span class=\"kpi-footer-value\">${updated}</span>\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n private renderAdvanced() {\n const main = this._model.main;\n if (!main) return nothing;\n const viz = this._model.visualisation;\n const chartType =\n viz && typeof viz === 'object'\n ? visualisationChartType({ visualisation: viz })\n : undefined;\n const supporting = this._model.supporting;\n const supportingStyle =\n supporting.length > 0\n ? styleMap({\n gridTemplateColumns: `repeat(${this._gridColumns}, minmax(${MIN_KPI_CELL_WIDTH}px, 1fr))`,\n })\n : nothing;\n\n return html`\n <div class=\"kpi-advanced\">\n <div class=\"kpi-advanced-main\">\n <article class=\"kpi-card\" data-role=\"main\" aria-label=${main.name}>\n <div class=\"kpi-header\">\n <p class=\"kpi-name\">${main.name}</p>\n ${this.renderBadge(main)}\n </div>\n <div class=\"kpi-advanced-split\" data-split=${this._advancedSplit}>\n <div class=\"kpi-advanced-value\">${this.renderValue(main)}</div>\n ${viz && chartType\n ? html`\n <div class=\"kpi-advanced-chart\">\n <ui9000-chart-renderer\n data=${JSON.stringify(viz)}\n chart-type=${chartType}\n scale=${this.scale}\n show-header=\"false\"\n show-legend=\"false\"\n show-grid\n show-tooltip\n ></ui9000-chart-renderer>\n </div>\n `\n : nothing}\n </div>\n </article>\n </div>\n ${supporting.length\n ? html`\n <div\n class=\"kpi-supporting\"\n data-scroll=${this._scrollAxis}\n style=${supportingStyle}\n >\n ${supporting.map((card) => this.renderCard(card, 'supporting'))}\n </div>\n `\n : nothing}\n </div>\n `;\n }\n\n override render() {\n const model = this._model;\n const layout = model.layout;\n const single = layout === 'single';\n const title = model.title;\n\n const gridStyle =\n layout === 'grid'\n ? styleMap({\n gridTemplateColumns: `repeat(${this._gridColumns}, minmax(${MIN_KPI_CELL_WIDTH}px, 1fr))`,\n })\n : nothing;\n\n return html`\n <div class=\"kpi-root\" data-layout=${layout} data-single=${single ? 'true' : 'false'}>\n ${title ? html`<div class=\"kpi-section-title\">${title}</div>` : nothing}\n ${layout === 'empty'\n ? html`<div class=\"empty\">No KPI data</div>`\n : layout === 'advanced'\n ? this.renderAdvanced()\n : html`\n <div\n class=\"kpi-grid\"\n data-layout=${single ? 'single' : 'grid'}\n data-scroll=${this._scrollAxis}\n style=${gridStyle}\n >\n ${model.cards.map((card) =>\n this.renderCard(card, single ? 'single' : 'grid'),\n )}\n </div>\n `}\n ${this.renderFooter()}\n ${this.renderShellLabelTooltip()}\n </div>\n `;\n }\n}\n\nexport function registerKpiWidget(): void {\n if (!customElements.get('ui9000-kpi-widget')) {\n customElements.define('ui9000-kpi-widget', Ui9000KpiWidget);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ui9000-kpi-widget': Ui9000KpiWidget;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAwBO,IAAM,kBAAN,cAA8B,mBAAmB;AAAA,EAAjD,cAAA;AAAA,UAAA,GAAA,SAAA;AAIL,SAAA,QAAqB;AAGrB,SAAQ,SAAyB,EAAE,QAAQ,SAAS,OAAO,CAAA,GAAI,YAAY,GAAC;AAG5E,SAAQ,eAAe;AAGvB,SAAQ,cAAiC;AAGzC,SAAQ,iBAAsC;AAG9C,SAAQ,OAAO;AACf,SAAQ,mBAAmB;AAAA,EAAA;AAAA,EAElB,oBAA0B;AACjC,UAAM,kBAAA;AACN,SAAK,kBAAkB,IAAI,eAAe,MAAM,KAAK,gBAAgB;AACrE,SAAK,gBAAgB,QAAQ,IAAI;AAAA,EACnC;AAAA,EAES,uBAA6B;;AACpC,eAAK,oBAAL,mBAAsB;AACtB,yBAAqB,KAAK,IAAI;AAC9B,UAAM,qBAAA;AAAA,EACR;AAAA,EAES,QAAQ,SAA+B;AAC9C,QAAI,QAAQ,IAAI,UAAU,GAAG;AAC3B,WAAK,SAAS,iBAAiB,cAA6B,KAAK,UAAU,IAAI,CAAC;AAChF,WAAK,iBAAA;AACL,WAAK,oBAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA,EAGQ,sBAA4B;AAClC,QACE,KAAK,oBACL,KAAK,OAAO,WAAW,cACvB,CAAC,KAAK,OAAO,eACb;AACA;AAAA,IACF;AACA,SAAK,mBAAmB;AACxB,SAAK,OAAO,+BAA+B,EAAE,KAAK,MAAM,KAAK,eAAe;AAAA,EAC9E;AAAA,EAEQ,iBAAuB;AAC7B,yBAAqB,KAAK,IAAI;AAC9B,SAAK,OAAO,sBAAsB,MAAM,KAAK,kBAAkB;AAAA,EACjE;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,SAAS,KAAK,OAAO;AAC3B,UAAM,QACJ,WAAW,aAAa,KAAK,OAAO,WAAW,SAAS,KAAK,OAAO,MAAM;AAC5E,UAAM,UAAU,kBAAkB,KAAK,aAAa,KAAK,IAAI,OAAO,CAAC,CAAC;AACtE,UAAM,aAAa,qBAAqB,SAAS,KAAK;AACtD,UAAM,QAAQ;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IAAA;AAEP,QAAI,YAAY,KAAK,aAAc,MAAK,eAAe;AACvD,QAAI,eAAe,KAAK,YAAa,MAAK,cAAc;AACxD,QAAI,UAAU,KAAK,eAAgB,MAAK,iBAAiB;AAAA,EAC3D;AAAA,EAEQ,YAAY,MAAoB;AACtC,QAAI,CAAC,KAAK,OAAQ,QAAO;AACzB,WAAO;AAAA,6CACkC,KAAK,OAAO,OAAO,IAAI,KAAK,OAAO,IAAI;AAAA;AAAA,EAElF;AAAA,EAEQ,YAAY,MAAoB;AACtC,UAAM,QAAQ,KAAK;AACnB,UAAM,YAAW,+BAAO,cAAa,UAAU,MAAM;AACrD,UAAM,aAAY,+BAAO,cAAa,WAAW,MAAM;AACvD,UAAM,gBAAgB,QAAQ,KAAK,kBAAkB,KAAK,SAAS;AAEnE,WAAO;AAAA;AAAA,UAED,WAAW,8BAA8B,QAAQ,YAAY,OAAO;AAAA,gCAC9C,KAAK,KAAK;AAAA,UAChC,KAAK,SAAS,gCAAgC,KAAK,MAAM,YAAY,OAAO;AAAA,UAC5E,YAAY,8BAA8B,SAAS,YAAY,OAAO;AAAA,UACtE,gBACE;AAAA;AAAA;AAAA,kBAGM,KAAK,SAAS;AAAA;AAAA,gBAGpB,OAAO;AAAA;AAAA;AAAA,EAGjB;AAAA,EAEQ,WAAW,MAAoB,MAAmB;AACxD,UAAM,WAAW,CAAC,KAAK;AACvB,UAAM,kBAAkB,QAAQ,KAAK,MAAM,MAAM,SAAS,YAAY,SAAS;AAC/E,UAAM,kBAAkB,QAAQ,KAAK,MAAM,KAAK,CAAC;AAEjD,WAAO;AAAA,4CACiC,IAAI,eAAe,KAAK,IAAI;AAAA,UAC9D,YAAY,kBACV;AAAA;AAAA,kBAEM,WAAW,2BAA2B,KAAK,IAAI,SAAS,mBAAmB;AAAA,kBAC3E,kBAAkB,KAAK,YAAY,IAAI,IAAI,OAAO;AAAA;AAAA,gBAGxD,OAAO;AAAA,UACT,KAAK,YAAY,IAAI,CAAC;AAAA,UACtB,mBAAmB,KAAK,WACtB;AAAA;AAAA,kBAEM,kBAAkB,KAAK,YAAY,IAAI,IAAI,OAAO;AAAA,kBAClD,KAAK,WAAW,+BAA+B,KAAK,QAAQ,SAAS,OAAO;AAAA;AAAA,gBAGlF,OAAO;AAAA;AAAA;AAAA,EAGjB;AAAA,EAEQ,eAAe;AACrB,UAAM,EAAE,QAAQ,eAAe,UAAA,IAAc,KAAK;AAClD,UAAM,YAAY,QAAQ,UAAU,OAAO,MAAM,EAAE,MAAM;AACzD,UAAM,UACJ,iBAAiB,YACb,IAAI,KAAK,SAAS,EAAE,mBAAmB,OAAO,IAC9C;AACN,QAAI,CAAC,aAAa,CAAC,QAAS,QAAO;AAEnC,WAAO;AAAA;AAAA,UAED,YACE;AAAA;AAAA;AAAA,iDAGqC,MAAM;AAAA;AAAA,gBAG3C,mBAAmB;AAAA,UACrB,UACE;AAAA;AAAA;AAAA,iDAGqC,OAAO;AAAA;AAAA,gBAG5C,OAAO;AAAA;AAAA;AAAA,EAGjB;AAAA,EAEQ,iBAAiB;AACvB,UAAM,OAAO,KAAK,OAAO;AACzB,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,MAAM,KAAK,OAAO;AACxB,UAAM,YACJ,OAAO,OAAO,QAAQ,WAClB,uBAAuB,EAAE,eAAe,IAAA,CAAK,IAC7C;AACN,UAAM,aAAa,KAAK,OAAO;AAC/B,UAAM,kBACJ,WAAW,SAAS,IAChB,SAAS;AAAA,MACP,qBAAqB,UAAU,KAAK,YAAY,YAAY,kBAAkB;AAAA,IAAA,CAC/E,IACD;AAEN,WAAO;AAAA;AAAA;AAAA,kEAGuD,KAAK,IAAI;AAAA;AAAA,oCAEvC,KAAK,IAAI;AAAA,gBAC7B,KAAK,YAAY,IAAI,CAAC;AAAA;AAAA,yDAEmB,KAAK,cAAc;AAAA,gDAC5B,KAAK,YAAY,IAAI,CAAC;AAAA,gBACtD,OAAO,YACL;AAAA;AAAA;AAAA,+BAGa,KAAK,UAAU,GAAG,CAAC;AAAA,qCACb,SAAS;AAAA,gCACd,KAAK,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAQxB,OAAO;AAAA;AAAA;AAAA;AAAA,UAIf,WAAW,SACT;AAAA;AAAA;AAAA,8BAGkB,KAAK,WAAW;AAAA,wBACtB,eAAe;AAAA;AAAA,kBAErB,WAAW,IAAI,CAAC,SAAS,KAAK,WAAW,MAAM,YAAY,CAAC,CAAC;AAAA;AAAA,gBAGnE,OAAO;AAAA;AAAA;AAAA,EAGjB;AAAA,EAES,SAAS;AAChB,UAAM,QAAQ,KAAK;AACnB,UAAM,SAAS,MAAM;AACrB,UAAM,SAAS,WAAW;AAC1B,UAAM,QAAQ,MAAM;AAEpB,UAAM,YACJ,WAAW,SACP,SAAS;AAAA,MACP,qBAAqB,UAAU,KAAK,YAAY,YAAY,kBAAkB;AAAA,IAAA,CAC/E,IACD;AAEN,WAAO;AAAA,0CAC+B,MAAM,gBAAgB,SAAS,SAAS,OAAO;AAAA,UAC/E,QAAQ,sCAAsC,KAAK,WAAW,OAAO;AAAA,UACrE,WAAW,UACT,6CACA,WAAW,aACT,KAAK,mBACL;AAAA;AAAA;AAAA,gCAGkB,SAAS,WAAW,MAAM;AAAA,gCAC1B,KAAK,WAAW;AAAA,0BACtB,SAAS;AAAA;AAAA,oBAEf,MAAM,MAAM;AAAA,MAAI,CAAC,SACjB,KAAK,WAAW,MAAM,SAAS,WAAW,MAAM;AAAA,IAAA,CACjD;AAAA;AAAA,eAEJ;AAAA,UACL,KAAK,cAAc;AAAA,UACnB,KAAK,yBAAyB;AAAA;AAAA;AAAA,EAGtC;AACF;AAtQa,gBACK,SAAS,CAAC,iBAAiB,gBAAgB;AAG3D,gBAAA;AAAA,EADC,SAAS,EAAE,MAAM,QAAQ,WAAW,SAAS;AAAA,GAHnC,gBAIX,WAAA,SAAA,CAAA;AAGQ,gBAAA;AAAA,EADP,MAAA;AAAM,GANI,gBAOH,WAAA,UAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GATI,gBAUH,WAAA,gBAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GAZI,gBAaH,WAAA,eAAA,CAAA;AAGA,gBAAA;AAAA,EADP,MAAA;AAAM,GAfI,gBAgBH,WAAA,kBAAA,CAAA;AAhBG,kBAAN,gBAAA;AAAA,EADN,cAAc,mBAAmB;AAAA,GACrB,eAAA;AAwQN,SAAS,oBAA0B;AACxC,MAAI,CAAC,eAAe,IAAI,mBAAmB,GAAG;AAC5C,mBAAe,OAAO,qBAAqB,eAAe;AAAA,EAC5D;AACF;"}
@@ -1,4 +1,4 @@
1
1
  export { Ui9000KpiWidget, registerKpiWidget } from './element/ui9000-kpi-widget.js';
2
- export { normalizeKpiData, extractCardsFromKpi, formatKpiValue, getKpiGridColumns, getKpiGridScrollAxis, MIN_KPI_CELL_WIDTH, type KpiCardModel, type KpiGridScrollAxis, type KpiValueLabel, type KpiWidgetData, type KpiWidgetModel, type RawKpiItem, } from './lib/index.js';
2
+ export { normalizeKpiData, extractCardsFromKpi, isAdvancedKpiItem, formatKpiValue, splitFormattedKpiValue, getKpiGridColumns, getKpiGridScrollAxis, getAdvancedSplitLayout, MIN_KPI_CELL_WIDTH, type AdvancedSplitLayout, type KpiCardModel, type KpiGridScrollAxis, type KpiStatusBadge, type KpiValueLabel, type KpiWidgetData, type KpiWidgetLayout, type KpiWidgetModel, type RawKpiItem, } from './lib/index.js';
3
3
  export { default as kpiWidgetMetadata } from './metadata.json';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/kpi-widget/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/kpi-widget/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,UAAU,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,19 +1,22 @@
1
1
  import { registerKpiWidget } from "./element/ui9000-kpi-widget.js";
2
2
  import { Ui9000KpiWidget } from "./element/ui9000-kpi-widget.js";
3
3
  import { default as default2 } from "./metadata.json.js";
4
- import { MIN_KPI_CELL_WIDTH, getKpiGridColumns, getKpiGridScrollAxis } from "./lib/grid.js";
5
- import { extractCardsFromKpi } from "./lib/extract.js";
6
- import { formatKpiValue } from "./lib/format.js";
4
+ import { MIN_KPI_CELL_WIDTH, getAdvancedSplitLayout, getKpiGridColumns, getKpiGridScrollAxis } from "./lib/grid.js";
5
+ import { extractCardsFromKpi, isAdvancedKpiItem } from "./lib/extract.js";
6
+ import { formatKpiValue, splitFormattedKpiValue } from "./lib/format.js";
7
7
  import { normalizeKpiData } from "./lib/normalize.js";
8
8
  export {
9
9
  MIN_KPI_CELL_WIDTH,
10
10
  Ui9000KpiWidget,
11
11
  extractCardsFromKpi,
12
12
  formatKpiValue,
13
+ getAdvancedSplitLayout,
13
14
  getKpiGridColumns,
14
15
  getKpiGridScrollAxis,
16
+ isAdvancedKpiItem,
15
17
  default2 as kpiWidgetMetadata,
16
18
  normalizeKpiData,
17
- registerKpiWidget
19
+ registerKpiWidget,
20
+ splitFormattedKpiValue
18
21
  };
19
22
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,8 @@
1
- import { KpiCardModel, RawKpiItem } from './types.js';
1
+ import { KpiCardModel, RawKpiItem, RawKpiVisualisation } from './types.js';
2
+ export declare function isAdvancedKpiItem(kpi: RawKpiItem): boolean;
3
+ export declare function visualisationChartType(kpi: {
4
+ visualisation?: RawKpiVisualisation | null;
5
+ }): string | undefined;
2
6
  /** Map one FuseDash / MCP KPI item to display cards (mirrors KPIComponentWrapper). */
3
7
  export declare function extractCardsFromKpi(kpi: RawKpiItem): KpiCardModel[];
4
8
  //# sourceMappingURL=extract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/extract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAiB,UAAU,EAAE,MAAM,YAAY,CAAC;AAsB1E,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,YAAY,EAAE,CA4EnE"}
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/extract.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,YAAY,EAIZ,UAAU,EACV,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAuEpB,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAM1D;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE;IAC1C,aAAa,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC5C,GAAG,MAAM,GAAG,SAAS,CAKrB;AAED,sFAAsF;AACtF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,YAAY,EAAE,CAyGnE"}
@@ -1,4 +1,5 @@
1
- import { formatKpiValue } from "./format.js";
1
+ import { formatKpiValue, splitFormattedKpiValue } from "./format.js";
2
+ const HIGH_LOW_TYPES = /* @__PURE__ */ new Set(["high/low", "high/low_overall", "high/low_trend"]);
2
3
  function valueLabel(axisInfo) {
3
4
  if (!axisInfo || typeof axisInfo !== "object") return void 0;
4
5
  const info = axisInfo;
@@ -10,6 +11,51 @@ function valueLabel(axisInfo) {
10
11
  function asRecord(value) {
11
12
  return value != null && typeof value === "object" && !Array.isArray(value) ? value : null;
12
13
  }
14
+ function formatDisplay(raw) {
15
+ const formatted = formatKpiValue(raw);
16
+ const split = splitFormattedKpiValue(formatted);
17
+ return split.suffix ? split : { value: formatted };
18
+ }
19
+ function percentLabel(raw) {
20
+ const n = Number(raw);
21
+ if (!Number.isFinite(n) || n === 0) return void 0;
22
+ return `${n.toFixed(2)}%`;
23
+ }
24
+ function statusFromKpi(kpi) {
25
+ var _a, _b;
26
+ if (kpi.kpiKind === "mission") {
27
+ return { text: "Mission", variant: "Mission" };
28
+ }
29
+ if (kpi.kpiKind === "goal") {
30
+ return kpi.targetStatus === "on_target" ? { text: "On target", variant: "OnTarget" } : { text: "Off target", variant: "OffTarget" };
31
+ }
32
+ const raw = (_a = kpi.status) == null ? void 0 : _a.trim();
33
+ if (!raw) return void 0;
34
+ const text = ((_b = raw.split("=")[0]) == null ? void 0 : _b.trim()) || raw;
35
+ const lower = raw.toLowerCase();
36
+ const variant = lower.includes("good") ? "Good" : lower.includes("low") ? "Low" : "Normal";
37
+ return { text, variant };
38
+ }
39
+ function withMeta(card, kpi) {
40
+ const scoreValue = kpi.kpiKind && typeof kpi.score === "number" ? `${kpi.score.toFixed(1)}%` : void 0;
41
+ return {
42
+ ...card,
43
+ ...scoreValue ? { value: scoreValue, suffix: void 0 } : {},
44
+ status: statusFromKpi(kpi),
45
+ showPercentage: Boolean(kpi.showPercentage)
46
+ };
47
+ }
48
+ function isAdvancedKpiItem(kpi) {
49
+ return Boolean(
50
+ kpi.supportingKpis || kpi.showVisualisation || kpi.variant === "advanced" && kpi.visualisation
51
+ );
52
+ }
53
+ function visualisationChartType(kpi) {
54
+ const viz = kpi.visualisation;
55
+ if (!viz || typeof viz !== "object") return void 0;
56
+ const type = viz.chartType ?? viz.chart_type;
57
+ return typeof type === "string" && type.trim() ? type.trim() : void 0;
58
+ }
13
59
  function extractCardsFromKpi(kpi) {
14
60
  var _a;
15
61
  const column = kpi.column ?? "value";
@@ -22,41 +68,62 @@ function extractCardsFromKpi(kpi) {
22
68
  const type = kpi.type ?? "single_value";
23
69
  const baseId = kpi.id ?? kpi.name ?? column;
24
70
  const baseName = kpi.name ?? column;
71
+ const showPct = Boolean(kpi.showPercentage);
25
72
  if (type === "trend" || type === "overall") {
26
- const pct = dataRow.percentage;
73
+ const display = formatDisplay(dataRow[fieldKey] ?? dataRow[column]);
74
+ const subtitle = typeof dataRow.subtitle === "string" ? dataRow.subtitle : void 0;
27
75
  return [
28
- {
29
- id: baseId,
30
- name: baseName,
31
- value: formatKpiValue(dataRow[fieldKey]),
32
- indicator: Number(pct) ? `${Number(pct).toFixed(2)}%` : void 0,
33
- label
34
- }
76
+ withMeta(
77
+ {
78
+ id: String(baseId),
79
+ name: baseName,
80
+ value: display.value,
81
+ suffix: display.suffix,
82
+ indicator: showPct ? percentLabel(dataRow.percentage) : void 0,
83
+ subtitle,
84
+ label
85
+ },
86
+ kpi
87
+ )
35
88
  ];
36
89
  }
37
90
  if (type === "comparison") {
38
91
  const current = asRecord(dataRow.current);
39
- const pct = dataRow.percentage;
92
+ const previous = asRecord(dataRow.previous);
93
+ const display = formatDisplay((current == null ? void 0 : current[fieldKey]) ?? (current == null ? void 0 : current[column]));
94
+ const prevRaw = (previous == null ? void 0 : previous[fieldKey]) ?? (previous == null ? void 0 : previous[column]);
95
+ const subtitle = prevRaw != null && prevRaw !== "" ? `vs ${formatKpiValue(prevRaw)}` : void 0;
40
96
  return [
41
- {
42
- id: baseId,
43
- name: baseName,
44
- value: formatKpiValue(current == null ? void 0 : current[fieldKey]),
45
- indicator: Number(pct) ? `${Number(pct).toFixed(2)}%` : void 0,
46
- label
47
- }
97
+ withMeta(
98
+ {
99
+ id: String(baseId),
100
+ name: baseName,
101
+ value: display.value,
102
+ suffix: display.suffix,
103
+ indicator: showPct ? percentLabel(dataRow.percentage) : void 0,
104
+ subtitle,
105
+ label
106
+ },
107
+ kpi
108
+ )
48
109
  ];
49
110
  }
50
111
  if (type === "single_value") {
51
112
  const valueBucket = asRecord(dataRow.value) ?? dataRow;
52
113
  const raw = valueBucket[fieldKey] ?? valueBucket[column] ?? Object.values(valueBucket)[0];
114
+ const display = formatDisplay(raw);
53
115
  return [
54
- {
55
- id: baseId,
56
- name: baseName,
57
- value: formatKpiValue(raw),
58
- label
59
- }
116
+ withMeta(
117
+ {
118
+ id: String(baseId),
119
+ name: baseName,
120
+ value: display.value,
121
+ suffix: display.suffix,
122
+ indicator: showPct ? percentLabel(dataRow.percentage) : void 0,
123
+ label
124
+ },
125
+ kpi
126
+ )
60
127
  ];
61
128
  }
62
129
  const cards = [];
@@ -64,20 +131,29 @@ function extractCardsFromKpi(kpi) {
64
131
  if (key === "percentage" || key === "value") continue;
65
132
  const local = asRecord(dataRow[key]);
66
133
  if (!local) continue;
67
- const subtitle = kpi.groupBy ? String(local[kpi.groupBy] ?? key) : key;
68
- const indicator = Number(local.percentage) ? `${Number(local.percentage).toFixed(2)}%` : void 0;
69
- cards.push({
70
- id: `${baseId}-${key}`,
71
- name: baseName,
72
- value: formatKpiValue(local[fieldKey]),
73
- subtitle,
74
- indicator,
75
- label
76
- });
134
+ const subtitle = kpi.groupBy ? String(local[kpi.groupBy] ?? key) : HIGH_LOW_TYPES.has(type) ? key : void 0;
135
+ const raw = local[fieldKey] ?? local[column];
136
+ const display = formatDisplay(raw);
137
+ cards.push(
138
+ withMeta(
139
+ {
140
+ id: `${baseId}-${key}`,
141
+ name: baseName,
142
+ value: display.value,
143
+ suffix: display.suffix,
144
+ indicator: showPct ? percentLabel(local.percentage) : void 0,
145
+ subtitle,
146
+ label
147
+ },
148
+ kpi
149
+ )
150
+ );
77
151
  }
78
152
  return cards;
79
153
  }
80
154
  export {
81
- extractCardsFromKpi
155
+ extractCardsFromKpi,
156
+ isAdvancedKpiItem,
157
+ visualisationChartType
82
158
  };
83
159
  //# sourceMappingURL=extract.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extract.js","sources":["../../../../src/components/kpi-widget/lib/extract.ts"],"sourcesContent":["import { formatKpiValue } from './format.js';\nimport type { KpiCardModel, KpiValueLabel, RawKpiItem } from './types.js';\n\ntype AxisInfo = NonNullable<RawKpiItem['axisDetails']>[string];\n\nfunction valueLabel(axisInfo: AxisInfo | undefined): KpiValueLabel | undefined {\n if (!axisInfo || typeof axisInfo !== 'object') return undefined;\n const info = axisInfo;\n return {\n position: info.measure_unit_type === 'currency' ? 'left' : 'right',\n text:\n info.measure_unit_type === 'currency'\n ? (info.measure_unit_symbol ?? '')\n : (info.measure_unit ?? ''),\n };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\n/** Map one FuseDash / MCP KPI item to display cards (mirrors KPIComponentWrapper). */\nexport function extractCardsFromKpi(kpi: RawKpiItem): KpiCardModel[] {\n const column = kpi.column ?? 'value';\n const aggregation = kpi.aggregations ?? 'sum';\n const fieldKey = `${aggregation}_${column}`;\n const dataRow = Array.isArray(kpi.data) ? asRecord(kpi.data[0]) : null;\n if (!dataRow) return [];\n\n const axisInfo = kpi.axisDetails?.[column];\n const label = valueLabel(axisInfo);\n const type = kpi.type ?? 'single_value';\n const baseId = kpi.id ?? kpi.name ?? column;\n const baseName = kpi.name ?? column;\n\n if (type === 'trend' || type === 'overall') {\n const pct = dataRow.percentage;\n return [\n {\n id: baseId,\n name: baseName,\n value: formatKpiValue(dataRow[fieldKey] as number | string),\n indicator: Number(pct) ? `${Number(pct).toFixed(2)}%` : undefined,\n label,\n },\n ];\n }\n\n if (type === 'comparison') {\n const current = asRecord(dataRow.current);\n const pct = dataRow.percentage;\n return [\n {\n id: baseId,\n name: baseName,\n value: formatKpiValue(current?.[fieldKey] as number | string),\n indicator: Number(pct) ? `${Number(pct).toFixed(2)}%` : undefined,\n label,\n },\n ];\n }\n\n if (type === 'single_value') {\n const valueBucket = asRecord(dataRow.value) ?? dataRow;\n const raw =\n valueBucket[fieldKey] ??\n valueBucket[column] ??\n Object.values(valueBucket)[0];\n return [\n {\n id: baseId,\n name: baseName,\n value: formatKpiValue(raw as number | string),\n label,\n },\n ];\n }\n\n const cards: KpiCardModel[] = [];\n for (const key of Object.keys(dataRow)) {\n if (key === 'percentage' || key === 'value') continue;\n const local = asRecord(dataRow[key]);\n if (!local) continue;\n const subtitle = kpi.groupBy ? String(local[kpi.groupBy] ?? key) : key;\n const indicator = Number(local.percentage)\n ? `${Number(local.percentage).toFixed(2)}%`\n : undefined;\n cards.push({\n id: `${baseId}-${key}`,\n name: baseName,\n value: formatKpiValue(local[fieldKey] as number | string),\n subtitle,\n indicator,\n label,\n });\n }\n\n return cards;\n}\n"],"names":[],"mappings":";AAKA,SAAS,WAAW,UAA2D;AAC7E,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,QAAM,OAAO;AACb,SAAO;AAAA,IACL,UAAU,KAAK,sBAAsB,aAAa,SAAS;AAAA,IAC3D,MACE,KAAK,sBAAsB,aACtB,KAAK,uBAAuB,KAC5B,KAAK,gBAAgB;AAAA,EAAA;AAEhC;AAEA,SAAS,SAAS,OAAgD;AAChE,SAAO,SAAS,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACpE,QACD;AACN;AAGO,SAAS,oBAAoB,KAAiC;;AACnE,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,cAAc,IAAI,gBAAgB;AACxC,QAAM,WAAW,GAAG,WAAW,IAAI,MAAM;AACzC,QAAM,UAAU,MAAM,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,KAAK,CAAC,CAAC,IAAI;AAClE,MAAI,CAAC,QAAS,QAAO,CAAA;AAErB,QAAM,YAAW,SAAI,gBAAJ,mBAAkB;AACnC,QAAM,QAAQ,WAAW,QAAQ;AACjC,QAAM,OAAO,IAAI,QAAQ;AACzB,QAAM,SAAS,IAAI,MAAM,IAAI,QAAQ;AACrC,QAAM,WAAW,IAAI,QAAQ;AAE7B,MAAI,SAAS,WAAW,SAAS,WAAW;AAC1C,UAAM,MAAM,QAAQ;AACpB,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,eAAe,QAAQ,QAAQ,CAAoB;AAAA,QAC1D,WAAW,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,MAAM;AAAA,QACxD;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,SAAS,cAAc;AACzB,UAAM,UAAU,SAAS,QAAQ,OAAO;AACxC,UAAM,MAAM,QAAQ;AACpB,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,eAAe,mCAAU,SAA4B;AAAA,QAC5D,WAAW,OAAO,GAAG,IAAI,GAAG,OAAO,GAAG,EAAE,QAAQ,CAAC,CAAC,MAAM;AAAA,QACxD;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AAEA,MAAI,SAAS,gBAAgB;AAC3B,UAAM,cAAc,SAAS,QAAQ,KAAK,KAAK;AAC/C,UAAM,MACJ,YAAY,QAAQ,KACpB,YAAY,MAAM,KAClB,OAAO,OAAO,WAAW,EAAE,CAAC;AAC9B,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,eAAe,GAAsB;AAAA,QAC5C;AAAA,MAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,QAAwB,CAAA;AAC9B,aAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,QAAI,QAAQ,gBAAgB,QAAQ,QAAS;AAC7C,UAAM,QAAQ,SAAS,QAAQ,GAAG,CAAC;AACnC,QAAI,CAAC,MAAO;AACZ,UAAM,WAAW,IAAI,UAAU,OAAO,MAAM,IAAI,OAAO,KAAK,GAAG,IAAI;AACnE,UAAM,YAAY,OAAO,MAAM,UAAU,IACrC,GAAG,OAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,CAAC,MACtC;AACJ,UAAM,KAAK;AAAA,MACT,IAAI,GAAG,MAAM,IAAI,GAAG;AAAA,MACpB,MAAM;AAAA,MACN,OAAO,eAAe,MAAM,QAAQ,CAAoB;AAAA,MACxD;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"extract.js","sources":["../../../../src/components/kpi-widget/lib/extract.ts"],"sourcesContent":["import {\n formatKpiValue,\n splitFormattedKpiValue,\n} from './format.js';\nimport type {\n KpiCardModel,\n KpiStatusBadge,\n KpiStatusVariant,\n KpiValueLabel,\n RawKpiItem,\n RawKpiVisualisation,\n} from './types.js';\n\ntype AxisInfo = NonNullable<RawKpiItem['axisDetails']>[string];\n\nconst HIGH_LOW_TYPES = new Set(['high/low', 'high/low_overall', 'high/low_trend']);\n\nfunction valueLabel(axisInfo: AxisInfo | undefined): KpiValueLabel | undefined {\n if (!axisInfo || typeof axisInfo !== 'object') return undefined;\n const info = axisInfo;\n return {\n position: info.measure_unit_type === 'currency' ? 'left' : 'right',\n text:\n info.measure_unit_type === 'currency'\n ? (info.measure_unit_symbol ?? '')\n : (info.measure_unit ?? ''),\n };\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value != null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction formatDisplay(raw: unknown): { value: string; suffix?: string } {\n const formatted = formatKpiValue(raw as number | string);\n const split = splitFormattedKpiValue(formatted);\n return split.suffix ? split : { value: formatted };\n}\n\nfunction percentLabel(raw: unknown): string | undefined {\n const n = Number(raw);\n if (!Number.isFinite(n) || n === 0) return undefined;\n return `${n.toFixed(2)}%`;\n}\n\nfunction statusFromKpi(kpi: RawKpiItem): KpiStatusBadge | undefined {\n if (kpi.kpiKind === 'mission') {\n return { text: 'Mission', variant: 'Mission' };\n }\n if (kpi.kpiKind === 'goal') {\n return kpi.targetStatus === 'on_target'\n ? { text: 'On target', variant: 'OnTarget' }\n : { text: 'Off target', variant: 'OffTarget' };\n }\n const raw = kpi.status?.trim();\n if (!raw) return undefined;\n const text = raw.split('=')[0]?.trim() || raw;\n const lower = raw.toLowerCase();\n const variant: KpiStatusVariant = lower.includes('good')\n ? 'Good'\n : lower.includes('low')\n ? 'Low'\n : 'Normal';\n return { text, variant };\n}\n\nfunction withMeta(\n card: Omit<KpiCardModel, 'status' | 'showPercentage'>,\n kpi: RawKpiItem,\n): KpiCardModel {\n const scoreValue =\n kpi.kpiKind && typeof kpi.score === 'number' ? `${kpi.score.toFixed(1)}%` : undefined;\n return {\n ...card,\n ...(scoreValue ? { value: scoreValue, suffix: undefined } : {}),\n status: statusFromKpi(kpi),\n showPercentage: Boolean(kpi.showPercentage),\n };\n}\n\nexport function isAdvancedKpiItem(kpi: RawKpiItem): boolean {\n return Boolean(\n kpi.supportingKpis ||\n kpi.showVisualisation ||\n (kpi.variant === 'advanced' && kpi.visualisation),\n );\n}\n\nexport function visualisationChartType(kpi: {\n visualisation?: RawKpiVisualisation | null;\n}): string | undefined {\n const viz = kpi.visualisation;\n if (!viz || typeof viz !== 'object') return undefined;\n const type = viz.chartType ?? viz.chart_type;\n return typeof type === 'string' && type.trim() ? type.trim() : undefined;\n}\n\n/** Map one FuseDash / MCP KPI item to display cards (mirrors KPIComponentWrapper). */\nexport function extractCardsFromKpi(kpi: RawKpiItem): KpiCardModel[] {\n const column = kpi.column ?? 'value';\n const aggregation = kpi.aggregations ?? 'sum';\n const fieldKey = `${aggregation}_${column}`;\n const dataRow = Array.isArray(kpi.data) ? asRecord(kpi.data[0]) : null;\n if (!dataRow) return [];\n\n const axisInfo = kpi.axisDetails?.[column];\n const label = valueLabel(axisInfo);\n const type = kpi.type ?? 'single_value';\n const baseId = kpi.id ?? kpi.name ?? column;\n const baseName = kpi.name ?? column;\n const showPct = Boolean(kpi.showPercentage);\n\n if (type === 'trend' || type === 'overall') {\n const display = formatDisplay(dataRow[fieldKey] ?? dataRow[column]);\n const subtitle = typeof dataRow.subtitle === 'string' ? dataRow.subtitle : undefined;\n return [\n withMeta(\n {\n id: String(baseId),\n name: baseName,\n value: display.value,\n suffix: display.suffix,\n indicator: showPct ? percentLabel(dataRow.percentage) : undefined,\n subtitle,\n label,\n },\n kpi,\n ),\n ];\n }\n\n if (type === 'comparison') {\n const current = asRecord(dataRow.current);\n const previous = asRecord(dataRow.previous);\n const display = formatDisplay(current?.[fieldKey] ?? current?.[column]);\n const prevRaw = previous?.[fieldKey] ?? previous?.[column];\n const subtitle =\n prevRaw != null && prevRaw !== '' ? `vs ${formatKpiValue(prevRaw as number | string)}` : undefined;\n return [\n withMeta(\n {\n id: String(baseId),\n name: baseName,\n value: display.value,\n suffix: display.suffix,\n indicator: showPct ? percentLabel(dataRow.percentage) : undefined,\n subtitle,\n label,\n },\n kpi,\n ),\n ];\n }\n\n if (type === 'single_value') {\n const valueBucket = asRecord(dataRow.value) ?? dataRow;\n const raw =\n valueBucket[fieldKey] ?? valueBucket[column] ?? Object.values(valueBucket)[0];\n const display = formatDisplay(raw);\n return [\n withMeta(\n {\n id: String(baseId),\n name: baseName,\n value: display.value,\n suffix: display.suffix,\n indicator: showPct ? percentLabel(dataRow.percentage) : undefined,\n label,\n },\n kpi,\n ),\n ];\n }\n\n const cards: KpiCardModel[] = [];\n for (const key of Object.keys(dataRow)) {\n if (key === 'percentage' || key === 'value') continue;\n const local = asRecord(dataRow[key]);\n if (!local) continue;\n const subtitle = kpi.groupBy\n ? String(local[kpi.groupBy] ?? key)\n : HIGH_LOW_TYPES.has(type)\n ? key\n : undefined;\n const raw = local[fieldKey] ?? local[column];\n const display = formatDisplay(raw);\n cards.push(\n withMeta(\n {\n id: `${baseId}-${key}`,\n name: baseName,\n value: display.value,\n suffix: display.suffix,\n indicator: showPct ? percentLabel(local.percentage) : undefined,\n subtitle,\n label,\n },\n kpi,\n ),\n );\n }\n\n return cards;\n}\n"],"names":[],"mappings":"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"}
@@ -1,3 +1,8 @@
1
1
  /** Port of FuseDash `formatKpiValue` (client/libs/shared/utils/kpi.ts). */
2
2
  export declare function formatKpiValue(value: number | string, decimals?: number): string;
3
+ /** Split compact scientific notation so the exponent can render as a suffix. */
4
+ export declare function splitFormattedKpiValue(formatted: string): {
5
+ value: string;
6
+ suffix: string;
7
+ };
3
8
  //# sourceMappingURL=format.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/format.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CA4B3E"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/format.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,SAAI,GAAG,MAAM,CA4B3E;AAED,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAOA"}
@@ -18,7 +18,16 @@ function formatKpiValue(value, decimals = 2) {
18
18
  const formattedModifiedValue = parseFloat(modifiedValue.toFixed(decimals)).toString();
19
19
  return `${formattedModifiedValue}×10⁻${power}`;
20
20
  }
21
+ function splitFormattedKpiValue(formatted) {
22
+ if (!formatted.includes("×10⁻")) return { value: formatted, suffix: "" };
23
+ const [valuePart, suffixPart] = formatted.split("×10⁻");
24
+ return {
25
+ value: valuePart ?? formatted,
26
+ suffix: suffixPart != null ? `×10⁻${suffixPart}` : ""
27
+ };
28
+ }
21
29
  export {
22
- formatKpiValue
30
+ formatKpiValue,
31
+ splitFormattedKpiValue
23
32
  };
24
33
  //# sourceMappingURL=format.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format.js","sources":["../../../../src/components/kpi-widget/lib/format.ts"],"sourcesContent":["/** Port of FuseDash `formatKpiValue` (client/libs/shared/utils/kpi.ts). */\nexport function formatKpiValue(value: number | string, decimals = 2): string {\n const numericValue = Number(value);\n if (\n Number.isNaN(numericValue) ||\n numericValue === null ||\n !Number.isFinite(numericValue)\n ) {\n return '—';\n }\n\n const absValue = Math.abs(numericValue);\n\n if (absValue === 0) {\n return '0';\n }\n\n if (absValue >= 0.1) {\n return new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumFractionDigits: decimals,\n }).format(numericValue);\n }\n\n const power = Math.ceil(Math.abs(Math.log10(absValue) / 3)) * 3;\n const modifiedValue = numericValue * 10 ** power;\n const formattedModifiedValue = parseFloat(modifiedValue.toFixed(decimals)).toString();\n\n return `${formattedModifiedValue}×10⁻${power}`;\n}\n"],"names":[],"mappings":"AACO,SAAS,eAAe,OAAwB,WAAW,GAAW;AAC3E,QAAM,eAAe,OAAO,KAAK;AACjC,MACE,OAAO,MAAM,YAAY,KACzB,iBAAiB,QACjB,CAAC,OAAO,SAAS,YAAY,GAC7B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,KAAK,IAAI,YAAY;AAEtC,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,KAAK;AACnB,WAAO,IAAI,KAAK,aAAa,SAAS;AAAA,MACpC,UAAU;AAAA,MACV,uBAAuB;AAAA,IAAA,CACxB,EAAE,OAAO,YAAY;AAAA,EACxB;AAEA,QAAM,QAAQ,KAAK,KAAK,KAAK,IAAI,KAAK,MAAM,QAAQ,IAAI,CAAC,CAAC,IAAI;AAC9D,QAAM,gBAAgB,eAAe,MAAM;AAC3C,QAAM,yBAAyB,WAAW,cAAc,QAAQ,QAAQ,CAAC,EAAE,SAAA;AAE3E,SAAO,GAAG,sBAAsB,OAAO,KAAK;AAC9C;"}
1
+ {"version":3,"file":"format.js","sources":["../../../../src/components/kpi-widget/lib/format.ts"],"sourcesContent":["/** Port of FuseDash `formatKpiValue` (client/libs/shared/utils/kpi.ts). */\nexport function formatKpiValue(value: number | string, decimals = 2): string {\n const numericValue = Number(value);\n if (\n Number.isNaN(numericValue) ||\n numericValue === null ||\n !Number.isFinite(numericValue)\n ) {\n return '—';\n }\n\n const absValue = Math.abs(numericValue);\n\n if (absValue === 0) {\n return '0';\n }\n\n if (absValue >= 0.1) {\n return new Intl.NumberFormat('en-US', {\n notation: 'compact',\n maximumFractionDigits: decimals,\n }).format(numericValue);\n }\n\n const power = Math.ceil(Math.abs(Math.log10(absValue) / 3)) * 3;\n const modifiedValue = numericValue * 10 ** power;\n const formattedModifiedValue = parseFloat(modifiedValue.toFixed(decimals)).toString();\n\n return `${formattedModifiedValue}×10⁻${power}`;\n}\n\n/** Split compact scientific notation so the exponent can render as a suffix. */\nexport function splitFormattedKpiValue(formatted: string): {\n value: string;\n suffix: string;\n} {\n if (!formatted.includes('×10⁻')) return { value: formatted, suffix: '' };\n const [valuePart, suffixPart] = formatted.split('×10⁻');\n return {\n value: valuePart ?? formatted,\n suffix: suffixPart != null ? `×10⁻${suffixPart}` : '',\n };\n}\n"],"names":[],"mappings":"AACO,SAAS,eAAe,OAAwB,WAAW,GAAW;AAC3E,QAAM,eAAe,OAAO,KAAK;AACjC,MACE,OAAO,MAAM,YAAY,KACzB,iBAAiB,QACjB,CAAC,OAAO,SAAS,YAAY,GAC7B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,KAAK,IAAI,YAAY;AAEtC,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,KAAK;AACnB,WAAO,IAAI,KAAK,aAAa,SAAS;AAAA,MACpC,UAAU;AAAA,MACV,uBAAuB;AAAA,IAAA,CACxB,EAAE,OAAO,YAAY;AAAA,EACxB;AAEA,QAAM,QAAQ,KAAK,KAAK,KAAK,IAAI,KAAK,MAAM,QAAQ,IAAI,CAAC,CAAC,IAAI;AAC9D,QAAM,gBAAgB,eAAe,MAAM;AAC3C,QAAM,yBAAyB,WAAW,cAAc,QAAQ,QAAQ,CAAC,EAAE,SAAA;AAE3E,SAAO,GAAG,sBAAsB,OAAO,KAAK;AAC9C;AAGO,SAAS,uBAAuB,WAGrC;AACA,MAAI,CAAC,UAAU,SAAS,MAAM,UAAU,EAAE,OAAO,WAAW,QAAQ,GAAA;AACpE,QAAM,CAAC,WAAW,UAAU,IAAI,UAAU,MAAM,MAAM;AACtD,SAAO;AAAA,IACL,OAAO,aAAa;AAAA,IACpB,QAAQ,cAAc,OAAO,OAAO,UAAU,KAAK;AAAA,EAAA;AAEvD;"}
@@ -1,4 +1,9 @@
1
1
  export declare const MIN_KPI_CELL_WIDTH = 90;
2
+ export declare const ADVANCED_KPI_VALUE_PERCENT = 25;
3
+ export declare const ADVANCED_KPI_CHART_PERCENT = 75;
4
+ export type AdvancedSplitLayout = 'horizontal' | 'stacked';
5
+ /** Port of client `getAdvancedSplitLayout` (KpiFlexibleComponent/styles). */
6
+ export declare function getAdvancedSplitLayout(width: number, height: number, previousLayout?: AdvancedSplitLayout): AdvancedSplitLayout;
2
7
  export declare const getPreferredKpiColumnCounts: (kpiCount: number) => number[];
3
8
  export declare const getKpiGridColumns: (containerWidth: number, kpiCount: number, minCellWidth?: number) => number;
4
9
  export type KpiGridScrollAxis = 'vertical' | 'horizontal' | 'both';
@@ -1 +1 @@
1
- {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/grid.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,eAAO,MAAM,2BAA2B,GAAI,UAAU,MAAM,KAAG,MAAM,EAcpE,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,gBAAgB,MAAM,EACtB,UAAU,MAAM,EAChB,eAAc,MAA2B,KACxC,MAWF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;AAEnE,eAAO,MAAM,oBAAoB,GAC/B,aAAa,MAAM,EACnB,UAAU,MAAM,KACf,iBAUF,CAAC"}
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/grid.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,SAAS,CAAC;AAE3D,6EAA6E;AAC7E,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,mBAAkC,GACjD,mBAAmB,CAkBrB;AAED,eAAO,MAAM,2BAA2B,GAAI,UAAU,MAAM,KAAG,MAAM,EAcpE,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,gBAAgB,MAAM,EACtB,UAAU,MAAM,EAChB,eAAc,MAA2B,KACxC,MAWF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;AAEnE,eAAO,MAAM,oBAAoB,GAC/B,aAAa,MAAM,EACnB,UAAU,MAAM,KACf,iBAUF,CAAC"}
@@ -1,4 +1,20 @@
1
1
  const MIN_KPI_CELL_WIDTH = 90;
2
+ const ADVANCED_KPI_VALUE_PERCENT = 25;
3
+ function getAdvancedSplitLayout(width, height, previousLayout = "horizontal") {
4
+ if (width <= 0 || height <= 0) return previousLayout;
5
+ const valueColWidth = width * (ADVANCED_KPI_VALUE_PERCENT / 100);
6
+ const aspectRatio = height / width;
7
+ if (previousLayout === "stacked") {
8
+ if (valueColWidth >= 64 && width >= 200 && aspectRatio <= 1.45) {
9
+ return "horizontal";
10
+ }
11
+ return "stacked";
12
+ }
13
+ if (valueColWidth < 52 || width < 170 || aspectRatio > 1.62) {
14
+ return "stacked";
15
+ }
16
+ return "horizontal";
17
+ }
2
18
  const getPreferredKpiColumnCounts = (kpiCount) => {
3
19
  if (kpiCount <= 1) return [1];
4
20
  const divisors = [];
@@ -30,7 +46,9 @@ const getKpiGridScrollAxis = (gridColumns, kpiCount) => {
30
46
  return "both";
31
47
  };
32
48
  export {
49
+ ADVANCED_KPI_VALUE_PERCENT,
33
50
  MIN_KPI_CELL_WIDTH,
51
+ getAdvancedSplitLayout,
34
52
  getKpiGridColumns,
35
53
  getKpiGridScrollAxis,
36
54
  getPreferredKpiColumnCounts
@@ -1 +1 @@
1
- {"version":3,"file":"grid.js","sources":["../../../../src/components/kpi-widget/lib/grid.ts"],"sourcesContent":["export const MIN_KPI_CELL_WIDTH = 90;\n\nexport const getPreferredKpiColumnCounts = (kpiCount: number): number[] => {\n if (kpiCount <= 1) return [1];\n\n const divisors: number[] = [];\n for (let i = kpiCount; i >= 1; i -= 1) {\n if (kpiCount % i === 0) divisors.push(i);\n }\n\n if (kpiCount % 2 !== 0 && kpiCount > 2 && !divisors.includes(2)) {\n divisors.push(2);\n divisors.sort((a, b) => b - a);\n }\n\n return divisors;\n};\n\nexport const getKpiGridColumns = (\n containerWidth: number,\n kpiCount: number,\n minCellWidth: number = MIN_KPI_CELL_WIDTH,\n): number => {\n if (kpiCount <= 1) return 1;\n if (containerWidth <= 0) return 1;\n\n const maxColumns = Math.max(\n 1,\n Math.min(kpiCount, Math.floor(containerWidth / minCellWidth)),\n );\n\n const preferred = getPreferredKpiColumnCounts(kpiCount);\n return preferred.find((cols) => cols <= maxColumns) ?? 1;\n};\n\nexport type KpiGridScrollAxis = 'vertical' | 'horizontal' | 'both';\n\nexport const getKpiGridScrollAxis = (\n gridColumns: number,\n kpiCount: number,\n): KpiGridScrollAxis => {\n if (kpiCount <= 1) return 'vertical';\n\n const columns = Math.max(1, gridColumns);\n const gridRows = Math.ceil(kpiCount / columns);\n\n if (columns === 1) return 'vertical';\n if (gridRows === 1) return 'horizontal';\n\n return 'both';\n};\n"],"names":[],"mappings":"AAAO,MAAM,qBAAqB;AAE3B,MAAM,8BAA8B,CAAC,aAA+B;AACzE,MAAI,YAAY,EAAG,QAAO,CAAC,CAAC;AAE5B,QAAM,WAAqB,CAAA;AAC3B,WAAS,IAAI,UAAU,KAAK,GAAG,KAAK,GAAG;AACrC,QAAI,WAAW,MAAM,EAAG,UAAS,KAAK,CAAC;AAAA,EACzC;AAEA,MAAI,WAAW,MAAM,KAAK,WAAW,KAAK,CAAC,SAAS,SAAS,CAAC,GAAG;AAC/D,aAAS,KAAK,CAAC;AACf,aAAS,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAC/B;AAEA,SAAO;AACT;AAEO,MAAM,oBAAoB,CAC/B,gBACA,UACA,eAAuB,uBACZ;AACX,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,kBAAkB,EAAG,QAAO;AAEhC,QAAM,aAAa,KAAK;AAAA,IACtB;AAAA,IACA,KAAK,IAAI,UAAU,KAAK,MAAM,iBAAiB,YAAY,CAAC;AAAA,EAAA;AAG9D,QAAM,YAAY,4BAA4B,QAAQ;AACtD,SAAO,UAAU,KAAK,CAAC,SAAS,QAAQ,UAAU,KAAK;AACzD;AAIO,MAAM,uBAAuB,CAClC,aACA,aACsB;AACtB,MAAI,YAAY,EAAG,QAAO;AAE1B,QAAM,UAAU,KAAK,IAAI,GAAG,WAAW;AACvC,QAAM,WAAW,KAAK,KAAK,WAAW,OAAO;AAE7C,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,aAAa,EAAG,QAAO;AAE3B,SAAO;AACT;"}
1
+ {"version":3,"file":"grid.js","sources":["../../../../src/components/kpi-widget/lib/grid.ts"],"sourcesContent":["export const MIN_KPI_CELL_WIDTH = 90;\n\nexport const ADVANCED_KPI_VALUE_PERCENT = 25;\nexport const ADVANCED_KPI_CHART_PERCENT = 75;\n\nexport type AdvancedSplitLayout = 'horizontal' | 'stacked';\n\n/** Port of client `getAdvancedSplitLayout` (KpiFlexibleComponent/styles). */\nexport function getAdvancedSplitLayout(\n width: number,\n height: number,\n previousLayout: AdvancedSplitLayout = 'horizontal',\n): AdvancedSplitLayout {\n if (width <= 0 || height <= 0) return previousLayout;\n\n const valueColWidth = width * (ADVANCED_KPI_VALUE_PERCENT / 100);\n const aspectRatio = height / width;\n\n if (previousLayout === 'stacked') {\n if (valueColWidth >= 64 && width >= 200 && aspectRatio <= 1.45) {\n return 'horizontal';\n }\n return 'stacked';\n }\n\n if (valueColWidth < 52 || width < 170 || aspectRatio > 1.62) {\n return 'stacked';\n }\n\n return 'horizontal';\n}\n\nexport const getPreferredKpiColumnCounts = (kpiCount: number): number[] => {\n if (kpiCount <= 1) return [1];\n\n const divisors: number[] = [];\n for (let i = kpiCount; i >= 1; i -= 1) {\n if (kpiCount % i === 0) divisors.push(i);\n }\n\n if (kpiCount % 2 !== 0 && kpiCount > 2 && !divisors.includes(2)) {\n divisors.push(2);\n divisors.sort((a, b) => b - a);\n }\n\n return divisors;\n};\n\nexport const getKpiGridColumns = (\n containerWidth: number,\n kpiCount: number,\n minCellWidth: number = MIN_KPI_CELL_WIDTH,\n): number => {\n if (kpiCount <= 1) return 1;\n if (containerWidth <= 0) return 1;\n\n const maxColumns = Math.max(\n 1,\n Math.min(kpiCount, Math.floor(containerWidth / minCellWidth)),\n );\n\n const preferred = getPreferredKpiColumnCounts(kpiCount);\n return preferred.find((cols) => cols <= maxColumns) ?? 1;\n};\n\nexport type KpiGridScrollAxis = 'vertical' | 'horizontal' | 'both';\n\nexport const getKpiGridScrollAxis = (\n gridColumns: number,\n kpiCount: number,\n): KpiGridScrollAxis => {\n if (kpiCount <= 1) return 'vertical';\n\n const columns = Math.max(1, gridColumns);\n const gridRows = Math.ceil(kpiCount / columns);\n\n if (columns === 1) return 'vertical';\n if (gridRows === 1) return 'horizontal';\n\n return 'both';\n};\n"],"names":[],"mappings":"AAAO,MAAM,qBAAqB;AAE3B,MAAM,6BAA6B;AAMnC,SAAS,uBACd,OACA,QACA,iBAAsC,cACjB;AACrB,MAAI,SAAS,KAAK,UAAU,EAAG,QAAO;AAEtC,QAAM,gBAAgB,SAAS,6BAA6B;AAC5D,QAAM,cAAc,SAAS;AAE7B,MAAI,mBAAmB,WAAW;AAChC,QAAI,iBAAiB,MAAM,SAAS,OAAO,eAAe,MAAM;AAC9D,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,MAAM,QAAQ,OAAO,cAAc,MAAM;AAC3D,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,MAAM,8BAA8B,CAAC,aAA+B;AACzE,MAAI,YAAY,EAAG,QAAO,CAAC,CAAC;AAE5B,QAAM,WAAqB,CAAA;AAC3B,WAAS,IAAI,UAAU,KAAK,GAAG,KAAK,GAAG;AACrC,QAAI,WAAW,MAAM,EAAG,UAAS,KAAK,CAAC;AAAA,EACzC;AAEA,MAAI,WAAW,MAAM,KAAK,WAAW,KAAK,CAAC,SAAS,SAAS,CAAC,GAAG;AAC/D,aAAS,KAAK,CAAC;AACf,aAAS,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAC/B;AAEA,SAAO;AACT;AAEO,MAAM,oBAAoB,CAC/B,gBACA,UACA,eAAuB,uBACZ;AACX,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,kBAAkB,EAAG,QAAO;AAEhC,QAAM,aAAa,KAAK;AAAA,IACtB;AAAA,IACA,KAAK,IAAI,UAAU,KAAK,MAAM,iBAAiB,YAAY,CAAC;AAAA,EAAA;AAG9D,QAAM,YAAY,4BAA4B,QAAQ;AACtD,SAAO,UAAU,KAAK,CAAC,SAAS,QAAQ,UAAU,KAAK;AACzD;AAIO,MAAM,uBAAuB,CAClC,aACA,aACsB;AACtB,MAAI,YAAY,EAAG,QAAO;AAE1B,QAAM,UAAU,KAAK,IAAI,GAAG,WAAW;AACvC,QAAM,WAAW,KAAK,KAAK,WAAW,OAAO;AAE7C,MAAI,YAAY,EAAG,QAAO;AAC1B,MAAI,aAAa,EAAG,QAAO;AAE3B,SAAO;AACT;"}
@@ -1,6 +1,6 @@
1
- export { normalizeKpiData } from './normalize.js';
2
- export { extractCardsFromKpi } from './extract.js';
3
- export { formatKpiValue } from './format.js';
4
- export { getKpiGridColumns, getKpiGridScrollAxis, MIN_KPI_CELL_WIDTH, type KpiGridScrollAxis, } from './grid.js';
5
- export type { KpiCardModel, KpiValueLabel, KpiWidgetData, KpiWidgetModel, RawKpiItem, } from './types.js';
1
+ export { normalizeKpiData, extractGroupId } from './normalize.js';
2
+ export { extractCardsFromKpi, isAdvancedKpiItem, visualisationChartType } from './extract.js';
3
+ export { formatKpiValue, splitFormattedKpiValue } from './format.js';
4
+ export { getKpiGridColumns, getKpiGridScrollAxis, getAdvancedSplitLayout, MIN_KPI_CELL_WIDTH, ADVANCED_KPI_VALUE_PERCENT, ADVANCED_KPI_CHART_PERCENT, type KpiGridScrollAxis, type AdvancedSplitLayout, } from './grid.js';
5
+ export type { KpiCardModel, KpiCardRole, KpiStatusBadge, KpiStatusVariant, KpiValueLabel, KpiWidgetData, KpiWidgetLayout, KpiWidgetModel, RawKpiItem, RawKpiVisualisation, } from './types.js';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,kBAAkB,EAClB,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EACd,UAAU,GACX,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,0BAA0B,EAC1B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACzB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,YAAY,EACZ,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,EACV,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
@@ -1,4 +1,6 @@
1
1
  import { KpiWidgetData, KpiWidgetModel } from './types.js';
2
+ /** Client `extractGroupId` — groupName is `{label}-group-kpi-ids-{id}`. */
3
+ export declare function extractGroupId(value?: string | null): string;
2
4
  /** Normalize chat / FuseDash KPI payloads into display cards. */
3
5
  export declare function normalizeKpiData(input: KpiWidgetData): KpiWidgetModel;
4
6
  //# sourceMappingURL=normalize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAc,MAAM,YAAY,CAAC;AAiB5E,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAwBrE"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../../../src/components/kpi-widget/lib/normalize.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAc,MAAM,YAAY,CAAC;AAiB5E,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE5D;AAgFD,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CAyBrE"}
@@ -1,34 +1,95 @@
1
- import { extractCardsFromKpi } from "./extract.js";
2
- const EMPTY = { cards: [] };
1
+ import { isAdvancedKpiItem, extractCardsFromKpi } from "./extract.js";
2
+ const EMPTY = { layout: "empty", cards: [], supporting: [] };
3
3
  function isRawKpiItem(input) {
4
- return input != null && typeof input === "object" && !Array.isArray(input) && ("data" in input || "column" in input);
4
+ return input != null && typeof input === "object" && !Array.isArray(input) && ("data" in input || "column" in input || "type" in input);
5
5
  }
6
- function fromItems(items) {
7
- return { cards: items.flatMap((item) => extractCardsFromKpi(item)) };
6
+ function isNormalizedModel(input) {
7
+ return Array.isArray(input.cards) && "layout" in input;
8
+ }
9
+ function extractGroupId(value) {
10
+ var _a;
11
+ return ((_a = value == null ? void 0 : value.split("-group-kpi-ids-")) == null ? void 0 : _a[0]) ?? "";
12
+ }
13
+ function sortItems(items) {
14
+ return [...items].sort((a, b) => {
15
+ if (isAdvancedKpiItem(a) && !isAdvancedKpiItem(b)) return -1;
16
+ if (!isAdvancedKpiItem(a) && isAdvancedKpiItem(b)) return 1;
17
+ return 0;
18
+ });
19
+ }
20
+ function footerFrom(items) {
21
+ const first = items[0];
22
+ return {
23
+ target: first == null ? void 0 : first.target,
24
+ showTimestamp: first == null ? void 0 : first.showTimestamp,
25
+ updatedAt: first == null ? void 0 : first.updatedAt
26
+ };
27
+ }
28
+ function sectionTitle(items, advanced, topName) {
29
+ var _a, _b;
30
+ if (advanced) return void 0;
31
+ if (items.length === 1) return (_a = items[0]) == null ? void 0 : _a.name;
32
+ const grouped = extractGroupId((_b = items[0]) == null ? void 0 : _b.groupName);
33
+ if (grouped) return grouped;
34
+ return (topName == null ? void 0 : topName.trim()) || void 0;
35
+ }
36
+ function buildFromItems(items, topName) {
37
+ if (!items.length) return EMPTY;
38
+ const sorted = sortItems(items);
39
+ const advancedIndex = sorted.findIndex(isAdvancedKpiItem);
40
+ const advanced = advancedIndex >= 0;
41
+ const footer = footerFrom(sorted);
42
+ if (advanced) {
43
+ const mainItem = sorted[advancedIndex];
44
+ const mainCards = extractCardsFromKpi(mainItem);
45
+ const main = mainCards[0];
46
+ const supporting = sorted.filter((_, i) => i !== advancedIndex).flatMap((item) => extractCardsFromKpi(item));
47
+ const viz = mainItem.visualisation && typeof mainItem.visualisation === "object" ? mainItem.visualisation : null;
48
+ return {
49
+ layout: "advanced",
50
+ title: sectionTitle(sorted, true, topName),
51
+ cards: main ? [main, ...supporting] : supporting,
52
+ main,
53
+ supporting,
54
+ visualisation: viz,
55
+ ...footer
56
+ };
57
+ }
58
+ const cards = sorted.flatMap((item) => extractCardsFromKpi(item));
59
+ const hideNames = sorted.length === 1 && cards.length >= 1;
60
+ const titledCards = hideNames ? cards.map((card) => ({ ...card, hideName: true })) : cards;
61
+ const layout = titledCards.length === 0 ? "empty" : titledCards.length === 1 ? "single" : "grid";
62
+ return {
63
+ layout,
64
+ title: sectionTitle(sorted, false, topName),
65
+ cards: titledCards,
66
+ supporting: [],
67
+ ...footer
68
+ };
8
69
  }
9
70
  function normalizeKpiData(input) {
10
71
  if (!input) return EMPTY;
11
72
  if (Array.isArray(input)) {
12
73
  if (!input.length) return EMPTY;
13
- return fromItems(input);
74
+ return buildFromItems(input);
14
75
  }
15
76
  if (typeof input === "object") {
16
- if (Array.isArray(input.cards)) {
17
- return input;
18
- }
77
+ if (isNormalizedModel(input)) return input;
78
+ const topName = typeof input.name === "string" ? input.name : void 0;
19
79
  if (Array.isArray(input.items)) {
20
- return fromItems(input.items);
80
+ return buildFromItems(input.items, topName);
21
81
  }
22
82
  if (Array.isArray(input.kpis)) {
23
- return fromItems(input.kpis);
83
+ return buildFromItems(input.kpis, topName);
24
84
  }
25
85
  if (isRawKpiItem(input)) {
26
- return { cards: extractCardsFromKpi(input) };
86
+ return buildFromItems([input], topName);
27
87
  }
28
88
  }
29
89
  return EMPTY;
30
90
  }
31
91
  export {
92
+ extractGroupId,
32
93
  normalizeKpiData
33
94
  };
34
95
  //# sourceMappingURL=normalize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.js","sources":["../../../../src/components/kpi-widget/lib/normalize.ts"],"sourcesContent":["import { extractCardsFromKpi } from './extract.js';\nimport type { KpiWidgetData, KpiWidgetModel, RawKpiItem } from './types.js';\n\nconst EMPTY: KpiWidgetModel = { cards: [] };\n\nfunction isRawKpiItem(input: unknown): input is RawKpiItem {\n return (\n input != null &&\n typeof input === 'object' &&\n !Array.isArray(input) &&\n ('data' in (input as object) || 'column' in (input as object))\n );\n}\n\nfunction fromItems(items: RawKpiItem[]): KpiWidgetModel {\n return { cards: items.flatMap((item) => extractCardsFromKpi(item)) };\n}\n\n/** Normalize chat / FuseDash KPI payloads into display cards. */\nexport function normalizeKpiData(input: KpiWidgetData): KpiWidgetModel {\n if (!input) return EMPTY;\n\n if (Array.isArray(input)) {\n if (!input.length) return EMPTY;\n return fromItems(input);\n }\n\n if (typeof input === 'object') {\n if (Array.isArray((input as KpiWidgetModel).cards)) {\n return input as KpiWidgetModel;\n }\n if (Array.isArray((input as { items?: RawKpiItem[] }).items)) {\n return fromItems((input as { items: RawKpiItem[] }).items);\n }\n if (Array.isArray((input as { kpis?: RawKpiItem[] }).kpis)) {\n return fromItems((input as { kpis: RawKpiItem[] }).kpis);\n }\n if (isRawKpiItem(input)) {\n return { cards: extractCardsFromKpi(input) };\n }\n }\n\n return EMPTY;\n}\n"],"names":[],"mappings":";AAGA,MAAM,QAAwB,EAAE,OAAO,GAAC;AAExC,SAAS,aAAa,OAAqC;AACzD,SACE,SAAS,QACT,OAAO,UAAU,YACjB,CAAC,MAAM,QAAQ,KAAK,MACnB,UAAW,SAAoB,YAAa;AAEjD;AAEA,SAAS,UAAU,OAAqC;AACtD,SAAO,EAAE,OAAO,MAAM,QAAQ,CAAC,SAAS,oBAAoB,IAAI,CAAC,EAAA;AACnE;AAGO,SAAS,iBAAiB,OAAsC;AACrE,MAAI,CAAC,MAAO,QAAO;AAEnB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,CAAC,MAAM,OAAQ,QAAO;AAC1B,WAAO,UAAU,KAAK;AAAA,EACxB;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,MAAM,QAAS,MAAyB,KAAK,GAAG;AAClD,aAAO;AAAA,IACT;AACA,QAAI,MAAM,QAAS,MAAmC,KAAK,GAAG;AAC5D,aAAO,UAAW,MAAkC,KAAK;AAAA,IAC3D;AACA,QAAI,MAAM,QAAS,MAAkC,IAAI,GAAG;AAC1D,aAAO,UAAW,MAAiC,IAAI;AAAA,IACzD;AACA,QAAI,aAAa,KAAK,GAAG;AACvB,aAAO,EAAE,OAAO,oBAAoB,KAAK,EAAA;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO;AACT;"}
1
+ {"version":3,"file":"normalize.js","sources":["../../../../src/components/kpi-widget/lib/normalize.ts"],"sourcesContent":["import { extractCardsFromKpi, isAdvancedKpiItem } from './extract.js';\nimport type { KpiWidgetData, KpiWidgetModel, RawKpiItem } from './types.js';\n\nconst EMPTY: KpiWidgetModel = { layout: 'empty', cards: [], supporting: [] };\n\nfunction isRawKpiItem(input: unknown): input is RawKpiItem {\n return (\n input != null &&\n typeof input === 'object' &&\n !Array.isArray(input) &&\n ('data' in (input as object) || 'column' in (input as object) || 'type' in (input as object))\n );\n}\n\nfunction isNormalizedModel(input: object): input is KpiWidgetModel {\n return Array.isArray((input as KpiWidgetModel).cards) && 'layout' in input;\n}\n\n/** Client `extractGroupId` — groupName is `{label}-group-kpi-ids-{id}`. */\nexport function extractGroupId(value?: string | null): string {\n return value?.split('-group-kpi-ids-')?.[0] ?? '';\n}\n\nfunction sortItems(items: RawKpiItem[]): RawKpiItem[] {\n return [...items].sort((a, b) => {\n if (isAdvancedKpiItem(a) && !isAdvancedKpiItem(b)) return -1;\n if (!isAdvancedKpiItem(a) && isAdvancedKpiItem(b)) return 1;\n return 0;\n });\n}\n\nfunction footerFrom(items: RawKpiItem[]): Pick<\n KpiWidgetModel,\n 'target' | 'showTimestamp' | 'updatedAt'\n> {\n const first = items[0];\n return {\n target: first?.target,\n showTimestamp: first?.showTimestamp,\n updatedAt: first?.updatedAt,\n };\n}\n\nfunction sectionTitle(\n items: RawKpiItem[],\n advanced: boolean,\n topName?: string,\n): string | undefined {\n if (advanced) return undefined;\n if (items.length === 1) return items[0]?.name;\n const grouped = extractGroupId(items[0]?.groupName);\n if (grouped) return grouped;\n return topName?.trim() || undefined;\n}\n\nfunction buildFromItems(items: RawKpiItem[], topName?: string): KpiWidgetModel {\n if (!items.length) return EMPTY;\n const sorted = sortItems(items);\n const advancedIndex = sorted.findIndex(isAdvancedKpiItem);\n const advanced = advancedIndex >= 0;\n const footer = footerFrom(sorted);\n\n if (advanced) {\n const mainItem = sorted[advancedIndex]!;\n const mainCards = extractCardsFromKpi(mainItem);\n const main = mainCards[0];\n const supporting = sorted\n .filter((_, i) => i !== advancedIndex)\n .flatMap((item) => extractCardsFromKpi(item));\n const viz =\n mainItem.visualisation && typeof mainItem.visualisation === 'object'\n ? (mainItem.visualisation as Record<string, unknown>)\n : null;\n return {\n layout: 'advanced',\n title: sectionTitle(sorted, true, topName),\n cards: main ? [main, ...supporting] : supporting,\n main,\n supporting,\n visualisation: viz,\n ...footer,\n };\n }\n\n const cards = sorted.flatMap((item) => extractCardsFromKpi(item));\n const hideNames = sorted.length === 1 && cards.length >= 1;\n const titledCards = hideNames\n ? cards.map((card) => ({ ...card, hideName: true }))\n : cards;\n const layout: KpiWidgetModel['layout'] =\n titledCards.length === 0 ? 'empty' : titledCards.length === 1 ? 'single' : 'grid';\n\n return {\n layout,\n title: sectionTitle(sorted, false, topName),\n cards: titledCards,\n supporting: [],\n ...footer,\n };\n}\n\n/** Normalize chat / FuseDash KPI payloads into display cards. */\nexport function normalizeKpiData(input: KpiWidgetData): KpiWidgetModel {\n if (!input) return EMPTY;\n\n if (Array.isArray(input)) {\n if (!input.length) return EMPTY;\n return buildFromItems(input);\n }\n\n if (typeof input === 'object') {\n if (isNormalizedModel(input)) return input;\n const topName = typeof (input as { name?: unknown }).name === 'string'\n ? (input as { name: string }).name\n : undefined;\n if (Array.isArray((input as { items?: RawKpiItem[] }).items)) {\n return buildFromItems((input as { items: RawKpiItem[] }).items, topName);\n }\n if (Array.isArray((input as { kpis?: RawKpiItem[] }).kpis)) {\n return buildFromItems((input as { kpis: RawKpiItem[] }).kpis, topName);\n }\n if (isRawKpiItem(input)) {\n return buildFromItems([input], topName);\n }\n }\n\n return EMPTY;\n}\n"],"names":[],"mappings":"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"}