@carto/ps-react-ui 4.7.1 → 4.9.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 (580) 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/{styles-BYTyKQFP.js → option-builders-F-c9ELi1.js} +25 -45
  16. package/dist/option-builders-F-c9ELi1.js.map +1 -0
  17. package/dist/png-item-CS4z1iSH.js +45 -0
  18. package/dist/png-item-CS4z1iSH.js.map +1 -0
  19. package/dist/range-l4fNHLEg.js +213 -0
  20. package/dist/range-l4fNHLEg.js.map +1 -0
  21. package/dist/resolve-theme-color-BdojIw0K.js +47 -0
  22. package/dist/resolve-theme-color-BdojIw0K.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-CQCAnDLb.js +388 -0
  30. package/dist/table-CQCAnDLb.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 +46 -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 +53 -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 +43 -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 +51 -0
  143. package/dist/types/widgets-v2/index.d.ts +108 -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 +57 -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 +27 -0
  166. package/dist/types/widgets-v2/range/range.d.ts +24 -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 +54 -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 +40 -0
  216. package/dist/types/widgets-v2/table/table-ui.d.ts +44 -0
  217. package/dist/types/widgets-v2/table/table.d.ts +50 -0
  218. package/dist/types/widgets-v2/table/types.d.ts +48 -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 +60 -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/types.d.ts +25 -0
  231. package/dist/types/widgets-v2/utils/data-zoom-layout.d.ts +11 -0
  232. package/dist/types/widgets-v2/utils/index.d.ts +3 -0
  233. package/dist/types/widgets-v2/utils/merge-options.d.ts +12 -0
  234. package/dist/types/widgets-v2/utils/merge-options.test.d.ts +1 -0
  235. package/dist/types/widgets-v2/utils/resolve-theme-color.d.ts +18 -0
  236. package/dist/types/widgets-v2/utils/resolve-theme-color.test.d.ts +1 -0
  237. package/dist/types/widgets-v2/wrapper/index.d.ts +4 -0
  238. package/dist/types/widgets-v2/wrapper/labels.d.ts +6 -0
  239. package/dist/types/widgets-v2/wrapper/style.d.ts +111 -0
  240. package/dist/types/widgets-v2/wrapper/widget-actions.d.ts +22 -0
  241. package/dist/types/widgets-v2/wrapper/widget-content.d.ts +12 -0
  242. package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +51 -0
  243. package/dist/use-transform-DXPN3nY7.js +110 -0
  244. package/dist/use-transform-DXPN3nY7.js.map +1 -0
  245. package/dist/widget-context-DTGO0Yta.js +13 -0
  246. package/dist/widget-context-DTGO0Yta.js.map +1 -0
  247. package/dist/widget-store-registry-_W4Z4xp-.js +178 -0
  248. package/dist/widget-store-registry-_W4Z4xp-.js.map +1 -0
  249. package/dist/widgets/bar.js +14 -13
  250. package/dist/widgets/bar.js.map +1 -1
  251. package/dist/widgets/histogram.js +8 -7
  252. package/dist/widgets/histogram.js.map +1 -1
  253. package/dist/widgets/pie.js +19 -18
  254. package/dist/widgets/pie.js.map +1 -1
  255. package/dist/widgets/scatterplot.js +8 -7
  256. package/dist/widgets/scatterplot.js.map +1 -1
  257. package/dist/widgets/timeseries.js +11 -10
  258. package/dist/widgets/timeseries.js.map +1 -1
  259. package/dist/widgets/utils.js +8 -7
  260. package/dist/widgets/utils.js.map +1 -1
  261. package/dist/widgets-v2/actions.js +43 -0
  262. package/dist/widgets-v2/actions.js.map +1 -0
  263. package/dist/widgets-v2/bar.js +330 -0
  264. package/dist/widgets-v2/bar.js.map +1 -0
  265. package/dist/widgets-v2/category.js +104 -0
  266. package/dist/widgets-v2/category.js.map +1 -0
  267. package/dist/widgets-v2/echart.js +57 -0
  268. package/dist/widgets-v2/echart.js.map +1 -0
  269. package/dist/widgets-v2/formula.js +74 -0
  270. package/dist/widgets-v2/formula.js.map +1 -0
  271. package/dist/widgets-v2/histogram.js +353 -0
  272. package/dist/widgets-v2/histogram.js.map +1 -0
  273. package/dist/widgets-v2/markdown.js +68 -0
  274. package/dist/widgets-v2/markdown.js.map +1 -0
  275. package/dist/widgets-v2/pie.js +387 -0
  276. package/dist/widgets-v2/pie.js.map +1 -0
  277. package/dist/widgets-v2/range.js +52 -0
  278. package/dist/widgets-v2/range.js.map +1 -0
  279. package/dist/widgets-v2/scatterplot.js +411 -0
  280. package/dist/widgets-v2/scatterplot.js.map +1 -0
  281. package/dist/widgets-v2/spread.js +72 -0
  282. package/dist/widgets-v2/spread.js.map +1 -0
  283. package/dist/widgets-v2/stores.js +42 -0
  284. package/dist/widgets-v2/stores.js.map +1 -0
  285. package/dist/widgets-v2/table.js +78 -0
  286. package/dist/widgets-v2/table.js.map +1 -0
  287. package/dist/widgets-v2/timeseries.js +358 -0
  288. package/dist/widgets-v2/timeseries.js.map +1 -0
  289. package/dist/widgets-v2/utils.js +8 -0
  290. package/dist/widgets-v2/utils.js.map +1 -0
  291. package/dist/widgets-v2.js +953 -0
  292. package/dist/widgets-v2.js.map +1 -0
  293. package/package.json +71 -3
  294. package/src/components/lasso-tool/chip.test.tsx +176 -0
  295. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +171 -0
  296. package/src/components/lasso-tool/lasso-tool.test.tsx +198 -0
  297. package/src/components/list-data/list-data.test.tsx +73 -0
  298. package/src/components/no-data-alert/no-data-alert.test.tsx +38 -0
  299. package/src/components/responsive-drawer/responsive-drawer.test.tsx +68 -0
  300. package/src/widgets/actions/brush-toggle/brush-overlay.test.tsx +465 -0
  301. package/src/widgets/actions/brush-toggle/brush-toggle.test.tsx +208 -0
  302. package/src/widgets/actions/change-column/change-column-dnd.test.tsx +193 -0
  303. package/src/widgets/actions/change-column/sortable-column-item.test.tsx +124 -0
  304. package/src/widgets/actions/zoom-toggle/zoom-toggle.test.tsx +322 -0
  305. package/src/widgets/category/components/category-rows.test.tsx +213 -0
  306. package/src/widgets/echart/utils.test.ts +277 -0
  307. package/src/widgets/formula/config.test.ts +37 -0
  308. package/src/widgets/range/components/range-item.test.tsx +243 -0
  309. package/src/widgets/stores/widget-store-branches.test.ts +275 -0
  310. package/src/widgets/table/config.test.ts +65 -0
  311. package/src/widgets/utils/chart-config/option-builders.test.ts +188 -0
  312. package/src/widgets-v2/PERFORMANCE.md +189 -0
  313. package/src/widgets-v2/actions/brush-toggle/brush-toggle.test.tsx +180 -0
  314. package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +154 -0
  315. package/src/widgets-v2/actions/brush-toggle/index.ts +3 -0
  316. package/src/widgets-v2/actions/brush-toggle/labels.ts +9 -0
  317. package/src/widgets-v2/actions/brush-toggle/style.ts +11 -0
  318. package/src/widgets-v2/actions/brush-toggle/transforms.test.ts +47 -0
  319. package/src/widgets-v2/actions/brush-toggle/transforms.ts +31 -0
  320. package/src/widgets-v2/actions/change-column/change-column-icon.tsx +14 -0
  321. package/src/widgets-v2/actions/change-column/change-column.test.tsx +59 -0
  322. package/src/widgets-v2/actions/change-column/change-column.tsx +180 -0
  323. package/src/widgets-v2/actions/change-column/index.ts +7 -0
  324. package/src/widgets-v2/actions/change-column/labels.ts +9 -0
  325. package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +56 -0
  326. package/src/widgets-v2/actions/change-column/style.ts +32 -0
  327. package/src/widgets-v2/actions/change-column/types.ts +11 -0
  328. package/src/widgets-v2/actions/download/download.test.tsx +327 -0
  329. package/src/widgets-v2/actions/download/download.tsx +144 -0
  330. package/src/widgets-v2/actions/download/exports.test.tsx +198 -0
  331. package/src/widgets-v2/actions/download/exports.ts +115 -0
  332. package/src/widgets-v2/actions/download/icons.tsx +26 -0
  333. package/src/widgets-v2/actions/download/index.ts +13 -0
  334. package/src/widgets-v2/actions/download/labels.ts +16 -0
  335. package/src/widgets-v2/actions/download/png-item.test.tsx +72 -0
  336. package/src/widgets-v2/actions/download/png-item.tsx +52 -0
  337. package/src/widgets-v2/actions/download/style.ts +3 -0
  338. package/src/widgets-v2/actions/download/types.ts +32 -0
  339. package/src/widgets-v2/actions/fullscreen/fullscreen.test.tsx +150 -0
  340. package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +230 -0
  341. package/src/widgets-v2/actions/fullscreen/index.ts +7 -0
  342. package/src/widgets-v2/actions/fullscreen/labels.ts +9 -0
  343. package/src/widgets-v2/actions/fullscreen/style.ts +59 -0
  344. package/src/widgets-v2/actions/fullscreen/types.ts +15 -0
  345. package/src/widgets-v2/actions/index.ts +82 -0
  346. package/src/widgets-v2/actions/lock-selection/index.ts +10 -0
  347. package/src/widgets-v2/actions/lock-selection/labels.ts +11 -0
  348. package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +187 -0
  349. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +130 -0
  350. package/src/widgets-v2/actions/lock-selection/style.ts +11 -0
  351. package/src/widgets-v2/actions/lock-selection/transforms.ts +27 -0
  352. package/src/widgets-v2/actions/relative-data/index.ts +3 -0
  353. package/src/widgets-v2/actions/relative-data/labels.ts +9 -0
  354. package/src/widgets-v2/actions/relative-data/relative-data.test.tsx +71 -0
  355. package/src/widgets-v2/actions/relative-data/relative-data.tsx +107 -0
  356. package/src/widgets-v2/actions/relative-data/style.ts +11 -0
  357. package/src/widgets-v2/actions/relative-data/transforms.test.ts +151 -0
  358. package/src/widgets-v2/actions/relative-data/transforms.ts +70 -0
  359. package/src/widgets-v2/actions/searcher/filter.ts +28 -0
  360. package/src/widgets-v2/actions/searcher/index.ts +8 -0
  361. package/src/widgets-v2/actions/searcher/labels.ts +13 -0
  362. package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +91 -0
  363. package/src/widgets-v2/actions/searcher/searcher.test.tsx +92 -0
  364. package/src/widgets-v2/actions/searcher/searcher.tsx +112 -0
  365. package/src/widgets-v2/actions/searcher/style.ts +15 -0
  366. package/src/widgets-v2/actions/stack-toggle/index.ts +3 -0
  367. package/src/widgets-v2/actions/stack-toggle/labels.ts +9 -0
  368. package/src/widgets-v2/actions/stack-toggle/stack-toggle.test.tsx +61 -0
  369. package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +54 -0
  370. package/src/widgets-v2/actions/stack-toggle/style.ts +11 -0
  371. package/src/widgets-v2/actions/stack-toggle/transforms.test.ts +43 -0
  372. package/src/widgets-v2/actions/stack-toggle/transforms.ts +25 -0
  373. package/src/widgets-v2/actions/zoom-toggle/index.ts +9 -0
  374. package/src/widgets-v2/actions/zoom-toggle/labels.ts +9 -0
  375. package/src/widgets-v2/actions/zoom-toggle/style.ts +11 -0
  376. package/src/widgets-v2/actions/zoom-toggle/transforms.test.ts +148 -0
  377. package/src/widgets-v2/actions/zoom-toggle/transforms.ts +171 -0
  378. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.test.tsx +107 -0
  379. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +106 -0
  380. package/src/widgets-v2/bar/download.test.tsx +91 -0
  381. package/src/widgets-v2/bar/download.tsx +66 -0
  382. package/src/widgets-v2/bar/index.ts +10 -0
  383. package/src/widgets-v2/bar/options.test.ts +334 -0
  384. package/src/widgets-v2/bar/options.ts +332 -0
  385. package/src/widgets-v2/bar/skeleton.test.tsx +19 -0
  386. package/src/widgets-v2/bar/skeleton.tsx +69 -0
  387. package/src/widgets-v2/bar/types.ts +51 -0
  388. package/src/widgets-v2/category/category-ui.test.tsx +746 -0
  389. package/src/widgets-v2/category/category-ui.tsx +389 -0
  390. package/src/widgets-v2/category/category.relative-data.test.tsx +107 -0
  391. package/src/widgets-v2/category/category.stack-toggle.test.tsx +85 -0
  392. package/src/widgets-v2/category/category.test.tsx +305 -0
  393. package/src/widgets-v2/category/category.tsx +121 -0
  394. package/src/widgets-v2/category/components/category-bar-stacked.test.tsx +121 -0
  395. package/src/widgets-v2/category/components/category-bar-stacked.tsx +73 -0
  396. package/src/widgets-v2/category/components/category-bar.test.tsx +64 -0
  397. package/src/widgets-v2/category/components/category-bar.tsx +49 -0
  398. package/src/widgets-v2/category/components/category-legend.test.tsx +51 -0
  399. package/src/widgets-v2/category/components/category-legend.tsx +39 -0
  400. package/src/widgets-v2/category/components/category-row-multi.tsx +86 -0
  401. package/src/widgets-v2/category/components/category-row-other.test.tsx +28 -0
  402. package/src/widgets-v2/category/components/category-row-other.tsx +33 -0
  403. package/src/widgets-v2/category/components/category-row-single.tsx +76 -0
  404. package/src/widgets-v2/category/components/category-row-stacked.test.tsx +244 -0
  405. package/src/widgets-v2/category/components/category-row-stacked.tsx +99 -0
  406. package/src/widgets-v2/category/download.test.ts +71 -0
  407. package/src/widgets-v2/category/download.ts +54 -0
  408. package/src/widgets-v2/category/index.ts +32 -0
  409. package/src/widgets-v2/category/skeleton.test.tsx +26 -0
  410. package/src/widgets-v2/category/skeleton.tsx +74 -0
  411. package/src/widgets-v2/category/style.ts +290 -0
  412. package/src/widgets-v2/category/types.ts +59 -0
  413. package/src/widgets-v2/echart/echart-ui.test.tsx +232 -0
  414. package/src/widgets-v2/echart/echart-ui.tsx +184 -0
  415. package/src/widgets-v2/echart/echart.test.tsx +229 -0
  416. package/src/widgets-v2/echart/echart.tsx +199 -0
  417. package/src/widgets-v2/echart/index.ts +22 -0
  418. package/src/widgets-v2/echart/shared-resize-observer.test.ts +91 -0
  419. package/src/widgets-v2/echart/shared-resize-observer.ts +56 -0
  420. package/src/widgets-v2/echart/style.ts +8 -0
  421. package/src/widgets-v2/echart/use-chart-selection.test.tsx +118 -0
  422. package/src/widgets-v2/echart/use-chart-selection.ts +115 -0
  423. package/src/widgets-v2/formula/delta.tsx +61 -0
  424. package/src/widgets-v2/formula/download.test.tsx +65 -0
  425. package/src/widgets-v2/formula/download.tsx +69 -0
  426. package/src/widgets-v2/formula/formula-ui.test.tsx +91 -0
  427. package/src/widgets-v2/formula/formula-ui.tsx +66 -0
  428. package/src/widgets-v2/formula/formula.test.tsx +50 -0
  429. package/src/widgets-v2/formula/formula.tsx +34 -0
  430. package/src/widgets-v2/formula/index.ts +17 -0
  431. package/src/widgets-v2/formula/note.tsx +25 -0
  432. package/src/widgets-v2/formula/prefix.tsx +25 -0
  433. package/src/widgets-v2/formula/series.tsx +67 -0
  434. package/src/widgets-v2/formula/skeleton.test.tsx +21 -0
  435. package/src/widgets-v2/formula/skeleton.tsx +27 -0
  436. package/src/widgets-v2/formula/style.ts +31 -0
  437. package/src/widgets-v2/formula/subcomponents.test.tsx +107 -0
  438. package/src/widgets-v2/formula/suffix.tsx +25 -0
  439. package/src/widgets-v2/formula/types.ts +48 -0
  440. package/src/widgets-v2/formula/value.tsx +31 -0
  441. package/src/widgets-v2/histogram/download.test.ts +94 -0
  442. package/src/widgets-v2/histogram/download.ts +60 -0
  443. package/src/widgets-v2/histogram/index.ts +10 -0
  444. package/src/widgets-v2/histogram/options.test.ts +318 -0
  445. package/src/widgets-v2/histogram/options.ts +338 -0
  446. package/src/widgets-v2/histogram/skeleton.test.tsx +16 -0
  447. package/src/widgets-v2/histogram/skeleton.tsx +70 -0
  448. package/src/widgets-v2/histogram/transforms.test.ts +46 -0
  449. package/src/widgets-v2/histogram/transforms.ts +30 -0
  450. package/src/widgets-v2/histogram/types.ts +55 -0
  451. package/src/widgets-v2/index.ts +204 -0
  452. package/src/widgets-v2/markdown/download.test.ts +66 -0
  453. package/src/widgets-v2/markdown/download.ts +53 -0
  454. package/src/widgets-v2/markdown/index.ts +6 -0
  455. package/src/widgets-v2/markdown/markdown-content.test.tsx +155 -0
  456. package/src/widgets-v2/markdown/markdown-content.tsx +72 -0
  457. package/src/widgets-v2/markdown/markdown-ui.test.tsx +75 -0
  458. package/src/widgets-v2/markdown/markdown-ui.tsx +55 -0
  459. package/src/widgets-v2/markdown/markdown.test.tsx +39 -0
  460. package/src/widgets-v2/markdown/markdown.tsx +17 -0
  461. package/src/widgets-v2/markdown/skeleton.test.tsx +15 -0
  462. package/src/widgets-v2/markdown/skeleton.tsx +32 -0
  463. package/src/widgets-v2/markdown/style.ts +53 -0
  464. package/src/widgets-v2/markdown/types.ts +4 -0
  465. package/src/widgets-v2/note/labels.ts +9 -0
  466. package/src/widgets-v2/note/style.ts +26 -0
  467. package/src/widgets-v2/note/widget-note.test.tsx +158 -0
  468. package/src/widgets-v2/note/widget-note.tsx +172 -0
  469. package/src/widgets-v2/pie/download.test.ts +78 -0
  470. package/src/widgets-v2/pie/download.ts +55 -0
  471. package/src/widgets-v2/pie/index.ts +10 -0
  472. package/src/widgets-v2/pie/options.test.ts +601 -0
  473. package/src/widgets-v2/pie/options.ts +513 -0
  474. package/src/widgets-v2/pie/skeleton.test.tsx +17 -0
  475. package/src/widgets-v2/pie/skeleton.tsx +32 -0
  476. package/src/widgets-v2/pie/types.ts +62 -0
  477. package/src/widgets-v2/provider/widget-provider.test.tsx +119 -0
  478. package/src/widgets-v2/provider/widget-provider.tsx +111 -0
  479. package/src/widgets-v2/range/index.ts +4 -0
  480. package/src/widgets-v2/range/range-ui.test.tsx +136 -0
  481. package/src/widgets-v2/range/range-ui.tsx +278 -0
  482. package/src/widgets-v2/range/range.test.tsx +68 -0
  483. package/src/widgets-v2/range/range.tsx +52 -0
  484. package/src/widgets-v2/range/skeleton.test.tsx +17 -0
  485. package/src/widgets-v2/range/skeleton.tsx +47 -0
  486. package/src/widgets-v2/range/style.ts +41 -0
  487. package/src/widgets-v2/range/types.ts +37 -0
  488. package/src/widgets-v2/scatterplot/download.test.ts +71 -0
  489. package/src/widgets-v2/scatterplot/download.ts +54 -0
  490. package/src/widgets-v2/scatterplot/index.ts +11 -0
  491. package/src/widgets-v2/scatterplot/options.test.ts +411 -0
  492. package/src/widgets-v2/scatterplot/options.ts +425 -0
  493. package/src/widgets-v2/scatterplot/skeleton.test.tsx +17 -0
  494. package/src/widgets-v2/scatterplot/skeleton.tsx +84 -0
  495. package/src/widgets-v2/scatterplot/transforms.test.ts +97 -0
  496. package/src/widgets-v2/scatterplot/transforms.ts +38 -0
  497. package/src/widgets-v2/scatterplot/types.ts +59 -0
  498. package/src/widgets-v2/selection-summary/labels.ts +11 -0
  499. package/src/widgets-v2/selection-summary/selection-summary.test.tsx +53 -0
  500. package/src/widgets-v2/selection-summary/selection-summary.tsx +62 -0
  501. package/src/widgets-v2/selection-summary/style.ts +23 -0
  502. package/src/widgets-v2/spread/download.test.ts +64 -0
  503. package/src/widgets-v2/spread/download.ts +59 -0
  504. package/src/widgets-v2/spread/index.ts +6 -0
  505. package/src/widgets-v2/spread/separator.tsx +11 -0
  506. package/src/widgets-v2/spread/skeleton.test.tsx +17 -0
  507. package/src/widgets-v2/spread/skeleton.tsx +38 -0
  508. package/src/widgets-v2/spread/spread-ui.test.tsx +108 -0
  509. package/src/widgets-v2/spread/spread-ui.tsx +52 -0
  510. package/src/widgets-v2/spread/spread.test.tsx +50 -0
  511. package/src/widgets-v2/spread/spread.tsx +31 -0
  512. package/src/widgets-v2/spread/types.ts +27 -0
  513. package/src/widgets-v2/state/labels.test.ts +33 -0
  514. package/src/widgets-v2/state/labels.ts +20 -0
  515. package/src/widgets-v2/state/style.ts +25 -0
  516. package/src/widgets-v2/state/widget-state.test.tsx +294 -0
  517. package/src/widgets-v2/state/widget-state.tsx +184 -0
  518. package/src/widgets-v2/stores/index.ts +49 -0
  519. package/src/widgets-v2/stores/pipeline-middleware.test.ts +187 -0
  520. package/src/widgets-v2/stores/pipeline-middleware.ts +91 -0
  521. package/src/widgets-v2/stores/transforms.test.ts +162 -0
  522. package/src/widgets-v2/stores/transforms.ts +70 -0
  523. package/src/widgets-v2/stores/types.ts +64 -0
  524. package/src/widgets-v2/stores/use-echart-instance.test.tsx +91 -0
  525. package/src/widgets-v2/stores/use-echart-instance.ts +29 -0
  526. package/src/widgets-v2/stores/use-transform-enabled.test.tsx +127 -0
  527. package/src/widgets-v2/stores/use-transform-enabled.ts +25 -0
  528. package/src/widgets-v2/stores/use-transform.test.tsx +262 -0
  529. package/src/widgets-v2/stores/use-transform.ts +158 -0
  530. package/src/widgets-v2/stores/widget-context.test.tsx +58 -0
  531. package/src/widgets-v2/stores/widget-context.ts +15 -0
  532. package/src/widgets-v2/stores/widget-store-registry.test.ts +292 -0
  533. package/src/widgets-v2/stores/widget-store-registry.ts +248 -0
  534. package/src/widgets-v2/subheader/style.ts +12 -0
  535. package/src/widgets-v2/subheader/subheader.test.tsx +30 -0
  536. package/src/widgets-v2/subheader/subheader.tsx +16 -0
  537. package/src/widgets-v2/table/download.test.ts +75 -0
  538. package/src/widgets-v2/table/download.ts +47 -0
  539. package/src/widgets-v2/table/helpers.test.ts +214 -0
  540. package/src/widgets-v2/table/helpers.ts +136 -0
  541. package/src/widgets-v2/table/index.ts +23 -0
  542. package/src/widgets-v2/table/labels.tsx +41 -0
  543. package/src/widgets-v2/table/skeleton.test.tsx +26 -0
  544. package/src/widgets-v2/table/skeleton.tsx +65 -0
  545. package/src/widgets-v2/table/style.ts +43 -0
  546. package/src/widgets-v2/table/table-ui.test.tsx +200 -0
  547. package/src/widgets-v2/table/table-ui.tsx +364 -0
  548. package/src/widgets-v2/table/table.test.tsx +119 -0
  549. package/src/widgets-v2/table/table.tsx +179 -0
  550. package/src/widgets-v2/table/types.ts +55 -0
  551. package/src/widgets-v2/test-utils.ts +107 -0
  552. package/src/widgets-v2/timeseries/download.test.ts +95 -0
  553. package/src/widgets-v2/timeseries/download.ts +86 -0
  554. package/src/widgets-v2/timeseries/index.ts +10 -0
  555. package/src/widgets-v2/timeseries/options.test.ts +394 -0
  556. package/src/widgets-v2/timeseries/options.ts +348 -0
  557. package/src/widgets-v2/timeseries/skeleton.test.tsx +13 -0
  558. package/src/widgets-v2/timeseries/skeleton.tsx +76 -0
  559. package/src/widgets-v2/timeseries/types.ts +65 -0
  560. package/src/widgets-v2/toolbox/labels.ts +9 -0
  561. package/src/widgets-v2/toolbox/style.ts +33 -0
  562. package/src/widgets-v2/toolbox/toolbox.test.tsx +200 -0
  563. package/src/widgets-v2/toolbox/toolbox.tsx +309 -0
  564. package/src/widgets-v2/types.ts +25 -0
  565. package/src/widgets-v2/utils/data-zoom-layout.ts +26 -0
  566. package/src/widgets-v2/utils/index.ts +3 -0
  567. package/src/widgets-v2/utils/merge-options.test.ts +52 -0
  568. package/src/widgets-v2/utils/merge-options.ts +50 -0
  569. package/src/widgets-v2/utils/resolve-theme-color.test.ts +43 -0
  570. package/src/widgets-v2/utils/resolve-theme-color.ts +34 -0
  571. package/src/widgets-v2/wrapper/index.ts +14 -0
  572. package/src/widgets-v2/wrapper/labels.ts +11 -0
  573. package/src/widgets-v2/wrapper/style.ts +134 -0
  574. package/src/widgets-v2/wrapper/widget-actions.test.tsx +52 -0
  575. package/src/widgets-v2/wrapper/widget-actions.tsx +43 -0
  576. package/src/widgets-v2/wrapper/widget-content.test.tsx +27 -0
  577. package/src/widgets-v2/wrapper/widget-content.tsx +29 -0
  578. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +159 -0
  579. package/src/widgets-v2/wrapper/widget-wrapper.tsx +178 -0
  580. package/dist/styles-BYTyKQFP.js.map +0 -1
