@carto/ps-react-ui 4.7.1 → 4.8.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 (574) hide show
  1. package/dist/category-DwaeYjpX.js +656 -0
  2. package/dist/category-DwaeYjpX.js.map +1 -0
  3. package/dist/change-column-Cidl_M-4.js +1110 -0
  4. package/dist/change-column-Cidl_M-4.js.map +1 -0
  5. package/dist/data-zoom-layout-BH0LPwSy.js +28 -0
  6. package/dist/data-zoom-layout-BH0LPwSy.js.map +1 -0
  7. package/dist/echart-CU0KmClP.js +176 -0
  8. package/dist/echart-CU0KmClP.js.map +1 -0
  9. package/dist/exports-Cx-f6m6U.js +63 -0
  10. package/dist/exports-Cx-f6m6U.js.map +1 -0
  11. package/dist/formula-DuC0NQLH.js +79 -0
  12. package/dist/formula-DuC0NQLH.js.map +1 -0
  13. package/dist/markdown-BD1jcknS.js +8326 -0
  14. package/dist/markdown-BD1jcknS.js.map +1 -0
  15. package/dist/merge-options-DCkkHZIf.js +34 -0
  16. package/dist/merge-options-DCkkHZIf.js.map +1 -0
  17. package/dist/{styles-BYTyKQFP.js → option-builders-F-c9ELi1.js} +25 -45
  18. package/dist/option-builders-F-c9ELi1.js.map +1 -0
  19. package/dist/png-item-CS4z1iSH.js +45 -0
  20. package/dist/png-item-CS4z1iSH.js.map +1 -0
  21. package/dist/range-DsqTjSpg.js +186 -0
  22. package/dist/range-DsqTjSpg.js.map +1 -0
  23. package/dist/spread-CTuIXZSM.js +67 -0
  24. package/dist/spread-CTuIXZSM.js.map +1 -0
  25. package/dist/style-DVnT6HC1.js +131 -0
  26. package/dist/style-DVnT6HC1.js.map +1 -0
  27. package/dist/styles-cohnxh9F.js +23 -0
  28. package/dist/styles-cohnxh9F.js.map +1 -0
  29. package/dist/table-HIpXuq4G.js +390 -0
  30. package/dist/table-HIpXuq4G.js.map +1 -0
  31. package/dist/transforms-Cdx4fkU5.js +106 -0
  32. package/dist/transforms-Cdx4fkU5.js.map +1 -0
  33. package/dist/types/widgets/echart/utils.test.d.ts +1 -0
  34. package/dist/types/widgets/formula/config.test.d.ts +1 -0
  35. package/dist/types/widgets/stores/widget-store-branches.test.d.ts +1 -0
  36. package/dist/types/widgets/table/config.test.d.ts +1 -0
  37. package/dist/types/widgets-v2/actions/brush-toggle/brush-toggle.d.ts +56 -0
  38. package/dist/types/widgets-v2/actions/brush-toggle/index.d.ts +3 -0
  39. package/dist/types/widgets-v2/actions/brush-toggle/labels.d.ts +5 -0
  40. package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +12 -0
  41. package/dist/types/widgets-v2/actions/brush-toggle/transforms.d.ts +11 -0
  42. package/dist/types/widgets-v2/actions/brush-toggle/transforms.test.d.ts +1 -0
  43. package/dist/types/widgets-v2/actions/change-column/change-column-icon.d.ts +2 -0
  44. package/dist/types/widgets-v2/actions/change-column/change-column.d.ts +29 -0
  45. package/dist/types/widgets-v2/actions/change-column/index.d.ts +3 -0
  46. package/dist/types/widgets-v2/actions/change-column/labels.d.ts +5 -0
  47. package/dist/types/widgets-v2/actions/change-column/sortable-column-item.d.ts +14 -0
  48. package/dist/types/widgets-v2/actions/change-column/style.d.ts +33 -0
  49. package/dist/types/widgets-v2/actions/change-column/types.d.ts +10 -0
  50. package/dist/types/widgets-v2/actions/download/download.d.ts +18 -0
  51. package/dist/types/widgets-v2/actions/download/exports.d.ts +37 -0
  52. package/dist/types/widgets-v2/actions/download/icons.d.ts +12 -0
  53. package/dist/types/widgets-v2/actions/download/index.d.ts +6 -0
  54. package/dist/types/widgets-v2/actions/download/labels.d.ts +11 -0
  55. package/dist/types/widgets-v2/actions/download/png-item.d.ts +24 -0
  56. package/dist/types/widgets-v2/actions/download/style.d.ts +1 -0
  57. package/dist/types/widgets-v2/actions/download/types.d.ts +35 -0
  58. package/dist/types/widgets-v2/actions/fullscreen/fullscreen.d.ts +59 -0
  59. package/dist/types/widgets-v2/actions/fullscreen/index.d.ts +3 -0
  60. package/dist/types/widgets-v2/actions/fullscreen/labels.d.ts +5 -0
  61. package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +48 -0
  62. package/dist/types/widgets-v2/actions/fullscreen/types.d.ts +14 -0
  63. package/dist/types/widgets-v2/actions/index.d.ts +9 -0
  64. package/dist/types/widgets-v2/actions/lock-selection/index.d.ts +3 -0
  65. package/dist/types/widgets-v2/actions/lock-selection/labels.d.ts +6 -0
  66. package/dist/types/widgets-v2/actions/lock-selection/lock-selection.d.ts +36 -0
  67. package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +12 -0
  68. package/dist/types/widgets-v2/actions/lock-selection/transforms.d.ts +6 -0
  69. package/dist/types/widgets-v2/actions/relative-data/index.d.ts +3 -0
  70. package/dist/types/widgets-v2/actions/relative-data/labels.d.ts +5 -0
  71. package/dist/types/widgets-v2/actions/relative-data/relative-data.d.ts +39 -0
  72. package/dist/types/widgets-v2/actions/relative-data/style.d.ts +12 -0
  73. package/dist/types/widgets-v2/actions/relative-data/transforms.d.ts +30 -0
  74. package/dist/types/widgets-v2/actions/relative-data/transforms.test.d.ts +1 -0
  75. package/dist/types/widgets-v2/actions/searcher/filter.d.ts +6 -0
  76. package/dist/types/widgets-v2/actions/searcher/index.d.ts +4 -0
  77. package/dist/types/widgets-v2/actions/searcher/labels.d.ts +7 -0
  78. package/dist/types/widgets-v2/actions/searcher/searcher-toggle.d.ts +23 -0
  79. package/dist/types/widgets-v2/actions/searcher/searcher.d.ts +11 -0
  80. package/dist/types/widgets-v2/actions/searcher/style.d.ts +16 -0
  81. package/dist/types/widgets-v2/actions/stack-toggle/index.d.ts +3 -0
  82. package/dist/types/widgets-v2/actions/stack-toggle/labels.d.ts +5 -0
  83. package/dist/types/widgets-v2/actions/stack-toggle/stack-toggle.d.ts +10 -0
  84. package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +12 -0
  85. package/dist/types/widgets-v2/actions/stack-toggle/transforms.d.ts +13 -0
  86. package/dist/types/widgets-v2/actions/stack-toggle/transforms.test.d.ts +1 -0
  87. package/dist/types/widgets-v2/actions/zoom-toggle/index.d.ts +3 -0
  88. package/dist/types/widgets-v2/actions/zoom-toggle/labels.d.ts +5 -0
  89. package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +12 -0
  90. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.d.ts +51 -0
  91. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.test.d.ts +1 -0
  92. package/dist/types/widgets-v2/actions/zoom-toggle/zoom-toggle.d.ts +35 -0
  93. package/dist/types/widgets-v2/bar/download.d.ts +24 -0
  94. package/dist/types/widgets-v2/bar/index.d.ts +4 -0
  95. package/dist/types/widgets-v2/bar/options.d.ts +43 -0
  96. package/dist/types/widgets-v2/bar/options.test.d.ts +1 -0
  97. package/dist/types/widgets-v2/bar/skeleton.d.ts +6 -0
  98. package/dist/types/widgets-v2/bar/types.d.ts +41 -0
  99. package/dist/types/widgets-v2/category/category-ui.d.ts +81 -0
  100. package/dist/types/widgets-v2/category/category.d.ts +48 -0
  101. package/dist/types/widgets-v2/category/components/category-bar-stacked.d.ts +28 -0
  102. package/dist/types/widgets-v2/category/components/category-bar.d.ts +23 -0
  103. package/dist/types/widgets-v2/category/components/category-legend.d.ts +18 -0
  104. package/dist/types/widgets-v2/category/components/category-row-multi.d.ts +31 -0
  105. package/dist/types/widgets-v2/category/components/category-row-other.d.ts +13 -0
  106. package/dist/types/widgets-v2/category/components/category-row-single.d.ts +28 -0
  107. package/dist/types/widgets-v2/category/components/category-row-stacked.d.ts +38 -0
  108. package/dist/types/widgets-v2/category/download.d.ts +16 -0
  109. package/dist/types/widgets-v2/category/download.test.d.ts +1 -0
  110. package/dist/types/widgets-v2/category/index.d.ts +10 -0
  111. package/dist/types/widgets-v2/category/skeleton.d.ts +11 -0
  112. package/dist/types/widgets-v2/category/style.d.ts +166 -0
  113. package/dist/types/widgets-v2/category/types.d.ts +49 -0
  114. package/dist/types/widgets-v2/echart/echart-ui.d.ts +44 -0
  115. package/dist/types/widgets-v2/echart/echart.d.ts +75 -0
  116. package/dist/types/widgets-v2/echart/index.d.ts +4 -0
  117. package/dist/types/widgets-v2/echart/shared-resize-observer.d.ts +5 -0
  118. package/dist/types/widgets-v2/echart/shared-resize-observer.test.d.ts +1 -0
  119. package/dist/types/widgets-v2/echart/style.d.ts +6 -0
  120. package/dist/types/widgets-v2/echart/use-chart-selection.d.ts +51 -0
  121. package/dist/types/widgets-v2/formula/delta.d.ts +22 -0
  122. package/dist/types/widgets-v2/formula/download.d.ts +20 -0
  123. package/dist/types/widgets-v2/formula/formula-ui.d.ts +20 -0
  124. package/dist/types/widgets-v2/formula/formula.d.ts +8 -0
  125. package/dist/types/widgets-v2/formula/index.d.ts +11 -0
  126. package/dist/types/widgets-v2/formula/note.d.ts +11 -0
  127. package/dist/types/widgets-v2/formula/prefix.d.ts +12 -0
  128. package/dist/types/widgets-v2/formula/series.d.ts +16 -0
  129. package/dist/types/widgets-v2/formula/skeleton.d.ts +4 -0
  130. package/dist/types/widgets-v2/formula/style.d.ts +29 -0
  131. package/dist/types/widgets-v2/formula/suffix.d.ts +12 -0
  132. package/dist/types/widgets-v2/formula/types.d.ts +40 -0
  133. package/dist/types/widgets-v2/formula/value.d.ts +14 -0
  134. package/dist/types/widgets-v2/histogram/download.d.ts +17 -0
  135. package/dist/types/widgets-v2/histogram/download.test.d.ts +1 -0
  136. package/dist/types/widgets-v2/histogram/index.d.ts +5 -0
  137. package/dist/types/widgets-v2/histogram/options.d.ts +42 -0
  138. package/dist/types/widgets-v2/histogram/options.test.d.ts +1 -0
  139. package/dist/types/widgets-v2/histogram/skeleton.d.ts +9 -0
  140. package/dist/types/widgets-v2/histogram/transforms.d.ts +17 -0
  141. package/dist/types/widgets-v2/histogram/transforms.test.d.ts +1 -0
  142. package/dist/types/widgets-v2/histogram/types.d.ts +47 -0
  143. package/dist/types/widgets-v2/index.d.ts +107 -0
  144. package/dist/types/widgets-v2/markdown/download.d.ts +16 -0
  145. package/dist/types/widgets-v2/markdown/download.test.d.ts +1 -0
  146. package/dist/types/widgets-v2/markdown/index.d.ts +6 -0
  147. package/dist/types/widgets-v2/markdown/markdown-content.d.ts +34 -0
  148. package/dist/types/widgets-v2/markdown/markdown-ui.d.ts +12 -0
  149. package/dist/types/widgets-v2/markdown/markdown.d.ts +6 -0
  150. package/dist/types/widgets-v2/markdown/skeleton.d.ts +4 -0
  151. package/dist/types/widgets-v2/markdown/style.d.ts +61 -0
  152. package/dist/types/widgets-v2/markdown/types.d.ts +4 -0
  153. package/dist/types/widgets-v2/note/labels.d.ts +5 -0
  154. package/dist/types/widgets-v2/note/style.d.ts +26 -0
  155. package/dist/types/widgets-v2/note/widget-note.d.ts +46 -0
  156. package/dist/types/widgets-v2/pie/download.d.ts +17 -0
  157. package/dist/types/widgets-v2/pie/download.test.d.ts +1 -0
  158. package/dist/types/widgets-v2/pie/index.d.ts +4 -0
  159. package/dist/types/widgets-v2/pie/options.d.ts +35 -0
  160. package/dist/types/widgets-v2/pie/options.test.d.ts +1 -0
  161. package/dist/types/widgets-v2/pie/skeleton.d.ts +4 -0
  162. package/dist/types/widgets-v2/pie/types.d.ts +50 -0
  163. package/dist/types/widgets-v2/provider/widget-provider.d.ts +32 -0
  164. package/dist/types/widgets-v2/range/index.d.ts +4 -0
  165. package/dist/types/widgets-v2/range/range-ui.d.ts +19 -0
  166. package/dist/types/widgets-v2/range/range.d.ts +19 -0
  167. package/dist/types/widgets-v2/range/skeleton.d.ts +9 -0
  168. package/dist/types/widgets-v2/range/style.d.ts +40 -0
  169. package/dist/types/widgets-v2/range/types.d.ts +37 -0
  170. package/dist/types/widgets-v2/scatterplot/download.d.ts +16 -0
  171. package/dist/types/widgets-v2/scatterplot/download.test.d.ts +1 -0
  172. package/dist/types/widgets-v2/scatterplot/index.d.ts +5 -0
  173. package/dist/types/widgets-v2/scatterplot/options.d.ts +42 -0
  174. package/dist/types/widgets-v2/scatterplot/options.test.d.ts +1 -0
  175. package/dist/types/widgets-v2/scatterplot/skeleton.d.ts +12 -0
  176. package/dist/types/widgets-v2/scatterplot/transforms.d.ts +17 -0
  177. package/dist/types/widgets-v2/scatterplot/transforms.test.d.ts +1 -0
  178. package/dist/types/widgets-v2/scatterplot/types.d.ts +50 -0
  179. package/dist/types/widgets-v2/selection-summary/labels.d.ts +6 -0
  180. package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +22 -0
  181. package/dist/types/widgets-v2/selection-summary/style.d.ts +23 -0
  182. package/dist/types/widgets-v2/spread/download.d.ts +15 -0
  183. package/dist/types/widgets-v2/spread/download.test.d.ts +1 -0
  184. package/dist/types/widgets-v2/spread/index.d.ts +6 -0
  185. package/dist/types/widgets-v2/spread/separator.d.ts +7 -0
  186. package/dist/types/widgets-v2/spread/skeleton.d.ts +9 -0
  187. package/dist/types/widgets-v2/spread/spread-ui.d.ts +18 -0
  188. package/dist/types/widgets-v2/spread/spread.d.ts +5 -0
  189. package/dist/types/widgets-v2/spread/types.d.ts +25 -0
  190. package/dist/types/widgets-v2/state/labels.d.ts +7 -0
  191. package/dist/types/widgets-v2/state/labels.test.d.ts +1 -0
  192. package/dist/types/widgets-v2/state/style.d.ts +19 -0
  193. package/dist/types/widgets-v2/state/widget-state.d.ts +19 -0
  194. package/dist/types/widgets-v2/stores/index.d.ts +8 -0
  195. package/dist/types/widgets-v2/stores/pipeline-middleware.d.ts +5 -0
  196. package/dist/types/widgets-v2/stores/pipeline-middleware.test.d.ts +1 -0
  197. package/dist/types/widgets-v2/stores/transforms.d.ts +4 -0
  198. package/dist/types/widgets-v2/stores/transforms.test.d.ts +1 -0
  199. package/dist/types/widgets-v2/stores/types.d.ts +55 -0
  200. package/dist/types/widgets-v2/stores/use-echart-instance.d.ts +15 -0
  201. package/dist/types/widgets-v2/stores/use-transform-enabled.d.ts +17 -0
  202. package/dist/types/widgets-v2/stores/use-transform.d.ts +12 -0
  203. package/dist/types/widgets-v2/stores/widget-context.d.ts +2 -0
  204. package/dist/types/widgets-v2/stores/widget-store-registry.d.ts +74 -0
  205. package/dist/types/widgets-v2/stores/widget-store-registry.test.d.ts +1 -0
  206. package/dist/types/widgets-v2/subheader/style.d.ts +10 -0
  207. package/dist/types/widgets-v2/subheader/subheader.d.ts +11 -0
  208. package/dist/types/widgets-v2/table/download.d.ts +18 -0
  209. package/dist/types/widgets-v2/table/download.test.d.ts +1 -0
  210. package/dist/types/widgets-v2/table/helpers.d.ts +32 -0
  211. package/dist/types/widgets-v2/table/helpers.test.d.ts +1 -0
  212. package/dist/types/widgets-v2/table/index.d.ts +7 -0
  213. package/dist/types/widgets-v2/table/labels.d.ts +22 -0
  214. package/dist/types/widgets-v2/table/skeleton.d.ts +22 -0
  215. package/dist/types/widgets-v2/table/style.d.ts +44 -0
  216. package/dist/types/widgets-v2/table/table-ui.d.ts +38 -0
  217. package/dist/types/widgets-v2/table/table.d.ts +50 -0
  218. package/dist/types/widgets-v2/table/types.d.ts +37 -0
  219. package/dist/types/widgets-v2/test-utils.d.ts +52 -0
  220. package/dist/types/widgets-v2/timeseries/download.d.ts +17 -0
  221. package/dist/types/widgets-v2/timeseries/download.test.d.ts +1 -0
  222. package/dist/types/widgets-v2/timeseries/index.d.ts +4 -0
  223. package/dist/types/widgets-v2/timeseries/options.d.ts +39 -0
  224. package/dist/types/widgets-v2/timeseries/options.test.d.ts +1 -0
  225. package/dist/types/widgets-v2/timeseries/skeleton.d.ts +8 -0
  226. package/dist/types/widgets-v2/timeseries/types.d.ts +56 -0
  227. package/dist/types/widgets-v2/toolbox/labels.d.ts +5 -0
  228. package/dist/types/widgets-v2/toolbox/style.d.ts +30 -0
  229. package/dist/types/widgets-v2/toolbox/toolbox.d.ts +49 -0
  230. package/dist/types/widgets-v2/utils/data-zoom-layout.d.ts +11 -0
  231. package/dist/types/widgets-v2/utils/index.d.ts +2 -0
  232. package/dist/types/widgets-v2/utils/merge-options.d.ts +12 -0
  233. package/dist/types/widgets-v2/utils/merge-options.test.d.ts +1 -0
  234. package/dist/types/widgets-v2/wrapper/index.d.ts +4 -0
  235. package/dist/types/widgets-v2/wrapper/labels.d.ts +6 -0
  236. package/dist/types/widgets-v2/wrapper/style.d.ts +111 -0
  237. package/dist/types/widgets-v2/wrapper/widget-actions.d.ts +22 -0
  238. package/dist/types/widgets-v2/wrapper/widget-content.d.ts +12 -0
  239. package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +51 -0
  240. package/dist/use-transform-DXPN3nY7.js +110 -0
  241. package/dist/use-transform-DXPN3nY7.js.map +1 -0
  242. package/dist/widget-context-DTGO0Yta.js +13 -0
  243. package/dist/widget-context-DTGO0Yta.js.map +1 -0
  244. package/dist/widget-store-registry-_W4Z4xp-.js +178 -0
  245. package/dist/widget-store-registry-_W4Z4xp-.js.map +1 -0
  246. package/dist/widgets/bar.js +14 -13
  247. package/dist/widgets/bar.js.map +1 -1
  248. package/dist/widgets/histogram.js +8 -7
  249. package/dist/widgets/histogram.js.map +1 -1
  250. package/dist/widgets/pie.js +19 -18
  251. package/dist/widgets/pie.js.map +1 -1
  252. package/dist/widgets/scatterplot.js +8 -7
  253. package/dist/widgets/scatterplot.js.map +1 -1
  254. package/dist/widgets/timeseries.js +11 -10
  255. package/dist/widgets/timeseries.js.map +1 -1
  256. package/dist/widgets/utils.js +8 -7
  257. package/dist/widgets/utils.js.map +1 -1
  258. package/dist/widgets-v2/actions.js +43 -0
  259. package/dist/widgets-v2/actions.js.map +1 -0
  260. package/dist/widgets-v2/bar.js +327 -0
  261. package/dist/widgets-v2/bar.js.map +1 -0
  262. package/dist/widgets-v2/category.js +104 -0
  263. package/dist/widgets-v2/category.js.map +1 -0
  264. package/dist/widgets-v2/echart.js +57 -0
  265. package/dist/widgets-v2/echart.js.map +1 -0
  266. package/dist/widgets-v2/formula.js +74 -0
  267. package/dist/widgets-v2/formula.js.map +1 -0
  268. package/dist/widgets-v2/histogram.js +350 -0
  269. package/dist/widgets-v2/histogram.js.map +1 -0
  270. package/dist/widgets-v2/markdown.js +68 -0
  271. package/dist/widgets-v2/markdown.js.map +1 -0
  272. package/dist/widgets-v2/pie.js +381 -0
  273. package/dist/widgets-v2/pie.js.map +1 -0
  274. package/dist/widgets-v2/range.js +52 -0
  275. package/dist/widgets-v2/range.js.map +1 -0
  276. package/dist/widgets-v2/scatterplot.js +405 -0
  277. package/dist/widgets-v2/scatterplot.js.map +1 -0
  278. package/dist/widgets-v2/spread.js +72 -0
  279. package/dist/widgets-v2/spread.js.map +1 -0
  280. package/dist/widgets-v2/stores.js +42 -0
  281. package/dist/widgets-v2/stores.js.map +1 -0
  282. package/dist/widgets-v2/table.js +78 -0
  283. package/dist/widgets-v2/table.js.map +1 -0
  284. package/dist/widgets-v2/timeseries.js +352 -0
  285. package/dist/widgets-v2/timeseries.js.map +1 -0
  286. package/dist/widgets-v2/utils.js +7 -0
  287. package/dist/widgets-v2/utils.js.map +1 -0
  288. package/dist/widgets-v2.js +953 -0
  289. package/dist/widgets-v2.js.map +1 -0
  290. package/package.json +73 -5
  291. package/src/components/lasso-tool/chip.test.tsx +176 -0
  292. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +171 -0
  293. package/src/components/lasso-tool/lasso-tool.test.tsx +198 -0
  294. package/src/components/list-data/list-data.test.tsx +73 -0
  295. package/src/components/no-data-alert/no-data-alert.test.tsx +38 -0
  296. package/src/components/responsive-drawer/responsive-drawer.test.tsx +68 -0
  297. package/src/widgets/actions/brush-toggle/brush-overlay.test.tsx +465 -0
  298. package/src/widgets/actions/brush-toggle/brush-toggle.test.tsx +208 -0
  299. package/src/widgets/actions/change-column/change-column-dnd.test.tsx +193 -0
  300. package/src/widgets/actions/change-column/sortable-column-item.test.tsx +124 -0
  301. package/src/widgets/actions/zoom-toggle/zoom-toggle.test.tsx +322 -0
  302. package/src/widgets/category/components/category-rows.test.tsx +213 -0
  303. package/src/widgets/echart/utils.test.ts +277 -0
  304. package/src/widgets/formula/config.test.ts +37 -0
  305. package/src/widgets/range/components/range-item.test.tsx +243 -0
  306. package/src/widgets/stores/widget-store-branches.test.ts +275 -0
  307. package/src/widgets/table/config.test.ts +65 -0
  308. package/src/widgets/utils/chart-config/option-builders.test.ts +188 -0
  309. package/src/widgets-v2/PERFORMANCE.md +189 -0
  310. package/src/widgets-v2/actions/brush-toggle/brush-toggle.test.tsx +180 -0
  311. package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +154 -0
  312. package/src/widgets-v2/actions/brush-toggle/index.ts +3 -0
  313. package/src/widgets-v2/actions/brush-toggle/labels.ts +9 -0
  314. package/src/widgets-v2/actions/brush-toggle/style.ts +11 -0
  315. package/src/widgets-v2/actions/brush-toggle/transforms.test.ts +47 -0
  316. package/src/widgets-v2/actions/brush-toggle/transforms.ts +31 -0
  317. package/src/widgets-v2/actions/change-column/change-column-icon.tsx +14 -0
  318. package/src/widgets-v2/actions/change-column/change-column.test.tsx +59 -0
  319. package/src/widgets-v2/actions/change-column/change-column.tsx +180 -0
  320. package/src/widgets-v2/actions/change-column/index.ts +7 -0
  321. package/src/widgets-v2/actions/change-column/labels.ts +9 -0
  322. package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +56 -0
  323. package/src/widgets-v2/actions/change-column/style.ts +32 -0
  324. package/src/widgets-v2/actions/change-column/types.ts +11 -0
  325. package/src/widgets-v2/actions/download/download.test.tsx +327 -0
  326. package/src/widgets-v2/actions/download/download.tsx +144 -0
  327. package/src/widgets-v2/actions/download/exports.test.tsx +198 -0
  328. package/src/widgets-v2/actions/download/exports.ts +115 -0
  329. package/src/widgets-v2/actions/download/icons.tsx +26 -0
  330. package/src/widgets-v2/actions/download/index.ts +13 -0
  331. package/src/widgets-v2/actions/download/labels.ts +16 -0
  332. package/src/widgets-v2/actions/download/png-item.test.tsx +72 -0
  333. package/src/widgets-v2/actions/download/png-item.tsx +52 -0
  334. package/src/widgets-v2/actions/download/style.ts +3 -0
  335. package/src/widgets-v2/actions/download/types.ts +32 -0
  336. package/src/widgets-v2/actions/fullscreen/fullscreen.test.tsx +150 -0
  337. package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +230 -0
  338. package/src/widgets-v2/actions/fullscreen/index.ts +7 -0
  339. package/src/widgets-v2/actions/fullscreen/labels.ts +9 -0
  340. package/src/widgets-v2/actions/fullscreen/style.ts +59 -0
  341. package/src/widgets-v2/actions/fullscreen/types.ts +15 -0
  342. package/src/widgets-v2/actions/index.ts +82 -0
  343. package/src/widgets-v2/actions/lock-selection/index.ts +10 -0
  344. package/src/widgets-v2/actions/lock-selection/labels.ts +11 -0
  345. package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +187 -0
  346. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +130 -0
  347. package/src/widgets-v2/actions/lock-selection/style.ts +11 -0
  348. package/src/widgets-v2/actions/lock-selection/transforms.ts +27 -0
  349. package/src/widgets-v2/actions/relative-data/index.ts +3 -0
  350. package/src/widgets-v2/actions/relative-data/labels.ts +9 -0
  351. package/src/widgets-v2/actions/relative-data/relative-data.test.tsx +71 -0
  352. package/src/widgets-v2/actions/relative-data/relative-data.tsx +107 -0
  353. package/src/widgets-v2/actions/relative-data/style.ts +11 -0
  354. package/src/widgets-v2/actions/relative-data/transforms.test.ts +151 -0
  355. package/src/widgets-v2/actions/relative-data/transforms.ts +70 -0
  356. package/src/widgets-v2/actions/searcher/filter.ts +28 -0
  357. package/src/widgets-v2/actions/searcher/index.ts +8 -0
  358. package/src/widgets-v2/actions/searcher/labels.ts +13 -0
  359. package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +91 -0
  360. package/src/widgets-v2/actions/searcher/searcher.test.tsx +92 -0
  361. package/src/widgets-v2/actions/searcher/searcher.tsx +112 -0
  362. package/src/widgets-v2/actions/searcher/style.ts +15 -0
  363. package/src/widgets-v2/actions/stack-toggle/index.ts +3 -0
  364. package/src/widgets-v2/actions/stack-toggle/labels.ts +9 -0
  365. package/src/widgets-v2/actions/stack-toggle/stack-toggle.test.tsx +61 -0
  366. package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +54 -0
  367. package/src/widgets-v2/actions/stack-toggle/style.ts +11 -0
  368. package/src/widgets-v2/actions/stack-toggle/transforms.test.ts +43 -0
  369. package/src/widgets-v2/actions/stack-toggle/transforms.ts +25 -0
  370. package/src/widgets-v2/actions/zoom-toggle/index.ts +9 -0
  371. package/src/widgets-v2/actions/zoom-toggle/labels.ts +9 -0
  372. package/src/widgets-v2/actions/zoom-toggle/style.ts +11 -0
  373. package/src/widgets-v2/actions/zoom-toggle/transforms.test.ts +148 -0
  374. package/src/widgets-v2/actions/zoom-toggle/transforms.ts +171 -0
  375. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.test.tsx +107 -0
  376. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +106 -0
  377. package/src/widgets-v2/bar/download.test.tsx +91 -0
  378. package/src/widgets-v2/bar/download.tsx +66 -0
  379. package/src/widgets-v2/bar/index.ts +10 -0
  380. package/src/widgets-v2/bar/options.test.ts +317 -0
  381. package/src/widgets-v2/bar/options.ts +326 -0
  382. package/src/widgets-v2/bar/skeleton.test.tsx +19 -0
  383. package/src/widgets-v2/bar/skeleton.tsx +69 -0
  384. package/src/widgets-v2/bar/types.ts +46 -0
  385. package/src/widgets-v2/category/category-ui.test.tsx +746 -0
  386. package/src/widgets-v2/category/category-ui.tsx +389 -0
  387. package/src/widgets-v2/category/category.relative-data.test.tsx +107 -0
  388. package/src/widgets-v2/category/category.stack-toggle.test.tsx +85 -0
  389. package/src/widgets-v2/category/category.test.tsx +305 -0
  390. package/src/widgets-v2/category/category.tsx +121 -0
  391. package/src/widgets-v2/category/components/category-bar-stacked.test.tsx +121 -0
  392. package/src/widgets-v2/category/components/category-bar-stacked.tsx +73 -0
  393. package/src/widgets-v2/category/components/category-bar.test.tsx +64 -0
  394. package/src/widgets-v2/category/components/category-bar.tsx +49 -0
  395. package/src/widgets-v2/category/components/category-legend.test.tsx +51 -0
  396. package/src/widgets-v2/category/components/category-legend.tsx +39 -0
  397. package/src/widgets-v2/category/components/category-row-multi.tsx +86 -0
  398. package/src/widgets-v2/category/components/category-row-other.test.tsx +28 -0
  399. package/src/widgets-v2/category/components/category-row-other.tsx +33 -0
  400. package/src/widgets-v2/category/components/category-row-single.tsx +76 -0
  401. package/src/widgets-v2/category/components/category-row-stacked.test.tsx +244 -0
  402. package/src/widgets-v2/category/components/category-row-stacked.tsx +99 -0
  403. package/src/widgets-v2/category/download.test.ts +71 -0
  404. package/src/widgets-v2/category/download.ts +54 -0
  405. package/src/widgets-v2/category/index.ts +32 -0
  406. package/src/widgets-v2/category/skeleton.test.tsx +26 -0
  407. package/src/widgets-v2/category/skeleton.tsx +74 -0
  408. package/src/widgets-v2/category/style.ts +290 -0
  409. package/src/widgets-v2/category/types.ts +54 -0
  410. package/src/widgets-v2/echart/echart-ui.test.tsx +232 -0
  411. package/src/widgets-v2/echart/echart-ui.tsx +184 -0
  412. package/src/widgets-v2/echart/echart.test.tsx +229 -0
  413. package/src/widgets-v2/echart/echart.tsx +199 -0
  414. package/src/widgets-v2/echart/index.ts +22 -0
  415. package/src/widgets-v2/echart/shared-resize-observer.test.ts +91 -0
  416. package/src/widgets-v2/echart/shared-resize-observer.ts +56 -0
  417. package/src/widgets-v2/echart/style.ts +8 -0
  418. package/src/widgets-v2/echart/use-chart-selection.test.tsx +118 -0
  419. package/src/widgets-v2/echart/use-chart-selection.ts +115 -0
  420. package/src/widgets-v2/formula/delta.tsx +61 -0
  421. package/src/widgets-v2/formula/download.test.tsx +65 -0
  422. package/src/widgets-v2/formula/download.tsx +69 -0
  423. package/src/widgets-v2/formula/formula-ui.test.tsx +91 -0
  424. package/src/widgets-v2/formula/formula-ui.tsx +66 -0
  425. package/src/widgets-v2/formula/formula.test.tsx +50 -0
  426. package/src/widgets-v2/formula/formula.tsx +34 -0
  427. package/src/widgets-v2/formula/index.ts +17 -0
  428. package/src/widgets-v2/formula/note.tsx +25 -0
  429. package/src/widgets-v2/formula/prefix.tsx +25 -0
  430. package/src/widgets-v2/formula/series.tsx +67 -0
  431. package/src/widgets-v2/formula/skeleton.test.tsx +21 -0
  432. package/src/widgets-v2/formula/skeleton.tsx +27 -0
  433. package/src/widgets-v2/formula/style.ts +31 -0
  434. package/src/widgets-v2/formula/subcomponents.test.tsx +107 -0
  435. package/src/widgets-v2/formula/suffix.tsx +25 -0
  436. package/src/widgets-v2/formula/types.ts +44 -0
  437. package/src/widgets-v2/formula/value.tsx +31 -0
  438. package/src/widgets-v2/histogram/download.test.ts +94 -0
  439. package/src/widgets-v2/histogram/download.ts +60 -0
  440. package/src/widgets-v2/histogram/index.ts +10 -0
  441. package/src/widgets-v2/histogram/options.test.ts +304 -0
  442. package/src/widgets-v2/histogram/options.ts +337 -0
  443. package/src/widgets-v2/histogram/skeleton.test.tsx +16 -0
  444. package/src/widgets-v2/histogram/skeleton.tsx +70 -0
  445. package/src/widgets-v2/histogram/transforms.test.ts +46 -0
  446. package/src/widgets-v2/histogram/transforms.ts +30 -0
  447. package/src/widgets-v2/histogram/types.ts +51 -0
  448. package/src/widgets-v2/index.ts +201 -0
  449. package/src/widgets-v2/markdown/download.test.ts +66 -0
  450. package/src/widgets-v2/markdown/download.ts +53 -0
  451. package/src/widgets-v2/markdown/index.ts +6 -0
  452. package/src/widgets-v2/markdown/markdown-content.test.tsx +155 -0
  453. package/src/widgets-v2/markdown/markdown-content.tsx +72 -0
  454. package/src/widgets-v2/markdown/markdown-ui.test.tsx +75 -0
  455. package/src/widgets-v2/markdown/markdown-ui.tsx +55 -0
  456. package/src/widgets-v2/markdown/markdown.test.tsx +39 -0
  457. package/src/widgets-v2/markdown/markdown.tsx +17 -0
  458. package/src/widgets-v2/markdown/skeleton.test.tsx +15 -0
  459. package/src/widgets-v2/markdown/skeleton.tsx +32 -0
  460. package/src/widgets-v2/markdown/style.ts +53 -0
  461. package/src/widgets-v2/markdown/types.ts +4 -0
  462. package/src/widgets-v2/note/labels.ts +9 -0
  463. package/src/widgets-v2/note/style.ts +26 -0
  464. package/src/widgets-v2/note/widget-note.test.tsx +158 -0
  465. package/src/widgets-v2/note/widget-note.tsx +172 -0
  466. package/src/widgets-v2/pie/download.test.ts +78 -0
  467. package/src/widgets-v2/pie/download.ts +55 -0
  468. package/src/widgets-v2/pie/index.ts +10 -0
  469. package/src/widgets-v2/pie/options.test.ts +585 -0
  470. package/src/widgets-v2/pie/options.ts +509 -0
  471. package/src/widgets-v2/pie/skeleton.test.tsx +17 -0
  472. package/src/widgets-v2/pie/skeleton.tsx +32 -0
  473. package/src/widgets-v2/pie/types.ts +55 -0
  474. package/src/widgets-v2/provider/widget-provider.test.tsx +119 -0
  475. package/src/widgets-v2/provider/widget-provider.tsx +111 -0
  476. package/src/widgets-v2/range/index.ts +4 -0
  477. package/src/widgets-v2/range/range-ui.test.tsx +130 -0
  478. package/src/widgets-v2/range/range-ui.tsx +211 -0
  479. package/src/widgets-v2/range/range.test.tsx +68 -0
  480. package/src/widgets-v2/range/range.tsx +46 -0
  481. package/src/widgets-v2/range/skeleton.test.tsx +17 -0
  482. package/src/widgets-v2/range/skeleton.tsx +47 -0
  483. package/src/widgets-v2/range/style.ts +41 -0
  484. package/src/widgets-v2/range/types.ts +37 -0
  485. package/src/widgets-v2/scatterplot/download.test.ts +71 -0
  486. package/src/widgets-v2/scatterplot/download.ts +54 -0
  487. package/src/widgets-v2/scatterplot/index.ts +11 -0
  488. package/src/widgets-v2/scatterplot/options.test.ts +399 -0
  489. package/src/widgets-v2/scatterplot/options.ts +421 -0
  490. package/src/widgets-v2/scatterplot/skeleton.test.tsx +17 -0
  491. package/src/widgets-v2/scatterplot/skeleton.tsx +84 -0
  492. package/src/widgets-v2/scatterplot/transforms.test.ts +97 -0
  493. package/src/widgets-v2/scatterplot/transforms.ts +38 -0
  494. package/src/widgets-v2/scatterplot/types.ts +55 -0
  495. package/src/widgets-v2/selection-summary/labels.ts +11 -0
  496. package/src/widgets-v2/selection-summary/selection-summary.test.tsx +53 -0
  497. package/src/widgets-v2/selection-summary/selection-summary.tsx +62 -0
  498. package/src/widgets-v2/selection-summary/style.ts +23 -0
  499. package/src/widgets-v2/spread/download.test.ts +64 -0
  500. package/src/widgets-v2/spread/download.ts +59 -0
  501. package/src/widgets-v2/spread/index.ts +6 -0
  502. package/src/widgets-v2/spread/separator.tsx +11 -0
  503. package/src/widgets-v2/spread/skeleton.test.tsx +17 -0
  504. package/src/widgets-v2/spread/skeleton.tsx +38 -0
  505. package/src/widgets-v2/spread/spread-ui.test.tsx +108 -0
  506. package/src/widgets-v2/spread/spread-ui.tsx +52 -0
  507. package/src/widgets-v2/spread/spread.test.tsx +50 -0
  508. package/src/widgets-v2/spread/spread.tsx +31 -0
  509. package/src/widgets-v2/spread/types.ts +27 -0
  510. package/src/widgets-v2/state/labels.test.ts +33 -0
  511. package/src/widgets-v2/state/labels.ts +20 -0
  512. package/src/widgets-v2/state/style.ts +25 -0
  513. package/src/widgets-v2/state/widget-state.test.tsx +294 -0
  514. package/src/widgets-v2/state/widget-state.tsx +184 -0
  515. package/src/widgets-v2/stores/index.ts +49 -0
  516. package/src/widgets-v2/stores/pipeline-middleware.test.ts +187 -0
  517. package/src/widgets-v2/stores/pipeline-middleware.ts +91 -0
  518. package/src/widgets-v2/stores/transforms.test.ts +162 -0
  519. package/src/widgets-v2/stores/transforms.ts +70 -0
  520. package/src/widgets-v2/stores/types.ts +64 -0
  521. package/src/widgets-v2/stores/use-echart-instance.test.tsx +91 -0
  522. package/src/widgets-v2/stores/use-echart-instance.ts +29 -0
  523. package/src/widgets-v2/stores/use-transform-enabled.test.tsx +127 -0
  524. package/src/widgets-v2/stores/use-transform-enabled.ts +25 -0
  525. package/src/widgets-v2/stores/use-transform.test.tsx +262 -0
  526. package/src/widgets-v2/stores/use-transform.ts +158 -0
  527. package/src/widgets-v2/stores/widget-context.test.tsx +58 -0
  528. package/src/widgets-v2/stores/widget-context.ts +15 -0
  529. package/src/widgets-v2/stores/widget-store-registry.test.ts +292 -0
  530. package/src/widgets-v2/stores/widget-store-registry.ts +248 -0
  531. package/src/widgets-v2/subheader/style.ts +12 -0
  532. package/src/widgets-v2/subheader/subheader.test.tsx +30 -0
  533. package/src/widgets-v2/subheader/subheader.tsx +16 -0
  534. package/src/widgets-v2/table/download.test.ts +75 -0
  535. package/src/widgets-v2/table/download.ts +47 -0
  536. package/src/widgets-v2/table/helpers.test.ts +214 -0
  537. package/src/widgets-v2/table/helpers.ts +136 -0
  538. package/src/widgets-v2/table/index.ts +23 -0
  539. package/src/widgets-v2/table/labels.tsx +41 -0
  540. package/src/widgets-v2/table/skeleton.test.tsx +26 -0
  541. package/src/widgets-v2/table/skeleton.tsx +65 -0
  542. package/src/widgets-v2/table/style.ts +46 -0
  543. package/src/widgets-v2/table/table-ui.test.tsx +200 -0
  544. package/src/widgets-v2/table/table-ui.tsx +331 -0
  545. package/src/widgets-v2/table/table.test.tsx +119 -0
  546. package/src/widgets-v2/table/table.tsx +174 -0
  547. package/src/widgets-v2/table/types.ts +44 -0
  548. package/src/widgets-v2/test-utils.ts +107 -0
  549. package/src/widgets-v2/timeseries/download.test.ts +95 -0
  550. package/src/widgets-v2/timeseries/download.ts +86 -0
  551. package/src/widgets-v2/timeseries/index.ts +10 -0
  552. package/src/widgets-v2/timeseries/options.test.ts +379 -0
  553. package/src/widgets-v2/timeseries/options.ts +341 -0
  554. package/src/widgets-v2/timeseries/skeleton.test.tsx +13 -0
  555. package/src/widgets-v2/timeseries/skeleton.tsx +76 -0
  556. package/src/widgets-v2/timeseries/types.ts +61 -0
  557. package/src/widgets-v2/toolbox/labels.ts +9 -0
  558. package/src/widgets-v2/toolbox/style.ts +33 -0
  559. package/src/widgets-v2/toolbox/toolbox.test.tsx +200 -0
  560. package/src/widgets-v2/toolbox/toolbox.tsx +309 -0
  561. package/src/widgets-v2/utils/data-zoom-layout.ts +26 -0
  562. package/src/widgets-v2/utils/index.ts +2 -0
  563. package/src/widgets-v2/utils/merge-options.test.ts +52 -0
  564. package/src/widgets-v2/utils/merge-options.ts +50 -0
  565. package/src/widgets-v2/wrapper/index.ts +14 -0
  566. package/src/widgets-v2/wrapper/labels.ts +11 -0
  567. package/src/widgets-v2/wrapper/style.ts +134 -0
  568. package/src/widgets-v2/wrapper/widget-actions.test.tsx +52 -0
  569. package/src/widgets-v2/wrapper/widget-actions.tsx +43 -0
  570. package/src/widgets-v2/wrapper/widget-content.test.tsx +27 -0
  571. package/src/widgets-v2/wrapper/widget-content.tsx +29 -0
  572. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +159 -0
  573. package/src/widgets-v2/wrapper/widget-wrapper.tsx +178 -0
  574. package/dist/styles-BYTyKQFP.js.map +0 -1
