@carto/ps-react-ui 4.7.1 → 4.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. package/dist/category-DwaeYjpX.js +656 -0
  2. package/dist/category-DwaeYjpX.js.map +1 -0
  3. package/dist/change-column-Cidl_M-4.js +1110 -0
  4. package/dist/change-column-Cidl_M-4.js.map +1 -0
  5. package/dist/data-zoom-layout-BH0LPwSy.js +28 -0
  6. package/dist/data-zoom-layout-BH0LPwSy.js.map +1 -0
  7. package/dist/echart-CU0KmClP.js +176 -0
  8. package/dist/echart-CU0KmClP.js.map +1 -0
  9. package/dist/exports-Cx-f6m6U.js +63 -0
  10. package/dist/exports-Cx-f6m6U.js.map +1 -0
  11. package/dist/formula-DuC0NQLH.js +79 -0
  12. package/dist/formula-DuC0NQLH.js.map +1 -0
  13. package/dist/markdown-BD1jcknS.js +8326 -0
  14. package/dist/markdown-BD1jcknS.js.map +1 -0
  15. package/dist/{styles-BYTyKQFP.js → option-builders-F-c9ELi1.js} +25 -45
  16. package/dist/option-builders-F-c9ELi1.js.map +1 -0
  17. package/dist/png-item-CS4z1iSH.js +45 -0
  18. package/dist/png-item-CS4z1iSH.js.map +1 -0
  19. package/dist/range-l4fNHLEg.js +213 -0
  20. package/dist/range-l4fNHLEg.js.map +1 -0
  21. package/dist/resolve-theme-color-BdojIw0K.js +47 -0
  22. package/dist/resolve-theme-color-BdojIw0K.js.map +1 -0
  23. package/dist/spread-CTuIXZSM.js +67 -0
  24. package/dist/spread-CTuIXZSM.js.map +1 -0
  25. package/dist/style-DVnT6HC1.js +131 -0
  26. package/dist/style-DVnT6HC1.js.map +1 -0
  27. package/dist/styles-cohnxh9F.js +23 -0
  28. package/dist/styles-cohnxh9F.js.map +1 -0
  29. package/dist/table-CQCAnDLb.js +388 -0
  30. package/dist/table-CQCAnDLb.js.map +1 -0
  31. package/dist/transforms-Cdx4fkU5.js +106 -0
  32. package/dist/transforms-Cdx4fkU5.js.map +1 -0
  33. package/dist/types/widgets/echart/utils.test.d.ts +1 -0
  34. package/dist/types/widgets/formula/config.test.d.ts +1 -0
  35. package/dist/types/widgets/stores/widget-store-branches.test.d.ts +1 -0
  36. package/dist/types/widgets/table/config.test.d.ts +1 -0
  37. package/dist/types/widgets-v2/actions/brush-toggle/brush-toggle.d.ts +56 -0
  38. package/dist/types/widgets-v2/actions/brush-toggle/index.d.ts +3 -0
  39. package/dist/types/widgets-v2/actions/brush-toggle/labels.d.ts +5 -0
  40. package/dist/types/widgets-v2/actions/brush-toggle/style.d.ts +12 -0
  41. package/dist/types/widgets-v2/actions/brush-toggle/transforms.d.ts +11 -0
  42. package/dist/types/widgets-v2/actions/brush-toggle/transforms.test.d.ts +1 -0
  43. package/dist/types/widgets-v2/actions/change-column/change-column-icon.d.ts +2 -0
  44. package/dist/types/widgets-v2/actions/change-column/change-column.d.ts +29 -0
  45. package/dist/types/widgets-v2/actions/change-column/index.d.ts +3 -0
  46. package/dist/types/widgets-v2/actions/change-column/labels.d.ts +5 -0
  47. package/dist/types/widgets-v2/actions/change-column/sortable-column-item.d.ts +14 -0
  48. package/dist/types/widgets-v2/actions/change-column/style.d.ts +33 -0
  49. package/dist/types/widgets-v2/actions/change-column/types.d.ts +10 -0
  50. package/dist/types/widgets-v2/actions/download/download.d.ts +18 -0
  51. package/dist/types/widgets-v2/actions/download/exports.d.ts +37 -0
  52. package/dist/types/widgets-v2/actions/download/icons.d.ts +12 -0
  53. package/dist/types/widgets-v2/actions/download/index.d.ts +6 -0
  54. package/dist/types/widgets-v2/actions/download/labels.d.ts +11 -0
  55. package/dist/types/widgets-v2/actions/download/png-item.d.ts +24 -0
  56. package/dist/types/widgets-v2/actions/download/style.d.ts +1 -0
  57. package/dist/types/widgets-v2/actions/download/types.d.ts +35 -0
  58. package/dist/types/widgets-v2/actions/fullscreen/fullscreen.d.ts +59 -0
  59. package/dist/types/widgets-v2/actions/fullscreen/index.d.ts +3 -0
  60. package/dist/types/widgets-v2/actions/fullscreen/labels.d.ts +5 -0
  61. package/dist/types/widgets-v2/actions/fullscreen/style.d.ts +48 -0
  62. package/dist/types/widgets-v2/actions/fullscreen/types.d.ts +14 -0
  63. package/dist/types/widgets-v2/actions/index.d.ts +9 -0
  64. package/dist/types/widgets-v2/actions/lock-selection/index.d.ts +3 -0
  65. package/dist/types/widgets-v2/actions/lock-selection/labels.d.ts +6 -0
  66. package/dist/types/widgets-v2/actions/lock-selection/lock-selection.d.ts +36 -0
  67. package/dist/types/widgets-v2/actions/lock-selection/style.d.ts +12 -0
  68. package/dist/types/widgets-v2/actions/lock-selection/transforms.d.ts +6 -0
  69. package/dist/types/widgets-v2/actions/relative-data/index.d.ts +3 -0
  70. package/dist/types/widgets-v2/actions/relative-data/labels.d.ts +5 -0
  71. package/dist/types/widgets-v2/actions/relative-data/relative-data.d.ts +39 -0
  72. package/dist/types/widgets-v2/actions/relative-data/style.d.ts +12 -0
  73. package/dist/types/widgets-v2/actions/relative-data/transforms.d.ts +30 -0
  74. package/dist/types/widgets-v2/actions/relative-data/transforms.test.d.ts +1 -0
  75. package/dist/types/widgets-v2/actions/searcher/filter.d.ts +6 -0
  76. package/dist/types/widgets-v2/actions/searcher/index.d.ts +4 -0
  77. package/dist/types/widgets-v2/actions/searcher/labels.d.ts +7 -0
  78. package/dist/types/widgets-v2/actions/searcher/searcher-toggle.d.ts +23 -0
  79. package/dist/types/widgets-v2/actions/searcher/searcher.d.ts +11 -0
  80. package/dist/types/widgets-v2/actions/searcher/style.d.ts +16 -0
  81. package/dist/types/widgets-v2/actions/stack-toggle/index.d.ts +3 -0
  82. package/dist/types/widgets-v2/actions/stack-toggle/labels.d.ts +5 -0
  83. package/dist/types/widgets-v2/actions/stack-toggle/stack-toggle.d.ts +10 -0
  84. package/dist/types/widgets-v2/actions/stack-toggle/style.d.ts +12 -0
  85. package/dist/types/widgets-v2/actions/stack-toggle/transforms.d.ts +13 -0
  86. package/dist/types/widgets-v2/actions/stack-toggle/transforms.test.d.ts +1 -0
  87. package/dist/types/widgets-v2/actions/zoom-toggle/index.d.ts +3 -0
  88. package/dist/types/widgets-v2/actions/zoom-toggle/labels.d.ts +5 -0
  89. package/dist/types/widgets-v2/actions/zoom-toggle/style.d.ts +12 -0
  90. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.d.ts +51 -0
  91. package/dist/types/widgets-v2/actions/zoom-toggle/transforms.test.d.ts +1 -0
  92. package/dist/types/widgets-v2/actions/zoom-toggle/zoom-toggle.d.ts +35 -0
  93. package/dist/types/widgets-v2/bar/download.d.ts +24 -0
  94. package/dist/types/widgets-v2/bar/index.d.ts +4 -0
  95. package/dist/types/widgets-v2/bar/options.d.ts +43 -0
  96. package/dist/types/widgets-v2/bar/options.test.d.ts +1 -0
  97. package/dist/types/widgets-v2/bar/skeleton.d.ts +6 -0
  98. package/dist/types/widgets-v2/bar/types.d.ts +46 -0
  99. package/dist/types/widgets-v2/category/category-ui.d.ts +81 -0
  100. package/dist/types/widgets-v2/category/category.d.ts +48 -0
  101. package/dist/types/widgets-v2/category/components/category-bar-stacked.d.ts +28 -0
  102. package/dist/types/widgets-v2/category/components/category-bar.d.ts +23 -0
  103. package/dist/types/widgets-v2/category/components/category-legend.d.ts +18 -0
  104. package/dist/types/widgets-v2/category/components/category-row-multi.d.ts +31 -0
  105. package/dist/types/widgets-v2/category/components/category-row-other.d.ts +13 -0
  106. package/dist/types/widgets-v2/category/components/category-row-single.d.ts +28 -0
  107. package/dist/types/widgets-v2/category/components/category-row-stacked.d.ts +38 -0
  108. package/dist/types/widgets-v2/category/download.d.ts +16 -0
  109. package/dist/types/widgets-v2/category/download.test.d.ts +1 -0
  110. package/dist/types/widgets-v2/category/index.d.ts +10 -0
  111. package/dist/types/widgets-v2/category/skeleton.d.ts +11 -0
  112. package/dist/types/widgets-v2/category/style.d.ts +166 -0
  113. package/dist/types/widgets-v2/category/types.d.ts +53 -0
  114. package/dist/types/widgets-v2/echart/echart-ui.d.ts +44 -0
  115. package/dist/types/widgets-v2/echart/echart.d.ts +75 -0
  116. package/dist/types/widgets-v2/echart/index.d.ts +4 -0
  117. package/dist/types/widgets-v2/echart/shared-resize-observer.d.ts +5 -0
  118. package/dist/types/widgets-v2/echart/shared-resize-observer.test.d.ts +1 -0
  119. package/dist/types/widgets-v2/echart/style.d.ts +6 -0
  120. package/dist/types/widgets-v2/echart/use-chart-selection.d.ts +51 -0
  121. package/dist/types/widgets-v2/formula/delta.d.ts +22 -0
  122. package/dist/types/widgets-v2/formula/download.d.ts +20 -0
  123. package/dist/types/widgets-v2/formula/formula-ui.d.ts +20 -0
  124. package/dist/types/widgets-v2/formula/formula.d.ts +8 -0
  125. package/dist/types/widgets-v2/formula/index.d.ts +11 -0
  126. package/dist/types/widgets-v2/formula/note.d.ts +11 -0
  127. package/dist/types/widgets-v2/formula/prefix.d.ts +12 -0
  128. package/dist/types/widgets-v2/formula/series.d.ts +16 -0
  129. package/dist/types/widgets-v2/formula/skeleton.d.ts +4 -0
  130. package/dist/types/widgets-v2/formula/style.d.ts +29 -0
  131. package/dist/types/widgets-v2/formula/suffix.d.ts +12 -0
  132. package/dist/types/widgets-v2/formula/types.d.ts +43 -0
  133. package/dist/types/widgets-v2/formula/value.d.ts +14 -0
  134. package/dist/types/widgets-v2/histogram/download.d.ts +17 -0
  135. package/dist/types/widgets-v2/histogram/download.test.d.ts +1 -0
  136. package/dist/types/widgets-v2/histogram/index.d.ts +5 -0
  137. package/dist/types/widgets-v2/histogram/options.d.ts +42 -0
  138. package/dist/types/widgets-v2/histogram/options.test.d.ts +1 -0
  139. package/dist/types/widgets-v2/histogram/skeleton.d.ts +9 -0
  140. package/dist/types/widgets-v2/histogram/transforms.d.ts +17 -0
  141. package/dist/types/widgets-v2/histogram/transforms.test.d.ts +1 -0
  142. package/dist/types/widgets-v2/histogram/types.d.ts +51 -0
  143. package/dist/types/widgets-v2/index.d.ts +108 -0
  144. package/dist/types/widgets-v2/markdown/download.d.ts +16 -0
  145. package/dist/types/widgets-v2/markdown/download.test.d.ts +1 -0
  146. package/dist/types/widgets-v2/markdown/index.d.ts +6 -0
  147. package/dist/types/widgets-v2/markdown/markdown-content.d.ts +34 -0
  148. package/dist/types/widgets-v2/markdown/markdown-ui.d.ts +12 -0
  149. package/dist/types/widgets-v2/markdown/markdown.d.ts +6 -0
  150. package/dist/types/widgets-v2/markdown/skeleton.d.ts +4 -0
  151. package/dist/types/widgets-v2/markdown/style.d.ts +61 -0
  152. package/dist/types/widgets-v2/markdown/types.d.ts +4 -0
  153. package/dist/types/widgets-v2/note/labels.d.ts +5 -0
  154. package/dist/types/widgets-v2/note/style.d.ts +26 -0
  155. package/dist/types/widgets-v2/note/widget-note.d.ts +46 -0
  156. package/dist/types/widgets-v2/pie/download.d.ts +17 -0
  157. package/dist/types/widgets-v2/pie/download.test.d.ts +1 -0
  158. package/dist/types/widgets-v2/pie/index.d.ts +4 -0
  159. package/dist/types/widgets-v2/pie/options.d.ts +35 -0
  160. package/dist/types/widgets-v2/pie/options.test.d.ts +1 -0
  161. package/dist/types/widgets-v2/pie/skeleton.d.ts +4 -0
  162. package/dist/types/widgets-v2/pie/types.d.ts +57 -0
  163. package/dist/types/widgets-v2/provider/widget-provider.d.ts +32 -0
  164. package/dist/types/widgets-v2/range/index.d.ts +4 -0
  165. package/dist/types/widgets-v2/range/range-ui.d.ts +27 -0
  166. package/dist/types/widgets-v2/range/range.d.ts +24 -0
  167. package/dist/types/widgets-v2/range/skeleton.d.ts +9 -0
  168. package/dist/types/widgets-v2/range/style.d.ts +40 -0
  169. package/dist/types/widgets-v2/range/types.d.ts +37 -0
  170. package/dist/types/widgets-v2/scatterplot/download.d.ts +16 -0
  171. package/dist/types/widgets-v2/scatterplot/download.test.d.ts +1 -0
  172. package/dist/types/widgets-v2/scatterplot/index.d.ts +5 -0
  173. package/dist/types/widgets-v2/scatterplot/options.d.ts +42 -0
  174. package/dist/types/widgets-v2/scatterplot/options.test.d.ts +1 -0
  175. package/dist/types/widgets-v2/scatterplot/skeleton.d.ts +12 -0
  176. package/dist/types/widgets-v2/scatterplot/transforms.d.ts +17 -0
  177. package/dist/types/widgets-v2/scatterplot/transforms.test.d.ts +1 -0
  178. package/dist/types/widgets-v2/scatterplot/types.d.ts +54 -0
  179. package/dist/types/widgets-v2/selection-summary/labels.d.ts +6 -0
  180. package/dist/types/widgets-v2/selection-summary/selection-summary.d.ts +22 -0
  181. package/dist/types/widgets-v2/selection-summary/style.d.ts +23 -0
  182. package/dist/types/widgets-v2/spread/download.d.ts +15 -0
  183. package/dist/types/widgets-v2/spread/download.test.d.ts +1 -0
  184. package/dist/types/widgets-v2/spread/index.d.ts +6 -0
  185. package/dist/types/widgets-v2/spread/separator.d.ts +7 -0
  186. package/dist/types/widgets-v2/spread/skeleton.d.ts +9 -0
  187. package/dist/types/widgets-v2/spread/spread-ui.d.ts +18 -0
  188. package/dist/types/widgets-v2/spread/spread.d.ts +5 -0
  189. package/dist/types/widgets-v2/spread/types.d.ts +25 -0
  190. package/dist/types/widgets-v2/state/labels.d.ts +7 -0
  191. package/dist/types/widgets-v2/state/labels.test.d.ts +1 -0
  192. package/dist/types/widgets-v2/state/style.d.ts +19 -0
  193. package/dist/types/widgets-v2/state/widget-state.d.ts +19 -0
  194. package/dist/types/widgets-v2/stores/index.d.ts +8 -0
  195. package/dist/types/widgets-v2/stores/pipeline-middleware.d.ts +5 -0
  196. package/dist/types/widgets-v2/stores/pipeline-middleware.test.d.ts +1 -0
  197. package/dist/types/widgets-v2/stores/transforms.d.ts +4 -0
  198. package/dist/types/widgets-v2/stores/transforms.test.d.ts +1 -0
  199. package/dist/types/widgets-v2/stores/types.d.ts +55 -0
  200. package/dist/types/widgets-v2/stores/use-echart-instance.d.ts +15 -0
  201. package/dist/types/widgets-v2/stores/use-transform-enabled.d.ts +17 -0
  202. package/dist/types/widgets-v2/stores/use-transform.d.ts +12 -0
  203. package/dist/types/widgets-v2/stores/widget-context.d.ts +2 -0
  204. package/dist/types/widgets-v2/stores/widget-store-registry.d.ts +74 -0
  205. package/dist/types/widgets-v2/stores/widget-store-registry.test.d.ts +1 -0
  206. package/dist/types/widgets-v2/subheader/style.d.ts +10 -0
  207. package/dist/types/widgets-v2/subheader/subheader.d.ts +11 -0
  208. package/dist/types/widgets-v2/table/download.d.ts +18 -0
  209. package/dist/types/widgets-v2/table/download.test.d.ts +1 -0
  210. package/dist/types/widgets-v2/table/helpers.d.ts +32 -0
  211. package/dist/types/widgets-v2/table/helpers.test.d.ts +1 -0
  212. package/dist/types/widgets-v2/table/index.d.ts +7 -0
  213. package/dist/types/widgets-v2/table/labels.d.ts +22 -0
  214. package/dist/types/widgets-v2/table/skeleton.d.ts +22 -0
  215. package/dist/types/widgets-v2/table/style.d.ts +40 -0
  216. package/dist/types/widgets-v2/table/table-ui.d.ts +44 -0
  217. package/dist/types/widgets-v2/table/table.d.ts +50 -0
  218. package/dist/types/widgets-v2/table/types.d.ts +48 -0
  219. package/dist/types/widgets-v2/test-utils.d.ts +52 -0
  220. package/dist/types/widgets-v2/timeseries/download.d.ts +17 -0
  221. package/dist/types/widgets-v2/timeseries/download.test.d.ts +1 -0
  222. package/dist/types/widgets-v2/timeseries/index.d.ts +4 -0
  223. package/dist/types/widgets-v2/timeseries/options.d.ts +39 -0
  224. package/dist/types/widgets-v2/timeseries/options.test.d.ts +1 -0
  225. package/dist/types/widgets-v2/timeseries/skeleton.d.ts +8 -0
  226. package/dist/types/widgets-v2/timeseries/types.d.ts +60 -0
  227. package/dist/types/widgets-v2/toolbox/labels.d.ts +5 -0
  228. package/dist/types/widgets-v2/toolbox/style.d.ts +30 -0
  229. package/dist/types/widgets-v2/toolbox/toolbox.d.ts +49 -0
  230. package/dist/types/widgets-v2/types.d.ts +25 -0
  231. package/dist/types/widgets-v2/utils/data-zoom-layout.d.ts +11 -0
  232. package/dist/types/widgets-v2/utils/index.d.ts +3 -0
  233. package/dist/types/widgets-v2/utils/merge-options.d.ts +12 -0
  234. package/dist/types/widgets-v2/utils/merge-options.test.d.ts +1 -0
  235. package/dist/types/widgets-v2/utils/resolve-theme-color.d.ts +18 -0
  236. package/dist/types/widgets-v2/utils/resolve-theme-color.test.d.ts +1 -0
  237. package/dist/types/widgets-v2/wrapper/index.d.ts +4 -0
  238. package/dist/types/widgets-v2/wrapper/labels.d.ts +6 -0
  239. package/dist/types/widgets-v2/wrapper/style.d.ts +111 -0
  240. package/dist/types/widgets-v2/wrapper/widget-actions.d.ts +22 -0
  241. package/dist/types/widgets-v2/wrapper/widget-content.d.ts +12 -0
  242. package/dist/types/widgets-v2/wrapper/widget-wrapper.d.ts +51 -0
  243. package/dist/use-transform-DXPN3nY7.js +110 -0
  244. package/dist/use-transform-DXPN3nY7.js.map +1 -0
  245. package/dist/widget-context-DTGO0Yta.js +13 -0
  246. package/dist/widget-context-DTGO0Yta.js.map +1 -0
  247. package/dist/widget-store-registry-_W4Z4xp-.js +178 -0
  248. package/dist/widget-store-registry-_W4Z4xp-.js.map +1 -0
  249. package/dist/widgets/bar.js +14 -13
  250. package/dist/widgets/bar.js.map +1 -1
  251. package/dist/widgets/histogram.js +8 -7
  252. package/dist/widgets/histogram.js.map +1 -1
  253. package/dist/widgets/pie.js +19 -18
  254. package/dist/widgets/pie.js.map +1 -1
  255. package/dist/widgets/scatterplot.js +8 -7
  256. package/dist/widgets/scatterplot.js.map +1 -1
  257. package/dist/widgets/timeseries.js +11 -10
  258. package/dist/widgets/timeseries.js.map +1 -1
  259. package/dist/widgets/utils.js +8 -7
  260. package/dist/widgets/utils.js.map +1 -1
  261. package/dist/widgets-v2/actions.js +43 -0
  262. package/dist/widgets-v2/actions.js.map +1 -0
  263. package/dist/widgets-v2/bar.js +330 -0
  264. package/dist/widgets-v2/bar.js.map +1 -0
  265. package/dist/widgets-v2/category.js +104 -0
  266. package/dist/widgets-v2/category.js.map +1 -0
  267. package/dist/widgets-v2/echart.js +57 -0
  268. package/dist/widgets-v2/echart.js.map +1 -0
  269. package/dist/widgets-v2/formula.js +74 -0
  270. package/dist/widgets-v2/formula.js.map +1 -0
  271. package/dist/widgets-v2/histogram.js +353 -0
  272. package/dist/widgets-v2/histogram.js.map +1 -0
  273. package/dist/widgets-v2/markdown.js +68 -0
  274. package/dist/widgets-v2/markdown.js.map +1 -0
  275. package/dist/widgets-v2/pie.js +387 -0
  276. package/dist/widgets-v2/pie.js.map +1 -0
  277. package/dist/widgets-v2/range.js +52 -0
  278. package/dist/widgets-v2/range.js.map +1 -0
  279. package/dist/widgets-v2/scatterplot.js +411 -0
  280. package/dist/widgets-v2/scatterplot.js.map +1 -0
  281. package/dist/widgets-v2/spread.js +72 -0
  282. package/dist/widgets-v2/spread.js.map +1 -0
  283. package/dist/widgets-v2/stores.js +42 -0
  284. package/dist/widgets-v2/stores.js.map +1 -0
  285. package/dist/widgets-v2/table.js +78 -0
  286. package/dist/widgets-v2/table.js.map +1 -0
  287. package/dist/widgets-v2/timeseries.js +358 -0
  288. package/dist/widgets-v2/timeseries.js.map +1 -0
  289. package/dist/widgets-v2/utils.js +8 -0
  290. package/dist/widgets-v2/utils.js.map +1 -0
  291. package/dist/widgets-v2.js +953 -0
  292. package/dist/widgets-v2.js.map +1 -0
  293. package/package.json +71 -3
  294. package/src/components/lasso-tool/chip.test.tsx +176 -0
  295. package/src/components/lasso-tool/lasso-tool-inline.test.tsx +171 -0
  296. package/src/components/lasso-tool/lasso-tool.test.tsx +198 -0
  297. package/src/components/list-data/list-data.test.tsx +73 -0
  298. package/src/components/no-data-alert/no-data-alert.test.tsx +38 -0
  299. package/src/components/responsive-drawer/responsive-drawer.test.tsx +68 -0
  300. package/src/widgets/actions/brush-toggle/brush-overlay.test.tsx +465 -0
  301. package/src/widgets/actions/brush-toggle/brush-toggle.test.tsx +208 -0
  302. package/src/widgets/actions/change-column/change-column-dnd.test.tsx +193 -0
  303. package/src/widgets/actions/change-column/sortable-column-item.test.tsx +124 -0
  304. package/src/widgets/actions/zoom-toggle/zoom-toggle.test.tsx +322 -0
  305. package/src/widgets/category/components/category-rows.test.tsx +213 -0
  306. package/src/widgets/echart/utils.test.ts +277 -0
  307. package/src/widgets/formula/config.test.ts +37 -0
  308. package/src/widgets/range/components/range-item.test.tsx +243 -0
  309. package/src/widgets/stores/widget-store-branches.test.ts +275 -0
  310. package/src/widgets/table/config.test.ts +65 -0
  311. package/src/widgets/utils/chart-config/option-builders.test.ts +188 -0
  312. package/src/widgets-v2/PERFORMANCE.md +189 -0
  313. package/src/widgets-v2/actions/brush-toggle/brush-toggle.test.tsx +180 -0
  314. package/src/widgets-v2/actions/brush-toggle/brush-toggle.tsx +154 -0
  315. package/src/widgets-v2/actions/brush-toggle/index.ts +3 -0
  316. package/src/widgets-v2/actions/brush-toggle/labels.ts +9 -0
  317. package/src/widgets-v2/actions/brush-toggle/style.ts +11 -0
  318. package/src/widgets-v2/actions/brush-toggle/transforms.test.ts +47 -0
  319. package/src/widgets-v2/actions/brush-toggle/transforms.ts +31 -0
  320. package/src/widgets-v2/actions/change-column/change-column-icon.tsx +14 -0
  321. package/src/widgets-v2/actions/change-column/change-column.test.tsx +59 -0
  322. package/src/widgets-v2/actions/change-column/change-column.tsx +180 -0
  323. package/src/widgets-v2/actions/change-column/index.ts +7 -0
  324. package/src/widgets-v2/actions/change-column/labels.ts +9 -0
  325. package/src/widgets-v2/actions/change-column/sortable-column-item.tsx +56 -0
  326. package/src/widgets-v2/actions/change-column/style.ts +32 -0
  327. package/src/widgets-v2/actions/change-column/types.ts +11 -0
  328. package/src/widgets-v2/actions/download/download.test.tsx +327 -0
  329. package/src/widgets-v2/actions/download/download.tsx +144 -0
  330. package/src/widgets-v2/actions/download/exports.test.tsx +198 -0
  331. package/src/widgets-v2/actions/download/exports.ts +115 -0
  332. package/src/widgets-v2/actions/download/icons.tsx +26 -0
  333. package/src/widgets-v2/actions/download/index.ts +13 -0
  334. package/src/widgets-v2/actions/download/labels.ts +16 -0
  335. package/src/widgets-v2/actions/download/png-item.test.tsx +72 -0
  336. package/src/widgets-v2/actions/download/png-item.tsx +52 -0
  337. package/src/widgets-v2/actions/download/style.ts +3 -0
  338. package/src/widgets-v2/actions/download/types.ts +32 -0
  339. package/src/widgets-v2/actions/fullscreen/fullscreen.test.tsx +150 -0
  340. package/src/widgets-v2/actions/fullscreen/fullscreen.tsx +230 -0
  341. package/src/widgets-v2/actions/fullscreen/index.ts +7 -0
  342. package/src/widgets-v2/actions/fullscreen/labels.ts +9 -0
  343. package/src/widgets-v2/actions/fullscreen/style.ts +59 -0
  344. package/src/widgets-v2/actions/fullscreen/types.ts +15 -0
  345. package/src/widgets-v2/actions/index.ts +82 -0
  346. package/src/widgets-v2/actions/lock-selection/index.ts +10 -0
  347. package/src/widgets-v2/actions/lock-selection/labels.ts +11 -0
  348. package/src/widgets-v2/actions/lock-selection/lock-selection.test.tsx +187 -0
  349. package/src/widgets-v2/actions/lock-selection/lock-selection.tsx +130 -0
  350. package/src/widgets-v2/actions/lock-selection/style.ts +11 -0
  351. package/src/widgets-v2/actions/lock-selection/transforms.ts +27 -0
  352. package/src/widgets-v2/actions/relative-data/index.ts +3 -0
  353. package/src/widgets-v2/actions/relative-data/labels.ts +9 -0
  354. package/src/widgets-v2/actions/relative-data/relative-data.test.tsx +71 -0
  355. package/src/widgets-v2/actions/relative-data/relative-data.tsx +107 -0
  356. package/src/widgets-v2/actions/relative-data/style.ts +11 -0
  357. package/src/widgets-v2/actions/relative-data/transforms.test.ts +151 -0
  358. package/src/widgets-v2/actions/relative-data/transforms.ts +70 -0
  359. package/src/widgets-v2/actions/searcher/filter.ts +28 -0
  360. package/src/widgets-v2/actions/searcher/index.ts +8 -0
  361. package/src/widgets-v2/actions/searcher/labels.ts +13 -0
  362. package/src/widgets-v2/actions/searcher/searcher-toggle.tsx +91 -0
  363. package/src/widgets-v2/actions/searcher/searcher.test.tsx +92 -0
  364. package/src/widgets-v2/actions/searcher/searcher.tsx +112 -0
  365. package/src/widgets-v2/actions/searcher/style.ts +15 -0
  366. package/src/widgets-v2/actions/stack-toggle/index.ts +3 -0
  367. package/src/widgets-v2/actions/stack-toggle/labels.ts +9 -0
  368. package/src/widgets-v2/actions/stack-toggle/stack-toggle.test.tsx +61 -0
  369. package/src/widgets-v2/actions/stack-toggle/stack-toggle.tsx +54 -0
  370. package/src/widgets-v2/actions/stack-toggle/style.ts +11 -0
  371. package/src/widgets-v2/actions/stack-toggle/transforms.test.ts +43 -0
  372. package/src/widgets-v2/actions/stack-toggle/transforms.ts +25 -0
  373. package/src/widgets-v2/actions/zoom-toggle/index.ts +9 -0
  374. package/src/widgets-v2/actions/zoom-toggle/labels.ts +9 -0
  375. package/src/widgets-v2/actions/zoom-toggle/style.ts +11 -0
  376. package/src/widgets-v2/actions/zoom-toggle/transforms.test.ts +148 -0
  377. package/src/widgets-v2/actions/zoom-toggle/transforms.ts +171 -0
  378. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.test.tsx +107 -0
  379. package/src/widgets-v2/actions/zoom-toggle/zoom-toggle.tsx +106 -0
  380. package/src/widgets-v2/bar/download.test.tsx +91 -0
  381. package/src/widgets-v2/bar/download.tsx +66 -0
  382. package/src/widgets-v2/bar/index.ts +10 -0
  383. package/src/widgets-v2/bar/options.test.ts +334 -0
  384. package/src/widgets-v2/bar/options.ts +332 -0
  385. package/src/widgets-v2/bar/skeleton.test.tsx +19 -0
  386. package/src/widgets-v2/bar/skeleton.tsx +69 -0
  387. package/src/widgets-v2/bar/types.ts +51 -0
  388. package/src/widgets-v2/category/category-ui.test.tsx +746 -0
  389. package/src/widgets-v2/category/category-ui.tsx +389 -0
  390. package/src/widgets-v2/category/category.relative-data.test.tsx +107 -0
  391. package/src/widgets-v2/category/category.stack-toggle.test.tsx +85 -0
  392. package/src/widgets-v2/category/category.test.tsx +305 -0
  393. package/src/widgets-v2/category/category.tsx +121 -0
  394. package/src/widgets-v2/category/components/category-bar-stacked.test.tsx +121 -0
  395. package/src/widgets-v2/category/components/category-bar-stacked.tsx +73 -0
  396. package/src/widgets-v2/category/components/category-bar.test.tsx +64 -0
  397. package/src/widgets-v2/category/components/category-bar.tsx +49 -0
  398. package/src/widgets-v2/category/components/category-legend.test.tsx +51 -0
  399. package/src/widgets-v2/category/components/category-legend.tsx +39 -0
  400. package/src/widgets-v2/category/components/category-row-multi.tsx +86 -0
  401. package/src/widgets-v2/category/components/category-row-other.test.tsx +28 -0
  402. package/src/widgets-v2/category/components/category-row-other.tsx +33 -0
  403. package/src/widgets-v2/category/components/category-row-single.tsx +76 -0
  404. package/src/widgets-v2/category/components/category-row-stacked.test.tsx +244 -0
  405. package/src/widgets-v2/category/components/category-row-stacked.tsx +99 -0
  406. package/src/widgets-v2/category/download.test.ts +71 -0
  407. package/src/widgets-v2/category/download.ts +54 -0
  408. package/src/widgets-v2/category/index.ts +32 -0
  409. package/src/widgets-v2/category/skeleton.test.tsx +26 -0
  410. package/src/widgets-v2/category/skeleton.tsx +74 -0
  411. package/src/widgets-v2/category/style.ts +290 -0
  412. package/src/widgets-v2/category/types.ts +59 -0
  413. package/src/widgets-v2/echart/echart-ui.test.tsx +232 -0
  414. package/src/widgets-v2/echart/echart-ui.tsx +184 -0
  415. package/src/widgets-v2/echart/echart.test.tsx +229 -0
  416. package/src/widgets-v2/echart/echart.tsx +199 -0
  417. package/src/widgets-v2/echart/index.ts +22 -0
  418. package/src/widgets-v2/echart/shared-resize-observer.test.ts +91 -0
  419. package/src/widgets-v2/echart/shared-resize-observer.ts +56 -0
  420. package/src/widgets-v2/echart/style.ts +8 -0
  421. package/src/widgets-v2/echart/use-chart-selection.test.tsx +118 -0
  422. package/src/widgets-v2/echart/use-chart-selection.ts +115 -0
  423. package/src/widgets-v2/formula/delta.tsx +61 -0
  424. package/src/widgets-v2/formula/download.test.tsx +65 -0
  425. package/src/widgets-v2/formula/download.tsx +69 -0
  426. package/src/widgets-v2/formula/formula-ui.test.tsx +91 -0
  427. package/src/widgets-v2/formula/formula-ui.tsx +66 -0
  428. package/src/widgets-v2/formula/formula.test.tsx +50 -0
  429. package/src/widgets-v2/formula/formula.tsx +34 -0
  430. package/src/widgets-v2/formula/index.ts +17 -0
  431. package/src/widgets-v2/formula/note.tsx +25 -0
  432. package/src/widgets-v2/formula/prefix.tsx +25 -0
  433. package/src/widgets-v2/formula/series.tsx +67 -0
  434. package/src/widgets-v2/formula/skeleton.test.tsx +21 -0
  435. package/src/widgets-v2/formula/skeleton.tsx +27 -0
  436. package/src/widgets-v2/formula/style.ts +31 -0
  437. package/src/widgets-v2/formula/subcomponents.test.tsx +107 -0
  438. package/src/widgets-v2/formula/suffix.tsx +25 -0
  439. package/src/widgets-v2/formula/types.ts +48 -0
  440. package/src/widgets-v2/formula/value.tsx +31 -0
  441. package/src/widgets-v2/histogram/download.test.ts +94 -0
  442. package/src/widgets-v2/histogram/download.ts +60 -0
  443. package/src/widgets-v2/histogram/index.ts +10 -0
  444. package/src/widgets-v2/histogram/options.test.ts +318 -0
  445. package/src/widgets-v2/histogram/options.ts +338 -0
  446. package/src/widgets-v2/histogram/skeleton.test.tsx +16 -0
  447. package/src/widgets-v2/histogram/skeleton.tsx +70 -0
  448. package/src/widgets-v2/histogram/transforms.test.ts +46 -0
  449. package/src/widgets-v2/histogram/transforms.ts +30 -0
  450. package/src/widgets-v2/histogram/types.ts +55 -0
  451. package/src/widgets-v2/index.ts +204 -0
  452. package/src/widgets-v2/markdown/download.test.ts +66 -0
  453. package/src/widgets-v2/markdown/download.ts +53 -0
  454. package/src/widgets-v2/markdown/index.ts +6 -0
  455. package/src/widgets-v2/markdown/markdown-content.test.tsx +155 -0
  456. package/src/widgets-v2/markdown/markdown-content.tsx +72 -0
  457. package/src/widgets-v2/markdown/markdown-ui.test.tsx +75 -0
  458. package/src/widgets-v2/markdown/markdown-ui.tsx +55 -0
  459. package/src/widgets-v2/markdown/markdown.test.tsx +39 -0
  460. package/src/widgets-v2/markdown/markdown.tsx +17 -0
  461. package/src/widgets-v2/markdown/skeleton.test.tsx +15 -0
  462. package/src/widgets-v2/markdown/skeleton.tsx +32 -0
  463. package/src/widgets-v2/markdown/style.ts +53 -0
  464. package/src/widgets-v2/markdown/types.ts +4 -0
  465. package/src/widgets-v2/note/labels.ts +9 -0
  466. package/src/widgets-v2/note/style.ts +26 -0
  467. package/src/widgets-v2/note/widget-note.test.tsx +158 -0
  468. package/src/widgets-v2/note/widget-note.tsx +172 -0
  469. package/src/widgets-v2/pie/download.test.ts +78 -0
  470. package/src/widgets-v2/pie/download.ts +55 -0
  471. package/src/widgets-v2/pie/index.ts +10 -0
  472. package/src/widgets-v2/pie/options.test.ts +601 -0
  473. package/src/widgets-v2/pie/options.ts +513 -0
  474. package/src/widgets-v2/pie/skeleton.test.tsx +17 -0
  475. package/src/widgets-v2/pie/skeleton.tsx +32 -0
  476. package/src/widgets-v2/pie/types.ts +62 -0
  477. package/src/widgets-v2/provider/widget-provider.test.tsx +119 -0
  478. package/src/widgets-v2/provider/widget-provider.tsx +111 -0
  479. package/src/widgets-v2/range/index.ts +4 -0
  480. package/src/widgets-v2/range/range-ui.test.tsx +136 -0
  481. package/src/widgets-v2/range/range-ui.tsx +278 -0
  482. package/src/widgets-v2/range/range.test.tsx +68 -0
  483. package/src/widgets-v2/range/range.tsx +52 -0
  484. package/src/widgets-v2/range/skeleton.test.tsx +17 -0
  485. package/src/widgets-v2/range/skeleton.tsx +47 -0
  486. package/src/widgets-v2/range/style.ts +41 -0
  487. package/src/widgets-v2/range/types.ts +37 -0
  488. package/src/widgets-v2/scatterplot/download.test.ts +71 -0
  489. package/src/widgets-v2/scatterplot/download.ts +54 -0
  490. package/src/widgets-v2/scatterplot/index.ts +11 -0
  491. package/src/widgets-v2/scatterplot/options.test.ts +411 -0
  492. package/src/widgets-v2/scatterplot/options.ts +425 -0
  493. package/src/widgets-v2/scatterplot/skeleton.test.tsx +17 -0
  494. package/src/widgets-v2/scatterplot/skeleton.tsx +84 -0
  495. package/src/widgets-v2/scatterplot/transforms.test.ts +97 -0
  496. package/src/widgets-v2/scatterplot/transforms.ts +38 -0
  497. package/src/widgets-v2/scatterplot/types.ts +59 -0
  498. package/src/widgets-v2/selection-summary/labels.ts +11 -0
  499. package/src/widgets-v2/selection-summary/selection-summary.test.tsx +53 -0
  500. package/src/widgets-v2/selection-summary/selection-summary.tsx +62 -0
  501. package/src/widgets-v2/selection-summary/style.ts +23 -0
  502. package/src/widgets-v2/spread/download.test.ts +64 -0
  503. package/src/widgets-v2/spread/download.ts +59 -0
  504. package/src/widgets-v2/spread/index.ts +6 -0
  505. package/src/widgets-v2/spread/separator.tsx +11 -0
  506. package/src/widgets-v2/spread/skeleton.test.tsx +17 -0
  507. package/src/widgets-v2/spread/skeleton.tsx +38 -0
  508. package/src/widgets-v2/spread/spread-ui.test.tsx +108 -0
  509. package/src/widgets-v2/spread/spread-ui.tsx +52 -0
  510. package/src/widgets-v2/spread/spread.test.tsx +50 -0
  511. package/src/widgets-v2/spread/spread.tsx +31 -0
  512. package/src/widgets-v2/spread/types.ts +27 -0
  513. package/src/widgets-v2/state/labels.test.ts +33 -0
  514. package/src/widgets-v2/state/labels.ts +20 -0
  515. package/src/widgets-v2/state/style.ts +25 -0
  516. package/src/widgets-v2/state/widget-state.test.tsx +294 -0
  517. package/src/widgets-v2/state/widget-state.tsx +184 -0
  518. package/src/widgets-v2/stores/index.ts +49 -0
  519. package/src/widgets-v2/stores/pipeline-middleware.test.ts +187 -0
  520. package/src/widgets-v2/stores/pipeline-middleware.ts +91 -0
  521. package/src/widgets-v2/stores/transforms.test.ts +162 -0
  522. package/src/widgets-v2/stores/transforms.ts +70 -0
  523. package/src/widgets-v2/stores/types.ts +64 -0
  524. package/src/widgets-v2/stores/use-echart-instance.test.tsx +91 -0
  525. package/src/widgets-v2/stores/use-echart-instance.ts +29 -0
  526. package/src/widgets-v2/stores/use-transform-enabled.test.tsx +127 -0
  527. package/src/widgets-v2/stores/use-transform-enabled.ts +25 -0
  528. package/src/widgets-v2/stores/use-transform.test.tsx +262 -0
  529. package/src/widgets-v2/stores/use-transform.ts +158 -0
  530. package/src/widgets-v2/stores/widget-context.test.tsx +58 -0
  531. package/src/widgets-v2/stores/widget-context.ts +15 -0
  532. package/src/widgets-v2/stores/widget-store-registry.test.ts +292 -0
  533. package/src/widgets-v2/stores/widget-store-registry.ts +248 -0
  534. package/src/widgets-v2/subheader/style.ts +12 -0
  535. package/src/widgets-v2/subheader/subheader.test.tsx +30 -0
  536. package/src/widgets-v2/subheader/subheader.tsx +16 -0
  537. package/src/widgets-v2/table/download.test.ts +75 -0
  538. package/src/widgets-v2/table/download.ts +47 -0
  539. package/src/widgets-v2/table/helpers.test.ts +214 -0
  540. package/src/widgets-v2/table/helpers.ts +136 -0
  541. package/src/widgets-v2/table/index.ts +23 -0
  542. package/src/widgets-v2/table/labels.tsx +41 -0
  543. package/src/widgets-v2/table/skeleton.test.tsx +26 -0
  544. package/src/widgets-v2/table/skeleton.tsx +65 -0
  545. package/src/widgets-v2/table/style.ts +43 -0
  546. package/src/widgets-v2/table/table-ui.test.tsx +200 -0
  547. package/src/widgets-v2/table/table-ui.tsx +364 -0
  548. package/src/widgets-v2/table/table.test.tsx +119 -0
  549. package/src/widgets-v2/table/table.tsx +179 -0
  550. package/src/widgets-v2/table/types.ts +55 -0
  551. package/src/widgets-v2/test-utils.ts +107 -0
  552. package/src/widgets-v2/timeseries/download.test.ts +95 -0
  553. package/src/widgets-v2/timeseries/download.ts +86 -0
  554. package/src/widgets-v2/timeseries/index.ts +10 -0
  555. package/src/widgets-v2/timeseries/options.test.ts +394 -0
  556. package/src/widgets-v2/timeseries/options.ts +348 -0
  557. package/src/widgets-v2/timeseries/skeleton.test.tsx +13 -0
  558. package/src/widgets-v2/timeseries/skeleton.tsx +76 -0
  559. package/src/widgets-v2/timeseries/types.ts +65 -0
  560. package/src/widgets-v2/toolbox/labels.ts +9 -0
  561. package/src/widgets-v2/toolbox/style.ts +33 -0
  562. package/src/widgets-v2/toolbox/toolbox.test.tsx +200 -0
  563. package/src/widgets-v2/toolbox/toolbox.tsx +309 -0
  564. package/src/widgets-v2/types.ts +25 -0
  565. package/src/widgets-v2/utils/data-zoom-layout.ts +26 -0
  566. package/src/widgets-v2/utils/index.ts +3 -0
  567. package/src/widgets-v2/utils/merge-options.test.ts +52 -0
  568. package/src/widgets-v2/utils/merge-options.ts +50 -0
  569. package/src/widgets-v2/utils/resolve-theme-color.test.ts +43 -0
  570. package/src/widgets-v2/utils/resolve-theme-color.ts +34 -0
  571. package/src/widgets-v2/wrapper/index.ts +14 -0
  572. package/src/widgets-v2/wrapper/labels.ts +11 -0
  573. package/src/widgets-v2/wrapper/style.ts +134 -0
  574. package/src/widgets-v2/wrapper/widget-actions.test.tsx +52 -0
  575. package/src/widgets-v2/wrapper/widget-actions.tsx +43 -0
  576. package/src/widgets-v2/wrapper/widget-content.test.tsx +27 -0
  577. package/src/widgets-v2/wrapper/widget-content.tsx +29 -0
  578. package/src/widgets-v2/wrapper/widget-wrapper.test.tsx +159 -0
  579. package/src/widgets-v2/wrapper/widget-wrapper.tsx +178 -0
  580. package/dist/styles-BYTyKQFP.js.map +0 -1
