@ktnpm_devops/react-component 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/dist/charts/GroupedBarChartCard/GroupedBarChartCard.d.ts +7 -0
  2. package/dist/charts/GroupedBarChartCard/GroupedBarChartCard.d.ts.map +1 -0
  3. package/dist/charts/GroupedBarChartCard/GroupedBarChartCard.types.d.ts +38 -0
  4. package/dist/charts/GroupedBarChartCard/GroupedBarChartCard.types.d.ts.map +1 -0
  5. package/dist/charts/GroupedBarChartCard/buildGroupedBarOption.d.ts +69 -0
  6. package/dist/charts/GroupedBarChartCard/buildGroupedBarOption.d.ts.map +1 -0
  7. package/dist/charts/GroupedBarChartCard/buildGroupedBarOption.test.d.ts +2 -0
  8. package/dist/charts/GroupedBarChartCard/buildGroupedBarOption.test.d.ts.map +1 -0
  9. package/dist/charts/GroupedBarChartCard/defaultLabels.d.ts +5 -0
  10. package/dist/charts/GroupedBarChartCard/defaultLabels.d.ts.map +1 -0
  11. package/dist/charts/GroupedBarChartCard/index.d.ts +3 -0
  12. package/dist/charts/GroupedBarChartCard/index.d.ts.map +1 -0
  13. package/dist/charts/GroupedBarChartCard/pivotGroupedBars.d.ts +22 -0
  14. package/dist/charts/GroupedBarChartCard/pivotGroupedBars.d.ts.map +1 -0
  15. package/dist/charts/GroupedBarChartCard/pivotGroupedBars.test.d.ts +2 -0
  16. package/dist/charts/GroupedBarChartCard/pivotGroupedBars.test.d.ts.map +1 -0
  17. package/dist/constants.d.ts +30 -0
  18. package/dist/constants.d.ts.map +1 -1
  19. package/dist/data/HeatmapMatrix/HeatmapMatrix.d.ts.map +1 -1
  20. package/dist/data/HeatmapMatrix/HeatmapMatrix.types.d.ts +42 -0
  21. package/dist/data/HeatmapMatrix/HeatmapMatrix.types.d.ts.map +1 -1
  22. package/dist/data/HeatmapMatrix/HeatmapMatrixHeader.d.ts +9 -0
  23. package/dist/data/HeatmapMatrix/HeatmapMatrixHeader.d.ts.map +1 -0
  24. package/dist/data/HeatmapMatrix/getColumnRuns.d.ts +11 -0
  25. package/dist/data/HeatmapMatrix/getColumnRuns.d.ts.map +1 -0
  26. package/dist/data/HeatmapMatrix/getColumnRuns.test.d.ts +2 -0
  27. package/dist/data/HeatmapMatrix/getColumnRuns.test.d.ts.map +1 -0
  28. package/dist/data/HeatmapMatrix/index.d.ts +1 -1
  29. package/dist/data/HeatmapMatrix/index.d.ts.map +1 -1
  30. package/dist/index.cjs +29 -27
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.d.ts +4 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +29 -27
  35. package/dist/index.js.map +1 -1
  36. package/dist/index10.cjs +2 -2
  37. package/dist/index10.js +2 -2
  38. package/dist/index100.cjs +22 -40
  39. package/dist/index100.cjs.map +1 -1
  40. package/dist/index100.js +23 -41
  41. package/dist/index100.js.map +1 -1
  42. package/dist/index101.cjs +50 -14
  43. package/dist/index101.cjs.map +1 -1
  44. package/dist/index101.js +50 -14
  45. package/dist/index101.js.map +1 -1
  46. package/dist/index102.cjs +39 -54
  47. package/dist/index102.cjs.map +1 -1
  48. package/dist/index102.js +38 -53
  49. package/dist/index102.js.map +1 -1
  50. package/dist/index103.cjs +92 -18
  51. package/dist/index103.cjs.map +1 -1
  52. package/dist/index103.js +91 -17
  53. package/dist/index103.js.map +1 -1
  54. package/dist/index104.cjs +34 -4
  55. package/dist/index104.cjs.map +1 -1
  56. package/dist/index104.js +35 -5
  57. package/dist/index104.js.map +1 -1
  58. package/dist/index105.cjs +116 -16
  59. package/dist/index105.cjs.map +1 -1
  60. package/dist/index105.js +115 -15
  61. package/dist/index105.js.map +1 -1
  62. package/dist/index106.cjs +33 -24
  63. package/dist/index106.cjs.map +1 -1
  64. package/dist/index106.js +34 -25
  65. package/dist/index106.js.map +1 -1
  66. package/dist/index107.cjs +16 -52
  67. package/dist/index107.cjs.map +1 -1
  68. package/dist/index107.js +16 -52
  69. package/dist/index107.js.map +1 -1
  70. package/dist/index108.cjs +4 -28
  71. package/dist/index108.cjs.map +1 -1
  72. package/dist/index108.js +5 -29
  73. package/dist/index108.js.map +1 -1
  74. package/dist/index109.cjs +35 -24
  75. package/dist/index109.cjs.map +1 -1
  76. package/dist/index109.js +34 -23
  77. package/dist/index109.js.map +1 -1
  78. package/dist/index11.cjs +2 -2
  79. package/dist/index11.js +2 -2
  80. package/dist/index110.cjs +43 -21
  81. package/dist/index110.cjs.map +1 -1
  82. package/dist/index110.js +42 -20
  83. package/dist/index110.js.map +1 -1
  84. package/dist/index111.cjs +24 -15
  85. package/dist/index111.cjs.map +1 -1
  86. package/dist/index111.js +23 -14
  87. package/dist/index111.js.map +1 -1
  88. package/dist/index112.cjs +20 -22
  89. package/dist/index112.cjs.map +1 -1
  90. package/dist/index112.js +19 -21
  91. package/dist/index112.js.map +1 -1
  92. package/dist/index113.cjs +14 -40
  93. package/dist/index113.cjs.map +1 -1
  94. package/dist/index113.js +13 -39
  95. package/dist/index113.js.map +1 -1
  96. package/dist/index114.cjs +61 -116
  97. package/dist/index114.cjs.map +1 -1
  98. package/dist/index114.js +60 -115
  99. package/dist/index114.js.map +1 -1
  100. package/dist/index115.cjs +16 -37
  101. package/dist/index115.cjs.map +1 -1
  102. package/dist/index115.js +16 -37
  103. package/dist/index115.js.map +1 -1
  104. package/dist/index116.cjs +13 -25
  105. package/dist/index116.cjs.map +1 -1
  106. package/dist/index116.js +14 -26
  107. package/dist/index116.js.map +1 -1
  108. package/dist/index117.cjs +22 -1164
  109. package/dist/index117.cjs.map +1 -1
  110. package/dist/index117.js +20 -1163
  111. package/dist/index117.js.map +1 -1
  112. package/dist/index118.cjs +15 -1575
  113. package/dist/index118.cjs.map +1 -1
  114. package/dist/index118.js +14 -1575
  115. package/dist/index118.js.map +1 -1
  116. package/dist/index119.cjs +42 -0
  117. package/dist/index119.cjs.map +1 -0
  118. package/dist/index119.js +42 -0
  119. package/dist/index119.js.map +1 -0
  120. package/dist/index12.cjs +2 -2
  121. package/dist/index12.js +2 -2
  122. package/dist/index120.cjs +50 -0
  123. package/dist/index120.cjs.map +1 -0
  124. package/dist/index120.js +50 -0
  125. package/dist/index120.js.map +1 -0
  126. package/dist/index121.cjs +20 -0
  127. package/dist/index121.cjs.map +1 -0
  128. package/dist/index121.js +20 -0
  129. package/dist/index121.js.map +1 -0
  130. package/dist/index122.cjs +39 -0
  131. package/dist/index122.cjs.map +1 -0
  132. package/dist/index122.js +39 -0
  133. package/dist/index122.js.map +1 -0
  134. package/dist/index123.cjs +45 -0
  135. package/dist/index123.cjs.map +1 -0
  136. package/dist/index123.js +45 -0
  137. package/dist/index123.js.map +1 -0
  138. package/dist/index124.cjs +1166 -0
  139. package/dist/index124.cjs.map +1 -0
  140. package/dist/index124.js +1167 -0
  141. package/dist/index124.js.map +1 -0
  142. package/dist/index125.cjs +1578 -0
  143. package/dist/index125.cjs.map +1 -0
  144. package/dist/index125.js +1579 -0
  145. package/dist/index125.js.map +1 -0
  146. package/dist/index13.cjs +2 -2
  147. package/dist/index13.js +2 -2
  148. package/dist/index14.cjs +1 -1
  149. package/dist/index14.js +1 -1
  150. package/dist/index15.cjs +2 -2
  151. package/dist/index15.js +2 -2
  152. package/dist/index16.cjs +3 -3
  153. package/dist/index16.js +3 -3
  154. package/dist/index17.cjs +2 -2
  155. package/dist/index17.js +2 -2
  156. package/dist/index18.cjs +2 -2
  157. package/dist/index18.js +2 -2
  158. package/dist/index19.cjs +2 -2
  159. package/dist/index19.js +2 -2
  160. package/dist/index20.cjs +2 -2
  161. package/dist/index20.js +2 -2
  162. package/dist/index21.cjs +2 -2
  163. package/dist/index21.js +2 -2
  164. package/dist/index22.cjs +3 -3
  165. package/dist/index22.js +3 -3
  166. package/dist/index23.cjs +3 -3
  167. package/dist/index23.js +3 -3
  168. package/dist/index24.cjs +3 -3
  169. package/dist/index24.js +3 -3
  170. package/dist/index25.cjs +2 -2
  171. package/dist/index25.js +2 -2
  172. package/dist/index26.cjs +2 -2
  173. package/dist/index26.js +2 -2
  174. package/dist/index27.cjs +2 -2
  175. package/dist/index27.js +2 -2
  176. package/dist/index28.cjs +2 -2
  177. package/dist/index28.js +2 -2
  178. package/dist/index29.cjs +3 -3
  179. package/dist/index29.js +3 -3
  180. package/dist/index30.cjs +8 -8
  181. package/dist/index30.js +8 -8
  182. package/dist/index31.cjs +84 -76
  183. package/dist/index31.cjs.map +1 -1
  184. package/dist/index31.js +86 -78
  185. package/dist/index31.js.map +1 -1
  186. package/dist/index32.cjs +100 -6
  187. package/dist/index32.cjs.map +1 -1
  188. package/dist/index32.js +101 -7
  189. package/dist/index32.js.map +1 -1
  190. package/dist/index33.cjs +7 -130
  191. package/dist/index33.cjs.map +1 -1
  192. package/dist/index33.js +9 -132
  193. package/dist/index33.js.map +1 -1
  194. package/dist/index34.cjs +127 -52
  195. package/dist/index34.cjs.map +1 -1
  196. package/dist/index34.js +129 -54
  197. package/dist/index34.js.map +1 -1
  198. package/dist/index35.cjs +49 -13
  199. package/dist/index35.cjs.map +1 -1
  200. package/dist/index35.js +51 -15
  201. package/dist/index35.js.map +1 -1
  202. package/dist/index36.cjs +20 -38
  203. package/dist/index36.cjs.map +1 -1
  204. package/dist/index36.js +21 -39
  205. package/dist/index36.js.map +1 -1
  206. package/dist/index37.cjs +36 -224
  207. package/dist/index37.cjs.map +1 -1
  208. package/dist/index37.js +37 -225
  209. package/dist/index37.js.map +1 -1
  210. package/dist/index38.cjs +220 -28
  211. package/dist/index38.cjs.map +1 -1
  212. package/dist/index38.js +222 -30
  213. package/dist/index38.js.map +1 -1
  214. package/dist/index39.cjs +30 -106
  215. package/dist/index39.cjs.map +1 -1
  216. package/dist/index39.js +31 -107
  217. package/dist/index39.js.map +1 -1
  218. package/dist/index40.cjs +100 -58
  219. package/dist/index40.cjs.map +1 -1
  220. package/dist/index40.js +101 -59
  221. package/dist/index40.js.map +1 -1
  222. package/dist/index41.cjs +66 -76
  223. package/dist/index41.cjs.map +1 -1
  224. package/dist/index41.js +67 -77
  225. package/dist/index41.js.map +1 -1
  226. package/dist/index42.cjs +76 -57
  227. package/dist/index42.cjs.map +1 -1
  228. package/dist/index42.js +78 -59
  229. package/dist/index42.js.map +1 -1
  230. package/dist/index43.cjs +56 -150
  231. package/dist/index43.cjs.map +1 -1
  232. package/dist/index43.js +58 -152
  233. package/dist/index43.js.map +1 -1
  234. package/dist/index44.cjs +128 -73
  235. package/dist/index44.cjs.map +1 -1
  236. package/dist/index44.js +123 -68
  237. package/dist/index44.js.map +1 -1
  238. package/dist/index45.cjs +94 -68
  239. package/dist/index45.cjs.map +1 -1
  240. package/dist/index45.js +96 -70
  241. package/dist/index45.js.map +1 -1
  242. package/dist/index46.cjs +71 -7
  243. package/dist/index46.cjs.map +1 -1
  244. package/dist/index46.js +71 -7
  245. package/dist/index46.js.map +1 -1
  246. package/dist/index47.cjs +8 -17
  247. package/dist/index47.cjs.map +1 -1
  248. package/dist/index47.js +9 -18
  249. package/dist/index47.js.map +1 -1
  250. package/dist/index48.cjs +15 -75
  251. package/dist/index48.cjs.map +1 -1
  252. package/dist/index48.js +16 -76
  253. package/dist/index48.js.map +1 -1
  254. package/dist/index49.cjs +68 -134
  255. package/dist/index49.cjs.map +1 -1
  256. package/dist/index49.js +70 -136
  257. package/dist/index49.js.map +1 -1
  258. package/dist/index50.cjs +137 -58
  259. package/dist/index50.cjs.map +1 -1
  260. package/dist/index50.js +138 -59
  261. package/dist/index50.js.map +1 -1
  262. package/dist/index51.cjs +61 -102
  263. package/dist/index51.cjs.map +1 -1
  264. package/dist/index51.js +62 -103
  265. package/dist/index51.js.map +1 -1
  266. package/dist/index52.cjs +102 -44
  267. package/dist/index52.cjs.map +1 -1
  268. package/dist/index52.js +103 -45
  269. package/dist/index52.js.map +1 -1
  270. package/dist/index53.cjs +47 -6
  271. package/dist/index53.cjs.map +1 -1
  272. package/dist/index53.js +48 -7
  273. package/dist/index53.js.map +1 -1
  274. package/dist/index54.cjs +6 -147
  275. package/dist/index54.cjs.map +1 -1
  276. package/dist/index54.js +7 -148
  277. package/dist/index54.js.map +1 -1
  278. package/dist/index55.cjs +146 -7
  279. package/dist/index55.cjs.map +1 -1
  280. package/dist/index55.js +148 -9
  281. package/dist/index55.js.map +1 -1
  282. package/dist/index56.cjs +6 -15
  283. package/dist/index56.cjs.map +1 -1
  284. package/dist/index56.js +6 -15
  285. package/dist/index56.js.map +1 -1
  286. package/dist/index57.cjs +15 -64
  287. package/dist/index57.cjs.map +1 -1
  288. package/dist/index57.js +17 -66
  289. package/dist/index57.js.map +1 -1
  290. package/dist/index58.cjs +67 -15
  291. package/dist/index58.cjs.map +1 -1
  292. package/dist/index58.js +66 -14
  293. package/dist/index58.js.map +1 -1
  294. package/dist/index59.cjs +15 -18
  295. package/dist/index59.cjs.map +1 -1
  296. package/dist/index59.js +15 -18
  297. package/dist/index59.js.map +1 -1
  298. package/dist/index60.cjs +22 -19
  299. package/dist/index60.cjs.map +1 -1
  300. package/dist/index60.js +22 -19
  301. package/dist/index60.js.map +1 -1
  302. package/dist/index62.cjs +15 -24
  303. package/dist/index62.cjs.map +1 -1
  304. package/dist/index62.js +15 -24
  305. package/dist/index62.js.map +1 -1
  306. package/dist/index63.cjs +142 -6
  307. package/dist/index63.cjs.map +1 -1
  308. package/dist/index63.js +141 -5
  309. package/dist/index63.js.map +1 -1
  310. package/dist/index64.cjs +20 -2
  311. package/dist/index64.cjs.map +1 -1
  312. package/dist/index64.js +21 -3
  313. package/dist/index64.js.map +1 -1
  314. package/dist/index65.cjs +10 -13
  315. package/dist/index65.cjs.map +1 -1
  316. package/dist/index65.js +10 -13
  317. package/dist/index65.js.map +1 -1
  318. package/dist/index66.cjs +14 -2
  319. package/dist/index66.cjs.map +1 -1
  320. package/dist/index66.js +15 -3
  321. package/dist/index66.js.map +1 -1
  322. package/dist/index67.cjs +13 -7
  323. package/dist/index67.cjs.map +1 -1
  324. package/dist/index67.js +13 -7
  325. package/dist/index67.js.map +1 -1
  326. package/dist/index68.cjs +17 -2
  327. package/dist/index68.cjs.map +1 -1
  328. package/dist/index68.js +18 -3
  329. package/dist/index68.js.map +1 -1
  330. package/dist/index69.cjs +33 -17
  331. package/dist/index69.cjs.map +1 -1
  332. package/dist/index69.js +32 -16
  333. package/dist/index69.js.map +1 -1
  334. package/dist/index70.cjs +20 -2
  335. package/dist/index70.cjs.map +1 -1
  336. package/dist/index70.js +20 -2
  337. package/dist/index70.js.map +1 -1
  338. package/dist/index71.cjs +52 -116
  339. package/dist/index71.cjs.map +1 -1
  340. package/dist/index71.js +50 -114
  341. package/dist/index71.js.map +1 -1
  342. package/dist/index72.cjs +2 -29
  343. package/dist/index72.cjs.map +1 -1
  344. package/dist/index72.js +3 -30
  345. package/dist/index72.js.map +1 -1
  346. package/dist/index73.cjs +77 -14
  347. package/dist/index73.cjs.map +1 -1
  348. package/dist/index73.js +78 -15
  349. package/dist/index73.js.map +1 -1
  350. package/dist/index74.cjs +52 -19
  351. package/dist/index74.cjs.map +1 -1
  352. package/dist/index74.js +52 -19
  353. package/dist/index74.js.map +1 -1
  354. package/dist/index75.cjs +35 -5
  355. package/dist/index75.cjs.map +1 -1
  356. package/dist/index75.js +36 -6
  357. package/dist/index75.js.map +1 -1
  358. package/dist/index76.cjs +17 -6
  359. package/dist/index76.cjs.map +1 -1
  360. package/dist/index76.js +16 -5
  361. package/dist/index76.js.map +1 -1
  362. package/dist/index77.cjs +2 -65
  363. package/dist/index77.cjs.map +1 -1
  364. package/dist/index77.js +3 -66
  365. package/dist/index77.js.map +1 -1
  366. package/dist/index78.cjs +2 -20
  367. package/dist/index78.cjs.map +1 -1
  368. package/dist/index78.js +3 -21
  369. package/dist/index78.js.map +1 -1
  370. package/dist/index79.cjs +5 -14
  371. package/dist/index79.cjs.map +1 -1
  372. package/dist/index79.js +6 -15
  373. package/dist/index79.js.map +1 -1
  374. package/dist/index80.cjs +30 -21
  375. package/dist/index80.cjs.map +1 -1
  376. package/dist/index80.js +30 -21
  377. package/dist/index80.js.map +1 -1
  378. package/dist/index81.cjs +21 -35
  379. package/dist/index81.cjs.map +1 -1
  380. package/dist/index81.js +20 -34
  381. package/dist/index81.js.map +1 -1
  382. package/dist/index82.cjs +15 -43
  383. package/dist/index82.cjs.map +1 -1
  384. package/dist/index82.js +14 -42
  385. package/dist/index82.js.map +1 -1
  386. package/dist/index83.cjs +24 -24
  387. package/dist/index83.cjs.map +1 -1
  388. package/dist/index83.js +23 -23
  389. package/dist/index83.js.map +1 -1
  390. package/dist/index84.cjs +7 -20
  391. package/dist/index84.cjs.map +1 -1
  392. package/dist/index84.js +6 -19
  393. package/dist/index84.js.map +1 -1
  394. package/dist/index85.cjs +25 -14
  395. package/dist/index85.cjs.map +1 -1
  396. package/dist/index85.js +24 -13
  397. package/dist/index85.js.map +1 -1
  398. package/dist/index86.cjs +64 -55
  399. package/dist/index86.cjs.map +1 -1
  400. package/dist/index86.js +64 -55
  401. package/dist/index86.js.map +1 -1
  402. package/dist/index87.cjs +19 -46
  403. package/dist/index87.cjs.map +1 -1
  404. package/dist/index87.js +19 -46
  405. package/dist/index87.js.map +1 -1
  406. package/dist/index88.cjs +2 -35
  407. package/dist/index88.cjs.map +1 -1
  408. package/dist/index88.js +3 -36
  409. package/dist/index88.js.map +1 -1
  410. package/dist/index89.cjs +2 -80
  411. package/dist/index89.cjs.map +1 -1
  412. package/dist/index89.js +3 -81
  413. package/dist/index89.js.map +1 -1
  414. package/dist/index90.cjs +15 -39
  415. package/dist/index90.cjs.map +1 -1
  416. package/dist/index90.js +14 -38
  417. package/dist/index90.js.map +1 -1
  418. package/dist/index91.cjs +18 -92
  419. package/dist/index91.cjs.map +1 -1
  420. package/dist/index91.js +17 -91
  421. package/dist/index91.js.map +1 -1
  422. package/dist/index92.cjs +47 -32
  423. package/dist/index92.cjs.map +1 -1
  424. package/dist/index92.js +47 -32
  425. package/dist/index92.js.map +1 -1
  426. package/dist/index93.cjs +134 -19
  427. package/dist/index93.cjs.map +1 -1
  428. package/dist/index93.js +133 -18
  429. package/dist/index93.js.map +1 -1
  430. package/dist/index94.cjs +42 -36
  431. package/dist/index94.cjs.map +1 -1
  432. package/dist/index94.js +42 -36
  433. package/dist/index94.js.map +1 -1
  434. package/dist/index95.cjs +36 -15
  435. package/dist/index95.cjs.map +1 -1
  436. package/dist/index95.js +36 -15
  437. package/dist/index95.js.map +1 -1
  438. package/dist/index96.cjs +17 -26
  439. package/dist/index96.cjs.map +1 -1
  440. package/dist/index96.js +18 -27
  441. package/dist/index96.js.map +1 -1
  442. package/dist/index97.cjs +22 -21
  443. package/dist/index97.cjs.map +1 -1
  444. package/dist/index97.js +21 -20
  445. package/dist/index97.js.map +1 -1
  446. package/dist/index98.cjs +63 -127
  447. package/dist/index98.cjs.map +1 -1
  448. package/dist/index98.js +63 -127
  449. package/dist/index98.js.map +1 -1
  450. package/dist/index99.cjs +7 -45
  451. package/dist/index99.cjs.map +1 -1
  452. package/dist/index99.js +6 -44
  453. package/dist/index99.js.map +1 -1
  454. package/dist/style.css +130 -5
  455. package/dist/types/chart.types.d.ts +14 -0
  456. package/dist/types/chart.types.d.ts.map +1 -1
  457. package/dist/types/index.d.ts +2 -2
  458. package/dist/types/index.d.ts.map +1 -1
  459. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index98.cjs","sources":["../src/charts/StackedBarChartCard/buildChartOptions.ts"],"sourcesContent":["import type { ChartSeriesPoint } from '../../types/chart.types';\nimport { CHART_COLORS } from '../../constants';\n\n/** Aggregated series data for chart rendering. */\nexport interface AggregatedChartData {\n categories: string[];\n series: { name: string; values: number[] }[];\n}\n\n/** Aggregate data points by category and subCategory, applying limits. */\nexport function aggregateData(\n data: ChartSeriesPoint[],\n maxCats: number,\n maxSubs: number,\n showOthers: boolean,\n): AggregatedChartData {\n const categoryMap = new Map<string, Map<string, number>>();\n\n for (const point of data) {\n const cat = point.category ?? 'Unknown';\n const sub = point.subCategory ?? 'Default';\n if (!categoryMap.has(cat)) {\n categoryMap.set(cat, new Map());\n }\n const subMap = categoryMap.get(cat)!;\n subMap.set(sub, (subMap.get(sub) ?? 0) + point.value);\n }\n\n const sortedCategories = [...categoryMap.entries()]\n .map(([cat, subMap]) => {\n let total = 0;\n for (const v of subMap.values()) total += v;\n return { cat, subMap, total };\n })\n .sort((a, b) => b.total - a.total);\n\n const topCategories = sortedCategories.slice(0, maxCats);\n const overflowCategories = sortedCategories.slice(maxCats);\n\n if (showOthers && overflowCategories.length > 0) {\n const othersMap = new Map<string, number>();\n for (const { subMap } of overflowCategories) {\n for (const [sub, val] of subMap) {\n othersMap.set(sub, (othersMap.get(sub) ?? 0) + val);\n }\n }\n let othersTotal = 0;\n for (const v of othersMap.values()) othersTotal += v;\n topCategories.push({ cat: 'Others', subMap: othersMap, total: othersTotal });\n }\n\n const allSubCategories = new Set<string>();\n for (const { subMap } of topCategories) {\n for (const sub of subMap.keys()) {\n allSubCategories.add(sub);\n }\n }\n\n const sortedSubs = [...allSubCategories];\n const limitedSubs = sortedSubs.slice(0, maxSubs);\n const hasOverflowSubs = sortedSubs.length > maxSubs;\n\n const categories = topCategories.map((entry) => entry.cat);\n\n const series = limitedSubs.map((sub) => ({\n name: sub,\n values: topCategories.map((entry) => entry.subMap.get(sub) ?? 0),\n }));\n\n if (hasOverflowSubs && showOthers) {\n const overflowSubs = sortedSubs.slice(maxSubs);\n series.push({\n name: 'Other subcategories',\n values: topCategories.map((entry) => {\n let sum = 0;\n for (const sub of overflowSubs) {\n sum += entry.subMap.get(sub) ?? 0;\n }\n return sum;\n }),\n });\n }\n\n return { categories, series };\n}\n\n/** Build ECharts option for stacked bar chart. */\nexport function buildBarOption(\n categories: string[],\n series: { name: string; values: number[] }[],\n invertAxis: boolean,\n hideLegend: boolean,\n enableScroll: boolean,\n) {\n const categoryAxis = { type: 'category' as const, data: categories };\n const valueAxis = { type: 'value' as const };\n\n const dataZoom = enableScroll\n ? [{ type: 'slider' as const, show: true, ...(invertAxis ? { yAxisIndex: 0 } : { xAxisIndex: 0 }) }]\n : [];\n\n return {\n tooltip: { trigger: 'axis' as const, axisPointer: { type: 'shadow' as const } },\n legend: { show: !hideLegend, bottom: 0, type: 'scroll' as const },\n grid: { left: '3%', right: '4%', top: '3%', bottom: hideLegend ? '3%' : '12%', containLabel: true },\n xAxis: invertAxis ? valueAxis : categoryAxis,\n yAxis: invertAxis ? categoryAxis : valueAxis,\n dataZoom,\n series: series.map((s, i) => ({\n name: s.name,\n type: 'bar' as const,\n stack: 'total',\n emphasis: { focus: 'series' as const },\n data: s.values,\n itemStyle: { color: CHART_COLORS[i % CHART_COLORS.length] },\n })),\n };\n}\n\n/** Build ECharts option for pie chart. */\nexport function buildPieOption(\n categories: string[],\n series: { name: string; values: number[] }[],\n hideLegend: boolean,\n) {\n const pieData = categories.map((cat, catIdx) => {\n let total = 0;\n for (const s of series) {\n total += s.values[catIdx] ?? 0;\n }\n return { name: cat, value: total };\n });\n\n return {\n tooltip: { trigger: 'item' as const },\n legend: { show: !hideLegend, bottom: 0, type: 'scroll' as const },\n series: [\n {\n type: 'pie' as const,\n radius: ['30%', '65%'],\n center: ['50%', '45%'],\n data: pieData.map((d, i) => ({\n ...d,\n itemStyle: { color: CHART_COLORS[i % CHART_COLORS.length] },\n })),\n emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0,0,0,0.3)' } },\n label: { show: true, formatter: '{b}: {d}%' },\n },\n ],\n };\n}\n\n/** Build ECharts option for sunburst chart. */\nexport function buildSunburstOption(\n categories: string[],\n series: { name: string; values: number[] }[],\n) {\n const sunburstData = categories.map((cat, catIdx) => {\n const children = series\n .map((s, sIdx) => ({\n name: s.name,\n value: s.values[catIdx] ?? 0,\n itemStyle: { color: CHART_COLORS[(catIdx * series.length + sIdx) % CHART_COLORS.length] },\n }))\n .filter((child) => child.value > 0);\n\n return { name: cat, children };\n });\n\n return {\n tooltip: { trigger: 'item' as const },\n series: [\n {\n type: 'sunburst' as const,\n data: sunburstData,\n radius: ['15%', '80%'],\n label: { rotate: 'radial' as const, fontSize: 10 },\n itemStyle: { borderRadius: 4, borderWidth: 1 },\n emphasis: { focus: 'ancestor' as const },\n },\n ],\n };\n}\n"],"names":["CHART_COLORS"],"mappings":"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"}
1
+ {"version":3,"file":"index98.cjs","sources":["../src/charts/GroupedBarChartCard/buildGroupedBarOption.ts"],"sourcesContent":["import type { GroupedBarPivot } from './pivotGroupedBars';\nimport { CHART_COLORS, GROUPED_BAR } from '../../constants';\n\nexport interface GroupedBarOptionConfig {\n seriesColors?: Readonly<Record<string, string>>;\n invertAxis: boolean;\n hideLegend: boolean;\n integerValues: boolean;\n valueLabel?: string;\n /** Tooltip text for a gap. */\n noValueText: string;\n}\n\nconst { GRID_MARGIN, AXIS_NAME_GAP } = GROUPED_BAR;\n\n/** Category and series names come from consumer data and land in the tooltip's HTML. */\nconst escapeHtml = (value: string) =>\n value.replace(/[&<>\"]/g, (char) => `&#${char.charCodeAt(0)};`);\n\n/** Pinned colour first, else the palette by first-seen position. */\nconst colorFor = (name: string, index: number, seriesColors?: Readonly<Record<string, string>>) =>\n seriesColors?.[name] ?? CHART_COLORS[index % CHART_COLORS.length];\n\nconst markerFor = (color: string) => {\n const { TOOLTIP_MARKER_SIZE: size, TOOLTIP_MARKER_GAP: gap } = GROUPED_BAR;\n return `<span style=\"display:inline-block;margin-right:${gap}px;border-radius:50%;width:${size}px;height:${size}px;background-color:${escapeHtml(color)};\"></span>`;\n};\n\n/**\n * The tooltip is built from the pivot rather than from echarts' params, so every\n * series is listed in series order and a gap reads as `noValueText`, never `-`.\n */\nconst buildTooltipFormatter =\n (pivot: GroupedBarPivot, colors: string[], noValueText: string) => (params: unknown) => {\n const first = (Array.isArray(params) ? params[0] : params) as\n | { dataIndex?: number }\n | undefined;\n const index = first?.dataIndex;\n if (index == null || index >= pivot.categories.length) return '';\n\n const lines = [escapeHtml(pivot.categories[index])];\n pivot.series.forEach((s, i) => {\n const value = s.values[index];\n const text = value == null ? escapeHtml(noValueText) : String(value);\n lines.push(`${markerFor(colors[i])}${escapeHtml(s.name)}: ${text}`);\n });\n\n return lines.join('<br/>');\n };\n\nconst buildGrid = (config: GroupedBarOptionConfig) => {\n const named = Boolean(config.valueLabel);\n return {\n left: GRID_MARGIN.BASE + (named && !config.invertAxis ? GRID_MARGIN.VALUE_NAME_Y : 0),\n right: GRID_MARGIN.RIGHT,\n top: GRID_MARGIN.TOP,\n // Room for a horizontal value-axis name and the legend, each only when drawn.\n bottom:\n GRID_MARGIN.BASE +\n (named && config.invertAxis ? GRID_MARGIN.VALUE_NAME_X : 0) +\n (config.hideLegend ? 0 : GRID_MARGIN.LEGEND),\n containLabel: true,\n };\n};\n\nexport const buildGroupedBarOption = (pivot: GroupedBarPivot, config: GroupedBarOptionConfig) => {\n const colors = pivot.series.map((s, i) => colorFor(s.name, i, config.seriesColors));\n\n const categoryAxis = {\n type: 'category' as const,\n data: pivot.categories,\n // Horizontal bars read top-down, so the first category goes on top.\n inverse: config.invertAxis,\n };\n const valueAxis = {\n type: 'value' as const,\n name: config.valueLabel,\n nameLocation: 'middle' as const,\n nameGap: config.invertAxis ? AXIS_NAME_GAP.X : AXIS_NAME_GAP.Y,\n // Without this a vertical axis name is drawn horizontally and eats the plot's width.\n nameRotate: config.invertAxis ? 0 : 90,\n minInterval: config.integerValues ? 1 : undefined,\n };\n\n return {\n tooltip: {\n trigger: 'axis' as const,\n axisPointer: { type: 'shadow' as const },\n formatter: buildTooltipFormatter(pivot, colors, config.noValueText),\n },\n legend: { show: !config.hideLegend, bottom: 0, type: 'scroll' as const },\n grid: buildGrid(config),\n xAxis: config.invertAxis ? valueAxis : categoryAxis,\n yAxis: config.invertAxis ? categoryAxis : valueAxis,\n series: pivot.series.map((s, i) => ({\n name: s.name,\n type: 'bar' as const,\n data: s.values,\n barMinHeight: GROUPED_BAR.MIN_BAR_HEIGHT,\n itemStyle: { color: colors[i] },\n emphasis: { focus: 'series' as const },\n })),\n };\n};\n"],"names":["GROUPED_BAR","CHART_COLORS"],"mappings":";;;AAaA,MAAM,EAAE,aAAa,cAAA,IAAkBA,UAAAA;AAGvC,MAAM,aAAa,CAAC,UAClB,MAAM,QAAQ,WAAW,CAAC,SAAS,KAAK,KAAK,WAAW,CAAC,CAAC,GAAG;AAG/D,MAAM,WAAW,CAAC,MAAc,OAAe,kBAC7C,6CAAe,UAASC,UAAAA,aAAa,QAAQA,UAAAA,aAAa,MAAM;AAElE,MAAM,YAAY,CAAC,UAAkB;AACnC,QAAM,EAAE,qBAAqB,MAAM,oBAAoB,QAAQD,UAAAA;AAC/D,SAAO,kDAAkD,GAAG,8BAA8B,IAAI,aAAa,IAAI,uBAAuB,WAAW,KAAK,CAAC;AACzJ;AAMA,MAAM,wBACJ,CAAC,OAAwB,QAAkB,gBAAwB,CAAC,WAAoB;AACtF,QAAM,QAAS,MAAM,QAAQ,MAAM,IAAI,OAAO,CAAC,IAAI;AAGnD,QAAM,QAAQ,+BAAO;AACrB,MAAI,SAAS,QAAQ,SAAS,MAAM,WAAW,OAAQ,QAAO;AAE9D,QAAM,QAAQ,CAAC,WAAW,MAAM,WAAW,KAAK,CAAC,CAAC;AAClD,QAAM,OAAO,QAAQ,CAAC,GAAG,MAAM;AAC7B,UAAM,QAAQ,EAAE,OAAO,KAAK;AAC5B,UAAM,OAAO,SAAS,OAAO,WAAW,WAAW,IAAI,OAAO,KAAK;AACnE,UAAM,KAAK,GAAG,UAAU,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;AAAA,EACpE,CAAC;AAED,SAAO,MAAM,KAAK,OAAO;AAC3B;AAEF,MAAM,YAAY,CAAC,WAAmC;AACpD,QAAM,QAAQ,QAAQ,OAAO,UAAU;AACvC,SAAO;AAAA,IACL,MAAM,YAAY,QAAQ,SAAS,CAAC,OAAO,aAAa,YAAY,eAAe;AAAA,IACnF,OAAO,YAAY;AAAA,IACnB,KAAK,YAAY;AAAA;AAAA,IAEjB,QACE,YAAY,QACX,SAAS,OAAO,aAAa,YAAY,eAAe,MACxD,OAAO,aAAa,IAAI,YAAY;AAAA,IACvC,cAAc;AAAA,EAAA;AAElB;AAEO,MAAM,wBAAwB,CAAC,OAAwB,WAAmC;AAC/F,QAAM,SAAS,MAAM,OAAO,IAAI,CAAC,GAAG,MAAM,SAAS,EAAE,MAAM,GAAG,OAAO,YAAY,CAAC;AAElF,QAAM,eAAe;AAAA,IACnB,MAAM;AAAA,IACN,MAAM,MAAM;AAAA;AAAA,IAEZ,SAAS,OAAO;AAAA,EAAA;AAElB,QAAM,YAAY;AAAA,IAChB,MAAM;AAAA,IACN,MAAM,OAAO;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,aAAa,cAAc,IAAI,cAAc;AAAA;AAAA,IAE7D,YAAY,OAAO,aAAa,IAAI;AAAA,IACpC,aAAa,OAAO,gBAAgB,IAAI;AAAA,EAAA;AAG1C,SAAO;AAAA,IACL,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa,EAAE,MAAM,SAAA;AAAA,MACrB,WAAW,sBAAsB,OAAO,QAAQ,OAAO,WAAW;AAAA,IAAA;AAAA,IAEpE,QAAQ,EAAE,MAAM,CAAC,OAAO,YAAY,QAAQ,GAAG,MAAM,SAAA;AAAA,IACrD,MAAM,UAAU,MAAM;AAAA,IACtB,OAAO,OAAO,aAAa,YAAY;AAAA,IACvC,OAAO,OAAO,aAAa,eAAe;AAAA,IAC1C,QAAQ,MAAM,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,MAClC,MAAM,EAAE;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE;AAAA,MACR,cAAcA,UAAAA,YAAY;AAAA,MAC1B,WAAW,EAAE,OAAO,OAAO,CAAC,EAAA;AAAA,MAC5B,UAAU,EAAE,OAAO,SAAA;AAAA,IAAkB,EACrC;AAAA,EAAA;AAEN;;"}
package/dist/index98.js CHANGED
@@ -1,136 +1,72 @@
1
- import { CHART_COLORS } from "./index71.js";
2
- function aggregateData(data, maxCats, maxSubs, showOthers) {
3
- const categoryMap = /* @__PURE__ */ new Map();
4
- for (const point of data) {
5
- const cat = point.category ?? "Unknown";
6
- const sub = point.subCategory ?? "Default";
7
- if (!categoryMap.has(cat)) {
8
- categoryMap.set(cat, /* @__PURE__ */ new Map());
9
- }
10
- const subMap = categoryMap.get(cat);
11
- subMap.set(sub, (subMap.get(sub) ?? 0) + point.value);
12
- }
13
- const sortedCategories = [...categoryMap.entries()].map(([cat, subMap]) => {
14
- let total = 0;
15
- for (const v of subMap.values()) total += v;
16
- return { cat, subMap, total };
17
- }).sort((a, b) => b.total - a.total);
18
- const topCategories = sortedCategories.slice(0, maxCats);
19
- const overflowCategories = sortedCategories.slice(maxCats);
20
- if (showOthers && overflowCategories.length > 0) {
21
- const othersMap = /* @__PURE__ */ new Map();
22
- for (const { subMap } of overflowCategories) {
23
- for (const [sub, val] of subMap) {
24
- othersMap.set(sub, (othersMap.get(sub) ?? 0) + val);
25
- }
26
- }
27
- let othersTotal = 0;
28
- for (const v of othersMap.values()) othersTotal += v;
29
- topCategories.push({ cat: "Others", subMap: othersMap, total: othersTotal });
30
- }
31
- const allSubCategories = /* @__PURE__ */ new Set();
32
- for (const { subMap } of topCategories) {
33
- for (const sub of subMap.keys()) {
34
- allSubCategories.add(sub);
35
- }
36
- }
37
- const sortedSubs = [...allSubCategories];
38
- const limitedSubs = sortedSubs.slice(0, maxSubs);
39
- const hasOverflowSubs = sortedSubs.length > maxSubs;
40
- const categories = topCategories.map((entry) => entry.cat);
41
- const series = limitedSubs.map((sub) => ({
42
- name: sub,
43
- values: topCategories.map((entry) => entry.subMap.get(sub) ?? 0)
44
- }));
45
- if (hasOverflowSubs && showOthers) {
46
- const overflowSubs = sortedSubs.slice(maxSubs);
47
- series.push({
48
- name: "Other subcategories",
49
- values: topCategories.map((entry) => {
50
- let sum = 0;
51
- for (const sub of overflowSubs) {
52
- sum += entry.subMap.get(sub) ?? 0;
53
- }
54
- return sum;
55
- })
56
- });
57
- }
58
- return { categories, series };
59
- }
60
- function buildBarOption(categories, series, invertAxis, hideLegend, enableScroll) {
61
- const categoryAxis = { type: "category", data: categories };
62
- const valueAxis = { type: "value" };
63
- const dataZoom = enableScroll ? [{ type: "slider", show: true, ...invertAxis ? { yAxisIndex: 0 } : { xAxisIndex: 0 } }] : [];
1
+ import { GROUPED_BAR, CHART_COLORS } from "./index63.js";
2
+ const { GRID_MARGIN, AXIS_NAME_GAP } = GROUPED_BAR;
3
+ const escapeHtml = (value) => value.replace(/[&<>"]/g, (char) => `&#${char.charCodeAt(0)};`);
4
+ const colorFor = (name, index, seriesColors) => (seriesColors == null ? void 0 : seriesColors[name]) ?? CHART_COLORS[index % CHART_COLORS.length];
5
+ const markerFor = (color) => {
6
+ const { TOOLTIP_MARKER_SIZE: size, TOOLTIP_MARKER_GAP: gap } = GROUPED_BAR;
7
+ return `<span style="display:inline-block;margin-right:${gap}px;border-radius:50%;width:${size}px;height:${size}px;background-color:${escapeHtml(color)};"></span>`;
8
+ };
9
+ const buildTooltipFormatter = (pivot, colors, noValueText) => (params) => {
10
+ const first = Array.isArray(params) ? params[0] : params;
11
+ const index = first == null ? void 0 : first.dataIndex;
12
+ if (index == null || index >= pivot.categories.length) return "";
13
+ const lines = [escapeHtml(pivot.categories[index])];
14
+ pivot.series.forEach((s, i) => {
15
+ const value = s.values[index];
16
+ const text = value == null ? escapeHtml(noValueText) : String(value);
17
+ lines.push(`${markerFor(colors[i])}${escapeHtml(s.name)}: ${text}`);
18
+ });
19
+ return lines.join("<br/>");
20
+ };
21
+ const buildGrid = (config) => {
22
+ const named = Boolean(config.valueLabel);
23
+ return {
24
+ left: GRID_MARGIN.BASE + (named && !config.invertAxis ? GRID_MARGIN.VALUE_NAME_Y : 0),
25
+ right: GRID_MARGIN.RIGHT,
26
+ top: GRID_MARGIN.TOP,
27
+ // Room for a horizontal value-axis name and the legend, each only when drawn.
28
+ bottom: GRID_MARGIN.BASE + (named && config.invertAxis ? GRID_MARGIN.VALUE_NAME_X : 0) + (config.hideLegend ? 0 : GRID_MARGIN.LEGEND),
29
+ containLabel: true
30
+ };
31
+ };
32
+ const buildGroupedBarOption = (pivot, config) => {
33
+ const colors = pivot.series.map((s, i) => colorFor(s.name, i, config.seriesColors));
34
+ const categoryAxis = {
35
+ type: "category",
36
+ data: pivot.categories,
37
+ // Horizontal bars read top-down, so the first category goes on top.
38
+ inverse: config.invertAxis
39
+ };
40
+ const valueAxis = {
41
+ type: "value",
42
+ name: config.valueLabel,
43
+ nameLocation: "middle",
44
+ nameGap: config.invertAxis ? AXIS_NAME_GAP.X : AXIS_NAME_GAP.Y,
45
+ // Without this a vertical axis name is drawn horizontally and eats the plot's width.
46
+ nameRotate: config.invertAxis ? 0 : 90,
47
+ minInterval: config.integerValues ? 1 : void 0
48
+ };
64
49
  return {
65
- tooltip: { trigger: "axis", axisPointer: { type: "shadow" } },
66
- legend: { show: !hideLegend, bottom: 0, type: "scroll" },
67
- grid: { left: "3%", right: "4%", top: "3%", bottom: hideLegend ? "3%" : "12%", containLabel: true },
68
- xAxis: invertAxis ? valueAxis : categoryAxis,
69
- yAxis: invertAxis ? categoryAxis : valueAxis,
70
- dataZoom,
71
- series: series.map((s, i) => ({
50
+ tooltip: {
51
+ trigger: "axis",
52
+ axisPointer: { type: "shadow" },
53
+ formatter: buildTooltipFormatter(pivot, colors, config.noValueText)
54
+ },
55
+ legend: { show: !config.hideLegend, bottom: 0, type: "scroll" },
56
+ grid: buildGrid(config),
57
+ xAxis: config.invertAxis ? valueAxis : categoryAxis,
58
+ yAxis: config.invertAxis ? categoryAxis : valueAxis,
59
+ series: pivot.series.map((s, i) => ({
72
60
  name: s.name,
73
61
  type: "bar",
74
- stack: "total",
75
- emphasis: { focus: "series" },
76
62
  data: s.values,
77
- itemStyle: { color: CHART_COLORS[i % CHART_COLORS.length] }
63
+ barMinHeight: GROUPED_BAR.MIN_BAR_HEIGHT,
64
+ itemStyle: { color: colors[i] },
65
+ emphasis: { focus: "series" }
78
66
  }))
79
67
  };
80
- }
81
- function buildPieOption(categories, series, hideLegend) {
82
- const pieData = categories.map((cat, catIdx) => {
83
- let total = 0;
84
- for (const s of series) {
85
- total += s.values[catIdx] ?? 0;
86
- }
87
- return { name: cat, value: total };
88
- });
89
- return {
90
- tooltip: { trigger: "item" },
91
- legend: { show: !hideLegend, bottom: 0, type: "scroll" },
92
- series: [
93
- {
94
- type: "pie",
95
- radius: ["30%", "65%"],
96
- center: ["50%", "45%"],
97
- data: pieData.map((d, i) => ({
98
- ...d,
99
- itemStyle: { color: CHART_COLORS[i % CHART_COLORS.length] }
100
- })),
101
- emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: "rgba(0,0,0,0.3)" } },
102
- label: { show: true, formatter: "{b}: {d}%" }
103
- }
104
- ]
105
- };
106
- }
107
- function buildSunburstOption(categories, series) {
108
- const sunburstData = categories.map((cat, catIdx) => {
109
- const children = series.map((s, sIdx) => ({
110
- name: s.name,
111
- value: s.values[catIdx] ?? 0,
112
- itemStyle: { color: CHART_COLORS[(catIdx * series.length + sIdx) % CHART_COLORS.length] }
113
- })).filter((child) => child.value > 0);
114
- return { name: cat, children };
115
- });
116
- return {
117
- tooltip: { trigger: "item" },
118
- series: [
119
- {
120
- type: "sunburst",
121
- data: sunburstData,
122
- radius: ["15%", "80%"],
123
- label: { rotate: "radial", fontSize: 10 },
124
- itemStyle: { borderRadius: 4, borderWidth: 1 },
125
- emphasis: { focus: "ancestor" }
126
- }
127
- ]
128
- };
129
- }
68
+ };
130
69
  export {
131
- aggregateData,
132
- buildBarOption,
133
- buildPieOption,
134
- buildSunburstOption
70
+ buildGroupedBarOption
135
71
  };
136
72
  //# sourceMappingURL=index98.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index98.js","sources":["../src/charts/StackedBarChartCard/buildChartOptions.ts"],"sourcesContent":["import type { ChartSeriesPoint } from '../../types/chart.types';\nimport { CHART_COLORS } from '../../constants';\n\n/** Aggregated series data for chart rendering. */\nexport interface AggregatedChartData {\n categories: string[];\n series: { name: string; values: number[] }[];\n}\n\n/** Aggregate data points by category and subCategory, applying limits. */\nexport function aggregateData(\n data: ChartSeriesPoint[],\n maxCats: number,\n maxSubs: number,\n showOthers: boolean,\n): AggregatedChartData {\n const categoryMap = new Map<string, Map<string, number>>();\n\n for (const point of data) {\n const cat = point.category ?? 'Unknown';\n const sub = point.subCategory ?? 'Default';\n if (!categoryMap.has(cat)) {\n categoryMap.set(cat, new Map());\n }\n const subMap = categoryMap.get(cat)!;\n subMap.set(sub, (subMap.get(sub) ?? 0) + point.value);\n }\n\n const sortedCategories = [...categoryMap.entries()]\n .map(([cat, subMap]) => {\n let total = 0;\n for (const v of subMap.values()) total += v;\n return { cat, subMap, total };\n })\n .sort((a, b) => b.total - a.total);\n\n const topCategories = sortedCategories.slice(0, maxCats);\n const overflowCategories = sortedCategories.slice(maxCats);\n\n if (showOthers && overflowCategories.length > 0) {\n const othersMap = new Map<string, number>();\n for (const { subMap } of overflowCategories) {\n for (const [sub, val] of subMap) {\n othersMap.set(sub, (othersMap.get(sub) ?? 0) + val);\n }\n }\n let othersTotal = 0;\n for (const v of othersMap.values()) othersTotal += v;\n topCategories.push({ cat: 'Others', subMap: othersMap, total: othersTotal });\n }\n\n const allSubCategories = new Set<string>();\n for (const { subMap } of topCategories) {\n for (const sub of subMap.keys()) {\n allSubCategories.add(sub);\n }\n }\n\n const sortedSubs = [...allSubCategories];\n const limitedSubs = sortedSubs.slice(0, maxSubs);\n const hasOverflowSubs = sortedSubs.length > maxSubs;\n\n const categories = topCategories.map((entry) => entry.cat);\n\n const series = limitedSubs.map((sub) => ({\n name: sub,\n values: topCategories.map((entry) => entry.subMap.get(sub) ?? 0),\n }));\n\n if (hasOverflowSubs && showOthers) {\n const overflowSubs = sortedSubs.slice(maxSubs);\n series.push({\n name: 'Other subcategories',\n values: topCategories.map((entry) => {\n let sum = 0;\n for (const sub of overflowSubs) {\n sum += entry.subMap.get(sub) ?? 0;\n }\n return sum;\n }),\n });\n }\n\n return { categories, series };\n}\n\n/** Build ECharts option for stacked bar chart. */\nexport function buildBarOption(\n categories: string[],\n series: { name: string; values: number[] }[],\n invertAxis: boolean,\n hideLegend: boolean,\n enableScroll: boolean,\n) {\n const categoryAxis = { type: 'category' as const, data: categories };\n const valueAxis = { type: 'value' as const };\n\n const dataZoom = enableScroll\n ? [{ type: 'slider' as const, show: true, ...(invertAxis ? { yAxisIndex: 0 } : { xAxisIndex: 0 }) }]\n : [];\n\n return {\n tooltip: { trigger: 'axis' as const, axisPointer: { type: 'shadow' as const } },\n legend: { show: !hideLegend, bottom: 0, type: 'scroll' as const },\n grid: { left: '3%', right: '4%', top: '3%', bottom: hideLegend ? '3%' : '12%', containLabel: true },\n xAxis: invertAxis ? valueAxis : categoryAxis,\n yAxis: invertAxis ? categoryAxis : valueAxis,\n dataZoom,\n series: series.map((s, i) => ({\n name: s.name,\n type: 'bar' as const,\n stack: 'total',\n emphasis: { focus: 'series' as const },\n data: s.values,\n itemStyle: { color: CHART_COLORS[i % CHART_COLORS.length] },\n })),\n };\n}\n\n/** Build ECharts option for pie chart. */\nexport function buildPieOption(\n categories: string[],\n series: { name: string; values: number[] }[],\n hideLegend: boolean,\n) {\n const pieData = categories.map((cat, catIdx) => {\n let total = 0;\n for (const s of series) {\n total += s.values[catIdx] ?? 0;\n }\n return { name: cat, value: total };\n });\n\n return {\n tooltip: { trigger: 'item' as const },\n legend: { show: !hideLegend, bottom: 0, type: 'scroll' as const },\n series: [\n {\n type: 'pie' as const,\n radius: ['30%', '65%'],\n center: ['50%', '45%'],\n data: pieData.map((d, i) => ({\n ...d,\n itemStyle: { color: CHART_COLORS[i % CHART_COLORS.length] },\n })),\n emphasis: { itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0,0,0,0.3)' } },\n label: { show: true, formatter: '{b}: {d}%' },\n },\n ],\n };\n}\n\n/** Build ECharts option for sunburst chart. */\nexport function buildSunburstOption(\n categories: string[],\n series: { name: string; values: number[] }[],\n) {\n const sunburstData = categories.map((cat, catIdx) => {\n const children = series\n .map((s, sIdx) => ({\n name: s.name,\n value: s.values[catIdx] ?? 0,\n itemStyle: { color: CHART_COLORS[(catIdx * series.length + sIdx) % CHART_COLORS.length] },\n }))\n .filter((child) => child.value > 0);\n\n return { name: cat, children };\n });\n\n return {\n tooltip: { trigger: 'item' as const },\n series: [\n {\n type: 'sunburst' as const,\n data: sunburstData,\n radius: ['15%', '80%'],\n label: { rotate: 'radial' as const, fontSize: 10 },\n itemStyle: { borderRadius: 4, borderWidth: 1 },\n emphasis: { focus: 'ancestor' as const },\n },\n ],\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index98.js","sources":["../src/charts/GroupedBarChartCard/buildGroupedBarOption.ts"],"sourcesContent":["import type { GroupedBarPivot } from './pivotGroupedBars';\nimport { CHART_COLORS, GROUPED_BAR } from '../../constants';\n\nexport interface GroupedBarOptionConfig {\n seriesColors?: Readonly<Record<string, string>>;\n invertAxis: boolean;\n hideLegend: boolean;\n integerValues: boolean;\n valueLabel?: string;\n /** Tooltip text for a gap. */\n noValueText: string;\n}\n\nconst { GRID_MARGIN, AXIS_NAME_GAP } = GROUPED_BAR;\n\n/** Category and series names come from consumer data and land in the tooltip's HTML. */\nconst escapeHtml = (value: string) =>\n value.replace(/[&<>\"]/g, (char) => `&#${char.charCodeAt(0)};`);\n\n/** Pinned colour first, else the palette by first-seen position. */\nconst colorFor = (name: string, index: number, seriesColors?: Readonly<Record<string, string>>) =>\n seriesColors?.[name] ?? CHART_COLORS[index % CHART_COLORS.length];\n\nconst markerFor = (color: string) => {\n const { TOOLTIP_MARKER_SIZE: size, TOOLTIP_MARKER_GAP: gap } = GROUPED_BAR;\n return `<span style=\"display:inline-block;margin-right:${gap}px;border-radius:50%;width:${size}px;height:${size}px;background-color:${escapeHtml(color)};\"></span>`;\n};\n\n/**\n * The tooltip is built from the pivot rather than from echarts' params, so every\n * series is listed in series order and a gap reads as `noValueText`, never `-`.\n */\nconst buildTooltipFormatter =\n (pivot: GroupedBarPivot, colors: string[], noValueText: string) => (params: unknown) => {\n const first = (Array.isArray(params) ? params[0] : params) as\n | { dataIndex?: number }\n | undefined;\n const index = first?.dataIndex;\n if (index == null || index >= pivot.categories.length) return '';\n\n const lines = [escapeHtml(pivot.categories[index])];\n pivot.series.forEach((s, i) => {\n const value = s.values[index];\n const text = value == null ? escapeHtml(noValueText) : String(value);\n lines.push(`${markerFor(colors[i])}${escapeHtml(s.name)}: ${text}`);\n });\n\n return lines.join('<br/>');\n };\n\nconst buildGrid = (config: GroupedBarOptionConfig) => {\n const named = Boolean(config.valueLabel);\n return {\n left: GRID_MARGIN.BASE + (named && !config.invertAxis ? GRID_MARGIN.VALUE_NAME_Y : 0),\n right: GRID_MARGIN.RIGHT,\n top: GRID_MARGIN.TOP,\n // Room for a horizontal value-axis name and the legend, each only when drawn.\n bottom:\n GRID_MARGIN.BASE +\n (named && config.invertAxis ? GRID_MARGIN.VALUE_NAME_X : 0) +\n (config.hideLegend ? 0 : GRID_MARGIN.LEGEND),\n containLabel: true,\n };\n};\n\nexport const buildGroupedBarOption = (pivot: GroupedBarPivot, config: GroupedBarOptionConfig) => {\n const colors = pivot.series.map((s, i) => colorFor(s.name, i, config.seriesColors));\n\n const categoryAxis = {\n type: 'category' as const,\n data: pivot.categories,\n // Horizontal bars read top-down, so the first category goes on top.\n inverse: config.invertAxis,\n };\n const valueAxis = {\n type: 'value' as const,\n name: config.valueLabel,\n nameLocation: 'middle' as const,\n nameGap: config.invertAxis ? AXIS_NAME_GAP.X : AXIS_NAME_GAP.Y,\n // Without this a vertical axis name is drawn horizontally and eats the plot's width.\n nameRotate: config.invertAxis ? 0 : 90,\n minInterval: config.integerValues ? 1 : undefined,\n };\n\n return {\n tooltip: {\n trigger: 'axis' as const,\n axisPointer: { type: 'shadow' as const },\n formatter: buildTooltipFormatter(pivot, colors, config.noValueText),\n },\n legend: { show: !config.hideLegend, bottom: 0, type: 'scroll' as const },\n grid: buildGrid(config),\n xAxis: config.invertAxis ? valueAxis : categoryAxis,\n yAxis: config.invertAxis ? categoryAxis : valueAxis,\n series: pivot.series.map((s, i) => ({\n name: s.name,\n type: 'bar' as const,\n data: s.values,\n barMinHeight: GROUPED_BAR.MIN_BAR_HEIGHT,\n itemStyle: { color: colors[i] },\n emphasis: { focus: 'series' as const },\n })),\n };\n};\n"],"names":[],"mappings":";AAaA,MAAM,EAAE,aAAa,cAAA,IAAkB;AAGvC,MAAM,aAAa,CAAC,UAClB,MAAM,QAAQ,WAAW,CAAC,SAAS,KAAK,KAAK,WAAW,CAAC,CAAC,GAAG;AAG/D,MAAM,WAAW,CAAC,MAAc,OAAe,kBAC7C,6CAAe,UAAS,aAAa,QAAQ,aAAa,MAAM;AAElE,MAAM,YAAY,CAAC,UAAkB;AACnC,QAAM,EAAE,qBAAqB,MAAM,oBAAoB,QAAQ;AAC/D,SAAO,kDAAkD,GAAG,8BAA8B,IAAI,aAAa,IAAI,uBAAuB,WAAW,KAAK,CAAC;AACzJ;AAMA,MAAM,wBACJ,CAAC,OAAwB,QAAkB,gBAAwB,CAAC,WAAoB;AACtF,QAAM,QAAS,MAAM,QAAQ,MAAM,IAAI,OAAO,CAAC,IAAI;AAGnD,QAAM,QAAQ,+BAAO;AACrB,MAAI,SAAS,QAAQ,SAAS,MAAM,WAAW,OAAQ,QAAO;AAE9D,QAAM,QAAQ,CAAC,WAAW,MAAM,WAAW,KAAK,CAAC,CAAC;AAClD,QAAM,OAAO,QAAQ,CAAC,GAAG,MAAM;AAC7B,UAAM,QAAQ,EAAE,OAAO,KAAK;AAC5B,UAAM,OAAO,SAAS,OAAO,WAAW,WAAW,IAAI,OAAO,KAAK;AACnE,UAAM,KAAK,GAAG,UAAU,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;AAAA,EACpE,CAAC;AAED,SAAO,MAAM,KAAK,OAAO;AAC3B;AAEF,MAAM,YAAY,CAAC,WAAmC;AACpD,QAAM,QAAQ,QAAQ,OAAO,UAAU;AACvC,SAAO;AAAA,IACL,MAAM,YAAY,QAAQ,SAAS,CAAC,OAAO,aAAa,YAAY,eAAe;AAAA,IACnF,OAAO,YAAY;AAAA,IACnB,KAAK,YAAY;AAAA;AAAA,IAEjB,QACE,YAAY,QACX,SAAS,OAAO,aAAa,YAAY,eAAe,MACxD,OAAO,aAAa,IAAI,YAAY;AAAA,IACvC,cAAc;AAAA,EAAA;AAElB;AAEO,MAAM,wBAAwB,CAAC,OAAwB,WAAmC;AAC/F,QAAM,SAAS,MAAM,OAAO,IAAI,CAAC,GAAG,MAAM,SAAS,EAAE,MAAM,GAAG,OAAO,YAAY,CAAC;AAElF,QAAM,eAAe;AAAA,IACnB,MAAM;AAAA,IACN,MAAM,MAAM;AAAA;AAAA,IAEZ,SAAS,OAAO;AAAA,EAAA;AAElB,QAAM,YAAY;AAAA,IAChB,MAAM;AAAA,IACN,MAAM,OAAO;AAAA,IACb,cAAc;AAAA,IACd,SAAS,OAAO,aAAa,cAAc,IAAI,cAAc;AAAA;AAAA,IAE7D,YAAY,OAAO,aAAa,IAAI;AAAA,IACpC,aAAa,OAAO,gBAAgB,IAAI;AAAA,EAAA;AAG1C,SAAO;AAAA,IACL,SAAS;AAAA,MACP,SAAS;AAAA,MACT,aAAa,EAAE,MAAM,SAAA;AAAA,MACrB,WAAW,sBAAsB,OAAO,QAAQ,OAAO,WAAW;AAAA,IAAA;AAAA,IAEpE,QAAQ,EAAE,MAAM,CAAC,OAAO,YAAY,QAAQ,GAAG,MAAM,SAAA;AAAA,IACrD,MAAM,UAAU,MAAM;AAAA,IACtB,OAAO,OAAO,aAAa,YAAY;AAAA,IACvC,OAAO,OAAO,aAAa,eAAe;AAAA,IAC1C,QAAQ,MAAM,OAAO,IAAI,CAAC,GAAG,OAAO;AAAA,MAClC,MAAM,EAAE;AAAA,MACR,MAAM;AAAA,MACN,MAAM,EAAE;AAAA,MACR,cAAc,YAAY;AAAA,MAC1B,WAAW,EAAE,OAAO,OAAO,CAAC,EAAA;AAAA,MAC5B,UAAU,EAAE,OAAO,SAAA;AAAA,IAAkB,EACrC;AAAA,EAAA;AAEN;"}
package/dist/index99.cjs CHANGED
@@ -1,48 +1,10 @@
1
1
  "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
- const root = "krc-root-U8B4Y";
4
- const header = "krc-header-dy6xQ";
5
- const headerLeft = "krc-headerLeft-80jJu";
6
- const title = "krc-title--e-Ci";
7
- const subtitle = "krc-subtitle-63ixC";
8
- const headerRight = "krc-headerRight-3Vuls";
9
- const toolbar = "krc-toolbar-h6ALf";
10
- const chartTypeToggle = "krc-chartTypeToggle-6DRWb";
11
- const active = "krc-active-Un9q0";
12
- const chartContainer = "krc-chartContainer-2Oz2N";
13
- const loading = "krc-loading-hTkxl";
14
- const error = "krc-error--F7yO";
15
- const retryButton = "krc-retryButton-w0SS7";
16
- const empty = "krc-empty-HWTS-";
17
- const styles = {
18
- root,
19
- header,
20
- headerLeft,
21
- title,
22
- subtitle,
23
- headerRight,
24
- toolbar,
25
- chartTypeToggle,
26
- active,
27
- chartContainer,
28
- loading,
29
- error,
30
- retryButton,
31
- empty
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const DEFAULT_LABELS = {
4
+ loading: "Loading chart...",
5
+ empty: "No data available.",
6
+ retry: "Retry",
7
+ noValue: "No data"
32
8
  };
33
- exports.active = active;
34
- exports.chartContainer = chartContainer;
35
- exports.chartTypeToggle = chartTypeToggle;
36
- exports.default = styles;
37
- exports.empty = empty;
38
- exports.error = error;
39
- exports.header = header;
40
- exports.headerLeft = headerLeft;
41
- exports.headerRight = headerRight;
42
- exports.loading = loading;
43
- exports.retryButton = retryButton;
44
- exports.root = root;
45
- exports.subtitle = subtitle;
46
- exports.title = title;
47
- exports.toolbar = toolbar;
9
+ exports.DEFAULT_LABELS = DEFAULT_LABELS;
48
10
  //# sourceMappingURL=index99.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index99.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index99.cjs","sources":["../src/charts/GroupedBarChartCard/defaultLabels.ts"],"sourcesContent":["import type { GroupedBarChartLabels } from './GroupedBarChartCard.types';\n\n/** English defaults, matching the texts of the other chart cards. */\nexport const DEFAULT_LABELS: GroupedBarChartLabels = {\n loading: 'Loading chart...',\n empty: 'No data available.',\n retry: 'Retry',\n noValue: 'No data',\n};\n"],"names":[],"mappings":";;AAGO,MAAM,iBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;;"}
package/dist/index99.js CHANGED
@@ -1,48 +1,10 @@
1
- const root = "krc-root-U8B4Y";
2
- const header = "krc-header-dy6xQ";
3
- const headerLeft = "krc-headerLeft-80jJu";
4
- const title = "krc-title--e-Ci";
5
- const subtitle = "krc-subtitle-63ixC";
6
- const headerRight = "krc-headerRight-3Vuls";
7
- const toolbar = "krc-toolbar-h6ALf";
8
- const chartTypeToggle = "krc-chartTypeToggle-6DRWb";
9
- const active = "krc-active-Un9q0";
10
- const chartContainer = "krc-chartContainer-2Oz2N";
11
- const loading = "krc-loading-hTkxl";
12
- const error = "krc-error--F7yO";
13
- const retryButton = "krc-retryButton-w0SS7";
14
- const empty = "krc-empty-HWTS-";
15
- const styles = {
16
- root,
17
- header,
18
- headerLeft,
19
- title,
20
- subtitle,
21
- headerRight,
22
- toolbar,
23
- chartTypeToggle,
24
- active,
25
- chartContainer,
26
- loading,
27
- error,
28
- retryButton,
29
- empty
1
+ const DEFAULT_LABELS = {
2
+ loading: "Loading chart...",
3
+ empty: "No data available.",
4
+ retry: "Retry",
5
+ noValue: "No data"
30
6
  };
31
7
  export {
32
- active,
33
- chartContainer,
34
- chartTypeToggle,
35
- styles as default,
36
- empty,
37
- error,
38
- header,
39
- headerLeft,
40
- headerRight,
41
- loading,
42
- retryButton,
43
- root,
44
- subtitle,
45
- title,
46
- toolbar
8
+ DEFAULT_LABELS
47
9
  };
48
10
  //# sourceMappingURL=index99.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index99.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index99.js","sources":["../src/charts/GroupedBarChartCard/defaultLabels.ts"],"sourcesContent":["import type { GroupedBarChartLabels } from './GroupedBarChartCard.types';\n\n/** English defaults, matching the texts of the other chart cards. */\nexport const DEFAULT_LABELS: GroupedBarChartLabels = {\n loading: 'Loading chart...',\n empty: 'No data available.',\n retry: 'Retry',\n noValue: 'No data',\n};\n"],"names":[],"mappings":"AAGO,MAAM,iBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;"}
package/dist/style.css CHANGED
@@ -1787,6 +1787,117 @@
1787
1787
  border: 0;
1788
1788
  clip-path: inset(50%);
1789
1789
  }
1790
+ /* Column flex so the chart takes the height the card is given: the container
1791
+ grows when the consumer sizes the card, and falls back to its own height
1792
+ when the card is left to size itself. */
1793
+ .krc-root-ij8wB {
1794
+ display: flex;
1795
+ flex-direction: column;
1796
+ background: var(--surface-color);
1797
+ border: var(--border-width) solid var(--border-color);
1798
+ border-radius: var(--radius-lg);
1799
+ box-shadow: var(--shadow-subtle);
1800
+ overflow: hidden;
1801
+ }
1802
+
1803
+ .krc-header-poY0R {
1804
+ display: flex;
1805
+ flex: 0 0 auto;
1806
+ align-items: center;
1807
+ justify-content: space-between;
1808
+ gap: var(--spacing-sm);
1809
+ padding: var(--spacing-sm) var(--spacing-md);
1810
+ border-bottom: var(--border-width) solid var(--border-color);
1811
+ }
1812
+
1813
+ .krc-headerText-ShzOl {
1814
+ display: flex;
1815
+ flex-direction: column;
1816
+ gap: var(--spacing-2xs);
1817
+ min-width: 0;
1818
+ }
1819
+
1820
+ .krc-title-H3VpM {
1821
+ margin: 0;
1822
+ font-size: var(--font-size-md);
1823
+ font-weight: 600;
1824
+ color: var(--text-primary);
1825
+ }
1826
+
1827
+ .krc-subtitle-n6tgG {
1828
+ font-size: var(--font-size-xs);
1829
+ color: var(--text-secondary);
1830
+ line-height: 1.4;
1831
+ }
1832
+
1833
+ .krc-headerActions-WY-hn {
1834
+ display: flex;
1835
+ align-items: center;
1836
+ gap: var(--spacing-xs);
1837
+ }
1838
+
1839
+ .krc-toolbar-lMVmb {
1840
+ display: flex;
1841
+ flex: 0 0 auto;
1842
+ align-items: center;
1843
+ gap: var(--spacing-md);
1844
+ padding: var(--spacing-xs) var(--spacing-md);
1845
+ border-bottom: var(--border-width) solid var(--border-color);
1846
+ }
1847
+
1848
+ /* An explicit height (not just a minimum) is what lets the echarts wrapper
1849
+ resolve its own `height: 100%`; `flex: 1` then lets it take any extra space
1850
+ the card was given. */
1851
+ .krc-chartContainer-nlbUx {
1852
+ flex: 1 1 auto;
1853
+ box-sizing: border-box;
1854
+ height: 18.75rem;
1855
+ min-height: 18.75rem;
1856
+ padding: var(--spacing-sm);
1857
+ }
1858
+
1859
+ .krc-loading-xub77,
1860
+ .krc-empty-vJ4UM {
1861
+ display: flex;
1862
+ flex: 1 1 auto;
1863
+ align-items: center;
1864
+ justify-content: center;
1865
+ min-height: 18.75rem;
1866
+ color: var(--text-secondary);
1867
+ font-size: var(--font-size-sm);
1868
+ }
1869
+
1870
+ .krc-error-d-7n5 {
1871
+ display: flex;
1872
+ flex: 1 1 auto;
1873
+ flex-direction: column;
1874
+ align-items: center;
1875
+ justify-content: center;
1876
+ gap: var(--spacing-sm);
1877
+ min-height: 18.75rem;
1878
+ color: var(--danger-color);
1879
+ font-size: var(--font-size-sm);
1880
+ }
1881
+
1882
+ .krc-retryButton-LT8qy {
1883
+ padding: var(--spacing-xs) var(--spacing-md);
1884
+ font-size: var(--font-size-sm);
1885
+ color: var(--accent-color-contrast);
1886
+ background: var(--accent-color);
1887
+ border: none;
1888
+ border-radius: var(--radius-sm);
1889
+ cursor: pointer;
1890
+ transition: background-color 0.15s ease;
1891
+ }
1892
+
1893
+ .krc-retryButton-LT8qy:hover {
1894
+ background: var(--accent-color-strong);
1895
+ }
1896
+
1897
+ .krc-retryButton-LT8qy:focus-visible {
1898
+ outline: none;
1899
+ box-shadow: var(--focus-ring-shadow);
1900
+ }
1790
1901
  .krc-wrap-JRsc1 {
1791
1902
  overflow: auto;
1792
1903
  border: var(--border-width) solid var(--border-color);
@@ -1806,13 +1917,28 @@
1806
1917
  white-space: nowrap;
1807
1918
  }
1808
1919
 
1920
+ /* The whole header is pinned, so one or two header rows always move together. */
1921
+ .krc-root-k9ocd thead {
1922
+ position: sticky;
1923
+ top: 0;
1924
+ z-index: 2;
1925
+ }
1926
+
1809
1927
  .krc-colh-Fi0Kr {
1810
1928
  background: var(--surface-alt);
1811
1929
  font-weight: 700;
1812
1930
  color: var(--text-secondary);
1813
- position: sticky;
1814
- top: 0;
1815
- z-index: 1;
1931
+ }
1932
+
1933
+ .krc-group-rVQPU {
1934
+ background: var(--surface-alt);
1935
+ font-weight: var(--font-weight-semibold);
1936
+ color: var(--text-secondary);
1937
+ }
1938
+
1939
+ /* On <colgroup>: with collapsed borders it is painted for the full height of the table. */
1940
+ .krc-groupStart-bu8S4 {
1941
+ border-left: var(--border-width-md) solid var(--border-color);
1816
1942
  }
1817
1943
 
1818
1944
  .krc-rowh-bTG4G {
@@ -1831,9 +1957,8 @@
1831
1957
  font-weight: 700;
1832
1958
  color: var(--text-secondary);
1833
1959
  position: sticky;
1834
- top: 0;
1835
1960
  left: 0;
1836
- z-index: 2;
1961
+ z-index: 1;
1837
1962
  }
1838
1963
 
1839
1964
  .krc-cell-i0lDG {