@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,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
+ }
@@ -0,0 +1,187 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
2
+ import { fireEvent, render, screen } from '@testing-library/react'
3
+ import { Provider } from '../../provider/widget-provider'
4
+ import { clearAllWidgetStores, getWidgetStore } from '../../stores'
5
+ import { LockSelection } from './lock-selection'
6
+ import { filterByLockedItems } from './transforms'
7
+
8
+ beforeEach(() => clearAllWidgetStores())
9
+ afterEach(() => clearAllWidgetStores())
10
+
11
+ const DATA = [
12
+ [
13
+ { name: 'A', value: 10 },
14
+ { name: 'B', value: 20 },
15
+ { name: 'C', value: 30 },
16
+ ],
17
+ ]
18
+
19
+ describe('<LockSelection>', () => {
20
+ it('disables the trigger when nothing is selected and nothing is locked', () => {
21
+ render(
22
+ <Provider id='ls1' data={DATA}>
23
+ <LockSelection
24
+ selection={[]}
25
+ lockedItems={[]}
26
+ onLockChange={() => undefined}
27
+ labels={{ disabled: 'Pick rows' }}
28
+ />
29
+ </Provider>,
30
+ )
31
+ const btn = screen.getByRole('button', { name: 'Pick rows' })
32
+ expect(btn.getAttribute('disabled')).not.toBeNull()
33
+ })
34
+
35
+ it('shows the lock label when selection is non-empty and not locked', () => {
36
+ render(
37
+ <Provider id='ls2' data={DATA}>
38
+ <LockSelection
39
+ selection={['A']}
40
+ lockedItems={[]}
41
+ onLockChange={() => undefined}
42
+ labels={{ lock: 'Lock these' }}
43
+ />
44
+ </Provider>,
45
+ )
46
+ const btn = screen.getByRole('button', { name: 'Lock these' })
47
+ expect(btn.getAttribute('aria-pressed')).toBe('false')
48
+ expect(btn.getAttribute('disabled')).toBeNull()
49
+ })
50
+
51
+ it('shows the unlock label when locked and aria-pressed=true', () => {
52
+ render(
53
+ <Provider id='ls3' data={DATA}>
54
+ <LockSelection
55
+ selection={['A']}
56
+ lockedItems={['A']}
57
+ onLockChange={() => undefined}
58
+ labels={{ unlock: 'Release' }}
59
+ />
60
+ </Provider>,
61
+ )
62
+ const btn = screen.getByRole('button', { name: 'Release' })
63
+ expect(btn.getAttribute('aria-pressed')).toBe('true')
64
+ })
65
+
66
+ it('snapshots selection on lock — onLockChange called with current selection', () => {
67
+ const onLockChange = vi.fn()
68
+ render(
69
+ <Provider id='ls4' data={DATA}>
70
+ <LockSelection
71
+ selection={['A', 'B']}
72
+ lockedItems={[]}
73
+ onLockChange={onLockChange}
74
+ labels={{ lock: 'Lock' }}
75
+ />
76
+ </Provider>,
77
+ )
78
+ fireEvent.click(screen.getByRole('button', { name: 'Lock' }))
79
+ expect(onLockChange).toHaveBeenCalledTimes(1)
80
+ expect(onLockChange).toHaveBeenCalledWith(['A', 'B'])
81
+ })
82
+
83
+ it('clears the lock — onLockChange called with empty array', () => {
84
+ const onLockChange = vi.fn()
85
+ render(
86
+ <Provider id='ls5' data={DATA}>
87
+ <LockSelection
88
+ selection={['A']}
89
+ lockedItems={['A', 'B']}
90
+ onLockChange={onLockChange}
91
+ labels={{ unlock: 'Unlock' }}
92
+ />
93
+ </Provider>,
94
+ )
95
+ fireEvent.click(screen.getByRole('button', { name: 'Unlock' }))
96
+ expect(onLockChange).toHaveBeenCalledWith([])
97
+ })
98
+
99
+ it('registers a data transform that filters when locked, restores when unlocked', () => {
100
+ const { rerender } = render(
101
+ <Provider id='ls6' data={DATA}>
102
+ <LockSelection
103
+ selection={['A']}
104
+ lockedItems={['A']}
105
+ onLockChange={() => undefined}
106
+ />
107
+ </Provider>,
108
+ )
109
+ const locked = getWidgetStore('ls6').getState().data as unknown[][]
110
+ expect(locked).toEqual([[{ name: 'A', value: 10 }]])
111
+
112
+ rerender(
113
+ <Provider id='ls6' data={DATA}>
114
+ <LockSelection
115
+ selection={['A']}
116
+ lockedItems={[]}
117
+ onLockChange={() => undefined}
118
+ />
119
+ </Provider>,
120
+ )
121
+ const unlocked = getWidgetStore('ls6').getState().data as unknown[][]
122
+ // With no lockedItems and the transform disabled, the pipeline returns
123
+ // raw data. All three rows should be present.
124
+ expect(unlocked.flat().length).toBe(3)
125
+ })
126
+
127
+ it('lets the destination feed a different lockedItems set later', () => {
128
+ const { rerender } = render(
129
+ <Provider id='ls7' data={DATA}>
130
+ <LockSelection
131
+ selection={['A']}
132
+ lockedItems={['A']}
133
+ onLockChange={() => undefined}
134
+ />
135
+ </Provider>,
136
+ )
137
+ expect(
138
+ (getWidgetStore('ls7').getState().data as unknown[][]).flat(),
139
+ ).toEqual([{ name: 'A', value: 10 }])
140
+
141
+ rerender(
142
+ <Provider id='ls7' data={DATA}>
143
+ <LockSelection
144
+ selection={['A', 'B', 'C']}
145
+ lockedItems={['B', 'C']}
146
+ onLockChange={() => undefined}
147
+ />
148
+ </Provider>,
149
+ )
150
+ expect(
151
+ (getWidgetStore('ls7').getState().data as unknown[][]).flat(),
152
+ ).toEqual([
153
+ { name: 'B', value: 20 },
154
+ { name: 'C', value: 30 },
155
+ ])
156
+ })
157
+ })
158
+
159
+ describe('filterByLockedItems', () => {
160
+ it('returns input unchanged when locked set is empty', () => {
161
+ expect(filterByLockedItems(DATA, [])).toBe(DATA)
162
+ })
163
+
164
+ it('keeps only items whose name is in the locked set, preserving series shape', () => {
165
+ const out = filterByLockedItems(DATA, ['A', 'C']) as unknown[][]
166
+ expect(out).toEqual([
167
+ [
168
+ { name: 'A', value: 10 },
169
+ { name: 'C', value: 30 },
170
+ ],
171
+ ])
172
+ })
173
+
174
+ it('handles numeric names', () => {
175
+ const data = [
176
+ [
177
+ { name: 1, value: 10 },
178
+ { name: 2, value: 20 },
179
+ ],
180
+ ]
181
+ expect(filterByLockedItems(data, [2])).toEqual([[{ name: 2, value: 20 }]])
182
+ })
183
+
184
+ it('returns input unchanged when input is not array-shaped', () => {
185
+ expect(filterByLockedItems('nope', ['A'])).toBe('nope')
186
+ })
187
+ })