@carto/ps-react-ui 4.7.0 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (578) hide show
  1. package/dist/category-DwaeYjpX.js +656 -0
  2. package/dist/category-DwaeYjpX.js.map +1 -0
  3. package/dist/change-column-Cidl_M-4.js +1110 -0
  4. package/dist/change-column-Cidl_M-4.js.map +1 -0
  5. package/dist/data-zoom-layout-BH0LPwSy.js +28 -0
  6. package/dist/data-zoom-layout-BH0LPwSy.js.map +1 -0
  7. package/dist/echart-CU0KmClP.js +176 -0
  8. package/dist/echart-CU0KmClP.js.map +1 -0
  9. package/dist/exports-Cx-f6m6U.js +63 -0
  10. package/dist/exports-Cx-f6m6U.js.map +1 -0
  11. package/dist/formula-DuC0NQLH.js +79 -0
  12. package/dist/formula-DuC0NQLH.js.map +1 -0
  13. package/dist/markdown-BD1jcknS.js +8326 -0
  14. package/dist/markdown-BD1jcknS.js.map +1 -0
  15. package/dist/merge-options-DCkkHZIf.js +34 -0
  16. package/dist/merge-options-DCkkHZIf.js.map +1 -0
  17. package/dist/{styles-BYTyKQFP.js → option-builders-F-c9ELi1.js} +25 -45
  18. package/dist/option-builders-F-c9ELi1.js.map +1 -0
  19. package/dist/png-item-CS4z1iSH.js +45 -0
  20. package/dist/png-item-CS4z1iSH.js.map +1 -0
  21. package/dist/range-DsqTjSpg.js +186 -0
  22. package/dist/range-DsqTjSpg.js.map +1 -0
  23. package/dist/spread-CTuIXZSM.js +67 -0
  24. package/dist/spread-CTuIXZSM.js.map +1 -0
  25. package/dist/style-DVnT6HC1.js +131 -0
  26. package/dist/style-DVnT6HC1.js.map +1 -0
  27. package/dist/styles-cohnxh9F.js +23 -0
  28. package/dist/styles-cohnxh9F.js.map +1 -0
  29. package/dist/table-HIpXuq4G.js +390 -0
  30. package/dist/table-HIpXuq4G.js.map +1 -0
  31. package/dist/transforms-Cdx4fkU5.js +106 -0
  32. package/dist/transforms-Cdx4fkU5.js.map +1 -0
  33. package/dist/types/widgets/echart/utils.test.d.ts +1 -0
  34. package/dist/types/widgets/formula/config.test.d.ts +1 -0
  35. package/dist/types/widgets/stores/widget-store-branches.test.d.ts +1 -0
  36. package/dist/types/widgets/table/config.test.d.ts +1 -0
  37. package/dist/types/widgets-v2/actions/brush-toggle/brush-toggle.d.ts +56 -0
  38. package/dist/types/widgets-v2/actions/brush-toggle/index.d.ts +3 -0
  39. package/dist/types/widgets-v2/actions/brush-toggle/labels.d.ts +5 -0
  40. package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +12 -0
  41. package/dist/types/widgets-v2/actions/brush-toggle/transforms.d.ts +11 -0
  42. package/dist/types/widgets-v2/actions/brush-toggle/transforms.test.d.ts +1 -0
  43. package/dist/types/widgets-v2/actions/change-column/change-column-icon.d.ts +2 -0
  44. package/dist/types/widgets-v2/actions/change-column/change-column.d.ts +29 -0
  45. package/dist/types/widgets-v2/actions/change-column/index.d.ts +3 -0
  46. package/dist/types/widgets-v2/actions/change-column/labels.d.ts +5 -0
  47. package/dist/types/widgets-v2/actions/change-column/sortable-column-item.d.ts +14 -0
  48. package/dist/types/widgets-v2/actions/change-column/style.d.ts +33 -0
  49. package/dist/types/widgets-v2/actions/change-column/types.d.ts +10 -0
  50. package/dist/types/widgets-v2/actions/download/download.d.ts +18 -0
  51. package/dist/types/widgets-v2/actions/download/exports.d.ts +37 -0
  52. package/dist/types/widgets-v2/actions/download/icons.d.ts +12 -0
  53. package/dist/types/widgets-v2/actions/download/index.d.ts +6 -0
  54. package/dist/types/widgets-v2/actions/download/labels.d.ts +11 -0
  55. package/dist/types/widgets-v2/actions/download/png-item.d.ts +24 -0
  56. package/dist/types/widgets-v2/actions/download/style.d.ts +1 -0
  57. package/dist/types/widgets-v2/actions/download/types.d.ts +35 -0
  58. package/dist/types/widgets-v2/actions/fullscreen/fullscreen.d.ts +59 -0
  59. package/dist/types/widgets-v2/actions/fullscreen/index.d.ts +3 -0
  60. package/dist/types/widgets-v2/actions/fullscreen/labels.d.ts +5 -0
  61. package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +48 -0
  62. package/dist/types/widgets-v2/actions/fullscreen/types.d.ts +14 -0
  63. package/dist/types/widgets-v2/actions/index.d.ts +9 -0
  64. package/dist/types/widgets-v2/actions/lock-selection/index.d.ts +3 -0
  65. package/dist/types/widgets-v2/actions/lock-selection/labels.d.ts +6 -0
  66. package/dist/types/widgets-v2/actions/lock-selection/lock-selection.d.ts +36 -0
  67. package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +12 -0
  68. package/dist/types/widgets-v2/actions/lock-selection/transforms.d.ts +6 -0
  69. package/dist/types/widgets-v2/actions/relative-data/index.d.ts +3 -0
  70. package/dist/types/widgets-v2/actions/relative-data/labels.d.ts +5 -0
  71. package/dist/types/widgets-v2/actions/relative-data/relative-data.d.ts +39 -0
  72. package/dist/types/widgets-v2/actions/relative-data/style.d.ts +12 -0
  73. package/dist/types/widgets-v2/actions/relative-data/transforms.d.ts +30 -0
  74. package/dist/types/widgets-v2/actions/relative-data/transforms.test.d.ts +1 -0
  75. package/dist/types/widgets-v2/actions/searcher/filter.d.ts +6 -0
  76. package/dist/types/widgets-v2/actions/searcher/index.d.ts +4 -0
  77. package/dist/types/widgets-v2/actions/searcher/labels.d.ts +7 -0
  78. package/dist/types/widgets-v2/actions/searcher/searcher-toggle.d.ts +23 -0
  79. package/dist/types/widgets-v2/actions/searcher/searcher.d.ts +11 -0
  80. package/dist/types/widgets-v2/actions/searcher/style.d.ts +16 -0
  81. package/dist/types/widgets-v2/actions/stack-toggle/index.d.ts +3 -0
  82. package/dist/types/widgets-v2/actions/stack-toggle/labels.d.ts +5 -0
  83. package/dist/types/widgets-v2/actions/stack-toggle/stack-toggle.d.ts +10 -0
  84. package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +12 -0
  85. package/dist/types/widgets-v2/actions/stack-toggle/transforms.d.ts +13 -0
  86. package/dist/types/widgets-v2/actions/stack-toggle/transforms.test.d.ts +1 -0
  87. package/dist/types/widgets-v2/actions/zoom-toggle/index.d.ts +3 -0
  88. package/dist/types/widgets-v2/actions/zoom-toggle/labels.d.ts +5 -0
  89. package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +12 -0
  90. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.d.ts +51 -0
  91. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.test.d.ts +1 -0
  92. package/dist/types/widgets-v2/actions/zoom-toggle/zoom-toggle.d.ts +35 -0
  93. package/dist/types/widgets-v2/bar/download.d.ts +24 -0
  94. package/dist/types/widgets-v2/bar/index.d.ts +4 -0
  95. package/dist/types/widgets-v2/bar/options.d.ts +43 -0
  96. package/dist/types/widgets-v2/bar/options.test.d.ts +1 -0
  97. package/dist/types/widgets-v2/bar/skeleton.d.ts +6 -0
  98. package/dist/types/widgets-v2/bar/types.d.ts +41 -0
  99. package/dist/types/widgets-v2/category/category-ui.d.ts +81 -0
  100. package/dist/types/widgets-v2/category/category.d.ts +48 -0
  101. package/dist/types/widgets-v2/category/components/category-bar-stacked.d.ts +28 -0
  102. package/dist/types/widgets-v2/category/components/category-bar.d.ts +23 -0
  103. package/dist/types/widgets-v2/category/components/category-legend.d.ts +18 -0
  104. package/dist/types/widgets-v2/category/components/category-row-multi.d.ts +31 -0
  105. package/dist/types/widgets-v2/category/components/category-row-other.d.ts +13 -0
  106. package/dist/types/widgets-v2/category/components/category-row-single.d.ts +28 -0
  107. package/dist/types/widgets-v2/category/components/category-row-stacked.d.ts +38 -0
  108. package/dist/types/widgets-v2/category/download.d.ts +16 -0
  109. package/dist/types/widgets-v2/category/download.test.d.ts +1 -0
  110. package/dist/types/widgets-v2/category/index.d.ts +10 -0
  111. package/dist/types/widgets-v2/category/skeleton.d.ts +11 -0
  112. package/dist/types/widgets-v2/category/style.d.ts +166 -0
  113. package/dist/types/widgets-v2/category/types.d.ts +49 -0
  114. package/dist/types/widgets-v2/echart/echart-ui.d.ts +44 -0
  115. package/dist/types/widgets-v2/echart/echart.d.ts +75 -0
  116. package/dist/types/widgets-v2/echart/index.d.ts +4 -0
  117. package/dist/types/widgets-v2/echart/shared-resize-observer.d.ts +5 -0
  118. package/dist/types/widgets-v2/echart/shared-resize-observer.test.d.ts +1 -0
  119. package/dist/types/widgets-v2/echart/style.d.ts +6 -0
  120. package/dist/types/widgets-v2/echart/use-chart-selection.d.ts +51 -0
  121. package/dist/types/widgets-v2/formula/delta.d.ts +22 -0
  122. package/dist/types/widgets-v2/formula/download.d.ts +20 -0
  123. package/dist/types/widgets-v2/formula/formula-ui.d.ts +20 -0
  124. package/dist/types/widgets-v2/formula/formula.d.ts +8 -0
  125. package/dist/types/widgets-v2/formula/index.d.ts +11 -0
  126. package/dist/types/widgets-v2/formula/note.d.ts +11 -0
  127. package/dist/types/widgets-v2/formula/prefix.d.ts +12 -0
  128. package/dist/types/widgets-v2/formula/series.d.ts +16 -0
  129. package/dist/types/widgets-v2/formula/skeleton.d.ts +4 -0
  130. package/dist/types/widgets-v2/formula/style.d.ts +29 -0
  131. package/dist/types/widgets-v2/formula/suffix.d.ts +12 -0
  132. package/dist/types/widgets-v2/formula/types.d.ts +40 -0
  133. package/dist/types/widgets-v2/formula/value.d.ts +14 -0
  134. package/dist/types/widgets-v2/histogram/download.d.ts +17 -0
  135. package/dist/types/widgets-v2/histogram/download.test.d.ts +1 -0
  136. package/dist/types/widgets-v2/histogram/index.d.ts +5 -0
  137. package/dist/types/widgets-v2/histogram/options.d.ts +42 -0
  138. package/dist/types/widgets-v2/histogram/options.test.d.ts +1 -0
  139. package/dist/types/widgets-v2/histogram/skeleton.d.ts +9 -0
  140. package/dist/types/widgets-v2/histogram/transforms.d.ts +17 -0
  141. package/dist/types/widgets-v2/histogram/transforms.test.d.ts +1 -0
  142. package/dist/types/widgets-v2/histogram/types.d.ts +47 -0
  143. package/dist/types/widgets-v2/index.d.ts +107 -0
  144. package/dist/types/widgets-v2/markdown/download.d.ts +16 -0
  145. package/dist/types/widgets-v2/markdown/download.test.d.ts +1 -0
  146. package/dist/types/widgets-v2/markdown/index.d.ts +6 -0
  147. package/dist/types/widgets-v2/markdown/markdown-content.d.ts +34 -0
  148. package/dist/types/widgets-v2/markdown/markdown-ui.d.ts +12 -0
  149. package/dist/types/widgets-v2/markdown/markdown.d.ts +6 -0
  150. package/dist/types/widgets-v2/markdown/skeleton.d.ts +4 -0
  151. package/dist/types/widgets-v2/markdown/style.d.ts +61 -0
  152. package/dist/types/widgets-v2/markdown/types.d.ts +4 -0
  153. package/dist/types/widgets-v2/note/labels.d.ts +5 -0
  154. package/dist/types/widgets-v2/note/style.d.ts +26 -0
  155. package/dist/types/widgets-v2/note/widget-note.d.ts +46 -0
  156. package/dist/types/widgets-v2/pie/download.d.ts +17 -0
  157. package/dist/types/widgets-v2/pie/download.test.d.ts +1 -0
  158. package/dist/types/widgets-v2/pie/index.d.ts +4 -0
  159. package/dist/types/widgets-v2/pie/options.d.ts +35 -0
  160. package/dist/types/widgets-v2/pie/options.test.d.ts +1 -0
  161. package/dist/types/widgets-v2/pie/skeleton.d.ts +4 -0
  162. package/dist/types/widgets-v2/pie/types.d.ts +50 -0
  163. package/dist/types/widgets-v2/provider/widget-provider.d.ts +32 -0
  164. package/dist/types/widgets-v2/range/index.d.ts +4 -0
  165. package/dist/types/widgets-v2/range/range-ui.d.ts +19 -0
  166. package/dist/types/widgets-v2/range/range.d.ts +19 -0
  167. package/dist/types/widgets-v2/range/skeleton.d.ts +9 -0
  168. package/dist/types/widgets-v2/range/style.d.ts +40 -0
  169. package/dist/types/widgets-v2/range/types.d.ts +37 -0
  170. package/dist/types/widgets-v2/scatterplot/download.d.ts +16 -0
  171. package/dist/types/widgets-v2/scatterplot/download.test.d.ts +1 -0
  172. package/dist/types/widgets-v2/scatterplot/index.d.ts +5 -0
  173. package/dist/types/widgets-v2/scatterplot/options.d.ts +42 -0
  174. package/dist/types/widgets-v2/scatterplot/options.test.d.ts +1 -0
  175. package/dist/types/widgets-v2/scatterplot/skeleton.d.ts +12 -0
  176. package/dist/types/widgets-v2/scatterplot/transforms.d.ts +17 -0
  177. package/dist/types/widgets-v2/scatterplot/transforms.test.d.ts +1 -0
  178. package/dist/types/widgets-v2/scatterplot/types.d.ts +50 -0
  179. package/dist/types/widgets-v2/selection-summary/labels.d.ts +6 -0
  180. package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +22 -0
  181. package/dist/types/widgets-v2/selection-summary/style.d.ts +23 -0
  182. package/dist/types/widgets-v2/spread/download.d.ts +15 -0
  183. package/dist/types/widgets-v2/spread/download.test.d.ts +1 -0
  184. package/dist/types/widgets-v2/spread/index.d.ts +6 -0
  185. package/dist/types/widgets-v2/spread/separator.d.ts +7 -0
  186. package/dist/types/widgets-v2/spread/skeleton.d.ts +9 -0
  187. package/dist/types/widgets-v2/spread/spread-ui.d.ts +18 -0
  188. package/dist/types/widgets-v2/spread/spread.d.ts +5 -0
  189. package/dist/types/widgets-v2/spread/types.d.ts +25 -0
  190. package/dist/types/widgets-v2/state/labels.d.ts +7 -0
  191. package/dist/types/widgets-v2/state/labels.test.d.ts +1 -0
  192. package/dist/types/widgets-v2/state/style.d.ts +19 -0
  193. package/dist/types/widgets-v2/state/widget-state.d.ts +19 -0
  194. package/dist/types/widgets-v2/stores/index.d.ts +8 -0
  195. package/dist/types/widgets-v2/stores/pipeline-middleware.d.ts +5 -0
  196. package/dist/types/widgets-v2/stores/pipeline-middleware.test.d.ts +1 -0
  197. package/dist/types/widgets-v2/stores/transforms.d.ts +4 -0
  198. package/dist/types/widgets-v2/stores/transforms.test.d.ts +1 -0
  199. package/dist/types/widgets-v2/stores/types.d.ts +55 -0
  200. package/dist/types/widgets-v2/stores/use-echart-instance.d.ts +15 -0
  201. package/dist/types/widgets-v2/stores/use-transform-enabled.d.ts +17 -0
  202. package/dist/types/widgets-v2/stores/use-transform.d.ts +12 -0
  203. package/dist/types/widgets-v2/stores/widget-context.d.ts +2 -0
  204. package/dist/types/widgets-v2/stores/widget-store-registry.d.ts +74 -0
  205. package/dist/types/widgets-v2/stores/widget-store-registry.test.d.ts +1 -0
  206. package/dist/types/widgets-v2/subheader/style.d.ts +10 -0
  207. package/dist/types/widgets-v2/subheader/subheader.d.ts +11 -0
  208. package/dist/types/widgets-v2/table/download.d.ts +18 -0
  209. package/dist/types/widgets-v2/table/download.test.d.ts +1 -0
  210. package/dist/types/widgets-v2/table/helpers.d.ts +32 -0
  211. package/dist/types/widgets-v2/table/helpers.test.d.ts +1 -0
  212. package/dist/types/widgets-v2/table/index.d.ts +7 -0
  213. package/dist/types/widgets-v2/table/labels.d.ts +22 -0
  214. package/dist/types/widgets-v2/table/skeleton.d.ts +22 -0
  215. package/dist/types/widgets-v2/table/style.d.ts +44 -0
  216. package/dist/types/widgets-v2/table/table-ui.d.ts +38 -0
  217. package/dist/types/widgets-v2/table/table.d.ts +50 -0
  218. package/dist/types/widgets-v2/table/types.d.ts +37 -0
  219. package/dist/types/widgets-v2/test-utils.d.ts +52 -0
  220. package/dist/types/widgets-v2/timeseries/download.d.ts +17 -0
  221. package/dist/types/widgets-v2/timeseries/download.test.d.ts +1 -0
  222. package/dist/types/widgets-v2/timeseries/index.d.ts +4 -0
  223. package/dist/types/widgets-v2/timeseries/options.d.ts +39 -0
  224. package/dist/types/widgets-v2/timeseries/options.test.d.ts +1 -0
  225. package/dist/types/widgets-v2/timeseries/skeleton.d.ts +8 -0
  226. package/dist/types/widgets-v2/timeseries/types.d.ts +56 -0
  227. package/dist/types/widgets-v2/toolbox/labels.d.ts +5 -0
  228. package/dist/types/widgets-v2/toolbox/style.d.ts +30 -0
  229. package/dist/types/widgets-v2/toolbox/toolbox.d.ts +49 -0
  230. package/dist/types/widgets-v2/utils/data-zoom-layout.d.ts +11 -0
  231. package/dist/types/widgets-v2/utils/index.d.ts +2 -0
  232. package/dist/types/widgets-v2/utils/merge-options.d.ts +12 -0
  233. package/dist/types/widgets-v2/utils/merge-options.test.d.ts +1 -0
  234. package/dist/types/widgets-v2/wrapper/index.d.ts +4 -0
  235. package/dist/types/widgets-v2/wrapper/labels.d.ts +6 -0
  236. package/dist/types/widgets-v2/wrapper/style.d.ts +111 -0
  237. package/dist/types/widgets-v2/wrapper/widget-actions.d.ts +22 -0
  238. package/dist/types/widgets-v2/wrapper/widget-content.d.ts +12 -0
  239. package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +51 -0
  240. package/dist/use-transform-DXPN3nY7.js +110 -0
  241. package/dist/use-transform-DXPN3nY7.js.map +1 -0
  242. package/dist/widget-context-DTGO0Yta.js +13 -0
  243. package/dist/widget-context-DTGO0Yta.js.map +1 -0
  244. package/dist/widget-store-registry-_W4Z4xp-.js +178 -0
  245. package/dist/widget-store-registry-_W4Z4xp-.js.map +1 -0
  246. package/dist/widgets/actions.js +688 -668
  247. package/dist/widgets/actions.js.map +1 -1
  248. package/dist/widgets/bar.js +14 -13
  249. package/dist/widgets/bar.js.map +1 -1
  250. package/dist/widgets/histogram.js +38 -37
  251. package/dist/widgets/histogram.js.map +1 -1
  252. package/dist/widgets/pie.js +19 -18
  253. package/dist/widgets/pie.js.map +1 -1
  254. package/dist/widgets/scatterplot.js +8 -7
  255. package/dist/widgets/scatterplot.js.map +1 -1
  256. package/dist/widgets/timeseries.js +11 -10
  257. package/dist/widgets/timeseries.js.map +1 -1
  258. package/dist/widgets/utils.js +8 -7
  259. package/dist/widgets/utils.js.map +1 -1
  260. package/dist/widgets-v2/actions.js +43 -0
  261. package/dist/widgets-v2/actions.js.map +1 -0
  262. package/dist/widgets-v2/bar.js +327 -0
  263. package/dist/widgets-v2/bar.js.map +1 -0
  264. package/dist/widgets-v2/category.js +104 -0
  265. package/dist/widgets-v2/category.js.map +1 -0
  266. package/dist/widgets-v2/echart.js +57 -0
  267. package/dist/widgets-v2/echart.js.map +1 -0
  268. package/dist/widgets-v2/formula.js +74 -0
  269. package/dist/widgets-v2/formula.js.map +1 -0
  270. package/dist/widgets-v2/histogram.js +350 -0
  271. package/dist/widgets-v2/histogram.js.map +1 -0
  272. package/dist/widgets-v2/markdown.js +68 -0
  273. package/dist/widgets-v2/markdown.js.map +1 -0
  274. package/dist/widgets-v2/pie.js +381 -0
  275. package/dist/widgets-v2/pie.js.map +1 -0
  276. package/dist/widgets-v2/range.js +52 -0
  277. package/dist/widgets-v2/range.js.map +1 -0
  278. package/dist/widgets-v2/scatterplot.js +405 -0
  279. package/dist/widgets-v2/scatterplot.js.map +1 -0
  280. package/dist/widgets-v2/spread.js +72 -0
  281. package/dist/widgets-v2/spread.js.map +1 -0
  282. package/dist/widgets-v2/stores.js +42 -0
  283. package/dist/widgets-v2/stores.js.map +1 -0
  284. package/dist/widgets-v2/table.js +78 -0
  285. package/dist/widgets-v2/table.js.map +1 -0
  286. package/dist/widgets-v2/timeseries.js +352 -0
  287. package/dist/widgets-v2/timeseries.js.map +1 -0
  288. package/dist/widgets-v2/utils.js +7 -0
  289. package/dist/widgets-v2/utils.js.map +1 -0
  290. package/dist/widgets-v2.js +953 -0
  291. package/dist/widgets-v2.js.map +1 -0
  292. package/package.json +73 -5
  293. package/src/components/lasso-tool/chip.test.tsx +176 -0
  294. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +171 -0
  295. package/src/components/lasso-tool/lasso-tool.test.tsx +198 -0
  296. package/src/components/list-data/list-data.test.tsx +73 -0
  297. package/src/components/no-data-alert/no-data-alert.test.tsx +38 -0
  298. package/src/components/responsive-drawer/responsive-drawer.test.tsx +68 -0
  299. package/src/widgets/actions/brush-toggle/brush-overlay.test.tsx +465 -0
  300. package/src/widgets/actions/brush-toggle/brush-overlay.tsx +24 -2
  301. package/src/widgets/actions/brush-toggle/brush-toggle.test.tsx +208 -0
  302. package/src/widgets/actions/change-column/change-column-dnd.test.tsx +193 -0
  303. package/src/widgets/actions/change-column/sortable-column-item.test.tsx +124 -0
  304. package/src/widgets/actions/zoom-toggle/zoom-toggle.test.tsx +322 -0
  305. package/src/widgets/category/components/category-rows.test.tsx +213 -0
  306. package/src/widgets/echart/utils.test.ts +277 -0
  307. package/src/widgets/formula/config.test.ts +37 -0
  308. package/src/widgets/histogram/config.ts +1 -3
  309. package/src/widgets/range/components/range-item.test.tsx +243 -0
  310. package/src/widgets/stores/widget-store-branches.test.ts +275 -0
  311. package/src/widgets/table/config.test.ts +65 -0
  312. package/src/widgets/utils/chart-config/option-builders.test.ts +188 -0
  313. package/src/widgets-v2/PERFORMANCE.md +189 -0
  314. package/src/widgets-v2/actions/brush-toggle/brush-toggle.test.tsx +180 -0
  315. package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +154 -0
  316. package/src/widgets-v2/actions/brush-toggle/index.ts +3 -0
  317. package/src/widgets-v2/actions/brush-toggle/labels.ts +9 -0
  318. package/src/widgets-v2/actions/brush-toggle/style.ts +11 -0
  319. package/src/widgets-v2/actions/brush-toggle/transforms.test.ts +47 -0
  320. package/src/widgets-v2/actions/brush-toggle/transforms.ts +31 -0
  321. package/src/widgets-v2/actions/change-column/change-column-icon.tsx +14 -0
  322. package/src/widgets-v2/actions/change-column/change-column.test.tsx +59 -0
  323. package/src/widgets-v2/actions/change-column/change-column.tsx +180 -0
  324. package/src/widgets-v2/actions/change-column/index.ts +7 -0
  325. package/src/widgets-v2/actions/change-column/labels.ts +9 -0
  326. package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +56 -0
  327. package/src/widgets-v2/actions/change-column/style.ts +32 -0
  328. package/src/widgets-v2/actions/change-column/types.ts +11 -0
  329. package/src/widgets-v2/actions/download/download.test.tsx +327 -0
  330. package/src/widgets-v2/actions/download/download.tsx +144 -0
  331. package/src/widgets-v2/actions/download/exports.test.tsx +198 -0
  332. package/src/widgets-v2/actions/download/exports.ts +115 -0
  333. package/src/widgets-v2/actions/download/icons.tsx +26 -0
  334. package/src/widgets-v2/actions/download/index.ts +13 -0
  335. package/src/widgets-v2/actions/download/labels.ts +16 -0
  336. package/src/widgets-v2/actions/download/png-item.test.tsx +72 -0
  337. package/src/widgets-v2/actions/download/png-item.tsx +52 -0
  338. package/src/widgets-v2/actions/download/style.ts +3 -0
  339. package/src/widgets-v2/actions/download/types.ts +32 -0
  340. package/src/widgets-v2/actions/fullscreen/fullscreen.test.tsx +150 -0
  341. package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +230 -0
  342. package/src/widgets-v2/actions/fullscreen/index.ts +7 -0
  343. package/src/widgets-v2/actions/fullscreen/labels.ts +9 -0
  344. package/src/widgets-v2/actions/fullscreen/style.ts +59 -0
  345. package/src/widgets-v2/actions/fullscreen/types.ts +15 -0
  346. package/src/widgets-v2/actions/index.ts +82 -0
  347. package/src/widgets-v2/actions/lock-selection/index.ts +10 -0
  348. package/src/widgets-v2/actions/lock-selection/labels.ts +11 -0
  349. package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +187 -0
  350. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +130 -0
  351. package/src/widgets-v2/actions/lock-selection/style.ts +11 -0
  352. package/src/widgets-v2/actions/lock-selection/transforms.ts +27 -0
  353. package/src/widgets-v2/actions/relative-data/index.ts +3 -0
  354. package/src/widgets-v2/actions/relative-data/labels.ts +9 -0
  355. package/src/widgets-v2/actions/relative-data/relative-data.test.tsx +71 -0
  356. package/src/widgets-v2/actions/relative-data/relative-data.tsx +107 -0
  357. package/src/widgets-v2/actions/relative-data/style.ts +11 -0
  358. package/src/widgets-v2/actions/relative-data/transforms.test.ts +151 -0
  359. package/src/widgets-v2/actions/relative-data/transforms.ts +70 -0
  360. package/src/widgets-v2/actions/searcher/filter.ts +28 -0
  361. package/src/widgets-v2/actions/searcher/index.ts +8 -0
  362. package/src/widgets-v2/actions/searcher/labels.ts +13 -0
  363. package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +91 -0
  364. package/src/widgets-v2/actions/searcher/searcher.test.tsx +92 -0
  365. package/src/widgets-v2/actions/searcher/searcher.tsx +112 -0
  366. package/src/widgets-v2/actions/searcher/style.ts +15 -0
  367. package/src/widgets-v2/actions/stack-toggle/index.ts +3 -0
  368. package/src/widgets-v2/actions/stack-toggle/labels.ts +9 -0
  369. package/src/widgets-v2/actions/stack-toggle/stack-toggle.test.tsx +61 -0
  370. package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +54 -0
  371. package/src/widgets-v2/actions/stack-toggle/style.ts +11 -0
  372. package/src/widgets-v2/actions/stack-toggle/transforms.test.ts +43 -0
  373. package/src/widgets-v2/actions/stack-toggle/transforms.ts +25 -0
  374. package/src/widgets-v2/actions/zoom-toggle/index.ts +9 -0
  375. package/src/widgets-v2/actions/zoom-toggle/labels.ts +9 -0
  376. package/src/widgets-v2/actions/zoom-toggle/style.ts +11 -0
  377. package/src/widgets-v2/actions/zoom-toggle/transforms.test.ts +148 -0
  378. package/src/widgets-v2/actions/zoom-toggle/transforms.ts +171 -0
  379. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.test.tsx +107 -0
  380. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +106 -0
  381. package/src/widgets-v2/bar/download.test.tsx +91 -0
  382. package/src/widgets-v2/bar/download.tsx +66 -0
  383. package/src/widgets-v2/bar/index.ts +10 -0
  384. package/src/widgets-v2/bar/options.test.ts +317 -0
  385. package/src/widgets-v2/bar/options.ts +326 -0
  386. package/src/widgets-v2/bar/skeleton.test.tsx +19 -0
  387. package/src/widgets-v2/bar/skeleton.tsx +69 -0
  388. package/src/widgets-v2/bar/types.ts +46 -0
  389. package/src/widgets-v2/category/category-ui.test.tsx +746 -0
  390. package/src/widgets-v2/category/category-ui.tsx +389 -0
  391. package/src/widgets-v2/category/category.relative-data.test.tsx +107 -0
  392. package/src/widgets-v2/category/category.stack-toggle.test.tsx +85 -0
  393. package/src/widgets-v2/category/category.test.tsx +305 -0
  394. package/src/widgets-v2/category/category.tsx +121 -0
  395. package/src/widgets-v2/category/components/category-bar-stacked.test.tsx +121 -0
  396. package/src/widgets-v2/category/components/category-bar-stacked.tsx +73 -0
  397. package/src/widgets-v2/category/components/category-bar.test.tsx +64 -0
  398. package/src/widgets-v2/category/components/category-bar.tsx +49 -0
  399. package/src/widgets-v2/category/components/category-legend.test.tsx +51 -0
  400. package/src/widgets-v2/category/components/category-legend.tsx +39 -0
  401. package/src/widgets-v2/category/components/category-row-multi.tsx +86 -0
  402. package/src/widgets-v2/category/components/category-row-other.test.tsx +28 -0
  403. package/src/widgets-v2/category/components/category-row-other.tsx +33 -0
  404. package/src/widgets-v2/category/components/category-row-single.tsx +76 -0
  405. package/src/widgets-v2/category/components/category-row-stacked.test.tsx +244 -0
  406. package/src/widgets-v2/category/components/category-row-stacked.tsx +99 -0
  407. package/src/widgets-v2/category/download.test.ts +71 -0
  408. package/src/widgets-v2/category/download.ts +54 -0
  409. package/src/widgets-v2/category/index.ts +32 -0
  410. package/src/widgets-v2/category/skeleton.test.tsx +26 -0
  411. package/src/widgets-v2/category/skeleton.tsx +74 -0
  412. package/src/widgets-v2/category/style.ts +290 -0
  413. package/src/widgets-v2/category/types.ts +54 -0
  414. package/src/widgets-v2/echart/echart-ui.test.tsx +232 -0
  415. package/src/widgets-v2/echart/echart-ui.tsx +184 -0
  416. package/src/widgets-v2/echart/echart.test.tsx +229 -0
  417. package/src/widgets-v2/echart/echart.tsx +199 -0
  418. package/src/widgets-v2/echart/index.ts +22 -0
  419. package/src/widgets-v2/echart/shared-resize-observer.test.ts +91 -0
  420. package/src/widgets-v2/echart/shared-resize-observer.ts +56 -0
  421. package/src/widgets-v2/echart/style.ts +8 -0
  422. package/src/widgets-v2/echart/use-chart-selection.test.tsx +118 -0
  423. package/src/widgets-v2/echart/use-chart-selection.ts +115 -0
  424. package/src/widgets-v2/formula/delta.tsx +61 -0
  425. package/src/widgets-v2/formula/download.test.tsx +65 -0
  426. package/src/widgets-v2/formula/download.tsx +69 -0
  427. package/src/widgets-v2/formula/formula-ui.test.tsx +91 -0
  428. package/src/widgets-v2/formula/formula-ui.tsx +66 -0
  429. package/src/widgets-v2/formula/formula.test.tsx +50 -0
  430. package/src/widgets-v2/formula/formula.tsx +34 -0
  431. package/src/widgets-v2/formula/index.ts +17 -0
  432. package/src/widgets-v2/formula/note.tsx +25 -0
  433. package/src/widgets-v2/formula/prefix.tsx +25 -0
  434. package/src/widgets-v2/formula/series.tsx +67 -0
  435. package/src/widgets-v2/formula/skeleton.test.tsx +21 -0
  436. package/src/widgets-v2/formula/skeleton.tsx +27 -0
  437. package/src/widgets-v2/formula/style.ts +31 -0
  438. package/src/widgets-v2/formula/subcomponents.test.tsx +107 -0
  439. package/src/widgets-v2/formula/suffix.tsx +25 -0
  440. package/src/widgets-v2/formula/types.ts +44 -0
  441. package/src/widgets-v2/formula/value.tsx +31 -0
  442. package/src/widgets-v2/histogram/download.test.ts +94 -0
  443. package/src/widgets-v2/histogram/download.ts +60 -0
  444. package/src/widgets-v2/histogram/index.ts +10 -0
  445. package/src/widgets-v2/histogram/options.test.ts +304 -0
  446. package/src/widgets-v2/histogram/options.ts +337 -0
  447. package/src/widgets-v2/histogram/skeleton.test.tsx +16 -0
  448. package/src/widgets-v2/histogram/skeleton.tsx +70 -0
  449. package/src/widgets-v2/histogram/transforms.test.ts +46 -0
  450. package/src/widgets-v2/histogram/transforms.ts +30 -0
  451. package/src/widgets-v2/histogram/types.ts +51 -0
  452. package/src/widgets-v2/index.ts +201 -0
  453. package/src/widgets-v2/markdown/download.test.ts +66 -0
  454. package/src/widgets-v2/markdown/download.ts +53 -0
  455. package/src/widgets-v2/markdown/index.ts +6 -0
  456. package/src/widgets-v2/markdown/markdown-content.test.tsx +155 -0
  457. package/src/widgets-v2/markdown/markdown-content.tsx +72 -0
  458. package/src/widgets-v2/markdown/markdown-ui.test.tsx +75 -0
  459. package/src/widgets-v2/markdown/markdown-ui.tsx +55 -0
  460. package/src/widgets-v2/markdown/markdown.test.tsx +39 -0
  461. package/src/widgets-v2/markdown/markdown.tsx +17 -0
  462. package/src/widgets-v2/markdown/skeleton.test.tsx +15 -0
  463. package/src/widgets-v2/markdown/skeleton.tsx +32 -0
  464. package/src/widgets-v2/markdown/style.ts +53 -0
  465. package/src/widgets-v2/markdown/types.ts +4 -0
  466. package/src/widgets-v2/note/labels.ts +9 -0
  467. package/src/widgets-v2/note/style.ts +26 -0
  468. package/src/widgets-v2/note/widget-note.test.tsx +158 -0
  469. package/src/widgets-v2/note/widget-note.tsx +172 -0
  470. package/src/widgets-v2/pie/download.test.ts +78 -0
  471. package/src/widgets-v2/pie/download.ts +55 -0
  472. package/src/widgets-v2/pie/index.ts +10 -0
  473. package/src/widgets-v2/pie/options.test.ts +585 -0
  474. package/src/widgets-v2/pie/options.ts +509 -0
  475. package/src/widgets-v2/pie/skeleton.test.tsx +17 -0
  476. package/src/widgets-v2/pie/skeleton.tsx +32 -0
  477. package/src/widgets-v2/pie/types.ts +55 -0
  478. package/src/widgets-v2/provider/widget-provider.test.tsx +119 -0
  479. package/src/widgets-v2/provider/widget-provider.tsx +111 -0
  480. package/src/widgets-v2/range/index.ts +4 -0
  481. package/src/widgets-v2/range/range-ui.test.tsx +130 -0
  482. package/src/widgets-v2/range/range-ui.tsx +211 -0
  483. package/src/widgets-v2/range/range.test.tsx +68 -0
  484. package/src/widgets-v2/range/range.tsx +46 -0
  485. package/src/widgets-v2/range/skeleton.test.tsx +17 -0
  486. package/src/widgets-v2/range/skeleton.tsx +47 -0
  487. package/src/widgets-v2/range/style.ts +41 -0
  488. package/src/widgets-v2/range/types.ts +37 -0
  489. package/src/widgets-v2/scatterplot/download.test.ts +71 -0
  490. package/src/widgets-v2/scatterplot/download.ts +54 -0
  491. package/src/widgets-v2/scatterplot/index.ts +11 -0
  492. package/src/widgets-v2/scatterplot/options.test.ts +399 -0
  493. package/src/widgets-v2/scatterplot/options.ts +421 -0
  494. package/src/widgets-v2/scatterplot/skeleton.test.tsx +17 -0
  495. package/src/widgets-v2/scatterplot/skeleton.tsx +84 -0
  496. package/src/widgets-v2/scatterplot/transforms.test.ts +97 -0
  497. package/src/widgets-v2/scatterplot/transforms.ts +38 -0
  498. package/src/widgets-v2/scatterplot/types.ts +55 -0
  499. package/src/widgets-v2/selection-summary/labels.ts +11 -0
  500. package/src/widgets-v2/selection-summary/selection-summary.test.tsx +53 -0
  501. package/src/widgets-v2/selection-summary/selection-summary.tsx +62 -0
  502. package/src/widgets-v2/selection-summary/style.ts +23 -0
  503. package/src/widgets-v2/spread/download.test.ts +64 -0
  504. package/src/widgets-v2/spread/download.ts +59 -0
  505. package/src/widgets-v2/spread/index.ts +6 -0
  506. package/src/widgets-v2/spread/separator.tsx +11 -0
  507. package/src/widgets-v2/spread/skeleton.test.tsx +17 -0
  508. package/src/widgets-v2/spread/skeleton.tsx +38 -0
  509. package/src/widgets-v2/spread/spread-ui.test.tsx +108 -0
  510. package/src/widgets-v2/spread/spread-ui.tsx +52 -0
  511. package/src/widgets-v2/spread/spread.test.tsx +50 -0
  512. package/src/widgets-v2/spread/spread.tsx +31 -0
  513. package/src/widgets-v2/spread/types.ts +27 -0
  514. package/src/widgets-v2/state/labels.test.ts +33 -0
  515. package/src/widgets-v2/state/labels.ts +20 -0
  516. package/src/widgets-v2/state/style.ts +25 -0
  517. package/src/widgets-v2/state/widget-state.test.tsx +294 -0
  518. package/src/widgets-v2/state/widget-state.tsx +184 -0
  519. package/src/widgets-v2/stores/index.ts +49 -0
  520. package/src/widgets-v2/stores/pipeline-middleware.test.ts +187 -0
  521. package/src/widgets-v2/stores/pipeline-middleware.ts +91 -0
  522. package/src/widgets-v2/stores/transforms.test.ts +162 -0
  523. package/src/widgets-v2/stores/transforms.ts +70 -0
  524. package/src/widgets-v2/stores/types.ts +64 -0
  525. package/src/widgets-v2/stores/use-echart-instance.test.tsx +91 -0
  526. package/src/widgets-v2/stores/use-echart-instance.ts +29 -0
  527. package/src/widgets-v2/stores/use-transform-enabled.test.tsx +127 -0
  528. package/src/widgets-v2/stores/use-transform-enabled.ts +25 -0
  529. package/src/widgets-v2/stores/use-transform.test.tsx +262 -0
  530. package/src/widgets-v2/stores/use-transform.ts +158 -0
  531. package/src/widgets-v2/stores/widget-context.test.tsx +58 -0
  532. package/src/widgets-v2/stores/widget-context.ts +15 -0
  533. package/src/widgets-v2/stores/widget-store-registry.test.ts +292 -0
  534. package/src/widgets-v2/stores/widget-store-registry.ts +248 -0
  535. package/src/widgets-v2/subheader/style.ts +12 -0
  536. package/src/widgets-v2/subheader/subheader.test.tsx +30 -0
  537. package/src/widgets-v2/subheader/subheader.tsx +16 -0
  538. package/src/widgets-v2/table/download.test.ts +75 -0
  539. package/src/widgets-v2/table/download.ts +47 -0
  540. package/src/widgets-v2/table/helpers.test.ts +214 -0
  541. package/src/widgets-v2/table/helpers.ts +136 -0
  542. package/src/widgets-v2/table/index.ts +23 -0
  543. package/src/widgets-v2/table/labels.tsx +41 -0
  544. package/src/widgets-v2/table/skeleton.test.tsx +26 -0
  545. package/src/widgets-v2/table/skeleton.tsx +65 -0
  546. package/src/widgets-v2/table/style.ts +46 -0
  547. package/src/widgets-v2/table/table-ui.test.tsx +200 -0
  548. package/src/widgets-v2/table/table-ui.tsx +331 -0
  549. package/src/widgets-v2/table/table.test.tsx +119 -0
  550. package/src/widgets-v2/table/table.tsx +174 -0
  551. package/src/widgets-v2/table/types.ts +44 -0
  552. package/src/widgets-v2/test-utils.ts +107 -0
  553. package/src/widgets-v2/timeseries/download.test.ts +95 -0
  554. package/src/widgets-v2/timeseries/download.ts +86 -0
  555. package/src/widgets-v2/timeseries/index.ts +10 -0
  556. package/src/widgets-v2/timeseries/options.test.ts +379 -0
  557. package/src/widgets-v2/timeseries/options.ts +341 -0
  558. package/src/widgets-v2/timeseries/skeleton.test.tsx +13 -0
  559. package/src/widgets-v2/timeseries/skeleton.tsx +76 -0
  560. package/src/widgets-v2/timeseries/types.ts +61 -0
  561. package/src/widgets-v2/toolbox/labels.ts +9 -0
  562. package/src/widgets-v2/toolbox/style.ts +33 -0
  563. package/src/widgets-v2/toolbox/toolbox.test.tsx +200 -0
  564. package/src/widgets-v2/toolbox/toolbox.tsx +309 -0
  565. package/src/widgets-v2/utils/data-zoom-layout.ts +26 -0
  566. package/src/widgets-v2/utils/index.ts +2 -0
  567. package/src/widgets-v2/utils/merge-options.test.ts +52 -0
  568. package/src/widgets-v2/utils/merge-options.ts +50 -0
  569. package/src/widgets-v2/wrapper/index.ts +14 -0
  570. package/src/widgets-v2/wrapper/labels.ts +11 -0
  571. package/src/widgets-v2/wrapper/style.ts +134 -0
  572. package/src/widgets-v2/wrapper/widget-actions.test.tsx +52 -0
  573. package/src/widgets-v2/wrapper/widget-actions.tsx +43 -0
  574. package/src/widgets-v2/wrapper/widget-content.test.tsx +27 -0
  575. package/src/widgets-v2/wrapper/widget-content.tsx +29 -0
  576. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +159 -0
  577. package/src/widgets-v2/wrapper/widget-wrapper.tsx +178 -0
  578. package/dist/styles-BYTyKQFP.js.map +0 -1
