@plenustech/design-system 0.2.2 → 0.2.3

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 (373) hide show
  1. package/dist/components/actions/ButtonTile/ButtonTile.cjs +2 -0
  2. package/dist/components/actions/ButtonTile/ButtonTile.cjs.map +1 -0
  3. package/dist/components/actions/ButtonTile/ButtonTile.js +23 -0
  4. package/dist/components/actions/ButtonTile/ButtonTile.js.map +1 -0
  5. package/dist/components/actions/ButtonTile/ButtonTile.module.css.cjs +2 -0
  6. package/dist/components/actions/ButtonTile/ButtonTile.module.css.cjs.map +1 -0
  7. package/dist/components/actions/ButtonTile/ButtonTile.module.css.js +16 -0
  8. package/dist/components/actions/ButtonTile/ButtonTile.module.css.js.map +1 -0
  9. package/dist/components/actions/Toolbar/Toolbar.cjs +2 -0
  10. package/dist/components/actions/Toolbar/Toolbar.cjs.map +1 -0
  11. package/dist/components/actions/Toolbar/Toolbar.js +118 -0
  12. package/dist/components/actions/Toolbar/Toolbar.js.map +1 -0
  13. package/dist/components/actions/Toolbar/Toolbar.module.css.cjs +2 -0
  14. package/dist/components/actions/Toolbar/Toolbar.module.css.cjs.map +1 -0
  15. package/dist/components/actions/Toolbar/Toolbar.module.css.js +20 -0
  16. package/dist/components/actions/Toolbar/Toolbar.module.css.js.map +1 -0
  17. package/dist/components/charts/ChartArea/ChartArea.cjs +1 -1
  18. package/dist/components/charts/ChartArea/ChartArea.cjs.map +1 -1
  19. package/dist/components/charts/ChartArea/ChartArea.js +196 -148
  20. package/dist/components/charts/ChartArea/ChartArea.js.map +1 -1
  21. package/dist/components/charts/ChartArea/ChartArea.module.css.cjs +1 -1
  22. package/dist/components/charts/ChartArea/ChartArea.module.css.js +12 -10
  23. package/dist/components/charts/ChartArea/ChartArea.module.css.js.map +1 -1
  24. package/dist/components/charts/ChartBar/ChartBar.cjs +1 -1
  25. package/dist/components/charts/ChartBar/ChartBar.cjs.map +1 -1
  26. package/dist/components/charts/ChartBar/ChartBar.js +168 -145
  27. package/dist/components/charts/ChartBar/ChartBar.js.map +1 -1
  28. package/dist/components/charts/ChartBar/ChartBar.module.css.cjs +1 -1
  29. package/dist/components/charts/ChartBar/ChartBar.module.css.js +12 -10
  30. package/dist/components/charts/ChartBar/ChartBar.module.css.js.map +1 -1
  31. package/dist/components/charts/ChartCombo/ChartCombo.cjs +1 -1
  32. package/dist/components/charts/ChartCombo/ChartCombo.cjs.map +1 -1
  33. package/dist/components/charts/ChartCombo/ChartCombo.js +179 -154
  34. package/dist/components/charts/ChartCombo/ChartCombo.js.map +1 -1
  35. package/dist/components/charts/ChartCombo/ChartCombo.module.css.cjs +1 -1
  36. package/dist/components/charts/ChartCombo/ChartCombo.module.css.js +16 -14
  37. package/dist/components/charts/ChartCombo/ChartCombo.module.css.js.map +1 -1
  38. package/dist/components/charts/ChartDonut/ChartDonut.cjs +1 -1
  39. package/dist/components/charts/ChartDonut/ChartDonut.cjs.map +1 -1
  40. package/dist/components/charts/ChartDonut/ChartDonut.js +72 -61
  41. package/dist/components/charts/ChartDonut/ChartDonut.js.map +1 -1
  42. package/dist/components/charts/ChartLine/ChartLine.cjs +1 -1
  43. package/dist/components/charts/ChartLine/ChartLine.cjs.map +1 -1
  44. package/dist/components/charts/ChartLine/ChartLine.js +196 -143
  45. package/dist/components/charts/ChartLine/ChartLine.js.map +1 -1
  46. package/dist/components/charts/ChartLine/ChartLine.module.css.cjs +1 -1
  47. package/dist/components/charts/ChartLine/ChartLine.module.css.js +16 -14
  48. package/dist/components/charts/ChartLine/ChartLine.module.css.js.map +1 -1
  49. package/dist/components/charts/ChartPie/ChartPie.cjs +1 -1
  50. package/dist/components/charts/ChartPie/ChartPie.cjs.map +1 -1
  51. package/dist/components/charts/ChartPie/ChartPie.js +71 -60
  52. package/dist/components/charts/ChartPie/ChartPie.js.map +1 -1
  53. package/dist/components/charts/ChartRadial/ChartRadial.cjs +1 -1
  54. package/dist/components/charts/ChartRadial/ChartRadial.cjs.map +1 -1
  55. package/dist/components/charts/ChartRadial/ChartRadial.js +101 -84
  56. package/dist/components/charts/ChartRadial/ChartRadial.js.map +1 -1
  57. package/dist/components/charts/ChartSankey/ChartSankey.cjs +1 -1
  58. package/dist/components/charts/ChartSankey/ChartSankey.cjs.map +1 -1
  59. package/dist/components/charts/ChartSankey/ChartSankey.js +148 -125
  60. package/dist/components/charts/ChartSankey/ChartSankey.js.map +1 -1
  61. package/dist/components/charts/ChartScatter/ChartScatter.cjs +1 -1
  62. package/dist/components/charts/ChartScatter/ChartScatter.cjs.map +1 -1
  63. package/dist/components/charts/ChartScatter/ChartScatter.js +138 -106
  64. package/dist/components/charts/ChartScatter/ChartScatter.js.map +1 -1
  65. package/dist/components/charts/ChartScatter/ChartScatter.module.css.cjs +1 -1
  66. package/dist/components/charts/ChartScatter/ChartScatter.module.css.js +3 -3
  67. package/dist/components/charts/ChartSunburst/ChartSunburst.cjs +1 -1
  68. package/dist/components/charts/ChartSunburst/ChartSunburst.cjs.map +1 -1
  69. package/dist/components/charts/ChartSunburst/ChartSunburst.js +115 -100
  70. package/dist/components/charts/ChartSunburst/ChartSunburst.js.map +1 -1
  71. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
  72. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
  73. package/dist/components/charts/ChartTooltip/ChartTooltip.js +1 -1
  74. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
  75. package/dist/components/charts/ChartTreemap/ChartTreemap.cjs +1 -1
  76. package/dist/components/charts/ChartTreemap/ChartTreemap.cjs.map +1 -1
  77. package/dist/components/charts/ChartTreemap/ChartTreemap.js +100 -89
  78. package/dist/components/charts/ChartTreemap/ChartTreemap.js.map +1 -1
  79. package/dist/components/charts/ChartWaterfall/ChartWaterfall.cjs +1 -1
  80. package/dist/components/charts/ChartWaterfall/ChartWaterfall.cjs.map +1 -1
  81. package/dist/components/charts/ChartWaterfall/ChartWaterfall.js +125 -105
  82. package/dist/components/charts/ChartWaterfall/ChartWaterfall.js.map +1 -1
  83. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.cjs +1 -1
  84. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.js +8 -6
  85. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.js.map +1 -1
  86. package/dist/components/charts/core/CartesianFrame.cjs +1 -1
  87. package/dist/components/charts/core/CartesianFrame.cjs.map +1 -1
  88. package/dist/components/charts/core/CartesianFrame.js +61 -96
  89. package/dist/components/charts/core/CartesianFrame.js.map +1 -1
  90. package/dist/components/charts/core/Chart.module.css.cjs +1 -1
  91. package/dist/components/charts/core/Chart.module.css.js +52 -54
  92. package/dist/components/charts/core/Chart.module.css.js.map +1 -1
  93. package/dist/components/charts/core/ChartFrame.cjs +1 -1
  94. package/dist/components/charts/core/ChartFrame.cjs.map +1 -1
  95. package/dist/components/charts/core/ChartFrame.js +53 -47
  96. package/dist/components/charts/core/ChartFrame.js.map +1 -1
  97. package/dist/components/charts/core/PointBands.cjs +2 -0
  98. package/dist/components/charts/core/PointBands.cjs.map +1 -0
  99. package/dist/components/charts/core/PointBands.js +41 -0
  100. package/dist/components/charts/core/PointBands.js.map +1 -0
  101. package/dist/components/charts/core/cartesianLayout.cjs +1 -1
  102. package/dist/components/charts/core/cartesianLayout.cjs.map +1 -1
  103. package/dist/components/charts/core/cartesianLayout.js +49 -41
  104. package/dist/components/charts/core/cartesianLayout.js.map +1 -1
  105. package/dist/components/charts/core/hoverPath.cjs +2 -0
  106. package/dist/components/charts/core/hoverPath.cjs.map +1 -0
  107. package/dist/components/charts/core/hoverPath.js +7 -0
  108. package/dist/components/charts/core/hoverPath.js.map +1 -0
  109. package/dist/components/charts/core/pointLabels.cjs +2 -0
  110. package/dist/components/charts/core/pointLabels.cjs.map +1 -0
  111. package/dist/components/charts/core/pointLabels.js +12 -0
  112. package/dist/components/charts/core/pointLabels.js.map +1 -0
  113. package/dist/components/charts/core/tooltips.cjs +2 -0
  114. package/dist/components/charts/core/tooltips.cjs.map +1 -0
  115. package/dist/components/charts/core/tooltips.js +48 -0
  116. package/dist/components/charts/core/tooltips.js.map +1 -0
  117. package/dist/components/charts/core/useCartesianLayout.cjs +2 -0
  118. package/dist/components/charts/core/useCartesianLayout.cjs.map +1 -0
  119. package/dist/components/charts/core/useCartesianLayout.js +38 -0
  120. package/dist/components/charts/core/useCartesianLayout.js.map +1 -0
  121. package/dist/components/charts/core/useSeriesToggle.cjs +1 -1
  122. package/dist/components/charts/core/useSeriesToggle.cjs.map +1 -1
  123. package/dist/components/charts/core/useSeriesToggle.js +19 -12
  124. package/dist/components/charts/core/useSeriesToggle.js.map +1 -1
  125. package/dist/components/data-display/Accordion/Accordion.cjs +1 -1
  126. package/dist/components/data-display/Accordion/Accordion.cjs.map +1 -1
  127. package/dist/components/data-display/Accordion/Accordion.js +56 -46
  128. package/dist/components/data-display/Accordion/Accordion.js.map +1 -1
  129. package/dist/components/data-display/Accordion/Accordion.module.css.cjs +1 -1
  130. package/dist/components/data-display/Accordion/Accordion.module.css.js +16 -16
  131. package/dist/components/data-display/SortableList/SortableList.cjs +2 -0
  132. package/dist/components/data-display/SortableList/SortableList.cjs.map +1 -0
  133. package/dist/components/data-display/SortableList/SortableList.js +168 -0
  134. package/dist/components/data-display/SortableList/SortableList.js.map +1 -0
  135. package/dist/components/data-display/SortableList/SortableList.module.css.cjs +2 -0
  136. package/dist/components/data-display/SortableList/SortableList.module.css.cjs.map +1 -0
  137. package/dist/components/data-display/SortableList/SortableList.module.css.js +34 -0
  138. package/dist/components/data-display/SortableList/SortableList.module.css.js.map +1 -0
  139. package/dist/components/data-display/Table/Table.cjs +1 -1
  140. package/dist/components/data-display/Table/Table.cjs.map +1 -1
  141. package/dist/components/data-display/Table/Table.js +86 -85
  142. package/dist/components/data-display/Table/Table.js.map +1 -1
  143. package/dist/components/data-display/Table/Table.module.css.cjs +1 -1
  144. package/dist/components/data-display/Table/Table.module.css.js +50 -51
  145. package/dist/components/data-display/Table/Table.module.css.js.map +1 -1
  146. package/dist/components/data-display/Tag/Tag.cjs +2 -0
  147. package/dist/components/data-display/Tag/Tag.cjs.map +1 -0
  148. package/dist/components/data-display/Tag/Tag.js +50 -0
  149. package/dist/components/data-display/Tag/Tag.js.map +1 -0
  150. package/dist/components/data-display/Tag/Tag.module.css.cjs +2 -0
  151. package/dist/components/data-display/Tag/Tag.module.css.cjs.map +1 -0
  152. package/dist/components/data-display/Tag/Tag.module.css.js +22 -0
  153. package/dist/components/data-display/Tag/Tag.module.css.js.map +1 -0
  154. package/dist/components/data-display/Timeline/Timeline.cjs +2 -0
  155. package/dist/components/data-display/Timeline/Timeline.cjs.map +1 -0
  156. package/dist/components/data-display/Timeline/Timeline.js +31 -0
  157. package/dist/components/data-display/Timeline/Timeline.js.map +1 -0
  158. package/dist/components/data-display/Timeline/Timeline.module.css.cjs +2 -0
  159. package/dist/components/data-display/Timeline/Timeline.module.css.cjs.map +1 -0
  160. package/dist/components/data-display/Timeline/Timeline.module.css.js +30 -0
  161. package/dist/components/data-display/Timeline/Timeline.module.css.js.map +1 -0
  162. package/dist/components/feedback/Skeleton/Skeleton.cjs +2 -0
  163. package/dist/components/feedback/Skeleton/Skeleton.cjs.map +1 -0
  164. package/dist/components/feedback/Skeleton/Skeleton.js +17 -0
  165. package/dist/components/feedback/Skeleton/Skeleton.js.map +1 -0
  166. package/dist/components/feedback/Skeleton/Skeleton.module.css.cjs +2 -0
  167. package/dist/components/feedback/Skeleton/Skeleton.module.css.cjs.map +1 -0
  168. package/dist/components/feedback/Skeleton/Skeleton.module.css.js +15 -0
  169. package/dist/components/feedback/Skeleton/Skeleton.module.css.js.map +1 -0
  170. package/dist/components/feedback/Toast/Toast.module.css.cjs +2 -0
  171. package/dist/components/feedback/Toast/Toast.module.css.cjs.map +1 -0
  172. package/dist/components/feedback/Toast/Toast.module.css.js +31 -0
  173. package/dist/components/feedback/Toast/Toast.module.css.js.map +1 -0
  174. package/dist/components/feedback/Toast/ToastRegion.cjs +2 -0
  175. package/dist/components/feedback/Toast/ToastRegion.cjs.map +1 -0
  176. package/dist/components/feedback/Toast/ToastRegion.js +62 -0
  177. package/dist/components/feedback/Toast/ToastRegion.js.map +1 -0
  178. package/dist/components/feedback/Toast/toastStore.cjs +2 -0
  179. package/dist/components/feedback/Toast/toastStore.cjs.map +1 -0
  180. package/dist/components/feedback/Toast/toastStore.js +33 -0
  181. package/dist/components/feedback/Toast/toastStore.js.map +1 -0
  182. package/dist/components/forms/Checkbox/Checkbox.cjs +1 -1
  183. package/dist/components/forms/Checkbox/Checkbox.cjs.map +1 -1
  184. package/dist/components/forms/Checkbox/Checkbox.js +43 -31
  185. package/dist/components/forms/Checkbox/Checkbox.js.map +1 -1
  186. package/dist/components/forms/Checkbox/Checkbox.module.css.cjs +1 -1
  187. package/dist/components/forms/Checkbox/Checkbox.module.css.js +1 -1
  188. package/dist/components/forms/CheckboxGroup/CheckboxGroup.cjs +2 -0
  189. package/dist/components/forms/CheckboxGroup/CheckboxGroup.cjs.map +1 -0
  190. package/dist/components/forms/CheckboxGroup/CheckboxGroup.js +54 -0
  191. package/dist/components/forms/CheckboxGroup/CheckboxGroup.js.map +1 -0
  192. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.cjs +2 -0
  193. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.cjs.map +1 -0
  194. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.js +22 -0
  195. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.js.map +1 -0
  196. package/dist/components/forms/ColorPicker/ColorPicker.cjs +2 -0
  197. package/dist/components/forms/ColorPicker/ColorPicker.cjs.map +1 -0
  198. package/dist/components/forms/ColorPicker/ColorPicker.js +57 -0
  199. package/dist/components/forms/ColorPicker/ColorPicker.js.map +1 -0
  200. package/dist/components/forms/ColorPicker/ColorPicker.module.css.cjs +2 -0
  201. package/dist/components/forms/ColorPicker/ColorPicker.module.css.cjs.map +1 -0
  202. package/dist/components/forms/ColorPicker/ColorPicker.module.css.js +22 -0
  203. package/dist/components/forms/ColorPicker/ColorPicker.module.css.js.map +1 -0
  204. package/dist/components/forms/ComboBox/ComboBox.module.css.cjs +1 -1
  205. package/dist/components/forms/ComboBox/ComboBox.module.css.js +20 -20
  206. package/dist/components/forms/Field/Field.cjs +1 -1
  207. package/dist/components/forms/Field/Field.cjs.map +1 -1
  208. package/dist/components/forms/Field/Field.js +21 -20
  209. package/dist/components/forms/Field/Field.js.map +1 -1
  210. package/dist/components/forms/Field/Field.module.css.cjs +1 -1
  211. package/dist/components/forms/Field/Field.module.css.js +18 -12
  212. package/dist/components/forms/Field/Field.module.css.js.map +1 -1
  213. package/dist/components/forms/FileUpload/FileUpload.cjs +2 -0
  214. package/dist/components/forms/FileUpload/FileUpload.cjs.map +1 -0
  215. package/dist/components/forms/FileUpload/FileUpload.js +142 -0
  216. package/dist/components/forms/FileUpload/FileUpload.js.map +1 -0
  217. package/dist/components/forms/FileUpload/FileUpload.module.css.cjs +2 -0
  218. package/dist/components/forms/FileUpload/FileUpload.module.css.cjs.map +1 -0
  219. package/dist/components/forms/FileUpload/FileUpload.module.css.js +46 -0
  220. package/dist/components/forms/FileUpload/FileUpload.module.css.js.map +1 -0
  221. package/dist/components/forms/InputPassword/InputPassword.module.css.cjs +1 -1
  222. package/dist/components/forms/InputPassword/InputPassword.module.css.js +12 -12
  223. package/dist/components/forms/InputText/InputText.cjs +1 -1
  224. package/dist/components/forms/InputText/InputText.cjs.map +1 -1
  225. package/dist/components/forms/InputText/InputText.js +55 -47
  226. package/dist/components/forms/InputText/InputText.js.map +1 -1
  227. package/dist/components/forms/InputText/InputText.module.css.cjs +1 -1
  228. package/dist/components/forms/InputText/InputText.module.css.js +10 -10
  229. package/dist/components/forms/RadioGroup/RadioGroup.module.css.cjs +1 -1
  230. package/dist/components/forms/RadioGroup/RadioGroup.module.css.js +4 -4
  231. package/dist/components/forms/SegmentedControl/SegmentedControl.cjs +2 -0
  232. package/dist/components/forms/SegmentedControl/SegmentedControl.cjs.map +1 -0
  233. package/dist/components/forms/SegmentedControl/SegmentedControl.js +52 -0
  234. package/dist/components/forms/SegmentedControl/SegmentedControl.js.map +1 -0
  235. package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.cjs +2 -0
  236. package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.cjs.map +1 -0
  237. package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.js +22 -0
  238. package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.js.map +1 -0
  239. package/dist/components/forms/Select/Select.module.css.cjs +1 -1
  240. package/dist/components/forms/Select/Select.module.css.js +13 -13
  241. package/dist/components/forms/Switch/Switch.module.css.cjs +1 -1
  242. package/dist/components/forms/Switch/Switch.module.css.js +2 -2
  243. package/dist/components/icons/icons.cjs +1 -1
  244. package/dist/components/icons/icons.cjs.map +1 -1
  245. package/dist/components/icons/icons.js +198 -40
  246. package/dist/components/icons/icons.js.map +1 -1
  247. package/dist/components/navigation/SkipLink/SkipLink.cjs +2 -0
  248. package/dist/components/navigation/SkipLink/SkipLink.cjs.map +1 -0
  249. package/dist/components/navigation/SkipLink/SkipLink.js +9 -0
  250. package/dist/components/navigation/SkipLink/SkipLink.js.map +1 -0
  251. package/dist/components/navigation/SkipLink/SkipLink.module.css.cjs +2 -0
  252. package/dist/components/navigation/SkipLink/SkipLink.module.css.cjs.map +1 -0
  253. package/dist/components/navigation/SkipLink/SkipLink.module.css.js +8 -0
  254. package/dist/components/navigation/SkipLink/SkipLink.module.css.js.map +1 -0
  255. package/dist/components/navigation/Steps/Steps.cjs +2 -0
  256. package/dist/components/navigation/Steps/Steps.cjs.map +1 -0
  257. package/dist/components/navigation/Steps/Steps.js +30 -0
  258. package/dist/components/navigation/Steps/Steps.js.map +1 -0
  259. package/dist/components/navigation/Steps/Steps.module.css.cjs +2 -0
  260. package/dist/components/navigation/Steps/Steps.module.css.cjs.map +1 -0
  261. package/dist/components/navigation/Steps/Steps.module.css.js +26 -0
  262. package/dist/components/navigation/Steps/Steps.module.css.js.map +1 -0
  263. package/dist/components/navigation/Tabs/Tabs.cjs +1 -1
  264. package/dist/components/navigation/Tabs/Tabs.cjs.map +1 -1
  265. package/dist/components/navigation/Tabs/Tabs.js +88 -79
  266. package/dist/components/navigation/Tabs/Tabs.js.map +1 -1
  267. package/dist/components/navigation/Tabs/Tabs.module.css.cjs +1 -1
  268. package/dist/components/navigation/Tabs/Tabs.module.css.js +18 -14
  269. package/dist/components/navigation/Tabs/Tabs.module.css.js.map +1 -1
  270. package/dist/components/overlays/Dialog/Dialog.cjs +1 -1
  271. package/dist/components/overlays/Dialog/Dialog.cjs.map +1 -1
  272. package/dist/components/overlays/Dialog/Dialog.js +11 -58
  273. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  274. package/dist/components/overlays/Dialog/DialogFrame.cjs +2 -0
  275. package/dist/components/overlays/Dialog/DialogFrame.cjs.map +1 -0
  276. package/dist/components/overlays/Dialog/DialogFrame.js +65 -0
  277. package/dist/components/overlays/Dialog/DialogFrame.js.map +1 -0
  278. package/dist/components/overlays/Drawer/Drawer.cjs +2 -0
  279. package/dist/components/overlays/Drawer/Drawer.cjs.map +1 -0
  280. package/dist/components/overlays/Drawer/Drawer.js +17 -0
  281. package/dist/components/overlays/Drawer/Drawer.js.map +1 -0
  282. package/dist/components/overlays/Drawer/Drawer.module.css.cjs +2 -0
  283. package/dist/components/overlays/Drawer/Drawer.module.css.cjs.map +1 -0
  284. package/dist/components/overlays/Drawer/Drawer.module.css.js +23 -0
  285. package/dist/components/overlays/Drawer/Drawer.module.css.js.map +1 -0
  286. package/dist/components/overlays/Menu/Menu.cjs +1 -1
  287. package/dist/components/overlays/Menu/Menu.cjs.map +1 -1
  288. package/dist/components/overlays/Menu/Menu.js +105 -86
  289. package/dist/components/overlays/Menu/Menu.js.map +1 -1
  290. package/dist/components/overlays/Menu/Menu.module.css.cjs +1 -1
  291. package/dist/components/overlays/Menu/Menu.module.css.js +24 -6
  292. package/dist/components/overlays/Menu/Menu.module.css.js.map +1 -1
  293. package/dist/design-system.css +1 -1
  294. package/dist/index.cjs +1 -1
  295. package/dist/index.js +184 -122
  296. package/dist/index.js.map +1 -1
  297. package/dist/types/components/actions/ButtonTile/ButtonTile.d.ts +14 -0
  298. package/dist/types/components/actions/ButtonTile/index.d.ts +2 -0
  299. package/dist/types/components/actions/Toolbar/Toolbar.d.ts +27 -0
  300. package/dist/types/components/actions/Toolbar/index.d.ts +2 -0
  301. package/dist/types/components/charts/ChartArea/ChartArea.d.ts +15 -4
  302. package/dist/types/components/charts/ChartBar/ChartBar.d.ts +11 -4
  303. package/dist/types/components/charts/ChartCombo/ChartCombo.d.ts +16 -4
  304. package/dist/types/components/charts/ChartDonut/ChartDonut.d.ts +5 -1
  305. package/dist/types/components/charts/ChartLine/ChartLine.d.ts +15 -4
  306. package/dist/types/components/charts/ChartPie/ChartPie.d.ts +5 -1
  307. package/dist/types/components/charts/ChartRadial/ChartRadial.d.ts +5 -1
  308. package/dist/types/components/charts/ChartSankey/ChartSankey.d.ts +5 -1
  309. package/dist/types/components/charts/ChartScatter/ChartScatter.d.ts +7 -1
  310. package/dist/types/components/charts/ChartSunburst/ChartSunburst.d.ts +11 -2
  311. package/dist/types/components/charts/ChartTooltip/ChartTooltip.d.ts +2 -0
  312. package/dist/types/components/charts/ChartTreemap/ChartTreemap.d.ts +11 -2
  313. package/dist/types/components/charts/ChartWaterfall/ChartWaterfall.d.ts +8 -3
  314. package/dist/types/components/charts/core/CartesianFrame.d.ts +6 -1
  315. package/dist/types/components/charts/core/ChartFrame.d.ts +7 -1
  316. package/dist/types/components/charts/core/PointBands.d.ts +22 -0
  317. package/dist/types/components/charts/core/cartesianLayout.d.ts +10 -4
  318. package/dist/types/components/charts/core/hoverPath.d.ts +10 -0
  319. package/dist/types/components/charts/core/index.d.ts +13 -3
  320. package/dist/types/components/charts/core/pointLabels.d.ts +13 -0
  321. package/dist/types/components/charts/core/tooltips.d.ts +49 -0
  322. package/dist/types/components/charts/core/useCartesianLayout.d.ts +20 -0
  323. package/dist/types/components/charts/core/useSeriesToggle.d.ts +15 -1
  324. package/dist/types/components/data-display/Accordion/Accordion.d.ts +6 -1
  325. package/dist/types/components/data-display/Accordion/index.d.ts +1 -1
  326. package/dist/types/components/data-display/SortableList/SortableList.d.ts +22 -0
  327. package/dist/types/components/data-display/SortableList/index.d.ts +2 -0
  328. package/dist/types/components/data-display/Tag/Tag.d.ts +13 -0
  329. package/dist/types/components/data-display/Tag/index.d.ts +2 -0
  330. package/dist/types/components/data-display/Timeline/Timeline.d.ts +15 -0
  331. package/dist/types/components/data-display/Timeline/index.d.ts +2 -0
  332. package/dist/types/components/feedback/Skeleton/Skeleton.d.ts +13 -0
  333. package/dist/types/components/feedback/Skeleton/index.d.ts +2 -0
  334. package/dist/types/components/feedback/Toast/ToastRegion.d.ts +2 -0
  335. package/dist/types/components/feedback/Toast/index.d.ts +3 -0
  336. package/dist/types/components/feedback/Toast/toastStore.d.ts +24 -0
  337. package/dist/types/components/forms/CheckboxGroup/CheckboxGroup.d.ts +28 -0
  338. package/dist/types/components/forms/CheckboxGroup/index.d.ts +2 -0
  339. package/dist/types/components/forms/ColorPicker/ColorPicker.d.ts +26 -0
  340. package/dist/types/components/forms/ColorPicker/index.d.ts +2 -0
  341. package/dist/types/components/forms/Field/Field.d.ts +6 -2
  342. package/dist/types/components/forms/Field/index.d.ts +1 -1
  343. package/dist/types/components/forms/FileUpload/FileUpload.d.ts +37 -0
  344. package/dist/types/components/forms/FileUpload/index.d.ts +2 -0
  345. package/dist/types/components/forms/InputText/InputText.d.ts +4 -2
  346. package/dist/types/components/forms/SegmentedControl/SegmentedControl.d.ts +23 -0
  347. package/dist/types/components/forms/SegmentedControl/index.d.ts +2 -0
  348. package/dist/types/components/icons/icons.d.ts +29 -0
  349. package/dist/types/components/icons/index.d.ts +1 -1
  350. package/dist/types/components/navigation/SkipLink/SkipLink.d.ts +7 -0
  351. package/dist/types/components/navigation/SkipLink/index.d.ts +2 -0
  352. package/dist/types/components/navigation/Steps/Steps.d.ts +16 -0
  353. package/dist/types/components/navigation/Steps/index.d.ts +2 -0
  354. package/dist/types/components/navigation/Tabs/Tabs.d.ts +5 -1
  355. package/dist/types/components/overlays/Dialog/Dialog.d.ts +2 -2
  356. package/dist/types/components/overlays/Dialog/DialogFrame.d.ts +7 -0
  357. package/dist/types/components/overlays/Drawer/Drawer.d.ts +9 -0
  358. package/dist/types/components/overlays/Drawer/index.d.ts +2 -0
  359. package/dist/types/components/overlays/Menu/Menu.d.ts +16 -2
  360. package/dist/types/components/overlays/Menu/index.d.ts +1 -1
  361. package/dist/types/index.d.ts +35 -7
  362. package/dist/types/utils/formatters/formatarNumero.d.ts +6 -1
  363. package/dist/types/utils/formatters/formatarTamanhoDeArquivo.d.ts +7 -0
  364. package/dist/types/utils/formatters/index.d.ts +3 -1
  365. package/dist/utils/formatters/formatarNumero.cjs +1 -1
  366. package/dist/utils/formatters/formatarNumero.cjs.map +1 -1
  367. package/dist/utils/formatters/formatarNumero.js +42 -17
  368. package/dist/utils/formatters/formatarNumero.js.map +1 -1
  369. package/dist/utils/formatters/formatarTamanhoDeArquivo.cjs +2 -0
  370. package/dist/utils/formatters/formatarTamanhoDeArquivo.cjs.map +1 -0
  371. package/dist/utils/formatters/formatarTamanhoDeArquivo.js +17 -0
  372. package/dist/utils/formatters/formatarTamanhoDeArquivo.js.map +1 -0
  373. package/package.json +1 -1