@@ -0,0 +1,27 @@
1
+ import type { FormulaSeries } from '../formula'
2
+
3
+ /**
4
+ * A single min/max pair rendered by the Spread widget. Mirrors
5
+ * {@link FormulaDataItem} — same optional `series`, `prefix`, `suffix`,
6
+ * `color`, and `note` slots — but the value is a range (`min` … `max`)
7
+ * rather than a single `value`.
8
+ */
9
+ export interface SpreadDataItem {
10
+ min: number
11
+ max: number
12
+ prefix?: string
13
+ suffix?: string
14
+ /** Override the values' text colour (e.g. `'success.main'`). */
15
+ color?: string
16
+ /** Optional series indicator — coloured avatar with first letter of `name`. */
17
+ series?: FormulaSeries
18
+ /** Optional caption rendered below the values. */
19
+ note?: string
20
+ }
21
+
22
+ /**
23
+ * Spread widget data — an array of `{min, max, …}` pairs rendered
24
+ * top-to-bottom, one row per entry. Visual structure matches the Formula
25
+ * widget so the two can sit side-by-side without style drift.
26
+ */
27
+ export type SpreadWidgetData = readonly SpreadDataItem[]
@@ -0,0 +1,33 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { DEFAULT_STATE_LABELS } from './labels'
3
+
4
+ const { errorMessage } = DEFAULT_STATE_LABELS
5
+
6
+ describe('DEFAULT_STATE_LABELS.errorMessage', () => {
7
+ it('returns Error.message for Error instances', () => {
8
+ expect(errorMessage(new Error('boom'))).toBe('boom')
9
+ })
10
+
11
+ it('returns the string verbatim when given a string', () => {
12
+ expect(errorMessage('plain text')).toBe('plain text')
13
+ })
14
+
15
+ it('coerces objects with a message field to that message', () => {
16
+ expect(errorMessage({ message: 'custom-msg' })).toBe('custom-msg')
17
+ // Non-string message coerces via String()
18
+ expect(errorMessage({ message: 42 })).toBe('42')
19
+ })
20
+
21
+ it('falls back to "Unknown error" for unknown shapes', () => {
22
+ expect(errorMessage(42)).toBe('Unknown error')
23
+ expect(errorMessage(null)).toBe('Unknown error')
24
+ expect(errorMessage(undefined)).toBe('Unknown error')
25
+ expect(errorMessage({ no: 'message-field' })).toBe('Unknown error')
26
+ })
27
+
28
+ it('exposes the default labels as plain strings', () => {
29
+ expect(DEFAULT_STATE_LABELS.errorTitle).toBe('Something went wrong')
30
+ expect(DEFAULT_STATE_LABELS.emptyTitle).toBe('No data')
31
+ expect(typeof DEFAULT_STATE_LABELS.emptyDescription).toBe('string')
32
+ })
33
+ })
@@ -0,0 +1,20 @@
1
+ export interface StateLabels {
2
+ errorTitle: string
3
+ errorMessage: (error: unknown) => string
4
+ emptyTitle: string
5
+ emptyDescription: string
6
+ }
7
+
8
+ export const DEFAULT_STATE_LABELS: StateLabels = {
9
+ errorTitle: 'Something went wrong',
10
+ errorMessage: (error: unknown): string => {
11
+ if (error instanceof Error) return error.message
12
+ if (typeof error === 'string') return error
13
+ if (error && typeof error === 'object' && 'message' in error) {
14
+ return String((error as { message: unknown }).message)
15
+ }
16
+ return 'Unknown error'
17
+ },
18
+ emptyTitle: 'No data',
19
+ emptyDescription: 'Try adjusting filters or wait for data to load.',
20
+ }
@@ -0,0 +1,25 @@
1
+ import type { SxProps, Theme } from '@mui/material'
2
+
3
+ export const styles = {
4
+ emptyRoot: {
5
+ display: 'flex',
6
+ flexDirection: 'column',
7
+ gap: 1,
8
+ paddingTop: 1,
9
+ paddingBottom: 2,
10
+ paddingX: 2,
11
+ width: '100%',
12
+ minHeight: '100%',
13
+ },
14
+ // Stable wrapper around the success-path children. Real layout (flex
15
+ // column) so html2canvas has a non-zero bounding rect to rasterise.
16
+ // `flex: 1; min-height: 0` lets nested scroll regions / fixed-height
17
+ // chart canvases size correctly inside Widget.Content's flex column.
18
+ captureBox: {
19
+ width: '100%',
20
+ minHeight: 0,
21
+ display: 'flex',
22
+ flexDirection: 'column',
23
+ flex: 1,
24
+ },
25
+ } satisfies Record<string, SxProps<Theme>>
@@ -0,0 +1,294 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
2
+ import { act, render, screen } from '@testing-library/react'
3
+ import { State } from './widget-state'
4
+ import { Provider } from '../provider/widget-provider'
5
+ import { clearAllWidgetStores, getCaptureEl, getWidgetStore } from '../stores'
6
+
7
+ beforeEach(() => clearAllWidgetStores())
8
+ afterEach(() => clearAllWidgetStores())
9
+
10
+ describe('<Widget.State>', () => {
11
+ it('renders skeleton when isLoading is true (loading wins)', () => {
12
+ render(
13
+ <Provider id='s1' data={null} isLoading>
14
+ <State skeleton={<div data-testid='skeleton' />}>
15
+ <div>content</div>
16
+ </State>
17
+ </Provider>,
18
+ )
19
+ expect(screen.getByTestId('skeleton')).toBeTruthy()
20
+ })
21
+
22
+ it('renders default error UI when store error is set', () => {
23
+ render(
24
+ <Provider id='s2' data={[1, 2]} error={new Error('boom')}>
25
+ <State skeleton={null}>
26
+ <div>content</div>
27
+ </State>
28
+ </Provider>,
29
+ )
30
+ expect(screen.getByRole('alert').textContent).toContain('boom')
31
+ })
32
+
33
+ it('renders custom fallback when provided', () => {
34
+ render(
35
+ <Provider id='s3' data={[1, 2]} error={new Error('x')}>
36
+ <State
37
+ skeleton={null}
38
+ fallback={(e) => <div data-testid='fb'>{e.message}</div>}
39
+ >
40
+ <div>content</div>
41
+ </State>
42
+ </Provider>,
43
+ )
44
+ expect(screen.getByTestId('fb').textContent).toBe('x')
45
+ })
46
+
47
+ it('renders empty UI when rawData is empty (default predicate)', () => {
48
+ render(
49
+ <Provider id='s4' data={[]}>
50
+ <State skeleton={null} labels={{ emptyTitle: 'NOTHING' }}>
51
+ <div>content</div>
52
+ </State>
53
+ </Provider>,
54
+ )
55
+ expect(screen.getByText('NOTHING')).toBeTruthy()
56
+ })
57
+
58
+ it('renders content when there is data and no error/loading', () => {
59
+ render(
60
+ <Provider id='s5' data={[1]}>
61
+ <State skeleton={null}>
62
+ <div data-testid='ok'>content</div>
63
+ </State>
64
+ </Provider>,
65
+ )
66
+ expect(screen.getByTestId('ok')).toBeTruthy()
67
+ })
68
+
69
+ it('catches a render error in children and routes through the error UI', () => {
70
+ const spy = vi.spyOn(console, 'error').mockImplementation(() => undefined)
71
+ function Bomb(): null {
72
+ throw new Error('render-throw')
73
+ }
74
+ render(
75
+ <Provider id='s6' data={[1]}>
76
+ <State skeleton={null}>
77
+ <Bomb />
78
+ </State>
79
+ </Provider>,
80
+ )
81
+ expect(screen.getByRole('alert').textContent).toContain('render-throw')
82
+ spy.mockRestore()
83
+ })
84
+
85
+ it('uses custom fallback for render errors too (single render path)', () => {
86
+ const spy = vi.spyOn(console, 'error').mockImplementation(() => undefined)
87
+ function Bomb(): null {
88
+ throw new Error('render-throw-2')
89
+ }
90
+ render(
91
+ <Provider id='s7' data={[1]}>
92
+ <State
93
+ skeleton={null}
94
+ fallback={(e) => <div data-testid='rb'>{e.message}</div>}
95
+ >
96
+ <Bomb />
97
+ </State>
98
+ </Provider>,
99
+ )
100
+ expect(screen.getByTestId('rb').textContent).toBe('render-throw-2')
101
+ spy.mockRestore()
102
+ })
103
+
104
+ it('uses custom isEmpty predicate against rawData', () => {
105
+ render(
106
+ <Provider id='s8' data={{ rows: [] }}>
107
+ <State
108
+ skeleton={null}
109
+ labels={{ emptyTitle: 'NO ROWS' }}
110
+ isEmpty={(d) =>
111
+ !!d &&
112
+ typeof d === 'object' &&
113
+ Array.isArray((d as { rows: unknown[] }).rows) &&
114
+ (d as { rows: unknown[] }).rows.length === 0
115
+ }
116
+ >
117
+ <div>content</div>
118
+ </State>
119
+ </Provider>,
120
+ )
121
+ expect(screen.getByText('NO ROWS')).toBeTruthy()
122
+ })
123
+
124
+ it('hides errors during fetch (loading wins)', () => {
125
+ render(
126
+ <Provider id='s9' data={[1]} isLoading error={new Error('x')}>
127
+ <State skeleton={<div data-testid='skel' />}>
128
+ <div>content</div>
129
+ </State>
130
+ </Provider>,
131
+ )
132
+ expect(screen.getByTestId('skel')).toBeTruthy()
133
+ expect(screen.queryByRole('alert')).toBeNull()
134
+ })
135
+
136
+ describe('captureEl registry', () => {
137
+ it('registers the success-path content wrapper as captureEl', () => {
138
+ render(
139
+ <Provider id='cap-success' data={[1]}>
140
+ <State skeleton={null}>
141
+ <div data-testid='inner'>content</div>
142
+ </State>
143
+ </Provider>,
144
+ )
145
+ const el = getCaptureEl('cap-success')
146
+ expect(el).not.toBeNull()
147
+ // The captured element wraps the rendered content.
148
+ expect(el?.contains(screen.getByTestId('inner'))).toBe(true)
149
+ })
150
+
151
+ it('does not register a captureEl on the loading branch', () => {
152
+ render(
153
+ <Provider id='cap-loading' data={null} isLoading>
154
+ <State skeleton={<div data-testid='skel' />}>
155
+ <div>content</div>
156
+ </State>
157
+ </Provider>,
158
+ )
159
+ expect(getCaptureEl('cap-loading')).toBeNull()
160
+ })
161
+
162
+ it('does not register a captureEl on the error branch', () => {
163
+ render(
164
+ <Provider id='cap-error' data={[1]} error={new Error('x')}>
165
+ <State skeleton={null}>
166
+ <div>content</div>
167
+ </State>
168
+ </Provider>,
169
+ )
170
+ expect(getCaptureEl('cap-error')).toBeNull()
171
+ })
172
+
173
+ it('does not register a captureEl on the empty branch', () => {
174
+ render(
175
+ <Provider id='cap-empty' data={[]}>
176
+ <State skeleton={null}>
177
+ <div>content</div>
178
+ </State>
179
+ </Provider>,
180
+ )
181
+ expect(getCaptureEl('cap-empty')).toBeNull()
182
+ })
183
+
184
+ it('clears the captureEl on unmount', () => {
185
+ const { unmount } = render(
186
+ <Provider id='cap-unmount' data={[1]}>
187
+ <State skeleton={null}>
188
+ <div>content</div>
189
+ </State>
190
+ </Provider>,
191
+ )
192
+ expect(getCaptureEl('cap-unmount')).not.toBeNull()
193
+ unmount()
194
+ expect(getCaptureEl('cap-unmount')).toBeNull()
195
+ })
196
+ })
197
+
198
+ describe('default isEmpty predicate', () => {
199
+ it('treats an empty object literal as empty', () => {
200
+ render(
201
+ <Provider id='isEmpty-empty-obj' data={{}}>
202
+ <State skeleton={null} labels={{ emptyTitle: 'EMPTY' }}>
203
+ <div>content</div>
204
+ </State>
205
+ </Provider>,
206
+ )
207
+ expect(screen.getByText('EMPTY')).toBeTruthy()
208
+ })
209
+
210
+ it('treats an array of empty arrays as empty', () => {
211
+ render(
212
+ <Provider id='isEmpty-empty-rows' data={[[], []]}>
213
+ <State skeleton={null} labels={{ emptyTitle: 'EMPTY-ROWS' }}>
214
+ <div>content</div>
215
+ </State>
216
+ </Provider>,
217
+ )
218
+ expect(screen.getByText('EMPTY-ROWS')).toBeTruthy()
219
+ })
220
+
221
+ it('treats a populated array of non-empty sub-arrays as non-empty', () => {
222
+ render(
223
+ <Provider id='isEmpty-populated' data={[[1], [2]]}>
224
+ <State skeleton={null}>
225
+ <div data-testid='content'>content</div>
226
+ </State>
227
+ </Provider>,
228
+ )
229
+ expect(screen.getByTestId('content')).toBeTruthy()
230
+ })
231
+ })
232
+
233
+ describe('toError coercion', () => {
234
+ it('coerces a string error to an Error instance', () => {
235
+ render(
236
+ <Provider id='err-string' data={[1]} error='string-msg'>
237
+ <State skeleton={null}>
238
+ <div>content</div>
239
+ </State>
240
+ </Provider>,
241
+ )
242
+ expect(screen.getByRole('alert').textContent).toContain('string-msg')
243
+ })
244
+
245
+ it('coerces an object-with-message to an Error instance', () => {
246
+ render(
247
+ <Provider id='err-objmsg' data={[1]} error={{ message: 'object-msg' }}>
248
+ <State skeleton={null}>
249
+ <div>content</div>
250
+ </State>
251
+ </Provider>,
252
+ )
253
+ expect(screen.getByRole('alert').textContent).toContain('object-msg')
254
+ })
255
+
256
+ it('falls back to "Unknown error" for unknown shapes', () => {
257
+ render(
258
+ <Provider id='err-unknown' data={[1]} error={42}>
259
+ <State skeleton={null}>
260
+ <div>content</div>
261
+ </State>
262
+ </Provider>,
263
+ )
264
+ expect(screen.getByRole('alert').textContent).toContain('Unknown error')
265
+ })
266
+ })
267
+
268
+ it('routes a transform-throw error (set by middleware) through the same UI', () => {
269
+ render(
270
+ <Provider id='s10' data={[1, 2]}>
271
+ <State skeleton={null}>
272
+ <div>content</div>
273
+ </State>
274
+ </Provider>,
275
+ )
276
+ // Simulate a transform throw setting the error field
277
+ act(() => {
278
+ getWidgetStore('s10').setState({
279
+ dataTransforms: [
280
+ {
281
+ id: 'bad',
282
+ type: 'data',
283
+ order: 1,
284
+ enabled: true,
285
+ fn: () => {
286
+ throw new Error('transform-throw')
287
+ },
288
+ },
289
+ ],
290
+ })
291
+ })
292
+ expect(screen.getByRole('alert').textContent).toContain('transform-throw')
293
+ })
294
+ })
@@ -0,0 +1,184 @@
1
+ import { Component, useCallback, type ReactNode } from 'react'
2
+ import { Alert, AlertTitle, Box, Typography } from '@mui/material'
3
+ import { setCaptureEl, useWidgetId, useWidgetShallow } from '../stores'
4
+ import { styles } from './style'
5
+ import { DEFAULT_STATE_LABELS, type StateLabels } from './labels'
6
+
7
+ export interface StateProps {
8
+ skeleton: ReactNode
9
+ children: ReactNode
10
+ /** Override the empty-state predicate. Receives `rawData` (pre-pipeline). */
11
+ isEmpty?: (rawData: unknown) => boolean
12
+ /** Render an alternative error UI. When omitted, the default ErrorView is used. */
13
+ fallback?: (error: Error) => ReactNode
14
+ labels?: Partial<StateLabels>
15
+ }
16
+
17
+ interface StateSlice {
18
+ isLoading: boolean
19
+ isFetching: boolean
20
+ error: unknown
21
+ rawData: unknown
22
+ }
23
+
24
+ const sliceSelector = (s: {
25
+ isLoading: boolean
26
+ isFetching: boolean
27
+ error: unknown
28
+ rawData: unknown
29
+ }): StateSlice => ({
30
+ isLoading: s.isLoading,
31
+ isFetching: s.isFetching,
32
+ error: s.error,
33
+ rawData: s.rawData,
34
+ })
35
+
36
+ /**
37
+ * Priority chain: loading → error → empty → content. Both consumer-supplied
38
+ * errors (set via Provider's `error` prop) and transform-throw errors (set by
39
+ * the pipeline middleware) flow through the same `error` field. Render-time
40
+ * errors thrown by `children` are caught by the inlined error boundary and
41
+ * routed through the same path.
42
+ */
43
+ export function State({
44
+ skeleton,
45
+ children,
46
+ isEmpty = defaultIsEmpty,
47
+ fallback,
48
+ labels,
49
+ }: StateProps) {
50
+ const id = useWidgetId()
51
+ const slice = useWidgetShallow(id, sliceSelector)
52
+ const _labels = { ...DEFAULT_STATE_LABELS, ...labels }
53
+
54
+ // Loading wins over everything else (matches v1 — hides errors during fetch).
55
+ if (slice.isLoading) return <>{skeleton}</>
56
+
57
+ // Store-side error (consumer-supplied or transform-throw via middleware).
58
+ if (slice.error !== undefined && slice.error !== null) {
59
+ const err = toError(slice.error)
60
+ return fallback ? (
61
+ <>{fallback(err)}</>
62
+ ) : (
63
+ <ErrorView error={err} labels={_labels} />
64
+ )
65
+ }
66
+
67
+ // Empty (uses pre-pipeline rawData so a transform that filters everything
68
+ // doesn't get misclassified as "no data from upstream").
69
+ if (isEmpty(slice.rawData)) {
70
+ return <EmptyView labels={_labels} />
71
+ }
72
+
73
+ return (
74
+ <RenderErrorBoundary fallback={fallback} labels={_labels}>
75
+ <CaptureBox id={id}>{children}</CaptureBox>
76
+ </RenderErrorBoundary>
77
+ )
78
+ }
79
+
80
+ /**
81
+ * Wraps the success-path children in a stable flex column whose DOM ref is
82
+ * registered with the per-widget capture map. Per-widget download configs
83
+ * feed the wrapper element to `html2canvas` for PNG export. The callback
84
+ * ref auto-clears (React calls it with `null`) when Widget.State leaves
85
+ * the success branch or unmounts, so loading / error / empty states
86
+ * correctly report "no capture target" via `getCaptureEl`.
87
+ *
88
+ * Composition convention: render interactive controls that should *not*
89
+ * appear in the PNG (e.g. `<Widget.Searcher />`) as siblings of
90
+ * `<Widget.State>` rather than children, so they sit outside this box.
91
+ */
92
+ function CaptureBox({ id, children }: { id: string; children: ReactNode }) {
93
+ const setRef = useCallback(
94
+ (el: HTMLDivElement | null) => setCaptureEl(id, el),
95
+ [id],
96
+ )
97
+ return (
98
+ <Box ref={setRef} sx={styles.captureBox}>
99
+ {children}
100
+ </Box>
101
+ )
102
+ }
103
+
104
+ function ErrorView({ error, labels }: { error: Error; labels: StateLabels }) {
105
+ return (
106
+ <Alert severity='error'>
107
+ <AlertTitle>{labels.errorTitle}</AlertTitle>
108
+ {labels.errorMessage(error)}
109
+ </Alert>
110
+ )
111
+ }
112
+
113
+ function EmptyView({ labels }: { labels: StateLabels }) {
114
+ return (
115
+ <Box sx={styles.emptyRoot}>
116
+ <Typography variant='body2' color='text.primary'>
117
+ {labels.emptyTitle}
118
+ </Typography>
119
+ <Typography variant='caption' color='text.secondary'>
120
+ {labels.emptyDescription}
121
+ </Typography>
122
+ </Box>
123
+ )
124
+ }
125
+
126
+ interface BoundaryProps {
127
+ fallback?: (error: Error) => ReactNode
128
+ labels: StateLabels
129
+ children: ReactNode
130
+ }
131
+
132
+ interface BoundaryState {
133
+ error: Error | null
134
+ }
135
+
136
+ class RenderErrorBoundary extends Component<BoundaryProps, BoundaryState> {
137
+ override state: BoundaryState = { error: null }
138
+
139
+ static getDerivedStateFromError(error: Error): BoundaryState {
140
+ return { error }
141
+ }
142
+
143
+ override componentDidCatch(error: Error): void {
144
+ // eslint-disable-next-line no-console
145
+ console.error('[widgets-v2] Render error in <Widget.State> child:', error)
146
+ }
147
+
148
+ override render(): ReactNode {
149
+ const { error } = this.state
150
+ if (error !== null) {
151
+ const { fallback, labels } = this.props
152
+ return fallback ? (
153
+ fallback(error)
154
+ ) : (
155
+ <ErrorView error={error} labels={labels} />
156
+ )
157
+ }
158
+ return this.props.children
159
+ }
160
+ }
161
+
162
+ function defaultIsEmpty(rawData: unknown): boolean {
163
+ if (rawData == null) return true
164
+ if (Array.isArray(rawData)) {
165
+ if (rawData.length === 0) return true
166
+ if (rawData.every((item) => Array.isArray(item) && item.length === 0)) {
167
+ return true
168
+ }
169
+ return false
170
+ }
171
+ if (typeof rawData === 'object' && Object.keys(rawData).length === 0) {
172
+ return true
173
+ }
174
+ return false
175
+ }
176
+
177
+ function toError(value: unknown): Error {
178
+ if (value instanceof Error) return value
179
+ if (typeof value === 'string') return new Error(value)
180
+ if (value && typeof value === 'object' && 'message' in value) {
181
+ return new Error(String((value as { message: unknown }).message))
182
+ }
183
+ return new Error('Unknown error')
184
+ }
@@ -0,0 +1,49 @@
1
+ export type {
2
+ TransformType,
3
+ TransformDescriptor,
4
+ TransformFn,
5
+ Transform,
6
+ TransformPair,
7
+ WidgetState,
8
+ WidgetInit,
9
+ WidgetStoreApi,
10
+ } from './types'
11
+
12
+ export { applyTransforms, upsertTransform, removeTransform } from './transforms'
13
+
14
+ export { pipelineMiddleware } from './pipeline-middleware'
15
+
16
+ export { WidgetContext, useWidgetId } from './widget-context'
17
+
18
+ export {
19
+ getWidgetStore,
20
+ hasWidgetStore,
21
+ deleteWidgetStore,
22
+ resetWidgetStore,
23
+ clearAllWidgetStores,
24
+ registerWidgetStore,
25
+ unregisterWidgetStore,
26
+ setWidgetStoreEntry,
27
+ createWidgetStore,
28
+ useWidget,
29
+ useWidgetShallow,
30
+ setCaptureEl,
31
+ getCaptureEl,
32
+ clearAllCaptureEls,
33
+ setEchartInstance,
34
+ getEchartInstance,
35
+ subscribeEchartInstance,
36
+ clearAllEchartInstances,
37
+ __debugListWidgetStores,
38
+ } from './widget-store-registry'
39
+
40
+ export { useEchartInstance } from './use-echart-instance'
41
+
42
+ export {
43
+ useTransform,
44
+ useSingleTransform,
45
+ type UseTransformOptions,
46
+ type TransformControls,
47
+ } from './use-transform'
48
+
49
+ export { useTransformEnabled } from './use-transform-enabled'