@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,337 @@
1
+ import type { EChartsOption } from 'echarts'
2
+ import * as echarts from 'echarts'
3
+ import type { CallbackDataParams } from 'echarts/types/dist/shared'
4
+ import {
5
+ buildGridConfig,
6
+ buildLegendConfig,
7
+ createTooltipFormatter,
8
+ createTooltipPositioner,
9
+ niceNum,
10
+ } from '../../widgets/utils/chart-config'
11
+ import { ZOOM_LAYOUT } from '../actions/zoom-toggle'
12
+ import type { OptionFactory } from '../echart'
13
+ import { mergeOptions } from '../utils'
14
+ import { positionDataZoomForLegend } from '../utils/data-zoom-layout'
15
+ import type {
16
+ HistogramEChartsOption,
17
+ HistogramOptionFactoryInput,
18
+ HistogramOptionsInput,
19
+ HistogramWidgetData,
20
+ } from './types'
21
+
22
+ /**
23
+ * Builds the **structural** ECharts option for a histogram widget — axes,
24
+ * grid, tooltip, value-axis label formatter, themed legend. Mirrors
25
+ * {@link import('../bar/options').barOptions} so the two widgets share v1
26
+ * look-and-feel: themed dark tooltip with positioner, CARTO color palette,
27
+ * structural legend (`show` toggled by the merger based on series count),
28
+ * y-axis labels rendered inside the plot via the `niceNum` closure pattern.
29
+ *
30
+ * Intentional deviations from bar (histogram-specific):
31
+ * - **No `xAxis.axisLabel.formatter`.** Bin labels are pre-formatted in
32
+ * the merger via `formatNumber(lo)–formatNumber(hi)` and optionally
33
+ * the consumer's `labelFormatter`. The strings on the axis are
34
+ * already display-ready, so there's nothing to post-format here.
35
+ * - **Tooltip formatter reads the array-tuple row shape.** The dataset
36
+ * uses positional `encode: { x: 0, y: 1 }`, so `item.value` comes in
37
+ * as `[binLabel, count]` rather than bar's `{ name, value }` object.
38
+ *
39
+ * Intentionally data-agnostic: no series, no dataset, no x-axis category
40
+ * data (those depend on data + ticks and are added by the option factory's
41
+ * merge phase via {@link createHistogramOptionFactory}).
42
+ */
43
+ export function histogramOptions({
44
+ theme,
45
+ formatter,
46
+ }: HistogramOptionsInput): HistogramEChartsOption {
47
+ // Closure shared between yAxis min/max callbacks and the label formatter,
48
+ // so only the rounded extents are labelled (matches v1 + bar).
49
+ let niceMin = 0
50
+ let niceMax = 1
51
+
52
+ return {
53
+ grid: {
54
+ left: parseInt(theme.spacing(1)),
55
+ top: parseInt(theme.spacing(3)),
56
+ right: parseInt(theme.spacing(1)),
57
+ // Default: no legend. Merger bumps this when there are >1 series.
58
+ ...buildGridConfig(false, theme),
59
+ containLabel: true,
60
+ },
61
+ tooltip: {
62
+ trigger: 'axis',
63
+ backgroundColor: theme.palette.grey[900],
64
+ borderWidth: 0,
65
+ padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],
66
+ textStyle: {
67
+ color: theme.palette.common.white,
68
+ fontSize: 11,
69
+ fontFamily: theme.typography.caption.fontFamily,
70
+ },
71
+ axisPointer: { type: 'line' },
72
+ position: createTooltipPositioner(theme),
73
+ formatter: buildHistogramTooltipFormatter(formatter),
74
+ },
75
+ // Legend styling baked here; `show` is toggled by the merger based on
76
+ // series count. Histogram doesn't accept `labelFormatter` at the
77
+ // options layer (bin labels are pre-formatted in the merger), so we
78
+ // skip the legend `labelFormatter` argument too.
79
+ legend: {
80
+ ...buildLegendConfig({ hasLegend: false }),
81
+ },
82
+ axisPointer: { lineStyle: { color: theme.palette.grey[400] } },
83
+ color: [
84
+ theme.palette.secondary.main,
85
+ ...Object.values(
86
+ (theme.palette as { qualitative?: { bold?: Record<string, string> } })
87
+ .qualitative?.bold ?? {},
88
+ ),
89
+ ],
90
+ xAxis: {
91
+ type: 'category',
92
+ axisLine: { show: false },
93
+ axisTick: { show: false },
94
+ axisLabel: {
95
+ padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],
96
+ margin: 0,
97
+ hideOverlap: true,
98
+ },
99
+ },
100
+ yAxis: {
101
+ type: 'value',
102
+ min: (extent: { min: number }) => {
103
+ niceMin = extent.min < 0 ? niceNum(extent.min) : 0
104
+ return niceMin
105
+ },
106
+ max: (extent: { min: number; max: number }) => {
107
+ niceMax = extent.max <= 0 ? 1 : niceNum(extent.max)
108
+ return niceMax
109
+ },
110
+ axisLine: { show: false },
111
+ axisTick: { show: false },
112
+ splitLine: {
113
+ show: true,
114
+ lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },
115
+ },
116
+ axisLabel: {
117
+ fontSize: theme.typography.overlineDelicate?.fontSize,
118
+ fontFamily: theme.typography.overlineDelicate?.fontFamily,
119
+ margin: parseInt(theme.spacing(1)),
120
+ show: true,
121
+ showMaxLabel: true,
122
+ showMinLabel: true,
123
+ verticalAlign: 'bottom',
124
+ inside: true,
125
+ formatter: (value: number) => {
126
+ if (value !== niceMax && value !== niceMin) return ''
127
+ if (value === 0) return ''
128
+ return formatter ? formatter(value) : String(value)
129
+ },
130
+ },
131
+ },
132
+ } as HistogramEChartsOption
133
+ }
134
+
135
+ /**
136
+ * Returns the histogram widget's {@link OptionFactory} — one closure that
137
+ * owns BOTH phases of option construction:
138
+ *
139
+ * - **Structural phase** (`option == null`) — builds the theme-aware
140
+ * structural option via {@link histogramOptions}, optionally merging
141
+ * the consumer-supplied `optionsOverride`. Called once by Provider to
142
+ * seed `rawOptions` in the store.
143
+ * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`
144
+ * (`HistogramWidgetData` — `number[][]`) into the option via the
145
+ * dataset API. Each series gets its own dataset of `[binLabel, count]`
146
+ * pairs derived from `ticks`; series reference their dataset by
147
+ * `datasetIndex` and are encoded by column position. Reactive
148
+ * `ctx.formatter` (driven by RelativeData → `%`) plus `niceMin`/`niceMax`
149
+ * are re-derived here so the y-axis label formatter and the tooltip
150
+ * pick up live store values, mirroring bar.
151
+ */
152
+ export function createHistogramOptionFactory(
153
+ options: HistogramOptionFactoryInput,
154
+ ): OptionFactory {
155
+ const { theme, formatter, ticks, seriesNames, labelFormatter, selection } =
156
+ options
157
+ const optionsOverride = options.optionsOverride
158
+ const selectionSet =
159
+ selection && selection.length > 0 ? new Set<number>(selection) : null
160
+
161
+ const binLabels: string[] = []
162
+ for (let i = 0; i < ticks.length - 1; i++) {
163
+ const lo = ticks[i]!
164
+ const hi = ticks[i + 1]!
165
+ const raw = `${formatNumber(lo)}–${formatNumber(hi)}`
166
+ binLabels.push(labelFormatter ? labelFormatter(raw) : raw)
167
+ }
168
+
169
+ return (option, data, ctx) => {
170
+ if (option == null) {
171
+ const structural = histogramOptions({ theme, formatter })
172
+ return optionsOverride
173
+ ? (mergeOptions(
174
+ structural as unknown as Record<string, unknown>,
175
+ optionsOverride as Partial<Record<string, unknown>>,
176
+ ) as EChartsOption)
177
+ : structural
178
+ }
179
+
180
+ const seriesArr: HistogramWidgetData = Array.isArray(data)
181
+ ? (data as HistogramWidgetData)
182
+ : []
183
+ if (seriesArr.length === 0 || binLabels.length === 0) {
184
+ return { ...option, dataset: [], series: [] }
185
+ }
186
+
187
+ const hasLegend = seriesArr.length > 1
188
+ const seriesTemplates = Array.isArray(option.series) ? option.series : []
189
+ const broadcastTemplate = seriesTemplates[0] ?? {}
190
+ const baseYAxis =
191
+ typeof option.yAxis === 'object' && !Array.isArray(option.yAxis)
192
+ ? option.yAxis
193
+ : {}
194
+ const baseGrid =
195
+ typeof option.grid === 'object' && !Array.isArray(option.grid)
196
+ ? option.grid
197
+ : {}
198
+ const baseTooltip =
199
+ typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)
200
+ ? option.tooltip
201
+ : {}
202
+ const baseLegend =
203
+ typeof option.legend === 'object' && !Array.isArray(option.legend)
204
+ ? option.legend
205
+ : {}
206
+ // Reactive (live store) formatter from ctx — distinct from the
207
+ // closure-time `formatter` captured for the structural-build branch
208
+ // above. RelativeData can install a percent formatter on the store
209
+ // after the factory was constructed; the merge phase reads `ctx` to
210
+ // pick that up.
211
+ const liveFormatter = ctx?.formatter
212
+
213
+ const { niceMinVal, niceMaxVal } = computeHistogramNiceBounds(seriesArr)
214
+
215
+ // Zoom slider layout: when ZoomToggle has installed `dataZoom`, push
216
+ // the slider above the legend (if any) and reserve room in the grid.
217
+ const dataZoomLayout = positionDataZoomForLegend(option.dataZoom, hasLegend)
218
+ const fallbackBottom =
219
+ typeof baseGrid.bottom === 'number' ? baseGrid.bottom : 24
220
+ const baseBottom = hasLegend ? 56 : fallbackBottom
221
+ const gridBottom = dataZoomLayout
222
+ ? baseBottom + ZOOM_LAYOUT.sliderHeight + ZOOM_LAYOUT.sliderGap
223
+ : baseBottom
224
+
225
+ // Dim non-selected bins via `series.itemStyle.color`. Per-row
226
+ // `itemStyle` on dataset sources is silently ignored when
227
+ // `series.encode` is in play.
228
+ //
229
+ // We *always* emit `itemStyle.color` (a passthrough when nothing is
230
+ // selected), not conditionally — dropping the key between renders
231
+ // would let ECharts' default merge keep the previous callback alive
232
+ // and bins would stay dimmed forever after an external clear. Always
233
+ // emitting lets normal merge swap the callback in place, no
234
+ // `replaceMerge` and no entry-animation flash on selection on/off.
235
+ const dimItemStyle = {
236
+ color: (params: CallbackDataParams) => {
237
+ const base = params.color as string
238
+ if (!selectionSet) return base
239
+ return selectionSet.has(params.dataIndex)
240
+ ? base
241
+ : echarts.color.modifyAlpha(base, 0.15)
242
+ },
243
+ }
244
+
245
+ return {
246
+ ...option,
247
+ dataset: seriesArr.map((counts) => ({
248
+ source: binLabels.map(
249
+ (label, i) => [label, counts[i] ?? 0] as [string, number],
250
+ ),
251
+ })),
252
+ series: seriesArr.map((_, i) => {
253
+ const template =
254
+ (seriesTemplates[i] as object | undefined) ??
255
+ (broadcastTemplate as object)
256
+ return {
257
+ ...(typeof template === 'object' ? template : {}),
258
+ type: 'bar' as const,
259
+ datasetIndex: i,
260
+ name: seriesNames?.[i] ?? `Series ${i + 1}`,
261
+ encode: { x: 0, y: 1 },
262
+ barCategoryGap: '0%',
263
+ emphasis: { focus: 'series' },
264
+ itemStyle: dimItemStyle,
265
+ }
266
+ }),
267
+ legend: { ...baseLegend, show: hasLegend },
268
+ grid: { ...baseGrid, bottom: gridBottom },
269
+ ...(dataZoomLayout ? { dataZoom: dataZoomLayout } : {}),
270
+ yAxis: {
271
+ ...baseYAxis,
272
+ min: niceMinVal,
273
+ max: niceMaxVal,
274
+ axisLabel: {
275
+ ...((baseYAxis as { axisLabel?: object }).axisLabel ?? {}),
276
+ formatter: (value: number) => {
277
+ if (value !== niceMaxVal && value !== niceMinVal) return ''
278
+ if (value === 0) return ''
279
+ return liveFormatter ? liveFormatter(value) : String(value)
280
+ },
281
+ },
282
+ } as EChartsOption['yAxis'],
283
+ tooltip: {
284
+ ...baseTooltip,
285
+ formatter: buildHistogramTooltipFormatter(liveFormatter),
286
+ },
287
+ } as EChartsOption
288
+ }
289
+ }
290
+
291
+ /**
292
+ * Tooltip formatter for the histogram's positional `[binLabel, count]`
293
+ * row shape. ECharts surfaces the x-axis category through `item.name`
294
+ * (already pre-formatted by the bin-label generator), and `item.value`
295
+ * comes in as the array tuple — distinct from bar's `{ name, value }`
296
+ * object row.
297
+ */
298
+ function buildHistogramTooltipFormatter(
299
+ formatter: ((value: number) => string) | undefined,
300
+ ) {
301
+ return createTooltipFormatter((item) => {
302
+ const row = item.value as [string, number] | undefined
303
+ const raw = row?.[1]
304
+ const formattedValue =
305
+ typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')
306
+ const marker = typeof item.marker === 'string' ? item.marker : ''
307
+ const seriesName = item.seriesName ? `${item.seriesName}: ` : ''
308
+ return {
309
+ name: String(item.name ?? ''),
310
+ seriesName,
311
+ marker,
312
+ value: formattedValue,
313
+ }
314
+ })
315
+ }
316
+
317
+ function computeHistogramNiceBounds(seriesArr: HistogramWidgetData): {
318
+ niceMinVal: number
319
+ niceMaxVal: number
320
+ } {
321
+ let max = -Infinity
322
+ for (const counts of seriesArr) {
323
+ for (const v of counts) {
324
+ if (typeof v !== 'number' || !Number.isFinite(v)) continue
325
+ if (v > max) max = v
326
+ }
327
+ }
328
+ return {
329
+ niceMinVal: 0,
330
+ niceMaxVal: max <= 0 ? 1 : niceNum(max),
331
+ }
332
+ }
333
+
334
+ function formatNumber(n: number): string {
335
+ if (Number.isInteger(n)) return String(n)
336
+ return Number(n.toFixed(2)).toString()
337
+ }
@@ -0,0 +1,16 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { render } from '@testing-library/react'
3
+ import { HistogramSkeleton } from './skeleton'
4
+
5
+ describe('<HistogramSkeleton>', () => {
6
+ it('renders one Skeleton per bin (default 12) plus 4 legend stubs', () => {
7
+ const { container } = render(<HistogramSkeleton />)
8
+ // 12 bars + 2 legend items × (circle + label) = 16.
9
+ expect(container.querySelectorAll('.MuiSkeleton-root').length).toBe(16)
10
+ })
11
+
12
+ it('honours a custom bin count', () => {
13
+ const { container } = render(<HistogramSkeleton bins={4} />)
14
+ expect(container.querySelectorAll('.MuiSkeleton-root').length).toBe(8)
15
+ })
16
+ })
@@ -0,0 +1,70 @@
1
+ import { Box, Skeleton, type SxProps, type Theme } from '@mui/material'
2
+
3
+ const styles = {
4
+ container: {
5
+ display: 'flex',
6
+ alignItems: 'center',
7
+ justifyContent: 'space-between',
8
+ flexDirection: 'column',
9
+ gap: ({ spacing }) => spacing(1),
10
+ height: ({ spacing }) => spacing(38),
11
+ },
12
+ grid: {
13
+ display: 'flex',
14
+ alignItems: 'flex-end',
15
+ flex: '1 1 auto',
16
+ gap: 0.5,
17
+ width: '100%',
18
+ },
19
+ legend: {
20
+ display: 'flex',
21
+ alignItems: 'center',
22
+ gap: ({ spacing }) => spacing(2),
23
+ height: ({ spacing }) => spacing(5),
24
+ },
25
+ legendItem: {
26
+ display: 'flex',
27
+ alignItems: 'center',
28
+ gap: ({ spacing }) => spacing(1.5),
29
+ },
30
+ } satisfies Record<string, SxProps<Theme>>
31
+
32
+ const barSx = (height: number): SxProps<Theme> => ({
33
+ flex: 1,
34
+ height: `${height}%`,
35
+ minWidth: 8,
36
+ })
37
+
38
+ export interface HistogramSkeletonProps {
39
+ bins?: number
40
+ }
41
+
42
+ /**
43
+ * Loading state for the Histogram widget. Mirrors Bar's skeleton structure
44
+ * — a grid of bars (bin-shaped silhouette, anchored to the bottom) plus a
45
+ * legend stub — so the placeholder reads consistently with Bar.
46
+ */
47
+ export function HistogramSkeleton({ bins = 12 }: HistogramSkeletonProps) {
48
+ // Sample heights mimicking a typical bell-shaped distribution.
49
+ const heights = Array.from({ length: bins }, (_, i) => {
50
+ const t = i / Math.max(1, bins - 1)
51
+ return Math.round(20 + 80 * Math.exp(-((t - 0.5) ** 2) * 8))
52
+ })
53
+ return (
54
+ <Box sx={styles.container}>
55
+ <Box sx={styles.grid}>
56
+ {heights.map((h, i) => (
57
+ <Skeleton key={`bar-${i}`} variant='rectangular' sx={barSx(h)} />
58
+ ))}
59
+ </Box>
60
+ <Box sx={styles.legend}>
61
+ {[0, 1].map((i) => (
62
+ <Box key={`legend-${i}`} sx={styles.legendItem}>
63
+ <Skeleton variant='circular' width={8} height={8} />
64
+ <Skeleton width={48} height={8} />
65
+ </Box>
66
+ ))}
67
+ </Box>
68
+ </Box>
69
+ )
70
+ }
@@ -0,0 +1,46 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { toRelativeHistogramData } from './transforms'
3
+
4
+ describe('toRelativeHistogramData', () => {
5
+ it('rewrites each bin count as its share of the series total in 0-100', () => {
6
+ expect(toRelativeHistogramData([[10, 20, 70]])).toEqual([[10, 20, 70]])
7
+ })
8
+
9
+ it('handles non-100 totals (5/20 = 25%)', () => {
10
+ expect(toRelativeHistogramData([[5, 15]])).toEqual([[25, 75]])
11
+ })
12
+
13
+ it('handles multiple series independently', () => {
14
+ expect(
15
+ toRelativeHistogramData([
16
+ [3, 7],
17
+ [50, 50],
18
+ ]),
19
+ ).toEqual([
20
+ [30, 70],
21
+ [50, 50],
22
+ ])
23
+ })
24
+
25
+ it('returns a series unchanged when its total is zero', () => {
26
+ expect(toRelativeHistogramData([[0, 0, 0]])).toEqual([[0, 0, 0]])
27
+ })
28
+
29
+ it('produces signed share-of-magnitude percentages for mixed-sign series', () => {
30
+ // Denominator is 1000 + 990 = 1990
31
+ const out = toRelativeHistogramData([[1000, -990]]) as number[][]
32
+ expect(out[0]?.[0]).toBeCloseTo(50.25126, 4)
33
+ expect(out[0]?.[1]).toBeCloseTo(-49.74874, 4)
34
+ })
35
+
36
+ it('returns the input unchanged when shape does not match number[][]', () => {
37
+ expect(toRelativeHistogramData(null)).toBe(null)
38
+ expect(toRelativeHistogramData('not an array')).toBe('not an array')
39
+ // Series that isn't a flat number array (e.g. named-value or tuple)
40
+ // is returned as-is — keeps the transform safe to attach to a
41
+ // widget whose shape changes through other actions.
42
+ expect(toRelativeHistogramData([[{ name: 'a', value: 10 }]])).toEqual([
43
+ [{ name: 'a', value: 10 }],
44
+ ])
45
+ })
46
+ })
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Histogram-specific `RelativeData` transform. Histogram data is
3
+ * `number[][]` — each series is a flat list of bin counts. This
4
+ * rewrites each count to its share of the series total (0–100), so
5
+ * pairing with `createPercentFormatter` renders the y-axis as
6
+ * percentages.
7
+ *
8
+ * Pass to `<Widget.RelativeData transform={toRelativeHistogramData} />`.
9
+ *
10
+ * The denominator is the sum of |value| across the series so mixed-sign
11
+ * inputs produce sane signed shares-of-magnitude. A series whose total
12
+ * magnitude is zero (all-zero or empty input) is returned unchanged so
13
+ * a stalled or empty data set doesn't show misleading 0% values. Inputs
14
+ * whose shape isn't `number[][]` fall through untouched (same defensive
15
+ * shape-check pattern as the default transform).
16
+ */
17
+ export const toRelativeHistogramData = (input: unknown): unknown => {
18
+ if (!Array.isArray(input)) return input
19
+ return input.map((series: unknown): unknown => {
20
+ if (!isFlatNumberArray(series)) return series
21
+ const total = series.reduce((acc, v) => acc + Math.abs(v), 0)
22
+ if (total <= 0) return series
23
+ return series.map((v) => (v / total) * 100)
24
+ })
25
+ }
26
+
27
+ function isFlatNumberArray(v: unknown): v is number[] {
28
+ if (!Array.isArray(v)) return false
29
+ return v.every((item) => typeof item === 'number' && Number.isFinite(item))
30
+ }
@@ -0,0 +1,51 @@
1
+ import type { Theme } from '@mui/material'
2
+ import type { EChartsOption } from 'echarts'
3
+
4
+ /**
5
+ * Histogram widget data — array of series, each a flat array of bin counts.
6
+ * The option factory's merge phase (see {@link createHistogramOptionFactory})
7
+ * combines this with `ticks` to produce a 2-column dataset (`[binLabel, count]`)
8
+ * for ECharts.
9
+ */
10
+ export type HistogramWidgetData = readonly (readonly number[])[]
11
+
12
+ /** Inputs to the structural-only {@link histogramOptions} builder. */
13
+ export interface HistogramOptionsInput {
14
+ theme: Theme
15
+ formatter?: (value: number) => string
16
+ }
17
+
18
+ /**
19
+ * Combined inputs for the histogram option factory creator. Carries
20
+ * everything the widget needs across BOTH phases — the structural-build
21
+ * (`theme`, `formatter`, `optionsOverride`) AND the data merge (`ticks`,
22
+ * `seriesNames`, `labelFormatter`, `selection`).
23
+ */
24
+ export interface HistogramOptionFactoryInput {
25
+ theme: Theme
26
+ formatter?: (value: number) => string
27
+ /** Bin boundaries — length = bins + 1. */
28
+ ticks: readonly number[]
29
+ /** Optional series names — drives the legend. */
30
+ seriesNames?: readonly string[]
31
+ /**
32
+ * Bin-range label transform (e.g. `"0–10"` → `"[0–10)"`). Distinct from
33
+ * the standard `OptionFactoryContext.labelFormatter` (which operates on
34
+ * categories): this one is histogram-specific and runs only on the
35
+ * generated bin-range strings before they hit the x-axis.
36
+ */
37
+ labelFormatter?: (label: string) => string
38
+ /**
39
+ * Selected bin indices. Bins not in this list render dimmed
40
+ * (`itemStyle.opacity: 0.15`). `null`/empty means no selection.
41
+ */
42
+ selection?: readonly number[] | null
43
+ /**
44
+ * Consumer-supplied partial option merged into the structural option at
45
+ * structural-build time. Lets stories override pieces of the theme-aware
46
+ * base without forking the structural builder.
47
+ */
48
+ optionsOverride?: Partial<EChartsOption>
49
+ }
50
+
51
+ export type HistogramEChartsOption = EChartsOption