@carto/ps-react-ui 4.7.0 → 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 (578) 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/actions.js +688 -668
  247. package/dist/widgets/actions.js.map +1 -1
  248. package/dist/widgets/bar.js +14 -13
  249. package/dist/widgets/bar.js.map +1 -1
  250. package/dist/widgets/histogram.js +38 -37
  251. package/dist/widgets/histogram.js.map +1 -1
  252. package/dist/widgets/pie.js +19 -18
  253. package/dist/widgets/pie.js.map +1 -1
  254. package/dist/widgets/scatterplot.js +8 -7
  255. package/dist/widgets/scatterplot.js.map +1 -1
  256. package/dist/widgets/timeseries.js +11 -10
  257. package/dist/widgets/timeseries.js.map +1 -1
  258. package/dist/widgets/utils.js +8 -7
  259. package/dist/widgets/utils.js.map +1 -1
  260. package/dist/widgets-v2/actions.js +43 -0
  261. package/dist/widgets-v2/actions.js.map +1 -0
  262. package/dist/widgets-v2/bar.js +327 -0
  263. package/dist/widgets-v2/bar.js.map +1 -0
  264. package/dist/widgets-v2/category.js +104 -0
  265. package/dist/widgets-v2/category.js.map +1 -0
  266. package/dist/widgets-v2/echart.js +57 -0
  267. package/dist/widgets-v2/echart.js.map +1 -0
  268. package/dist/widgets-v2/formula.js +74 -0
  269. package/dist/widgets-v2/formula.js.map +1 -0
  270. package/dist/widgets-v2/histogram.js +350 -0
  271. package/dist/widgets-v2/histogram.js.map +1 -0
  272. package/dist/widgets-v2/markdown.js +68 -0
  273. package/dist/widgets-v2/markdown.js.map +1 -0
  274. package/dist/widgets-v2/pie.js +381 -0
  275. package/dist/widgets-v2/pie.js.map +1 -0
  276. package/dist/widgets-v2/range.js +52 -0
  277. package/dist/widgets-v2/range.js.map +1 -0
  278. package/dist/widgets-v2/scatterplot.js +405 -0
  279. package/dist/widgets-v2/scatterplot.js.map +1 -0
  280. package/dist/widgets-v2/spread.js +72 -0
  281. package/dist/widgets-v2/spread.js.map +1 -0
  282. package/dist/widgets-v2/stores.js +42 -0
  283. package/dist/widgets-v2/stores.js.map +1 -0
  284. package/dist/widgets-v2/table.js +78 -0
  285. package/dist/widgets-v2/table.js.map +1 -0
  286. package/dist/widgets-v2/timeseries.js +352 -0
  287. package/dist/widgets-v2/timeseries.js.map +1 -0
  288. package/dist/widgets-v2/utils.js +7 -0
  289. package/dist/widgets-v2/utils.js.map +1 -0
  290. package/dist/widgets-v2.js +953 -0
  291. package/dist/widgets-v2.js.map +1 -0
  292. package/package.json +73 -5
  293. package/src/components/lasso-tool/chip.test.tsx +176 -0
  294. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +171 -0
  295. package/src/components/lasso-tool/lasso-tool.test.tsx +198 -0
  296. package/src/components/list-data/list-data.test.tsx +73 -0
  297. package/src/components/no-data-alert/no-data-alert.test.tsx +38 -0
  298. package/src/components/responsive-drawer/responsive-drawer.test.tsx +68 -0
  299. package/src/widgets/actions/brush-toggle/brush-overlay.test.tsx +465 -0
  300. package/src/widgets/actions/brush-toggle/brush-overlay.tsx +24 -2
  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/histogram/config.ts +1 -3
  309. package/src/widgets/range/components/range-item.test.tsx +243 -0
  310. package/src/widgets/stores/widget-store-branches.test.ts +275 -0
  311. package/src/widgets/table/config.test.ts +65 -0
  312. package/src/widgets/utils/chart-config/option-builders.test.ts +188 -0
  313. package/src/widgets-v2/PERFORMANCE.md +189 -0
  314. package/src/widgets-v2/actions/brush-toggle/brush-toggle.test.tsx +180 -0
  315. package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +154 -0
  316. package/src/widgets-v2/actions/brush-toggle/index.ts +3 -0
  317. package/src/widgets-v2/actions/brush-toggle/labels.ts +9 -0
  318. package/src/widgets-v2/actions/brush-toggle/style.ts +11 -0
  319. package/src/widgets-v2/actions/brush-toggle/transforms.test.ts +47 -0
  320. package/src/widgets-v2/actions/brush-toggle/transforms.ts +31 -0
  321. package/src/widgets-v2/actions/change-column/change-column-icon.tsx +14 -0
  322. package/src/widgets-v2/actions/change-column/change-column.test.tsx +59 -0
  323. package/src/widgets-v2/actions/change-column/change-column.tsx +180 -0
  324. package/src/widgets-v2/actions/change-column/index.ts +7 -0
  325. package/src/widgets-v2/actions/change-column/labels.ts +9 -0
  326. package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +56 -0
  327. package/src/widgets-v2/actions/change-column/style.ts +32 -0
  328. package/src/widgets-v2/actions/change-column/types.ts +11 -0
  329. package/src/widgets-v2/actions/download/download.test.tsx +327 -0
  330. package/src/widgets-v2/actions/download/download.tsx +144 -0
  331. package/src/widgets-v2/actions/download/exports.test.tsx +198 -0
  332. package/src/widgets-v2/actions/download/exports.ts +115 -0
  333. package/src/widgets-v2/actions/download/icons.tsx +26 -0
  334. package/src/widgets-v2/actions/download/index.ts +13 -0
  335. package/src/widgets-v2/actions/download/labels.ts +16 -0
  336. package/src/widgets-v2/actions/download/png-item.test.tsx +72 -0
  337. package/src/widgets-v2/actions/download/png-item.tsx +52 -0
  338. package/src/widgets-v2/actions/download/style.ts +3 -0
  339. package/src/widgets-v2/actions/download/types.ts +32 -0
  340. package/src/widgets-v2/actions/fullscreen/fullscreen.test.tsx +150 -0
  341. package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +230 -0
  342. package/src/widgets-v2/actions/fullscreen/index.ts +7 -0
  343. package/src/widgets-v2/actions/fullscreen/labels.ts +9 -0
  344. package/src/widgets-v2/actions/fullscreen/style.ts +59 -0
  345. package/src/widgets-v2/actions/fullscreen/types.ts +15 -0
  346. package/src/widgets-v2/actions/index.ts +82 -0
  347. package/src/widgets-v2/actions/lock-selection/index.ts +10 -0
  348. package/src/widgets-v2/actions/lock-selection/labels.ts +11 -0
  349. package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +187 -0
  350. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +130 -0
  351. package/src/widgets-v2/actions/lock-selection/style.ts +11 -0
  352. package/src/widgets-v2/actions/lock-selection/transforms.ts +27 -0
  353. package/src/widgets-v2/actions/relative-data/index.ts +3 -0
  354. package/src/widgets-v2/actions/relative-data/labels.ts +9 -0
  355. package/src/widgets-v2/actions/relative-data/relative-data.test.tsx +71 -0
  356. package/src/widgets-v2/actions/relative-data/relative-data.tsx +107 -0
  357. package/src/widgets-v2/actions/relative-data/style.ts +11 -0
  358. package/src/widgets-v2/actions/relative-data/transforms.test.ts +151 -0
  359. package/src/widgets-v2/actions/relative-data/transforms.ts +70 -0
  360. package/src/widgets-v2/actions/searcher/filter.ts +28 -0
  361. package/src/widgets-v2/actions/searcher/index.ts +8 -0
  362. package/src/widgets-v2/actions/searcher/labels.ts +13 -0
  363. package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +91 -0
  364. package/src/widgets-v2/actions/searcher/searcher.test.tsx +92 -0
  365. package/src/widgets-v2/actions/searcher/searcher.tsx +112 -0
  366. package/src/widgets-v2/actions/searcher/style.ts +15 -0
  367. package/src/widgets-v2/actions/stack-toggle/index.ts +3 -0
  368. package/src/widgets-v2/actions/stack-toggle/labels.ts +9 -0
  369. package/src/widgets-v2/actions/stack-toggle/stack-toggle.test.tsx +61 -0
  370. package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +54 -0
  371. package/src/widgets-v2/actions/stack-toggle/style.ts +11 -0
  372. package/src/widgets-v2/actions/stack-toggle/transforms.test.ts +43 -0
  373. package/src/widgets-v2/actions/stack-toggle/transforms.ts +25 -0
  374. package/src/widgets-v2/actions/zoom-toggle/index.ts +9 -0
  375. package/src/widgets-v2/actions/zoom-toggle/labels.ts +9 -0
  376. package/src/widgets-v2/actions/zoom-toggle/style.ts +11 -0
  377. package/src/widgets-v2/actions/zoom-toggle/transforms.test.ts +148 -0
  378. package/src/widgets-v2/actions/zoom-toggle/transforms.ts +171 -0
  379. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.test.tsx +107 -0
  380. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +106 -0
  381. package/src/widgets-v2/bar/download.test.tsx +91 -0
  382. package/src/widgets-v2/bar/download.tsx +66 -0
  383. package/src/widgets-v2/bar/index.ts +10 -0
  384. package/src/widgets-v2/bar/options.test.ts +317 -0
  385. package/src/widgets-v2/bar/options.ts +326 -0
  386. package/src/widgets-v2/bar/skeleton.test.tsx +19 -0
  387. package/src/widgets-v2/bar/skeleton.tsx +69 -0
  388. package/src/widgets-v2/bar/types.ts +46 -0
  389. package/src/widgets-v2/category/category-ui.test.tsx +746 -0
  390. package/src/widgets-v2/category/category-ui.tsx +389 -0
  391. package/src/widgets-v2/category/category.relative-data.test.tsx +107 -0
  392. package/src/widgets-v2/category/category.stack-toggle.test.tsx +85 -0
  393. package/src/widgets-v2/category/category.test.tsx +305 -0
  394. package/src/widgets-v2/category/category.tsx +121 -0
  395. package/src/widgets-v2/category/components/category-bar-stacked.test.tsx +121 -0
  396. package/src/widgets-v2/category/components/category-bar-stacked.tsx +73 -0
  397. package/src/widgets-v2/category/components/category-bar.test.tsx +64 -0
  398. package/src/widgets-v2/category/components/category-bar.tsx +49 -0
  399. package/src/widgets-v2/category/components/category-legend.test.tsx +51 -0
  400. package/src/widgets-v2/category/components/category-legend.tsx +39 -0
  401. package/src/widgets-v2/category/components/category-row-multi.tsx +86 -0
  402. package/src/widgets-v2/category/components/category-row-other.test.tsx +28 -0
  403. package/src/widgets-v2/category/components/category-row-other.tsx +33 -0
  404. package/src/widgets-v2/category/components/category-row-single.tsx +76 -0
  405. package/src/widgets-v2/category/components/category-row-stacked.test.tsx +244 -0
  406. package/src/widgets-v2/category/components/category-row-stacked.tsx +99 -0
  407. package/src/widgets-v2/category/download.test.ts +71 -0
  408. package/src/widgets-v2/category/download.ts +54 -0
  409. package/src/widgets-v2/category/index.ts +32 -0
  410. package/src/widgets-v2/category/skeleton.test.tsx +26 -0
  411. package/src/widgets-v2/category/skeleton.tsx +74 -0
  412. package/src/widgets-v2/category/style.ts +290 -0
  413. package/src/widgets-v2/category/types.ts +54 -0
  414. package/src/widgets-v2/echart/echart-ui.test.tsx +232 -0
  415. package/src/widgets-v2/echart/echart-ui.tsx +184 -0
  416. package/src/widgets-v2/echart/echart.test.tsx +229 -0
  417. package/src/widgets-v2/echart/echart.tsx +199 -0
  418. package/src/widgets-v2/echart/index.ts +22 -0
  419. package/src/widgets-v2/echart/shared-resize-observer.test.ts +91 -0
  420. package/src/widgets-v2/echart/shared-resize-observer.ts +56 -0
  421. package/src/widgets-v2/echart/style.ts +8 -0
  422. package/src/widgets-v2/echart/use-chart-selection.test.tsx +118 -0
  423. package/src/widgets-v2/echart/use-chart-selection.ts +115 -0
  424. package/src/widgets-v2/formula/delta.tsx +61 -0
  425. package/src/widgets-v2/formula/download.test.tsx +65 -0
  426. package/src/widgets-v2/formula/download.tsx +69 -0
  427. package/src/widgets-v2/formula/formula-ui.test.tsx +91 -0
  428. package/src/widgets-v2/formula/formula-ui.tsx +66 -0
  429. package/src/widgets-v2/formula/formula.test.tsx +50 -0
  430. package/src/widgets-v2/formula/formula.tsx +34 -0
  431. package/src/widgets-v2/formula/index.ts +17 -0
  432. package/src/widgets-v2/formula/note.tsx +25 -0
  433. package/src/widgets-v2/formula/prefix.tsx +25 -0
  434. package/src/widgets-v2/formula/series.tsx +67 -0
  435. package/src/widgets-v2/formula/skeleton.test.tsx +21 -0
  436. package/src/widgets-v2/formula/skeleton.tsx +27 -0
  437. package/src/widgets-v2/formula/style.ts +31 -0
  438. package/src/widgets-v2/formula/subcomponents.test.tsx +107 -0
  439. package/src/widgets-v2/formula/suffix.tsx +25 -0
  440. package/src/widgets-v2/formula/types.ts +44 -0
  441. package/src/widgets-v2/formula/value.tsx +31 -0
  442. package/src/widgets-v2/histogram/download.test.ts +94 -0
  443. package/src/widgets-v2/histogram/download.ts +60 -0
  444. package/src/widgets-v2/histogram/index.ts +10 -0
  445. package/src/widgets-v2/histogram/options.test.ts +304 -0
  446. package/src/widgets-v2/histogram/options.ts +337 -0
  447. package/src/widgets-v2/histogram/skeleton.test.tsx +16 -0
  448. package/src/widgets-v2/histogram/skeleton.tsx +70 -0
  449. package/src/widgets-v2/histogram/transforms.test.ts +46 -0
  450. package/src/widgets-v2/histogram/transforms.ts +30 -0
  451. package/src/widgets-v2/histogram/types.ts +51 -0
  452. package/src/widgets-v2/index.ts +201 -0
  453. package/src/widgets-v2/markdown/download.test.ts +66 -0
  454. package/src/widgets-v2/markdown/download.ts +53 -0
  455. package/src/widgets-v2/markdown/index.ts +6 -0
  456. package/src/widgets-v2/markdown/markdown-content.test.tsx +155 -0
  457. package/src/widgets-v2/markdown/markdown-content.tsx +72 -0
  458. package/src/widgets-v2/markdown/markdown-ui.test.tsx +75 -0
  459. package/src/widgets-v2/markdown/markdown-ui.tsx +55 -0
  460. package/src/widgets-v2/markdown/markdown.test.tsx +39 -0
  461. package/src/widgets-v2/markdown/markdown.tsx +17 -0
  462. package/src/widgets-v2/markdown/skeleton.test.tsx +15 -0
  463. package/src/widgets-v2/markdown/skeleton.tsx +32 -0
  464. package/src/widgets-v2/markdown/style.ts +53 -0
  465. package/src/widgets-v2/markdown/types.ts +4 -0
  466. package/src/widgets-v2/note/labels.ts +9 -0
  467. package/src/widgets-v2/note/style.ts +26 -0
  468. package/src/widgets-v2/note/widget-note.test.tsx +158 -0
  469. package/src/widgets-v2/note/widget-note.tsx +172 -0
  470. package/src/widgets-v2/pie/download.test.ts +78 -0
  471. package/src/widgets-v2/pie/download.ts +55 -0
  472. package/src/widgets-v2/pie/index.ts +10 -0
  473. package/src/widgets-v2/pie/options.test.ts +585 -0
  474. package/src/widgets-v2/pie/options.ts +509 -0
  475. package/src/widgets-v2/pie/skeleton.test.tsx +17 -0
  476. package/src/widgets-v2/pie/skeleton.tsx +32 -0
  477. package/src/widgets-v2/pie/types.ts +55 -0
  478. package/src/widgets-v2/provider/widget-provider.test.tsx +119 -0
  479. package/src/widgets-v2/provider/widget-provider.tsx +111 -0
  480. package/src/widgets-v2/range/index.ts +4 -0
  481. package/src/widgets-v2/range/range-ui.test.tsx +130 -0
  482. package/src/widgets-v2/range/range-ui.tsx +211 -0
  483. package/src/widgets-v2/range/range.test.tsx +68 -0
  484. package/src/widgets-v2/range/range.tsx +46 -0
  485. package/src/widgets-v2/range/skeleton.test.tsx +17 -0
  486. package/src/widgets-v2/range/skeleton.tsx +47 -0
  487. package/src/widgets-v2/range/style.ts +41 -0
  488. package/src/widgets-v2/range/types.ts +37 -0
  489. package/src/widgets-v2/scatterplot/download.test.ts +71 -0
  490. package/src/widgets-v2/scatterplot/download.ts +54 -0
  491. package/src/widgets-v2/scatterplot/index.ts +11 -0
  492. package/src/widgets-v2/scatterplot/options.test.ts +399 -0
  493. package/src/widgets-v2/scatterplot/options.ts +421 -0
  494. package/src/widgets-v2/scatterplot/skeleton.test.tsx +17 -0
  495. package/src/widgets-v2/scatterplot/skeleton.tsx +84 -0
  496. package/src/widgets-v2/scatterplot/transforms.test.ts +97 -0
  497. package/src/widgets-v2/scatterplot/transforms.ts +38 -0
  498. package/src/widgets-v2/scatterplot/types.ts +55 -0
  499. package/src/widgets-v2/selection-summary/labels.ts +11 -0
  500. package/src/widgets-v2/selection-summary/selection-summary.test.tsx +53 -0
  501. package/src/widgets-v2/selection-summary/selection-summary.tsx +62 -0
  502. package/src/widgets-v2/selection-summary/style.ts +23 -0
  503. package/src/widgets-v2/spread/download.test.ts +64 -0
  504. package/src/widgets-v2/spread/download.ts +59 -0
  505. package/src/widgets-v2/spread/index.ts +6 -0
  506. package/src/widgets-v2/spread/separator.tsx +11 -0
  507. package/src/widgets-v2/spread/skeleton.test.tsx +17 -0
  508. package/src/widgets-v2/spread/skeleton.tsx +38 -0
  509. package/src/widgets-v2/spread/spread-ui.test.tsx +108 -0
  510. package/src/widgets-v2/spread/spread-ui.tsx +52 -0
  511. package/src/widgets-v2/spread/spread.test.tsx +50 -0
  512. package/src/widgets-v2/spread/spread.tsx +31 -0
  513. package/src/widgets-v2/spread/types.ts +27 -0
  514. package/src/widgets-v2/state/labels.test.ts +33 -0
  515. package/src/widgets-v2/state/labels.ts +20 -0
  516. package/src/widgets-v2/state/style.ts +25 -0
  517. package/src/widgets-v2/state/widget-state.test.tsx +294 -0
  518. package/src/widgets-v2/state/widget-state.tsx +184 -0
  519. package/src/widgets-v2/stores/index.ts +49 -0
  520. package/src/widgets-v2/stores/pipeline-middleware.test.ts +187 -0
  521. package/src/widgets-v2/stores/pipeline-middleware.ts +91 -0
  522. package/src/widgets-v2/stores/transforms.test.ts +162 -0
  523. package/src/widgets-v2/stores/transforms.ts +70 -0
  524. package/src/widgets-v2/stores/types.ts +64 -0
  525. package/src/widgets-v2/stores/use-echart-instance.test.tsx +91 -0
  526. package/src/widgets-v2/stores/use-echart-instance.ts +29 -0
  527. package/src/widgets-v2/stores/use-transform-enabled.test.tsx +127 -0
  528. package/src/widgets-v2/stores/use-transform-enabled.ts +25 -0
  529. package/src/widgets-v2/stores/use-transform.test.tsx +262 -0
  530. package/src/widgets-v2/stores/use-transform.ts +158 -0
  531. package/src/widgets-v2/stores/widget-context.test.tsx +58 -0
  532. package/src/widgets-v2/stores/widget-context.ts +15 -0
  533. package/src/widgets-v2/stores/widget-store-registry.test.ts +292 -0
  534. package/src/widgets-v2/stores/widget-store-registry.ts +248 -0
  535. package/src/widgets-v2/subheader/style.ts +12 -0
  536. package/src/widgets-v2/subheader/subheader.test.tsx +30 -0
  537. package/src/widgets-v2/subheader/subheader.tsx +16 -0
  538. package/src/widgets-v2/table/download.test.ts +75 -0
  539. package/src/widgets-v2/table/download.ts +47 -0
  540. package/src/widgets-v2/table/helpers.test.ts +214 -0
  541. package/src/widgets-v2/table/helpers.ts +136 -0
  542. package/src/widgets-v2/table/index.ts +23 -0
  543. package/src/widgets-v2/table/labels.tsx +41 -0
  544. package/src/widgets-v2/table/skeleton.test.tsx +26 -0
  545. package/src/widgets-v2/table/skeleton.tsx +65 -0
  546. package/src/widgets-v2/table/style.ts +46 -0
  547. package/src/widgets-v2/table/table-ui.test.tsx +200 -0
  548. package/src/widgets-v2/table/table-ui.tsx +331 -0
  549. package/src/widgets-v2/table/table.test.tsx +119 -0
  550. package/src/widgets-v2/table/table.tsx +174 -0
  551. package/src/widgets-v2/table/types.ts +44 -0
  552. package/src/widgets-v2/test-utils.ts +107 -0
  553. package/src/widgets-v2/timeseries/download.test.ts +95 -0
  554. package/src/widgets-v2/timeseries/download.ts +86 -0
  555. package/src/widgets-v2/timeseries/index.ts +10 -0
  556. package/src/widgets-v2/timeseries/options.test.ts +379 -0
  557. package/src/widgets-v2/timeseries/options.ts +341 -0
  558. package/src/widgets-v2/timeseries/skeleton.test.tsx +13 -0
  559. package/src/widgets-v2/timeseries/skeleton.tsx +76 -0
  560. package/src/widgets-v2/timeseries/types.ts +61 -0
  561. package/src/widgets-v2/toolbox/labels.ts +9 -0
  562. package/src/widgets-v2/toolbox/style.ts +33 -0
  563. package/src/widgets-v2/toolbox/toolbox.test.tsx +200 -0
  564. package/src/widgets-v2/toolbox/toolbox.tsx +309 -0
  565. package/src/widgets-v2/utils/data-zoom-layout.ts +26 -0
  566. package/src/widgets-v2/utils/index.ts +2 -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/wrapper/index.ts +14 -0
  570. package/src/widgets-v2/wrapper/labels.ts +11 -0
  571. package/src/widgets-v2/wrapper/style.ts +134 -0
  572. package/src/widgets-v2/wrapper/widget-actions.test.tsx +52 -0
  573. package/src/widgets-v2/wrapper/widget-actions.tsx +43 -0
  574. package/src/widgets-v2/wrapper/widget-content.test.tsx +27 -0
  575. package/src/widgets-v2/wrapper/widget-content.tsx +29 -0
  576. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +159 -0
  577. package/src/widgets-v2/wrapper/widget-wrapper.tsx +178 -0
  578. package/dist/styles-BYTyKQFP.js.map +0 -1