@@ -0,0 +1,49 @@
1
+ import { Box } from '@mui/material'
2
+ import type { CategorySize } from '../types'
3
+ import { styles } from '../style'
4
+
5
+ export interface CategoryBarProps {
6
+ /** Numeric value driving the fill width. */
7
+ value: number
8
+ /** Denominator for the percentage fill. `0` → empty bar (no division by zero). */
9
+ maxValue: number
10
+ /** Fill color. Honors any CSS color or MUI theme token. */
11
+ color: string
12
+ /**
13
+ * Visual density. `'small'` (default) keeps the historical 4px pill;
14
+ * `'medium'` renders a 12px-tall track with a 2px corner radius. Only
15
+ * the bar track + fill change — every other token in the parent row is
16
+ * size-invariant.
17
+ */
18
+ size?: CategorySize
19
+ }
20
+
21
+ /**
22
+ * Single horizontal bar (track + proportional fill). Pure presentation.
23
+ * Selection / dimming live at the row level; this component is unaware of
24
+ * both — bars stay vivid regardless of selection state (per the v2
25
+ * "row-bg + row-dim, never muted bar" rule).
26
+ */
27
+ export function CategoryBar({
28
+ value,
29
+ maxValue,
30
+ color,
31
+ size = 'small',
32
+ }: CategoryBarProps) {
33
+ const pct = maxValue > 0 ? (value / maxValue) * 100 : 0
34
+ // Width + color rendered as inline `style` (not `sx`) to avoid
35
+ // generating a new emotion class for every distinct value/color pair
36
+ // — also makes the rendered DOM testable without computed-style math.
37
+ return (
38
+ <Box sx={styles.bar[size]} data-size={size}>
39
+ <Box
40
+ sx={styles.barFill[size]}
41
+ style={{ width: `${pct}%`, backgroundColor: color }}
42
+ // Tag the fill so an ancestor row's `:hover` selector can target
43
+ // it (`&:hover [data-bar-fill]`) — the brightening affordance now
44
+ // fires from anywhere in the row, not only the bar track.
45
+ data-bar-fill='true'
46
+ />
47
+ </Box>
48
+ )
49
+ }
@@ -0,0 +1,51 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { render, screen } from '@testing-library/react'
3
+ import { CategoryLegend } from './category-legend'
4
+
5
+ const noColors = () => undefined
6
+
7
+ describe('<CategoryLegend>', () => {
8
+ it('renders nothing when series is empty', () => {
9
+ const { container } = render(
10
+ <CategoryLegend series={[]} colorAt={noColors} />,
11
+ )
12
+ expect(container.firstChild).toBeNull()
13
+ })
14
+
15
+ it('renders one item per series with its name', () => {
16
+ render(
17
+ <CategoryLegend
18
+ series={[{ name: '2024' }, { name: '2025' }]}
19
+ colorAt={(i) => (i === 0 ? 'rgb(1, 1, 1)' : 'rgb(2, 2, 2)')}
20
+ />,
21
+ )
22
+ expect(screen.getByText('2024')).toBeTruthy()
23
+ expect(screen.getByText('2025')).toBeTruthy()
24
+ })
25
+
26
+ it('per-series color override (series[i].color) wins over colorAt(i)', () => {
27
+ const { container } = render(
28
+ <CategoryLegend
29
+ series={[{ name: 'S1', color: 'rgb(99, 0, 0)' }]}
30
+ colorAt={() => 'rgb(0, 0, 0)'}
31
+ />,
32
+ )
33
+ const dot = Array.from(container.querySelectorAll('div')).find(
34
+ (d) => (d as HTMLElement).style.backgroundColor === 'rgb(99, 0, 0)',
35
+ )
36
+ expect(dot).toBeTruthy()
37
+ })
38
+
39
+ it('falls back to colorAt(i) when series[i].color is absent', () => {
40
+ const { container } = render(
41
+ <CategoryLegend
42
+ series={[{ name: 'S1' }]}
43
+ colorAt={() => 'rgb(7, 7, 7)'}
44
+ />,
45
+ )
46
+ const dot = Array.from(container.querySelectorAll('div')).find(
47
+ (d) => (d as HTMLElement).style.backgroundColor === 'rgb(7, 7, 7)',
48
+ )
49
+ expect(dot).toBeTruthy()
50
+ })
51
+ })
@@ -0,0 +1,39 @@
1
+ import { Box, Typography } from '@mui/material'
2
+ import type { CategorySeriesConfig } from '../types'
3
+ import { styles } from '../style'
4
+
5
+ export interface CategoryLegendProps {
6
+ /** Series metadata. Empty array → renders nothing. */
7
+ series: readonly CategorySeriesConfig[]
8
+ /**
9
+ * Per-series colour resolver. Receives the series index and returns the
10
+ * palette colour (or `undefined` to fall back to the MUI default). The
11
+ * legend derives its dot colour from this on the fly — the caller does
12
+ * NOT pre-compute a `colors` array (avoids passing two views of the
13
+ * same source).
14
+ */
15
+ colorAt: (index: number) => string | undefined
16
+ }
17
+
18
+ /**
19
+ * Sticky color legend rendered below a multi-series Category list.
20
+ * Per-series `color` overrides the matching `colorAt(i)` result.
21
+ */
22
+ export function CategoryLegend({ series, colorAt }: CategoryLegendProps) {
23
+ if (series.length === 0) return null
24
+ return (
25
+ <Box sx={styles.legend}>
26
+ {series.map((s, i) => (
27
+ <Box key={s.name} sx={styles.legendItem}>
28
+ <Box
29
+ sx={styles.legendDot}
30
+ style={{ backgroundColor: s.color ?? colorAt(i) }}
31
+ />
32
+ <Typography variant='caption' sx={styles.legendLabel}>
33
+ {s.name}
34
+ </Typography>
35
+ </Box>
36
+ ))}
37
+ </Box>
38
+ )
39
+ }
@@ -0,0 +1,86 @@
1
+ import type { KeyboardEvent } from 'react'
2
+ import { Box, Typography } from '@mui/material'
3
+ import { CategoryBar } from './category-bar'
4
+ import type { CategoryKey, CategorySize } from '../types'
5
+ import { styles } from '../style'
6
+
7
+ export interface CategoryRowMultiProps {
8
+ /** Raw category key — what gets emitted to `onToggle`. */
9
+ name: CategoryKey
10
+ /** Display label (post-`labelFormatter`). Falls back to `name`. */
11
+ displayName?: string | number
12
+ /** One value per series. `0` is rendered as an empty bar (track only). */
13
+ values: readonly number[]
14
+ /** One color per series (palette + per-series overrides resolved upstream). */
15
+ colors: readonly string[]
16
+ /** Shared max across all series + rows (or `maxOverride`). */
17
+ maxValue: number
18
+ formatter: (n: number) => string
19
+ selected: boolean
20
+ onToggle: (name: CategoryKey) => void
21
+ /** Bar visual density. Forwarded to every {@link CategoryBar} in the row. */
22
+ size?: CategorySize
23
+ }
24
+
25
+ /**
26
+ * Multi-series category row: label spans the top; bar+value pairs stack
27
+ * vertically below, one per series. Each bar uses the full row width
28
+ * track (no shared grid) for legibility at N>=2 series. Click anywhere
29
+ * in the row (label OR any bar/value) toggles selection by `name`.
30
+ *
31
+ * Visual selection / dim signal lives ENTIRELY in the bar colors
32
+ * (`colors` prop) — every series in a dimmed row receives
33
+ * `theme.palette.action.disabled`; selected / unselected-no-selection
34
+ * rows receive their real palette colors. Computed upstream by
35
+ * `CategoryUI`. The row itself has no bg tint, no opacity rule.
36
+ */
37
+ export function CategoryRowMulti({
38
+ name,
39
+ displayName,
40
+ values,
41
+ colors,
42
+ maxValue,
43
+ formatter,
44
+ selected,
45
+ onToggle,
46
+ size,
47
+ }: CategoryRowMultiProps) {
48
+ const handleKey = (e: KeyboardEvent<HTMLDivElement>): void => {
49
+ if (e.key === 'Enter' || e.key === ' ') {
50
+ e.preventDefault()
51
+ onToggle(name)
52
+ }
53
+ }
54
+ return (
55
+ <Box
56
+ role='button'
57
+ aria-pressed={selected}
58
+ tabIndex={0}
59
+ onClick={() => onToggle(name)}
60
+ onKeyDown={handleKey}
61
+ sx={styles.rowMulti}
62
+ >
63
+ <Typography variant='body2' sx={styles.multiName}>
64
+ {displayName ?? name}
65
+ </Typography>
66
+ {values.map((v, i) => (
67
+ // Multi-bar rows iterate per series — the bar belongs to series `i`,
68
+ // and the row is keyed on the parent's `name`, so a composite of
69
+ // `name` + the series index is stable across reorders.
70
+ <Box key={`${name}-series-${i}`} sx={styles.multiBarRow}>
71
+ <Box sx={styles.multiBarContainer}>
72
+ <CategoryBar
73
+ value={v}
74
+ maxValue={maxValue}
75
+ color={colors[i] ?? ''}
76
+ size={size}
77
+ />
78
+ </Box>
79
+ <Typography variant='body2' sx={styles.value}>
80
+ {formatter(v)}
81
+ </Typography>
82
+ </Box>
83
+ ))}
84
+ </Box>
85
+ )
86
+ }
@@ -0,0 +1,28 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { render, screen } from '@testing-library/react'
3
+ import { CategoryRowOther } from './category-row-other'
4
+
5
+ describe('<CategoryRowOther>', () => {
6
+ it('renders the default labels with substituted count', () => {
7
+ render(<CategoryRowOther hiddenCount={7} />)
8
+ expect(screen.getByText('Other')).toBeTruthy()
9
+ expect(screen.getByText('(7 more)')).toBeTruthy()
10
+ })
11
+
12
+ it('honors custom labels with {count} placeholder', () => {
13
+ render(
14
+ <CategoryRowOther
15
+ hiddenCount={3}
16
+ otherLabel='Hidden'
17
+ otherCountLabel='+{count} not shown'
18
+ />,
19
+ )
20
+ expect(screen.getByText('Hidden')).toBeTruthy()
21
+ expect(screen.getByText('(+3 not shown)')).toBeTruthy()
22
+ })
23
+
24
+ it('is not a button (non-interactive)', () => {
25
+ const { container } = render(<CategoryRowOther hiddenCount={1} />)
26
+ expect(container.querySelectorAll('[role="button"]').length).toBe(0)
27
+ })
28
+ })
@@ -0,0 +1,33 @@
1
+ import { Box, Typography } from '@mui/material'
2
+ import { styles } from '../style'
3
+
4
+ export interface CategoryRowOtherProps {
5
+ hiddenCount: number
6
+ /** Label for the overflow row. Defaults to `'Other'`. */
7
+ otherLabel?: string
8
+ /** Count text with `{count}` placeholder. Defaults to `'{count} more'`. */
9
+ otherCountLabel?: string
10
+ }
11
+
12
+ /**
13
+ * Static "Other (X more)" overflow summary row. Rendered after the last
14
+ * visible category row when `data.length > maxItems`. Non-interactive —
15
+ * no selection, no keyboard target.
16
+ */
17
+ export function CategoryRowOther({
18
+ hiddenCount,
19
+ otherLabel = 'Other',
20
+ otherCountLabel = '{count} more',
21
+ }: CategoryRowOtherProps) {
22
+ const countText = otherCountLabel.replace('{count}', String(hiddenCount))
23
+ return (
24
+ <Box sx={styles.otherRow}>
25
+ <Typography variant='body2' sx={styles.otherLabel}>
26
+ {otherLabel}
27
+ </Typography>
28
+ <Typography variant='body2' sx={styles.otherCount}>
29
+ ({countText})
30
+ </Typography>
31
+ </Box>
32
+ )
33
+ }
@@ -0,0 +1,76 @@
1
+ import type { KeyboardEvent } from 'react'
2
+ import { Box, Typography } from '@mui/material'
3
+ import { CategoryBar } from './category-bar'
4
+ import type { CategoryKey, CategorySize } from '../types'
5
+ import { styles } from '../style'
6
+
7
+ export interface CategoryRowSingleProps {
8
+ /** Raw category key — what gets emitted to `onToggle` regardless of formatter. */
9
+ name: CategoryKey
10
+ /** Display label (post-`labelFormatter`). Falls back to `name` when omitted. */
11
+ displayName?: string | number
12
+ value: number
13
+ maxValue: number
14
+ color: string
15
+ formatter: (n: number) => string
16
+ selected: boolean
17
+ onToggle: (name: CategoryKey) => void
18
+ /** Bar visual density. Forwarded to {@link CategoryBar}. */
19
+ size?: CategorySize
20
+ }
21
+
22
+ /**
23
+ * Single-series category row: `[label] [bar] [value]` grid. Click /
24
+ * Enter / Space toggles `name` in/out of the selection set via
25
+ * `onToggle`. Selection key is always the raw `name` — `displayName` is
26
+ * presentation only.
27
+ *
28
+ * Visual selection / dim signal lives ENTIRELY in the bar color
29
+ * (`color` prop) — computed upstream by `CategoryUI` (real palette
30
+ * color when selected or no-selection; `theme.palette.action.disabled`
31
+ * when a selection exists and this row isn't in it). The row itself
32
+ * has no bg tint, no opacity rule.
33
+ */
34
+ export function CategoryRowSingle({
35
+ name,
36
+ displayName,
37
+ value,
38
+ maxValue,
39
+ color,
40
+ formatter,
41
+ selected,
42
+ onToggle,
43
+ size,
44
+ }: CategoryRowSingleProps) {
45
+ const handleKey = (e: KeyboardEvent<HTMLDivElement>): void => {
46
+ if (e.key === 'Enter' || e.key === ' ') {
47
+ e.preventDefault()
48
+ onToggle(name)
49
+ }
50
+ }
51
+ return (
52
+ <Box
53
+ role='button'
54
+ aria-pressed={selected}
55
+ tabIndex={0}
56
+ onClick={() => onToggle(name)}
57
+ onKeyDown={handleKey}
58
+ sx={styles.rowSingle}
59
+ >
60
+ <Box sx={styles.rowHeader}>
61
+ <Typography variant='body2' sx={styles.name}>
62
+ {displayName ?? name}
63
+ </Typography>
64
+ <Typography variant='body2' sx={styles.value}>
65
+ {formatter(value)}
66
+ </Typography>
67
+ </Box>
68
+ <CategoryBar
69
+ value={value}
70
+ maxValue={maxValue}
71
+ color={color}
72
+ size={size}
73
+ />
74
+ </Box>
75
+ )
76
+ }
@@ -0,0 +1,244 @@
1
+ import { describe, it, expect, vi } from 'vitest'
2
+ import { fireEvent, render, screen, within } from '@testing-library/react'
3
+ import { CategoryRowStacked } from './category-row-stacked'
4
+
5
+ const COLORS = ['rgb(0, 200, 0)', 'rgb(0, 100, 0)']
6
+
7
+ describe('<CategoryRowStacked>', () => {
8
+ it('renders displayName ?? name on the left of the header', () => {
9
+ render(
10
+ <CategoryRowStacked
11
+ name='cat-key'
12
+ displayName='Cat'
13
+ values={[45, 32]}
14
+ colors={COLORS}
15
+ seriesNames={['Women', 'Men']}
16
+ formatter={(n) => String(n)}
17
+ selected={false}
18
+ onToggle={vi.fn()}
19
+ />,
20
+ )
21
+ expect(screen.getByText('Cat')).toBeTruthy()
22
+ expect(screen.queryByText('cat-key')).toBeNull()
23
+ })
24
+
25
+ it('falls back to the raw name when displayName is omitted', () => {
26
+ render(
27
+ <CategoryRowStacked
28
+ name='Plain'
29
+ values={[1]}
30
+ colors={['rgb(0, 0, 0)']}
31
+ seriesNames={['S']}
32
+ formatter={(n) => String(n)}
33
+ selected={false}
34
+ onToggle={vi.fn()}
35
+ />,
36
+ )
37
+ expect(screen.getByText('Plain')).toBeTruthy()
38
+ })
39
+
40
+ it('renders formatter(sum) on the right of the header', () => {
41
+ render(
42
+ <CategoryRowStacked
43
+ name='Cat'
44
+ values={[45, 32]}
45
+ colors={COLORS}
46
+ seriesNames={['Women', 'Men']}
47
+ formatter={(n) => `${n}K`}
48
+ selected={false}
49
+ onToggle={vi.fn()}
50
+ />,
51
+ )
52
+ expect(screen.getByText('77K')).toBeTruthy()
53
+ })
54
+
55
+ it('renders one breakdown entry per series, including zero values', () => {
56
+ render(
57
+ <CategoryRowStacked
58
+ name='Cat'
59
+ values={[45, 0, 32]}
60
+ colors={[...COLORS, 'rgb(0, 50, 0)']}
61
+ seriesNames={['Women', 'Other', 'Men']}
62
+ formatter={(n) => String(n)}
63
+ selected={false}
64
+ onToggle={vi.fn()}
65
+ />,
66
+ )
67
+ expect(screen.getByText('Women: 45')).toBeTruthy()
68
+ expect(screen.getByText('Other: 0')).toBeTruthy()
69
+ expect(screen.getByText('Men: 32')).toBeTruthy()
70
+ })
71
+
72
+ it('falls back to "Series N" for missing series names (1-indexed)', () => {
73
+ render(
74
+ <CategoryRowStacked
75
+ name='Cat'
76
+ values={[45, 32]}
77
+ colors={COLORS}
78
+ seriesNames={[]}
79
+ formatter={(n) => String(n)}
80
+ selected={false}
81
+ onToggle={vi.fn()}
82
+ />,
83
+ )
84
+ expect(screen.getByText('Series 1: 45')).toBeTruthy()
85
+ expect(screen.getByText('Series 2: 32')).toBeTruthy()
86
+ })
87
+
88
+ it('per-row normalization: bar fills 100% with segments proportional to the row sum', () => {
89
+ // values [30, 70] sum to 100 → segments at 30% and 70%, cumulative
90
+ // offsets 0% and 30%. The bar saturates regardless of any
91
+ // hypothetical global max — that's the point of stacked mode.
92
+ const { container } = render(
93
+ <CategoryRowStacked
94
+ name='Cat'
95
+ values={[30, 70]}
96
+ colors={COLORS}
97
+ seriesNames={['A', 'B']}
98
+ formatter={(n) => String(n)}
99
+ selected={false}
100
+ onToggle={vi.fn()}
101
+ />,
102
+ )
103
+ const fills = container.querySelectorAll<HTMLElement>(
104
+ '[data-bar-fill="true"]',
105
+ )
106
+ expect(fills.length).toBe(2)
107
+ expect(fills[0]!.style.left).toBe('0%')
108
+ expect(fills[0]!.style.width).toBe('30%')
109
+ expect(fills[1]!.style.left).toBe('30%')
110
+ expect(fills[1]!.style.width).toBe('70%')
111
+ })
112
+
113
+ it('per-row normalization: bar still fills 100% for an arbitrary row total (45 + 32 → 77)', () => {
114
+ const { container } = render(
115
+ <CategoryRowStacked
116
+ name='Cat'
117
+ values={[45, 32]}
118
+ colors={COLORS}
119
+ seriesNames={['Women', 'Men']}
120
+ formatter={(n) => String(n)}
121
+ selected={false}
122
+ onToggle={vi.fn()}
123
+ />,
124
+ )
125
+ const fills = container.querySelectorAll<HTMLElement>(
126
+ '[data-bar-fill="true"]',
127
+ )
128
+ // 45/77 ≈ 58.44…, 32/77 ≈ 41.56…
129
+ const w0 = parseFloat(fills[0]!.style.width)
130
+ const w1 = parseFloat(fills[1]!.style.width)
131
+ expect(w0 + w1).toBeCloseTo(100, 1)
132
+ expect(w0).toBeGreaterThan(58)
133
+ expect(w0).toBeLessThan(59)
134
+ expect(w1).toBeGreaterThan(41)
135
+ expect(w1).toBeLessThan(42)
136
+ })
137
+
138
+ it('renders the stacked bar with one data-bar-fill per non-zero series', () => {
139
+ const { container } = render(
140
+ <CategoryRowStacked
141
+ name='Cat'
142
+ values={[45, 0, 32]}
143
+ colors={[...COLORS, 'rgb(0, 50, 0)']}
144
+ seriesNames={['Women', 'Other', 'Men']}
145
+ formatter={(n) => String(n)}
146
+ selected={false}
147
+ onToggle={vi.fn()}
148
+ />,
149
+ )
150
+ const fills = container.querySelectorAll('[data-bar-fill="true"]')
151
+ // Zero series is skipped in the bar, present in the breakdown.
152
+ expect(fills).toHaveLength(2)
153
+ })
154
+
155
+ it('clicking anywhere in the row toggles by raw name', () => {
156
+ const onToggle = vi.fn()
157
+ render(
158
+ <CategoryRowStacked
159
+ name='raw-key'
160
+ displayName='Pretty'
161
+ values={[45, 32]}
162
+ colors={COLORS}
163
+ seriesNames={['Women', 'Men']}
164
+ formatter={(n) => String(n)}
165
+ selected={false}
166
+ onToggle={onToggle}
167
+ />,
168
+ )
169
+ fireEvent.click(screen.getByRole('button'))
170
+ expect(onToggle).toHaveBeenCalledWith('raw-key')
171
+ })
172
+
173
+ it('toggles via keyboard Enter and Space, preventing default on space', () => {
174
+ const onToggle = vi.fn()
175
+ render(
176
+ <CategoryRowStacked
177
+ name='K'
178
+ values={[1]}
179
+ colors={['rgb(0, 0, 0)']}
180
+ seriesNames={['S']}
181
+ formatter={(n) => String(n)}
182
+ selected={false}
183
+ onToggle={onToggle}
184
+ />,
185
+ )
186
+ const row = screen.getByRole('button')
187
+ fireEvent.keyDown(row, { key: 'Enter' })
188
+ expect(onToggle).toHaveBeenCalledWith('K')
189
+ onToggle.mockClear()
190
+ fireEvent.keyDown(row, { key: ' ' })
191
+ expect(onToggle).toHaveBeenCalledWith('K')
192
+ })
193
+
194
+ it('reflects selection via aria-pressed', () => {
195
+ const { rerender } = render(
196
+ <CategoryRowStacked
197
+ name='K'
198
+ values={[1]}
199
+ colors={['rgb(0, 0, 0)']}
200
+ seriesNames={['S']}
201
+ formatter={(n) => String(n)}
202
+ selected={false}
203
+ onToggle={vi.fn()}
204
+ />,
205
+ )
206
+ expect(screen.getByRole('button').getAttribute('aria-pressed')).toBe(
207
+ 'false',
208
+ )
209
+ rerender(
210
+ <CategoryRowStacked
211
+ name='K'
212
+ values={[1]}
213
+ colors={['rgb(0, 0, 0)']}
214
+ seriesNames={['S']}
215
+ formatter={(n) => String(n)}
216
+ selected={true}
217
+ onToggle={vi.fn()}
218
+ />,
219
+ )
220
+ expect(screen.getByRole('button').getAttribute('aria-pressed')).toBe('true')
221
+ })
222
+
223
+ it('when dim colors are passed in, every segment paints with the dim color (breakdown text unchanged)', () => {
224
+ const DIM = 'rgba(0, 0, 0, 0.26)'
225
+ render(
226
+ <CategoryRowStacked
227
+ name='Cat'
228
+ values={[45, 32]}
229
+ colors={[DIM, DIM]}
230
+ seriesNames={['Women', 'Men']}
231
+ formatter={(n) => String(n)}
232
+ selected={false}
233
+ onToggle={vi.fn()}
234
+ />,
235
+ )
236
+ const row = screen.getByRole('button')
237
+ const fills = row.querySelectorAll<HTMLElement>('[data-bar-fill="true"]')
238
+ expect(fills.length).toBe(2)
239
+ fills.forEach((f) => expect(f.style.backgroundColor).toBe(DIM))
240
+ // Breakdown text remains visible and unchanged.
241
+ expect(within(row).getByText('Women: 45')).toBeTruthy()
242
+ expect(within(row).getByText('Men: 32')).toBeTruthy()
243
+ })
244
+ })