@@ -1,14 +1,14 @@
1
- const e = "_bubble_okzta_1", s = "_guide_okzta_11", _ = "_series_okzta_23 _series_141iy_209", i = "_seriesOff_okzta_27 _seriesOff_141iy_213", t = {
1
+ const e = "_bubble_okzta_1", s = "_guide_okzta_11", _ = "_series_okzta_23 _series_yf6oe_211", o = "_seriesOff_okzta_27 _seriesOff_yf6oe_215", t = {
2
2
  bubble: e,
3
3
  guide: s,
4
4
  series: _,
5
- seriesOff: i
5
+ seriesOff: o
6
6
  };
7
7
  export {
8
8
  e as bubble,
9
9
  t as default,
10
10
  s as guide,
11
11
  _ as series,
12
- i as seriesOff
12
+ o as seriesOff
13
13
  };
14
14
  //# sourceMappingURL=ChartScatter.module.css.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),h=require("react"),R=require("d3-hierarchy"),m=require("./ChartSunburst.module.css.cjs"),ne=require("../core/useChartMetrics.cjs"),se=require("../core/useSeriesToggle.cjs"),ae=require("../palette/seriesColor.cjs"),j=require("../core/measureText.cjs"),f=require("../core/spacing.cjs"),b=require("../core/arcs.cjs"),oe=require("../core/ChartFrame.cjs"),ie=require("../../../utils/formatters/formatarNumero.cjs"),le=require("../core/cartesianLayout.cjs"),ue=.18,p=14;function B(a,n=1,s=new Map){return a.forEach(u=>{var g;s.set(n,[...s.get(n)??[],u.label]),(g=u.children)!=null&&g.length&&B(u.children,n+1,s)}),s}function ce(a,n){if(n<=1)return a;const s=Math.min((n-1)*22,66);return`color-mix(in oklab, ${a} ${100-s}%, var(--pl-color-surface))`}function de({accent:a,defaultHiddenGroups:n,emptyMessage:s="Sem dados no período",formatPercent:u=x=>`${Math.round(x*100)}%`,formatValue:g=ie.formatarNumero,height:P=320,hiddenGroups:I,legend:k="bottom",legendAlign:w,nodes:o,onHiddenGroupsChange:U,ringGap:G=2,showLabels:v=!0,sliceRadius:V,title:W}){const{font:x,height:Z,radius:J,ref:K,width:C}=ne.useChartMetrics(),{fillHeight:Q,value:_}=le.chartHeight(P,Z),{isHidden:A,toggle:X}=se.useSeriesToggle({defaultHiddenSeries:n,hiddenSeries:I,onHiddenSeriesChange:U}),[S,$]=h.useState(null),q=h.useMemo(()=>ae.resolveSeriesColors(o,{accent:a}),[a,o]),M=h.useMemo(()=>o.filter(e=>!A(e.label)),[A,o]),Y=h.useMemo(()=>{const e=B(M),t=Math.max(0,...e.keys());return e.get(t)??[]},[M]),E=v?Math.min(j.widestLabel(Y,x),C*f.CHART_LABEL_BAND):0,z=v?p*2+f.CHART_LABEL_OFFSET+E:0,T=f.ringDiameter(Math.max(C-z*2,0),_)/2,c=h.useMemo(()=>{if(T<=0)return[];const e=R.hierarchy({children:M,label:""}).sum(r=>Math.max(r.value??0,0)).sort((r,i)=>(i.value??0)-(r.value??0));return R.partition().size([b.VOLTA,T])(e).descendants().filter(r=>r.depth>0)},[T,M]),ee=c.reduce((e,t)=>Math.max(e,t.depth),0),L=c.filter(e=>e.depth===1).reduce((e,t)=>e+(t.value??0),0),F=S&&c.includes(S)?S:null;function te(e){return F===null||F.ancestors().includes(e)}function re(e){var i;const t=(i=e.ancestors().find(d=>d.depth===1))==null?void 0:i.data,r=(t==null?void 0:t.color)??q[o.findIndex(d=>d.label===(t==null?void 0:t.label))];return ce(r??"var(--pl-chart-neutral)",e.depth)}function D(e){const t=L>0?(e.value??0)/L:0;return`${e.data.label}: ${g(e.value??0)} (${u(t)})`}return l.jsxs(oe.ChartFrame,{centerOrigin:!0,containerRef:K,empty:o.length===0,emptyMessage:s,fillHeight:Q,height:_,legend:o.map((e,t)=>({color:q[t],hidden:A(e.label),label:e.label})),legendAlign:w,legendPosition:k,onToggleSeries:X,swatch:"dot",title:W,width:C,children:[c.map((e,t)=>l.jsx("path",{"aria-label":D(e),className:`${m.default.arc} ${te(e)?"":m.default.arcDim}`,d:b.arcPath({cornerRadius:V??J,endAngle:e.x1,innerRadius:e.y0+(e.depth>1?G:0),outerRadius:e.y1,startAngle:e.x0}),fill:re(e),onMouseEnter:()=>$(e),onMouseLeave:()=>$(null),children:l.jsx("title",{children:D(e)})},t)),v&&c.filter(e=>e.depth===ee&&e.x1-e.x0>=ue).map((e,t)=>{const r={endAngle:e.x1,startAngle:e.x0},[i,d]=b.arcAnchor(r,e.y1),[O,y]=b.arcAnchor(r,e.y1+p),N=O>=0,H=O+(N?p:-p);return l.jsxs("g",{className:m.default.leader,children:[l.jsx("polyline",{className:m.default.connector,points:`${i},${d} ${O},${y} ${H},${y}`}),l.jsx("text",{className:m.default.label,dominantBaseline:"middle",textAnchor:N?"start":"end",x:H+(N?f.CHART_LABEL_OFFSET:-f.CHART_LABEL_OFFSET),y,children:j.truncateToWidth(e.data.label,x,E)})]},t)})]})}exports.ChartSunburst=de;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("react/jsx-runtime"),m=require("react"),I=require("d3-hierarchy"),f=require("./ChartSunburst.module.css.cjs"),le=require("../core/useChartMetrics.cjs"),ue=require("../core/useSeriesToggle.cjs"),ce=require("../palette/seriesColor.cjs"),k=require("../core/measureText.cjs"),g=require("../core/spacing.cjs"),v=require("../core/arcs.cjs"),de=require("../core/ChartFrame.cjs"),he=require("../core/tooltips.cjs"),U=require("../core/hoverPath.cjs"),me=require("../../../utils/formatters/formatarNumero.cjs"),fe=require("../core/cartesianLayout.cjs"),ge=.18,C=14;function w(a,n=1,s=new Map){return a.forEach(o=>{var x;s.set(n,[...s.get(n)??[],o.label]),(x=o.children)!=null&&x.length&&w(o.children,n+1,s)}),s}function xe(a,n){if(n<=1)return a;const s=Math.min((n-1)*22,66);return`color-mix(in oklab, ${a} ${100-s}%, var(--pl-color-surface))`}function pe({accent:a,defaultHiddenGroups:n,emptyMessage:s="Sem dados no período",formatPercent:o=M=>`${Math.round(M*100)}%`,formatTooltipValue:x,formatValue:L=me.formatarNumero,height:G=320,hiddenGroups:W,legend:Z="bottom",legendAlign:J,nodes:i,onHiddenGroupsChange:K,onHoverNode:p,ringGap:Q=2,showLabels:A=!0,showTooltip:F=!0,sliceRadius:V,title:X}){const{font:M,height:Y,radius:z,ref:ee,width:S}=le.useChartMetrics(),{fillHeight:te,value:D}=fe.chartHeight(G,Y),{isHidden:T,toggle:re}=ue.useSeriesToggle({defaultHiddenSeries:n,hiddenSeries:W,onHiddenSeriesChange:K}),[O,ne]=m.useState(null),R=m.useMemo(()=>ce.resolveSeriesColors(i,{accent:a}),[a,i]),b=m.useMemo(()=>i.filter(e=>!T(e.label)),[T,i]),se=m.useMemo(()=>{const e=w(b),t=Math.max(0,...e.keys());return e.get(t)??[]},[b]),N=A?Math.min(k.widestLabel(se,M),S*g.CHART_LABEL_BAND):0,ae=A?C*2+g.CHART_LABEL_OFFSET+N:0,q=g.ringDiameter(Math.max(S-ae*2,0),D)/2,d=m.useMemo(()=>{if(q<=0)return[];const e=I.hierarchy({children:b,label:""}).sum(r=>Math.max(r.value??0,0)).sort((r,u)=>(u.value??0)-(r.value??0));return I.partition().size([v.VOLTA,q])(e).descendants().filter(r=>r.depth>0)},[q,b]),ie=d.reduce((e,t)=>Math.max(e,t.depth),0),y=d.filter(e=>e.depth===1).reduce((e,t)=>e+(t.value??0),0),l=O&&d.includes(O)?O:null;function oe(e){return l===null||l.ancestors().includes(e)}function j(e){ne(e),p==null||p(e&&U.hoverPath(e))}function B(e){var u;const t=(u=e.ancestors().find(h=>h.depth===1))==null?void 0:u.data,r=(t==null?void 0:t.color)??R[i.findIndex(h=>h.label===(t==null?void 0:t.label))];return xe(r??"var(--pl-chart-neutral)",e.depth)}function P(e){const t=y>0?(e.value??0)/y:0;return`${e.data.label}: ${L(e.value??0)} (${o(t)})`}return c.jsxs(de.ChartFrame,{centerOrigin:!0,containerRef:ee,empty:i.length===0,emptyMessage:s,fillHeight:te,height:D,legend:i.map((e,t)=>({color:R[t],hidden:T(e.label),label:e.label})),legendAlign:J,legendPosition:Z,onToggleSeries:re,swatch:"dot",title:X,tooltip:F?he.pathTooltip({color:l?B(l):void 0,format:x??L,formatPercent:o,path:l&&U.hoverPath(l),total:y}):void 0,width:S,children:[d.map((e,t)=>c.jsx("path",{"aria-label":P(e),className:`${f.default.arc} ${oe(e)?"":f.default.arcDim}`,d:v.arcPath({cornerRadius:V??z,endAngle:e.x1,innerRadius:e.y0+(e.depth>1?Q:0),outerRadius:e.y1,startAngle:e.x0}),fill:B(e),onMouseEnter:()=>j(e),onMouseLeave:()=>j(null),children:!F&&!p&&c.jsx("title",{children:P(e)})},t)),A&&d.filter(e=>e.depth===ie&&e.x1-e.x0>=ge).map((e,t)=>{const r={endAngle:e.x1,startAngle:e.x0},[u,h]=v.arcAnchor(r,e.y1),[_,$]=v.arcAnchor(r,e.y1+C),E=_>=0,H=_+(E?C:-C);return c.jsxs("g",{className:f.default.leader,children:[c.jsx("polyline",{className:f.default.connector,points:`${u},${h} ${_},${$} ${H},${$}`}),c.jsx("text",{className:f.default.label,dominantBaseline:"middle",textAnchor:E?"start":"end",x:H+(E?g.CHART_LABEL_OFFSET:-g.CHART_LABEL_OFFSET),y:$,children:k.truncateToWidth(e.data.label,M,N)})]},t)})]})}exports.ChartSunburst=pe;
2
2
  //# sourceMappingURL=ChartSunburst.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartSunburst.cjs","sources":["../../../../src/components/charts/ChartSunburst/ChartSunburst.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { hierarchy, partition, type HierarchyRectangularNode } from 'd3-hierarchy';\nimport {\n CHART_LABEL_BAND,\n CHART_LABEL_OFFSET,\n ChartFrame,\n VOLTA,\n arcAnchor,\n arcPath,\n chartHeight,\n ringDiameter,\n truncateToWidth,\n useChartMetrics,\n useSeriesToggle,\n widestLabel,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartSunburst.module.css';\n\nexport interface ChartSunburstNode extends SeriesAppearance {\n children?: readonly ChartSunburstNode[];\n label: string;\n value?: number;\n}\n\nexport interface ChartSunburstProps {\n accent?: string;\n defaultHiddenGroups?: readonly string[];\n emptyMessage?: string;\n formatPercent?: (ratio: number) => string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenGroups?: readonly string[];\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n nodes: readonly ChartSunburstNode[];\n onHiddenGroupsChange?: (hidden: readonly string[]) => void;\n /** Folga entre dois aneis vizinhos. */\n ringGap?: number;\n /** Raio das pontas de cada arco. Sem valor, o token de raio pequeno. */\n sliceRadius?: number;\n showLabels?: boolean;\n title: string;\n}\n\ntype Arco = HierarchyRectangularNode<ChartSunburstNode>;\n\n/** Arco menor que isso nao comporta rotulo nem conector legivel. */\nconst ANGULO_MINIMO_DO_ROTULO = 0.18;\nconst COMPRIMENTO_DO_CONECTOR = 14;\n/**\n * Rotulos de cada nivel da arvore declarada. Medir a banda antes de montar o\n * anel exige saber os rotulos antes, e o nivel mais profundo declarado e o\n * mesmo que o anel externo tera.\n */\nfunction rotulosPorNivel(\n nodes: readonly ChartSunburstNode[],\n nivel = 1,\n por = new Map<number, string[]>(),\n) {\n nodes.forEach((no) => {\n por.set(nivel, [...(por.get(nivel) ?? []), no.label]);\n\n if (no.children?.length) {\n rotulosPorNivel(no.children, nivel + 1, por);\n }\n });\n\n return por;\n}\n\n/**\n * Cada anel clareia sobre o anterior, e o filho nasce da cor do pai. Sem isso a\n * hierarquia sumiria: os aneis externos repetiriam a cor do nivel zero e nada\n * distinguiria um filho do outro.\n */\nfunction tomDoNivel(cor: string, profundidade: number) {\n if (profundidade <= 1) {\n return cor;\n }\n\n const clareamento = Math.min((profundidade - 1) * 22, 66);\n\n return `color-mix(in oklab, ${cor} ${100 - clareamento}%, var(--pl-color-surface))`;\n}\n\nexport function ChartSunburst({\n accent,\n defaultHiddenGroups,\n emptyMessage = 'Sem dados no período',\n formatPercent = (fracao) => `${Math.round(fracao * 100)}%`,\n formatValue = formatarNumero,\n height = 320,\n hiddenGroups,\n legend = 'bottom',\n legendAlign,\n nodes,\n onHiddenGroupsChange,\n ringGap = 2,\n showLabels = true,\n sliceRadius,\n title,\n}: ChartSunburstProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({\n defaultHiddenSeries: defaultHiddenGroups,\n hiddenSeries: hiddenGroups,\n onHiddenSeriesChange: onHiddenGroupsChange,\n });\n const [emFoco, setEmFoco] = useState<Arco | null>(null);\n\n // A cor sai da lista inteira, e nao das visiveis: desligar um grupo nao pode\n // repintar os demais.\n const coresDeNivelZero = useMemo(() => resolveSeriesColors(nodes, { accent }), [accent, nodes]);\n\n const visiveis = useMemo(\n () => nodes.filter((grupo) => !isHidden(grupo.label)),\n [isHidden, nodes],\n );\n\n // A banda dos rotulos e reservada antes do anel, medida pelo rotulo mais\n // largo do anel externo. Sem reservar, o rotulo era desenhado no que sobrasse\n // — quase nada nas laterais — e acabava cortado ate sumir.\n const rotulosExternos = useMemo(() => {\n const niveis = rotulosPorNivel(visiveis);\n const externo = Math.max(0, ...niveis.keys());\n\n return niveis.get(externo) ?? [];\n }, [visiveis]);\n\n const larguraDoRotulo = showLabels\n ? Math.min(widestLabel(rotulosExternos, font), width * CHART_LABEL_BAND)\n : 0;\n const banda = showLabels ? COMPRIMENTO_DO_CONECTOR * 2 + CHART_LABEL_OFFSET + larguraDoRotulo : 0;\n\n const diametro = ringDiameter(Math.max(width - banda * 2, 0), alturaDoDesenho);\n const raio = diametro / 2;\n\n const arcos = useMemo(() => {\n if (raio <= 0) {\n return [];\n }\n\n const arvore = hierarchy<ChartSunburstNode>({ children: visiveis, label: '' })\n .sum((no) => Math.max(no.value ?? 0, 0))\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n const repartir = partition<ChartSunburstNode>().size([VOLTA, raio]);\n\n return repartir(arvore)\n .descendants()\n .filter((no) => no.depth > 0);\n }, [raio, visiveis]);\n\n const profundidadeMaxima = arcos.reduce((maior, arco) => Math.max(maior, arco.depth), 0);\n const total = arcos\n .filter((arco) => arco.depth === 1)\n .reduce((soma, arco) => soma + (arco.value ?? 0), 0);\n\n // O arco guardado deixa de existir quando a arvore e remontada, num\n // redimensionamento por exemplo. Sem conferir, o foco perdido apagaria tudo.\n const foco = emFoco && arcos.includes(emFoco) ? emFoco : null;\n\n /**\n * Acende o arco sob o ponteiro e os que o originaram. O caminho ate a raiz e\n * o que explica de onde aquela fatia veio; os filhos dela nao explicam nada\n * sobre ela, entao ficam apagados junto com o resto.\n */\n function aceso(arco: Arco) {\n return foco === null || foco.ancestors().includes(arco);\n }\n\n function corDe(arco: Arco) {\n const raizDoRamo = arco.ancestors().find((ancestral) => ancestral.depth === 1)?.data;\n const base =\n raizDoRamo?.color ?? coresDeNivelZero[nodes.findIndex((no) => no.label === raizDoRamo?.label)];\n\n return tomDoNivel(base ?? 'var(--pl-chart-neutral)', arco.depth);\n }\n\n function descreverArco(arco: Arco) {\n const fracao = total > 0 ? (arco.value ?? 0) / total : 0;\n\n return `${arco.data.label}: ${formatValue(arco.value ?? 0)} (${formatPercent(fracao)})`;\n }\n\n return (\n <ChartFrame\n centerOrigin\n containerRef={ref}\n empty={nodes.length === 0}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={nodes.map((grupo, indice) => ({\n color: coresDeNivelZero[indice],\n hidden: isHidden(grupo.label),\n label: grupo.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={toggle}\n swatch=\"dot\"\n title={title}\n width={width}\n >\n {arcos.map((arco, indice) => (\n <path\n aria-label={descreverArco(arco)}\n className={`${styles.arc} ${aceso(arco) ? '' : styles.arcDim}`}\n d={arcPath({\n cornerRadius: sliceRadius ?? raioDoCanto,\n endAngle: arco.x1,\n innerRadius: arco.y0 + (arco.depth > 1 ? ringGap : 0),\n outerRadius: arco.y1,\n startAngle: arco.x0,\n })}\n fill={corDe(arco)}\n key={indice}\n onMouseEnter={() => setEmFoco(arco)}\n onMouseLeave={() => setEmFoco(null)}\n >\n <title>{descreverArco(arco)}</title>\n </path>\n ))}\n\n {showLabels &&\n arcos\n .filter(\n (arco) => arco.depth === profundidadeMaxima && arco.x1 - arco.x0 >= ANGULO_MINIMO_DO_ROTULO,\n )\n .map((arco, indice) => {\n const angulos = { endAngle: arco.x1, startAngle: arco.x0 };\n const [xBorda, yBorda] = arcAnchor(angulos, arco.y1);\n const [xCotovelo, yCotovelo] = arcAnchor(angulos, arco.y1 + COMPRIMENTO_DO_CONECTOR);\n const paraDireita = xCotovelo >= 0;\n const xFim = xCotovelo + (paraDireita ? COMPRIMENTO_DO_CONECTOR : -COMPRIMENTO_DO_CONECTOR);\n\n return (\n <g className={styles.leader} key={indice}>\n <polyline\n className={styles.connector}\n points={`${xBorda},${yBorda} ${xCotovelo},${yCotovelo} ${xFim},${yCotovelo}`}\n />\n <text\n className={styles.label}\n dominantBaseline=\"middle\"\n textAnchor={paraDireita ? 'start' : 'end'}\n x={xFim + (paraDireita ? CHART_LABEL_OFFSET : -CHART_LABEL_OFFSET)}\n y={yCotovelo}\n >\n {truncateToWidth(arco.data.label, font, larguraDoRotulo)}\n </text>\n </g>\n );\n })}\n </ChartFrame>\n );\n}\n"],"names":["ANGULO_MINIMO_DO_ROTULO","COMPRIMENTO_DO_CONECTOR","rotulosPorNivel","nodes","nivel","por","no","_a","tomDoNivel","cor","profundidade","clareamento","ChartSunburst","accent","defaultHiddenGroups","emptyMessage","formatPercent","fracao","formatValue","formatarNumero","height","hiddenGroups","legend","legendAlign","onHiddenGroupsChange","ringGap","showLabels","sliceRadius","title","font","alturaMedida","raioDoCanto","ref","width","useChartMetrics","fillHeight","alturaDoDesenho","chartHeight","isHidden","toggle","useSeriesToggle","emFoco","setEmFoco","useState","coresDeNivelZero","useMemo","resolveSeriesColors","visiveis","grupo","rotulosExternos","niveis","externo","larguraDoRotulo","widestLabel","CHART_LABEL_BAND","banda","CHART_LABEL_OFFSET","raio","ringDiameter","arcos","arvore","hierarchy","a","b","partition","VOLTA","profundidadeMaxima","maior","arco","total","soma","foco","aceso","corDe","raizDoRamo","ancestral","base","descreverArco","jsxs","ChartFrame","indice","jsx","styles","arcPath","angulos","xBorda","yBorda","arcAnchor","xCotovelo","yCotovelo","paraDireita","xFim","truncateToWidth"],"mappings":"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"}
1
+ {"version":3,"file":"ChartSunburst.cjs","sources":["../../../../src/components/charts/ChartSunburst/ChartSunburst.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { hierarchy, partition, type HierarchyRectangularNode } from 'd3-hierarchy';\nimport {\n CHART_LABEL_BAND,\n CHART_LABEL_OFFSET,\n ChartFrame,\n VOLTA,\n arcAnchor,\n arcPath,\n hoverPath,\n pathTooltip,\n chartHeight,\n ringDiameter,\n truncateToWidth,\n useChartMetrics,\n useSeriesToggle,\n widestLabel,\n type ChartHeight,\n type ChartHoveredNode,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartSunburst.module.css';\n\nexport interface ChartSunburstNode extends SeriesAppearance {\n children?: readonly ChartSunburstNode[];\n label: string;\n value?: number;\n}\n\nexport interface ChartSunburstProps {\n accent?: string;\n defaultHiddenGroups?: readonly string[];\n emptyMessage?: string;\n formatPercent?: (ratio: number) => string;\n /** Formato dos valores no balao. Sem ele, vale o `formatValue`: o eixo pode sair compacto e o balao, exato. */\n formatTooltipValue?: (value: number) => string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenGroups?: readonly string[];\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n nodes: readonly ChartSunburstNode[];\n onHiddenGroupsChange?: (hidden: readonly string[]) => void;\n /** Caminho ate o no sob o ponteiro, do grupo ao no, cada nivel com o valor somado, ou `null` ao sair. */\n onHoverNode?: (path: readonly ChartHoveredNode[] | null) => void;\n /** Folga entre dois aneis vizinhos. */\n ringGap?: number;\n /** Raio das pontas de cada arco. Sem valor, o token de raio pequeno. */\n sliceRadius?: number;\n showLabels?: boolean;\n /**\n * Balao com o caminho ate o no sob o ponteiro. Desligue para montar o proprio `ChartTooltip`\n * pela costura; sem balao nem costura, o no volta a ter o `<title>`.\n */\n showTooltip?: boolean;\n title: string;\n}\n\ntype Arco = HierarchyRectangularNode<ChartSunburstNode>;\n\n/** Arco menor que isso nao comporta rotulo nem conector legivel. */\nconst ANGULO_MINIMO_DO_ROTULO = 0.18;\nconst COMPRIMENTO_DO_CONECTOR = 14;\n/**\n * Rotulos de cada nivel da arvore declarada. Medir a banda antes de montar o\n * anel exige saber os rotulos antes, e o nivel mais profundo declarado e o\n * mesmo que o anel externo tera.\n */\nfunction rotulosPorNivel(\n nodes: readonly ChartSunburstNode[],\n nivel = 1,\n por = new Map<number, string[]>(),\n) {\n nodes.forEach((no) => {\n por.set(nivel, [...(por.get(nivel) ?? []), no.label]);\n\n if (no.children?.length) {\n rotulosPorNivel(no.children, nivel + 1, por);\n }\n });\n\n return por;\n}\n\n/**\n * Cada anel clareia sobre o anterior, e o filho nasce da cor do pai. Sem isso a\n * hierarquia sumiria: os aneis externos repetiriam a cor do nivel zero e nada\n * distinguiria um filho do outro.\n */\nfunction tomDoNivel(cor: string, profundidade: number) {\n if (profundidade <= 1) {\n return cor;\n }\n\n const clareamento = Math.min((profundidade - 1) * 22, 66);\n\n return `color-mix(in oklab, ${cor} ${100 - clareamento}%, var(--pl-color-surface))`;\n}\n\nexport function ChartSunburst({\n accent,\n defaultHiddenGroups,\n emptyMessage = 'Sem dados no período',\n formatPercent = (fracao) => `${Math.round(fracao * 100)}%`,\n formatTooltipValue,\n formatValue = formatarNumero,\n height = 320,\n hiddenGroups,\n legend = 'bottom',\n legendAlign,\n nodes,\n onHiddenGroupsChange,\n onHoverNode,\n ringGap = 2,\n showLabels = true,\n showTooltip = true,\n sliceRadius,\n title,\n}: ChartSunburstProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({\n defaultHiddenSeries: defaultHiddenGroups,\n hiddenSeries: hiddenGroups,\n onHiddenSeriesChange: onHiddenGroupsChange,\n });\n const [emFoco, setEmFoco] = useState<Arco | null>(null);\n\n // A cor sai da lista inteira, e nao das visiveis: desligar um grupo nao pode\n // repintar os demais.\n const coresDeNivelZero = useMemo(() => resolveSeriesColors(nodes, { accent }), [accent, nodes]);\n\n const visiveis = useMemo(\n () => nodes.filter((grupo) => !isHidden(grupo.label)),\n [isHidden, nodes],\n );\n\n // A banda dos rotulos e reservada antes do anel, medida pelo rotulo mais\n // largo do anel externo. Sem reservar, o rotulo era desenhado no que sobrasse\n // — quase nada nas laterais — e acabava cortado ate sumir.\n const rotulosExternos = useMemo(() => {\n const niveis = rotulosPorNivel(visiveis);\n const externo = Math.max(0, ...niveis.keys());\n\n return niveis.get(externo) ?? [];\n }, [visiveis]);\n\n const larguraDoRotulo = showLabels\n ? Math.min(widestLabel(rotulosExternos, font), width * CHART_LABEL_BAND)\n : 0;\n const banda = showLabels ? COMPRIMENTO_DO_CONECTOR * 2 + CHART_LABEL_OFFSET + larguraDoRotulo : 0;\n\n const diametro = ringDiameter(Math.max(width - banda * 2, 0), alturaDoDesenho);\n const raio = diametro / 2;\n\n const arcos = useMemo(() => {\n if (raio <= 0) {\n return [];\n }\n\n const arvore = hierarchy<ChartSunburstNode>({ children: visiveis, label: '' })\n .sum((no) => Math.max(no.value ?? 0, 0))\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n const repartir = partition<ChartSunburstNode>().size([VOLTA, raio]);\n\n return repartir(arvore)\n .descendants()\n .filter((no) => no.depth > 0);\n }, [raio, visiveis]);\n\n const profundidadeMaxima = arcos.reduce((maior, arco) => Math.max(maior, arco.depth), 0);\n const total = arcos\n .filter((arco) => arco.depth === 1)\n .reduce((soma, arco) => soma + (arco.value ?? 0), 0);\n\n // O arco guardado deixa de existir quando a arvore e remontada, num\n // redimensionamento por exemplo. Sem conferir, o foco perdido apagaria tudo.\n const foco = emFoco && arcos.includes(emFoco) ? emFoco : null;\n\n /**\n * Acende o arco sob o ponteiro e os que o originaram. O caminho ate a raiz e\n * o que explica de onde aquela fatia veio; os filhos dela nao explicam nada\n * sobre ela, entao ficam apagados junto com o resto.\n */\n function aceso(arco: Arco) {\n return foco === null || foco.ancestors().includes(arco);\n }\n\n function focar(arco: Arco | null) {\n setEmFoco(arco);\n onHoverNode?.(arco && hoverPath(arco));\n }\n\n function corDe(arco: Arco) {\n const raizDoRamo = arco.ancestors().find((ancestral) => ancestral.depth === 1)?.data;\n const base =\n raizDoRamo?.color ?? coresDeNivelZero[nodes.findIndex((no) => no.label === raizDoRamo?.label)];\n\n return tomDoNivel(base ?? 'var(--pl-chart-neutral)', arco.depth);\n }\n\n function descreverArco(arco: Arco) {\n const fracao = total > 0 ? (arco.value ?? 0) / total : 0;\n\n return `${arco.data.label}: ${formatValue(arco.value ?? 0)} (${formatPercent(fracao)})`;\n }\n\n return (\n <ChartFrame\n centerOrigin\n containerRef={ref}\n empty={nodes.length === 0}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={nodes.map((grupo, indice) => ({\n color: coresDeNivelZero[indice],\n hidden: isHidden(grupo.label),\n label: grupo.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={toggle}\n swatch=\"dot\"\n title={title}\n tooltip={\n showTooltip\n ? pathTooltip({\n color: foco ? corDe(foco) : undefined,\n format: formatTooltipValue ?? formatValue,\n formatPercent,\n path: foco && hoverPath(foco),\n total,\n })\n : undefined\n }\n width={width}\n >\n {arcos.map((arco, indice) => (\n <path\n aria-label={descreverArco(arco)}\n className={`${styles.arc} ${aceso(arco) ? '' : styles.arcDim}`}\n d={arcPath({\n cornerRadius: sliceRadius ?? raioDoCanto,\n endAngle: arco.x1,\n innerRadius: arco.y0 + (arco.depth > 1 ? ringGap : 0),\n outerRadius: arco.y1,\n startAngle: arco.x0,\n })}\n fill={corDe(arco)}\n key={indice}\n onMouseEnter={() => focar(arco)}\n onMouseLeave={() => focar(null)}\n >\n {!showTooltip && !onHoverNode && <title>{descreverArco(arco)}</title>}\n </path>\n ))}\n\n {showLabels &&\n arcos\n .filter(\n (arco) => arco.depth === profundidadeMaxima && arco.x1 - arco.x0 >= ANGULO_MINIMO_DO_ROTULO,\n )\n .map((arco, indice) => {\n const angulos = { endAngle: arco.x1, startAngle: arco.x0 };\n const [xBorda, yBorda] = arcAnchor(angulos, arco.y1);\n const [xCotovelo, yCotovelo] = arcAnchor(angulos, arco.y1 + COMPRIMENTO_DO_CONECTOR);\n const paraDireita = xCotovelo >= 0;\n const xFim = xCotovelo + (paraDireita ? COMPRIMENTO_DO_CONECTOR : -COMPRIMENTO_DO_CONECTOR);\n\n return (\n <g className={styles.leader} key={indice}>\n <polyline\n className={styles.connector}\n points={`${xBorda},${yBorda} ${xCotovelo},${yCotovelo} ${xFim},${yCotovelo}`}\n />\n <text\n className={styles.label}\n dominantBaseline=\"middle\"\n textAnchor={paraDireita ? 'start' : 'end'}\n x={xFim + (paraDireita ? CHART_LABEL_OFFSET : -CHART_LABEL_OFFSET)}\n y={yCotovelo}\n >\n {truncateToWidth(arco.data.label, font, larguraDoRotulo)}\n </text>\n </g>\n );\n })}\n </ChartFrame>\n );\n}\n"],"names":["ANGULO_MINIMO_DO_ROTULO","COMPRIMENTO_DO_CONECTOR","rotulosPorNivel","nodes","nivel","por","no","_a","tomDoNivel","cor","profundidade","clareamento","ChartSunburst","accent","defaultHiddenGroups","emptyMessage","formatPercent","fracao","formatTooltipValue","formatValue","formatarNumero","height","hiddenGroups","legend","legendAlign","onHiddenGroupsChange","onHoverNode","ringGap","showLabels","showTooltip","sliceRadius","title","font","alturaMedida","raioDoCanto","ref","width","useChartMetrics","fillHeight","alturaDoDesenho","chartHeight","isHidden","toggle","useSeriesToggle","emFoco","setEmFoco","useState","coresDeNivelZero","useMemo","resolveSeriesColors","visiveis","grupo","rotulosExternos","niveis","externo","larguraDoRotulo","widestLabel","CHART_LABEL_BAND","banda","CHART_LABEL_OFFSET","raio","ringDiameter","arcos","arvore","hierarchy","a","b","partition","VOLTA","profundidadeMaxima","maior","arco","total","soma","foco","aceso","focar","hoverPath","corDe","raizDoRamo","ancestral","base","descreverArco","jsxs","ChartFrame","indice","pathTooltip","jsx","styles","arcPath","angulos","xBorda","yBorda","arcAnchor","xCotovelo","yCotovelo","paraDireita","xFim","truncateToWidth"],"mappings":"+nBAgEMA,GAA0B,IAC1BC,EAA0B,GAMhC,SAASC,EACPC,EACAC,EAAQ,EACRC,EAAM,IAAI,IACV,CACA,OAAAF,EAAM,QAASG,GAAO,OACpBD,EAAI,IAAID,EAAO,CAAC,GAAIC,EAAI,IAAID,CAAK,GAAK,CAAA,EAAKE,EAAG,KAAK,CAAC,GAEhDC,EAAAD,EAAG,WAAH,MAAAC,EAAa,QACfL,EAAgBI,EAAG,SAAUF,EAAQ,EAAGC,CAAG,CAE/C,CAAC,EAEMA,CACT,CAOA,SAASG,GAAWC,EAAaC,EAAsB,CACrD,GAAIA,GAAgB,EAClB,OAAOD,EAGT,MAAME,EAAc,KAAK,KAAKD,EAAe,GAAK,GAAI,EAAE,EAExD,MAAO,uBAAuBD,CAAG,IAAI,IAAME,CAAW,6BACxD,CAEO,SAASC,GAAc,CAC5B,OAAAC,EACA,oBAAAC,EACA,aAAAC,EAAe,uBACf,cAAAC,EAAiBC,GAAW,GAAG,KAAK,MAAMA,EAAS,GAAG,CAAC,IACvD,mBAAAC,EACA,YAAAC,EAAcC,GAAAA,eACd,OAAAC,EAAS,IACT,aAAAC,EACA,OAAAC,EAAS,SACT,YAAAC,EACA,MAAArB,EACA,qBAAAsB,EACA,YAAAC,EACA,QAAAC,EAAU,EACV,WAAAC,EAAa,GACb,YAAAC,EAAc,GACd,YAAAC,EACA,MAAAC,CACF,EAAuB,CACrB,KAAM,CAAE,KAAAC,EAAM,OAAQC,EAAc,OAAQC,EAAa,IAAAC,GAAK,MAAAC,CAAA,EAAUC,mBAAA,EAClE,CAAE,WAAAC,GAAY,MAAOC,GAAoBC,GAAAA,YAAYnB,EAAQY,CAAY,EACzE,CAAE,SAAAQ,EAAU,OAAAC,EAAA,EAAWC,mBAAgB,CAC3C,oBAAqB7B,EACrB,aAAcQ,EACd,qBAAsBG,CAAA,CACvB,EACK,CAACmB,EAAQC,EAAS,EAAIC,EAAAA,SAAsB,IAAI,EAIhDC,EAAmBC,EAAAA,QAAQ,IAAMC,GAAAA,oBAAoB9C,EAAO,CAAE,OAAAU,CAAA,CAAQ,EAAG,CAACA,EAAQV,CAAK,CAAC,EAExF+C,EAAWF,EAAAA,QACf,IAAM7C,EAAM,OAAQgD,GAAU,CAACV,EAASU,EAAM,KAAK,CAAC,EACpD,CAACV,EAAUtC,CAAK,CAAA,EAMZiD,GAAkBJ,EAAAA,QAAQ,IAAM,CACpC,MAAMK,EAASnD,EAAgBgD,CAAQ,EACjCI,EAAU,KAAK,IAAI,EAAG,GAAGD,EAAO,MAAM,EAE5C,OAAOA,EAAO,IAAIC,CAAO,GAAK,CAAA,CAChC,EAAG,CAACJ,CAAQ,CAAC,EAEPK,EAAkB3B,EACpB,KAAK,IAAI4B,EAAAA,YAAYJ,GAAiBpB,CAAI,EAAGI,EAAQqB,EAAAA,gBAAgB,EACrE,EACEC,GAAQ9B,EAAa3B,EAA0B,EAAI0D,EAAAA,mBAAqBJ,EAAkB,EAG1FK,EADWC,eAAa,KAAK,IAAIzB,EAAQsB,GAAQ,EAAG,CAAC,EAAGnB,CAAe,EACrD,EAElBuB,EAAQd,EAAAA,QAAQ,IAAM,CAC1B,GAAIY,GAAQ,EACV,MAAO,CAAA,EAGT,MAAMG,EAASC,EAAAA,UAA6B,CAAE,SAAUd,EAAU,MAAO,EAAA,CAAI,EAC1E,IAAK5C,GAAO,KAAK,IAAIA,EAAG,OAAS,EAAG,CAAC,CAAC,EACtC,KAAK,CAAC2D,EAAGC,KAAOA,EAAE,OAAS,IAAMD,EAAE,OAAS,EAAE,EAIjD,OAFiBE,EAAAA,UAAA,EAA+B,KAAK,CAACC,EAAAA,MAAOR,CAAI,CAAC,EAElDG,CAAM,EACnB,YAAA,EACA,OAAQzD,GAAOA,EAAG,MAAQ,CAAC,CAChC,EAAG,CAACsD,EAAMV,CAAQ,CAAC,EAEbmB,GAAqBP,EAAM,OAAO,CAACQ,EAAOC,IAAS,KAAK,IAAID,EAAOC,EAAK,KAAK,EAAG,CAAC,EACjFC,EAAQV,EACX,OAAQS,GAASA,EAAK,QAAU,CAAC,EACjC,OAAO,CAACE,EAAMF,IAASE,GAAQF,EAAK,OAAS,GAAI,CAAC,EAI/CG,EAAO9B,GAAUkB,EAAM,SAASlB,CAAM,EAAIA,EAAS,KAOzD,SAAS+B,GAAMJ,EAAY,CACzB,OAAOG,IAAS,MAAQA,EAAK,UAAA,EAAY,SAASH,CAAI,CACxD,CAEA,SAASK,EAAML,EAAmB,CAChC1B,GAAU0B,CAAI,EACd7C,GAAA,MAAAA,EAAc6C,GAAQM,YAAUN,CAAI,EACtC,CAEA,SAASO,EAAMP,EAAY,OACzB,MAAMQ,GAAaxE,EAAAgE,EAAK,UAAA,EAAY,KAAMS,GAAcA,EAAU,QAAU,CAAC,IAA1D,YAAAzE,EAA6D,KAC1E0E,GACJF,GAAA,YAAAA,EAAY,QAAShC,EAAiB5C,EAAM,UAAWG,GAAOA,EAAG,SAAUyE,GAAA,YAAAA,EAAY,MAAK,CAAC,EAE/F,OAAOvE,GAAWyE,GAAQ,0BAA2BV,EAAK,KAAK,CACjE,CAEA,SAASW,EAAcX,EAAY,CACjC,MAAMtD,EAASuD,EAAQ,GAAKD,EAAK,OAAS,GAAKC,EAAQ,EAEvD,MAAO,GAAGD,EAAK,KAAK,KAAK,KAAKpD,EAAYoD,EAAK,OAAS,CAAC,CAAC,KAAKvD,EAAcC,CAAM,CAAC,GACtF,CAEA,OACEkE,EAAAA,KAACC,GAAAA,WAAA,CACC,aAAY,GACZ,aAAcjD,GACd,MAAOhC,EAAM,SAAW,EACxB,aAAAY,EACA,WAAAuB,GACA,OAAQC,EACR,OAAQpC,EAAM,IAAI,CAACgD,EAAOkC,KAAY,CACpC,MAAOtC,EAAiBsC,CAAM,EAC9B,OAAQ5C,EAASU,EAAM,KAAK,EAC5B,MAAOA,EAAM,KAAA,EACb,EACF,YAAA3B,EACA,eAAgBD,EAChB,eAAgBmB,GAChB,OAAO,MACP,MAAAX,EACA,QACEF,EACIyD,eAAY,CACV,MAAOZ,EAAOI,EAAMJ,CAAI,EAAI,OAC5B,OAAQxD,GAAsBC,EAC9B,cAAAH,EACA,KAAM0D,GAAQG,EAAAA,UAAUH,CAAI,EAC5B,MAAAF,CAAA,CACD,EACD,OAEN,MAAApC,EAEC,SAAA,CAAA0B,EAAM,IAAI,CAACS,EAAMc,IAChBE,EAAAA,IAAC,OAAA,CACC,aAAYL,EAAcX,CAAI,EAC9B,UAAW,GAAGiB,UAAO,GAAG,IAAIb,GAAMJ,CAAI,EAAI,GAAKiB,EAAAA,QAAO,MAAM,GAC5D,EAAGC,EAAAA,QAAQ,CACT,aAAc3D,GAAeI,EAC7B,SAAUqC,EAAK,GACf,YAAaA,EAAK,IAAMA,EAAK,MAAQ,EAAI5C,EAAU,GACnD,YAAa4C,EAAK,GAClB,WAAYA,EAAK,EAAA,CAClB,EACD,KAAMO,EAAMP,CAAI,EAEhB,aAAc,IAAMK,EAAML,CAAI,EAC9B,aAAc,IAAMK,EAAM,IAAI,EAE7B,SAAA,CAAC/C,GAAe,CAACH,SAAgB,QAAA,CAAO,SAAAwD,EAAcX,CAAI,CAAA,CAAE,CAAA,EAJxDc,CAAA,CAMR,EAEAzD,GACCkC,EACG,OACES,GAASA,EAAK,QAAUF,IAAsBE,EAAK,GAAKA,EAAK,IAAMvE,EAAA,EAErE,IAAI,CAACuE,EAAMc,IAAW,CACrB,MAAMK,EAAU,CAAE,SAAUnB,EAAK,GAAI,WAAYA,EAAK,EAAA,EAChD,CAACoB,EAAQC,CAAM,EAAIC,EAAAA,UAAUH,EAASnB,EAAK,EAAE,EAC7C,CAACuB,EAAWC,CAAS,EAAIF,EAAAA,UAAUH,EAASnB,EAAK,GAAKtE,CAAuB,EAC7E+F,EAAcF,GAAa,EAC3BG,EAAOH,GAAaE,EAAc/F,EAA0B,CAACA,GAEnE,OACEkF,EAAAA,KAAC,IAAA,CAAE,UAAWK,EAAAA,QAAO,OACnB,SAAA,CAAAD,EAAAA,IAAC,WAAA,CACC,UAAWC,EAAAA,QAAO,UAClB,OAAQ,GAAGG,CAAM,IAAIC,CAAM,IAAIE,CAAS,IAAIC,CAAS,IAAIE,CAAI,IAAIF,CAAS,EAAA,CAAA,EAE5ER,EAAAA,IAAC,OAAA,CACC,UAAWC,EAAAA,QAAO,MAClB,iBAAiB,SACjB,WAAYQ,EAAc,QAAU,MACpC,EAAGC,GAAQD,EAAcrC,EAAAA,mBAAqB,CAACA,EAAAA,oBAC/C,EAAGoC,EAEF,SAAAG,EAAAA,gBAAgB3B,EAAK,KAAK,MAAOvC,EAAMuB,CAAe,CAAA,CAAA,CACzD,CAAA,EAbgC8B,CAclC,CAEJ,CAAC,CAAA,CAAA,CAAA,CAGX"}
@@ -1,144 +1,159 @@
1
- import { jsxs as B, jsx as p } from "react/jsx-runtime";
2
- import { useState as re, useMemo as g } from "react";
3
- import { hierarchy as ne, partition as oe } from "d3-hierarchy";
4
- import u from "./ChartSunburst.module.css.js";
5
- import { useChartMetrics as ie } from "../core/useChartMetrics.js";
6
- import { useSeriesToggle as ae } from "../core/useSeriesToggle.js";
7
- import { resolveSeriesColors as le } from "../palette/seriesColor.js";
8
- import { widestLabel as se, truncateToWidth as ce } from "../core/measureText.js";
9
- import { CHART_LABEL_BAND as de, CHART_LABEL_OFFSET as y, ringDiameter as ue } from "../core/spacing.js";
10
- import { VOLTA as me, arcPath as he, arcAnchor as F } from "../core/arcs.js";
11
- import { ChartFrame as fe } from "../core/ChartFrame.js";
12
- import { formatarNumero as pe } from "../../../utils/formatters/formatarNumero.js";
13
- import { chartHeight as ge } from "../core/cartesianLayout.js";
14
- const xe = 0.18, x = 14;
15
- function I(i, n = 1, o = /* @__PURE__ */ new Map()) {
16
- return i.forEach((s) => {
17
- var m;
18
- o.set(n, [...o.get(n) ?? [], s.label]), (m = s.children) != null && m.length && I(s.children, n + 1, o);
1
+ import { jsxs as k, jsx as x } from "react/jsx-runtime";
2
+ import { useState as at, useMemo as M } from "react";
3
+ import { hierarchy as st, partition as ct } from "d3-hierarchy";
4
+ import d from "./ChartSunburst.module.css.js";
5
+ import { useChartMetrics as ut } from "../core/useChartMetrics.js";
6
+ import { useSeriesToggle as mt } from "../core/useSeriesToggle.js";
7
+ import { resolveSeriesColors as dt } from "../palette/seriesColor.js";
8
+ import { widestLabel as ht, truncateToWidth as ft } from "../core/measureText.js";
9
+ import { CHART_LABEL_BAND as pt, CHART_LABEL_OFFSET as E, ringDiameter as gt } from "../core/spacing.js";
10
+ import { VOLTA as xt, arcPath as Mt, arcAnchor as H } from "../core/arcs.js";
11
+ import { ChartFrame as vt } from "../core/ChartFrame.js";
12
+ import { pathTooltip as bt } from "../core/tooltips.js";
13
+ import { hoverPath as U } from "../core/hoverPath.js";
14
+ import { formatarNumero as At } from "../../../utils/formatters/formatarNumero.js";
15
+ import { chartHeight as $t } from "../core/cartesianLayout.js";
16
+ const Ct = 0.18, v = 14;
17
+ function w(i, n = 1, o = /* @__PURE__ */ new Map()) {
18
+ return i.forEach((a) => {
19
+ var h;
20
+ o.set(n, [...o.get(n) ?? [], a.label]), (h = a.children) != null && h.length && w(a.children, n + 1, o);
19
21
  }), o;
20
22
  }
21
- function ve(i, n) {
23
+ function Ot(i, n) {
22
24
  if (n <= 1)
23
25
  return i;
24
26
  const o = Math.min((n - 1) * 22, 66);
25
27
  return `color-mix(in oklab, ${i} ${100 - o}%, var(--pl-color-surface))`;
26
28
  }
27
- function Le({
29
+ function Ut({
28
30
  accent: i,
29
31
  defaultHiddenGroups: n,
30
32
  emptyMessage: o = "Sem dados no período",
31
- formatPercent: s = (h) => `${Math.round(h * 100)}%`,
32
- formatValue: m = pe,
33
- height: P = 320,
34
- hiddenGroups: j,
35
- legend: k = "bottom",
36
- legendAlign: w,
37
- nodes: a,
38
- onHiddenGroupsChange: U,
39
- ringGap: G = 2,
40
- showLabels: v = !0,
41
- sliceRadius: V,
42
- title: W
33
+ formatPercent: a = (p) => `${Math.round(p * 100)}%`,
34
+ formatTooltipValue: h,
35
+ formatValue: _ = At,
36
+ height: G = 320,
37
+ hiddenGroups: W,
38
+ legend: Z = "bottom",
39
+ legendAlign: q,
40
+ nodes: l,
41
+ onHiddenGroupsChange: J,
42
+ onHoverNode: f,
43
+ ringGap: K = 2,
44
+ showLabels: b = !0,
45
+ showTooltip: N = !0,
46
+ sliceRadius: Q,
47
+ title: V
43
48
  }) {
44
- const { font: h, height: Z, radius: q, ref: J, width: M } = ie(), { fillHeight: K, value: D } = ge(P, Z), { isHidden: b, toggle: Q } = ae({
49
+ const { font: p, height: X, radius: Y, ref: z, width: A } = ut(), { fillHeight: tt, value: L } = $t(G, X), { isHidden: $, toggle: et } = mt({
45
50
  defaultHiddenSeries: n,
46
- hiddenSeries: j,
47
- onHiddenSeriesChange: U
48
- }), [A, S] = re(null), T = g(() => le(a, { accent: i }), [i, a]), f = g(
49
- () => a.filter((e) => !b(e.label)),
50
- [b, a]
51
- ), X = g(() => {
52
- const e = I(f), t = Math.max(0, ...e.keys());
53
- return e.get(t) ?? [];
54
- }, [f]), E = v ? Math.min(se(X, h), M * de) : 0, Y = v ? x * 2 + y + E : 0, $ = ue(Math.max(M - Y * 2, 0), D) / 2, c = g(() => {
55
- if ($ <= 0)
51
+ hiddenSeries: W,
52
+ onHiddenSeriesChange: J
53
+ }), [C, rt] = at(null), R = M(() => dt(l, { accent: i }), [i, l]), g = M(
54
+ () => l.filter((t) => !$(t.label)),
55
+ [$, l]
56
+ ), nt = M(() => {
57
+ const t = w(g), e = Math.max(0, ...t.keys());
58
+ return t.get(e) ?? [];
59
+ }, [g]), B = b ? Math.min(ht(nt, p), A * pt) : 0, ot = b ? v * 2 + E + B : 0, O = gt(Math.max(A - ot * 2, 0), L) / 2, u = M(() => {
60
+ if (O <= 0)
56
61
  return [];
57
- const e = ne({ children: f, label: "" }).sum((r) => Math.max(r.value ?? 0, 0)).sort((r, l) => (l.value ?? 0) - (r.value ?? 0));
58
- return oe().size([me, $])(e).descendants().filter((r) => r.depth > 0);
59
- }, [$, f]), z = c.reduce((e, t) => Math.max(e, t.depth), 0), _ = c.filter((e) => e.depth === 1).reduce((e, t) => e + (t.value ?? 0), 0), H = A && c.includes(A) ? A : null;
60
- function ee(e) {
61
- return H === null || H.ancestors().includes(e);
62
+ const t = st({ children: g, label: "" }).sum((r) => Math.max(r.value ?? 0, 0)).sort((r, c) => (c.value ?? 0) - (r.value ?? 0));
63
+ return ct().size([xt, O])(t).descendants().filter((r) => r.depth > 0);
64
+ }, [O, g]), it = u.reduce((t, e) => Math.max(t, e.depth), 0), y = u.filter((t) => t.depth === 1).reduce((t, e) => t + (e.value ?? 0), 0), s = C && u.includes(C) ? C : null;
65
+ function lt(t) {
66
+ return s === null || s.ancestors().includes(t);
62
67
  }
63
- function te(e) {
64
- var l;
65
- const t = (l = e.ancestors().find((d) => d.depth === 1)) == null ? void 0 : l.data, r = (t == null ? void 0 : t.color) ?? T[a.findIndex((d) => d.label === (t == null ? void 0 : t.label))];
66
- return ve(r ?? "var(--pl-chart-neutral)", e.depth);
68
+ function F(t) {
69
+ rt(t), f == null || f(t && U(t));
67
70
  }
68
- function L(e) {
69
- const t = _ > 0 ? (e.value ?? 0) / _ : 0;
70
- return `${e.data.label}: ${m(e.value ?? 0)} (${s(t)})`;
71
+ function I(t) {
72
+ var c;
73
+ const e = (c = t.ancestors().find((m) => m.depth === 1)) == null ? void 0 : c.data, r = (e == null ? void 0 : e.color) ?? R[l.findIndex((m) => m.label === (e == null ? void 0 : e.label))];
74
+ return Ot(r ?? "var(--pl-chart-neutral)", t.depth);
71
75
  }
72
- return /* @__PURE__ */ B(
73
- fe,
76
+ function P(t) {
77
+ const e = y > 0 ? (t.value ?? 0) / y : 0;
78
+ return `${t.data.label}: ${_(t.value ?? 0)} (${a(e)})`;
79
+ }
80
+ return /* @__PURE__ */ k(
81
+ vt,
74
82
  {
75
83
  centerOrigin: !0,
76
- containerRef: J,
77
- empty: a.length === 0,
84
+ containerRef: z,
85
+ empty: l.length === 0,
78
86
  emptyMessage: o,
79
- fillHeight: K,
80
- height: D,
81
- legend: a.map((e, t) => ({
82
- color: T[t],
83
- hidden: b(e.label),
84
- label: e.label
87
+ fillHeight: tt,
88
+ height: L,
89
+ legend: l.map((t, e) => ({
90
+ color: R[e],
91
+ hidden: $(t.label),
92
+ label: t.label
85
93
  })),
86
- legendAlign: w,
87
- legendPosition: k,
88
- onToggleSeries: Q,
94
+ legendAlign: q,
95
+ legendPosition: Z,
96
+ onToggleSeries: et,
89
97
  swatch: "dot",
90
- title: W,
91
- width: M,
98
+ title: V,
99
+ tooltip: N ? bt({
100
+ color: s ? I(s) : void 0,
101
+ format: h ?? _,
102
+ formatPercent: a,
103
+ path: s && U(s),
104
+ total: y
105
+ }) : void 0,
106
+ width: A,
92
107
  children: [
93
- c.map((e, t) => /* @__PURE__ */ p(
108
+ u.map((t, e) => /* @__PURE__ */ x(
94
109
  "path",
95
110
  {
96
- "aria-label": L(e),
97
- className: `${u.arc} ${ee(e) ? "" : u.arcDim}`,
98
- d: he({
99
- cornerRadius: V ?? q,
100
- endAngle: e.x1,
101
- innerRadius: e.y0 + (e.depth > 1 ? G : 0),
102
- outerRadius: e.y1,
103
- startAngle: e.x0
111
+ "aria-label": P(t),
112
+ className: `${d.arc} ${lt(t) ? "" : d.arcDim}`,
113
+ d: Mt({
114
+ cornerRadius: Q ?? Y,
115
+ endAngle: t.x1,
116
+ innerRadius: t.y0 + (t.depth > 1 ? K : 0),
117
+ outerRadius: t.y1,
118
+ startAngle: t.x0
104
119
  }),
105
- fill: te(e),
106
- onMouseEnter: () => S(e),
107
- onMouseLeave: () => S(null),
108
- children: /* @__PURE__ */ p("title", { children: L(e) })
120
+ fill: I(t),
121
+ onMouseEnter: () => F(t),
122
+ onMouseLeave: () => F(null),
123
+ children: !N && !f && /* @__PURE__ */ x("title", { children: P(t) })
109
124
  },
110
- t
125
+ e
111
126
  )),
112
- v && c.filter(
113
- (e) => e.depth === z && e.x1 - e.x0 >= xe
114
- ).map((e, t) => {
115
- const r = { endAngle: e.x1, startAngle: e.x0 }, [l, d] = F(r, e.y1), [C, N] = F(r, e.y1 + x), O = C >= 0, R = C + (O ? x : -x);
116
- return /* @__PURE__ */ B("g", { className: u.leader, children: [
117
- /* @__PURE__ */ p(
127
+ b && u.filter(
128
+ (t) => t.depth === it && t.x1 - t.x0 >= Ct
129
+ ).map((t, e) => {
130
+ const r = { endAngle: t.x1, startAngle: t.x0 }, [c, m] = H(r, t.y1), [D, S] = H(r, t.y1 + v), T = D >= 0, j = D + (T ? v : -v);
131
+ return /* @__PURE__ */ k("g", { className: d.leader, children: [
132
+ /* @__PURE__ */ x(
118
133
  "polyline",
119
134
  {
120
- className: u.connector,
121
- points: `${l},${d} ${C},${N} ${R},${N}`
135
+ className: d.connector,
136
+ points: `${c},${m} ${D},${S} ${j},${S}`
122
137
  }
123
138
  ),
124
- /* @__PURE__ */ p(
139
+ /* @__PURE__ */ x(
125
140
  "text",
126
141
  {
127
- className: u.label,
142
+ className: d.label,
128
143
  dominantBaseline: "middle",
129
- textAnchor: O ? "start" : "end",
130
- x: R + (O ? y : -y),
131
- y: N,
132
- children: ce(e.data.label, h, E)
144
+ textAnchor: T ? "start" : "end",
145
+ x: j + (T ? E : -E),
146
+ y: S,
147
+ children: ft(t.data.label, p, B)
133
148
  }
134
149
  )
135
- ] }, t);
150
+ ] }, e);
136
151
  })
137
152
  ]
138
153
  }
139
154
  );
140
155
  }
141
156
  export {
142
- Le as ChartSunburst
157
+ Ut as ChartSunburst
143
158
  };
144
159
  //# sourceMappingURL=ChartSunburst.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartSunburst.js","sources":["../../../../src/components/charts/ChartSunburst/ChartSunburst.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { hierarchy, partition, type HierarchyRectangularNode } from 'd3-hierarchy';\nimport {\n CHART_LABEL_BAND,\n CHART_LABEL_OFFSET,\n ChartFrame,\n VOLTA,\n arcAnchor,\n arcPath,\n chartHeight,\n ringDiameter,\n truncateToWidth,\n useChartMetrics,\n useSeriesToggle,\n widestLabel,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartSunburst.module.css';\n\nexport interface ChartSunburstNode extends SeriesAppearance {\n children?: readonly ChartSunburstNode[];\n label: string;\n value?: number;\n}\n\nexport interface ChartSunburstProps {\n accent?: string;\n defaultHiddenGroups?: readonly string[];\n emptyMessage?: string;\n formatPercent?: (ratio: number) => string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenGroups?: readonly string[];\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n nodes: readonly ChartSunburstNode[];\n onHiddenGroupsChange?: (hidden: readonly string[]) => void;\n /** Folga entre dois aneis vizinhos. */\n ringGap?: number;\n /** Raio das pontas de cada arco. Sem valor, o token de raio pequeno. */\n sliceRadius?: number;\n showLabels?: boolean;\n title: string;\n}\n\ntype Arco = HierarchyRectangularNode<ChartSunburstNode>;\n\n/** Arco menor que isso nao comporta rotulo nem conector legivel. */\nconst ANGULO_MINIMO_DO_ROTULO = 0.18;\nconst COMPRIMENTO_DO_CONECTOR = 14;\n/**\n * Rotulos de cada nivel da arvore declarada. Medir a banda antes de montar o\n * anel exige saber os rotulos antes, e o nivel mais profundo declarado e o\n * mesmo que o anel externo tera.\n */\nfunction rotulosPorNivel(\n nodes: readonly ChartSunburstNode[],\n nivel = 1,\n por = new Map<number, string[]>(),\n) {\n nodes.forEach((no) => {\n por.set(nivel, [...(por.get(nivel) ?? []), no.label]);\n\n if (no.children?.length) {\n rotulosPorNivel(no.children, nivel + 1, por);\n }\n });\n\n return por;\n}\n\n/**\n * Cada anel clareia sobre o anterior, e o filho nasce da cor do pai. Sem isso a\n * hierarquia sumiria: os aneis externos repetiriam a cor do nivel zero e nada\n * distinguiria um filho do outro.\n */\nfunction tomDoNivel(cor: string, profundidade: number) {\n if (profundidade <= 1) {\n return cor;\n }\n\n const clareamento = Math.min((profundidade - 1) * 22, 66);\n\n return `color-mix(in oklab, ${cor} ${100 - clareamento}%, var(--pl-color-surface))`;\n}\n\nexport function ChartSunburst({\n accent,\n defaultHiddenGroups,\n emptyMessage = 'Sem dados no período',\n formatPercent = (fracao) => `${Math.round(fracao * 100)}%`,\n formatValue = formatarNumero,\n height = 320,\n hiddenGroups,\n legend = 'bottom',\n legendAlign,\n nodes,\n onHiddenGroupsChange,\n ringGap = 2,\n showLabels = true,\n sliceRadius,\n title,\n}: ChartSunburstProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({\n defaultHiddenSeries: defaultHiddenGroups,\n hiddenSeries: hiddenGroups,\n onHiddenSeriesChange: onHiddenGroupsChange,\n });\n const [emFoco, setEmFoco] = useState<Arco | null>(null);\n\n // A cor sai da lista inteira, e nao das visiveis: desligar um grupo nao pode\n // repintar os demais.\n const coresDeNivelZero = useMemo(() => resolveSeriesColors(nodes, { accent }), [accent, nodes]);\n\n const visiveis = useMemo(\n () => nodes.filter((grupo) => !isHidden(grupo.label)),\n [isHidden, nodes],\n );\n\n // A banda dos rotulos e reservada antes do anel, medida pelo rotulo mais\n // largo do anel externo. Sem reservar, o rotulo era desenhado no que sobrasse\n // — quase nada nas laterais — e acabava cortado ate sumir.\n const rotulosExternos = useMemo(() => {\n const niveis = rotulosPorNivel(visiveis);\n const externo = Math.max(0, ...niveis.keys());\n\n return niveis.get(externo) ?? [];\n }, [visiveis]);\n\n const larguraDoRotulo = showLabels\n ? Math.min(widestLabel(rotulosExternos, font), width * CHART_LABEL_BAND)\n : 0;\n const banda = showLabels ? COMPRIMENTO_DO_CONECTOR * 2 + CHART_LABEL_OFFSET + larguraDoRotulo : 0;\n\n const diametro = ringDiameter(Math.max(width - banda * 2, 0), alturaDoDesenho);\n const raio = diametro / 2;\n\n const arcos = useMemo(() => {\n if (raio <= 0) {\n return [];\n }\n\n const arvore = hierarchy<ChartSunburstNode>({ children: visiveis, label: '' })\n .sum((no) => Math.max(no.value ?? 0, 0))\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n const repartir = partition<ChartSunburstNode>().size([VOLTA, raio]);\n\n return repartir(arvore)\n .descendants()\n .filter((no) => no.depth > 0);\n }, [raio, visiveis]);\n\n const profundidadeMaxima = arcos.reduce((maior, arco) => Math.max(maior, arco.depth), 0);\n const total = arcos\n .filter((arco) => arco.depth === 1)\n .reduce((soma, arco) => soma + (arco.value ?? 0), 0);\n\n // O arco guardado deixa de existir quando a arvore e remontada, num\n // redimensionamento por exemplo. Sem conferir, o foco perdido apagaria tudo.\n const foco = emFoco && arcos.includes(emFoco) ? emFoco : null;\n\n /**\n * Acende o arco sob o ponteiro e os que o originaram. O caminho ate a raiz e\n * o que explica de onde aquela fatia veio; os filhos dela nao explicam nada\n * sobre ela, entao ficam apagados junto com o resto.\n */\n function aceso(arco: Arco) {\n return foco === null || foco.ancestors().includes(arco);\n }\n\n function corDe(arco: Arco) {\n const raizDoRamo = arco.ancestors().find((ancestral) => ancestral.depth === 1)?.data;\n const base =\n raizDoRamo?.color ?? coresDeNivelZero[nodes.findIndex((no) => no.label === raizDoRamo?.label)];\n\n return tomDoNivel(base ?? 'var(--pl-chart-neutral)', arco.depth);\n }\n\n function descreverArco(arco: Arco) {\n const fracao = total > 0 ? (arco.value ?? 0) / total : 0;\n\n return `${arco.data.label}: ${formatValue(arco.value ?? 0)} (${formatPercent(fracao)})`;\n }\n\n return (\n <ChartFrame\n centerOrigin\n containerRef={ref}\n empty={nodes.length === 0}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={nodes.map((grupo, indice) => ({\n color: coresDeNivelZero[indice],\n hidden: isHidden(grupo.label),\n label: grupo.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={toggle}\n swatch=\"dot\"\n title={title}\n width={width}\n >\n {arcos.map((arco, indice) => (\n <path\n aria-label={descreverArco(arco)}\n className={`${styles.arc} ${aceso(arco) ? '' : styles.arcDim}`}\n d={arcPath({\n cornerRadius: sliceRadius ?? raioDoCanto,\n endAngle: arco.x1,\n innerRadius: arco.y0 + (arco.depth > 1 ? ringGap : 0),\n outerRadius: arco.y1,\n startAngle: arco.x0,\n })}\n fill={corDe(arco)}\n key={indice}\n onMouseEnter={() => setEmFoco(arco)}\n onMouseLeave={() => setEmFoco(null)}\n >\n <title>{descreverArco(arco)}</title>\n </path>\n ))}\n\n {showLabels &&\n arcos\n .filter(\n (arco) => arco.depth === profundidadeMaxima && arco.x1 - arco.x0 >= ANGULO_MINIMO_DO_ROTULO,\n )\n .map((arco, indice) => {\n const angulos = { endAngle: arco.x1, startAngle: arco.x0 };\n const [xBorda, yBorda] = arcAnchor(angulos, arco.y1);\n const [xCotovelo, yCotovelo] = arcAnchor(angulos, arco.y1 + COMPRIMENTO_DO_CONECTOR);\n const paraDireita = xCotovelo >= 0;\n const xFim = xCotovelo + (paraDireita ? COMPRIMENTO_DO_CONECTOR : -COMPRIMENTO_DO_CONECTOR);\n\n return (\n <g className={styles.leader} key={indice}>\n <polyline\n className={styles.connector}\n points={`${xBorda},${yBorda} ${xCotovelo},${yCotovelo} ${xFim},${yCotovelo}`}\n />\n <text\n className={styles.label}\n dominantBaseline=\"middle\"\n textAnchor={paraDireita ? 'start' : 'end'}\n x={xFim + (paraDireita ? CHART_LABEL_OFFSET : -CHART_LABEL_OFFSET)}\n y={yCotovelo}\n >\n {truncateToWidth(arco.data.label, font, larguraDoRotulo)}\n </text>\n </g>\n );\n })}\n </ChartFrame>\n );\n}\n"],"names":["ANGULO_MINIMO_DO_ROTULO","COMPRIMENTO_DO_CONECTOR","rotulosPorNivel","nodes","nivel","por","no","_a","tomDoNivel","cor","profundidade","clareamento","ChartSunburst","accent","defaultHiddenGroups","emptyMessage","formatPercent","fracao","formatValue","formatarNumero","height","hiddenGroups","legend","legendAlign","onHiddenGroupsChange","ringGap","showLabels","sliceRadius","title","font","alturaMedida","raioDoCanto","ref","width","useChartMetrics","fillHeight","alturaDoDesenho","chartHeight","isHidden","toggle","useSeriesToggle","emFoco","setEmFoco","useState","coresDeNivelZero","useMemo","resolveSeriesColors","visiveis","grupo","rotulosExternos","niveis","externo","larguraDoRotulo","widestLabel","CHART_LABEL_BAND","banda","CHART_LABEL_OFFSET","raio","ringDiameter","arcos","arvore","hierarchy","a","b","partition","VOLTA","profundidadeMaxima","maior","arco","total","soma","foco","aceso","corDe","raizDoRamo","ancestral","base","descreverArco","jsxs","ChartFrame","indice","jsx","styles","arcPath","angulos","xBorda","yBorda","arcAnchor","xCotovelo","yCotovelo","paraDireita","xFim","truncateToWidth"],"mappings":"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"}
1
+ {"version":3,"file":"ChartSunburst.js","sources":["../../../../src/components/charts/ChartSunburst/ChartSunburst.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { hierarchy, partition, type HierarchyRectangularNode } from 'd3-hierarchy';\nimport {\n CHART_LABEL_BAND,\n CHART_LABEL_OFFSET,\n ChartFrame,\n VOLTA,\n arcAnchor,\n arcPath,\n hoverPath,\n pathTooltip,\n chartHeight,\n ringDiameter,\n truncateToWidth,\n useChartMetrics,\n useSeriesToggle,\n widestLabel,\n type ChartHeight,\n type ChartHoveredNode,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartSunburst.module.css';\n\nexport interface ChartSunburstNode extends SeriesAppearance {\n children?: readonly ChartSunburstNode[];\n label: string;\n value?: number;\n}\n\nexport interface ChartSunburstProps {\n accent?: string;\n defaultHiddenGroups?: readonly string[];\n emptyMessage?: string;\n formatPercent?: (ratio: number) => string;\n /** Formato dos valores no balao. Sem ele, vale o `formatValue`: o eixo pode sair compacto e o balao, exato. */\n formatTooltipValue?: (value: number) => string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenGroups?: readonly string[];\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n nodes: readonly ChartSunburstNode[];\n onHiddenGroupsChange?: (hidden: readonly string[]) => void;\n /** Caminho ate o no sob o ponteiro, do grupo ao no, cada nivel com o valor somado, ou `null` ao sair. */\n onHoverNode?: (path: readonly ChartHoveredNode[] | null) => void;\n /** Folga entre dois aneis vizinhos. */\n ringGap?: number;\n /** Raio das pontas de cada arco. Sem valor, o token de raio pequeno. */\n sliceRadius?: number;\n showLabels?: boolean;\n /**\n * Balao com o caminho ate o no sob o ponteiro. Desligue para montar o proprio `ChartTooltip`\n * pela costura; sem balao nem costura, o no volta a ter o `<title>`.\n */\n showTooltip?: boolean;\n title: string;\n}\n\ntype Arco = HierarchyRectangularNode<ChartSunburstNode>;\n\n/** Arco menor que isso nao comporta rotulo nem conector legivel. */\nconst ANGULO_MINIMO_DO_ROTULO = 0.18;\nconst COMPRIMENTO_DO_CONECTOR = 14;\n/**\n * Rotulos de cada nivel da arvore declarada. Medir a banda antes de montar o\n * anel exige saber os rotulos antes, e o nivel mais profundo declarado e o\n * mesmo que o anel externo tera.\n */\nfunction rotulosPorNivel(\n nodes: readonly ChartSunburstNode[],\n nivel = 1,\n por = new Map<number, string[]>(),\n) {\n nodes.forEach((no) => {\n por.set(nivel, [...(por.get(nivel) ?? []), no.label]);\n\n if (no.children?.length) {\n rotulosPorNivel(no.children, nivel + 1, por);\n }\n });\n\n return por;\n}\n\n/**\n * Cada anel clareia sobre o anterior, e o filho nasce da cor do pai. Sem isso a\n * hierarquia sumiria: os aneis externos repetiriam a cor do nivel zero e nada\n * distinguiria um filho do outro.\n */\nfunction tomDoNivel(cor: string, profundidade: number) {\n if (profundidade <= 1) {\n return cor;\n }\n\n const clareamento = Math.min((profundidade - 1) * 22, 66);\n\n return `color-mix(in oklab, ${cor} ${100 - clareamento}%, var(--pl-color-surface))`;\n}\n\nexport function ChartSunburst({\n accent,\n defaultHiddenGroups,\n emptyMessage = 'Sem dados no período',\n formatPercent = (fracao) => `${Math.round(fracao * 100)}%`,\n formatTooltipValue,\n formatValue = formatarNumero,\n height = 320,\n hiddenGroups,\n legend = 'bottom',\n legendAlign,\n nodes,\n onHiddenGroupsChange,\n onHoverNode,\n ringGap = 2,\n showLabels = true,\n showTooltip = true,\n sliceRadius,\n title,\n}: ChartSunburstProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({\n defaultHiddenSeries: defaultHiddenGroups,\n hiddenSeries: hiddenGroups,\n onHiddenSeriesChange: onHiddenGroupsChange,\n });\n const [emFoco, setEmFoco] = useState<Arco | null>(null);\n\n // A cor sai da lista inteira, e nao das visiveis: desligar um grupo nao pode\n // repintar os demais.\n const coresDeNivelZero = useMemo(() => resolveSeriesColors(nodes, { accent }), [accent, nodes]);\n\n const visiveis = useMemo(\n () => nodes.filter((grupo) => !isHidden(grupo.label)),\n [isHidden, nodes],\n );\n\n // A banda dos rotulos e reservada antes do anel, medida pelo rotulo mais\n // largo do anel externo. Sem reservar, o rotulo era desenhado no que sobrasse\n // — quase nada nas laterais — e acabava cortado ate sumir.\n const rotulosExternos = useMemo(() => {\n const niveis = rotulosPorNivel(visiveis);\n const externo = Math.max(0, ...niveis.keys());\n\n return niveis.get(externo) ?? [];\n }, [visiveis]);\n\n const larguraDoRotulo = showLabels\n ? Math.min(widestLabel(rotulosExternos, font), width * CHART_LABEL_BAND)\n : 0;\n const banda = showLabels ? COMPRIMENTO_DO_CONECTOR * 2 + CHART_LABEL_OFFSET + larguraDoRotulo : 0;\n\n const diametro = ringDiameter(Math.max(width - banda * 2, 0), alturaDoDesenho);\n const raio = diametro / 2;\n\n const arcos = useMemo(() => {\n if (raio <= 0) {\n return [];\n }\n\n const arvore = hierarchy<ChartSunburstNode>({ children: visiveis, label: '' })\n .sum((no) => Math.max(no.value ?? 0, 0))\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n const repartir = partition<ChartSunburstNode>().size([VOLTA, raio]);\n\n return repartir(arvore)\n .descendants()\n .filter((no) => no.depth > 0);\n }, [raio, visiveis]);\n\n const profundidadeMaxima = arcos.reduce((maior, arco) => Math.max(maior, arco.depth), 0);\n const total = arcos\n .filter((arco) => arco.depth === 1)\n .reduce((soma, arco) => soma + (arco.value ?? 0), 0);\n\n // O arco guardado deixa de existir quando a arvore e remontada, num\n // redimensionamento por exemplo. Sem conferir, o foco perdido apagaria tudo.\n const foco = emFoco && arcos.includes(emFoco) ? emFoco : null;\n\n /**\n * Acende o arco sob o ponteiro e os que o originaram. O caminho ate a raiz e\n * o que explica de onde aquela fatia veio; os filhos dela nao explicam nada\n * sobre ela, entao ficam apagados junto com o resto.\n */\n function aceso(arco: Arco) {\n return foco === null || foco.ancestors().includes(arco);\n }\n\n function focar(arco: Arco | null) {\n setEmFoco(arco);\n onHoverNode?.(arco && hoverPath(arco));\n }\n\n function corDe(arco: Arco) {\n const raizDoRamo = arco.ancestors().find((ancestral) => ancestral.depth === 1)?.data;\n const base =\n raizDoRamo?.color ?? coresDeNivelZero[nodes.findIndex((no) => no.label === raizDoRamo?.label)];\n\n return tomDoNivel(base ?? 'var(--pl-chart-neutral)', arco.depth);\n }\n\n function descreverArco(arco: Arco) {\n const fracao = total > 0 ? (arco.value ?? 0) / total : 0;\n\n return `${arco.data.label}: ${formatValue(arco.value ?? 0)} (${formatPercent(fracao)})`;\n }\n\n return (\n <ChartFrame\n centerOrigin\n containerRef={ref}\n empty={nodes.length === 0}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={nodes.map((grupo, indice) => ({\n color: coresDeNivelZero[indice],\n hidden: isHidden(grupo.label),\n label: grupo.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={toggle}\n swatch=\"dot\"\n title={title}\n tooltip={\n showTooltip\n ? pathTooltip({\n color: foco ? corDe(foco) : undefined,\n format: formatTooltipValue ?? formatValue,\n formatPercent,\n path: foco && hoverPath(foco),\n total,\n })\n : undefined\n }\n width={width}\n >\n {arcos.map((arco, indice) => (\n <path\n aria-label={descreverArco(arco)}\n className={`${styles.arc} ${aceso(arco) ? '' : styles.arcDim}`}\n d={arcPath({\n cornerRadius: sliceRadius ?? raioDoCanto,\n endAngle: arco.x1,\n innerRadius: arco.y0 + (arco.depth > 1 ? ringGap : 0),\n outerRadius: arco.y1,\n startAngle: arco.x0,\n })}\n fill={corDe(arco)}\n key={indice}\n onMouseEnter={() => focar(arco)}\n onMouseLeave={() => focar(null)}\n >\n {!showTooltip && !onHoverNode && <title>{descreverArco(arco)}</title>}\n </path>\n ))}\n\n {showLabels &&\n arcos\n .filter(\n (arco) => arco.depth === profundidadeMaxima && arco.x1 - arco.x0 >= ANGULO_MINIMO_DO_ROTULO,\n )\n .map((arco, indice) => {\n const angulos = { endAngle: arco.x1, startAngle: arco.x0 };\n const [xBorda, yBorda] = arcAnchor(angulos, arco.y1);\n const [xCotovelo, yCotovelo] = arcAnchor(angulos, arco.y1 + COMPRIMENTO_DO_CONECTOR);\n const paraDireita = xCotovelo >= 0;\n const xFim = xCotovelo + (paraDireita ? COMPRIMENTO_DO_CONECTOR : -COMPRIMENTO_DO_CONECTOR);\n\n return (\n <g className={styles.leader} key={indice}>\n <polyline\n className={styles.connector}\n points={`${xBorda},${yBorda} ${xCotovelo},${yCotovelo} ${xFim},${yCotovelo}`}\n />\n <text\n className={styles.label}\n dominantBaseline=\"middle\"\n textAnchor={paraDireita ? 'start' : 'end'}\n x={xFim + (paraDireita ? CHART_LABEL_OFFSET : -CHART_LABEL_OFFSET)}\n y={yCotovelo}\n >\n {truncateToWidth(arco.data.label, font, larguraDoRotulo)}\n </text>\n </g>\n );\n })}\n </ChartFrame>\n );\n}\n"],"names":["ANGULO_MINIMO_DO_ROTULO","COMPRIMENTO_DO_CONECTOR","rotulosPorNivel","nodes","nivel","por","no","_a","tomDoNivel","cor","profundidade","clareamento","ChartSunburst","accent","defaultHiddenGroups","emptyMessage","formatPercent","fracao","formatTooltipValue","formatValue","formatarNumero","height","hiddenGroups","legend","legendAlign","onHiddenGroupsChange","onHoverNode","ringGap","showLabels","showTooltip","sliceRadius","title","font","alturaMedida","raioDoCanto","ref","width","useChartMetrics","fillHeight","alturaDoDesenho","chartHeight","isHidden","toggle","useSeriesToggle","emFoco","setEmFoco","useState","coresDeNivelZero","useMemo","resolveSeriesColors","visiveis","grupo","rotulosExternos","niveis","externo","larguraDoRotulo","widestLabel","CHART_LABEL_BAND","banda","CHART_LABEL_OFFSET","raio","ringDiameter","arcos","arvore","hierarchy","a","b","partition","VOLTA","profundidadeMaxima","maior","arco","total","soma","foco","aceso","focar","hoverPath","corDe","raizDoRamo","ancestral","base","descreverArco","jsxs","ChartFrame","indice","pathTooltip","jsx","styles","arcPath","angulos","xBorda","yBorda","arcAnchor","xCotovelo","yCotovelo","paraDireita","xFim","truncateToWidth"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),h=require("react"),P=require("react-dom"),t=require("./ChartTooltip.module.css.cjs"),b=require("../../../utils/formatters/formatarNumero.cjs"),f=16,j=8;function y(r){return r.reduce((n,i)=>n+i,0)}function D(r,n){return typeof r=="function"?r(n):r==="average"?n.length===0?0:y(n)/n.length:y(n)}function S({x:r,y:n},i,u){const p=r+f+i<=window.innerWidth-j,d=n+f+u<=window.innerHeight-j;return{x:p?r+f:Math.max(r-f-i,j),y:d?n+f:Math.max(n-f-u,j)}}function R({children:r,columns:n,computed:i,rows:u,showTotal:p=!1,subtitle:d,title:x,totalLabel:N="Total"}){const[v,c]=h.useState(null),g=v!==null&&u.length>0;h.useEffect(()=>{if(!g)return;const s=()=>c(null);return window.addEventListener("scroll",s,!0),window.addEventListener("resize",s),window.addEventListener("keydown",s),()=>{window.removeEventListener("scroll",s,!0),window.removeEventListener("resize",s),window.removeEventListener("keydown",s)}},[g]);const w=s=>c({x:s.clientX,y:s.clientY});return a.jsxs("div",{className:t.default.area,onPointerLeave:()=>c(null),onPointerMove:w,children:[r,g&&P.createPortal(a.jsx(k,{columns:n,computed:i,ponteiro:v,rows:u,showTotal:p,subtitle:d,title:x,totalLabel:N}),document.body)]})}function k({columns:r,computed:n,ponteiro:i,rows:u,showTotal:p,subtitle:d,title:x,totalLabel:N}){const v=h.useRef(null),[c,g]=h.useState({altura:0,largura:0});h.useLayoutEffect(()=>{const e=v.current;if(!e)return;const{height:o,width:m}=e.getBoundingClientRect();(o!==c.altura||m!==c.largura)&&g({altura:o,largura:m})});const w=u.reduce((e,o)=>Math.max(e,o.values.length),0),s=r??Array.from({length:w},()=>({})),l=n==="none"||s.length===0?void 0:n??{},E=(l==null?void 0:l.column)??s.length-1,$=y(u.map(e=>e.values[E]??0)),L=(l==null?void 0:l.compute)??((e,o)=>o===0?0:e/o),M=(l==null?void 0:l.format)??(e=>b.formatarPercentual(e,{casasDecimais:2})),{x:A,y:C}=S(i,c.largura,c.altura),q=`1fr ${"auto ".repeat(s.length+(l?1:0))}`.trim();return a.jsxs("div",{"aria-hidden":"true",className:t.default.tooltip,ref:v,style:{left:A,top:C},children:[x!==void 0&&a.jsx("p",{className:t.default.title,children:x}),d!==void 0&&a.jsx("p",{className:t.default.subtitle,children:d}),a.jsxs("div",{className:t.default.grid,style:{gridTemplateColumns:q},children:[u.map((e,o)=>a.jsxs(h.Fragment,{children:[a.jsxs("span",{className:`${t.default.label} ${e.emphasis?t.default.emphasis:""}`,children:[e.color!==void 0&&a.jsx("span",{className:t.default.swatch,style:{background:e.color}}),e.label]}),s.map((m,T)=>a.jsx("span",{className:`${t.default.value} ${e.emphasis?t.default.emphasis:""}`,children:(m.format??b.formatarNumero)(e.values[T]??0)},T)),l&&a.jsx("span",{className:`${t.default.computed} ${e.emphasis?t.default.emphasis:""}`,children:M(L(e.values[E]??0,$))})]},o)),p&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:t.default.rule}),a.jsx("span",{className:`${t.default.label} ${t.default.totalLabel}`,children:N}),s.map((e,o)=>a.jsx("span",{className:`${t.default.value} ${t.default.totalValue}`,children:e.total==="none"?"":(e.format??b.formatarNumero)(D(e.total??"sum",u.map(m=>m.values[o]??0)))},o)),l&&a.jsx("span",{className:`${t.default.computed} ${t.default.totalValue}`,children:M(L($,$))})]})]})]})}exports.ChartTooltip=R;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const a=require("react/jsx-runtime"),h=require("react"),P=require("react-dom"),t=require("./ChartTooltip.module.css.cjs"),b=require("../../../utils/formatters/formatarNumero.cjs"),f=16,j=8;function y(r){return r.reduce((n,i)=>n+i,0)}function D(r,n){return typeof r=="function"?r(n):r==="average"?n.length===0?0:y(n)/n.length:y(n)}function S({x:r,y:n},i,u){const p=r+f+i<=window.innerWidth-j,d=n+f+u<=window.innerHeight-j;return{x:p?r+f:Math.max(r-f-i,j),y:d?n+f:Math.max(n-f-u,j)}}function R({children:r,columns:n,computed:i,rows:u,showTotal:p=!1,subtitle:d,title:x,totalLabel:N="Total"}){const[v,c]=h.useState(null),g=v!==null&&u.length>0;h.useEffect(()=>{if(!g)return;const s=()=>c(null);return window.addEventListener("scroll",s,!0),window.addEventListener("resize",s),window.addEventListener("keydown",s),()=>{window.removeEventListener("scroll",s,!0),window.removeEventListener("resize",s),window.removeEventListener("keydown",s)}},[g]);const w=s=>c({x:s.clientX,y:s.clientY});return a.jsxs("div",{className:t.default.area,onPointerLeave:()=>c(null),onPointerMove:w,children:[r,g&&P.createPortal(a.jsx(k,{columns:n,computed:i,ponteiro:v,rows:u,showTotal:p,subtitle:d,title:x,totalLabel:N}),document.body)]})}function k({columns:r,computed:n,ponteiro:i,rows:u,showTotal:p,subtitle:d,title:x,totalLabel:N}){const v=h.useRef(null),[c,g]=h.useState({altura:0,largura:0});h.useLayoutEffect(()=>{const e=v.current;if(!e)return;const{height:l,width:m}=e.getBoundingClientRect();(l!==c.altura||m!==c.largura)&&g({altura:l,largura:m})});const w=u.reduce((e,l)=>Math.max(e,l.values.length),0),s=r??Array.from({length:w},()=>({})),o=n==="none"||s.length===0?void 0:n??{},E=(o==null?void 0:o.column)??s.length-1,$=y(u.map(e=>e.values[E]??0)),L=(o==null?void 0:o.compute)??((e,l)=>l===0?0:e/l),M=(o==null?void 0:o.format)??(e=>b.formatarPercentual(e,{casasDecimais:2})),{x:A,y:C}=S(i,c.largura,c.altura),q=`1fr ${"auto ".repeat(s.length+(o?1:0))}`.trim();return a.jsxs("div",{"aria-hidden":"true",className:t.default.tooltip,ref:v,style:{left:A,top:C},children:[x!==void 0&&a.jsx("p",{className:t.default.title,children:x}),d!==void 0&&a.jsx("p",{className:t.default.subtitle,children:d}),a.jsxs("div",{className:t.default.grid,style:{gridTemplateColumns:q},children:[u.map((e,l)=>a.jsxs(h.Fragment,{children:[a.jsxs("span",{className:`${t.default.label} ${e.emphasis?t.default.emphasis:""}`,children:[e.color!==void 0&&a.jsx("span",{className:t.default.swatch,style:{background:e.color}}),e.label]}),s.map((m,T)=>a.jsx("span",{className:`${t.default.value} ${e.emphasis?t.default.emphasis:""}`,children:(e.format??m.format??b.formatarNumero)(e.values[T]??0)},T)),o&&a.jsx("span",{className:`${t.default.computed} ${e.emphasis?t.default.emphasis:""}`,children:M(L(e.values[E]??0,$))})]},l)),p&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:t.default.rule}),a.jsx("span",{className:`${t.default.label} ${t.default.totalLabel}`,children:N}),s.map((e,l)=>a.jsx("span",{className:`${t.default.value} ${t.default.totalValue}`,children:e.total==="none"?"":(e.format??b.formatarNumero)(D(e.total??"sum",u.map(m=>m.values[l]??0)))},l)),o&&a.jsx("span",{className:`${t.default.computed} ${t.default.totalValue}`,children:M(L($,$))})]})]})]})}exports.ChartTooltip=R;
2
2
  //# sourceMappingURL=ChartTooltip.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTooltip.cjs","sources":["../../../../src/components/charts/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import {\n Fragment,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type PointerEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { formatarNumero, formatarPercentual } from '../../../utils/formatters';\nimport styles from './ChartTooltip.module.css';\n\nexport interface ChartTooltipRow {\n color?: string;\n /** Realca a linha, como a serie sob o ponteiro entre as demais. */\n emphasis?: boolean;\n label: string;\n values: readonly number[];\n}\n\n/** Como a linha de total resume uma coluna. A soma raramente serve a todas. */\nexport type ChartTooltipTotal = 'sum' | 'average' | 'none' | ((values: readonly number[]) => number);\n\nexport interface ChartTooltipColumn {\n format?: (value: number) => string;\n total?: ChartTooltipTotal;\n}\n\nexport interface ChartTooltipComputed {\n /** Coluna que serve de base. A ultima por padrao, que e a de valor. */\n column?: number;\n /** Valor da linha, a partir do valor dela e do total da coluna base. */\n compute?: (value: number, total: number) => number;\n format?: (value: number) => string;\n}\n\nexport interface ChartTooltipProps {\n children: ReactNode;\n columns?: readonly ChartTooltipColumn[];\n /** Coluna ao fim. Percentual sobre a base por padrao; `none` a dispensa. */\n computed?: ChartTooltipComputed | 'none';\n rows: readonly ChartTooltipRow[];\n showTotal?: boolean;\n subtitle?: string;\n title?: string;\n totalLabel?: string;\n}\n\ninterface Ponto {\n x: number;\n y: number;\n}\n\n/** Distancia entre o ponteiro e o balao, para o cursor nao cobrir o texto. */\nconst AFASTAMENTO = 16;\n\n/** Folga minima ate a borda da janela. */\nconst MARGEM = 8;\n\nfunction somar(valores: readonly number[]) {\n return valores.reduce((total, valor) => total + valor, 0);\n}\n\nfunction totalizar(operador: ChartTooltipTotal, valores: readonly number[]) {\n if (typeof operador === 'function') {\n return operador(valores);\n }\n\n if (operador === 'average') {\n return valores.length === 0 ? 0 : somar(valores) / valores.length;\n }\n\n return somar(valores);\n}\n\n/**\n * Canto do balao a partir do ponteiro. Ele abre para baixo e para a direita\n * enquanto couber, e vira para o lado oposto ao encostar na borda.\n */\nfunction encaixar({ x, y }: Ponto, largura: number, altura: number): Ponto {\n const cabeADireita = x + AFASTAMENTO + largura <= window.innerWidth - MARGEM;\n const cabeAbaixo = y + AFASTAMENTO + altura <= window.innerHeight - MARGEM;\n\n return {\n x: cabeADireita ? x + AFASTAMENTO : Math.max(x - AFASTAMENTO - largura, MARGEM),\n y: cabeAbaixo ? y + AFASTAMENTO : Math.max(y - AFASTAMENTO - altura, MARGEM),\n };\n}\n\n/**\n * Leitura das medidas sob o ponteiro, em portal sobre a pagina. Ele acompanha o\n * cursor enquanto este percorre a area e sai a qualquer outra interacao.\n *\n * Nao conhece grafico algum: recebe linhas e colunas, e quem as monta e quem o\n * usa. E decorativo para leitor de tela: o desenho e `role=\"img\"`, apresentado\n * como imagem unica, e a leitura medida a medida cabe a visao em tabela.\n */\nexport function ChartTooltip({\n children,\n columns,\n computed,\n rows,\n showTotal = false,\n subtitle,\n title,\n totalLabel = 'Total',\n}: ChartTooltipProps) {\n const [ponteiro, setPonteiro] = useState<Ponto | null>(null);\n const visivel = ponteiro !== null && rows.length > 0;\n\n // Sai por qualquer motivo que nao seja o ponteiro andando pela area: rolagem,\n // tecla ou a janela mudando de tamanho deixam o balao preso a um lugar que o\n // desenho ja nao ocupa.\n useEffect(() => {\n if (!visivel) {\n return;\n }\n\n const esconder = () => setPonteiro(null);\n\n window.addEventListener('scroll', esconder, true);\n window.addEventListener('resize', esconder);\n window.addEventListener('keydown', esconder);\n\n return () => {\n window.removeEventListener('scroll', esconder, true);\n window.removeEventListener('resize', esconder);\n window.removeEventListener('keydown', esconder);\n };\n }, [visivel]);\n\n const acompanhar = (evento: PointerEvent<HTMLDivElement>) =>\n setPonteiro({ x: evento.clientX, y: evento.clientY });\n\n return (\n <div\n className={styles.area}\n onPointerLeave={() => setPonteiro(null)}\n onPointerMove={acompanhar}\n >\n {children}\n\n {visivel &&\n createPortal(\n <Balao\n columns={columns}\n computed={computed}\n ponteiro={ponteiro}\n rows={rows}\n showTotal={showTotal}\n subtitle={subtitle}\n title={title}\n totalLabel={totalLabel}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype BalaoProps = Omit<ChartTooltipProps, 'children'> & { ponteiro: Ponto };\n\nfunction Balao({\n columns,\n computed,\n ponteiro,\n rows,\n showTotal,\n subtitle,\n title,\n totalLabel,\n}: BalaoProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [medida, setMedida] = useState({ altura: 0, largura: 0 });\n\n // A medida entra antes da pintura, entao o balao ja nasce no lugar certo.\n useLayoutEffect(() => {\n const no = ref.current;\n\n if (!no) {\n return;\n }\n\n const { height, width } = no.getBoundingClientRect();\n\n if (height !== medida.altura || width !== medida.largura) {\n setMedida({ altura: height, largura: width });\n }\n });\n\n const quantidadeDeColunas = rows.reduce((maior, linha) => Math.max(maior, linha.values.length), 0);\n const colunas: readonly ChartTooltipColumn[] =\n columns ?? Array.from({ length: quantidadeDeColunas }, () => ({}));\n\n // Sem coluna de onde derivar, nao ha o que calcular: linhas so com rotulo\n // renderizariam um percentual tirado do nada.\n const calculada = computed === 'none' || colunas.length === 0 ? undefined : computed ?? {};\n const colunaBase = calculada?.column ?? colunas.length - 1;\n const baseDoTotal = somar(rows.map((linha) => linha.values[colunaBase] ?? 0));\n const calcular = calculada?.compute ?? ((valor: number, total: number) => (total === 0 ? 0 : valor / total));\n const formatarCalculada = calculada?.format ?? ((valor: number) => formatarPercentual(valor, { casasDecimais: 2 }));\n\n const { x, y } = encaixar(ponteiro, medida.largura, medida.altura);\n const celulas = `1fr ${'auto '.repeat(colunas.length + (calculada ? 1 : 0))}`.trim();\n\n return (\n <div aria-hidden=\"true\" className={styles.tooltip} ref={ref} style={{ left: x, top: y }}>\n {title !== undefined && <p className={styles.title}>{title}</p>}\n {subtitle !== undefined && <p className={styles.subtitle}>{subtitle}</p>}\n\n <div className={styles.grid} style={{ gridTemplateColumns: celulas }}>\n {rows.map((linha, indiceDaLinha) => (\n <Fragment key={indiceDaLinha}>\n <span className={`${styles.label} ${linha.emphasis ? styles.emphasis : ''}`}>\n {linha.color !== undefined && (\n <span className={styles.swatch} style={{ background: linha.color }} />\n )}\n {linha.label}\n </span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${linha.emphasis ? styles.emphasis : ''}`} key={indice}>\n {(coluna.format ?? formatarNumero)(linha.values[indice] ?? 0)}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${linha.emphasis ? styles.emphasis : ''}`}>\n {formatarCalculada(calcular(linha.values[colunaBase] ?? 0, baseDoTotal))}\n </span>\n )}\n </Fragment>\n ))}\n\n {showTotal && (\n <>\n <span className={styles.rule} />\n <span className={`${styles.label} ${styles.totalLabel}`}>{totalLabel}</span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${styles.totalValue}`} key={indice}>\n {coluna.total === 'none'\n ? ''\n : (coluna.format ?? formatarNumero)(\n totalizar(coluna.total ?? 'sum', rows.map((linha) => linha.values[indice] ?? 0)),\n )}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${styles.totalValue}`}>\n {formatarCalculada(calcular(baseDoTotal, baseDoTotal))}\n </span>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n"],"names":["AFASTAMENTO","MARGEM","somar","valores","total","valor","totalizar","operador","encaixar","x","y","largura","altura","cabeADireita","cabeAbaixo","ChartTooltip","children","columns","computed","rows","showTotal","subtitle","title","totalLabel","ponteiro","setPonteiro","useState","visivel","useEffect","esconder","acompanhar","evento","jsxs","styles","createPortal","jsx","Balao","ref","useRef","medida","setMedida","useLayoutEffect","no","height","width","quantidadeDeColunas","maior","linha","colunas","calculada","colunaBase","baseDoTotal","calcular","formatarCalculada","formatarPercentual","celulas","indiceDaLinha","Fragment","coluna","indice","formatarNumero"],"mappings":"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"}
1
+ {"version":3,"file":"ChartTooltip.cjs","sources":["../../../../src/components/charts/ChartTooltip/ChartTooltip.tsx"],"sourcesContent":["import {\n Fragment,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type PointerEvent,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { formatarNumero, formatarPercentual } from '../../../utils/formatters';\nimport styles from './ChartTooltip.module.css';\n\nexport interface ChartTooltipRow {\n color?: string;\n /** Realca a linha, como a serie sob o ponteiro entre as demais. */\n emphasis?: boolean;\n /** Formato dos valores desta linha, quando difere do da coluna, como a serie do eixo da direita. */\n format?: (value: number) => string;\n label: string;\n values: readonly number[];\n}\n\n/** Como a linha de total resume uma coluna. A soma raramente serve a todas. */\nexport type ChartTooltipTotal = 'sum' | 'average' | 'none' | ((values: readonly number[]) => number);\n\nexport interface ChartTooltipColumn {\n format?: (value: number) => string;\n total?: ChartTooltipTotal;\n}\n\nexport interface ChartTooltipComputed {\n /** Coluna que serve de base. A ultima por padrao, que e a de valor. */\n column?: number;\n /** Valor da linha, a partir do valor dela e do total da coluna base. */\n compute?: (value: number, total: number) => number;\n format?: (value: number) => string;\n}\n\nexport interface ChartTooltipProps {\n children: ReactNode;\n columns?: readonly ChartTooltipColumn[];\n /** Coluna ao fim. Percentual sobre a base por padrao; `none` a dispensa. */\n computed?: ChartTooltipComputed | 'none';\n rows: readonly ChartTooltipRow[];\n showTotal?: boolean;\n subtitle?: string;\n title?: string;\n totalLabel?: string;\n}\n\ninterface Ponto {\n x: number;\n y: number;\n}\n\n/** Distancia entre o ponteiro e o balao, para o cursor nao cobrir o texto. */\nconst AFASTAMENTO = 16;\n\n/** Folga minima ate a borda da janela. */\nconst MARGEM = 8;\n\nfunction somar(valores: readonly number[]) {\n return valores.reduce((total, valor) => total + valor, 0);\n}\n\nfunction totalizar(operador: ChartTooltipTotal, valores: readonly number[]) {\n if (typeof operador === 'function') {\n return operador(valores);\n }\n\n if (operador === 'average') {\n return valores.length === 0 ? 0 : somar(valores) / valores.length;\n }\n\n return somar(valores);\n}\n\n/**\n * Canto do balao a partir do ponteiro. Ele abre para baixo e para a direita\n * enquanto couber, e vira para o lado oposto ao encostar na borda.\n */\nfunction encaixar({ x, y }: Ponto, largura: number, altura: number): Ponto {\n const cabeADireita = x + AFASTAMENTO + largura <= window.innerWidth - MARGEM;\n const cabeAbaixo = y + AFASTAMENTO + altura <= window.innerHeight - MARGEM;\n\n return {\n x: cabeADireita ? x + AFASTAMENTO : Math.max(x - AFASTAMENTO - largura, MARGEM),\n y: cabeAbaixo ? y + AFASTAMENTO : Math.max(y - AFASTAMENTO - altura, MARGEM),\n };\n}\n\n/**\n * Leitura das medidas sob o ponteiro, em portal sobre a pagina. Ele acompanha o\n * cursor enquanto este percorre a area e sai a qualquer outra interacao.\n *\n * Nao conhece grafico algum: recebe linhas e colunas, e quem as monta e quem o\n * usa. E decorativo para leitor de tela: o desenho e `role=\"img\"`, apresentado\n * como imagem unica, e a leitura medida a medida cabe a visao em tabela.\n */\nexport function ChartTooltip({\n children,\n columns,\n computed,\n rows,\n showTotal = false,\n subtitle,\n title,\n totalLabel = 'Total',\n}: ChartTooltipProps) {\n const [ponteiro, setPonteiro] = useState<Ponto | null>(null);\n const visivel = ponteiro !== null && rows.length > 0;\n\n // Sai por qualquer motivo que nao seja o ponteiro andando pela area: rolagem,\n // tecla ou a janela mudando de tamanho deixam o balao preso a um lugar que o\n // desenho ja nao ocupa.\n useEffect(() => {\n if (!visivel) {\n return;\n }\n\n const esconder = () => setPonteiro(null);\n\n window.addEventListener('scroll', esconder, true);\n window.addEventListener('resize', esconder);\n window.addEventListener('keydown', esconder);\n\n return () => {\n window.removeEventListener('scroll', esconder, true);\n window.removeEventListener('resize', esconder);\n window.removeEventListener('keydown', esconder);\n };\n }, [visivel]);\n\n const acompanhar = (evento: PointerEvent<HTMLDivElement>) =>\n setPonteiro({ x: evento.clientX, y: evento.clientY });\n\n return (\n <div\n className={styles.area}\n onPointerLeave={() => setPonteiro(null)}\n onPointerMove={acompanhar}\n >\n {children}\n\n {visivel &&\n createPortal(\n <Balao\n columns={columns}\n computed={computed}\n ponteiro={ponteiro}\n rows={rows}\n showTotal={showTotal}\n subtitle={subtitle}\n title={title}\n totalLabel={totalLabel}\n />,\n document.body,\n )}\n </div>\n );\n}\n\ntype BalaoProps = Omit<ChartTooltipProps, 'children'> & { ponteiro: Ponto };\n\nfunction Balao({\n columns,\n computed,\n ponteiro,\n rows,\n showTotal,\n subtitle,\n title,\n totalLabel,\n}: BalaoProps) {\n const ref = useRef<HTMLDivElement>(null);\n const [medida, setMedida] = useState({ altura: 0, largura: 0 });\n\n // A medida entra antes da pintura, entao o balao ja nasce no lugar certo.\n useLayoutEffect(() => {\n const no = ref.current;\n\n if (!no) {\n return;\n }\n\n const { height, width } = no.getBoundingClientRect();\n\n if (height !== medida.altura || width !== medida.largura) {\n setMedida({ altura: height, largura: width });\n }\n });\n\n const quantidadeDeColunas = rows.reduce((maior, linha) => Math.max(maior, linha.values.length), 0);\n const colunas: readonly ChartTooltipColumn[] =\n columns ?? Array.from({ length: quantidadeDeColunas }, () => ({}));\n\n // Sem coluna de onde derivar, nao ha o que calcular: linhas so com rotulo\n // renderizariam um percentual tirado do nada.\n const calculada = computed === 'none' || colunas.length === 0 ? undefined : computed ?? {};\n const colunaBase = calculada?.column ?? colunas.length - 1;\n const baseDoTotal = somar(rows.map((linha) => linha.values[colunaBase] ?? 0));\n const calcular = calculada?.compute ?? ((valor: number, total: number) => (total === 0 ? 0 : valor / total));\n const formatarCalculada = calculada?.format ?? ((valor: number) => formatarPercentual(valor, { casasDecimais: 2 }));\n\n const { x, y } = encaixar(ponteiro, medida.largura, medida.altura);\n const celulas = `1fr ${'auto '.repeat(colunas.length + (calculada ? 1 : 0))}`.trim();\n\n return (\n <div aria-hidden=\"true\" className={styles.tooltip} ref={ref} style={{ left: x, top: y }}>\n {title !== undefined && <p className={styles.title}>{title}</p>}\n {subtitle !== undefined && <p className={styles.subtitle}>{subtitle}</p>}\n\n <div className={styles.grid} style={{ gridTemplateColumns: celulas }}>\n {rows.map((linha, indiceDaLinha) => (\n <Fragment key={indiceDaLinha}>\n <span className={`${styles.label} ${linha.emphasis ? styles.emphasis : ''}`}>\n {linha.color !== undefined && (\n <span className={styles.swatch} style={{ background: linha.color }} />\n )}\n {linha.label}\n </span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${linha.emphasis ? styles.emphasis : ''}`} key={indice}>\n {(linha.format ?? coluna.format ?? formatarNumero)(linha.values[indice] ?? 0)}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${linha.emphasis ? styles.emphasis : ''}`}>\n {formatarCalculada(calcular(linha.values[colunaBase] ?? 0, baseDoTotal))}\n </span>\n )}\n </Fragment>\n ))}\n\n {showTotal && (\n <>\n <span className={styles.rule} />\n <span className={`${styles.label} ${styles.totalLabel}`}>{totalLabel}</span>\n\n {colunas.map((coluna, indice) => (\n <span className={`${styles.value} ${styles.totalValue}`} key={indice}>\n {coluna.total === 'none'\n ? ''\n : (coluna.format ?? formatarNumero)(\n totalizar(coluna.total ?? 'sum', rows.map((linha) => linha.values[indice] ?? 0)),\n )}\n </span>\n ))}\n\n {calculada && (\n <span className={`${styles.computed} ${styles.totalValue}`}>\n {formatarCalculada(calcular(baseDoTotal, baseDoTotal))}\n </span>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n"],"names":["AFASTAMENTO","MARGEM","somar","valores","total","valor","totalizar","operador","encaixar","x","y","largura","altura","cabeADireita","cabeAbaixo","ChartTooltip","children","columns","computed","rows","showTotal","subtitle","title","totalLabel","ponteiro","setPonteiro","useState","visivel","useEffect","esconder","acompanhar","evento","jsxs","styles","createPortal","jsx","Balao","ref","useRef","medida","setMedida","useLayoutEffect","no","height","width","quantidadeDeColunas","maior","linha","colunas","calculada","colunaBase","baseDoTotal","calcular","formatarCalculada","formatarPercentual","celulas","indiceDaLinha","Fragment","coluna","indice","formatarNumero"],"mappings":"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"}
@@ -93,7 +93,7 @@ function H({
93
93
  e.color !== void 0 && /* @__PURE__ */ i("span", { className: t.swatch, style: { background: e.color } }),
94
94
  e.label
95
95
  ] }),
96
- a.map((d, A) => /* @__PURE__ */ i("span", { className: `${t.value} ${e.emphasis ? t.emphasis : ""}`, children: (d.format ?? T)(e.values[A] ?? 0) }, A)),
96
+ a.map((d, A) => /* @__PURE__ */ i("span", { className: `${t.value} ${e.emphasis ? t.emphasis : ""}`, children: (e.format ?? d.format ?? T)(e.values[A] ?? 0) }, A)),
97
97
  s && /* @__PURE__ */ i("span", { className: `${t.computed} ${e.emphasis ? t.emphasis : ""}`, children: M(L(e.values[x] ?? 0, b)) })
98
98
  ] }, o)),
99
99
  h && /* @__PURE__ */ f(k, { children: [