@@ -0,0 +1,150 @@
1
+ import { useEffect, useRef } from 'react'
2
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest'
3
+ import { fireEvent, render, screen } from '@testing-library/react'
4
+ import { Provider } from '../../provider/widget-provider'
5
+ import { clearAllWidgetStores, getWidgetStore } from '../../stores'
6
+ import { FullScreen } from './fullscreen'
7
+ import type { FullScreenWidgetState } from './types'
8
+
9
+ beforeEach(() => clearAllWidgetStores())
10
+ afterEach(() => clearAllWidgetStores())
11
+
12
+ describe('<FullScreen.Trigger> — store toggle', () => {
13
+ it('does not surface isFullScreen on the base WidgetState until the trigger fires', () => {
14
+ render(
15
+ <Provider id='fs1' data={[]}>
16
+ <FullScreen.Trigger />
17
+ </Provider>,
18
+ )
19
+ const state = getWidgetStore('fs1').getState()
20
+ expect((state as FullScreenWidgetState).isFullScreen).toBeUndefined()
21
+ })
22
+
23
+ it('toggles state on click and swaps the trigger label', () => {
24
+ render(
25
+ <Provider id='fs2' data={[]}>
26
+ <FullScreen.Trigger labels={{ open: 'Expand', close: 'Shrink' }} />
27
+ </Provider>,
28
+ )
29
+ fireEvent.click(screen.getByLabelText('Expand'))
30
+ expect(screen.getByLabelText('Shrink')).toBeTruthy()
31
+ expect(
32
+ (getWidgetStore('fs2').getState() as FullScreenWidgetState).isFullScreen,
33
+ ).toBe(true)
34
+ fireEvent.click(screen.getByLabelText('Shrink'))
35
+ expect(screen.getByLabelText('Expand')).toBeTruthy()
36
+ expect(
37
+ (getWidgetStore('fs2').getState() as FullScreenWidgetState).isFullScreen,
38
+ ).toBe(false)
39
+ })
40
+
41
+ it('keepAlive remount restores isFullScreen', () => {
42
+ const { unmount } = render(
43
+ <Provider id='fs3' data={[]} keepAlive>
44
+ <FullScreen.Trigger labels={{ open: 'Maximise' }} />
45
+ </Provider>,
46
+ )
47
+ fireEvent.click(screen.getByLabelText('Maximise'))
48
+ expect(
49
+ (getWidgetStore('fs3').getState() as FullScreenWidgetState).isFullScreen,
50
+ ).toBe(true)
51
+ unmount()
52
+ render(
53
+ <Provider id='fs3' data={[]} keepAlive>
54
+ <FullScreen.Trigger labels={{ open: 'Maximise' }} />
55
+ </Provider>,
56
+ )
57
+ expect(
58
+ (getWidgetStore('fs3').getState() as FullScreenWidgetState).isFullScreen,
59
+ ).toBe(true)
60
+ })
61
+ })
62
+
63
+ describe('<FullScreen.Slot> — render-prop body + portal', () => {
64
+ it('passes the live isFullScreen flag to the render prop', () => {
65
+ let received: boolean | undefined
66
+ render(
67
+ <Provider id='fs-rp' data={[]}>
68
+ <FullScreen.Trigger />
69
+ <FullScreen.Slot>
70
+ {(isFullScreen) => {
71
+ received = isFullScreen
72
+ return <span data-testid='body'>body</span>
73
+ }}
74
+ </FullScreen.Slot>
75
+ </Provider>,
76
+ )
77
+ expect(received).toBe(false)
78
+ fireEvent.click(screen.getByLabelText('Open in full screen'))
79
+ expect(received).toBe(true)
80
+ })
81
+
82
+ it('renders the title above the body when open', async () => {
83
+ render(
84
+ <Provider id='fs-title' data={[]}>
85
+ <FullScreen.Trigger />
86
+ <FullScreen.Slot title='Sales by region'>
87
+ {() => <div>body</div>}
88
+ </FullScreen.Slot>
89
+ </Provider>,
90
+ )
91
+ fireEvent.click(screen.getByLabelText('Open in full screen'))
92
+ expect(await screen.findByText('Sales by region')).toBeTruthy()
93
+ })
94
+
95
+ it('still renders the close button when no title is given', async () => {
96
+ render(
97
+ <Provider id='fs-no-title' data={[]}>
98
+ <FullScreen.Trigger />
99
+ <FullScreen.Slot>{() => <div>body</div>}</FullScreen.Slot>
100
+ </Provider>,
101
+ )
102
+ fireEvent.click(screen.getByLabelText('Open in full screen'))
103
+ const closes = await screen.findAllByLabelText('Exit full screen')
104
+ expect(closes.length).toBeGreaterThan(0)
105
+ })
106
+
107
+ it('keeps the same DOM node across the fullscreen toggle (portal reparent)', () => {
108
+ render(
109
+ <Provider id='fs-reparent' data={[]}>
110
+ <FullScreen.Trigger />
111
+ <FullScreen.Slot title='X'>
112
+ {() => <span data-testid='inner'>inner</span>}
113
+ </FullScreen.Slot>
114
+ </Provider>,
115
+ )
116
+ const before = screen.getByTestId('inner')
117
+ fireEvent.click(screen.getByLabelText('Open in full screen'))
118
+ const after = screen.getByTestId('inner')
119
+ expect(after).toBe(before)
120
+ })
121
+
122
+ it('mounts the body exactly once across multiple fullscreen toggles', () => {
123
+ let mountCount = 0
124
+ function CountingChild() {
125
+ const counted = useRef(false)
126
+ useEffect(() => {
127
+ if (counted.current) return
128
+ counted.current = true
129
+ mountCount += 1
130
+ }, [])
131
+ return <div data-testid='counter'>x</div>
132
+ }
133
+ // Distinct labels for the trigger so its "close" aria-label can't collide
134
+ // with the modal's own close button (also "Exit full screen" by default
135
+ // when keepMounted=true keeps the modal in DOM).
136
+ render(
137
+ <Provider id='fs-mount-once' data={[]}>
138
+ <FullScreen.Trigger labels={{ open: 'OpenT', close: 'CloseT' }} />
139
+ <FullScreen.Slot title='Z'>{() => <CountingChild />}</FullScreen.Slot>
140
+ </Provider>,
141
+ )
142
+ expect(mountCount).toBe(1)
143
+ fireEvent.click(screen.getByLabelText('OpenT'))
144
+ expect(mountCount).toBe(1)
145
+ fireEvent.click(screen.getByLabelText('CloseT'))
146
+ expect(mountCount).toBe(1)
147
+ fireEvent.click(screen.getByLabelText('OpenT'))
148
+ expect(mountCount).toBe(1)
149
+ })
150
+ })
@@ -0,0 +1,230 @@
1
+ import {
2
+ useCallback,
3
+ useLayoutEffect,
4
+ useState,
5
+ type ComponentType,
6
+ type ReactNode,
7
+ } from 'react'
8
+ import { createPortal } from 'react-dom'
9
+ import {
10
+ Box,
11
+ Dialog,
12
+ DialogContent,
13
+ DialogTitle,
14
+ IconButton,
15
+ Typography,
16
+ type SvgIconProps,
17
+ } from '@mui/material'
18
+ import FullscreenIcon from '@mui/icons-material/Fullscreen'
19
+ import FullscreenExitIcon from '@mui/icons-material/FullscreenExit'
20
+ import CloseIcon from '@mui/icons-material/Close'
21
+ import { Tooltip } from '../../../components'
22
+ import { getWidgetStore, useWidget, useWidgetId } from '../../stores'
23
+ import { DEFAULT_FULLSCREEN_LABELS, type FullScreenLabels } from './labels'
24
+ import type { FullScreenWidgetState } from './types'
25
+ import { styles } from './style'
26
+
27
+ export interface FullScreenTriggerProps {
28
+ labels?: Partial<FullScreenLabels>
29
+ enterIcon?: ComponentType<SvgIconProps>
30
+ exitIcon?: ComponentType<SvgIconProps>
31
+ iconProps?: SvgIconProps
32
+ }
33
+
34
+ export interface FullScreenSlotProps {
35
+ /**
36
+ * Render-prop body. Receives the live `isFullScreen` flag so the consumer
37
+ * can branch per-mode props (e.g., `Widget.Toolbox visibleCount`) without
38
+ * duplicating the JSX.
39
+ */
40
+ children: (isFullScreen: boolean) => ReactNode
41
+ /** Header text rendered above the body when the modal is open. */
42
+ title?: ReactNode
43
+ labels?: Partial<FullScreenLabels>
44
+ closeIcon?: ComponentType<SvgIconProps>
45
+ iconProps?: SvgIconProps
46
+ }
47
+
48
+ /**
49
+ * Toggle button placed inside `<Widget.Actions>`. Reads / writes
50
+ * {@link FullScreenWidgetState.isFullScreen} on the per-widget store. The
51
+ * matching modal is rendered by {@link FullScreenSlot} (typically inside
52
+ * `<Widget.Content>`).
53
+ */
54
+ function FullScreenTrigger({
55
+ labels,
56
+ enterIcon: EnterIcon = FullscreenIcon,
57
+ exitIcon: ExitIcon = FullscreenExitIcon,
58
+ iconProps,
59
+ }: FullScreenTriggerProps) {
60
+ const id = useWidgetId()
61
+ const _labels = { ...DEFAULT_FULLSCREEN_LABELS, ...labels }
62
+ const open = useWidget<boolean, FullScreenWidgetState>(
63
+ id,
64
+ (s) => s.isFullScreen ?? false,
65
+ )
66
+
67
+ const handleToggle = useCallback(() => {
68
+ getWidgetStore(id).setState({
69
+ isFullScreen: !open,
70
+ } as Partial<FullScreenWidgetState>)
71
+ }, [id, open])
72
+
73
+ const triggerLabel = open ? _labels.close : _labels.open
74
+ const TriggerIcon = open ? ExitIcon : EnterIcon
75
+
76
+ return (
77
+ <Tooltip title={triggerLabel}>
78
+ <IconButton
79
+ size='small'
80
+ aria-label={triggerLabel}
81
+ aria-pressed={open}
82
+ onClick={handleToggle}
83
+ className={open ? 'active' : undefined}
84
+ sx={{ ...styles.trigger, ...(open && styles.triggerActive) }}
85
+ >
86
+ <TriggerIcon fontSize='small' {...iconProps} />
87
+ </IconButton>
88
+ </Tooltip>
89
+ )
90
+ }
91
+
92
+ /**
93
+ * Body wrapper. Renders its render-prop children once, via a single
94
+ * `createPortal` call whose container is a stable `<div>` we hold as a ref.
95
+ * That div is moved imperatively between an inline placeholder and the
96
+ * `<DialogContent>` of an MUI `<Dialog keepMounted>`. Because both the
97
+ * React parent (the portal call site) AND the portal container are
98
+ * identical across the toggle, the subtree keeps its fiber identity and
99
+ * ECharts (or any other heavy child) stays mounted while only its DOM
100
+ * parent changes.
101
+ */
102
+ function FullScreenSlot({
103
+ children,
104
+ title,
105
+ labels,
106
+ closeIcon: CloseSvg = CloseIcon,
107
+ iconProps,
108
+ }: FullScreenSlotProps) {
109
+ const id = useWidgetId()
110
+ const _labels = { ...DEFAULT_FULLSCREEN_LABELS, ...labels }
111
+ const open = useWidget<boolean, FullScreenWidgetState>(
112
+ id,
113
+ (s) => s.isFullScreen ?? false,
114
+ )
115
+ const [inlineEl, setInlineEl] = useState<HTMLElement | null>(null)
116
+ const [dialogEl, setDialogEl] = useState<HTMLElement | null>(null)
117
+ // Stable, never-changing portal container created once per slot. Held in
118
+ // state (not a ref) so the React Compiler is happy reading it during
119
+ // render — it's immutable from React's perspective, only its DOM parent
120
+ // changes via `appendChild`. Switching `createPortal`'s `container`
121
+ // argument makes React unmount and remount the children, defeating the
122
+ // single-mount goal; keeping the container identical and moving the div
123
+ // imperatively avoids that.
124
+ const [portalDiv] = useState<HTMLDivElement | null>(() => {
125
+ if (typeof document === 'undefined') return null
126
+ const div = document.createElement('div')
127
+ // `display: contents` keeps the wrapper transparent in flow so it
128
+ // doesn't introduce a stray block when nested inside the inline slot.
129
+ div.style.display = 'contents'
130
+ return div
131
+ })
132
+
133
+ const handleClose = useCallback(() => {
134
+ getWidgetStore(id).setState({
135
+ isFullScreen: false,
136
+ } as Partial<FullScreenWidgetState>)
137
+ }, [id])
138
+
139
+ // Reparent the portal div into the active host whenever `open` (or either
140
+ // host) changes. `useLayoutEffect` runs synchronously after commit (after
141
+ // refs have been written), so the dialog ref is already live when we read
142
+ // it.
143
+ //
144
+ // Anti-blink: pin a `min-height` on the inline shell that's always live —
145
+ // not just while fullscreen is open. We re-measure whenever the body is
146
+ // inline (open=false) so the lock tracks data-driven height changes
147
+ // (Formula adding rows, Table growing, ECharts re-init…) and survives
148
+ // every fullscreen toggle. Briefly clearing minHeight before the measure
149
+ // lets the lock shrink as well as grow; both operations are synchronous
150
+ // within useLayoutEffect, so the browser never paints the intermediate
151
+ // "no lock" frame.
152
+ useLayoutEffect(() => {
153
+ if (!portalDiv || !inlineEl) return
154
+ const host = open ? dialogEl : inlineEl
155
+ if (host && portalDiv.parentNode !== host) {
156
+ host.appendChild(portalDiv)
157
+ }
158
+ if (!open) refreshInlineHeightLock(inlineEl)
159
+ }, [open, inlineEl, dialogEl, portalDiv])
160
+
161
+ const titleId = `widget-fullscreen-title-${id}`
162
+ const rendered = children(open)
163
+
164
+ return (
165
+ <>
166
+ <Box ref={setInlineEl} sx={styles.inlineSlot} />
167
+ {portalDiv ? createPortal(rendered, portalDiv) : null}
168
+ <Dialog
169
+ open={open}
170
+ onClose={handleClose}
171
+ PaperProps={{ sx: styles.dialogPaper }}
172
+ aria-labelledby={titleId}
173
+ // Sits above the Toolbox overflow Paper (zIndex.tooltip = 1500),
174
+ // so opening fullscreen never leaves a stray popover floating on top.
175
+ sx={{ zIndex: (theme) => theme.zIndex.tooltip + 1 }}
176
+ >
177
+ <DialogTitle id={titleId} component='div' sx={styles.dialogTitle}>
178
+ <Typography
179
+ variant='subtitle1'
180
+ component='span'
181
+ sx={styles.titleText}
182
+ >
183
+ {title}
184
+ </Typography>
185
+ <Tooltip title={_labels.close}>
186
+ <IconButton
187
+ size='medium'
188
+ aria-label={_labels.close}
189
+ onClick={handleClose}
190
+ >
191
+ <CloseSvg fontSize='small' {...iconProps} />
192
+ </IconButton>
193
+ </Tooltip>
194
+ </DialogTitle>
195
+ <DialogContent ref={setDialogEl} sx={styles.dialogContent} />
196
+ </Dialog>
197
+ </>
198
+ )
199
+ }
200
+
201
+ /**
202
+ * Briefly clear the inline shell's `min-height`, measure its natural
203
+ * height, then re-pin. Lives outside the component so the React Compiler
204
+ * doesn't see the DOM mutation as an attempt to modify a `useState` value
205
+ * — `el` here is just a parameter, not a tracked store value.
206
+ */
207
+ function refreshInlineHeightLock(el: HTMLElement): void {
208
+ el.style.minHeight = ''
209
+ const h = el.getBoundingClientRect().height
210
+ if (h > 0) el.style.minHeight = `${h}px`
211
+ }
212
+
213
+ /**
214
+ * Namespace export. Consumers compose with:
215
+ *
216
+ * ```tsx
217
+ * <Widget.Actions>
218
+ * <Widget.FullScreen.Trigger />
219
+ * </Widget.Actions>
220
+ * <Widget.Content>
221
+ * <Widget.FullScreen.Slot title={title}>
222
+ * {(isFullScreen) => <Body visibleCount={isFullScreen ? undefined : 2} />}
223
+ * </Widget.FullScreen.Slot>
224
+ * </Widget.Content>
225
+ * ```
226
+ */
227
+ export const FullScreen = {
228
+ Trigger: FullScreenTrigger,
229
+ Slot: FullScreenSlot,
230
+ }
@@ -0,0 +1,7 @@
1
+ export {
2
+ FullScreen,
3
+ type FullScreenTriggerProps,
4
+ type FullScreenSlotProps,
5
+ } from './fullscreen'
6
+ export { DEFAULT_FULLSCREEN_LABELS, type FullScreenLabels } from './labels'
7
+ export type { FullScreenWidgetState } from './types'
@@ -0,0 +1,9 @@
1
+ export interface FullScreenLabels {
2
+ open: string
3
+ close: string
4
+ }
5
+
6
+ export const DEFAULT_FULLSCREEN_LABELS: FullScreenLabels = {
7
+ open: 'Open in full screen',
8
+ close: 'Exit full screen',
9
+ }
@@ -0,0 +1,59 @@
1
+ import type { SxProps, Theme } from '@mui/material'
2
+
3
+ export const styles = {
4
+ // Inline shell where the portaled body lives when fullscreen is closed.
5
+ // Real flex-column box (not `display: contents`) so that:
6
+ // 1. when the body is moved into the modal, we can pin a `min-height`
7
+ // to keep the widget card from collapsing — the inline shell is
8
+ // empty for that interval, and a layout-less wrapper would make
9
+ // the card squish a frame before the modal covers it (visible
10
+ // blink).
11
+ // 2. nested `flex: 1` (e.g. Widget.State's CaptureBox) still grows —
12
+ // this shell preserves the column-flex inheritance it would have
13
+ // had directly under `Widget.Content`.
14
+ // `gap: 1` mirrors `Widget.Content`'s gap so the body's siblings
15
+ // (Subheader / capture box / note) keep their spacing.
16
+ inlineSlot: {
17
+ display: 'flex',
18
+ flexDirection: 'column',
19
+ flex: 1,
20
+ minHeight: 0,
21
+ gap: 1,
22
+ },
23
+ trigger: {
24
+ p: 0.5,
25
+ '& .MuiSvgIcon-root': { fontSize: 20 },
26
+ },
27
+ triggerActive: {
28
+ background: (theme: Theme) => theme.palette.primary.relatedLight,
29
+ },
30
+ dialogPaper: {
31
+ width: '90vw',
32
+ height: '90vh',
33
+ maxWidth: 'none',
34
+ maxHeight: 'none',
35
+ },
36
+ dialogTitle: {
37
+ display: 'flex',
38
+ alignItems: 'center',
39
+ justifyContent: 'space-between',
40
+ gap: 1,
41
+ py: 3,
42
+ pr: 3,
43
+ pb: 2,
44
+ },
45
+ titleText: {
46
+ minWidth: 0,
47
+ overflow: 'hidden',
48
+ textOverflow: 'ellipsis',
49
+ whiteSpace: 'nowrap',
50
+ },
51
+ dialogContent: {
52
+ display: 'flex',
53
+ flexDirection: 'column',
54
+ gap: 1,
55
+ py: 3,
56
+ px: 2.5,
57
+ overflow: 'auto',
58
+ },
59
+ } satisfies Record<string, SxProps<Theme>>
@@ -0,0 +1,15 @@
1
+ import type { WidgetState } from '../../stores'
2
+
3
+ /**
4
+ * State extension owned by FullScreen. The base `WidgetState` deliberately
5
+ * stays free of widget-specific UI flags (R12 from the round-5 amendment);
6
+ * actions that need persistent UI state declare it here and read it via the
7
+ * generic `useWidget<T, S>(id, sel)` form.
8
+ *
9
+ * `isFullScreen` survives `keepAlive` remounts because it lives on the same
10
+ * store the rest of `WidgetState` does — a kept-alive widget that was
11
+ * fullscreen reopens fullscreen automatically.
12
+ */
13
+ export interface FullScreenWidgetState extends WidgetState {
14
+ isFullScreen: boolean
15
+ }
@@ -0,0 +1,82 @@
1
+ export {
2
+ Searcher,
3
+ SearcherToggle,
4
+ setSearcherText,
5
+ filterBySearchText,
6
+ DEFAULT_SEARCHER_LABELS,
7
+ type SearcherProps,
8
+ type SearcherToggleProps,
9
+ type SearcherLabels,
10
+ } from './searcher'
11
+ export {
12
+ StackToggle,
13
+ addStack,
14
+ DEFAULT_STACK_TOGGLE_LABELS,
15
+ type StackToggleProps,
16
+ type StackToggleLabels,
17
+ } from './stack-toggle'
18
+ export {
19
+ ZoomToggle,
20
+ addZoom,
21
+ createAddZoom,
22
+ ZOOM_LAYOUT,
23
+ DEFAULT_ZOOM_TOGGLE_LABELS,
24
+ type ZoomToggleProps,
25
+ type ZoomToggleLabels,
26
+ } from './zoom-toggle'
27
+ export {
28
+ BrushToggle,
29
+ addBrush,
30
+ DEFAULT_BRUSH_TOGGLE_LABELS,
31
+ type BrushToggleProps,
32
+ type BrushToggleLabels,
33
+ } from './brush-toggle'
34
+ export {
35
+ RelativeData,
36
+ toRelativeData,
37
+ createPercentFormatter,
38
+ DEFAULT_RELATIVE_DATA_LABELS,
39
+ type RelativeDataProps,
40
+ type RelativeDataLabels,
41
+ } from './relative-data'
42
+ export {
43
+ Download,
44
+ downloadToCSV,
45
+ downloadDOMToPNG,
46
+ toCsvString,
47
+ triggerLinkDownload,
48
+ buildPngDownloadItem,
49
+ CSVIcon,
50
+ PNGIcon,
51
+ DEFAULT_DOWNLOAD_LABELS,
52
+ type DownloadProps,
53
+ type DownloadItem,
54
+ type DownloadHandle,
55
+ type DownloadDOMToPNGOptions,
56
+ type BuildPngDownloadItemArgs,
57
+ type DownloadLabels,
58
+ } from './download'
59
+ export {
60
+ FullScreen,
61
+ DEFAULT_FULLSCREEN_LABELS,
62
+ type FullScreenTriggerProps,
63
+ type FullScreenSlotProps,
64
+ type FullScreenLabels,
65
+ type FullScreenWidgetState,
66
+ } from './fullscreen'
67
+ export {
68
+ LockSelection,
69
+ filterByLockedItems,
70
+ DEFAULT_LOCK_SELECTION_LABELS,
71
+ type LockSelectionProps,
72
+ type LockSelectionKey,
73
+ type LockSelectionLabels,
74
+ } from './lock-selection'
75
+ export {
76
+ ChangeColumn,
77
+ DEFAULT_CHANGE_COLUMN_LABELS,
78
+ type ChangeColumnProps,
79
+ type ChangeColumnItem,
80
+ type ChangeColumnLabels,
81
+ type ChangeColumnWidgetState,
82
+ } from './change-column'
@@ -0,0 +1,10 @@
1
+ export {
2
+ LockSelection,
3
+ type LockSelectionProps,
4
+ type LockSelectionKey,
5
+ } from './lock-selection'
6
+ export { filterByLockedItems } from './transforms'
7
+ export {
8
+ DEFAULT_LOCK_SELECTION_LABELS,
9
+ type LockSelectionLabels,
10
+ } from './labels'
@@ -0,0 +1,11 @@
1
+ export interface LockSelectionLabels {
2
+ lock: string
3
+ unlock: string
4
+ disabled: string
5
+ }
6
+
7
+ export const DEFAULT_LOCK_SELECTION_LABELS: LockSelectionLabels = {
8
+ lock: 'Lock selection',
9
+ unlock: 'Unlock selection',
10
+ disabled: 'Select rows to lock',
11
+ }