@carto/ps-react-ui 4.7.1 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (574) hide show
  1. package/dist/category-DwaeYjpX.js +656 -0
  2. package/dist/category-DwaeYjpX.js.map +1 -0
  3. package/dist/change-column-Cidl_M-4.js +1110 -0
  4. package/dist/change-column-Cidl_M-4.js.map +1 -0
  5. package/dist/data-zoom-layout-BH0LPwSy.js +28 -0
  6. package/dist/data-zoom-layout-BH0LPwSy.js.map +1 -0
  7. package/dist/echart-CU0KmClP.js +176 -0
  8. package/dist/echart-CU0KmClP.js.map +1 -0
  9. package/dist/exports-Cx-f6m6U.js +63 -0
  10. package/dist/exports-Cx-f6m6U.js.map +1 -0
  11. package/dist/formula-DuC0NQLH.js +79 -0
  12. package/dist/formula-DuC0NQLH.js.map +1 -0
  13. package/dist/markdown-BD1jcknS.js +8326 -0
  14. package/dist/markdown-BD1jcknS.js.map +1 -0
  15. package/dist/merge-options-DCkkHZIf.js +34 -0
  16. package/dist/merge-options-DCkkHZIf.js.map +1 -0
  17. package/dist/{styles-BYTyKQFP.js → option-builders-F-c9ELi1.js} +25 -45
  18. package/dist/option-builders-F-c9ELi1.js.map +1 -0
  19. package/dist/png-item-CS4z1iSH.js +45 -0
  20. package/dist/png-item-CS4z1iSH.js.map +1 -0
  21. package/dist/range-DsqTjSpg.js +186 -0
  22. package/dist/range-DsqTjSpg.js.map +1 -0
  23. package/dist/spread-CTuIXZSM.js +67 -0
  24. package/dist/spread-CTuIXZSM.js.map +1 -0
  25. package/dist/style-DVnT6HC1.js +131 -0
  26. package/dist/style-DVnT6HC1.js.map +1 -0
  27. package/dist/styles-cohnxh9F.js +23 -0
  28. package/dist/styles-cohnxh9F.js.map +1 -0
  29. package/dist/table-HIpXuq4G.js +390 -0
  30. package/dist/table-HIpXuq4G.js.map +1 -0
  31. package/dist/transforms-Cdx4fkU5.js +106 -0
  32. package/dist/transforms-Cdx4fkU5.js.map +1 -0
  33. package/dist/types/widgets/echart/utils.test.d.ts +1 -0
  34. package/dist/types/widgets/formula/config.test.d.ts +1 -0
  35. package/dist/types/widgets/stores/widget-store-branches.test.d.ts +1 -0
  36. package/dist/types/widgets/table/config.test.d.ts +1 -0
  37. package/dist/types/widgets-v2/actions/brush-toggle/brush-toggle.d.ts +56 -0
  38. package/dist/types/widgets-v2/actions/brush-toggle/index.d.ts +3 -0
  39. package/dist/types/widgets-v2/actions/brush-toggle/labels.d.ts +5 -0
  40. package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +12 -0
  41. package/dist/types/widgets-v2/actions/brush-toggle/transforms.d.ts +11 -0
  42. package/dist/types/widgets-v2/actions/brush-toggle/transforms.test.d.ts +1 -0
  43. package/dist/types/widgets-v2/actions/change-column/change-column-icon.d.ts +2 -0
  44. package/dist/types/widgets-v2/actions/change-column/change-column.d.ts +29 -0
  45. package/dist/types/widgets-v2/actions/change-column/index.d.ts +3 -0
  46. package/dist/types/widgets-v2/actions/change-column/labels.d.ts +5 -0
  47. package/dist/types/widgets-v2/actions/change-column/sortable-column-item.d.ts +14 -0
  48. package/dist/types/widgets-v2/actions/change-column/style.d.ts +33 -0
  49. package/dist/types/widgets-v2/actions/change-column/types.d.ts +10 -0
  50. package/dist/types/widgets-v2/actions/download/download.d.ts +18 -0
  51. package/dist/types/widgets-v2/actions/download/exports.d.ts +37 -0
  52. package/dist/types/widgets-v2/actions/download/icons.d.ts +12 -0
  53. package/dist/types/widgets-v2/actions/download/index.d.ts +6 -0
  54. package/dist/types/widgets-v2/actions/download/labels.d.ts +11 -0
  55. package/dist/types/widgets-v2/actions/download/png-item.d.ts +24 -0
  56. package/dist/types/widgets-v2/actions/download/style.d.ts +1 -0
  57. package/dist/types/widgets-v2/actions/download/types.d.ts +35 -0
  58. package/dist/types/widgets-v2/actions/fullscreen/fullscreen.d.ts +59 -0
  59. package/dist/types/widgets-v2/actions/fullscreen/index.d.ts +3 -0
  60. package/dist/types/widgets-v2/actions/fullscreen/labels.d.ts +5 -0
  61. package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +48 -0
  62. package/dist/types/widgets-v2/actions/fullscreen/types.d.ts +14 -0
  63. package/dist/types/widgets-v2/actions/index.d.ts +9 -0
  64. package/dist/types/widgets-v2/actions/lock-selection/index.d.ts +3 -0
  65. package/dist/types/widgets-v2/actions/lock-selection/labels.d.ts +6 -0
  66. package/dist/types/widgets-v2/actions/lock-selection/lock-selection.d.ts +36 -0
  67. package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +12 -0
  68. package/dist/types/widgets-v2/actions/lock-selection/transforms.d.ts +6 -0
  69. package/dist/types/widgets-v2/actions/relative-data/index.d.ts +3 -0
  70. package/dist/types/widgets-v2/actions/relative-data/labels.d.ts +5 -0
  71. package/dist/types/widgets-v2/actions/relative-data/relative-data.d.ts +39 -0
  72. package/dist/types/widgets-v2/actions/relative-data/style.d.ts +12 -0
  73. package/dist/types/widgets-v2/actions/relative-data/transforms.d.ts +30 -0
  74. package/dist/types/widgets-v2/actions/relative-data/transforms.test.d.ts +1 -0
  75. package/dist/types/widgets-v2/actions/searcher/filter.d.ts +6 -0
  76. package/dist/types/widgets-v2/actions/searcher/index.d.ts +4 -0
  77. package/dist/types/widgets-v2/actions/searcher/labels.d.ts +7 -0
  78. package/dist/types/widgets-v2/actions/searcher/searcher-toggle.d.ts +23 -0
  79. package/dist/types/widgets-v2/actions/searcher/searcher.d.ts +11 -0
  80. package/dist/types/widgets-v2/actions/searcher/style.d.ts +16 -0
  81. package/dist/types/widgets-v2/actions/stack-toggle/index.d.ts +3 -0
  82. package/dist/types/widgets-v2/actions/stack-toggle/labels.d.ts +5 -0
  83. package/dist/types/widgets-v2/actions/stack-toggle/stack-toggle.d.ts +10 -0
  84. package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +12 -0
  85. package/dist/types/widgets-v2/actions/stack-toggle/transforms.d.ts +13 -0
  86. package/dist/types/widgets-v2/actions/stack-toggle/transforms.test.d.ts +1 -0
  87. package/dist/types/widgets-v2/actions/zoom-toggle/index.d.ts +3 -0
  88. package/dist/types/widgets-v2/actions/zoom-toggle/labels.d.ts +5 -0
  89. package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +12 -0
  90. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.d.ts +51 -0
  91. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.test.d.ts +1 -0
  92. package/dist/types/widgets-v2/actions/zoom-toggle/zoom-toggle.d.ts +35 -0
  93. package/dist/types/widgets-v2/bar/download.d.ts +24 -0
  94. package/dist/types/widgets-v2/bar/index.d.ts +4 -0
  95. package/dist/types/widgets-v2/bar/options.d.ts +43 -0
  96. package/dist/types/widgets-v2/bar/options.test.d.ts +1 -0
  97. package/dist/types/widgets-v2/bar/skeleton.d.ts +6 -0
  98. package/dist/types/widgets-v2/bar/types.d.ts +41 -0
  99. package/dist/types/widgets-v2/category/category-ui.d.ts +81 -0
  100. package/dist/types/widgets-v2/category/category.d.ts +48 -0
  101. package/dist/types/widgets-v2/category/components/category-bar-stacked.d.ts +28 -0
  102. package/dist/types/widgets-v2/category/components/category-bar.d.ts +23 -0
  103. package/dist/types/widgets-v2/category/components/category-legend.d.ts +18 -0
  104. package/dist/types/widgets-v2/category/components/category-row-multi.d.ts +31 -0
  105. package/dist/types/widgets-v2/category/components/category-row-other.d.ts +13 -0
  106. package/dist/types/widgets-v2/category/components/category-row-single.d.ts +28 -0
  107. package/dist/types/widgets-v2/category/components/category-row-stacked.d.ts +38 -0
  108. package/dist/types/widgets-v2/category/download.d.ts +16 -0
  109. package/dist/types/widgets-v2/category/download.test.d.ts +1 -0
  110. package/dist/types/widgets-v2/category/index.d.ts +10 -0
  111. package/dist/types/widgets-v2/category/skeleton.d.ts +11 -0
  112. package/dist/types/widgets-v2/category/style.d.ts +166 -0
  113. package/dist/types/widgets-v2/category/types.d.ts +49 -0
  114. package/dist/types/widgets-v2/echart/echart-ui.d.ts +44 -0
  115. package/dist/types/widgets-v2/echart/echart.d.ts +75 -0
  116. package/dist/types/widgets-v2/echart/index.d.ts +4 -0
  117. package/dist/types/widgets-v2/echart/shared-resize-observer.d.ts +5 -0
  118. package/dist/types/widgets-v2/echart/shared-resize-observer.test.d.ts +1 -0
  119. package/dist/types/widgets-v2/echart/style.d.ts +6 -0
  120. package/dist/types/widgets-v2/echart/use-chart-selection.d.ts +51 -0
  121. package/dist/types/widgets-v2/formula/delta.d.ts +22 -0
  122. package/dist/types/widgets-v2/formula/download.d.ts +20 -0
  123. package/dist/types/widgets-v2/formula/formula-ui.d.ts +20 -0
  124. package/dist/types/widgets-v2/formula/formula.d.ts +8 -0
  125. package/dist/types/widgets-v2/formula/index.d.ts +11 -0
  126. package/dist/types/widgets-v2/formula/note.d.ts +11 -0
  127. package/dist/types/widgets-v2/formula/prefix.d.ts +12 -0
  128. package/dist/types/widgets-v2/formula/series.d.ts +16 -0
  129. package/dist/types/widgets-v2/formula/skeleton.d.ts +4 -0
  130. package/dist/types/widgets-v2/formula/style.d.ts +29 -0
  131. package/dist/types/widgets-v2/formula/suffix.d.ts +12 -0
  132. package/dist/types/widgets-v2/formula/types.d.ts +40 -0
  133. package/dist/types/widgets-v2/formula/value.d.ts +14 -0
  134. package/dist/types/widgets-v2/histogram/download.d.ts +17 -0
  135. package/dist/types/widgets-v2/histogram/download.test.d.ts +1 -0
  136. package/dist/types/widgets-v2/histogram/index.d.ts +5 -0
  137. package/dist/types/widgets-v2/histogram/options.d.ts +42 -0
  138. package/dist/types/widgets-v2/histogram/options.test.d.ts +1 -0
  139. package/dist/types/widgets-v2/histogram/skeleton.d.ts +9 -0
  140. package/dist/types/widgets-v2/histogram/transforms.d.ts +17 -0
  141. package/dist/types/widgets-v2/histogram/transforms.test.d.ts +1 -0
  142. package/dist/types/widgets-v2/histogram/types.d.ts +47 -0
  143. package/dist/types/widgets-v2/index.d.ts +107 -0
  144. package/dist/types/widgets-v2/markdown/download.d.ts +16 -0
  145. package/dist/types/widgets-v2/markdown/download.test.d.ts +1 -0
  146. package/dist/types/widgets-v2/markdown/index.d.ts +6 -0
  147. package/dist/types/widgets-v2/markdown/markdown-content.d.ts +34 -0
  148. package/dist/types/widgets-v2/markdown/markdown-ui.d.ts +12 -0
  149. package/dist/types/widgets-v2/markdown/markdown.d.ts +6 -0
  150. package/dist/types/widgets-v2/markdown/skeleton.d.ts +4 -0
  151. package/dist/types/widgets-v2/markdown/style.d.ts +61 -0
  152. package/dist/types/widgets-v2/markdown/types.d.ts +4 -0
  153. package/dist/types/widgets-v2/note/labels.d.ts +5 -0
  154. package/dist/types/widgets-v2/note/style.d.ts +26 -0
  155. package/dist/types/widgets-v2/note/widget-note.d.ts +46 -0
  156. package/dist/types/widgets-v2/pie/download.d.ts +17 -0
  157. package/dist/types/widgets-v2/pie/download.test.d.ts +1 -0
  158. package/dist/types/widgets-v2/pie/index.d.ts +4 -0
  159. package/dist/types/widgets-v2/pie/options.d.ts +35 -0
  160. package/dist/types/widgets-v2/pie/options.test.d.ts +1 -0
  161. package/dist/types/widgets-v2/pie/skeleton.d.ts +4 -0
  162. package/dist/types/widgets-v2/pie/types.d.ts +50 -0
  163. package/dist/types/widgets-v2/provider/widget-provider.d.ts +32 -0
  164. package/dist/types/widgets-v2/range/index.d.ts +4 -0
  165. package/dist/types/widgets-v2/range/range-ui.d.ts +19 -0
  166. package/dist/types/widgets-v2/range/range.d.ts +19 -0
  167. package/dist/types/widgets-v2/range/skeleton.d.ts +9 -0
  168. package/dist/types/widgets-v2/range/style.d.ts +40 -0
  169. package/dist/types/widgets-v2/range/types.d.ts +37 -0
  170. package/dist/types/widgets-v2/scatterplot/download.d.ts +16 -0
  171. package/dist/types/widgets-v2/scatterplot/download.test.d.ts +1 -0
  172. package/dist/types/widgets-v2/scatterplot/index.d.ts +5 -0
  173. package/dist/types/widgets-v2/scatterplot/options.d.ts +42 -0
  174. package/dist/types/widgets-v2/scatterplot/options.test.d.ts +1 -0
  175. package/dist/types/widgets-v2/scatterplot/skeleton.d.ts +12 -0
  176. package/dist/types/widgets-v2/scatterplot/transforms.d.ts +17 -0
  177. package/dist/types/widgets-v2/scatterplot/transforms.test.d.ts +1 -0
  178. package/dist/types/widgets-v2/scatterplot/types.d.ts +50 -0
  179. package/dist/types/widgets-v2/selection-summary/labels.d.ts +6 -0
  180. package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +22 -0
  181. package/dist/types/widgets-v2/selection-summary/style.d.ts +23 -0
  182. package/dist/types/widgets-v2/spread/download.d.ts +15 -0
  183. package/dist/types/widgets-v2/spread/download.test.d.ts +1 -0
  184. package/dist/types/widgets-v2/spread/index.d.ts +6 -0
  185. package/dist/types/widgets-v2/spread/separator.d.ts +7 -0
  186. package/dist/types/widgets-v2/spread/skeleton.d.ts +9 -0
  187. package/dist/types/widgets-v2/spread/spread-ui.d.ts +18 -0
  188. package/dist/types/widgets-v2/spread/spread.d.ts +5 -0
  189. package/dist/types/widgets-v2/spread/types.d.ts +25 -0
  190. package/dist/types/widgets-v2/state/labels.d.ts +7 -0
  191. package/dist/types/widgets-v2/state/labels.test.d.ts +1 -0
  192. package/dist/types/widgets-v2/state/style.d.ts +19 -0
  193. package/dist/types/widgets-v2/state/widget-state.d.ts +19 -0
  194. package/dist/types/widgets-v2/stores/index.d.ts +8 -0
  195. package/dist/types/widgets-v2/stores/pipeline-middleware.d.ts +5 -0
  196. package/dist/types/widgets-v2/stores/pipeline-middleware.test.d.ts +1 -0
  197. package/dist/types/widgets-v2/stores/transforms.d.ts +4 -0
  198. package/dist/types/widgets-v2/stores/transforms.test.d.ts +1 -0
  199. package/dist/types/widgets-v2/stores/types.d.ts +55 -0
  200. package/dist/types/widgets-v2/stores/use-echart-instance.d.ts +15 -0
  201. package/dist/types/widgets-v2/stores/use-transform-enabled.d.ts +17 -0
  202. package/dist/types/widgets-v2/stores/use-transform.d.ts +12 -0
  203. package/dist/types/widgets-v2/stores/widget-context.d.ts +2 -0
  204. package/dist/types/widgets-v2/stores/widget-store-registry.d.ts +74 -0
  205. package/dist/types/widgets-v2/stores/widget-store-registry.test.d.ts +1 -0
  206. package/dist/types/widgets-v2/subheader/style.d.ts +10 -0
  207. package/dist/types/widgets-v2/subheader/subheader.d.ts +11 -0
  208. package/dist/types/widgets-v2/table/download.d.ts +18 -0
  209. package/dist/types/widgets-v2/table/download.test.d.ts +1 -0
  210. package/dist/types/widgets-v2/table/helpers.d.ts +32 -0
  211. package/dist/types/widgets-v2/table/helpers.test.d.ts +1 -0
  212. package/dist/types/widgets-v2/table/index.d.ts +7 -0
  213. package/dist/types/widgets-v2/table/labels.d.ts +22 -0
  214. package/dist/types/widgets-v2/table/skeleton.d.ts +22 -0
  215. package/dist/types/widgets-v2/table/style.d.ts +44 -0
  216. package/dist/types/widgets-v2/table/table-ui.d.ts +38 -0
  217. package/dist/types/widgets-v2/table/table.d.ts +50 -0
  218. package/dist/types/widgets-v2/table/types.d.ts +37 -0
  219. package/dist/types/widgets-v2/test-utils.d.ts +52 -0
  220. package/dist/types/widgets-v2/timeseries/download.d.ts +17 -0
  221. package/dist/types/widgets-v2/timeseries/download.test.d.ts +1 -0
  222. package/dist/types/widgets-v2/timeseries/index.d.ts +4 -0
  223. package/dist/types/widgets-v2/timeseries/options.d.ts +39 -0
  224. package/dist/types/widgets-v2/timeseries/options.test.d.ts +1 -0
  225. package/dist/types/widgets-v2/timeseries/skeleton.d.ts +8 -0
  226. package/dist/types/widgets-v2/timeseries/types.d.ts +56 -0
  227. package/dist/types/widgets-v2/toolbox/labels.d.ts +5 -0
  228. package/dist/types/widgets-v2/toolbox/style.d.ts +30 -0
  229. package/dist/types/widgets-v2/toolbox/toolbox.d.ts +49 -0
  230. package/dist/types/widgets-v2/utils/data-zoom-layout.d.ts +11 -0
  231. package/dist/types/widgets-v2/utils/index.d.ts +2 -0
  232. package/dist/types/widgets-v2/utils/merge-options.d.ts +12 -0
  233. package/dist/types/widgets-v2/utils/merge-options.test.d.ts +1 -0
  234. package/dist/types/widgets-v2/wrapper/index.d.ts +4 -0
  235. package/dist/types/widgets-v2/wrapper/labels.d.ts +6 -0
  236. package/dist/types/widgets-v2/wrapper/style.d.ts +111 -0
  237. package/dist/types/widgets-v2/wrapper/widget-actions.d.ts +22 -0
  238. package/dist/types/widgets-v2/wrapper/widget-content.d.ts +12 -0
  239. package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +51 -0
  240. package/dist/use-transform-DXPN3nY7.js +110 -0
  241. package/dist/use-transform-DXPN3nY7.js.map +1 -0
  242. package/dist/widget-context-DTGO0Yta.js +13 -0
  243. package/dist/widget-context-DTGO0Yta.js.map +1 -0
  244. package/dist/widget-store-registry-_W4Z4xp-.js +178 -0
  245. package/dist/widget-store-registry-_W4Z4xp-.js.map +1 -0
  246. package/dist/widgets/bar.js +14 -13
  247. package/dist/widgets/bar.js.map +1 -1
  248. package/dist/widgets/histogram.js +8 -7
  249. package/dist/widgets/histogram.js.map +1 -1
  250. package/dist/widgets/pie.js +19 -18
  251. package/dist/widgets/pie.js.map +1 -1
  252. package/dist/widgets/scatterplot.js +8 -7
  253. package/dist/widgets/scatterplot.js.map +1 -1
  254. package/dist/widgets/timeseries.js +11 -10
  255. package/dist/widgets/timeseries.js.map +1 -1
  256. package/dist/widgets/utils.js +8 -7
  257. package/dist/widgets/utils.js.map +1 -1
  258. package/dist/widgets-v2/actions.js +43 -0
  259. package/dist/widgets-v2/actions.js.map +1 -0
  260. package/dist/widgets-v2/bar.js +327 -0
  261. package/dist/widgets-v2/bar.js.map +1 -0
  262. package/dist/widgets-v2/category.js +104 -0
  263. package/dist/widgets-v2/category.js.map +1 -0
  264. package/dist/widgets-v2/echart.js +57 -0
  265. package/dist/widgets-v2/echart.js.map +1 -0
  266. package/dist/widgets-v2/formula.js +74 -0
  267. package/dist/widgets-v2/formula.js.map +1 -0
  268. package/dist/widgets-v2/histogram.js +350 -0
  269. package/dist/widgets-v2/histogram.js.map +1 -0
  270. package/dist/widgets-v2/markdown.js +68 -0
  271. package/dist/widgets-v2/markdown.js.map +1 -0
  272. package/dist/widgets-v2/pie.js +381 -0
  273. package/dist/widgets-v2/pie.js.map +1 -0
  274. package/dist/widgets-v2/range.js +52 -0
  275. package/dist/widgets-v2/range.js.map +1 -0
  276. package/dist/widgets-v2/scatterplot.js +405 -0
  277. package/dist/widgets-v2/scatterplot.js.map +1 -0
  278. package/dist/widgets-v2/spread.js +72 -0
  279. package/dist/widgets-v2/spread.js.map +1 -0
  280. package/dist/widgets-v2/stores.js +42 -0
  281. package/dist/widgets-v2/stores.js.map +1 -0
  282. package/dist/widgets-v2/table.js +78 -0
  283. package/dist/widgets-v2/table.js.map +1 -0
  284. package/dist/widgets-v2/timeseries.js +352 -0
  285. package/dist/widgets-v2/timeseries.js.map +1 -0
  286. package/dist/widgets-v2/utils.js +7 -0
  287. package/dist/widgets-v2/utils.js.map +1 -0
  288. package/dist/widgets-v2.js +953 -0
  289. package/dist/widgets-v2.js.map +1 -0
  290. package/package.json +73 -5
  291. package/src/components/lasso-tool/chip.test.tsx +176 -0
  292. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +171 -0
  293. package/src/components/lasso-tool/lasso-tool.test.tsx +198 -0
  294. package/src/components/list-data/list-data.test.tsx +73 -0
  295. package/src/components/no-data-alert/no-data-alert.test.tsx +38 -0
  296. package/src/components/responsive-drawer/responsive-drawer.test.tsx +68 -0
  297. package/src/widgets/actions/brush-toggle/brush-overlay.test.tsx +465 -0
  298. package/src/widgets/actions/brush-toggle/brush-toggle.test.tsx +208 -0
  299. package/src/widgets/actions/change-column/change-column-dnd.test.tsx +193 -0
  300. package/src/widgets/actions/change-column/sortable-column-item.test.tsx +124 -0
  301. package/src/widgets/actions/zoom-toggle/zoom-toggle.test.tsx +322 -0
  302. package/src/widgets/category/components/category-rows.test.tsx +213 -0
  303. package/src/widgets/echart/utils.test.ts +277 -0
  304. package/src/widgets/formula/config.test.ts +37 -0
  305. package/src/widgets/range/components/range-item.test.tsx +243 -0
  306. package/src/widgets/stores/widget-store-branches.test.ts +275 -0
  307. package/src/widgets/table/config.test.ts +65 -0
  308. package/src/widgets/utils/chart-config/option-builders.test.ts +188 -0
  309. package/src/widgets-v2/PERFORMANCE.md +189 -0
  310. package/src/widgets-v2/actions/brush-toggle/brush-toggle.test.tsx +180 -0
  311. package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +154 -0
  312. package/src/widgets-v2/actions/brush-toggle/index.ts +3 -0
  313. package/src/widgets-v2/actions/brush-toggle/labels.ts +9 -0
  314. package/src/widgets-v2/actions/brush-toggle/style.ts +11 -0
  315. package/src/widgets-v2/actions/brush-toggle/transforms.test.ts +47 -0
  316. package/src/widgets-v2/actions/brush-toggle/transforms.ts +31 -0
  317. package/src/widgets-v2/actions/change-column/change-column-icon.tsx +14 -0
  318. package/src/widgets-v2/actions/change-column/change-column.test.tsx +59 -0
  319. package/src/widgets-v2/actions/change-column/change-column.tsx +180 -0
  320. package/src/widgets-v2/actions/change-column/index.ts +7 -0
  321. package/src/widgets-v2/actions/change-column/labels.ts +9 -0
  322. package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +56 -0
  323. package/src/widgets-v2/actions/change-column/style.ts +32 -0
  324. package/src/widgets-v2/actions/change-column/types.ts +11 -0
  325. package/src/widgets-v2/actions/download/download.test.tsx +327 -0
  326. package/src/widgets-v2/actions/download/download.tsx +144 -0
  327. package/src/widgets-v2/actions/download/exports.test.tsx +198 -0
  328. package/src/widgets-v2/actions/download/exports.ts +115 -0
  329. package/src/widgets-v2/actions/download/icons.tsx +26 -0
  330. package/src/widgets-v2/actions/download/index.ts +13 -0
  331. package/src/widgets-v2/actions/download/labels.ts +16 -0
  332. package/src/widgets-v2/actions/download/png-item.test.tsx +72 -0
  333. package/src/widgets-v2/actions/download/png-item.tsx +52 -0
  334. package/src/widgets-v2/actions/download/style.ts +3 -0
  335. package/src/widgets-v2/actions/download/types.ts +32 -0
  336. package/src/widgets-v2/actions/fullscreen/fullscreen.test.tsx +150 -0
  337. package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +230 -0
  338. package/src/widgets-v2/actions/fullscreen/index.ts +7 -0
  339. package/src/widgets-v2/actions/fullscreen/labels.ts +9 -0
  340. package/src/widgets-v2/actions/fullscreen/style.ts +59 -0
  341. package/src/widgets-v2/actions/fullscreen/types.ts +15 -0
  342. package/src/widgets-v2/actions/index.ts +82 -0
  343. package/src/widgets-v2/actions/lock-selection/index.ts +10 -0
  344. package/src/widgets-v2/actions/lock-selection/labels.ts +11 -0
  345. package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +187 -0
  346. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +130 -0
  347. package/src/widgets-v2/actions/lock-selection/style.ts +11 -0
  348. package/src/widgets-v2/actions/lock-selection/transforms.ts +27 -0
  349. package/src/widgets-v2/actions/relative-data/index.ts +3 -0
  350. package/src/widgets-v2/actions/relative-data/labels.ts +9 -0
  351. package/src/widgets-v2/actions/relative-data/relative-data.test.tsx +71 -0
  352. package/src/widgets-v2/actions/relative-data/relative-data.tsx +107 -0
  353. package/src/widgets-v2/actions/relative-data/style.ts +11 -0
  354. package/src/widgets-v2/actions/relative-data/transforms.test.ts +151 -0
  355. package/src/widgets-v2/actions/relative-data/transforms.ts +70 -0
  356. package/src/widgets-v2/actions/searcher/filter.ts +28 -0
  357. package/src/widgets-v2/actions/searcher/index.ts +8 -0
  358. package/src/widgets-v2/actions/searcher/labels.ts +13 -0
  359. package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +91 -0
  360. package/src/widgets-v2/actions/searcher/searcher.test.tsx +92 -0
  361. package/src/widgets-v2/actions/searcher/searcher.tsx +112 -0
  362. package/src/widgets-v2/actions/searcher/style.ts +15 -0
  363. package/src/widgets-v2/actions/stack-toggle/index.ts +3 -0
  364. package/src/widgets-v2/actions/stack-toggle/labels.ts +9 -0
  365. package/src/widgets-v2/actions/stack-toggle/stack-toggle.test.tsx +61 -0
  366. package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +54 -0
  367. package/src/widgets-v2/actions/stack-toggle/style.ts +11 -0
  368. package/src/widgets-v2/actions/stack-toggle/transforms.test.ts +43 -0
  369. package/src/widgets-v2/actions/stack-toggle/transforms.ts +25 -0
  370. package/src/widgets-v2/actions/zoom-toggle/index.ts +9 -0
  371. package/src/widgets-v2/actions/zoom-toggle/labels.ts +9 -0
  372. package/src/widgets-v2/actions/zoom-toggle/style.ts +11 -0
  373. package/src/widgets-v2/actions/zoom-toggle/transforms.test.ts +148 -0
  374. package/src/widgets-v2/actions/zoom-toggle/transforms.ts +171 -0
  375. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.test.tsx +107 -0
  376. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +106 -0
  377. package/src/widgets-v2/bar/download.test.tsx +91 -0
  378. package/src/widgets-v2/bar/download.tsx +66 -0
  379. package/src/widgets-v2/bar/index.ts +10 -0
  380. package/src/widgets-v2/bar/options.test.ts +317 -0
  381. package/src/widgets-v2/bar/options.ts +326 -0
  382. package/src/widgets-v2/bar/skeleton.test.tsx +19 -0
  383. package/src/widgets-v2/bar/skeleton.tsx +69 -0
  384. package/src/widgets-v2/bar/types.ts +46 -0
  385. package/src/widgets-v2/category/category-ui.test.tsx +746 -0
  386. package/src/widgets-v2/category/category-ui.tsx +389 -0
  387. package/src/widgets-v2/category/category.relative-data.test.tsx +107 -0
  388. package/src/widgets-v2/category/category.stack-toggle.test.tsx +85 -0
  389. package/src/widgets-v2/category/category.test.tsx +305 -0
  390. package/src/widgets-v2/category/category.tsx +121 -0
  391. package/src/widgets-v2/category/components/category-bar-stacked.test.tsx +121 -0
  392. package/src/widgets-v2/category/components/category-bar-stacked.tsx +73 -0
  393. package/src/widgets-v2/category/components/category-bar.test.tsx +64 -0
  394. package/src/widgets-v2/category/components/category-bar.tsx +49 -0
  395. package/src/widgets-v2/category/components/category-legend.test.tsx +51 -0
  396. package/src/widgets-v2/category/components/category-legend.tsx +39 -0
  397. package/src/widgets-v2/category/components/category-row-multi.tsx +86 -0
  398. package/src/widgets-v2/category/components/category-row-other.test.tsx +28 -0
  399. package/src/widgets-v2/category/components/category-row-other.tsx +33 -0
  400. package/src/widgets-v2/category/components/category-row-single.tsx +76 -0
  401. package/src/widgets-v2/category/components/category-row-stacked.test.tsx +244 -0
  402. package/src/widgets-v2/category/components/category-row-stacked.tsx +99 -0
  403. package/src/widgets-v2/category/download.test.ts +71 -0
  404. package/src/widgets-v2/category/download.ts +54 -0
  405. package/src/widgets-v2/category/index.ts +32 -0
  406. package/src/widgets-v2/category/skeleton.test.tsx +26 -0
  407. package/src/widgets-v2/category/skeleton.tsx +74 -0
  408. package/src/widgets-v2/category/style.ts +290 -0
  409. package/src/widgets-v2/category/types.ts +54 -0
  410. package/src/widgets-v2/echart/echart-ui.test.tsx +232 -0
  411. package/src/widgets-v2/echart/echart-ui.tsx +184 -0
  412. package/src/widgets-v2/echart/echart.test.tsx +229 -0
  413. package/src/widgets-v2/echart/echart.tsx +199 -0
  414. package/src/widgets-v2/echart/index.ts +22 -0
  415. package/src/widgets-v2/echart/shared-resize-observer.test.ts +91 -0
  416. package/src/widgets-v2/echart/shared-resize-observer.ts +56 -0
  417. package/src/widgets-v2/echart/style.ts +8 -0
  418. package/src/widgets-v2/echart/use-chart-selection.test.tsx +118 -0
  419. package/src/widgets-v2/echart/use-chart-selection.ts +115 -0
  420. package/src/widgets-v2/formula/delta.tsx +61 -0
  421. package/src/widgets-v2/formula/download.test.tsx +65 -0
  422. package/src/widgets-v2/formula/download.tsx +69 -0
  423. package/src/widgets-v2/formula/formula-ui.test.tsx +91 -0
  424. package/src/widgets-v2/formula/formula-ui.tsx +66 -0
  425. package/src/widgets-v2/formula/formula.test.tsx +50 -0
  426. package/src/widgets-v2/formula/formula.tsx +34 -0
  427. package/src/widgets-v2/formula/index.ts +17 -0
  428. package/src/widgets-v2/formula/note.tsx +25 -0
  429. package/src/widgets-v2/formula/prefix.tsx +25 -0
  430. package/src/widgets-v2/formula/series.tsx +67 -0
  431. package/src/widgets-v2/formula/skeleton.test.tsx +21 -0
  432. package/src/widgets-v2/formula/skeleton.tsx +27 -0
  433. package/src/widgets-v2/formula/style.ts +31 -0
  434. package/src/widgets-v2/formula/subcomponents.test.tsx +107 -0
  435. package/src/widgets-v2/formula/suffix.tsx +25 -0
  436. package/src/widgets-v2/formula/types.ts +44 -0
  437. package/src/widgets-v2/formula/value.tsx +31 -0
  438. package/src/widgets-v2/histogram/download.test.ts +94 -0
  439. package/src/widgets-v2/histogram/download.ts +60 -0
  440. package/src/widgets-v2/histogram/index.ts +10 -0
  441. package/src/widgets-v2/histogram/options.test.ts +304 -0
  442. package/src/widgets-v2/histogram/options.ts +337 -0
  443. package/src/widgets-v2/histogram/skeleton.test.tsx +16 -0
  444. package/src/widgets-v2/histogram/skeleton.tsx +70 -0
  445. package/src/widgets-v2/histogram/transforms.test.ts +46 -0
  446. package/src/widgets-v2/histogram/transforms.ts +30 -0
  447. package/src/widgets-v2/histogram/types.ts +51 -0
  448. package/src/widgets-v2/index.ts +201 -0
  449. package/src/widgets-v2/markdown/download.test.ts +66 -0
  450. package/src/widgets-v2/markdown/download.ts +53 -0
  451. package/src/widgets-v2/markdown/index.ts +6 -0
  452. package/src/widgets-v2/markdown/markdown-content.test.tsx +155 -0
  453. package/src/widgets-v2/markdown/markdown-content.tsx +72 -0
  454. package/src/widgets-v2/markdown/markdown-ui.test.tsx +75 -0
  455. package/src/widgets-v2/markdown/markdown-ui.tsx +55 -0
  456. package/src/widgets-v2/markdown/markdown.test.tsx +39 -0
  457. package/src/widgets-v2/markdown/markdown.tsx +17 -0
  458. package/src/widgets-v2/markdown/skeleton.test.tsx +15 -0
  459. package/src/widgets-v2/markdown/skeleton.tsx +32 -0
  460. package/src/widgets-v2/markdown/style.ts +53 -0
  461. package/src/widgets-v2/markdown/types.ts +4 -0
  462. package/src/widgets-v2/note/labels.ts +9 -0
  463. package/src/widgets-v2/note/style.ts +26 -0
  464. package/src/widgets-v2/note/widget-note.test.tsx +158 -0
  465. package/src/widgets-v2/note/widget-note.tsx +172 -0
  466. package/src/widgets-v2/pie/download.test.ts +78 -0
  467. package/src/widgets-v2/pie/download.ts +55 -0
  468. package/src/widgets-v2/pie/index.ts +10 -0
  469. package/src/widgets-v2/pie/options.test.ts +585 -0
  470. package/src/widgets-v2/pie/options.ts +509 -0
  471. package/src/widgets-v2/pie/skeleton.test.tsx +17 -0
  472. package/src/widgets-v2/pie/skeleton.tsx +32 -0
  473. package/src/widgets-v2/pie/types.ts +55 -0
  474. package/src/widgets-v2/provider/widget-provider.test.tsx +119 -0
  475. package/src/widgets-v2/provider/widget-provider.tsx +111 -0
  476. package/src/widgets-v2/range/index.ts +4 -0
  477. package/src/widgets-v2/range/range-ui.test.tsx +130 -0
  478. package/src/widgets-v2/range/range-ui.tsx +211 -0
  479. package/src/widgets-v2/range/range.test.tsx +68 -0
  480. package/src/widgets-v2/range/range.tsx +46 -0
  481. package/src/widgets-v2/range/skeleton.test.tsx +17 -0
  482. package/src/widgets-v2/range/skeleton.tsx +47 -0
  483. package/src/widgets-v2/range/style.ts +41 -0
  484. package/src/widgets-v2/range/types.ts +37 -0
  485. package/src/widgets-v2/scatterplot/download.test.ts +71 -0
  486. package/src/widgets-v2/scatterplot/download.ts +54 -0
  487. package/src/widgets-v2/scatterplot/index.ts +11 -0
  488. package/src/widgets-v2/scatterplot/options.test.ts +399 -0
  489. package/src/widgets-v2/scatterplot/options.ts +421 -0
  490. package/src/widgets-v2/scatterplot/skeleton.test.tsx +17 -0
  491. package/src/widgets-v2/scatterplot/skeleton.tsx +84 -0
  492. package/src/widgets-v2/scatterplot/transforms.test.ts +97 -0
  493. package/src/widgets-v2/scatterplot/transforms.ts +38 -0
  494. package/src/widgets-v2/scatterplot/types.ts +55 -0
  495. package/src/widgets-v2/selection-summary/labels.ts +11 -0
  496. package/src/widgets-v2/selection-summary/selection-summary.test.tsx +53 -0
  497. package/src/widgets-v2/selection-summary/selection-summary.tsx +62 -0
  498. package/src/widgets-v2/selection-summary/style.ts +23 -0
  499. package/src/widgets-v2/spread/download.test.ts +64 -0
  500. package/src/widgets-v2/spread/download.ts +59 -0
  501. package/src/widgets-v2/spread/index.ts +6 -0
  502. package/src/widgets-v2/spread/separator.tsx +11 -0
  503. package/src/widgets-v2/spread/skeleton.test.tsx +17 -0
  504. package/src/widgets-v2/spread/skeleton.tsx +38 -0
  505. package/src/widgets-v2/spread/spread-ui.test.tsx +108 -0
  506. package/src/widgets-v2/spread/spread-ui.tsx +52 -0
  507. package/src/widgets-v2/spread/spread.test.tsx +50 -0
  508. package/src/widgets-v2/spread/spread.tsx +31 -0
  509. package/src/widgets-v2/spread/types.ts +27 -0
  510. package/src/widgets-v2/state/labels.test.ts +33 -0
  511. package/src/widgets-v2/state/labels.ts +20 -0
  512. package/src/widgets-v2/state/style.ts +25 -0
  513. package/src/widgets-v2/state/widget-state.test.tsx +294 -0
  514. package/src/widgets-v2/state/widget-state.tsx +184 -0
  515. package/src/widgets-v2/stores/index.ts +49 -0
  516. package/src/widgets-v2/stores/pipeline-middleware.test.ts +187 -0
  517. package/src/widgets-v2/stores/pipeline-middleware.ts +91 -0
  518. package/src/widgets-v2/stores/transforms.test.ts +162 -0
  519. package/src/widgets-v2/stores/transforms.ts +70 -0
  520. package/src/widgets-v2/stores/types.ts +64 -0
  521. package/src/widgets-v2/stores/use-echart-instance.test.tsx +91 -0
  522. package/src/widgets-v2/stores/use-echart-instance.ts +29 -0
  523. package/src/widgets-v2/stores/use-transform-enabled.test.tsx +127 -0
  524. package/src/widgets-v2/stores/use-transform-enabled.ts +25 -0
  525. package/src/widgets-v2/stores/use-transform.test.tsx +262 -0
  526. package/src/widgets-v2/stores/use-transform.ts +158 -0
  527. package/src/widgets-v2/stores/widget-context.test.tsx +58 -0
  528. package/src/widgets-v2/stores/widget-context.ts +15 -0
  529. package/src/widgets-v2/stores/widget-store-registry.test.ts +292 -0
  530. package/src/widgets-v2/stores/widget-store-registry.ts +248 -0
  531. package/src/widgets-v2/subheader/style.ts +12 -0
  532. package/src/widgets-v2/subheader/subheader.test.tsx +30 -0
  533. package/src/widgets-v2/subheader/subheader.tsx +16 -0
  534. package/src/widgets-v2/table/download.test.ts +75 -0
  535. package/src/widgets-v2/table/download.ts +47 -0
  536. package/src/widgets-v2/table/helpers.test.ts +214 -0
  537. package/src/widgets-v2/table/helpers.ts +136 -0
  538. package/src/widgets-v2/table/index.ts +23 -0
  539. package/src/widgets-v2/table/labels.tsx +41 -0
  540. package/src/widgets-v2/table/skeleton.test.tsx +26 -0
  541. package/src/widgets-v2/table/skeleton.tsx +65 -0
  542. package/src/widgets-v2/table/style.ts +46 -0
  543. package/src/widgets-v2/table/table-ui.test.tsx +200 -0
  544. package/src/widgets-v2/table/table-ui.tsx +331 -0
  545. package/src/widgets-v2/table/table.test.tsx +119 -0
  546. package/src/widgets-v2/table/table.tsx +174 -0
  547. package/src/widgets-v2/table/types.ts +44 -0
  548. package/src/widgets-v2/test-utils.ts +107 -0
  549. package/src/widgets-v2/timeseries/download.test.ts +95 -0
  550. package/src/widgets-v2/timeseries/download.ts +86 -0
  551. package/src/widgets-v2/timeseries/index.ts +10 -0
  552. package/src/widgets-v2/timeseries/options.test.ts +379 -0
  553. package/src/widgets-v2/timeseries/options.ts +341 -0
  554. package/src/widgets-v2/timeseries/skeleton.test.tsx +13 -0
  555. package/src/widgets-v2/timeseries/skeleton.tsx +76 -0
  556. package/src/widgets-v2/timeseries/types.ts +61 -0
  557. package/src/widgets-v2/toolbox/labels.ts +9 -0
  558. package/src/widgets-v2/toolbox/style.ts +33 -0
  559. package/src/widgets-v2/toolbox/toolbox.test.tsx +200 -0
  560. package/src/widgets-v2/toolbox/toolbox.tsx +309 -0
  561. package/src/widgets-v2/utils/data-zoom-layout.ts +26 -0
  562. package/src/widgets-v2/utils/index.ts +2 -0
  563. package/src/widgets-v2/utils/merge-options.test.ts +52 -0
  564. package/src/widgets-v2/utils/merge-options.ts +50 -0
  565. package/src/widgets-v2/wrapper/index.ts +14 -0
  566. package/src/widgets-v2/wrapper/labels.ts +11 -0
  567. package/src/widgets-v2/wrapper/style.ts +134 -0
  568. package/src/widgets-v2/wrapper/widget-actions.test.tsx +52 -0
  569. package/src/widgets-v2/wrapper/widget-actions.tsx +43 -0
  570. package/src/widgets-v2/wrapper/widget-content.test.tsx +27 -0
  571. package/src/widgets-v2/wrapper/widget-content.tsx +29 -0
  572. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +159 -0
  573. package/src/widgets-v2/wrapper/widget-wrapper.tsx +178 -0
  574. package/dist/styles-BYTyKQFP.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-column-Cidl_M-4.js","sources":["../src/widgets-v2/actions/searcher/filter.ts","../src/widgets-v2/actions/searcher/labels.ts","../src/widgets-v2/actions/searcher/style.ts","../src/widgets-v2/actions/searcher/searcher-toggle.tsx","../src/widgets-v2/actions/searcher/searcher.tsx","../src/widgets-v2/actions/stack-toggle/transforms.ts","../src/widgets-v2/actions/stack-toggle/labels.ts","../src/widgets-v2/actions/stack-toggle/style.ts","../src/widgets-v2/actions/stack-toggle/stack-toggle.tsx","../src/widgets-v2/actions/zoom-toggle/labels.ts","../src/widgets-v2/actions/zoom-toggle/style.ts","../src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx","../src/widgets-v2/actions/brush-toggle/transforms.ts","../src/widgets-v2/actions/brush-toggle/labels.ts","../src/widgets-v2/actions/brush-toggle/style.ts","../src/widgets-v2/actions/brush-toggle/brush-toggle.tsx","../src/widgets-v2/actions/relative-data/transforms.ts","../src/widgets-v2/actions/relative-data/labels.ts","../src/widgets-v2/actions/relative-data/style.ts","../src/widgets-v2/actions/relative-data/relative-data.tsx","../src/widgets-v2/actions/download/labels.ts","../src/widgets-v2/actions/download/download.tsx","../src/widgets-v2/actions/fullscreen/labels.ts","../src/widgets-v2/actions/fullscreen/style.ts","../src/widgets-v2/actions/fullscreen/fullscreen.tsx","../src/widgets-v2/actions/lock-selection/transforms.ts","../src/widgets-v2/actions/lock-selection/labels.ts","../src/widgets-v2/actions/lock-selection/style.ts","../src/widgets-v2/actions/lock-selection/lock-selection.tsx","../src/widgets-v2/actions/change-column/change-column-icon.tsx","../src/widgets-v2/actions/change-column/labels.ts","../src/widgets-v2/actions/change-column/style.ts","../src/widgets-v2/actions/change-column/sortable-column-item.tsx","../src/widgets-v2/actions/change-column/change-column.tsx"],"sourcesContent":["/**\n * Filters a 2D series of `{name, ...}` records by case-insensitive substring on\n * the `name` field. Keeps the dataset shape (one inner array per series).\n * Used by the Searcher action's data transform.\n */\nexport function filterBySearchText(input: unknown, search: string): unknown {\n if (!search) return input\n const needle = search.toLowerCase()\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!Array.isArray(series)) return series\n return series.filter((item: unknown) => {\n if (item == null) return false\n if (typeof item === 'object' && 'name' in item) {\n const rawName = (item as { name: unknown }).name\n const name = rawName == null ? '' : stringifyPrimitive(rawName)\n return name.toLowerCase().includes(needle)\n }\n return stringifyPrimitive(item).toLowerCase().includes(needle)\n })\n })\n}\n\nfunction stringifyPrimitive(v: unknown): string {\n if (typeof v === 'string') return v\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n return ''\n}\n","export interface SearcherLabels {\n toggle: string\n placeholder: string\n clearAriaLabel: string\n noResults: string\n}\n\nexport const DEFAULT_SEARCHER_LABELS: SearcherLabels = {\n toggle: 'Search',\n placeholder: 'Search…',\n clearAriaLabel: 'Clear search',\n noResults: 'No matches.',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n input: {\n width: '100%',\n mb: 1,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useCallback, type ComponentType } from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport SearchIcon from '@mui/icons-material/Search'\nimport { Tooltip } from '../../../components'\nimport {\n getWidgetStore,\n useSingleTransform,\n useWidget,\n useWidgetId,\n} from '../../stores'\nimport { filterBySearchText } from './filter'\nimport { DEFAULT_SEARCHER_LABELS, type SearcherLabels } from './labels'\nimport { styles } from './style'\n\nconst SEARCHER_DESCRIPTOR = {\n id: 'searcher',\n type: 'data' as const,\n order: 20,\n disables: ['lock-selection'],\n}\n\nexport interface SearcherToggleProps {\n labels?: Partial<SearcherLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Whether the searcher transform is enabled on first mount. Defaults\n * to `false` so the toggle renders un-pressed and the\n * `filterBySearchText` transform stays dormant until the user clicks\n * it. Set to `true` for search-first widgets where the input is the\n * primary affordance.\n */\n initialEnabled?: boolean\n}\n\nexport function SearcherToggle({\n labels,\n icon: Icon = SearchIcon,\n iconProps,\n initialEnabled = false,\n}: SearcherToggleProps) {\n const id = useWidgetId()\n const resolved = { ...DEFAULT_SEARCHER_LABELS, ...labels }\n const text = useWidget(\n id,\n (s) => (s.transformStates.searcher?.searchText as string | undefined) ?? '',\n )\n\n // The transform fn closes over `text`. Memoize via useCallback so identity\n // only changes when text changes, allowing useTransform to re-register.\n const fn = useCallback(\n (data: unknown) => filterBySearchText(data, text),\n [text],\n )\n\n const { enabled, toggle } = useSingleTransform(id, SEARCHER_DESCRIPTOR, fn, {\n initialEnabled,\n })\n\n return (\n <Tooltip title={resolved.toggle}>\n <IconButton\n size='small'\n aria-label={resolved.toggle}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n\n/**\n * Imperatively writes the search text into the widget store. Used by the\n * Searcher input to update text inside transformStates without going through\n * a re-rendered React subscription.\n */\nexport function setSearcherText(widgetId: string, value: string): void {\n getWidgetStore(widgetId).setState((s) => ({\n transformStates: {\n ...s.transformStates,\n searcher: {\n enabled: s.transformStates.searcher?.enabled ?? false,\n ...s.transformStates.searcher,\n searchText: value,\n },\n },\n }))\n}\n","import { useCallback, useMemo, useRef, useState } from 'react'\nimport { IconButton, InputAdornment, TextField } from '@mui/material'\nimport SearchIcon from '@mui/icons-material/Search'\nimport ClearIcon from '@mui/icons-material/Clear'\nimport { debounce } from '@carto/ps-utils'\nimport { getWidgetStore, useWidget, useWidgetId } from '../../stores'\nimport { setSearcherText } from './searcher-toggle'\nimport { DEFAULT_SEARCHER_LABELS, type SearcherLabels } from './labels'\nimport { styles } from './style'\n\nexport interface SearcherProps {\n labels?: Partial<SearcherLabels>\n /** Debounce delay before the input value is written to the widget store. */\n debounceMs?: number\n}\n\nconst DEFAULT_DEBOUNCE = 300\n\n/**\n * Renders only when the matching `<SearcherToggle />` is enabled — drives the\n * `transformStates['searcher'].searchText` field via a debounced setter.\n */\nexport function Searcher({\n labels,\n debounceMs = DEFAULT_DEBOUNCE,\n}: SearcherProps) {\n const id = useWidgetId()\n const resolved = { ...DEFAULT_SEARCHER_LABELS, ...labels }\n const enabled = useWidget(\n id,\n (s) => s.transformStates.searcher?.enabled ?? false,\n )\n\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n // Hydrate from the store so re-toggling the input preserves any prior text.\n const [local, setLocal] = useState<string>(\n () =>\n (getWidgetStore(id).getState().transformStates.searcher?.searchText as\n | string\n | undefined) ?? '',\n )\n\n const debouncedWrite = useMemo(\n () =>\n debounce(\n (value: unknown) => setSearcherText(id, value as string),\n debounceMs,\n ),\n [id, debounceMs],\n )\n\n const handleSearchTextChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value\n setLocal(value)\n debouncedWrite(value)\n },\n [debouncedWrite],\n )\n\n const handleClear = useCallback(() => {\n setLocal('')\n setSearcherText(id, '')\n // Re-arm the debounced timer with '' so any pending stale write resolves\n // to the cleared value rather than re-applying the previous text.\n debouncedWrite('')\n inputRef.current?.focus()\n }, [id, debouncedWrite])\n\n if (!enabled) return null\n\n return (\n <TextField\n inputRef={inputRef}\n size='small'\n fullWidth\n variant='filled'\n placeholder={resolved.placeholder}\n value={local}\n onChange={handleSearchTextChange}\n // The Searcher only mounts when the user explicitly toggles the\n // SearcherToggle action — focusing the input on mount matches user\n // intent, so the jsx-a11y/no-autofocus warning is the false-positive\n // case (the rule targets unsolicited autofocus that disorients\n // screen readers).\n // eslint-disable-next-line\n autoFocus\n aria-label={resolved.placeholder}\n sx={styles.input}\n InputProps={{\n startAdornment: (\n <InputAdornment position='start'>\n <SearchIcon fontSize='small' />\n </InputAdornment>\n ),\n endAdornment: local ? (\n <InputAdornment position='end'>\n <IconButton\n size='small'\n edge='end'\n aria-label={resolved.clearAriaLabel}\n onClick={handleClear}\n >\n <ClearIcon fontSize='small' />\n </IconButton>\n </InputAdornment>\n ) : null,\n }}\n />\n )\n}\n","/**\n * Stack-mode config transform: marks every series with `stack: 'total'` so\n * ECharts stacks them vertically (bar) or by value (line). Module-level\n * constant so identity is stable across renders — no `useCallback` needed.\n *\n * Widgets that bake series into options at build time get marked in place.\n * Widgets that build series at data-fusion time (`bar`, `histogram`,\n * `timeseries`) have no `series` array yet at config-transform time, so we\n * also emit a single-entry **broadcast template** (`[{ stack: 'total' }]`).\n * Their option factories merge that template into every series they emit\n * at fusion time, so the `stack` mark survives end-to-end.\n */\nexport const addStack = (option: unknown): unknown => {\n if (option == null || typeof option !== 'object') return option\n const cfg = option as Record<string, unknown>\n const existing = Array.isArray(cfg.series) ? cfg.series : []\n const series =\n existing.length === 0\n ? [{ stack: 'total' }]\n : existing.map((s: unknown): unknown => {\n if (s == null || typeof s !== 'object') return s\n return { ...s, stack: 'total' }\n })\n return { ...cfg, series }\n}\n","export interface StackToggleLabels {\n on: string\n off: string\n}\n\nexport const DEFAULT_STACK_TOGGLE_LABELS: StackToggleLabels = {\n on: 'Unstack series',\n off: 'Stack series',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { type ComponentType } from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport StackedBarChartIcon from '@mui/icons-material/StackedBarChart'\nimport { Tooltip } from '../../../components'\nimport { useSingleTransform, useWidgetId } from '../../stores'\nimport { addStack } from './transforms'\nimport { DEFAULT_STACK_TOGGLE_LABELS, type StackToggleLabels } from './labels'\nimport { styles } from './style'\n\nconst STACK_DESCRIPTOR = {\n id: 'stack-toggle',\n type: 'config' as const,\n order: 30,\n}\n\nexport interface StackToggleProps {\n initialEnabled?: boolean\n labels?: Partial<StackToggleLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\nexport function StackToggle({\n initialEnabled = false,\n labels,\n icon: Icon = StackedBarChartIcon,\n iconProps,\n}: StackToggleProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_STACK_TOGGLE_LABELS, ...labels }\n const { enabled, toggle } = useSingleTransform(\n id,\n STACK_DESCRIPTOR,\n addStack,\n {\n initialEnabled,\n },\n )\n const tooltip = enabled ? _labels.on : _labels.off\n\n return (\n <Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n","export interface ZoomToggleLabels {\n on: string\n off: string\n}\n\nexport const DEFAULT_ZOOM_TOGGLE_LABELS: ZoomToggleLabels = {\n on: 'Disable zoom',\n off: 'Enable zoom',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useCallback, useMemo, type ComponentType } from 'react'\nimport { IconButton, useTheme, type SvgIconProps } from '@mui/material'\nimport ZoomInIcon from '@mui/icons-material/ZoomIn'\nimport { Tooltip } from '../../../components'\nimport {\n getEchartInstance,\n useSingleTransform,\n useWidgetId,\n} from '../../stores'\nimport { createAddZoom, type ZoomAxis } from './transforms'\nimport { DEFAULT_ZOOM_TOGGLE_LABELS, type ZoomToggleLabels } from './labels'\nimport { styles } from './style'\n\nconst ZOOM_DESCRIPTOR = {\n id: 'zoom-toggle',\n type: 'config' as const,\n order: 20,\n}\n\nexport interface ZoomToggleProps {\n initialEnabled?: boolean\n labels?: Partial<ZoomToggleLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Which axes the zoom controls. Default `['x']` — matches bar /\n * histogram / timeseries (horizontal pan on the category axis). Pass\n * `['x', 'y']` for 2D zoom on a scatterplot-style chart (mouse-wheel\n * scales both axes; horizontal slider at bottom + vertical slider on\n * the right).\n */\n axes?: readonly ZoomAxis[]\n}\n\n/**\n * Toggle a `dataZoom` slider + wheel-zoom on the chart. The transform is\n * theme-bound so the slider gets v1's CARTO chrome (blue-tinted filler,\n * secondary-color preview, white pill handles).\n *\n * `dataZoom` is intentionally NOT in `replaceMergeKeys` — ECharts merges\n * subsequent `setOption` calls so the user's dragged range survives\n * unrelated re-renders (data updates, formatter swaps, RelativeData toggles).\n *\n * On disable the transform is unregistered, but ECharts' merge semantics\n * would otherwise *keep* the live `dataZoom` component visible. To remove\n * the slider immediately we issue a one-shot\n * `setOption({}, { replaceMerge: ['dataZoom'] })` against the live chart\n * instance via {@link getEchartInstance} — this bypasses the pipeline so\n * unrelated transforms aren't disturbed.\n */\nexport function ZoomToggle({\n initialEnabled = false,\n labels,\n icon: Icon = ZoomInIcon,\n iconProps,\n axes,\n}: ZoomToggleProps) {\n const id = useWidgetId()\n const theme = useTheme()\n const _labels = { ...DEFAULT_ZOOM_TOGGLE_LABELS, ...labels }\n // Reduce `axes` to two structural booleans before memoizing so the memo\n // depends on stable primitive values, not an array reference (callers\n // typically pass an inline `axes={['x', 'y']}` literal that changes\n // identity each render). Default — no `axes` prop — is x-axis only,\n // matching `createAddZoom`'s default.\n const includeX = axes ? axes.includes('x') : true\n const includeY = axes ? axes.includes('y') : false\n const transform = useMemo(() => {\n const resolved: ZoomAxis[] = []\n if (includeX) resolved.push('x')\n if (includeY) resolved.push('y')\n return createAddZoom(theme, { axes: resolved })\n }, [theme, includeX, includeY])\n const { enabled, toggle } = useSingleTransform(\n id,\n ZOOM_DESCRIPTOR,\n transform,\n { initialEnabled },\n )\n\n const handleToggle = useCallback(() => {\n if (enabled) {\n // About to disable — clear the dataZoom component on the live\n // instance so the slider disappears immediately.\n getEchartInstance(id)?.setOption({}, { replaceMerge: ['dataZoom'] })\n }\n toggle()\n }, [enabled, toggle, id])\n\n const tooltip = enabled ? _labels.on : _labels.off\n\n return (\n <Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={handleToggle}\n className={enabled ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n","/**\n * Brush config transform: enables ECharts' brush component on the option\n * object. Module-level constant — identity stable across renders.\n *\n * Pairs with `replaceMergeKeys: ['brush']` so the pipeline replaces (not\n * merges) the brush config on every config-pipeline run. v1 needed a\n * mousemove re-dispatch hack to keep the brush state across data updates;\n * v2 keeps brush state continuous via `notMerge: false` + dynamic\n * replaceMerge in the EchartUI layer (D6) — no hack required.\n */\nexport const addBrush = (option: unknown): unknown => {\n if (option == null || typeof option !== 'object') return option\n const cfg = option as Record<string, unknown>\n return {\n ...cfg,\n brush: {\n toolbox: ['rect', 'clear'],\n xAxisIndex: 'all',\n brushLink: 'all',\n outOfBrush: { colorAlpha: 0.15 },\n },\n toolbox: {\n ...((cfg.toolbox as object | undefined) ?? {}),\n show: false,\n feature: {\n ...((cfg.toolbox as { feature?: object } | undefined)?.feature ?? {}),\n brush: { type: ['rect', 'clear'] },\n },\n },\n }\n}\n","export interface BrushToggleLabels {\n on: string\n off: string\n}\n\nexport const DEFAULT_BRUSH_TOGGLE_LABELS: BrushToggleLabels = {\n on: 'Disable brush selection',\n off: 'Enable brush selection',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useEffect, type ComponentType } from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport HighlightAltIcon from '@mui/icons-material/HighlightAlt'\nimport { Tooltip } from '../../../components'\nimport {\n useEchartInstance,\n useSingleTransform,\n useWidgetId,\n} from '../../stores'\nimport { addBrush } from './transforms'\nimport { DEFAULT_BRUSH_TOGGLE_LABELS, type BrushToggleLabels } from './labels'\nimport { styles } from './style'\n\nconst BRUSH_DESCRIPTOR = {\n id: 'brush-toggle',\n type: 'config' as const,\n order: 25,\n}\n\nexport interface BrushToggleProps {\n initialEnabled?: boolean\n /**\n * ECharts brush type. `'lineX'` (default) selects a range on the\n * x-axis — appropriate for bar / histogram / timeseries. `'rect'`\n * selects a 2-D rectangle — use for scatterplot. Other ECharts\n * brush types (`'lineY'`, `'polygon'`) are also accepted.\n */\n brushType?: 'lineX' | 'lineY' | 'rect' | 'polygon'\n /**\n * `'multiple'` (default) lets the user draw additional brushes on\n * top of existing ones. `'single'` replaces the previous brush on\n * each new draw.\n */\n brushMode?: 'multiple' | 'single'\n /**\n * Optional view of the consumer-owned selection. When provided and\n * the array is empty (`[]`), any brush rectangles currently drawn on\n * the chart are wiped — keeps the UI in sync when the parent clears\n * the selection externally (e.g. via `Widget.SelectionSummary`'s\n * `onClear`). Pass the same array that drives `useChartSelection` /\n * the option factory's `selection` input.\n *\n * Leave `undefined` to opt out — the sync effect becomes a no-op.\n */\n selection?: readonly unknown[] | null\n labels?: Partial<BrushToggleLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\n/**\n * Toggle ECharts' brush selection mode. Two-part wiring:\n *\n * 1. The config transform (`addBrush`) installs the `brush`\n * component on the option so brushed items get the\n * `outOfBrush` dim treatment.\n * 2. ECharts only enters \"brush cursor\" mode when something\n * dispatches `takeGlobalCursor({ key: 'brush', ... })`. This\n * component drives that dispatch via {@link useEchartInstance},\n * reacting when the chart instance becomes available (the\n * `BrushToggle` mounts before `Widget.Echart` in tree order, so\n * on first mount the chart isn't ready yet).\n *\n * 3. ECharts clears the global cursor on every `setOption`, so we\n * re-dispatch on each `'finished'` event — required for\n * `brushMode: 'multiple'` to keep working across selection-driven\n * re-renders, RelativeData toggles, etc.\n *\n * Selection events (`brushSelected` / `brushEnd`) flow through the\n * existing `useChartSelection` wiring at the consumer level — no extra\n * plumbing here.\n */\nexport function BrushToggle({\n initialEnabled = false,\n brushType = 'lineX',\n brushMode = 'multiple',\n selection,\n labels,\n icon: Icon = HighlightAltIcon,\n iconProps,\n}: BrushToggleProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_BRUSH_TOGGLE_LABELS, ...labels }\n const { enabled, toggle } = useSingleTransform(\n id,\n BRUSH_DESCRIPTOR,\n addBrush,\n { initialEnabled },\n )\n\n // Reactive read of the live instance — the effect below re-runs when\n // the chart arrives, departs, or re-inits, instead of polling.\n const chart = useEchartInstance(id)\n\n useEffect(() => {\n if (!chart) return undefined\n if (!enabled) {\n // Disabled: exit brush cursor and wipe any drawn rectangles.\n chart.dispatchAction({ type: 'takeGlobalCursor' })\n chart.dispatchAction({ type: 'brush', areas: [] })\n return undefined\n }\n\n const enterBrush = (): void => {\n chart.dispatchAction({\n type: 'takeGlobalCursor',\n key: 'brush',\n brushOption: { brushType, brushMode },\n })\n }\n\n // Every `setOption` clears the global cursor. Re-dispatch after\n // each chart render so `brushMode: 'multiple'` stays usable across\n // selection-driven re-renders, RelativeData toggles, etc.\n const onFinished = (): void => enterBrush()\n chart.on('finished', onFinished)\n enterBrush()\n\n return () => {\n chart.off('finished', onFinished)\n }\n }, [chart, enabled, brushType, brushMode])\n\n // Sync the drawn rectangles with the external selection. When the\n // parent flips `selection` to `[]` (e.g. SelectionSummary's \"Clear\"\n // button), wipe the brush areas so the chart UI matches the data.\n // Dispatching with an empty `areas` array when nothing is drawn is a\n // safe no-op on ECharts, so no extra \"previous value\" bookkeeping is\n // needed. Kept as a separate effect so a parent selection change\n // doesn't tear down / re-attach the `'finished'` listener above.\n useEffect(() => {\n if (!chart || !enabled) return\n if (selection?.length === 0) {\n chart.dispatchAction({ type: 'brush', areas: [] })\n }\n }, [chart, enabled, selection])\n\n const tooltip = enabled ? _labels.on : _labels.off\n\n return (\n <Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n className={enabled ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n","/**\n * Default data-side transform for `RelativeData`: rewrite each\n * `{ name, value }` datum's `value` to its share of the series total\n * expressed as 0–100 (matches v1's range). The companion percent\n * formatter divides by 100 so it can call `Intl.NumberFormat` with\n * `style: 'percent'`.\n *\n * Used by widgets whose series are arrays of `{ name, value }`\n * objects — bar, pie, timeseries, category. Widgets with a different\n * data shape pass their own transform via\n * `<RelativeData transform={...} />`; see `widgets-v2/histogram` and\n * `widgets-v2/scatterplot` for in-tree examples.\n *\n * The denominator is the sum of |value| across the series so mixed-sign\n * series (e.g. cashflow with inflows + outflows) produce sane signed\n * shares-of-magnitude. A series whose total magnitude is zero (all-zero\n * or empty input) is returned unchanged so a stalled or empty data set\n * doesn't show misleading 0% values. Series whose shape doesn't match\n * the named-value pattern fall through untouched.\n */\n\ninterface NamedValue {\n name: unknown\n value: number\n [k: string]: unknown\n}\n\nfunction isNamedValueArray(v: unknown): v is NamedValue[] {\n if (!Array.isArray(v)) return false\n return v.every(\n (item) =>\n item != null &&\n typeof item === 'object' &&\n 'value' in item &&\n typeof (item as { value: unknown }).value === 'number',\n )\n}\n\nexport const toRelativeData = (input: unknown): unknown => {\n if (!Array.isArray(input)) return input\n return input.map((series: unknown): unknown => {\n if (!isNamedValueArray(series)) return series\n const total = series.reduce((acc, d) => acc + Math.abs(d.value), 0)\n if (total <= 0) return series\n return series.map((d) => ({ ...d, value: (d.value / total) * 100 }))\n })\n}\n\n/**\n * Build a percent formatter using `Intl.NumberFormat`. The returned function\n * expects values in the 0–100 range (output of {@link toRelativeData}) and\n * divides by 100 internally before calling `style: 'percent'`.\n *\n * Locale: passed straight to `Intl.NumberFormat`. Falls back to the runtime\n * default when omitted.\n */\nexport function createPercentFormatter(\n locale?: string,\n): (value: number) => string {\n const fmt = new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n })\n return (value: number) => {\n if (typeof value !== 'number' || !Number.isFinite(value))\n return String(value)\n return fmt.format(value / 100)\n }\n}\n","export interface RelativeDataLabels {\n on: string\n off: string\n}\n\nexport const DEFAULT_RELATIVE_DATA_LABELS: RelativeDataLabels = {\n on: 'Show absolute values',\n off: 'Show relative values',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useEffect, useMemo, type ComponentType } from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport PercentIcon from '@mui/icons-material/Percent'\nimport { Tooltip } from '../../../components'\nimport {\n getWidgetStore,\n useSingleTransform,\n useWidget,\n useWidgetId,\n} from '../../stores'\nimport { createPercentFormatter, toRelativeData } from './transforms'\nimport { DEFAULT_RELATIVE_DATA_LABELS, type RelativeDataLabels } from './labels'\nimport { styles } from './style'\n\nconst DATA_DESCRIPTOR = {\n id: 'relative-data',\n type: 'data' as const,\n order: 15,\n}\n\nexport interface RelativeDataProps {\n initialEnabled?: boolean\n /**\n * BCP-47 locale tag forwarded to `Intl.NumberFormat`. Defaults to the\n * runtime locale.\n */\n locale?: string\n labels?: Partial<RelativeDataLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Data-side transform that rewrites the widget's series into their\n * relative (0–100) form. Defaults to {@link toRelativeData}, which\n * handles the canonical `{ name, value }[]` shape (bar / pie /\n * timeseries / category). Widgets with a different data shape pass\n * their own — `toRelativeHistogramData` for histogram's `number[]`,\n * `toRelativeScatterplotData` for scatter's `[x, y][]`.\n *\n * Should be a stable top-level reference; inline `(data) => ...`\n * literals re-register the transform every render.\n */\n transform?: (data: unknown) => unknown\n}\n\n/**\n * Toggle between absolute and relative (percentage) values.\n *\n * - **Data side**: a single data transform ({@link toRelativeData}) registered\n * through `useSingleTransform`. When disabled, the pipeline skips it and the\n * derived `data` reverts to `rawData` automatically.\n * - **Formatter side**: an effect writes directly to `state.formatter`. When\n * enabled it installs the Intl-based percent formatter; when disabled it\n * reads `state.rawFormatter` (the consumer-supplied original, always live)\n * and writes it back to `formatter`. No \"original\" snapshot is captured —\n * `rawFormatter` is the original.\n */\nexport function RelativeData({\n initialEnabled = false,\n locale,\n labels,\n icon: Icon = PercentIcon,\n iconProps,\n transform,\n}: RelativeDataProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_RELATIVE_DATA_LABELS, ...labels }\n\n const { enabled, toggle } = useSingleTransform(\n id,\n DATA_DESCRIPTOR,\n transform ?? toRelativeData,\n { initialEnabled },\n )\n\n const percentFormatter = useMemo(\n () => createPercentFormatter(locale),\n [locale],\n )\n\n // Subscribe to rawFormatter so the effect re-runs and re-applies after the\n // consumer's formatter prop changes (Provider syncs the new prop to both\n // rawFormatter and formatter — re-applying restores the percent override\n // when relative is on, and tracks the new rawFormatter when off).\n const rawFormatter = useWidget(id, (s) => s.rawFormatter)\n\n useEffect(() => {\n getWidgetStore(id).setState({\n formatter: enabled ? percentFormatter : rawFormatter,\n })\n }, [id, enabled, percentFormatter, rawFormatter])\n\n const tooltip = enabled ? _labels.on : _labels.off\n\n return (\n <Tooltip title={tooltip}>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={enabled}\n onClick={toggle}\n sx={{ ...styles.toggle, ...(enabled && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n","export interface DownloadLabels {\n trigger: string\n /** Tooltip / aria-label shown on the trigger while a download is in flight. */\n loading: string\n /**\n * Tooltip / aria-label shown on the trigger after a download failed. Cleared\n * the next time the menu opens.\n */\n error: string\n}\n\nexport const DEFAULT_DOWNLOAD_LABELS: DownloadLabels = {\n trigger: 'Download',\n loading: 'Downloading…',\n error: 'Download failed',\n}\n","import { useCallback, useState, type ComponentType } from 'react'\nimport {\n CircularProgress,\n IconButton,\n ListItemIcon,\n ListItemText,\n Menu,\n MenuItem,\n type SvgIconProps,\n} from '@mui/material'\nimport DownloadIcon from '@mui/icons-material/FileDownload'\nimport { Tooltip } from '../../../components'\nimport { triggerLinkDownload } from './exports'\nimport type { DownloadItem } from './types'\nimport { DEFAULT_DOWNLOAD_LABELS, type DownloadLabels } from './labels'\n\nexport interface DownloadProps {\n items: readonly DownloadItem[]\n labels?: Partial<DownloadLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n /**\n * Fires when an item's `resolve()` rejects (or any step in the click-through\n * path throws). The error is normalised to a real `Error` first. Surface\n * to your telemetry / toast layer here; the trigger already shows a visual\n * error indicator independently.\n */\n onError?: (err: Error) => void\n}\n\nexport function Download({\n items,\n labels,\n icon: Icon = DownloadIcon,\n iconProps,\n onError,\n}: DownloadProps) {\n const _labels = { ...DEFAULT_DOWNLOAD_LABELS, ...labels }\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n const [isDownloading, setIsDownloading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n\n const open = useCallback((e: React.MouseEvent<HTMLButtonElement>) => {\n // Clear any prior error when the user re-engages the menu — the next\n // attempt is a fresh interaction, not a continuation of the failed one.\n setError(null)\n setAnchorEl(e.currentTarget)\n }, [])\n const close = useCallback(() => setAnchorEl(null), [])\n\n const onSelect = useCallback(\n (item: DownloadItem) => {\n // Single-flight: ignore re-entry while a download is already in flight.\n // The trigger is `disabled` and the menu is closed during that window,\n // so this guard mostly defends against future call sites that bypass\n // the menu (e.g. keyboard shortcuts).\n if (item.disabled || isDownloading) return\n close()\n setIsDownloading(true)\n setError(null)\n item\n .resolve()\n .then(({ url, filename, revoke }) => {\n // `item.filename` overrides what `resolve()` returns — lets consumers\n // template the filename with widget metadata declaratively.\n triggerLinkDownload({ url, filename: item.filename ?? filename })\n // Defer revoke past the current task so Safari / Firefox-on-slow-disk\n // can dispatch the download before the blob URL is invalidated.\n // Synchronous revoke here can silently cancel the download.\n if (revoke) setTimeout(revoke, 0)\n })\n .catch((err: unknown) => {\n const e = err instanceof Error ? err : new Error(String(err))\n setError(e)\n onError?.(e)\n })\n .finally(() => {\n setIsDownloading(false)\n })\n },\n [close, isDownloading, onError],\n )\n\n const triggerLabel = isDownloading\n ? _labels.loading\n : error\n ? _labels.error\n : _labels.trigger\n const triggerActive = Boolean(anchorEl) || isDownloading\n\n return (\n <>\n <Tooltip title={triggerLabel}>\n <IconButton\n size='small'\n aria-label={triggerLabel}\n aria-haspopup='true'\n aria-expanded={anchorEl ? 'true' : undefined}\n aria-busy={isDownloading || undefined}\n data-error={error ? 'true' : undefined}\n disabled={isDownloading || items.length === 0}\n onClick={open}\n className={triggerActive ? 'active' : undefined}\n >\n {isDownloading ? (\n <CircularProgress size={18} color='inherit' />\n ) : (\n <Icon fontSize='small' {...iconProps} />\n )}\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl}\n open={Boolean(anchorEl)}\n onClose={close}\n variant='menu'\n elevation={8}\n anchorOrigin={{\n vertical: 'bottom',\n horizontal: 'right',\n }}\n transformOrigin={{\n vertical: 'top',\n horizontal: 'right',\n }}\n >\n {items.map((item) => (\n <MenuItem\n key={item.id}\n disabled={item.disabled}\n onClick={() => void onSelect(item)}\n >\n {item.icon && (\n <ListItemIcon sx={{ color: 'text.primary' }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText>{item.label}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\n )\n}\n","export interface FullScreenLabels {\n open: string\n close: string\n}\n\nexport const DEFAULT_FULLSCREEN_LABELS: FullScreenLabels = {\n open: 'Open in full screen',\n close: 'Exit full screen',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n // Inline shell where the portaled body lives when fullscreen is closed.\n // Real flex-column box (not `display: contents`) so that:\n // 1. when the body is moved into the modal, we can pin a `min-height`\n // to keep the widget card from collapsing — the inline shell is\n // empty for that interval, and a layout-less wrapper would make\n // the card squish a frame before the modal covers it (visible\n // blink).\n // 2. nested `flex: 1` (e.g. Widget.State's CaptureBox) still grows —\n // this shell preserves the column-flex inheritance it would have\n // had directly under `Widget.Content`.\n // `gap: 1` mirrors `Widget.Content`'s gap so the body's siblings\n // (Subheader / capture box / note) keep their spacing.\n inlineSlot: {\n display: 'flex',\n flexDirection: 'column',\n flex: 1,\n minHeight: 0,\n gap: 1,\n },\n trigger: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n triggerActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n dialogPaper: {\n width: '90vw',\n height: '90vh',\n maxWidth: 'none',\n maxHeight: 'none',\n },\n dialogTitle: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: 1,\n py: 3,\n pr: 3,\n pb: 2,\n },\n titleText: {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n dialogContent: {\n display: 'flex',\n flexDirection: 'column',\n gap: 1,\n py: 3,\n px: 2.5,\n overflow: 'auto',\n },\n} satisfies Record<string, SxProps<Theme>>\n","import {\n useCallback,\n useLayoutEffect,\n useState,\n type ComponentType,\n type ReactNode,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport {\n Box,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n Typography,\n type SvgIconProps,\n} from '@mui/material'\nimport FullscreenIcon from '@mui/icons-material/Fullscreen'\nimport FullscreenExitIcon from '@mui/icons-material/FullscreenExit'\nimport CloseIcon from '@mui/icons-material/Close'\nimport { Tooltip } from '../../../components'\nimport { getWidgetStore, useWidget, useWidgetId } from '../../stores'\nimport { DEFAULT_FULLSCREEN_LABELS, type FullScreenLabels } from './labels'\nimport type { FullScreenWidgetState } from './types'\nimport { styles } from './style'\n\nexport interface FullScreenTriggerProps {\n labels?: Partial<FullScreenLabels>\n enterIcon?: ComponentType<SvgIconProps>\n exitIcon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\nexport interface FullScreenSlotProps {\n /**\n * Render-prop body. Receives the live `isFullScreen` flag so the consumer\n * can branch per-mode props (e.g., `Widget.Toolbox visibleCount`) without\n * duplicating the JSX.\n */\n children: (isFullScreen: boolean) => ReactNode\n /** Header text rendered above the body when the modal is open. */\n title?: ReactNode\n labels?: Partial<FullScreenLabels>\n closeIcon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\n/**\n * Toggle button placed inside `<Widget.Actions>`. Reads / writes\n * {@link FullScreenWidgetState.isFullScreen} on the per-widget store. The\n * matching modal is rendered by {@link FullScreenSlot} (typically inside\n * `<Widget.Content>`).\n */\nfunction FullScreenTrigger({\n labels,\n enterIcon: EnterIcon = FullscreenIcon,\n exitIcon: ExitIcon = FullscreenExitIcon,\n iconProps,\n}: FullScreenTriggerProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_FULLSCREEN_LABELS, ...labels }\n const open = useWidget<boolean, FullScreenWidgetState>(\n id,\n (s) => s.isFullScreen ?? false,\n )\n\n const handleToggle = useCallback(() => {\n getWidgetStore(id).setState({\n isFullScreen: !open,\n } as Partial<FullScreenWidgetState>)\n }, [id, open])\n\n const triggerLabel = open ? _labels.close : _labels.open\n const TriggerIcon = open ? ExitIcon : EnterIcon\n\n return (\n <Tooltip title={triggerLabel}>\n <IconButton\n size='small'\n aria-label={triggerLabel}\n aria-pressed={open}\n onClick={handleToggle}\n className={open ? 'active' : undefined}\n sx={{ ...styles.trigger, ...(open && styles.triggerActive) }}\n >\n <TriggerIcon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n )\n}\n\n/**\n * Body wrapper. Renders its render-prop children once, via a single\n * `createPortal` call whose container is a stable `<div>` we hold as a ref.\n * That div is moved imperatively between an inline placeholder and the\n * `<DialogContent>` of an MUI `<Dialog keepMounted>`. Because both the\n * React parent (the portal call site) AND the portal container are\n * identical across the toggle, the subtree keeps its fiber identity and\n * ECharts (or any other heavy child) stays mounted while only its DOM\n * parent changes.\n */\nfunction FullScreenSlot({\n children,\n title,\n labels,\n closeIcon: CloseSvg = CloseIcon,\n iconProps,\n}: FullScreenSlotProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_FULLSCREEN_LABELS, ...labels }\n const open = useWidget<boolean, FullScreenWidgetState>(\n id,\n (s) => s.isFullScreen ?? false,\n )\n const [inlineEl, setInlineEl] = useState<HTMLElement | null>(null)\n const [dialogEl, setDialogEl] = useState<HTMLElement | null>(null)\n // Stable, never-changing portal container created once per slot. Held in\n // state (not a ref) so the React Compiler is happy reading it during\n // render — it's immutable from React's perspective, only its DOM parent\n // changes via `appendChild`. Switching `createPortal`'s `container`\n // argument makes React unmount and remount the children, defeating the\n // single-mount goal; keeping the container identical and moving the div\n // imperatively avoids that.\n const [portalDiv] = useState<HTMLDivElement | null>(() => {\n if (typeof document === 'undefined') return null\n const div = document.createElement('div')\n // `display: contents` keeps the wrapper transparent in flow so it\n // doesn't introduce a stray block when nested inside the inline slot.\n div.style.display = 'contents'\n return div\n })\n\n const handleClose = useCallback(() => {\n getWidgetStore(id).setState({\n isFullScreen: false,\n } as Partial<FullScreenWidgetState>)\n }, [id])\n\n // Reparent the portal div into the active host whenever `open` (or either\n // host) changes. `useLayoutEffect` runs synchronously after commit (after\n // refs have been written), so the dialog ref is already live when we read\n // it.\n //\n // Anti-blink: pin a `min-height` on the inline shell that's always live —\n // not just while fullscreen is open. We re-measure whenever the body is\n // inline (open=false) so the lock tracks data-driven height changes\n // (Formula adding rows, Table growing, ECharts re-init…) and survives\n // every fullscreen toggle. Briefly clearing minHeight before the measure\n // lets the lock shrink as well as grow; both operations are synchronous\n // within useLayoutEffect, so the browser never paints the intermediate\n // \"no lock\" frame.\n useLayoutEffect(() => {\n if (!portalDiv || !inlineEl) return\n const host = open ? dialogEl : inlineEl\n if (host && portalDiv.parentNode !== host) {\n host.appendChild(portalDiv)\n }\n if (!open) refreshInlineHeightLock(inlineEl)\n }, [open, inlineEl, dialogEl, portalDiv])\n\n const titleId = `widget-fullscreen-title-${id}`\n const rendered = children(open)\n\n return (\n <>\n <Box ref={setInlineEl} sx={styles.inlineSlot} />\n {portalDiv ? createPortal(rendered, portalDiv) : null}\n <Dialog\n open={open}\n onClose={handleClose}\n PaperProps={{ sx: styles.dialogPaper }}\n aria-labelledby={titleId}\n // Sits above the Toolbox overflow Paper (zIndex.tooltip = 1500),\n // so opening fullscreen never leaves a stray popover floating on top.\n sx={{ zIndex: (theme) => theme.zIndex.tooltip + 1 }}\n >\n <DialogTitle id={titleId} component='div' sx={styles.dialogTitle}>\n <Typography\n variant='subtitle1'\n component='span'\n sx={styles.titleText}\n >\n {title}\n </Typography>\n <Tooltip title={_labels.close}>\n <IconButton\n size='medium'\n aria-label={_labels.close}\n onClick={handleClose}\n >\n <CloseSvg fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n </DialogTitle>\n <DialogContent ref={setDialogEl} sx={styles.dialogContent} />\n </Dialog>\n </>\n )\n}\n\n/**\n * Briefly clear the inline shell's `min-height`, measure its natural\n * height, then re-pin. Lives outside the component so the React Compiler\n * doesn't see the DOM mutation as an attempt to modify a `useState` value\n * — `el` here is just a parameter, not a tracked store value.\n */\nfunction refreshInlineHeightLock(el: HTMLElement): void {\n el.style.minHeight = ''\n const h = el.getBoundingClientRect().height\n if (h > 0) el.style.minHeight = `${h}px`\n}\n\n/**\n * Namespace export. Consumers compose with:\n *\n * ```tsx\n * <Widget.Actions>\n * <Widget.FullScreen.Trigger />\n * </Widget.Actions>\n * <Widget.Content>\n * <Widget.FullScreen.Slot title={title}>\n * {(isFullScreen) => <Body visibleCount={isFullScreen ? undefined : 2} />}\n * </Widget.FullScreen.Slot>\n * </Widget.Content>\n * ```\n */\nexport const FullScreen = {\n Trigger: FullScreenTrigger,\n Slot: FullScreenSlot,\n}\n","/**\n * Filters a 2D series of `{name, ...}` records, keeping only items whose\n * `name` is in the locked set. Multi-series shape is preserved (one inner\n * array per series). Used by the LockSelection action's data transform.\n */\nexport function filterByLockedItems(\n input: unknown,\n lockedItems: readonly (string | number)[],\n): unknown {\n if (lockedItems.length === 0) return input\n if (!Array.isArray(input)) return input\n const set = new Set<string | number>(lockedItems)\n return input.map((series: unknown): unknown => {\n if (!Array.isArray(series)) return series\n return series.filter((item: unknown) => {\n if (item == null) return false\n if (typeof item === 'object' && 'name' in item) {\n const name = (item as { name: unknown }).name\n if (typeof name === 'string' || typeof name === 'number') {\n return set.has(name)\n }\n return false\n }\n return false\n })\n })\n}\n","export interface LockSelectionLabels {\n lock: string\n unlock: string\n disabled: string\n}\n\nexport const DEFAULT_LOCK_SELECTION_LABELS: LockSelectionLabels = {\n lock: 'Lock selection',\n unlock: 'Unlock selection',\n disabled: 'Select rows to lock',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useCallback, useEffect, useMemo, type ComponentType } from 'react'\nimport { IconButton, type SvgIconProps } from '@mui/material'\nimport LockIcon from '@mui/icons-material/Lock'\nimport LockOpenIcon from '@mui/icons-material/LockOpen'\nimport { Tooltip } from '../../../components'\nimport { useTransform, useWidgetId } from '../../stores'\nimport type { TransformPair } from '../../stores'\nimport { filterByLockedItems } from './transforms'\nimport {\n DEFAULT_LOCK_SELECTION_LABELS,\n type LockSelectionLabels,\n} from './labels'\nimport { styles } from './style'\n\nconst LOCK_SELECTION_DESCRIPTOR = {\n id: 'lock-selection',\n type: 'data' as const,\n order: 30,\n}\n\nexport type LockSelectionKey = string | number\n\nexport interface LockSelectionProps {\n /**\n * Currently-selected items (destination-owned). On lock, this set is\n * snapshotted into `lockedItems` via `onLockChange`.\n */\n selection: readonly LockSelectionKey[]\n /**\n * Currently-locked items (destination-owned). When non-empty, the widget's\n * data is filtered to these items via the registered transform.\n */\n lockedItems: readonly LockSelectionKey[]\n /**\n * Fires when the user toggles the lock. The destination is responsible for\n * persisting the new locked set (and re-feeding it via `lockedItems`).\n */\n onLockChange: (next: readonly LockSelectionKey[]) => void\n labels?: Partial<LockSelectionLabels>\n /** Lock icon (default: `LockIcon`). */\n lockIcon?: ComponentType<SvgIconProps>\n /** Unlock icon (default: `LockOpenIcon`). */\n unlockIcon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n}\n\n/**\n * Action that pins the current selection so the widget's data filters down\n * to those items even as the user changes selections. Selection and lock\n * state are destination-owned; this component is a controlled UI + a data\n * transform registered against the widget's pipeline.\n *\n * The trigger is disabled when there is nothing to lock and nothing locked.\n */\nexport function LockSelection({\n selection,\n lockedItems,\n onLockChange,\n labels,\n lockIcon: LockSvg = LockIcon,\n unlockIcon: UnlockSvg = LockOpenIcon,\n iconProps,\n}: LockSelectionProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_LOCK_SELECTION_LABELS, ...labels }\n const isLocked = lockedItems.length > 0\n const canToggle = isLocked || selection.length > 0\n\n // Pair memoized on lockedItems identity — useTransform re-registers the fn\n // (which closes over the current locked set) whenever the destination feeds\n // a new array. setEnabled drives the middleware-level `enabled` flag.\n const pairs = useMemoPair(lockedItems)\n const { enabled, setEnabled } = useTransform(id, pairs, {\n initialEnabled: isLocked,\n })\n\n // Keep middleware `enabled` in sync with destination-owned `isLocked`. The\n // pipeline only short-circuits the transform when enabled === false, so\n // toggling here is what makes lock/unlock actually take effect.\n useEffect(() => {\n if (enabled !== isLocked) setEnabled(isLocked)\n }, [enabled, isLocked, setEnabled])\n\n const handleToggle = useCallback(() => {\n if (isLocked) {\n onLockChange([])\n } else {\n onLockChange([...selection])\n }\n }, [isLocked, onLockChange, selection])\n\n const tooltip = !canToggle\n ? _labels.disabled\n : isLocked\n ? _labels.unlock\n : _labels.lock\n const Icon = isLocked ? UnlockSvg : LockSvg\n\n return (\n <Tooltip title={tooltip}>\n <span>\n <IconButton\n size='small'\n aria-label={tooltip}\n aria-pressed={isLocked}\n disabled={!canToggle}\n onClick={handleToggle}\n sx={{ ...styles.toggle, ...(isLocked && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </span>\n </Tooltip>\n )\n}\n\n/**\n * Builds a stable `[{ descriptor, fn }]` pair where `fn` closes over the\n * latest `lockedItems`. Re-memoized whenever the array identity changes so\n * `useTransform` re-registers the closure with the freshest data.\n */\nfunction useMemoPair(\n lockedItems: readonly LockSelectionKey[],\n): readonly TransformPair[] {\n const fn = useCallback(\n (data: unknown) => filterByLockedItems(data, lockedItems),\n [lockedItems],\n )\n return useMemo(() => [{ descriptor: LOCK_SELECTION_DESCRIPTOR, fn }], [fn])\n}\n","import { SvgIcon, type SvgIconProps } from '@mui/material'\n\nexport function ChangeColumnIcon(props: SvgIconProps) {\n return (\n <SvgIcon viewBox='0 0 18 18' {...props}>\n <path\n fill='currentColor'\n fillRule='evenodd'\n d='M14.25 2.25H3.75c-.825 0-1.5.675-1.5 1.5v10.5c0 .825.675 1.5 1.5 1.5h10.5c.825 0 1.5-.675 1.5-1.5V3.75c0-.825-.675-1.5-1.5-1.5m-3.75 12h-3V3.75h3zM3.75 3.75H6v10.5H3.75zM12 14.25V3.75h2.25v10.5z'\n clipRule='evenodd'\n />\n </SvgIcon>\n )\n}\n","export interface ChangeColumnLabels {\n trigger: string\n reset: string\n}\n\nexport const DEFAULT_CHANGE_COLUMN_LABELS: ChangeColumnLabels = {\n trigger: 'Change column order',\n reset: 'Reset to default',\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n toggle: {\n p: 0.5,\n '& .MuiSvgIcon-root': { fontSize: 20 },\n },\n toggleActive: {\n background: (theme: Theme) => theme.palette.primary.relatedLight,\n },\n menuPaper: {\n overflow: 'hidden',\n minWidth: 220,\n },\n item: {\n cursor: 'grab',\n '&:focus-visible': {\n outline: '2px solid',\n outlineColor: 'primary.main',\n outlineOffset: -2,\n },\n },\n itemDragging: {\n opacity: 0.5,\n cursor: 'grabbing',\n },\n dragHandle: {\n color: 'text.secondary',\n mr: 1,\n fontSize: 18,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useSortable } from '@dnd-kit/sortable'\nimport { CSS } from '@dnd-kit/utilities'\nimport { ListItemText, MenuItem } from '@mui/material'\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator'\nimport type { ComponentType, ReactNode } from 'react'\nimport type { SvgIconProps } from '@mui/material'\nimport { styles } from './style'\n\nexport interface SortableColumnItemProps {\n id: string\n label: ReactNode\n dragHandleIcon?: ComponentType<SvgIconProps>\n}\n\n/**\n * Draggable menu item used inside ChangeColumn's `<DndContext>`. Wraps a\n * MUI `<MenuItem>` so it inherits keyboard / theming behavior, and exposes\n * the dnd-kit listeners on the whole row so the user can grab anywhere on\n * the row to reorder.\n */\nexport function SortableColumnItem({\n id,\n label,\n dragHandleIcon: HandleIcon = DragIndicatorIcon,\n}: SortableColumnItemProps) {\n const {\n attributes,\n listeners,\n setNodeRef,\n transform,\n transition,\n isDragging,\n } = useSortable({ id })\n\n const transformStyle = {\n transform: CSS.Transform.toString(\n transform ? { ...transform, x: 0 } : null,\n ),\n transition,\n }\n\n return (\n <MenuItem\n ref={setNodeRef}\n style={transformStyle}\n {...attributes}\n {...listeners}\n role='menuitem'\n tabIndex={0}\n sx={{ ...styles.item, ...(isDragging && styles.itemDragging) }}\n >\n <HandleIcon sx={styles.dragHandle} />\n <ListItemText>{label}</ListItemText>\n </MenuItem>\n )\n}\n","import { useCallback, useMemo, useState, type ComponentType } from 'react'\nimport {\n DndContext,\n KeyboardSensor,\n PointerSensor,\n closestCenter,\n useSensor,\n useSensors,\n type DragEndEvent,\n} from '@dnd-kit/core'\nimport {\n SortableContext,\n arrayMove,\n sortableKeyboardCoordinates,\n verticalListSortingStrategy,\n} from '@dnd-kit/sortable'\nimport { IconButton, Menu, type SvgIconProps } from '@mui/material'\nimport { Tooltip } from '../../../components'\nimport { getWidgetStore, useWidget, useWidgetId } from '../../stores'\nimport { ChangeColumnIcon } from './change-column-icon'\nimport { DEFAULT_CHANGE_COLUMN_LABELS, type ChangeColumnLabels } from './labels'\nimport { SortableColumnItem } from './sortable-column-item'\nimport { styles } from './style'\nimport type { ChangeColumnWidgetState } from './types'\nimport type { ReactNode } from 'react'\n\nexport interface ChangeColumnItem {\n id: string\n label: ReactNode\n}\n\nexport interface ChangeColumnProps {\n /**\n * Master list of columns (id + label) in their default order. The current\n * effective order is derived by combining this list with the widget's\n * `columnOrder` extension state.\n */\n columns: readonly ChangeColumnItem[]\n labels?: Partial<ChangeColumnLabels>\n icon?: ComponentType<SvgIconProps>\n iconProps?: SvgIconProps\n dragHandleIcon?: ComponentType<SvgIconProps>\n}\n\n/**\n * Action that lets users reorder columns via drag-and-drop. The new order is\n * persisted on the widget store as `columnOrder` (an array of ids) on the\n * {@link ChangeColumnWidgetState} extension. `<Table>` (and other column-aware\n * bridges) merge that order with their own `columns` prop via\n * `resolveColumns()` from the table primitives.\n *\n * Returns `null` when there are fewer than two columns to reorder.\n */\nexport function ChangeColumn({\n columns,\n labels,\n icon: Icon = ChangeColumnIcon,\n iconProps,\n dragHandleIcon,\n}: ChangeColumnProps) {\n const id = useWidgetId()\n const _labels = { ...DEFAULT_CHANGE_COLUMN_LABELS, ...labels }\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\n\n const columnOrder = useWidget<\n readonly string[] | undefined,\n ChangeColumnWidgetState\n >(id, (s) => s.columnOrder)\n\n const orderedIds = useMemo(() => {\n const masterIds = columns.map((c) => c.id)\n if (!columnOrder || columnOrder.length === 0) return masterIds\n // Set lookup so membership tests stay O(1) regardless of column count.\n const masterIdSet = new Set(masterIds)\n const seen = new Set<string>()\n const out: string[] = []\n for (const cid of columnOrder) {\n if (masterIdSet.has(cid) && !seen.has(cid)) {\n out.push(cid)\n seen.add(cid)\n }\n }\n for (const cid of masterIds) {\n if (!seen.has(cid)) out.push(cid)\n }\n return out\n }, [columnOrder, columns])\n\n const orderedColumns = useMemo(() => {\n const byId = new Map(columns.map((c) => [c.id, c]))\n // Single pass instead of map().filter() — skips unknown ids inline.\n const out: ChangeColumnItem[] = []\n for (const cid of orderedIds) {\n const c = byId.get(cid)\n if (c != null) out.push(c)\n }\n return out\n }, [orderedIds, columns])\n\n const sensors = useSensors(\n useSensor(PointerSensor),\n useSensor(KeyboardSensor, {\n coordinateGetter: sortableKeyboardCoordinates,\n }),\n )\n\n const handleOpen = useCallback((e: React.MouseEvent<HTMLElement>) => {\n e.stopPropagation()\n setAnchorEl(e.currentTarget)\n }, [])\n const handleClose = useCallback(() => setAnchorEl(null), [])\n\n const handleDragEnd = useCallback(\n (event: DragEndEvent) => {\n const { active, over } = event\n if (!over || active.id === over.id) return\n const oldIndex = orderedIds.indexOf(String(active.id))\n const newIndex = orderedIds.indexOf(String(over.id))\n if (oldIndex === -1 || newIndex === -1) return\n const next = arrayMove([...orderedIds], oldIndex, newIndex)\n getWidgetStore(id).setState({\n columnOrder: next,\n } as Partial<ChangeColumnWidgetState>)\n },\n [id, orderedIds],\n )\n\n if (columns.length < 2) return null\n\n const isOpen = Boolean(anchorEl)\n\n return (\n <>\n <Tooltip title={_labels.trigger}>\n <IconButton\n size='small'\n aria-label={_labels.trigger}\n aria-pressed={isOpen}\n aria-haspopup='true'\n aria-controls={isOpen ? 'change-column-menu' : undefined}\n aria-expanded={isOpen ? 'true' : undefined}\n onClick={handleOpen}\n className={isOpen ? 'active' : undefined}\n sx={{ ...styles.toggle, ...(isOpen && styles.toggleActive) }}\n >\n <Icon fontSize='small' {...iconProps} />\n </IconButton>\n </Tooltip>\n <DndContext\n sensors={sensors}\n collisionDetection={closestCenter}\n onDragEnd={handleDragEnd}\n >\n <Menu\n id='change-column-menu'\n anchorEl={anchorEl}\n open={isOpen}\n onClose={handleClose}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { sx: styles.menuPaper } }}\n >\n <SortableContext\n items={orderedIds}\n strategy={verticalListSortingStrategy}\n >\n {orderedColumns.map((column) => (\n <SortableColumnItem\n key={column.id}\n id={column.id}\n label={column.label}\n dragHandleIcon={dragHandleIcon}\n />\n ))}\n </SortableContext>\n </Menu>\n </DndContext>\n </>\n )\n}\n"],"names":["filterBySearchText","input","search","needle","toLowerCase","Array","isArray","map","series","filter","item","rawName","name","stringifyPrimitive","includes","v","String","DEFAULT_SEARCHER_LABELS","toggle","placeholder","clearAriaLabel","noResults","styles","p","fontSize","toggleActive","background","theme","palette","primary","relatedLight","width","mb","SEARCHER_DESCRIPTOR","id","type","order","disables","SearcherToggle","t0","$","_c","labels","icon","t1","iconProps","initialEnabled","t2","Icon","undefined","SearchIcon","useWidgetId","t3","resolved","text","useWidget","_temp","t4","data","fn","t5","enabled","useSingleTransform","t6","t7","t8","jsx","t9","IconButton","t10","Tooltip","s","transformStates","searcher","searchText","setSearcherText","widgetId","value","getWidgetStore","setState","DEFAULT_DEBOUNCE","Searcher","debounceMs","inputRef","useRef","getState","local","setLocal","useState","debounce","debouncedWrite","e","value_0","target","handleSearchTextChange","current","focus","handleClear","Symbol","for","InputAdornment","ClearIcon","startAdornment","endAdornment","t11","TextField","addStack","option","cfg","existing","length","stack","DEFAULT_STACK_TOGGLE_LABELS","on","off","STACK_DESCRIPTOR","StackToggle","StackedBarChartIcon","_labels","tooltip","DEFAULT_ZOOM_TOGGLE_LABELS","ZOOM_DESCRIPTOR","ZoomToggle","axes","ZoomInIcon","useTheme","includeX","includeY","push","createAddZoom","transform","getEchartInstance","setOption","replaceMerge","handleToggle","t12","t13","t14","addBrush","brush","toolbox","xAxisIndex","brushLink","outOfBrush","colorAlpha","show","feature","DEFAULT_BRUSH_TOGGLE_LABELS","BRUSH_DESCRIPTOR","BrushToggle","brushType","brushMode","selection","HighlightAltIcon","chart","useEchartInstance","dispatchAction","areas","enterBrush","key","brushOption","onFinished","useEffect","t15","t16","isNamedValueArray","every","toRelativeData","total","reduce","acc","d","Math","abs","createPercentFormatter","locale","fmt","Intl","NumberFormat","style","minimumFractionDigits","maximumFractionDigits","Number","isFinite","format","DEFAULT_RELATIVE_DATA_LABELS","DATA_DESCRIPTOR","RelativeData","PercentIcon","percentFormatter","rawFormatter","formatter","DEFAULT_DOWNLOAD_LABELS","trigger","loading","error","Download","items","onError","DownloadIcon","anchorEl","setAnchorEl","isDownloading","setIsDownloading","setError","currentTarget","open","close","disabled","resolve","then","url","filename","revoke","triggerLinkDownload","setTimeout","catch","err","e_0","Error","finally","onSelect","triggerLabel","triggerActive","Boolean","CircularProgress","vertical","horizontal","t17","t18","item_0","jsxs","MenuItem","ListItemIcon","color","ListItemText","label","Menu","t19","DEFAULT_FULLSCREEN_LABELS","inlineSlot","display","flexDirection","flex","minHeight","gap","dialogPaper","height","maxWidth","maxHeight","dialogTitle","alignItems","justifyContent","py","pr","pb","titleText","minWidth","overflow","textOverflow","whiteSpace","dialogContent","px","FullScreenTrigger","enterIcon","exitIcon","EnterIcon","FullscreenIcon","ExitIcon","FullscreenExitIcon","isFullScreen","TriggerIcon","FullScreenSlot","children","title","closeIcon","CloseSvg","CloseIcon","_temp2","inlineEl","setInlineEl","dialogEl","setDialogEl","portalDiv","_temp3","handleClose","host","parentNode","appendChild","refreshInlineHeightLock","useLayoutEffect","titleId","rendered","Box","createPortal","sx","zIndex","_temp4","Typography","DialogTitle","DialogContent","Dialog","Fragment","document","div","createElement","el","h","getBoundingClientRect","FullScreen","Trigger","Slot","filterByLockedItems","lockedItems","set","Set","has","DEFAULT_LOCK_SELECTION_LABELS","lock","unlock","LOCK_SELECTION_DESCRIPTOR","LockSelection","onLockChange","lockIcon","unlockIcon","LockSvg","LockIcon","UnlockSvg","LockOpenIcon","isLocked","canToggle","pairs","useMemoPair","setEnabled","useTransform","descriptor","ChangeColumnIcon","props","SvgIcon","DEFAULT_CHANGE_COLUMN_LABELS","reset","menuPaper","cursor","outline","outlineColor","outlineOffset","itemDragging","opacity","dragHandle","mr","SortableColumnItem","dragHandleIcon","HandleIcon","DragIndicatorIcon","attributes","listeners","setNodeRef","transition","isDragging","useSortable","CSS","Transform","toString","x","transformStyle","ChangeColumn","columns","columnOrder","bb0","masterIds","masterIdSet","seen","out","cid","add","cid_0","orderedIds","Map","byId","out_0","cid_1","c_1","get","c","orderedColumns","coordinateGetter","sortableKeyboardCoordinates","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","stopPropagation","handleOpen","event","active","over","oldIndex","indexOf","newIndex","next","arrayMove","handleDragEnd","isOpen","paper","t20","column","t21","SortableContext","verticalListSortingStrategy","t22","t23","DndContext","closestCenter","t24","c_0"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import "react/jsx-runtime";
2
+ import "react/compiler-runtime";
3
+ import "react";
4
+ import "@mui/material";
5
+ import "@mui/icons-material/ZoomIn";
6
+ import "./lasso-tool-BYbxrJ-7.js";
7
+ import "./cjs-D4KH3azB.js";
8
+ import "@mui/icons-material";
9
+ import "./widget-context-DTGO0Yta.js";
10
+ import "zustand";
11
+ import "zustand/vanilla";
12
+ import "zustand/middleware";
13
+ import "zustand/react/shallow";
14
+ import { Z as p } from "./transforms-Cdx4fkU5.js";
15
+ function b(t, i) {
16
+ return !Array.isArray(t) || t.length === 0 ? null : t.map((r) => {
17
+ if (r == null || typeof r != "object") return r;
18
+ const o = r;
19
+ return o.type === "slider" && i ? {
20
+ ...o,
21
+ bottom: p.sliderBottomWithLegend
22
+ } : o;
23
+ });
24
+ }
25
+ export {
26
+ b as p
27
+ };
28
+ //# sourceMappingURL=data-zoom-layout-BH0LPwSy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-zoom-layout-BH0LPwSy.js","sources":["../src/widgets-v2/utils/data-zoom-layout.ts"],"sourcesContent":["import { ZOOM_LAYOUT } from '../actions/zoom-toggle'\n\n/**\n * If the option includes a `dataZoom` array (from ZoomToggle's transform),\n * lift any slider entries above the legend row so they don't overlap.\n * Returns `null` when there is no `dataZoom` — caller skips the layout\n * adjustment entirely.\n *\n * Shared between bar, histogram, and timeseries — every widget with a\n * horizontal x-axis dataZoom slider needs the same offset when a legend\n * is rendered below the plot.\n */\nexport function positionDataZoomForLegend(\n dataZoom: unknown,\n hasLegend: boolean,\n): unknown[] | null {\n if (!Array.isArray(dataZoom) || dataZoom.length === 0) return null\n return dataZoom.map((entry: unknown) => {\n if (entry == null || typeof entry !== 'object') return entry\n const dz = entry as { type?: string; bottom?: number }\n if (dz.type === 'slider' && hasLegend) {\n return { ...dz, bottom: ZOOM_LAYOUT.sliderBottomWithLegend }\n }\n return dz\n })\n}\n"],"names":["positionDataZoomForLegend","dataZoom","hasLegend","Array","isArray","length","map","entry","dz","type","bottom","ZOOM_LAYOUT","sliderBottomWithLegend"],"mappings":";;;;;;;;;;;;;;AAYO,SAASA,EACdC,GACAC,GACkB;AAClB,SAAI,CAACC,MAAMC,QAAQH,CAAQ,KAAKA,EAASI,WAAW,IAAU,OACvDJ,EAASK,IAAI,CAACC,MAAmB;AACtC,QAAIA,KAAS,QAAQ,OAAOA,KAAU,SAAU,QAAOA;AACvD,UAAMC,IAAKD;AACX,WAAIC,EAAGC,SAAS,YAAYP,IACnB;AAAA,MAAE,GAAGM;AAAAA,MAAIE,QAAQC,EAAYC;AAAAA,IAAAA,IAE/BJ;AAAAA,EACT,CAAC;AACH;"}
@@ -0,0 +1,176 @@
1
+ import { jsx as j } from "react/jsx-runtime";
2
+ import { c as k } from "react/compiler-runtime";
3
+ import { useRef as M, useEffectEvent as w, useEffect as T } from "react";
4
+ import { u as N, a as D, m as L } from "./widget-store-registry-_W4Z4xp-.js";
5
+ import { u as U } from "./widget-context-DTGO0Yta.js";
6
+ import "zustand";
7
+ import { Box as P } from "@mui/material";
8
+ import * as C from "echarts";
9
+ const z = /* @__PURE__ */ new Map();
10
+ let g = null;
11
+ function K() {
12
+ return typeof ResizeObserver > "u" ? null : (g ??= new ResizeObserver((r) => {
13
+ for (const e of r)
14
+ z.get(e.target)?.();
15
+ }), g);
16
+ }
17
+ const W = () => {
18
+ };
19
+ function $(r, e) {
20
+ const t = K();
21
+ return t ? (z.set(r, e), t.observe(r), () => {
22
+ z.delete(r), g && (g.unobserve(r), z.size === 0 && (g.disconnect(), g = null));
23
+ }) : W;
24
+ }
25
+ function se() {
26
+ g && g.disconnect(), z.clear(), g = null;
27
+ }
28
+ const B = {
29
+ root: {
30
+ width: "100%",
31
+ minHeight: 0
32
+ }
33
+ }, G = {
34
+ renderer: "svg",
35
+ height: 304
36
+ };
37
+ function H(r) {
38
+ const e = k(21), {
39
+ option: t,
40
+ replaceMerge: s,
41
+ onEvents: c,
42
+ init: a,
43
+ onInstance: b,
44
+ className: x,
45
+ sx: y
46
+ } = r, h = M(null), i = M(null), l = M(null), A = M(null);
47
+ let v;
48
+ e[0] !== b ? (v = (n) => {
49
+ b?.(n);
50
+ }, e[0] = b, e[1] = v) : v = e[1];
51
+ const f = w(v);
52
+ let E;
53
+ e[2] !== a || e[3] !== f ? (E = () => {
54
+ if (!h.current)
55
+ return;
56
+ const n = C.init(h.current, null, {
57
+ ...G,
58
+ ...a
59
+ });
60
+ return i.current = n, f(n), () => {
61
+ f(null), n.dispose(), i.current = null;
62
+ };
63
+ }, e[2] = a, e[3] = f, e[4] = E) : E = e[4];
64
+ let u;
65
+ e[5] !== a ? (u = [a], e[5] = a, e[6] = u) : u = e[6], T(E, u);
66
+ let F, d;
67
+ e[7] !== t || e[8] !== s ? (F = () => {
68
+ const n = J(t), I = q(t), S = new Set(s ?? []);
69
+ n !== l.current && S.add("series"), I !== A.current && S.add("dataset"), l.current = n, A.current = I, i.current?.setOption(t, {
70
+ notMerge: !1,
71
+ lazyUpdate: !0,
72
+ replaceMerge: S.size > 0 ? Array.from(S) : void 0
73
+ });
74
+ }, d = [t, s], e[7] = t, e[8] = s, e[9] = F, e[10] = d) : (F = e[9], d = e[10]), T(F, d);
75
+ let _, m;
76
+ e[11] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (_ = () => {
77
+ const n = h.current;
78
+ if (n)
79
+ return $(n, () => {
80
+ i.current?.resize();
81
+ });
82
+ }, m = [], e[11] = _, e[12] = m) : (_ = e[11], m = e[12]), T(_, m);
83
+ let O, p;
84
+ e[13] !== c ? (O = () => {
85
+ const n = i.current;
86
+ if (!(!n || !c)) {
87
+ for (const [I, S] of Object.entries(c))
88
+ n.on(I, S);
89
+ return () => {
90
+ for (const [I, S] of Object.entries(c))
91
+ n.off(I, S);
92
+ };
93
+ }
94
+ }, p = [c], e[13] = c, e[14] = O, e[15] = p) : (O = e[14], p = e[15]), T(O, p);
95
+ let o;
96
+ e[16] !== y ? (o = {
97
+ ...B.root,
98
+ ...y
99
+ }, e[16] = y, e[17] = o) : o = e[17];
100
+ let R;
101
+ return e[18] !== x || e[19] !== o ? (R = /* @__PURE__ */ j(P, { ref: h, className: x, sx: o }), e[18] = x, e[19] = o, e[20] = R) : R = e[20], R;
102
+ }
103
+ function J(r) {
104
+ const e = r.series;
105
+ return Array.isArray(e) ? e.map((t) => {
106
+ if (t == null || typeof t != "object") return String(t);
107
+ const s = t;
108
+ return [
109
+ s.type,
110
+ s.datasetIndex,
111
+ s.name,
112
+ s.stack,
113
+ // `encode` is small; stringify is cheap and stable for plain objects.
114
+ JSON.stringify(s.encode ?? null)
115
+ ].join("|");
116
+ }).join("||") : e ? "1" : "";
117
+ }
118
+ function q(r) {
119
+ const e = r.dataset;
120
+ return Array.isArray(e) ? String(e.length) : e ? "1" : "";
121
+ }
122
+ const Q = ["toolbox"], V = (r) => ({
123
+ data: r.data,
124
+ configTransforms: r.configTransforms,
125
+ formatter: r.formatter,
126
+ labelFormatter: r.labelFormatter
127
+ });
128
+ function oe(r) {
129
+ const e = k(22), {
130
+ optionFactory: t,
131
+ onEvents: s,
132
+ init: c,
133
+ className: a
134
+ } = r, b = U(), x = N(b, V);
135
+ let y;
136
+ e[0] !== b ? (y = (o) => L(b, o), e[0] = b, e[1] = y) : y = e[1];
137
+ const h = y, {
138
+ data: i,
139
+ configTransforms: l,
140
+ formatter: A,
141
+ labelFormatter: v
142
+ } = x;
143
+ let f;
144
+ e[2] !== t ? (f = t(void 0, void 0), e[2] = t, e[3] = f) : f = e[3];
145
+ const E = f;
146
+ let u;
147
+ e[4] !== l || e[5] !== E ? (u = D(E, l), e[4] = l, e[5] = E, e[6] = u) : u = e[6];
148
+ const F = u;
149
+ let d;
150
+ if (e[7] !== l) {
151
+ const o = new Set(Q);
152
+ for (const R of l)
153
+ if (R.enabled && R.replaceMergeKeys?.length)
154
+ for (const n of R.replaceMergeKeys)
155
+ o.add(n);
156
+ d = Array.from(o).sort(), e[7] = l, e[8] = d;
157
+ } else
158
+ d = e[8];
159
+ const _ = d;
160
+ let m;
161
+ e[9] !== t || e[10] !== i || e[11] !== A || e[12] !== v || e[13] !== F ? (m = t(F, i, {
162
+ formatter: A,
163
+ labelFormatter: v
164
+ }), e[9] = t, e[10] = i, e[11] = A, e[12] = v, e[13] = F, e[14] = m) : m = e[14];
165
+ const O = m;
166
+ let p;
167
+ return e[15] !== a || e[16] !== c || e[17] !== s || e[18] !== h || e[19] !== O || e[20] !== _ ? (p = /* @__PURE__ */ j(H, { option: O, replaceMerge: _, onEvents: s, init: c, onInstance: h, className: a }), e[15] = a, e[16] = c, e[17] = s, e[18] = h, e[19] = O, e[20] = _, e[21] = p) : p = e[21], p;
168
+ }
169
+ export {
170
+ G as D,
171
+ oe as E,
172
+ se as _,
173
+ H as a,
174
+ $ as o
175
+ };
176
+ //# sourceMappingURL=echart-CU0KmClP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"echart-CU0KmClP.js","sources":["../src/widgets-v2/echart/shared-resize-observer.ts","../src/widgets-v2/echart/style.ts","../src/widgets-v2/echart/echart-ui.tsx","../src/widgets-v2/echart/echart.tsx"],"sourcesContent":["type ResizeCallback = () => void\n\nconst callbacks = new Map<Element, ResizeCallback>()\nlet observer: ResizeObserver | null = null\n\n/**\n * Returns the singleton ResizeObserver, lazily constructing it on first use.\n * Returns `null` when `ResizeObserver` is not available in the global scope\n * (SSR, very old browsers, or tests that intentionally remove it).\n */\nfunction getObserver(): ResizeObserver | null {\n if (typeof ResizeObserver === 'undefined') return null\n observer ??= new ResizeObserver((entries) => {\n for (const entry of entries) {\n const callback = callbacks.get(entry.target)\n callback?.()\n }\n })\n return observer\n}\n\nconst NOOP_CLEANUP = (): void => undefined\n\nexport function observeResize(\n element: Element,\n callback: ResizeCallback,\n): () => void {\n const ro = getObserver()\n // Gracefully degrade when no ResizeObserver is available — consumers\n // still see one initial measure() pass via their own effect; we just\n // skip the subsequent resize-driven re-measures.\n if (!ro) return NOOP_CLEANUP\n callbacks.set(element, callback)\n ro.observe(element)\n return () => {\n callbacks.delete(element)\n if (observer) {\n observer.unobserve(element)\n // Disconnect the singleton once the last subscriber leaves so the\n // observer doesn't outlive its consumers in SSR teardown / micro-\n // frontend unmount scenarios. A subsequent observeResize() will\n // lazily re-create it via getObserver().\n if (callbacks.size === 0) {\n observer.disconnect()\n observer = null\n }\n }\n }\n}\n\n/** @internal — for tests only. */\nexport function __resetSharedResizeObserver(): void {\n if (observer) observer.disconnect()\n callbacks.clear()\n observer = null\n}\n","import type { SxProps, Theme } from '@mui/material'\n\nexport const styles = {\n root: {\n width: '100%',\n minHeight: 0,\n },\n} satisfies Record<string, SxProps<Theme>>\n","import { useEffect, useEffectEvent, useRef } from 'react'\nimport { Box, type SxProps, type Theme } from '@mui/material'\nimport * as echarts from 'echarts'\nimport { observeResize } from './shared-resize-observer'\nimport { styles } from './style'\n\nexport const DEFAULT_INIT_OPTS = {\n renderer: 'svg',\n height: 304,\n} satisfies echarts.EChartsInitOpts\n\nexport type EchartsEventHandler = (event: unknown) => void\n\nexport interface EchartUIProps {\n option: echarts.EChartsOption\n /**\n * Keys to merge as arrays (replace by index) instead of by id. The middleware\n * memoizes this content-stably, so identical sets don't re-trigger setOption.\n */\n replaceMerge?: readonly string[]\n /**\n * Opaque ECharts event passthrough — handlers fire untransformed.\n *\n * **Must be referentially stable** (memoize it with `useMemo` /\n * `useCallback`, or hoist to module scope). The binding effect depends on\n * the `onEvents` object identity; an inline `{ click: handler }` literal\n * recreates the object on every render and causes every listener to be\n * detached and re-attached each commit.\n */\n onEvents?: Record<string, EchartsEventHandler>\n /**\n * Init options forwarded to echarts.init. Captured at mount only — to change\n * `renderer` or `height` after mount, unmount and remount the chart.\n * Defaults: `{ renderer: 'svg', height: 304 }`.\n */\n init?: echarts.EChartsInitOpts\n /**\n * Optional callback fired once after the ECharts instance is created\n * (`onInstance(chart)`) and once when it's about to be disposed\n * (`onInstance(null)`). Used by `Widget.Echart` to publish the live\n * instance to the per-widget registry so other actions (e.g.\n * `ZoomToggle`'s disable handler) can reach it without DOM lookups.\n * No need to memoize — the bridge wraps it in `useEffectEvent` so an\n * unstable reference does not re-init the chart.\n */\n onInstance?: (chart: echarts.ECharts | null) => void\n className?: string\n sx?: SxProps<Theme>\n}\n\nexport function EchartUI({\n option,\n replaceMerge,\n onEvents,\n init,\n onInstance,\n className,\n sx,\n}: EchartUIProps) {\n const containerRef = useRef<HTMLDivElement>(null)\n const chartRef = useRef<echarts.ECharts | null>(null)\n\n // Structural fingerprint of the last applied series / dataset arrays.\n // Used to decide whether the next `setOption` should *replace* those\n // components (when their shape changed) or *merge* them (when only\n // styling-level fields differ — e.g. a new `itemStyle.color` callback\n // from a selection update). Replacing wipes ECharts' per-series runtime\n // state (hover, animation cache, brush areas), so we want to do it only\n // when the structure actually moved.\n const seriesFingerprintRef = useRef<string | null>(null)\n const datasetFingerprintRef = useRef<string | null>(null)\n\n // Stable notify wrapper — always reads the latest `onInstance` prop\n // without forcing the init effect below to re-run when the parent\n // passes a fresh function reference. The init effect now only fires\n // when `init` actually changes (documented as mount-only anyway).\n const notifyInstance = useEffectEvent(\n (chart: echarts.ECharts | null): void => {\n onInstance?.(chart)\n },\n )\n\n // Init / dispose. `init` is captured once at mount.\n useEffect(() => {\n if (!containerRef.current) return undefined\n const chart = echarts.init(containerRef.current, null, {\n ...DEFAULT_INIT_OPTS,\n ...init,\n })\n chartRef.current = chart\n notifyInstance(chart)\n return () => {\n // Notify observers *before* disposal so any queued imperative\n // dispatches (e.g. ZoomToggle's `setOption` cleanup) see the\n // instance disappear before its DOM is torn down.\n notifyInstance(null)\n chart.dispose()\n chartRef.current = null\n }\n }, [init])\n\n // Apply option / replaceMerge changes via merge mode (no remount required).\n useEffect(() => {\n const seriesFp = computeSeriesFingerprint(option)\n const datasetFp = computeDatasetFingerprint(option)\n const augmented = new Set<string>(replaceMerge ?? [])\n if (seriesFp !== seriesFingerprintRef.current) augmented.add('series')\n if (datasetFp !== datasetFingerprintRef.current) augmented.add('dataset')\n seriesFingerprintRef.current = seriesFp\n datasetFingerprintRef.current = datasetFp\n chartRef.current?.setOption(option, {\n notMerge: false,\n lazyUpdate: true,\n replaceMerge: augmented.size > 0 ? Array.from(augmented) : undefined,\n })\n }, [option, replaceMerge])\n\n // Resize via shared singleton observer.\n useEffect(() => {\n const node = containerRef.current\n if (!node) return undefined\n return observeResize(node, () => {\n chartRef.current?.resize()\n })\n }, [])\n\n // Bind / unbind opaque event handlers.\n useEffect(() => {\n const chart = chartRef.current\n if (!chart || !onEvents) return undefined\n for (const [event, handler] of Object.entries(onEvents)) {\n chart.on(event, handler)\n }\n return () => {\n for (const [event, handler] of Object.entries(onEvents)) {\n chart.off(event, handler)\n }\n }\n }, [onEvents])\n\n return (\n <Box\n ref={containerRef}\n className={className}\n sx={{ ...styles.root, ...sx }}\n />\n )\n}\n\n/**\n * Cheap structural digest of the option's `series` array — covers the fields\n * that actually demand a `replaceMerge` (length, type, datasetIndex, name,\n * stack, encode). Excludes runtime-style fields like `itemStyle` (callbacks\n * have unstable identity but don't change structure).\n */\nfunction computeSeriesFingerprint(option: echarts.EChartsOption): string {\n const series = option.series\n if (!Array.isArray(series)) return series ? '1' : ''\n return series\n .map((s) => {\n if (s == null || typeof s !== 'object') return String(s)\n const o = s as Record<string, unknown>\n return [\n o.type,\n o.datasetIndex,\n o.name,\n o.stack,\n // `encode` is small; stringify is cheap and stable for plain objects.\n JSON.stringify(o.encode ?? null),\n ].join('|')\n })\n .join('||')\n}\n\n/**\n * Structural digest of the option's `dataset` array — count is the only\n * thing that needs `replaceMerge` here. Row-level changes are picked up by\n * ECharts' default merge.\n */\nfunction computeDatasetFingerprint(option: echarts.EChartsOption): string {\n const dataset = option.dataset\n if (!Array.isArray(dataset)) return dataset ? '1' : ''\n return String(dataset.length)\n}\n","import { useCallback, useMemo } from 'react'\nimport type * as echarts from 'echarts'\nimport {\n applyTransforms,\n setEchartInstance,\n useWidgetId,\n useWidgetShallow,\n type Transform,\n} from '../stores'\nimport { EchartUI, type EchartsEventHandler } from './echart-ui'\n\n/**\n * Default ECharts `replaceMerge` keys for every widget. `dataZoom` and\n * `brush` are omitted so ZoomToggle / BrushToggle's user-driven runtime\n * state (slider range, brushed areas in `multiple` mode) survives unrelated\n * re-renders. `series` and `dataset` are also omitted: EchartUI fingerprints\n * them per-render and adds them to `replaceMerge` only when their shape\n * actually changes, keeping ECharts' per-series runtime state alive when\n * only callback-style fields differ.\n *\n * Lives in this module (not the generic store) because it's an ECharts\n * concept. Module-private — callers should not need it.\n */\nconst DEFAULT_REPLACE_MERGE: readonly string[] = ['toolbox']\n\n/**\n * Reactive context passed to every {@link OptionFactory} call so the\n * factory can rebuild render-time pieces (axis label / tooltip formatters)\n * from the live store. Drives RelativeData / consumer-formatter changes\n * through to the chart without rebuilding the structural option.\n */\nexport interface OptionFactoryContext {\n formatter?: (value: number) => string\n labelFormatter?: (value: string | number) => string | number\n}\n\n/**\n * The per-widget option factory — a single callable that owns BOTH phases\n * of option construction:\n *\n * - **Structural phase** — when `option == null`, return the theme-aware\n * structural option (tooltip / legend / color palette / series\n * template, optionally merged with a consumer-supplied `optionsOverride`).\n * No data is read. `<Widget.Echart>` calls the factory with\n * `(undefined, undefined)` synchronously during render to derive the\n * structural base; `configTransforms` (Stack/Zoom/Brush) then mutate it\n * in the same render pass.\n * - **Merge phase** — when `option` is defined, fuse `data` into the\n * post-configTransforms option at fusion time. `<Widget.Echart>` calls\n * the factory with `(transformed, data, ctx)` on every render.\n *\n * The two phases share a closure (the factory creator captures `theme`,\n * `formatter`, `labelFormatter`, `seriesNames`, `selection`, `optionsOverride`,\n * …), so structural and merge agree on the same widget configuration.\n *\n * The third arg `ctx` carries the **live** store-side formatters at the\n * call site — distinct from the closure-time formatters because actions\n * like RelativeData can install a percent formatter on the store after\n * the factory was constructed. The merge phase reads from `ctx`; the\n * structural phase typically uses the closure-time values.\n */\nexport type OptionFactory = (\n option: echarts.EChartsOption | undefined,\n data: unknown,\n ctx?: OptionFactoryContext,\n) => echarts.EChartsOption\n\nexport interface EchartProps {\n /**\n * The per-widget {@link OptionFactory}. Required — `<Widget.Echart>`\n * derives the structural option from it (so configTransforms have a base\n * to mutate) and fuses `state.data` into the post-pipeline option at\n * render time. Wrap the factory creator in `useMemo` so its identity is\n * stable across renders.\n */\n optionFactory: OptionFactory\n onEvents?: Record<string, EchartsEventHandler>\n init?: echarts.EChartsInitOpts\n className?: string\n}\n\ninterface EchartSlice {\n data: unknown\n configTransforms: readonly Transform[]\n formatter?: (value: number) => string\n labelFormatter?: (value: string | number) => string | number\n}\n\nconst echartSelector = (s: {\n data: unknown\n configTransforms: readonly Transform[]\n formatter?: (value: number) => string\n labelFormatter?: (value: string | number) => string | number\n}): EchartSlice => ({\n data: s.data,\n configTransforms: s.configTransforms,\n formatter: s.formatter,\n labelFormatter: s.labelFormatter,\n})\n\n/**\n * Stateful Echart bridge — owns the entire ECharts coupling. The whole\n * option pipeline lives here, not in the store:\n *\n * 1. **Structural** — `optionFactory(undefined, undefined)` produces the\n * theme-aware base. Memoized on the factory identity, so the consumer's\n * `useMemo` ID gates the rebuild.\n * 2. **Transformed** — `applyTransforms(structural, configTransforms)`\n * applies any registered configTransforms (Stack/Zoom/Brush) over the\n * structural base. Memoized on `[structural, configTransforms]`.\n * 3. **`replaceMerge`** — derived from the enabled configTransforms'\n * `replaceMergeKeys`, deduped and sorted, seeded with\n * {@link DEFAULT_REPLACE_MERGE}. Memoized on `[configTransforms]` so\n * ECharts sees a stable array reference across non-transform changes.\n * 4. **Merge** — `optionFactory(transformed, data, ctx)` fuses post-\n * pipeline data into the option. Reactive `ctx` carries the live store\n * formatters so RelativeData's percent formatter flows through without\n * a structural rebuild.\n *\n * The `<Widget.Provider>` doesn't know about the factory at all: it stays\n * a renderer-agnostic shell. The `ProviderProps` surface has no ECharts\n * coupling, so non-Echart widgets don't transitively import the type.\n */\nexport function Echart({\n optionFactory,\n onEvents,\n init,\n className,\n}: EchartProps) {\n const id = useWidgetId()\n const slice = useWidgetShallow(id, echartSelector)\n\n // Publish the live ECharts instance to the per-id registry so actions\n // (e.g. `ZoomToggle`'s disable handler) can reach it imperatively. The\n // callback identity is stable across renders (only `id` is in deps), so\n // EchartUI's init effect doesn't see a fresh `onInstance` and re-init.\n const onInstance = useCallback(\n (chart: echarts.ECharts | null) => setEchartInstance(id, chart),\n [id],\n )\n\n // Destructure so React Compiler sees specific deps instead of inferring\n // the whole `slice` object. `useWidgetShallow` already shallow-compares\n // the slice, so per-field deps drive each memo exactly when its inputs\n // change.\n const {\n data: sliceData,\n configTransforms,\n formatter: sliceFormatter,\n labelFormatter: sliceLabelFormatter,\n } = slice\n\n const structural = useMemo(\n () => optionFactory(undefined, undefined),\n [optionFactory],\n )\n\n const transformed = useMemo(\n () =>\n applyTransforms(structural, configTransforms) as echarts.EChartsOption,\n [structural, configTransforms],\n )\n\n const replaceMerge = useMemo(() => {\n const keys = new Set<string>(DEFAULT_REPLACE_MERGE)\n for (const xf of configTransforms) {\n if (xf.enabled && xf.replaceMergeKeys?.length) {\n for (const k of xf.replaceMergeKeys) keys.add(k)\n }\n }\n return Array.from(keys).sort()\n }, [configTransforms])\n\n const option = useMemo(\n () =>\n optionFactory(transformed, sliceData, {\n formatter: sliceFormatter,\n labelFormatter: sliceLabelFormatter,\n }),\n [\n optionFactory,\n transformed,\n sliceData,\n sliceFormatter,\n sliceLabelFormatter,\n ],\n )\n\n return (\n <EchartUI\n option={option}\n replaceMerge={replaceMerge}\n onEvents={onEvents}\n init={init}\n onInstance={onInstance}\n className={className}\n />\n )\n}\n"],"names":["callbacks","Map","observer","getObserver","ResizeObserver","entries","entry","callback","get","target","NOOP_CLEANUP","observeResize","element","ro","set","observe","delete","unobserve","size","disconnect","__resetSharedResizeObserver","clear","styles","root","width","minHeight","DEFAULT_INIT_OPTS","renderer","height","EchartUI","t0","$","_c","option","replaceMerge","onEvents","init","onInstance","className","sx","containerRef","useRef","chartRef","seriesFingerprintRef","datasetFingerprintRef","t1","chart","notifyInstance","useEffectEvent","t2","current","chart_0","echarts","dispose","t3","useEffect","t4","t5","seriesFp","computeSeriesFingerprint","datasetFp","computeDatasetFingerprint","augmented","Set","add","setOption","notMerge","lazyUpdate","Array","from","undefined","t6","t7","Symbol","for","node","resize","t8","t9","chart_1","event","handler","Object","on","event_0","handler_0","off","t10","t11","Box","series","isArray","map","s","String","o","type","datasetIndex","name","stack","JSON","stringify","encode","join","dataset","length","DEFAULT_REPLACE_MERGE","echartSelector","data","configTransforms","formatter","labelFormatter","Echart","optionFactory","id","useWidgetId","slice","useWidgetShallow","setEchartInstance","sliceData","sliceFormatter","sliceLabelFormatter","structural","applyTransforms","transformed","keys","xf","enabled","replaceMergeKeys","k","sort"],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import u from "html2canvas";
2
+ const l = /^[=+\-@\t\r]/;
3
+ function f(t) {
4
+ const o = (n) => {
5
+ if (n == null) return "";
6
+ let e = typeof n == "string" ? n : typeof n == "number" || typeof n == "boolean" ? String(n) : JSON.stringify(n);
7
+ return l.test(e) && (e = `'${e}`), /[",\n\r]/.test(e) ? `"${e.replace(/"/g, '""')}"` : e;
8
+ };
9
+ return t.map((n) => n.map(o).join(",")).join(`
10
+ `);
11
+ }
12
+ function L(t) {
13
+ const o = f(t), n = new Blob([o], {
14
+ type: "text/csv;charset=utf-8;"
15
+ }), e = URL.createObjectURL(n);
16
+ return {
17
+ url: e,
18
+ revoke: () => URL.revokeObjectURL(e)
19
+ };
20
+ }
21
+ const d = /[\\/\x00-\x1f\x7f]/g, p = 200;
22
+ function g(t) {
23
+ return (t ?? "").replace(d, "_").slice(0, p) || "download";
24
+ }
25
+ function R(t) {
26
+ const {
27
+ url: o,
28
+ filename: n
29
+ } = t, e = document.createElement("a");
30
+ e.href = o, e.download = g(n), e.style.display = "none", document.body.appendChild(e), e.click(), e.remove();
31
+ }
32
+ async function b(t) {
33
+ const {
34
+ element: o,
35
+ pixelRatio: n = 2,
36
+ backgroundColor: e = null
37
+ } = t, s = await u(o, {
38
+ scale: n,
39
+ backgroundColor: e,
40
+ useCORS: !0,
41
+ logging: !1
42
+ });
43
+ return new Promise((c, i) => {
44
+ s.toBlob((r) => {
45
+ if (!r) {
46
+ i(new Error("[widgets-v2] toBlob() returned null"));
47
+ return;
48
+ }
49
+ const a = URL.createObjectURL(r);
50
+ c({
51
+ url: a,
52
+ revoke: () => URL.revokeObjectURL(a)
53
+ });
54
+ }, "image/png");
55
+ });
56
+ }
57
+ export {
58
+ L as a,
59
+ R as b,
60
+ b as d,
61
+ f as t
62
+ };
63
+ //# sourceMappingURL=exports-Cx-f6m6U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exports-Cx-f6m6U.js","sources":["../src/widgets-v2/actions/download/exports.ts"],"sourcesContent":["/**\n * Pure download helpers — no React, no DOM lifecycle outside the link click.\n * Component layer in {@link ./download.tsx} orchestrates these.\n */\n\nimport html2canvas from 'html2canvas'\n\nexport interface DownloadHandle {\n url: string\n revoke: () => void\n}\n\n// Leading characters that Excel / Sheets / Numbers interpret as a formula\n// when the CSV is opened. Prefixing the cell with a single quote forces the\n// spreadsheet app to render it as plain text. Tab and CR are included\n// because some tooling strips leading whitespace before formula evaluation.\nconst CSV_FORMULA_PREFIX = /^[=+\\-@\\t\\r]/\n\nexport function toCsvString(rows: readonly (readonly unknown[])[]): string {\n const escape = (cell: unknown): string => {\n if (cell == null) return ''\n let value =\n typeof cell === 'string'\n ? cell\n : typeof cell === 'number' || typeof cell === 'boolean'\n ? String(cell)\n : JSON.stringify(cell)\n if (CSV_FORMULA_PREFIX.test(value)) value = `'${value}`\n if (/[\",\\n\\r]/.test(value)) return `\"${value.replace(/\"/g, '\"\"')}\"`\n return value\n }\n return rows.map((row) => row.map(escape).join(',')).join('\\n')\n}\n\nexport function downloadToCSV(\n rows: readonly (readonly unknown[])[],\n): DownloadHandle {\n const csv = toCsvString(rows)\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n return { url, revoke: () => URL.revokeObjectURL(url) }\n}\n\n// Path separators, NUL, and ASCII control chars. Filenames containing these\n// can confuse the browser download stack and historically enabled\n// Content-Disposition-style trickery.\n// eslint-disable-next-line no-control-regex\nconst UNSAFE_FILENAME_CHARS = /[\\\\/\\x00-\\x1f\\x7f]/g\nconst MAX_FILENAME_LENGTH = 200\n\nexport function sanitizeFilename(name: string): string {\n return (\n (name ?? '')\n .replace(UNSAFE_FILENAME_CHARS, '_')\n .slice(0, MAX_FILENAME_LENGTH) || 'download'\n )\n}\n\n/**\n * Triggers a browser download for the given URL by synthesizing an anchor,\n * clicking it, and removing it. Pure DOM — no React. The filename is run\n * through {@link sanitizeFilename} before being assigned to `a.download`.\n */\nexport function triggerLinkDownload(args: {\n url: string\n filename: string\n}): void {\n const { url, filename } = args\n const a = document.createElement('a')\n a.href = url\n a.download = sanitizeFilename(filename)\n a.style.display = 'none'\n document.body.appendChild(a)\n a.click()\n a.remove()\n}\n\nexport interface DownloadDOMToPNGOptions {\n element: HTMLElement\n /** html2canvas `scale`. Default 2 — crisp on hi-DPI displays. */\n pixelRatio?: number\n /**\n * html2canvas `backgroundColor`. Default `null` (transparent) so the PNG\n * inherits whatever surface it lands on when the user pastes it.\n */\n backgroundColor?: string | null\n}\n\n/**\n * Rasterise an HTMLElement to PNG via `html2canvas` and wrap the result in\n * a `DownloadHandle`. The caller is responsible for calling `handle.revoke`\n * after the link click is dispatched. Used by per-widget download configs\n * to power the PNG menu item.\n */\nexport async function downloadDOMToPNG(\n opts: DownloadDOMToPNGOptions,\n): Promise<DownloadHandle> {\n const { element, pixelRatio = 2, backgroundColor = null } = opts\n const canvas = await html2canvas(element, {\n scale: pixelRatio,\n backgroundColor,\n useCORS: true,\n logging: false,\n })\n return new Promise<DownloadHandle>((resolve, reject) => {\n canvas.toBlob((blob) => {\n if (!blob) {\n reject(new Error('[widgets-v2] toBlob() returned null'))\n return\n }\n const url = URL.createObjectURL(blob)\n resolve({ url, revoke: () => URL.revokeObjectURL(url) })\n }, 'image/png')\n })\n}\n"],"names":["CSV_FORMULA_PREFIX","toCsvString","rows","escape","cell","value","String","JSON","stringify","test","replace","map","row","join","downloadToCSV","csv","blob","Blob","type","url","URL","createObjectURL","revoke","revokeObjectURL","UNSAFE_FILENAME_CHARS","MAX_FILENAME_LENGTH","sanitizeFilename","name","slice","triggerLinkDownload","args","filename","a","document","createElement","href","download","style","display","body","appendChild","click","remove","downloadDOMToPNG","opts","element","pixelRatio","backgroundColor","canvas","html2canvas","scale","useCORS","logging","Promise","resolve","reject","toBlob","Error"],"mappings":";AAgBA,MAAMA,IAAqB;AAEpB,SAASC,EAAYC,GAA+C;AACzE,QAAMC,IAASA,CAACC,MAA0B;AACxC,QAAIA,KAAQ,KAAM,QAAO;AACzB,QAAIC,IACF,OAAOD,KAAS,WACZA,IACA,OAAOA,KAAS,YAAY,OAAOA,KAAS,YAC1CE,OAAOF,CAAI,IACXG,KAAKC,UAAUJ,CAAI;AAE3B,WADIJ,EAAmBS,KAAKJ,CAAK,MAAGA,IAAQ,IAAIA,CAAK,KACjD,WAAWI,KAAKJ,CAAK,IAAU,IAAIA,EAAMK,QAAQ,MAAM,IAAI,CAAC,MACzDL;AAAAA,EACT;AACA,SAAOH,EAAKS,IAAKC,CAAAA,MAAQA,EAAID,IAAIR,CAAM,EAAEU,KAAK,GAAG,CAAC,EAAEA,KAAK;AAAA,CAAI;AAC/D;AAEO,SAASC,EACdZ,GACgB;AAChB,QAAMa,IAAMd,EAAYC,CAAI,GACtBc,IAAO,IAAIC,KAAK,CAACF,CAAG,GAAG;AAAA,IAAEG,MAAM;AAAA,EAAA,CAA2B,GAC1DC,IAAMC,IAAIC,gBAAgBL,CAAI;AACpC,SAAO;AAAA,IAAEG,KAAAA;AAAAA,IAAKG,QAAQA,MAAMF,IAAIG,gBAAgBJ,CAAG;AAAA,EAAA;AACrD;AAMA,MAAMK,IAAwB,uBACxBC,IAAsB;AAErB,SAASC,EAAiBC,GAAsB;AACrD,UACGA,KAAQ,IACNjB,QAAQc,GAAuB,GAAG,EAClCI,MAAM,GAAGH,CAAmB,KAAK;AAExC;AAOO,SAASI,EAAoBC,GAG3B;AACP,QAAM;AAAA,IAAEX,KAAAA;AAAAA,IAAKY,UAAAA;AAAAA,EAAAA,IAAaD,GACpBE,IAAIC,SAASC,cAAc,GAAG;AACpCF,EAAAA,EAAEG,OAAOhB,GACTa,EAAEI,WAAWV,EAAiBK,CAAQ,GACtCC,EAAEK,MAAMC,UAAU,QAClBL,SAASM,KAAKC,YAAYR,CAAC,GAC3BA,EAAES,MAAAA,GACFT,EAAEU,OAAAA;AACJ;AAmBA,eAAsBC,EACpBC,GACyB;AACzB,QAAM;AAAA,IAAEC,SAAAA;AAAAA,IAASC,YAAAA,IAAa;AAAA,IAAGC,iBAAAA,IAAkB;AAAA,EAAA,IAASH,GACtDI,IAAS,MAAMC,EAAYJ,GAAS;AAAA,IACxCK,OAAOJ;AAAAA,IACPC,iBAAAA;AAAAA,IACAI,SAAS;AAAA,IACTC,SAAS;AAAA,EAAA,CACV;AACD,SAAO,IAAIC,QAAwB,CAACC,GAASC,MAAW;AACtDP,IAAAA,EAAOQ,OAAQxC,CAAAA,MAAS;AACtB,UAAI,CAACA,GAAM;AACTuC,QAAAA,EAAO,IAAIE,MAAM,qCAAqC,CAAC;AACvD;AAAA,MACF;AACA,YAAMtC,IAAMC,IAAIC,gBAAgBL,CAAI;AACpCsC,MAAAA,EAAQ;AAAA,QAAEnC,KAAAA;AAAAA,QAAKG,QAAQA,MAAMF,IAAIG,gBAAgBJ,CAAG;AAAA,MAAA,CAAG;AAAA,IACzD,GAAG,WAAW;AAAA,EAChB,CAAC;AACH;"}