@@ -0,0 +1,39 @@
1
+ import { describe, it, expect, vi } from 'vitest'
2
+ import { render } from '@testing-library/react'
3
+ import { Markdown } from './markdown'
4
+ import { Provider } from '../provider/widget-provider'
5
+
6
+ vi.mock('./markdown-ui', () => ({
7
+ MarkdownUI: ({ content }: { content: string }) => (
8
+ <div data-testid='md-ui'>{content}</div>
9
+ ),
10
+ }))
11
+
12
+ describe('<Markdown> bridge', () => {
13
+ it('forwards data.content from the store to MarkdownUI', () => {
14
+ const { getByTestId } = render(
15
+ <Provider id='md-1' data={{ content: '# hi\n\nbody' }}>
16
+ <Markdown />
17
+ </Provider>,
18
+ )
19
+ expect(getByTestId('md-ui').textContent).toBe('# hi\n\nbody')
20
+ })
21
+
22
+ it('falls back to empty string when data is undefined', () => {
23
+ const { getByTestId } = render(
24
+ <Provider id='md-2' data={undefined}>
25
+ <Markdown />
26
+ </Provider>,
27
+ )
28
+ expect(getByTestId('md-ui').textContent).toBe('')
29
+ })
30
+
31
+ it('falls back to empty string when data.content is missing', () => {
32
+ const { getByTestId } = render(
33
+ <Provider id='md-3' data={{} as { content: string }}>
34
+ <Markdown />
35
+ </Provider>,
36
+ )
37
+ expect(getByTestId('md-ui').textContent).toBe('')
38
+ })
39
+ })
@@ -0,0 +1,17 @@
1
+ import { useWidgetId, useWidget } from '../stores'
2
+ import { MarkdownUI } from './markdown-ui'
3
+ import type { MarkdownWidgetData } from './types'
4
+
5
+ /**
6
+ * Stateful Markdown bridge — reads `data.content` (post-pipeline) from the
7
+ * per-widget store and forwards it to the pure {@link MarkdownUI}. Sits
8
+ * inside `<Widget.Provider>`.
9
+ */
10
+ export function Markdown() {
11
+ const id = useWidgetId()
12
+ const content = useWidget(id, (s) => {
13
+ const data = s.data as MarkdownWidgetData | undefined
14
+ return data?.content ?? ''
15
+ })
16
+ return <MarkdownUI content={content} />
17
+ }
@@ -0,0 +1,15 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { render } from '@testing-library/react'
3
+ import { MarkdownSkeleton } from './skeleton'
4
+
5
+ describe('<MarkdownSkeleton>', () => {
6
+ it('renders the default 5 line stubs', () => {
7
+ const { container } = render(<MarkdownSkeleton />)
8
+ expect(container.querySelectorAll('.MuiSkeleton-root').length).toBe(5)
9
+ })
10
+
11
+ it('honours custom line count', () => {
12
+ const { container } = render(<MarkdownSkeleton lines={2} />)
13
+ expect(container.querySelectorAll('.MuiSkeleton-root').length).toBe(2)
14
+ })
15
+ })
@@ -0,0 +1,32 @@
1
+ import { Box, Skeleton } from '@mui/material'
2
+ import type { SxProps, Theme } from '@mui/material'
3
+
4
+ const styles = {
5
+ root: {
6
+ display: 'flex',
7
+ flexDirection: 'column',
8
+ gap: 1,
9
+ py: 1,
10
+ },
11
+ line: (width: string): SxProps<Theme> => ({ width, height: 18 }),
12
+ } as const
13
+
14
+ export interface MarkdownSkeletonProps {
15
+ lines?: number
16
+ }
17
+
18
+ export function MarkdownSkeleton({ lines = 5 }: MarkdownSkeletonProps) {
19
+ // Vary widths to mimic prose.
20
+ const widths = ['100%', '95%', '90%', '85%', '70%']
21
+ return (
22
+ <Box sx={styles.root}>
23
+ {Array.from({ length: lines }).map((_, i) => (
24
+ <Skeleton
25
+ key={`line-${i}`}
26
+ variant='rectangular'
27
+ sx={styles.line(widths[i % widths.length] ?? '85%')}
28
+ />
29
+ ))}
30
+ </Box>
31
+ )
32
+ }
@@ -0,0 +1,53 @@
1
+ import type { SxProps, Theme } from '@mui/material'
2
+
3
+ export const styles = {
4
+ root: {
5
+ color: 'text.primary',
6
+ '& a': { color: 'primary.main' },
7
+ '& code': {
8
+ bgcolor: 'action.hover',
9
+ px: 0.5,
10
+ borderRadius: 0.5,
11
+ fontFamily: 'monospace',
12
+ fontSize: '0.875em',
13
+ },
14
+ '& pre': {
15
+ bgcolor: 'action.hover',
16
+ p: 1.5,
17
+ borderRadius: 1,
18
+ overflowX: 'auto',
19
+ },
20
+ '& blockquote': {
21
+ borderLeft: '3px solid',
22
+ borderColor: 'divider',
23
+ pl: 1.5,
24
+ ml: 0,
25
+ color: 'text.secondary',
26
+ fontStyle: 'italic',
27
+ },
28
+ '& ul, & ol': { pl: 3, my: 1 },
29
+ '& li': { my: 0.25 },
30
+ '& hr': {
31
+ border: 'none',
32
+ borderTop: '1px solid',
33
+ borderColor: 'divider',
34
+ my: 1.5,
35
+ },
36
+ '& table': { borderCollapse: 'collapse', width: '100%' },
37
+ '& th, & td': {
38
+ border: '1px solid',
39
+ borderColor: 'divider',
40
+ px: 1,
41
+ py: 0.5,
42
+ textAlign: 'left',
43
+ },
44
+ },
45
+ paragraph: {
46
+ my: 1,
47
+ },
48
+ heading: {
49
+ mt: 2,
50
+ mb: 1,
51
+ fontWeight: 600,
52
+ },
53
+ } satisfies Record<string, SxProps<Theme>>
@@ -0,0 +1,4 @@
1
+ /** Markdown widget data — a single markdown source string. */
2
+ export interface MarkdownWidgetData {
3
+ content: string
4
+ }
@@ -0,0 +1,9 @@
1
+ export interface NoteLabels {
2
+ showMore: string
3
+ showLess: string
4
+ }
5
+
6
+ export const DEFAULT_NOTE_LABELS: NoteLabels = {
7
+ showMore: 'Show more',
8
+ showLess: 'Show less',
9
+ }
@@ -0,0 +1,26 @@
1
+ import type { SxProps, Theme } from '@mui/material'
2
+
3
+ export const styles = {
4
+ root: {
5
+ display: 'flex',
6
+ flexDirection: 'column',
7
+ gap: 0.5,
8
+ },
9
+ text: {
10
+ color: 'text.secondary',
11
+ overflow: 'hidden',
12
+ overflowWrap: 'anywhere',
13
+ },
14
+ clamped: {
15
+ display: '-webkit-box',
16
+ WebkitBoxOrient: 'vertical',
17
+ WebkitLineClamp: 3,
18
+ },
19
+ toggle: {
20
+ alignSelf: 'flex-start',
21
+ color: 'primary.main',
22
+ fontWeight: 500,
23
+ cursor: 'pointer',
24
+ '&:hover': { textDecoration: 'underline' },
25
+ },
26
+ } satisfies Record<string, SxProps<Theme>>
@@ -0,0 +1,158 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest'
2
+ import { fireEvent, render, screen } from '@testing-library/react'
3
+ import { Note } from './widget-note'
4
+
5
+ beforeEach(() => {
6
+ // jsdom doesn't lay anything out, so scrollHeight / clientHeight default to
7
+ // 0 / 0 and the overflow detector won't fire by default. Each test that
8
+ // wants to exercise the overflow branch stubs these getters explicitly.
9
+ })
10
+
11
+ describe('<Note>', () => {
12
+ it('renders the children unclamped when no overflow is detected', () => {
13
+ render(<Note>Short text</Note>)
14
+ expect(screen.getByText('Short text')).toBeTruthy()
15
+ expect(screen.queryByText('Show more')).toBeNull()
16
+ })
17
+
18
+ it('shows the Show more toggle when content overflows', () => {
19
+ // Force scrollHeight > clientHeight on the typography element.
20
+ Object.defineProperty(HTMLElement.prototype, 'scrollHeight', {
21
+ configurable: true,
22
+ get: () => 200,
23
+ })
24
+ Object.defineProperty(HTMLElement.prototype, 'clientHeight', {
25
+ configurable: true,
26
+ get: () => 60,
27
+ })
28
+ render(<Note>{'a '.repeat(400)}</Note>)
29
+ expect(screen.getByText('Show more')).toBeTruthy()
30
+ fireEvent.click(screen.getByText('Show more'))
31
+ expect(screen.getByText('Show less')).toBeTruthy()
32
+ })
33
+
34
+ it('honors custom labels', () => {
35
+ Object.defineProperty(HTMLElement.prototype, 'scrollHeight', {
36
+ configurable: true,
37
+ get: () => 200,
38
+ })
39
+ Object.defineProperty(HTMLElement.prototype, 'clientHeight', {
40
+ configurable: true,
41
+ get: () => 60,
42
+ })
43
+ render(
44
+ <Note labels={{ showMore: 'Reveal', showLess: 'Hide' }}>long text</Note>,
45
+ )
46
+ expect(screen.getByText('Reveal')).toBeTruthy()
47
+ fireEvent.click(screen.getByText('Reveal'))
48
+ expect(screen.getByText('Hide')).toBeTruthy()
49
+ })
50
+
51
+ it('renders string children verbatim (no markdown parsing on base Note)', () => {
52
+ const { container } = render(<Note>{'This is **literal** text'}</Note>)
53
+ // Base Note no longer parses markdown — asterisks render verbatim.
54
+ expect(container.querySelector('strong')).toBeNull()
55
+ expect(screen.getByText('This is **literal** text')).toBeTruthy()
56
+ })
57
+
58
+ it('passes through JSX children verbatim', () => {
59
+ render(
60
+ <Note>
61
+ <span data-testid='raw'>**not parsed**</span>
62
+ </Note>,
63
+ )
64
+ // Asterisks should remain literal because the children are JSX.
65
+ expect(screen.getByTestId('raw').textContent).toBe('**not parsed**')
66
+ })
67
+
68
+ describe('lineClamp={0}', () => {
69
+ it('does not render the Show more toggle when content overflows', () => {
70
+ Object.defineProperty(HTMLElement.prototype, 'scrollHeight', {
71
+ configurable: true,
72
+ get: () => 200,
73
+ })
74
+ Object.defineProperty(HTMLElement.prototype, 'clientHeight', {
75
+ configurable: true,
76
+ get: () => 60,
77
+ })
78
+ render(<Note lineClamp={0}>{'a '.repeat(400)}</Note>)
79
+ expect(screen.queryByText('Show more')).toBeNull()
80
+ expect(screen.queryByText('Show less')).toBeNull()
81
+ })
82
+
83
+ it('does not apply line clamping styles', () => {
84
+ const { container } = render(
85
+ <Note lineClamp={0}>{'a '.repeat(400)}</Note>,
86
+ )
87
+ const textBox = container.querySelector('p')?.parentElement
88
+ const style = textBox ? window.getComputedStyle(textBox) : null
89
+ expect(style?.getPropertyValue('-webkit-line-clamp')).toBeFalsy()
90
+ })
91
+
92
+ it('default behavior (lineClamp omitted) still clamps and shows toggle on overflow', () => {
93
+ Object.defineProperty(HTMLElement.prototype, 'scrollHeight', {
94
+ configurable: true,
95
+ get: () => 200,
96
+ })
97
+ Object.defineProperty(HTMLElement.prototype, 'clientHeight', {
98
+ configurable: true,
99
+ get: () => 60,
100
+ })
101
+ render(<Note>{'a '.repeat(400)}</Note>)
102
+ expect(screen.getByText('Show more')).toBeTruthy()
103
+ })
104
+ })
105
+
106
+ it('does not throw when ResizeObserver is missing', () => {
107
+ const original = globalThis.ResizeObserver
108
+ // @ts-expect-error force-undefined for the duration of the test
109
+ delete globalThis.ResizeObserver
110
+ try {
111
+ // We don't expect anything specific to render — just that this doesn't crash.
112
+ expect(() => render(<Note>x</Note>)).not.toThrow()
113
+ } finally {
114
+ globalThis.ResizeObserver = original
115
+ }
116
+ void vi
117
+ })
118
+ })
119
+
120
+ describe('<Note.Markdown>', () => {
121
+ it('renders bold markdown from a content string', () => {
122
+ const { container } = render(
123
+ <Note.Markdown content='This is **important** info' />,
124
+ )
125
+ expect(container.querySelector('strong')?.textContent).toBe('important')
126
+ })
127
+
128
+ it('renders markdown links with secure target/rel defaults', () => {
129
+ const { container } = render(
130
+ <Note.Markdown content='See [docs](https://example.com)' />,
131
+ )
132
+ const link = container.querySelector('a')
133
+ expect(link?.getAttribute('href')).toBe('https://example.com')
134
+ expect(link?.getAttribute('target')).toBe('_blank')
135
+ expect(link?.getAttribute('rel')).toBe('noopener noreferrer')
136
+ })
137
+
138
+ it('strips images from markdown', () => {
139
+ const { container } = render(
140
+ <Note.Markdown content='caption text ![alt](https://example.com/x.png)' />,
141
+ )
142
+ expect(container.querySelector('img')).toBeNull()
143
+ expect(screen.getByText(/caption text/)).toBeTruthy()
144
+ })
145
+
146
+ it('clamps and shows the Show more toggle on overflow (same shell as base)', () => {
147
+ Object.defineProperty(HTMLElement.prototype, 'scrollHeight', {
148
+ configurable: true,
149
+ get: () => 200,
150
+ })
151
+ Object.defineProperty(HTMLElement.prototype, 'clientHeight', {
152
+ configurable: true,
153
+ get: () => 60,
154
+ })
155
+ render(<Note.Markdown content={'long content '.repeat(80)} />)
156
+ expect(screen.getByText('Show more')).toBeTruthy()
157
+ })
158
+ })
@@ -0,0 +1,172 @@
1
+ import { useCallback, useEffect, useRef, useState, type ReactNode } from 'react'
2
+ import { Box, Link, Typography } from '@mui/material'
3
+ import type { Components } from 'react-markdown'
4
+ import { MarkdownContent } from '../markdown/markdown-content'
5
+ import { observeResize } from '../echart/shared-resize-observer'
6
+ import { DEFAULT_NOTE_LABELS, type NoteLabels } from './labels'
7
+ import { styles } from './style'
8
+
9
+ export interface NoteProps {
10
+ /**
11
+ * Maximum visible lines before clamping. Defaults to 3. Set to `0` to
12
+ * disable clamping entirely — full content renders and the Show More/Less
13
+ * toggle is never shown.
14
+ */
15
+ lineClamp?: number
16
+ labels?: Partial<NoteLabels>
17
+ /**
18
+ * Renders verbatim inside the caption shell. For markdown source (a
19
+ * string with `**bold**`, lists, links, etc.) reach for the
20
+ * `<Note.Markdown>` subcomponent instead — it pipes the string through
21
+ * the shared {@link MarkdownContent} engine with caption-safe element
22
+ * mapping.
23
+ */
24
+ children: ReactNode
25
+ }
26
+
27
+ export interface NoteMarkdownProps {
28
+ /** Markdown source. Rendered with caption typography via {@link MarkdownContent}. */
29
+ content: string
30
+ /** Maximum visible lines before clamping. Defaults to 3. */
31
+ lineClamp?: number
32
+ labels?: Partial<NoteLabels>
33
+ }
34
+
35
+ /** Block element used for every Markdown paragraph and demoted heading so
36
+ * Notes share a single caption look and never inject heading levels into
37
+ * the document outline. */
38
+ function CaptionBlock({ children }: { children?: ReactNode }) {
39
+ return (
40
+ <Typography variant='caption' component='p' color='inherit' sx={{ m: 0 }}>
41
+ {children}
42
+ </Typography>
43
+ )
44
+ }
45
+
46
+ const NOTE_COMPONENTS: Components = {
47
+ // Headings demoted to caption typography — a Note can't introduce a
48
+ // heading into the page outline.
49
+ h1: CaptionBlock,
50
+ h2: CaptionBlock,
51
+ h3: CaptionBlock,
52
+ h4: CaptionBlock,
53
+ h5: CaptionBlock,
54
+ h6: CaptionBlock,
55
+ p: CaptionBlock,
56
+ // External-safe link defaults; inherit colour from the muted caption.
57
+ a: ({ children, href }) => (
58
+ <Link
59
+ href={href}
60
+ target='_blank'
61
+ rel='noopener noreferrer'
62
+ color='inherit'
63
+ underline='always'
64
+ >
65
+ {children}
66
+ </Link>
67
+ ),
68
+ }
69
+
70
+ /**
71
+ * Auxiliary slot for an optional explanatory note below a widget. Clamps to
72
+ * `lineClamp` lines (default 3) and reveals a Show More/Less toggle when the
73
+ * content overflows. Overflow detection re-runs on container resize via the
74
+ * shared singleton ResizeObserver.
75
+ *
76
+ * Renders `children` verbatim through caption typography. For markdown
77
+ * source, use the {@link NoteMarkdown} (`Note.Markdown`) subcomponent.
78
+ */
79
+ function NoteBase({ lineClamp = 3, labels, children }: NoteProps) {
80
+ return (
81
+ <NoteShell lineClamp={lineClamp} labels={labels} dependency={children}>
82
+ <Typography variant='caption' component='div' color='inherit'>
83
+ {children}
84
+ </Typography>
85
+ </NoteShell>
86
+ )
87
+ }
88
+
89
+ /**
90
+ * Markdown variant of {@link Note}. Pipes the `content` string through the
91
+ * shared {@link MarkdownContent} engine with caption-safe element mapping
92
+ * (headings demoted, links open in new tabs, images/HTML stripped).
93
+ */
94
+ function NoteMarkdown({ content, lineClamp = 3, labels }: NoteMarkdownProps) {
95
+ return (
96
+ <NoteShell lineClamp={lineClamp} labels={labels} dependency={content}>
97
+ <MarkdownContent content={content} components={NOTE_COMPONENTS} />
98
+ </NoteShell>
99
+ )
100
+ }
101
+
102
+ // Public namespace export. Consumers reach the markdown variant via
103
+ // `<Widget.Note.Markdown>{content}</Widget.Note.Markdown>`.
104
+ export const Note = Object.assign(NoteBase, { Markdown: NoteMarkdown })
105
+
106
+ interface NoteShellProps {
107
+ lineClamp: number
108
+ labels: Partial<NoteLabels> | undefined
109
+ /** Used to re-measure overflow when the underlying content changes. */
110
+ dependency: unknown
111
+ children: ReactNode
112
+ }
113
+
114
+ /**
115
+ * Shared shell: caption box + clamping + Show More/Less toggle. Both the
116
+ * verbatim `Note` and the markdown `Note.Markdown` reach for this so the
117
+ * overflow + measurement behaviour stays identical across variants.
118
+ */
119
+ function NoteShell({
120
+ lineClamp,
121
+ labels,
122
+ dependency,
123
+ children,
124
+ }: NoteShellProps) {
125
+ const _labels = { ...DEFAULT_NOTE_LABELS, ...labels }
126
+ const textRef = useRef<HTMLDivElement | null>(null)
127
+ const [isOverflowing, setIsOverflowing] = useState(false)
128
+ const [expanded, setExpanded] = useState(false)
129
+ const clampingDisabled = lineClamp <= 0
130
+
131
+ const measure = useCallback(() => {
132
+ const node = textRef.current
133
+ if (!node) return
134
+ setIsOverflowing(node.scrollHeight > node.clientHeight + 1)
135
+ }, [])
136
+
137
+ useEffect(() => {
138
+ if (clampingDisabled) return undefined
139
+ const node = textRef.current
140
+ if (!node) return undefined
141
+ measure()
142
+ return observeResize(node, measure)
143
+ }, [measure, dependency, clampingDisabled])
144
+
145
+ const toggle = useCallback(() => setExpanded((v) => !v), [])
146
+ const clamped = !expanded && !clampingDisabled
147
+ const lineClampSx = clamped
148
+ ? { ...styles.clamped, WebkitLineClamp: lineClamp }
149
+ : null
150
+
151
+ return (
152
+ <Box sx={styles.root}>
153
+ <Box ref={textRef} sx={{ ...styles.text, ...(lineClampSx ?? {}) }}>
154
+ {children}
155
+ </Box>
156
+ {/* Stay visible while the user is in the expanded state so they always
157
+ have a way back. Without `|| expanded` the toggle would vanish the
158
+ moment content unclamps (scrollHeight === clientHeight). Matches v1. */}
159
+ {!clampingDisabled && (isOverflowing || expanded) && (
160
+ <Link
161
+ component='button'
162
+ variant='caption'
163
+ underline='none'
164
+ onClick={toggle}
165
+ sx={styles.toggle}
166
+ >
167
+ {expanded ? _labels.showLess : _labels.showMore}
168
+ </Link>
169
+ )}
170
+ </Box>
171
+ )
172
+ }
@@ -0,0 +1,78 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest'
2
+ import { createPieDownloadConfig } from './download'
3
+ import type { PieWidgetData } from './types'
4
+
5
+ const single: PieWidgetData = [
6
+ [
7
+ { name: 'a', value: 1 },
8
+ { name: 'b', value: 2 },
9
+ ],
10
+ ]
11
+ const multi: PieWidgetData = [
12
+ [{ name: 'a', value: 1 }],
13
+ [{ name: 'c', value: 3 }],
14
+ ]
15
+
16
+ let csvText = ''
17
+
18
+ let revokeSpy: ReturnType<typeof vi.spyOn>
19
+
20
+ beforeEach(() => {
21
+ csvText = ''
22
+ vi.spyOn(URL, 'createObjectURL').mockReturnValue('blob:mock')
23
+ revokeSpy = vi
24
+ .spyOn(URL, 'revokeObjectURL')
25
+ .mockImplementation(() => undefined)
26
+ const RealBlob = global.Blob
27
+ vi.stubGlobal(
28
+ 'Blob',
29
+ class extends RealBlob {
30
+ constructor(parts: BlobPart[], opts?: BlobPropertyBag) {
31
+ csvText = typeof parts[0] === 'string' ? parts[0] : ''
32
+ super(parts, opts)
33
+ }
34
+ },
35
+ )
36
+ })
37
+
38
+ describe('createPieDownloadConfig', () => {
39
+ it('returns CSV-only items by default', () => {
40
+ const items = createPieDownloadConfig({
41
+ filename: 'p',
42
+ getData: () => single,
43
+ })
44
+ expect(items.map((i) => i.id)).toEqual(['csv'])
45
+ })
46
+
47
+ it('prepends PNG when getCaptureEl provided and rejects when null', async () => {
48
+ const items = createPieDownloadConfig({
49
+ filename: 'p',
50
+ getData: () => single,
51
+ getCaptureEl: () => null,
52
+ })
53
+ expect(items.map((i) => i.id)).toEqual(['png', 'csv'])
54
+ await expect(items[0]!.resolve()).rejects.toThrow(/No PNG capture element/)
55
+ })
56
+
57
+ it('CSV resolve uses default series_<n> when seriesNames is absent', async () => {
58
+ const items = createPieDownloadConfig({
59
+ filename: 'p',
60
+ getData: () => multi,
61
+ })
62
+ const handle = await items.find((i) => i.id === 'csv')!.resolve()
63
+ expect(handle.filename).toBe('p.csv')
64
+ expect(csvText).toBe('series,name,value\nseries_1,a,1\nseries_2,c,3')
65
+ handle.revoke?.()
66
+ expect(revokeSpy).toHaveBeenCalled()
67
+ })
68
+
69
+ it('CSV resolve uses provided seriesNames when supplied', async () => {
70
+ const items = createPieDownloadConfig({
71
+ filename: 'p',
72
+ getData: () => multi,
73
+ seriesNames: ['alpha', 'beta'],
74
+ })
75
+ await items.find((i) => i.id === 'csv')!.resolve()
76
+ expect(csvText).toBe('series,name,value\nalpha,a,1\nbeta,c,3')
77
+ })
78
+ })
@@ -0,0 +1,55 @@
1
+ import {
2
+ buildPngDownloadItem,
3
+ downloadToCSV,
4
+ type DownloadItem,
5
+ } from '../actions/download'
6
+ import type { PieWidgetData } from './types'
7
+
8
+ /**
9
+ * Download menu items for the Pie widget. Always includes a CSV item with
10
+ * `series, name, value` columns (one row per slice; series labels come from
11
+ * `seriesNames` if provided, else `series_<n>`). When `getCaptureEl` is
12
+ * supplied, prepends a PNG item that rasterises the captured element via
13
+ * `html2canvas`.
14
+ */
15
+ export function createPieDownloadConfig(args: {
16
+ filename: string
17
+ getData: () => PieWidgetData
18
+ seriesNames?: readonly string[]
19
+ getCaptureEl?: () => HTMLElement | null
20
+ pngPixelRatio?: number
21
+ pngBackgroundColor?: string | null
22
+ }): DownloadItem[] {
23
+ const items: DownloadItem[] = []
24
+ if (args.getCaptureEl) {
25
+ items.push(
26
+ buildPngDownloadItem({
27
+ filename: args.filename,
28
+ getCaptureEl: args.getCaptureEl,
29
+ pixelRatio: args.pngPixelRatio,
30
+ backgroundColor: args.pngBackgroundColor,
31
+ }),
32
+ )
33
+ }
34
+ items.push({
35
+ id: 'csv',
36
+ label: 'Download as CSV',
37
+ resolve: () => {
38
+ const data = args.getData()
39
+ const rows: unknown[][] = [['series', 'name', 'value']]
40
+ for (const [i, series] of data.entries()) {
41
+ const seriesName = args.seriesNames?.[i] ?? `series_${i + 1}`
42
+ for (const slice of series) {
43
+ rows.push([seriesName, slice.name, slice.value])
44
+ }
45
+ }
46
+ const handle = downloadToCSV(rows)
47
+ return Promise.resolve({
48
+ url: handle.url,
49
+ filename: `${args.filename}.csv`,
50
+ revoke: handle.revoke,
51
+ })
52
+ },
53
+ })
54
+ return items
55
+ }
@@ -0,0 +1,10 @@
1
+ export { pieOptions, createPieOptionFactory } from './options'
2
+ export { PieSkeleton, type PieSkeletonProps } from './skeleton'
3
+ export { createPieDownloadConfig } from './download'
4
+ export type {
5
+ PieDatum,
6
+ PieWidgetData,
7
+ PieOptionsInput,
8
+ PieOptionFactoryInput,
9
+ PieEChartsOption,
10
+ } from './types'