@@ -0,0 +1,513 @@
1
+ import type { Theme } from '@mui/material'
2
+ import type { EChartsOption } from 'echarts'
3
+ import * as echarts from 'echarts'
4
+ import type { CallbackDataParams } from 'echarts/types/dist/shared'
5
+ import {
6
+ buildGridConfig,
7
+ buildLegendConfig,
8
+ buildSeriesLabelConfig,
9
+ createTooltipFormatter,
10
+ createTooltipPositioner,
11
+ niceNum,
12
+ } from '../../widgets/utils/chart-config'
13
+ import type { OptionFactory, OptionFactoryContext } from '../echart'
14
+ import { mergeOptions, resolveThemeColor } from '../utils'
15
+ import type { WidgetSeries } from '../types'
16
+ import type {
17
+ PieEChartsOption,
18
+ PieOptionFactoryInput,
19
+ PieOptionsInput,
20
+ PieWidgetData,
21
+ } from './types'
22
+
23
+ const DEFAULT_RADIUS: readonly [string, string] = ['58%', '74%']
24
+
25
+ /**
26
+ * Builds the **structural** ECharts option for a pie / donut widget.
27
+ * Mirrors v1's pie look-and-feel: themed legend (`buildLegendConfig`),
28
+ * themed tooltip via `createTooltipPositioner` / `createTooltipFormatter`,
29
+ * `qualitative.bold` color palette, slice borders against the paper
30
+ * background, hover-emphasis disabled, and a centered rich-text label.
31
+ *
32
+ * Layered like Bar / Histogram:
33
+ * - **Theme-aware bits** live here on a series template (slice border,
34
+ * center-label rich style sizes, emphasis-disabled).
35
+ * - **Reactive bits** (tooltip value formatter, center-label text,
36
+ * selection-driven dim) are re-emitted by
37
+ * {@link createPieOptionFactory} at fusion time so RelativeData's
38
+ * percent override flows through.
39
+ */
40
+ export function pieOptions({
41
+ theme,
42
+ formatter,
43
+ labelFormatter,
44
+ }: PieOptionsInput): PieEChartsOption {
45
+ return {
46
+ legend: {
47
+ ...buildLegendConfig({ hasLegend: true, labelFormatter }),
48
+ // Pie reads better with a centered legend (the donut is radially
49
+ // symmetric — left-aligning the legend below it visually unbalances
50
+ // the chart). Override `buildLegendConfig`'s `type: 'scroll'` with
51
+ // `'plain'` so long category lists wrap to multiple rows instead
52
+ // of clipping the last visible item against the chart container.
53
+ // The wider `itemGap` gives chips breathing room in the typical
54
+ // 3–6 category case.
55
+ left: 'center',
56
+ type: 'scroll',
57
+ itemGap: 16,
58
+ },
59
+ tooltip: {
60
+ // Pie uses item-trigger (no axis); the rest of the styling mirrors
61
+ // bar/histogram so the dashboard reads consistently — dark
62
+ // grey[900] bg, white caption-font text, padded, with the shared
63
+ // overflow-aware positioner.
64
+ trigger: 'item',
65
+ backgroundColor: theme.palette.grey[900],
66
+ borderWidth: 0,
67
+ padding: [parseInt(theme.spacing(1)), parseInt(theme.spacing(1))],
68
+ textStyle: {
69
+ color: theme.palette.common.white,
70
+ fontSize: 11,
71
+ fontFamily: theme.typography.caption.fontFamily,
72
+ },
73
+ position: createTooltipPositioner(theme),
74
+ formatter: buildPieTooltipFormatter(formatter, labelFormatter),
75
+ },
76
+ // V1 used `qualitative.bold` only (no `secondary.main` prefix) because
77
+ // pie slices are categorical — each slice deserves a distinct palette
78
+ // entry from the start, not a primary highlight.
79
+ color: Object.values(
80
+ (theme.palette as { qualitative?: { bold?: Record<string, string> } })
81
+ .qualitative?.bold ?? {},
82
+ ),
83
+ // Pie template. The merger spreads this into each per-data series it
84
+ // emits — borderColor / borderWidth / emphasis-disabled / label rich
85
+ // sizes all survive through.
86
+ series: [
87
+ {
88
+ type: 'pie',
89
+ colorBy: 'data',
90
+ avoidLabelOverlap: true,
91
+ selectedOffset: 0,
92
+ emphasis: { disabled: true },
93
+ itemStyle: {
94
+ borderColor: theme.palette.background.paper,
95
+ borderWidth: 1,
96
+ },
97
+ label: {
98
+ show: true,
99
+ position: 'center',
100
+ rich: {
101
+ b: { fontSize: 16, fontWeight: 'normal', lineHeight: 20 },
102
+ c: { fontSize: 28, fontWeight: 'bold', lineHeight: 27 },
103
+ },
104
+ },
105
+ },
106
+ ],
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Returns the pie widget's {@link OptionFactory} — one closure that owns
112
+ * BOTH phases of option construction:
113
+ *
114
+ * - **Structural phase** (`option == null`) — builds the theme-aware
115
+ * structural option via {@link pieOptions}, optionally merging the
116
+ * consumer-supplied `optionsOverride` on top. Called once by Provider
117
+ * to seed `rawOptions` in the store.
118
+ * - **Merge phase** (`option != null`) — fuses post-pipeline `state.data`
119
+ * (`PieWidgetData`) into the option via the dataset API. Single-series
120
+ * → donut (one dataset, `series[i].encode = { itemName: 'name', value: 'value' }`).
121
+ * Multi-series → horizontal-bar fallback (mirrors v1 pie). Reactive
122
+ * formatters from `ctx` drive the tooltip + center label at fusion
123
+ * time so RelativeData's percent formatter flows through without a
124
+ * structural rebuild.
125
+ */
126
+ export function createPieOptionFactory(
127
+ options: PieOptionFactoryInput,
128
+ ): OptionFactory {
129
+ const { theme, formatter, labelFormatter, optionsOverride, series } = options
130
+ const radius = options.radius ?? DEFAULT_RADIUS
131
+ const selection = options.selection
132
+ const selectionSet =
133
+ selection && selection.length > 0
134
+ ? new Set<string | number>(selection)
135
+ : null
136
+ return (option, data, ctx) => {
137
+ if (option == null) {
138
+ const structural = pieOptions({ theme, formatter, labelFormatter })
139
+ return optionsOverride
140
+ ? (mergeOptions(
141
+ structural as unknown as Record<string, unknown>,
142
+ optionsOverride as Partial<Record<string, unknown>>,
143
+ ) as EChartsOption)
144
+ : structural
145
+ }
146
+
147
+ const seriesArr = Array.isArray(data) ? (data as PieWidgetData) : []
148
+ if (seriesArr.length === 0) {
149
+ return { ...option, dataset: [], series: [] }
150
+ }
151
+ if (seriesArr.length > 1) {
152
+ return buildMultiSeriesBarFusion(
153
+ option,
154
+ seriesArr,
155
+ theme,
156
+ series,
157
+ ctx,
158
+ selectionSet,
159
+ )
160
+ }
161
+ return buildSingleSeriesPieFusion(
162
+ option,
163
+ seriesArr,
164
+ radius,
165
+ series,
166
+ ctx,
167
+ selectionSet,
168
+ )
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Single-series donut fusion. Spreads the structural pie series template
174
+ * into per-data series with center/radius/encoding, wires the reactive
175
+ * center-label / tooltip formatters and the per-data palette-aware
176
+ * selection-dim callback.
177
+ */
178
+ function buildSingleSeriesPieFusion(
179
+ option: EChartsOption,
180
+ seriesArr: PieWidgetData,
181
+ radius: readonly [string, string],
182
+ series: readonly WidgetSeries[] | undefined,
183
+ ctx: OptionFactoryContext | undefined,
184
+ selectionSet: Set<string | number> | null,
185
+ ): EChartsOption {
186
+ const seriesTemplates = Array.isArray(option.series) ? option.series : []
187
+ const broadcastTemplate = seriesTemplates[0] ?? {}
188
+ const baseTooltip =
189
+ typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)
190
+ ? option.tooltip
191
+ : {}
192
+ const baseLegend =
193
+ typeof option.legend === 'object' && !Array.isArray(option.legend)
194
+ ? option.legend
195
+ : {}
196
+ const formatter = ctx?.formatter
197
+ const labelFormatter = ctx?.labelFormatter
198
+
199
+ // Pie wants `colorBy: 'data'` — each slice draws from the option's
200
+ // `color` palette by data index. But installing an `itemStyle.color`
201
+ // callback disables ECharts' automatic per-data cycling, and
202
+ // `params.color` collapses to the series color (so every slice goes
203
+ // the same color). We re-implement the per-data palette resolution
204
+ // here so the multicolor look survives selection-driven dimming.
205
+ const palette = Array.isArray(option.color)
206
+ ? (option.color as readonly (string | undefined)[])
207
+ : []
208
+ const resolvePaletteColor = (params: CallbackDataParams): string => {
209
+ const swatch =
210
+ palette.length > 0
211
+ ? palette[params.dataIndex % palette.length]
212
+ : undefined
213
+ return swatch ?? (params.color as string)
214
+ }
215
+
216
+ // Always emit `itemStyle.color` (passthrough when nothing is selected),
217
+ // not conditionally — same anti-stale-callback rationale as bar /
218
+ // histogram. The slice border + width come from the structural
219
+ // template's `itemStyle` and survive via the spread below.
220
+ const colorFn = (params: CallbackDataParams): string => {
221
+ const base = resolvePaletteColor(params)
222
+ if (!selectionSet) return base
223
+ const datum = params.value as { name?: string | number } | undefined
224
+ const name = datum?.name ?? params.name
225
+ return name != null && selectionSet.has(name)
226
+ ? base
227
+ : echarts.color.modifyAlpha(base, 0.15)
228
+ }
229
+
230
+ // Center label formatter — lives in the merger because it reads
231
+ // reactive `formatter` / `labelFormatter` from ctx. The rich tags
232
+ // `{c|…}` and `{b|…}` reference the rich styles baked into the
233
+ // structural label template.
234
+ const labelTextFormatter = (params: CallbackDataParams): string => {
235
+ const { name } = params
236
+ const encodeIndex = params.encode?.value?.[0]
237
+ if (encodeIndex === undefined) return ''
238
+ const value = (Object.values(params.data ?? {}) as unknown[]).at(
239
+ encodeIndex,
240
+ )
241
+ // `value` here is the resolved dataset cell — for pie data it's a
242
+ // `string | number` primitive. Anything else is a misuse we won't
243
+ // dress up with `String(...)` (would render "[object Object]").
244
+ const formattedValue =
245
+ typeof value === 'number'
246
+ ? formatter
247
+ ? formatter(value)
248
+ : String(value)
249
+ : typeof value === 'string'
250
+ ? value
251
+ : ''
252
+ const formattedName = labelFormatter
253
+ ? String(labelFormatter(name ?? ''))
254
+ : String(name ?? '')
255
+ return `{c|${formattedValue}}\n\n{b|${formattedName}}`
256
+ }
257
+
258
+ return {
259
+ ...option,
260
+ dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),
261
+ series: seriesArr.map((_, i) => {
262
+ const template =
263
+ (seriesTemplates[i] as object | undefined) ??
264
+ (broadcastTemplate as object)
265
+ const templateObj = typeof template === 'object' ? template : {}
266
+ const templateLabel = (templateObj as { label?: object }).label ?? {}
267
+ const templateItemStyle =
268
+ (templateObj as { itemStyle?: object }).itemStyle ?? {}
269
+ return {
270
+ ...templateObj,
271
+ type: 'pie' as const,
272
+ datasetIndex: i,
273
+ name: series?.[i]?.name ?? `Series ${i + 1}`,
274
+ radius: [...radius],
275
+ // Lift the donut up so the bottom-anchored legend has the
276
+ // vertical real estate to wrap to multiple rows for long
277
+ // category lists — at exactly `50%` the bottom slices crowd
278
+ // the chips and `type: 'plain'` legends can't expand upward
279
+ // without overlapping the donut.
280
+ center: ['50%', '38%'] as [string, string],
281
+ encode: { itemName: 'name', value: 'value' },
282
+ label: {
283
+ ...templateLabel,
284
+ formatter: labelTextFormatter,
285
+ },
286
+ itemStyle: {
287
+ ...templateItemStyle,
288
+ color: colorFn,
289
+ },
290
+ }
291
+ }),
292
+ // Legend always shows for pie (mirrors v1) — slice names drive the
293
+ // entries, so even a single donut benefits from a category list.
294
+ legend: { ...baseLegend, show: true },
295
+ tooltip: {
296
+ ...baseTooltip,
297
+ formatter: buildPieTooltipFormatter(formatter, labelFormatter),
298
+ },
299
+ }
300
+ }
301
+
302
+ /**
303
+ * Multi-series horizontal-bar fusion. Mirrors v1 pie's "pie data with
304
+ * >1 series collapses into a horizontal bar chart" behavior — side-by-
305
+ * side donuts don't read well when you're comparing the same categories
306
+ * across cohorts, so swap to a value-on-x / category-on-y bar layout.
307
+ *
308
+ * Pie data shape is identical to bar's (`{ name, value }[][]`), so the
309
+ * same dataset feeds either layout without transformation.
310
+ */
311
+ function buildMultiSeriesBarFusion(
312
+ option: EChartsOption,
313
+ seriesArr: PieWidgetData,
314
+ theme: Theme,
315
+ series: readonly WidgetSeries[] | undefined,
316
+ ctx: OptionFactoryContext | undefined,
317
+ selectionSet: Set<string | number> | null,
318
+ ): EChartsOption {
319
+ const baseTooltip =
320
+ typeof option.tooltip === 'object' && !Array.isArray(option.tooltip)
321
+ ? option.tooltip
322
+ : {}
323
+ const baseLegend =
324
+ typeof option.legend === 'object' && !Array.isArray(option.legend)
325
+ ? option.legend
326
+ : {}
327
+ const baseGrid =
328
+ typeof option.grid === 'object' && !Array.isArray(option.grid)
329
+ ? option.grid
330
+ : {}
331
+ const formatter = ctx?.formatter
332
+ const labelFormatter = ctx?.labelFormatter
333
+
334
+ const { niceMinVal, niceMaxVal } = computeNiceBounds(seriesArr)
335
+
336
+ // Per-series palette — multi-series bars take one color per series
337
+ // (not per-data, unlike donut slices). Same anti-stale-callback rule:
338
+ // always emit the callback so a transition to/from a selection
339
+ // replaces the previous closure cleanly.
340
+ const palette = Array.isArray(option.color)
341
+ ? (option.color as readonly (string | undefined)[])
342
+ : []
343
+ const barColorFn = (params: CallbackDataParams): string => {
344
+ const seriesIdx = params.seriesIndex ?? 0
345
+ const seriesSwatch =
346
+ palette.length > 0 ? palette[seriesIdx % palette.length] : undefined
347
+ const base = (seriesSwatch ?? params.color) as string
348
+ if (!selectionSet) return base
349
+ const datum = params.value as { name?: string | number } | undefined
350
+ const name = datum?.name ?? params.name
351
+ return name != null && selectionSet.has(name)
352
+ ? base
353
+ : echarts.color.modifyAlpha(base, 0.15)
354
+ }
355
+
356
+ return {
357
+ ...option,
358
+ dataset: seriesArr.map((s) => ({ source: s as readonly object[] })),
359
+ grid: {
360
+ ...baseGrid,
361
+ ...buildGridConfig(true, theme),
362
+ right: parseInt(theme.spacing(4)),
363
+ containLabel: true,
364
+ },
365
+ // Drop pie-specific structural keys that shouldn't render in the
366
+ // bar fallback. ECharts ignores undefined keys, so this is a clean
367
+ // override.
368
+ series: seriesArr.map((_, i) => {
369
+ const overrideColor = resolveThemeColor(theme, series?.[i]?.color)
370
+ return {
371
+ datasetIndex: i,
372
+ type: 'bar' as const,
373
+ name: series?.[i]?.name ?? `Series ${i + 1}`,
374
+ barMaxWidth: 100,
375
+ emphasis: { focus: 'series' },
376
+ ...buildSeriesLabelConfig(formatter, 'x'),
377
+ itemStyle: { color: barColorFn },
378
+ ...(overrideColor ? { color: overrideColor } : {}),
379
+ }
380
+ }),
381
+ xAxis: {
382
+ type: 'value',
383
+ // Closures over the pre-computed nice bounds — ECharts calls them
384
+ // once per render to resolve the axis extents.
385
+ min: () => niceMinVal,
386
+ max: () => niceMaxVal,
387
+ axisLine: { show: false },
388
+ axisTick: { show: false },
389
+ splitLine: {
390
+ show: true,
391
+ lineStyle: { color: theme.palette.black?.[4] ?? theme.palette.divider },
392
+ },
393
+ // Value labels render BELOW the axis line (default placement),
394
+ // NOT inside the plot. Bar/histogram use `inside: true` +
395
+ // `verticalAlign: 'bottom'` for their *vertical* y-axis where the
396
+ // axis is the left wall — labels inside read like grid annotations.
397
+ // A horizontal bar chart's value axis is the x-axis, and `inside`
398
+ // there pushes the max label *behind* the bar (it visually
399
+ // disappears once a bar reaches the right edge). Use the default
400
+ // below-the-axis placement so the rounded extents stay readable.
401
+ axisLabel: {
402
+ fontSize: theme.typography.overlineDelicate?.fontSize,
403
+ fontFamily: theme.typography.overlineDelicate?.fontFamily,
404
+ margin: parseInt(theme.spacing(1)),
405
+ showMaxLabel: true,
406
+ showMinLabel: true,
407
+ formatter: (value: number) => {
408
+ if (value !== niceMaxVal && value !== niceMinVal) return ''
409
+ if (value === 0) return ''
410
+ return formatter ? formatter(value) : String(value)
411
+ },
412
+ },
413
+ },
414
+ yAxis: {
415
+ type: 'category',
416
+ axisLine: { show: false },
417
+ axisTick: { show: false },
418
+ axisLabel: {
419
+ padding: [parseInt(theme.spacing(0.5)), 0, 0, 0],
420
+ ...(labelFormatter && {
421
+ formatter: (value: string | number) => String(labelFormatter(value)),
422
+ }),
423
+ },
424
+ },
425
+ legend: { ...baseLegend, show: true },
426
+ tooltip: {
427
+ ...baseTooltip,
428
+ trigger: 'axis',
429
+ formatter: buildHorizontalBarTooltipFormatter(formatter, labelFormatter),
430
+ },
431
+ } as EChartsOption
432
+ }
433
+
434
+ /**
435
+ * Tooltip formatter for the horizontal-bar fallback. Reads the value by
436
+ * `encode.x` dimension index (v1 parity) so it stays robust to
437
+ * downstream changes that rename dataset columns.
438
+ */
439
+ function buildHorizontalBarTooltipFormatter(
440
+ formatter: ((value: number) => string) | undefined,
441
+ labelFormatter: ((value: string | number) => string | number) | undefined,
442
+ ) {
443
+ return createTooltipFormatter((item) => {
444
+ const encodeIndex = item.encode?.x?.at(0)
445
+ const dimName =
446
+ encodeIndex !== undefined ? item.dimensionNames?.[encodeIndex] : undefined
447
+ const row =
448
+ item.value && typeof item.value === 'object' && !Array.isArray(item.value)
449
+ ? (item.value as Record<string, string | number>)
450
+ : undefined
451
+ const raw = dimName && row ? row[dimName] : undefined
452
+ const formattedValue =
453
+ typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')
454
+ const marker = typeof item.marker === 'string' ? item.marker : ''
455
+ const seriesName = item.seriesName ? `${item.seriesName}: ` : ''
456
+ const name = labelFormatter
457
+ ? String(labelFormatter(item.name ?? ''))
458
+ : String(item.name ?? '')
459
+ return { name, seriesName, marker, value: formattedValue }
460
+ })
461
+ }
462
+
463
+ /**
464
+ * Min/max bounds over every datum's `.value` across all series. Used by
465
+ * the horizontal-bar fallback's x-axis label formatter so we only render
466
+ * labels at the rounded extents (matches v1 + bar / histogram).
467
+ */
468
+ function computeNiceBounds(seriesArr: PieWidgetData): {
469
+ niceMinVal: number
470
+ niceMaxVal: number
471
+ } {
472
+ let min = 0
473
+ let max = -Infinity
474
+ for (const series of seriesArr) {
475
+ for (const d of series) {
476
+ if (typeof d?.value !== 'number' || !Number.isFinite(d.value)) continue
477
+ if (d.value < min) min = d.value
478
+ if (d.value > max) max = d.value
479
+ }
480
+ }
481
+ return {
482
+ niceMinVal: min < 0 ? niceNum(min) : 0,
483
+ niceMaxVal: max <= 0 ? 1 : niceNum(max),
484
+ }
485
+ }
486
+
487
+ /**
488
+ * Tooltip formatter for pie slices. `item.value` is the dataset row
489
+ * object (e.g. `{ name: 'A', value: 10 }`); we pull the value by
490
+ * `encode.value`'s dimension index, formatted via the reactive `formatter`
491
+ * if present. Slice name passes through `labelFormatter`.
492
+ */
493
+ function buildPieTooltipFormatter(
494
+ formatter: ((value: number) => string) | undefined,
495
+ labelFormatter: ((value: string | number) => string | number) | undefined,
496
+ ) {
497
+ return createTooltipFormatter((item) => {
498
+ const encodeIndex = item.encode?.value?.at(0) ?? 1
499
+ const values =
500
+ item.value && typeof item.value === 'object' && !Array.isArray(item.value)
501
+ ? (Object.values(item.value) as (string | number)[])
502
+ : []
503
+ const raw = values[encodeIndex]
504
+ const formattedValue =
505
+ typeof raw === 'number' && formatter ? formatter(raw) : (raw ?? '')
506
+ const marker = typeof item.marker === 'string' ? item.marker : ''
507
+ const seriesName = item.seriesName ? `${item.seriesName}: ` : ''
508
+ const name = labelFormatter
509
+ ? String(labelFormatter(item.name ?? ''))
510
+ : String(item.name ?? '')
511
+ return { name, seriesName, marker, value: formattedValue }
512
+ })
513
+ }
@@ -0,0 +1,17 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { render } from '@testing-library/react'
3
+ import { PieSkeleton } from './skeleton'
4
+
5
+ describe('<PieSkeleton>', () => {
6
+ it('renders the default single-donut skeleton', () => {
7
+ const { container } = render(<PieSkeleton />)
8
+ expect(
9
+ container.querySelectorAll('.MuiSkeleton-root').length,
10
+ ).toBeGreaterThan(0)
11
+ })
12
+
13
+ it('scales with count', () => {
14
+ const { container } = render(<PieSkeleton count={3} />)
15
+ expect(container.firstChild).not.toBeNull()
16
+ })
17
+ })
@@ -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
+ alignItems: 'center',
8
+ justifyContent: 'center',
9
+ minHeight: 200,
10
+ py: 1,
11
+ gap: 2,
12
+ },
13
+ donut: {
14
+ width: 160,
15
+ height: 160,
16
+ borderRadius: '50%',
17
+ },
18
+ } satisfies Record<string, SxProps<Theme>>
19
+
20
+ export interface PieSkeletonProps {
21
+ count?: number
22
+ }
23
+
24
+ export function PieSkeleton({ count = 1 }: PieSkeletonProps) {
25
+ return (
26
+ <Box sx={styles.root}>
27
+ {Array.from({ length: count }).map((_, i) => (
28
+ <Skeleton key={`donut-${i}`} variant='circular' sx={styles.donut} />
29
+ ))}
30
+ </Box>
31
+ )
32
+ }
@@ -0,0 +1,62 @@
1
+ import type { Theme } from '@mui/material'
2
+ import type { EChartsOption } from 'echarts'
3
+ import type { WidgetSeries } from '../types'
4
+
5
+ /** A single slice of a pie series. */
6
+ export interface PieDatum {
7
+ name: string | number
8
+ value: number
9
+ }
10
+
11
+ /** Pie widget data — one slice array per series (rendered as side-by-side donuts). */
12
+ export type PieWidgetData = readonly (readonly PieDatum[])[]
13
+
14
+ /** Inputs to the structural-only {@link pieOptions} builder. */
15
+ export interface PieOptionsInput {
16
+ theme: Theme
17
+ /** Numeric value formatter — drives the tooltip value and center label. */
18
+ formatter?: (value: number) => string
19
+ /** Optional slice-name formatter — also forwarded to the legend. */
20
+ labelFormatter?: (value: string | number) => string | number
21
+ }
22
+
23
+ /**
24
+ * Combined inputs for the pie option factory creator. Carries everything
25
+ * the widget needs across BOTH phases — the structural-build (`theme`,
26
+ * `formatter`, `labelFormatter`, `optionsOverride`) AND the data merge
27
+ * (`series`, `radius`, `selection`). The merger emits different
28
+ * chart shapes by series count: single → donut, multi → horizontal-bar
29
+ * fallback (mirrors v1 pie); both branches read `theme` for styling.
30
+ */
31
+ export interface PieOptionFactoryInput {
32
+ theme: Theme
33
+ formatter?: (value: number) => string
34
+ labelFormatter?: (value: string | number) => string | number
35
+ /**
36
+ * Per-series metadata — drives the legend, `series[i].name`, and (in
37
+ * the multi-series bar fallback) per-series colour overrides.
38
+ * Single-series donuts always use the per-slice palette regardless of
39
+ * any `series[0].color`, since the donut palette is keyed by data
40
+ * index, not series index.
41
+ */
42
+ series?: readonly WidgetSeries[]
43
+ /**
44
+ * Inner/outer radius (percent). Default `['58%', '74%']` produces a
45
+ * donut sized to leave room for the wrappable bottom legend. Set
46
+ * inner to `'0%'` for a solid pie.
47
+ */
48
+ radius?: readonly [string, string]
49
+ /**
50
+ * Selected slice names. Slices not in this list render dimmed
51
+ * (`itemStyle.opacity: 0.15`). `null`/empty means no selection.
52
+ */
53
+ selection?: readonly (string | number)[] | null
54
+ /**
55
+ * Consumer-supplied partial option merged into the structural option at
56
+ * structural-build time. Lets stories override pieces of the theme-aware
57
+ * base without forking the structural builder.
58
+ */
59
+ optionsOverride?: Partial<EChartsOption>
60
+ }
61
+
62
+ export type PieEChartsOption = EChartsOption