@plenustech/design-system 0.2.2 → 0.2.4

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 (508) 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/ChartGauge/ChartGauge.cjs +2 -0
  43. package/dist/components/charts/ChartGauge/ChartGauge.cjs.map +1 -0
  44. package/dist/components/charts/ChartGauge/ChartGauge.js +307 -0
  45. package/dist/components/charts/ChartGauge/ChartGauge.js.map +1 -0
  46. package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs +2 -0
  47. package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs.map +1 -0
  48. package/dist/components/charts/ChartGauge/ChartGauge.module.css.js +76 -0
  49. package/dist/components/charts/ChartGauge/ChartGauge.module.css.js.map +1 -0
  50. package/dist/components/charts/ChartGauge/gaugeLayout.cjs +2 -0
  51. package/dist/components/charts/ChartGauge/gaugeLayout.cjs.map +1 -0
  52. package/dist/components/charts/ChartGauge/gaugeLayout.js +107 -0
  53. package/dist/components/charts/ChartGauge/gaugeLayout.js.map +1 -0
  54. package/dist/components/charts/ChartGauge/gaugeReading.cjs +2 -0
  55. package/dist/components/charts/ChartGauge/gaugeReading.cjs.map +1 -0
  56. package/dist/components/charts/ChartGauge/gaugeReading.js +112 -0
  57. package/dist/components/charts/ChartGauge/gaugeReading.js.map +1 -0
  58. package/dist/components/charts/ChartGauge/gaugeScale.cjs +2 -0
  59. package/dist/components/charts/ChartGauge/gaugeScale.cjs.map +1 -0
  60. package/dist/components/charts/ChartGauge/gaugeScale.js +57 -0
  61. package/dist/components/charts/ChartGauge/gaugeScale.js.map +1 -0
  62. package/dist/components/charts/ChartLine/ChartLine.cjs +1 -1
  63. package/dist/components/charts/ChartLine/ChartLine.cjs.map +1 -1
  64. package/dist/components/charts/ChartLine/ChartLine.js +196 -143
  65. package/dist/components/charts/ChartLine/ChartLine.js.map +1 -1
  66. package/dist/components/charts/ChartLine/ChartLine.module.css.cjs +1 -1
  67. package/dist/components/charts/ChartLine/ChartLine.module.css.js +16 -14
  68. package/dist/components/charts/ChartLine/ChartLine.module.css.js.map +1 -1
  69. package/dist/components/charts/ChartMap/ChartMap.cjs +2 -0
  70. package/dist/components/charts/ChartMap/ChartMap.cjs.map +1 -0
  71. package/dist/components/charts/ChartMap/ChartMap.js +523 -0
  72. package/dist/components/charts/ChartMap/ChartMap.js.map +1 -0
  73. package/dist/components/charts/ChartMap/ChartMap.module.css.cjs +2 -0
  74. package/dist/components/charts/ChartMap/ChartMap.module.css.cjs.map +1 -0
  75. package/dist/components/charts/ChartMap/ChartMap.module.css.js +124 -0
  76. package/dist/components/charts/ChartMap/ChartMap.module.css.js.map +1 -0
  77. package/dist/components/charts/ChartMap/ChartMapLegend.cjs +2 -0
  78. package/dist/components/charts/ChartMap/ChartMapLegend.cjs.map +1 -0
  79. package/dist/components/charts/ChartMap/ChartMapLegend.js +102 -0
  80. package/dist/components/charts/ChartMap/ChartMapLegend.js.map +1 -0
  81. package/dist/components/charts/ChartMap/ChartMapTable.cjs +2 -0
  82. package/dist/components/charts/ChartMap/ChartMapTable.cjs.map +1 -0
  83. package/dist/components/charts/ChartMap/ChartMapTable.js +118 -0
  84. package/dist/components/charts/ChartMap/ChartMapTable.js.map +1 -0
  85. package/dist/components/charts/ChartMap/mapGeometry.cjs +2 -0
  86. package/dist/components/charts/ChartMap/mapGeometry.cjs.map +1 -0
  87. package/dist/components/charts/ChartMap/mapGeometry.js +113 -0
  88. package/dist/components/charts/ChartMap/mapGeometry.js.map +1 -0
  89. package/dist/components/charts/ChartMap/mapLabels.cjs +2 -0
  90. package/dist/components/charts/ChartMap/mapLabels.cjs.map +1 -0
  91. package/dist/components/charts/ChartMap/mapLabels.js +80 -0
  92. package/dist/components/charts/ChartMap/mapLabels.js.map +1 -0
  93. package/dist/components/charts/ChartMap/mapScales.cjs +2 -0
  94. package/dist/components/charts/ChartMap/mapScales.cjs.map +1 -0
  95. package/dist/components/charts/ChartMap/mapScales.js +131 -0
  96. package/dist/components/charts/ChartMap/mapScales.js.map +1 -0
  97. package/dist/components/charts/ChartMap/polylabel.cjs +2 -0
  98. package/dist/components/charts/ChartMap/polylabel.cjs.map +1 -0
  99. package/dist/components/charts/ChartMap/polylabel.js +50 -0
  100. package/dist/components/charts/ChartMap/polylabel.js.map +1 -0
  101. package/dist/components/charts/ChartPie/ChartPie.cjs +1 -1
  102. package/dist/components/charts/ChartPie/ChartPie.cjs.map +1 -1
  103. package/dist/components/charts/ChartPie/ChartPie.js +71 -60
  104. package/dist/components/charts/ChartPie/ChartPie.js.map +1 -1
  105. package/dist/components/charts/ChartRadial/ChartRadial.cjs +1 -1
  106. package/dist/components/charts/ChartRadial/ChartRadial.cjs.map +1 -1
  107. package/dist/components/charts/ChartRadial/ChartRadial.js +101 -84
  108. package/dist/components/charts/ChartRadial/ChartRadial.js.map +1 -1
  109. package/dist/components/charts/ChartSankey/ChartSankey.cjs +1 -1
  110. package/dist/components/charts/ChartSankey/ChartSankey.cjs.map +1 -1
  111. package/dist/components/charts/ChartSankey/ChartSankey.js +148 -125
  112. package/dist/components/charts/ChartSankey/ChartSankey.js.map +1 -1
  113. package/dist/components/charts/ChartScatter/ChartScatter.cjs +1 -1
  114. package/dist/components/charts/ChartScatter/ChartScatter.cjs.map +1 -1
  115. package/dist/components/charts/ChartScatter/ChartScatter.js +138 -106
  116. package/dist/components/charts/ChartScatter/ChartScatter.js.map +1 -1
  117. package/dist/components/charts/ChartScatter/ChartScatter.module.css.cjs +1 -1
  118. package/dist/components/charts/ChartScatter/ChartScatter.module.css.js +3 -3
  119. package/dist/components/charts/ChartSunburst/ChartSunburst.cjs +1 -1
  120. package/dist/components/charts/ChartSunburst/ChartSunburst.cjs.map +1 -1
  121. package/dist/components/charts/ChartSunburst/ChartSunburst.js +115 -100
  122. package/dist/components/charts/ChartSunburst/ChartSunburst.js.map +1 -1
  123. package/dist/components/charts/ChartTimeline/ChartTimeline.cjs +2 -0
  124. package/dist/components/charts/ChartTimeline/ChartTimeline.cjs.map +1 -0
  125. package/dist/components/charts/ChartTimeline/ChartTimeline.js +703 -0
  126. package/dist/components/charts/ChartTimeline/ChartTimeline.js.map +1 -0
  127. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs +2 -0
  128. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs.map +1 -0
  129. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js +124 -0
  130. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js.map +1 -0
  131. package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs +2 -0
  132. package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs.map +1 -0
  133. package/dist/components/charts/ChartTimeline/ChartTimelineTable.js +42 -0
  134. package/dist/components/charts/ChartTimeline/ChartTimelineTable.js.map +1 -0
  135. package/dist/components/charts/ChartTimeline/timelineLayout.cjs +2 -0
  136. package/dist/components/charts/ChartTimeline/timelineLayout.cjs.map +1 -0
  137. package/dist/components/charts/ChartTimeline/timelineLayout.js +109 -0
  138. package/dist/components/charts/ChartTimeline/timelineLayout.js.map +1 -0
  139. package/dist/components/charts/ChartTimeline/timelineTime.cjs +2 -0
  140. package/dist/components/charts/ChartTimeline/timelineTime.cjs.map +1 -0
  141. package/dist/components/charts/ChartTimeline/timelineTime.js +91 -0
  142. package/dist/components/charts/ChartTimeline/timelineTime.js.map +1 -0
  143. package/dist/components/charts/ChartTimeline/timelineTooltip.cjs +2 -0
  144. package/dist/components/charts/ChartTimeline/timelineTooltip.cjs.map +1 -0
  145. package/dist/components/charts/ChartTimeline/timelineTooltip.js +77 -0
  146. package/dist/components/charts/ChartTimeline/timelineTooltip.js.map +1 -0
  147. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +1 -1
  148. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -1
  149. package/dist/components/charts/ChartTooltip/ChartTooltip.js +1 -1
  150. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -1
  151. package/dist/components/charts/ChartTreemap/ChartTreemap.cjs +1 -1
  152. package/dist/components/charts/ChartTreemap/ChartTreemap.cjs.map +1 -1
  153. package/dist/components/charts/ChartTreemap/ChartTreemap.js +100 -89
  154. package/dist/components/charts/ChartTreemap/ChartTreemap.js.map +1 -1
  155. package/dist/components/charts/ChartWaterfall/ChartWaterfall.cjs +1 -1
  156. package/dist/components/charts/ChartWaterfall/ChartWaterfall.cjs.map +1 -1
  157. package/dist/components/charts/ChartWaterfall/ChartWaterfall.js +125 -105
  158. package/dist/components/charts/ChartWaterfall/ChartWaterfall.js.map +1 -1
  159. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.cjs +1 -1
  160. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.js +8 -6
  161. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.js.map +1 -1
  162. package/dist/components/charts/core/CartesianFrame.cjs +1 -1
  163. package/dist/components/charts/core/CartesianFrame.cjs.map +1 -1
  164. package/dist/components/charts/core/CartesianFrame.js +61 -96
  165. package/dist/components/charts/core/CartesianFrame.js.map +1 -1
  166. package/dist/components/charts/core/Chart.module.css.cjs +1 -1
  167. package/dist/components/charts/core/Chart.module.css.js +52 -54
  168. package/dist/components/charts/core/Chart.module.css.js.map +1 -1
  169. package/dist/components/charts/core/ChartFrame.cjs +1 -1
  170. package/dist/components/charts/core/ChartFrame.cjs.map +1 -1
  171. package/dist/components/charts/core/ChartFrame.js +53 -47
  172. package/dist/components/charts/core/ChartFrame.js.map +1 -1
  173. package/dist/components/charts/core/ChartLegend.cjs +1 -1
  174. package/dist/components/charts/core/ChartLegend.cjs.map +1 -1
  175. package/dist/components/charts/core/ChartLegend.js +37 -25
  176. package/dist/components/charts/core/ChartLegend.js.map +1 -1
  177. package/dist/components/charts/core/PointBands.cjs +2 -0
  178. package/dist/components/charts/core/PointBands.cjs.map +1 -0
  179. package/dist/components/charts/core/PointBands.js +41 -0
  180. package/dist/components/charts/core/PointBands.js.map +1 -0
  181. package/dist/components/charts/core/cartesianLayout.cjs +1 -1
  182. package/dist/components/charts/core/cartesianLayout.cjs.map +1 -1
  183. package/dist/components/charts/core/cartesianLayout.js +49 -41
  184. package/dist/components/charts/core/cartesianLayout.js.map +1 -1
  185. package/dist/components/charts/core/hoverPath.cjs +2 -0
  186. package/dist/components/charts/core/hoverPath.cjs.map +1 -0
  187. package/dist/components/charts/core/hoverPath.js +7 -0
  188. package/dist/components/charts/core/hoverPath.js.map +1 -0
  189. package/dist/components/charts/core/pointLabels.cjs +2 -0
  190. package/dist/components/charts/core/pointLabels.cjs.map +1 -0
  191. package/dist/components/charts/core/pointLabels.js +12 -0
  192. package/dist/components/charts/core/pointLabels.js.map +1 -0
  193. package/dist/components/charts/core/tooltips.cjs +2 -0
  194. package/dist/components/charts/core/tooltips.cjs.map +1 -0
  195. package/dist/components/charts/core/tooltips.js +48 -0
  196. package/dist/components/charts/core/tooltips.js.map +1 -0
  197. package/dist/components/charts/core/useCartesianLayout.cjs +2 -0
  198. package/dist/components/charts/core/useCartesianLayout.cjs.map +1 -0
  199. package/dist/components/charts/core/useCartesianLayout.js +38 -0
  200. package/dist/components/charts/core/useCartesianLayout.js.map +1 -0
  201. package/dist/components/charts/core/useChartMetrics.cjs +1 -1
  202. package/dist/components/charts/core/useChartMetrics.cjs.map +1 -1
  203. package/dist/components/charts/core/useChartMetrics.js +20 -25
  204. package/dist/components/charts/core/useChartMetrics.js.map +1 -1
  205. package/dist/components/charts/core/useSeriesToggle.cjs +1 -1
  206. package/dist/components/charts/core/useSeriesToggle.cjs.map +1 -1
  207. package/dist/components/charts/core/useSeriesToggle.js +19 -12
  208. package/dist/components/charts/core/useSeriesToggle.js.map +1 -1
  209. package/dist/components/data-display/Accordion/Accordion.cjs +1 -1
  210. package/dist/components/data-display/Accordion/Accordion.cjs.map +1 -1
  211. package/dist/components/data-display/Accordion/Accordion.js +56 -46
  212. package/dist/components/data-display/Accordion/Accordion.js.map +1 -1
  213. package/dist/components/data-display/Accordion/Accordion.module.css.cjs +1 -1
  214. package/dist/components/data-display/Accordion/Accordion.module.css.js +16 -16
  215. package/dist/components/data-display/List/List.cjs.map +1 -1
  216. package/dist/components/data-display/List/List.js.map +1 -1
  217. package/dist/components/data-display/List/List.module.css.cjs +1 -1
  218. package/dist/components/data-display/List/List.module.css.js +34 -24
  219. package/dist/components/data-display/List/List.module.css.js.map +1 -1
  220. package/dist/components/data-display/List/ListingOptions.cjs +1 -1
  221. package/dist/components/data-display/List/ListingOptions.cjs.map +1 -1
  222. package/dist/components/data-display/List/ListingOptions.js +98 -74
  223. package/dist/components/data-display/List/ListingOptions.js.map +1 -1
  224. package/dist/components/data-display/List/useListing.cjs.map +1 -1
  225. package/dist/components/data-display/List/useListing.js.map +1 -1
  226. package/dist/components/data-display/SortableList/SortableList.cjs +2 -0
  227. package/dist/components/data-display/SortableList/SortableList.cjs.map +1 -0
  228. package/dist/components/data-display/SortableList/SortableList.js +168 -0
  229. package/dist/components/data-display/SortableList/SortableList.js.map +1 -0
  230. package/dist/components/data-display/SortableList/SortableList.module.css.cjs +2 -0
  231. package/dist/components/data-display/SortableList/SortableList.module.css.cjs.map +1 -0
  232. package/dist/components/data-display/SortableList/SortableList.module.css.js +34 -0
  233. package/dist/components/data-display/SortableList/SortableList.module.css.js.map +1 -0
  234. package/dist/components/data-display/Table/Table.cjs +1 -1
  235. package/dist/components/data-display/Table/Table.cjs.map +1 -1
  236. package/dist/components/data-display/Table/Table.js +86 -85
  237. package/dist/components/data-display/Table/Table.js.map +1 -1
  238. package/dist/components/data-display/Table/Table.module.css.cjs +1 -1
  239. package/dist/components/data-display/Table/Table.module.css.js +50 -51
  240. package/dist/components/data-display/Table/Table.module.css.js.map +1 -1
  241. package/dist/components/data-display/Tag/Tag.cjs +2 -0
  242. package/dist/components/data-display/Tag/Tag.cjs.map +1 -0
  243. package/dist/components/data-display/Tag/Tag.js +50 -0
  244. package/dist/components/data-display/Tag/Tag.js.map +1 -0
  245. package/dist/components/data-display/Tag/Tag.module.css.cjs +2 -0
  246. package/dist/components/data-display/Tag/Tag.module.css.cjs.map +1 -0
  247. package/dist/components/data-display/Tag/Tag.module.css.js +22 -0
  248. package/dist/components/data-display/Tag/Tag.module.css.js.map +1 -0
  249. package/dist/components/data-display/Timeline/Timeline.cjs +2 -0
  250. package/dist/components/data-display/Timeline/Timeline.cjs.map +1 -0
  251. package/dist/components/data-display/Timeline/Timeline.js +31 -0
  252. package/dist/components/data-display/Timeline/Timeline.js.map +1 -0
  253. package/dist/components/data-display/Timeline/Timeline.module.css.cjs +2 -0
  254. package/dist/components/data-display/Timeline/Timeline.module.css.cjs.map +1 -0
  255. package/dist/components/data-display/Timeline/Timeline.module.css.js +30 -0
  256. package/dist/components/data-display/Timeline/Timeline.module.css.js.map +1 -0
  257. package/dist/components/feedback/Skeleton/Skeleton.cjs +2 -0
  258. package/dist/components/feedback/Skeleton/Skeleton.cjs.map +1 -0
  259. package/dist/components/feedback/Skeleton/Skeleton.js +17 -0
  260. package/dist/components/feedback/Skeleton/Skeleton.js.map +1 -0
  261. package/dist/components/feedback/Skeleton/Skeleton.module.css.cjs +2 -0
  262. package/dist/components/feedback/Skeleton/Skeleton.module.css.cjs.map +1 -0
  263. package/dist/components/feedback/Skeleton/Skeleton.module.css.js +15 -0
  264. package/dist/components/feedback/Skeleton/Skeleton.module.css.js.map +1 -0
  265. package/dist/components/feedback/Toast/Toast.module.css.cjs +2 -0
  266. package/dist/components/feedback/Toast/Toast.module.css.cjs.map +1 -0
  267. package/dist/components/feedback/Toast/Toast.module.css.js +31 -0
  268. package/dist/components/feedback/Toast/Toast.module.css.js.map +1 -0
  269. package/dist/components/feedback/Toast/ToastRegion.cjs +2 -0
  270. package/dist/components/feedback/Toast/ToastRegion.cjs.map +1 -0
  271. package/dist/components/feedback/Toast/ToastRegion.js +62 -0
  272. package/dist/components/feedback/Toast/ToastRegion.js.map +1 -0
  273. package/dist/components/feedback/Toast/toastStore.cjs +2 -0
  274. package/dist/components/feedback/Toast/toastStore.cjs.map +1 -0
  275. package/dist/components/feedback/Toast/toastStore.js +33 -0
  276. package/dist/components/feedback/Toast/toastStore.js.map +1 -0
  277. package/dist/components/forms/Checkbox/Checkbox.cjs +1 -1
  278. package/dist/components/forms/Checkbox/Checkbox.cjs.map +1 -1
  279. package/dist/components/forms/Checkbox/Checkbox.js +43 -31
  280. package/dist/components/forms/Checkbox/Checkbox.js.map +1 -1
  281. package/dist/components/forms/Checkbox/Checkbox.module.css.cjs +1 -1
  282. package/dist/components/forms/Checkbox/Checkbox.module.css.js +1 -1
  283. package/dist/components/forms/CheckboxGroup/CheckboxGroup.cjs +2 -0
  284. package/dist/components/forms/CheckboxGroup/CheckboxGroup.cjs.map +1 -0
  285. package/dist/components/forms/CheckboxGroup/CheckboxGroup.js +54 -0
  286. package/dist/components/forms/CheckboxGroup/CheckboxGroup.js.map +1 -0
  287. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.cjs +2 -0
  288. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.cjs.map +1 -0
  289. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.js +22 -0
  290. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.js.map +1 -0
  291. package/dist/components/forms/ColorPicker/ColorPicker.cjs +2 -0
  292. package/dist/components/forms/ColorPicker/ColorPicker.cjs.map +1 -0
  293. package/dist/components/forms/ColorPicker/ColorPicker.js +57 -0
  294. package/dist/components/forms/ColorPicker/ColorPicker.js.map +1 -0
  295. package/dist/components/forms/ColorPicker/ColorPicker.module.css.cjs +2 -0
  296. package/dist/components/forms/ColorPicker/ColorPicker.module.css.cjs.map +1 -0
  297. package/dist/components/forms/ColorPicker/ColorPicker.module.css.js +22 -0
  298. package/dist/components/forms/ColorPicker/ColorPicker.module.css.js.map +1 -0
  299. package/dist/components/forms/ComboBox/ComboBox.cjs.map +1 -1
  300. package/dist/components/forms/ComboBox/ComboBox.js.map +1 -1
  301. package/dist/components/forms/ComboBox/ComboBox.module.css.cjs +1 -1
  302. package/dist/components/forms/ComboBox/ComboBox.module.css.js +20 -20
  303. package/dist/components/forms/Field/Field.cjs +1 -1
  304. package/dist/components/forms/Field/Field.cjs.map +1 -1
  305. package/dist/components/forms/Field/Field.js +21 -20
  306. package/dist/components/forms/Field/Field.js.map +1 -1
  307. package/dist/components/forms/Field/Field.module.css.cjs +1 -1
  308. package/dist/components/forms/Field/Field.module.css.js +18 -12
  309. package/dist/components/forms/Field/Field.module.css.js.map +1 -1
  310. package/dist/components/forms/FileUpload/FileUpload.cjs +2 -0
  311. package/dist/components/forms/FileUpload/FileUpload.cjs.map +1 -0
  312. package/dist/components/forms/FileUpload/FileUpload.js +142 -0
  313. package/dist/components/forms/FileUpload/FileUpload.js.map +1 -0
  314. package/dist/components/forms/FileUpload/FileUpload.module.css.cjs +2 -0
  315. package/dist/components/forms/FileUpload/FileUpload.module.css.cjs.map +1 -0
  316. package/dist/components/forms/FileUpload/FileUpload.module.css.js +46 -0
  317. package/dist/components/forms/FileUpload/FileUpload.module.css.js.map +1 -0
  318. package/dist/components/forms/InputPassword/InputPassword.module.css.cjs +1 -1
  319. package/dist/components/forms/InputPassword/InputPassword.module.css.js +12 -12
  320. package/dist/components/forms/InputText/InputText.cjs +1 -1
  321. package/dist/components/forms/InputText/InputText.cjs.map +1 -1
  322. package/dist/components/forms/InputText/InputText.js +55 -47
  323. package/dist/components/forms/InputText/InputText.js.map +1 -1
  324. package/dist/components/forms/InputText/InputText.module.css.cjs +1 -1
  325. package/dist/components/forms/InputText/InputText.module.css.js +10 -10
  326. package/dist/components/forms/RadioGroup/RadioGroup.module.css.cjs +1 -1
  327. package/dist/components/forms/RadioGroup/RadioGroup.module.css.js +4 -4
  328. package/dist/components/forms/SegmentedControl/SegmentedControl.cjs +2 -0
  329. package/dist/components/forms/SegmentedControl/SegmentedControl.cjs.map +1 -0
  330. package/dist/components/forms/SegmentedControl/SegmentedControl.js +52 -0
  331. package/dist/components/forms/SegmentedControl/SegmentedControl.js.map +1 -0
  332. package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.cjs +2 -0
  333. package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.cjs.map +1 -0
  334. package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.js +22 -0
  335. package/dist/components/forms/SegmentedControl/SegmentedControl.module.css.js.map +1 -0
  336. package/dist/components/forms/Select/Select.module.css.cjs +1 -1
  337. package/dist/components/forms/Select/Select.module.css.js +13 -13
  338. package/dist/components/forms/Switch/Switch.module.css.cjs +1 -1
  339. package/dist/components/forms/Switch/Switch.module.css.js +2 -2
  340. package/dist/components/icons/icons.cjs +1 -1
  341. package/dist/components/icons/icons.cjs.map +1 -1
  342. package/dist/components/icons/icons.js +198 -40
  343. package/dist/components/icons/icons.js.map +1 -1
  344. package/dist/components/navigation/SkipLink/SkipLink.cjs +2 -0
  345. package/dist/components/navigation/SkipLink/SkipLink.cjs.map +1 -0
  346. package/dist/components/navigation/SkipLink/SkipLink.js +9 -0
  347. package/dist/components/navigation/SkipLink/SkipLink.js.map +1 -0
  348. package/dist/components/navigation/SkipLink/SkipLink.module.css.cjs +2 -0
  349. package/dist/components/navigation/SkipLink/SkipLink.module.css.cjs.map +1 -0
  350. package/dist/components/navigation/SkipLink/SkipLink.module.css.js +8 -0
  351. package/dist/components/navigation/SkipLink/SkipLink.module.css.js.map +1 -0
  352. package/dist/components/navigation/Steps/Steps.cjs +2 -0
  353. package/dist/components/navigation/Steps/Steps.cjs.map +1 -0
  354. package/dist/components/navigation/Steps/Steps.js +30 -0
  355. package/dist/components/navigation/Steps/Steps.js.map +1 -0
  356. package/dist/components/navigation/Steps/Steps.module.css.cjs +2 -0
  357. package/dist/components/navigation/Steps/Steps.module.css.cjs.map +1 -0
  358. package/dist/components/navigation/Steps/Steps.module.css.js +26 -0
  359. package/dist/components/navigation/Steps/Steps.module.css.js.map +1 -0
  360. package/dist/components/navigation/Tabs/Tabs.cjs +1 -1
  361. package/dist/components/navigation/Tabs/Tabs.cjs.map +1 -1
  362. package/dist/components/navigation/Tabs/Tabs.js +88 -79
  363. package/dist/components/navigation/Tabs/Tabs.js.map +1 -1
  364. package/dist/components/navigation/Tabs/Tabs.module.css.cjs +1 -1
  365. package/dist/components/navigation/Tabs/Tabs.module.css.js +18 -14
  366. package/dist/components/navigation/Tabs/Tabs.module.css.js.map +1 -1
  367. package/dist/components/navigation/TabsNav/TabsNav.cjs +2 -0
  368. package/dist/components/navigation/TabsNav/TabsNav.cjs.map +1 -0
  369. package/dist/components/navigation/TabsNav/TabsNav.js +21 -0
  370. package/dist/components/navigation/TabsNav/TabsNav.js.map +1 -0
  371. package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs +2 -0
  372. package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs.map +1 -0
  373. package/dist/components/navigation/TabsNav/TabsNav.module.css.js +18 -0
  374. package/dist/components/navigation/TabsNav/TabsNav.module.css.js.map +1 -0
  375. package/dist/components/overlays/Dialog/Dialog.cjs +1 -1
  376. package/dist/components/overlays/Dialog/Dialog.cjs.map +1 -1
  377. package/dist/components/overlays/Dialog/Dialog.js +11 -58
  378. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  379. package/dist/components/overlays/Dialog/DialogFrame.cjs +2 -0
  380. package/dist/components/overlays/Dialog/DialogFrame.cjs.map +1 -0
  381. package/dist/components/overlays/Dialog/DialogFrame.js +65 -0
  382. package/dist/components/overlays/Dialog/DialogFrame.js.map +1 -0
  383. package/dist/components/overlays/Drawer/Drawer.cjs +2 -0
  384. package/dist/components/overlays/Drawer/Drawer.cjs.map +1 -0
  385. package/dist/components/overlays/Drawer/Drawer.js +17 -0
  386. package/dist/components/overlays/Drawer/Drawer.js.map +1 -0
  387. package/dist/components/overlays/Drawer/Drawer.module.css.cjs +2 -0
  388. package/dist/components/overlays/Drawer/Drawer.module.css.cjs.map +1 -0
  389. package/dist/components/overlays/Drawer/Drawer.module.css.js +23 -0
  390. package/dist/components/overlays/Drawer/Drawer.module.css.js.map +1 -0
  391. package/dist/components/overlays/Menu/Menu.cjs +1 -1
  392. package/dist/components/overlays/Menu/Menu.cjs.map +1 -1
  393. package/dist/components/overlays/Menu/Menu.js +105 -86
  394. package/dist/components/overlays/Menu/Menu.js.map +1 -1
  395. package/dist/components/overlays/Menu/Menu.module.css.cjs +1 -1
  396. package/dist/components/overlays/Menu/Menu.module.css.js +24 -6
  397. package/dist/components/overlays/Menu/Menu.module.css.js.map +1 -1
  398. package/dist/design-system.css +1 -1
  399. package/dist/index.cjs +1 -1
  400. package/dist/index.js +190 -118
  401. package/dist/index.js.map +1 -1
  402. package/dist/types/components/actions/ButtonTile/ButtonTile.d.ts +14 -0
  403. package/dist/types/components/actions/ButtonTile/index.d.ts +2 -0
  404. package/dist/types/components/actions/Toolbar/Toolbar.d.ts +27 -0
  405. package/dist/types/components/actions/Toolbar/index.d.ts +2 -0
  406. package/dist/types/components/charts/ChartArea/ChartArea.d.ts +15 -4
  407. package/dist/types/components/charts/ChartBar/ChartBar.d.ts +11 -4
  408. package/dist/types/components/charts/ChartCombo/ChartCombo.d.ts +16 -4
  409. package/dist/types/components/charts/ChartDonut/ChartDonut.d.ts +5 -1
  410. package/dist/types/components/charts/ChartGauge/ChartGauge.d.ts +83 -0
  411. package/dist/types/components/charts/ChartGauge/gaugeLayout.d.ts +64 -0
  412. package/dist/types/components/charts/ChartGauge/gaugeReading.d.ts +97 -0
  413. package/dist/types/components/charts/ChartGauge/gaugeScale.d.ts +38 -0
  414. package/dist/types/components/charts/ChartGauge/index.d.ts +2 -0
  415. package/dist/types/components/charts/ChartLine/ChartLine.d.ts +15 -4
  416. package/dist/types/components/charts/ChartMap/ChartMap.d.ts +104 -0
  417. package/dist/types/components/charts/ChartMap/ChartMapLegend.d.ts +44 -0
  418. package/dist/types/components/charts/ChartMap/ChartMapTable.d.ts +38 -0
  419. package/dist/types/components/charts/ChartMap/index.d.ts +4 -0
  420. package/dist/types/components/charts/ChartMap/mapGeometry.d.ts +56 -0
  421. package/dist/types/components/charts/ChartMap/mapLabels.d.ts +51 -0
  422. package/dist/types/components/charts/ChartMap/mapScales.d.ts +76 -0
  423. package/dist/types/components/charts/ChartMap/polylabel.d.ts +9 -0
  424. package/dist/types/components/charts/ChartPie/ChartPie.d.ts +5 -1
  425. package/dist/types/components/charts/ChartRadial/ChartRadial.d.ts +5 -1
  426. package/dist/types/components/charts/ChartSankey/ChartSankey.d.ts +5 -1
  427. package/dist/types/components/charts/ChartScatter/ChartScatter.d.ts +7 -1
  428. package/dist/types/components/charts/ChartSunburst/ChartSunburst.d.ts +11 -2
  429. package/dist/types/components/charts/ChartTimeline/ChartTimeline.d.ts +137 -0
  430. package/dist/types/components/charts/ChartTimeline/ChartTimelineTable.d.ts +25 -0
  431. package/dist/types/components/charts/ChartTimeline/index.d.ts +2 -0
  432. package/dist/types/components/charts/ChartTimeline/timelineLayout.d.ts +70 -0
  433. package/dist/types/components/charts/ChartTimeline/timelineTime.d.ts +16 -0
  434. package/dist/types/components/charts/ChartTimeline/timelineTooltip.d.ts +45 -0
  435. package/dist/types/components/charts/ChartTooltip/ChartTooltip.d.ts +2 -0
  436. package/dist/types/components/charts/ChartTreemap/ChartTreemap.d.ts +11 -2
  437. package/dist/types/components/charts/ChartWaterfall/ChartWaterfall.d.ts +8 -3
  438. package/dist/types/components/charts/core/CartesianFrame.d.ts +6 -1
  439. package/dist/types/components/charts/core/ChartFrame.d.ts +7 -1
  440. package/dist/types/components/charts/core/ChartLegend.d.ts +3 -1
  441. package/dist/types/components/charts/core/PointBands.d.ts +22 -0
  442. package/dist/types/components/charts/core/cartesianLayout.d.ts +10 -4
  443. package/dist/types/components/charts/core/hoverPath.d.ts +10 -0
  444. package/dist/types/components/charts/core/index.d.ts +13 -3
  445. package/dist/types/components/charts/core/pointLabels.d.ts +13 -0
  446. package/dist/types/components/charts/core/tooltips.d.ts +49 -0
  447. package/dist/types/components/charts/core/useCartesianLayout.d.ts +20 -0
  448. package/dist/types/components/charts/core/useSeriesToggle.d.ts +15 -1
  449. package/dist/types/components/data-display/Accordion/Accordion.d.ts +6 -1
  450. package/dist/types/components/data-display/Accordion/index.d.ts +1 -1
  451. package/dist/types/components/data-display/List/List.d.ts +1 -1
  452. package/dist/types/components/data-display/List/useListing.d.ts +7 -1
  453. package/dist/types/components/data-display/SortableList/SortableList.d.ts +22 -0
  454. package/dist/types/components/data-display/SortableList/index.d.ts +2 -0
  455. package/dist/types/components/data-display/Tag/Tag.d.ts +13 -0
  456. package/dist/types/components/data-display/Tag/index.d.ts +2 -0
  457. package/dist/types/components/data-display/Timeline/Timeline.d.ts +15 -0
  458. package/dist/types/components/data-display/Timeline/index.d.ts +2 -0
  459. package/dist/types/components/feedback/Skeleton/Skeleton.d.ts +13 -0
  460. package/dist/types/components/feedback/Skeleton/index.d.ts +2 -0
  461. package/dist/types/components/feedback/Toast/ToastRegion.d.ts +2 -0
  462. package/dist/types/components/feedback/Toast/index.d.ts +3 -0
  463. package/dist/types/components/feedback/Toast/toastStore.d.ts +24 -0
  464. package/dist/types/components/forms/CheckboxGroup/CheckboxGroup.d.ts +28 -0
  465. package/dist/types/components/forms/CheckboxGroup/index.d.ts +2 -0
  466. package/dist/types/components/forms/ColorPicker/ColorPicker.d.ts +26 -0
  467. package/dist/types/components/forms/ColorPicker/index.d.ts +2 -0
  468. package/dist/types/components/forms/ComboBox/ComboBox.d.ts +7 -1
  469. package/dist/types/components/forms/Field/Field.d.ts +6 -2
  470. package/dist/types/components/forms/Field/index.d.ts +1 -1
  471. package/dist/types/components/forms/FileUpload/FileUpload.d.ts +37 -0
  472. package/dist/types/components/forms/FileUpload/index.d.ts +2 -0
  473. package/dist/types/components/forms/InputText/InputText.d.ts +4 -2
  474. package/dist/types/components/forms/SegmentedControl/SegmentedControl.d.ts +23 -0
  475. package/dist/types/components/forms/SegmentedControl/index.d.ts +2 -0
  476. package/dist/types/components/icons/icons.d.ts +29 -0
  477. package/dist/types/components/icons/index.d.ts +1 -1
  478. package/dist/types/components/navigation/SkipLink/SkipLink.d.ts +7 -0
  479. package/dist/types/components/navigation/SkipLink/index.d.ts +2 -0
  480. package/dist/types/components/navigation/Steps/Steps.d.ts +16 -0
  481. package/dist/types/components/navigation/Steps/index.d.ts +2 -0
  482. package/dist/types/components/navigation/Tabs/Tabs.d.ts +5 -1
  483. package/dist/types/components/navigation/TabsNav/TabsNav.d.ts +20 -0
  484. package/dist/types/components/navigation/TabsNav/index.d.ts +2 -0
  485. package/dist/types/components/overlays/Dialog/Dialog.d.ts +21 -9
  486. package/dist/types/components/overlays/Dialog/DialogFrame.d.ts +13 -0
  487. package/dist/types/components/overlays/Drawer/Drawer.d.ts +9 -0
  488. package/dist/types/components/overlays/Drawer/index.d.ts +2 -0
  489. package/dist/types/components/overlays/Menu/Menu.d.ts +16 -2
  490. package/dist/types/components/overlays/Menu/index.d.ts +1 -1
  491. package/dist/types/index.d.ts +43 -7
  492. package/dist/types/utils/formatters/formatarDuracao.d.ts +5 -0
  493. package/dist/types/utils/formatters/formatarNumero.d.ts +6 -1
  494. package/dist/types/utils/formatters/formatarTamanhoDeArquivo.d.ts +7 -0
  495. package/dist/types/utils/formatters/index.d.ts +4 -1
  496. package/dist/utils/formatters/formatarDuracao.cjs +2 -0
  497. package/dist/utils/formatters/formatarDuracao.cjs.map +1 -0
  498. package/dist/utils/formatters/formatarDuracao.js +10 -0
  499. package/dist/utils/formatters/formatarDuracao.js.map +1 -0
  500. package/dist/utils/formatters/formatarNumero.cjs +1 -1
  501. package/dist/utils/formatters/formatarNumero.cjs.map +1 -1
  502. package/dist/utils/formatters/formatarNumero.js +42 -17
  503. package/dist/utils/formatters/formatarNumero.js.map +1 -1
  504. package/dist/utils/formatters/formatarTamanhoDeArquivo.cjs +2 -0
  505. package/dist/utils/formatters/formatarTamanhoDeArquivo.cjs.map +1 -0
  506. package/dist/utils/formatters/formatarTamanhoDeArquivo.js +17 -0
  507. package/dist/utils/formatters/formatarTamanhoDeArquivo.js.map +1 -0
  508. package/package.json +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineTime.cjs","sources":["../../../../src/components/charts/ChartTimeline/timelineTime.ts"],"sourcesContent":["import { extent } from 'd3-array';\nimport type { ChartTimelineScale, ChartTimelineTime } from './ChartTimeline';\n\nexport const HOUR_MS = 3_600_000;\nconst HOURS_IN_DAY = 24;\nconst DAY_MS = HOURS_IN_DAY * HOUR_MS;\nconst WEEKDAYS = ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'];\n\n/** Menor distancia entre duas marcas do eixo, e a partir de quanto a marca diaria leva o dia da semana. */\nconst MIN_TICK_GAP = 40;\nconst MIN_DAY_TICK_GAP = 44;\nconst WEEKDAY_TICK_GAP = 70;\nconst HOUR_STEPS = [1, 3, 6, 12];\n\nexport interface TimeTick {\n label: string;\n position: number;\n}\n\nconst pad = (value: number) => String(value).padStart(2, '0');\n\n/** Posicao no eixo: em `calendar`, milissegundos desde a epoca; em `dayHours`, a hora decimal do dia. */\nexport function toPosition(time: ChartTimelineTime, scale: ChartTimelineScale) {\n if (!(time instanceof Date)) {\n return time;\n }\n\n if (scale === 'calendar') {\n return time.getTime();\n }\n\n return time.getHours() + time.getMinutes() / 60 + time.getSeconds() / 3600 + time.getMilliseconds() / HOUR_MS;\n}\n\n/** A posicao como `Date`, para os formatadores do consumidor. Em `dayHours` a data e indiferente: vale a hora. */\nexport function toDate(position: number, scale: ChartTimelineScale) {\n return scale === 'calendar' ? new Date(position) : new Date(1970, 0, 1, 0, 0, 0, Math.round(position * HOUR_MS));\n}\n\nexport function durationMs(start: number, end: number, scale: ChartTimelineScale) {\n return Math.round((end - start) * (scale === 'dayHours' ? HOUR_MS : 1));\n}\n\nfunction startOfDay(time: number) {\n const date = new Date(time);\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n}\n\n/** Dias somados pelo calendario, e nao por 24 horas: o dia de mudanca de horario nao tem 24. */\nfunction addDays(day: number, days: number) {\n const date = new Date(day);\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days).getTime();\n}\n\n/** Faixa automatica: do primeiro ao ultimo instante, arredondada a hora ou ao dia, com uma unidade no minimo. */\nexport function autoDomain(positions: readonly number[], scale: ChartTimelineScale): [number, number] {\n const [min, max] = extent(positions.filter(Number.isFinite));\n\n if (scale === 'dayHours') {\n if (min === undefined || max === undefined) {\n return [0, HOURS_IN_DAY];\n }\n\n const start = Math.min(Math.max(Math.floor(min), 0), HOURS_IN_DAY - 1);\n return [start, Math.min(Math.max(Math.ceil(max), start + 1), HOURS_IN_DAY)];\n }\n\n if (min === undefined || max === undefined) {\n const today = startOfDay(Date.now());\n return [today, addDays(today, 1)];\n }\n\n const start = startOfDay(min);\n const lastDay = startOfDay(max);\n\n return [start, Math.max(lastDay === max ? max : addDays(lastDay, 1), addDays(start, 1))];\n}\n\nfunction dayMonth(date: Date) {\n return `${pad(date.getDate())}/${pad(date.getMonth() + 1)}`;\n}\n\n/** Instante no balao e na tabela: `07:12` em horas do dia; `05/10 14:00`, ou so `05/10` a meia-noite, em datas. */\nexport function formatPosition(position: number, scale: ChartTimelineScale) {\n if (scale === 'dayHours') {\n const minutes = Math.round(position * 60);\n return `${pad(Math.floor(minutes / 60))}:${pad(minutes % 60)}`;\n }\n\n const date = new Date(position);\n const time = date.getHours() || date.getMinutes() ? ` ${pad(date.getHours())}:${pad(date.getMinutes())}` : '';\n\n return `${dayMonth(date)}${time}`;\n}\n\nfunction hourTicks([start, end]: readonly [number, number], width: number) {\n const pixelsPerHour = width / Math.max(end - start, Number.EPSILON);\n const step = HOUR_STEPS.find((hours) => hours * pixelsPerHour >= MIN_TICK_GAP) ?? HOURS_IN_DAY;\n const ticks: number[] = [];\n\n for (let hour = Math.ceil(start / step) * step; hour <= end; hour += step) {\n ticks.push(hour);\n }\n\n return ticks;\n}\n\n/** Marcas em datas: um dia por marca enquanto cabe, depois as segundas-feiras, depois o primeiro de cada mes. */\nfunction dateTicks([start, end]: readonly [number, number], width: number) {\n const pixelsPerDay = (width * DAY_MS) / Math.max(end - start, 1);\n const firstDay = startOfDay(start) < start ? addDays(startOfDay(start), 1) : startOfDay(start);\n const ticks: number[] = [];\n\n if (pixelsPerDay >= MIN_DAY_TICK_GAP || pixelsPerDay * 7 >= MIN_DAY_TICK_GAP) {\n const daily = pixelsPerDay >= MIN_DAY_TICK_GAP;\n const firstMonday = addDays(firstDay, (8 - new Date(firstDay).getDay()) % 7);\n\n for (let day = daily ? firstDay : firstMonday; day <= end; day = addDays(day, daily ? 1 : 7)) {\n ticks.push(day);\n }\n\n return ticks;\n }\n\n const first = new Date(firstDay);\n\n for (let month = 0; ; month += 1) {\n const day = new Date(first.getFullYear(), first.getMonth() + month, 1).getTime();\n\n if (day > end) {\n return ticks;\n }\n\n if (day >= start) {\n ticks.push(day);\n }\n }\n}\n\nexport function timeTicks(\n domain: readonly [number, number],\n scale: ChartTimelineScale,\n width: number,\n formatTick?: (time: Date) => string,\n): TimeTick[] {\n if (!domain.every(Number.isFinite) || width <= 0) {\n return [];\n }\n\n if (scale === 'dayHours') {\n return hourTicks(domain, width).map((hour) => ({\n label: formatTick ? formatTick(toDate(hour, scale)) : `${hour}h`,\n position: hour,\n }));\n }\n\n const withWeekday = (width * DAY_MS) / Math.max(domain[1] - domain[0], 1) >= WEEKDAY_TICK_GAP;\n\n return dateTicks(domain, width).map((day) => {\n const date = new Date(day);\n const label = withWeekday ? `${WEEKDAYS[date.getDay()]} ${dayMonth(date)}` : dayMonth(date);\n\n return { label: formatTick ? formatTick(date) : label, position: day };\n });\n}\n"],"names":["HOUR_MS","HOURS_IN_DAY","DAY_MS","WEEKDAYS","MIN_TICK_GAP","MIN_DAY_TICK_GAP","WEEKDAY_TICK_GAP","HOUR_STEPS","pad","value","toPosition","time","scale","toDate","position","durationMs","start","end","startOfDay","date","addDays","day","days","autoDomain","positions","min","max","extent","today","lastDay","dayMonth","formatPosition","minutes","hourTicks","width","pixelsPerHour","step","hours","ticks","hour","dateTicks","pixelsPerDay","firstDay","daily","firstMonday","first","month","timeTicks","domain","formatTick","withWeekday","label"],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import { extent as m } from "d3-array";
2
+ const g = 36e5, M = 24, y = M * g, S = ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"], p = 40, h = 44, x = 70, _ = [1, 3, 6, 12], i = (t) => String(t).padStart(2, "0");
3
+ function T(t, e) {
4
+ return t instanceof Date ? e === "calendar" ? t.getTime() : t.getHours() + t.getMinutes() / 60 + t.getSeconds() / 3600 + t.getMilliseconds() / g : t;
5
+ }
6
+ function H(t, e) {
7
+ return e === "calendar" ? new Date(t) : new Date(1970, 0, 1, 0, 0, 0, Math.round(t * g));
8
+ }
9
+ function A(t, e, n) {
10
+ return Math.round((e - t) * (n === "dayHours" ? g : 1));
11
+ }
12
+ function c(t) {
13
+ const e = new Date(t);
14
+ return new Date(e.getFullYear(), e.getMonth(), e.getDate()).getTime();
15
+ }
16
+ function f(t, e) {
17
+ const n = new Date(t);
18
+ return new Date(n.getFullYear(), n.getMonth(), n.getDate() + e).getTime();
19
+ }
20
+ function Y(t, e) {
21
+ const [n, o] = m(t.filter(Number.isFinite));
22
+ if (e === "dayHours") {
23
+ if (n === void 0 || o === void 0)
24
+ return [0, M];
25
+ const r = Math.min(Math.max(Math.floor(n), 0), M - 1);
26
+ return [r, Math.min(Math.max(Math.ceil(o), r + 1), M)];
27
+ }
28
+ if (n === void 0 || o === void 0) {
29
+ const r = c(Date.now());
30
+ return [r, f(r, 1)];
31
+ }
32
+ const s = c(n), a = c(o);
33
+ return [s, Math.max(a === o ? o : f(a, 1), f(s, 1))];
34
+ }
35
+ function d(t) {
36
+ return `${i(t.getDate())}/${i(t.getMonth() + 1)}`;
37
+ }
38
+ function b(t, e) {
39
+ if (e === "dayHours") {
40
+ const s = Math.round(t * 60);
41
+ return `${i(Math.floor(s / 60))}:${i(s % 60)}`;
42
+ }
43
+ const n = new Date(t), o = n.getHours() || n.getMinutes() ? ` ${i(n.getHours())}:${i(n.getMinutes())}` : "";
44
+ return `${d(n)}${o}`;
45
+ }
46
+ function $([t, e], n) {
47
+ const o = n / Math.max(e - t, Number.EPSILON), s = _.find((r) => r * o >= p) ?? M, a = [];
48
+ for (let r = Math.ceil(t / s) * s; r <= e; r += s)
49
+ a.push(r);
50
+ return a;
51
+ }
52
+ function w([t, e], n) {
53
+ const o = n * y / Math.max(e - t, 1), s = c(t) < t ? f(c(t), 1) : c(t), a = [];
54
+ if (o >= h || o * 7 >= h) {
55
+ const u = o >= h, D = f(s, (8 - new Date(s).getDay()) % 7);
56
+ for (let l = u ? s : D; l <= e; l = f(l, u ? 1 : 7))
57
+ a.push(l);
58
+ return a;
59
+ }
60
+ const r = new Date(s);
61
+ for (let u = 0; ; u += 1) {
62
+ const D = new Date(r.getFullYear(), r.getMonth() + u, 1).getTime();
63
+ if (D > e)
64
+ return a;
65
+ D >= t && a.push(D);
66
+ }
67
+ }
68
+ function I(t, e, n, o) {
69
+ if (!t.every(Number.isFinite) || n <= 0)
70
+ return [];
71
+ if (e === "dayHours")
72
+ return $(t, n).map((a) => ({
73
+ label: o ? o(H(a, e)) : `${a}h`,
74
+ position: a
75
+ }));
76
+ const s = n * y / Math.max(t[1] - t[0], 1) >= x;
77
+ return w(t, n).map((a) => {
78
+ const r = new Date(a), u = s ? `${S[r.getDay()]} ${d(r)}` : d(r);
79
+ return { label: o ? o(r) : u, position: a };
80
+ });
81
+ }
82
+ export {
83
+ g as HOUR_MS,
84
+ Y as autoDomain,
85
+ A as durationMs,
86
+ b as formatPosition,
87
+ I as timeTicks,
88
+ H as toDate,
89
+ T as toPosition
90
+ };
91
+ //# sourceMappingURL=timelineTime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineTime.js","sources":["../../../../src/components/charts/ChartTimeline/timelineTime.ts"],"sourcesContent":["import { extent } from 'd3-array';\nimport type { ChartTimelineScale, ChartTimelineTime } from './ChartTimeline';\n\nexport const HOUR_MS = 3_600_000;\nconst HOURS_IN_DAY = 24;\nconst DAY_MS = HOURS_IN_DAY * HOUR_MS;\nconst WEEKDAYS = ['Dom', 'Seg', 'Ter', 'Qua', 'Qui', 'Sex', 'Sáb'];\n\n/** Menor distancia entre duas marcas do eixo, e a partir de quanto a marca diaria leva o dia da semana. */\nconst MIN_TICK_GAP = 40;\nconst MIN_DAY_TICK_GAP = 44;\nconst WEEKDAY_TICK_GAP = 70;\nconst HOUR_STEPS = [1, 3, 6, 12];\n\nexport interface TimeTick {\n label: string;\n position: number;\n}\n\nconst pad = (value: number) => String(value).padStart(2, '0');\n\n/** Posicao no eixo: em `calendar`, milissegundos desde a epoca; em `dayHours`, a hora decimal do dia. */\nexport function toPosition(time: ChartTimelineTime, scale: ChartTimelineScale) {\n if (!(time instanceof Date)) {\n return time;\n }\n\n if (scale === 'calendar') {\n return time.getTime();\n }\n\n return time.getHours() + time.getMinutes() / 60 + time.getSeconds() / 3600 + time.getMilliseconds() / HOUR_MS;\n}\n\n/** A posicao como `Date`, para os formatadores do consumidor. Em `dayHours` a data e indiferente: vale a hora. */\nexport function toDate(position: number, scale: ChartTimelineScale) {\n return scale === 'calendar' ? new Date(position) : new Date(1970, 0, 1, 0, 0, 0, Math.round(position * HOUR_MS));\n}\n\nexport function durationMs(start: number, end: number, scale: ChartTimelineScale) {\n return Math.round((end - start) * (scale === 'dayHours' ? HOUR_MS : 1));\n}\n\nfunction startOfDay(time: number) {\n const date = new Date(time);\n return new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime();\n}\n\n/** Dias somados pelo calendario, e nao por 24 horas: o dia de mudanca de horario nao tem 24. */\nfunction addDays(day: number, days: number) {\n const date = new Date(day);\n return new Date(date.getFullYear(), date.getMonth(), date.getDate() + days).getTime();\n}\n\n/** Faixa automatica: do primeiro ao ultimo instante, arredondada a hora ou ao dia, com uma unidade no minimo. */\nexport function autoDomain(positions: readonly number[], scale: ChartTimelineScale): [number, number] {\n const [min, max] = extent(positions.filter(Number.isFinite));\n\n if (scale === 'dayHours') {\n if (min === undefined || max === undefined) {\n return [0, HOURS_IN_DAY];\n }\n\n const start = Math.min(Math.max(Math.floor(min), 0), HOURS_IN_DAY - 1);\n return [start, Math.min(Math.max(Math.ceil(max), start + 1), HOURS_IN_DAY)];\n }\n\n if (min === undefined || max === undefined) {\n const today = startOfDay(Date.now());\n return [today, addDays(today, 1)];\n }\n\n const start = startOfDay(min);\n const lastDay = startOfDay(max);\n\n return [start, Math.max(lastDay === max ? max : addDays(lastDay, 1), addDays(start, 1))];\n}\n\nfunction dayMonth(date: Date) {\n return `${pad(date.getDate())}/${pad(date.getMonth() + 1)}`;\n}\n\n/** Instante no balao e na tabela: `07:12` em horas do dia; `05/10 14:00`, ou so `05/10` a meia-noite, em datas. */\nexport function formatPosition(position: number, scale: ChartTimelineScale) {\n if (scale === 'dayHours') {\n const minutes = Math.round(position * 60);\n return `${pad(Math.floor(minutes / 60))}:${pad(minutes % 60)}`;\n }\n\n const date = new Date(position);\n const time = date.getHours() || date.getMinutes() ? ` ${pad(date.getHours())}:${pad(date.getMinutes())}` : '';\n\n return `${dayMonth(date)}${time}`;\n}\n\nfunction hourTicks([start, end]: readonly [number, number], width: number) {\n const pixelsPerHour = width / Math.max(end - start, Number.EPSILON);\n const step = HOUR_STEPS.find((hours) => hours * pixelsPerHour >= MIN_TICK_GAP) ?? HOURS_IN_DAY;\n const ticks: number[] = [];\n\n for (let hour = Math.ceil(start / step) * step; hour <= end; hour += step) {\n ticks.push(hour);\n }\n\n return ticks;\n}\n\n/** Marcas em datas: um dia por marca enquanto cabe, depois as segundas-feiras, depois o primeiro de cada mes. */\nfunction dateTicks([start, end]: readonly [number, number], width: number) {\n const pixelsPerDay = (width * DAY_MS) / Math.max(end - start, 1);\n const firstDay = startOfDay(start) < start ? addDays(startOfDay(start), 1) : startOfDay(start);\n const ticks: number[] = [];\n\n if (pixelsPerDay >= MIN_DAY_TICK_GAP || pixelsPerDay * 7 >= MIN_DAY_TICK_GAP) {\n const daily = pixelsPerDay >= MIN_DAY_TICK_GAP;\n const firstMonday = addDays(firstDay, (8 - new Date(firstDay).getDay()) % 7);\n\n for (let day = daily ? firstDay : firstMonday; day <= end; day = addDays(day, daily ? 1 : 7)) {\n ticks.push(day);\n }\n\n return ticks;\n }\n\n const first = new Date(firstDay);\n\n for (let month = 0; ; month += 1) {\n const day = new Date(first.getFullYear(), first.getMonth() + month, 1).getTime();\n\n if (day > end) {\n return ticks;\n }\n\n if (day >= start) {\n ticks.push(day);\n }\n }\n}\n\nexport function timeTicks(\n domain: readonly [number, number],\n scale: ChartTimelineScale,\n width: number,\n formatTick?: (time: Date) => string,\n): TimeTick[] {\n if (!domain.every(Number.isFinite) || width <= 0) {\n return [];\n }\n\n if (scale === 'dayHours') {\n return hourTicks(domain, width).map((hour) => ({\n label: formatTick ? formatTick(toDate(hour, scale)) : `${hour}h`,\n position: hour,\n }));\n }\n\n const withWeekday = (width * DAY_MS) / Math.max(domain[1] - domain[0], 1) >= WEEKDAY_TICK_GAP;\n\n return dateTicks(domain, width).map((day) => {\n const date = new Date(day);\n const label = withWeekday ? `${WEEKDAYS[date.getDay()]} ${dayMonth(date)}` : dayMonth(date);\n\n return { label: formatTick ? formatTick(date) : label, position: day };\n });\n}\n"],"names":["HOUR_MS","HOURS_IN_DAY","DAY_MS","WEEKDAYS","MIN_TICK_GAP","MIN_DAY_TICK_GAP","WEEKDAY_TICK_GAP","HOUR_STEPS","pad","value","toPosition","time","scale","toDate","position","durationMs","start","end","startOfDay","date","addDays","day","days","autoDomain","positions","min","max","extent","today","lastDay","dayMonth","formatPosition","minutes","hourTicks","width","pixelsPerHour","step","hours","ticks","hour","dateTicks","pixelsPerDay","firstDay","daily","firstMonday","first","month","timeTicks","domain","formatTick","withWeekday","label"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const m=require("d3-array"),k=require("../../../utils/formatters/formatarNumero.cjs");function f(r){return r.filter(Boolean).join(" · ")||void 0}function y(r,l){if(r===null)return{rows:[]};const{colorOf:t,duration:p,formatDuration:b,formatInstant:n}=l,i=e=>`${n(e.start)}–${n(e.end)}`;if(r.kind==="segment"){const{row:e,segment:o}=r,s=[{color:t(o.series),emphasis:!0,label:o.series,values:[p(o)]}];return l.showProgress&&o.progress!==void 0&&s.push({format:c=>k.formatarPercentual(c),label:"Concluído",values:[o.progress]}),{columns:[{format:b}],computed:"none",rows:s,subtitle:f([i(o),o.label!==o.series?o.label:void 0,e.description,r.clip]),title:e.label}}if(r.kind==="marker"){const{marker:e,row:o}=r;return{computed:"none",rows:[{color:t(e.series),emphasis:!0,format:n,label:e.series,values:[e.position]}],subtitle:e.label,title:o.label}}if(r.kind==="group"){const{segments:e}=r,o=m.min(e,d=>d.start),s=m.max(e,d=>d.end),c=o===void 0||s===void 0?void 0:i({end:s,start:o});return{computed:"none",rows:[{format:String,label:"Linhas",values:[r.rowCount]}],subtitle:f([c,r.collapsed?"Grupo recolhido":void 0]),title:r.group.label}}const{row:a,segments:v}=r,h=l.seriesOrder.flatMap(e=>{const o=r.rowBands.filter(s=>s.series===e);return o.length?[`${e} ${o.map(i).join(" · ")}`]:[]}),w=f([a.description,...h]),u=l.seriesOrder.flatMap(e=>{const o=v.filter(s=>s.series===e);return o.length?[{color:t(e),label:e,values:[m.sum(o,p)]}]:[]});return u.length===0?{computed:"none",rows:[{label:r.empty?l.emptyRowLabel:"Séries desligadas",values:[]}],subtitle:w,title:a.label}:{columns:[{format:b}],computed:"none",rows:u,showTotal:u.length>1,subtitle:w,title:a.label}}exports.timelineTooltip=y;
2
+ //# sourceMappingURL=timelineTooltip.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineTooltip.cjs","sources":["../../../../src/components/charts/ChartTimeline/timelineTooltip.ts"],"sourcesContent":["import { max, min, sum } from 'd3-array';\nimport type { ChartTooltipProps, ChartTooltipRow } from '../ChartTooltip';\nimport { formatarPercentual } from '../../../utils/formatters';\nimport type { ChartTimelineGroup, ChartTimelineMarker, ChartTimelineRow } from './ChartTimeline';\nimport type { TimelineRange, TimelineSegment } from './timelineLayout';\n\nexport interface TimelineMarker extends ChartTimelineMarker {\n position: number;\n}\n\nexport interface TimelineRowBand extends TimelineRange {\n row: string;\n series: string;\n}\n\n/** O que esta sob o ponteiro. Cada caso carrega o que o balao dele precisa. */\nexport type TimelineTarget =\n | { clip: string | undefined; kind: 'segment'; row: ChartTimelineRow; segment: TimelineSegment }\n | { kind: 'marker'; marker: TimelineMarker; row: ChartTimelineRow }\n | {\n collapsed: boolean;\n group: ChartTimelineGroup;\n kind: 'group';\n rowCount: number;\n segments: readonly TimelineSegment[];\n }\n | {\n /** A linha nao tem intervalo algum, de nenhuma serie. */\n empty: boolean;\n kind: 'row';\n row: ChartTimelineRow;\n rowBands: readonly TimelineRowBand[];\n segments: readonly TimelineSegment[];\n };\n\nexport interface TimelineTooltipOptions {\n colorOf: (series: string) => string | undefined;\n duration: (range: TimelineRange) => number;\n emptyRowLabel: string;\n formatDuration: (durationMs: number) => string;\n formatInstant: (position: number) => string;\n seriesOrder: readonly string[];\n showProgress: boolean;\n}\n\nexport type TimelineTooltip = Omit<ChartTooltipProps, 'children'>;\n\nfunction joined(parts: readonly (string | undefined)[]) {\n return parts.filter(Boolean).join(' · ') || undefined;\n}\n\nexport function timelineTooltip(target: TimelineTarget | null, options: TimelineTooltipOptions): TimelineTooltip {\n if (target === null) {\n return { rows: [] };\n }\n\n const { colorOf, duration, formatDuration, formatInstant } = options;\n const interval = (range: TimelineRange) => `${formatInstant(range.start)}–${formatInstant(range.end)}`;\n\n if (target.kind === 'segment') {\n const { row, segment } = target;\n const rows: ChartTooltipRow[] = [\n { color: colorOf(segment.series), emphasis: true, label: segment.series, values: [duration(segment)] },\n ];\n\n if (options.showProgress && segment.progress !== undefined) {\n rows.push({ format: (value) => formatarPercentual(value), label: 'Concluído', values: [segment.progress] });\n }\n\n return {\n columns: [{ format: formatDuration }],\n computed: 'none',\n rows,\n subtitle: joined([\n interval(segment),\n segment.label !== segment.series ? segment.label : undefined,\n row.description,\n target.clip,\n ]),\n title: row.label,\n };\n }\n\n if (target.kind === 'marker') {\n const { marker, row } = target;\n\n return {\n computed: 'none',\n rows: [\n {\n color: colorOf(marker.series),\n emphasis: true,\n format: formatInstant,\n label: marker.series,\n values: [marker.position],\n },\n ],\n subtitle: marker.label,\n title: row.label,\n };\n }\n\n if (target.kind === 'group') {\n const { segments } = target;\n const start = min(segments, (segment) => segment.start);\n const end = max(segments, (segment) => segment.end);\n const period = start === undefined || end === undefined ? undefined : interval({ end, start });\n\n return {\n computed: 'none',\n rows: [{ format: String, label: 'Linhas', values: [target.rowCount] }],\n subtitle: joined([period, target.collapsed ? 'Grupo recolhido' : undefined]),\n title: target.group.label,\n };\n }\n\n const { row, segments } = target;\n const scheduled = options.seriesOrder.flatMap((series) => {\n const bands = target.rowBands.filter((band) => band.series === series);\n return bands.length ? [`${series} ${bands.map(interval).join(' · ')}`] : [];\n });\n const subtitle = joined([row.description, ...scheduled]);\n const totals = options.seriesOrder.flatMap((series): ChartTooltipRow[] => {\n const ofSeries = segments.filter((segment) => segment.series === series);\n return ofSeries.length ? [{ color: colorOf(series), label: series, values: [sum(ofSeries, duration)] }] : [];\n });\n\n // Sem coluna declarada o balao nao inventa um valor para a linha que so tem rotulo.\n if (totals.length === 0) {\n return {\n computed: 'none',\n rows: [{ label: target.empty ? options.emptyRowLabel : 'Séries desligadas', values: [] }],\n subtitle,\n title: row.label,\n };\n }\n\n return {\n columns: [{ format: formatDuration }],\n computed: 'none',\n rows: totals,\n showTotal: totals.length > 1,\n subtitle,\n title: row.label,\n };\n}\n"],"names":["joined","parts","timelineTooltip","target","options","colorOf","duration","formatDuration","formatInstant","interval","range","row","segment","rows","value","formatarPercentual","marker","segments","start","min","end","max","period","scheduled","series","bands","band","subtitle","totals","ofSeries","sum"],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { min as h, max as k, sum as $ } from "d3-array";
2
+ import { formatarPercentual as j } from "../../../utils/formatters/formatarNumero.js";
3
+ function d(s) {
4
+ return s.filter(Boolean).join(" · ") || void 0;
5
+ }
6
+ function g(s, l) {
7
+ if (s === null)
8
+ return { rows: [] };
9
+ const { colorOf: n, duration: f, formatDuration: p, formatInstant: t } = l, i = (e) => `${t(e.start)}–${t(e.end)}`;
10
+ if (s.kind === "segment") {
11
+ const { row: e, segment: o } = s, r = [
12
+ { color: n(o.series), emphasis: !0, label: o.series, values: [f(o)] }
13
+ ];
14
+ return l.showProgress && o.progress !== void 0 && r.push({ format: (c) => j(c), label: "Concluído", values: [o.progress] }), {
15
+ columns: [{ format: p }],
16
+ computed: "none",
17
+ rows: r,
18
+ subtitle: d([
19
+ i(o),
20
+ o.label !== o.series ? o.label : void 0,
21
+ e.description,
22
+ s.clip
23
+ ]),
24
+ title: e.label
25
+ };
26
+ }
27
+ if (s.kind === "marker") {
28
+ const { marker: e, row: o } = s;
29
+ return {
30
+ computed: "none",
31
+ rows: [
32
+ {
33
+ color: n(e.series),
34
+ emphasis: !0,
35
+ format: t,
36
+ label: e.series,
37
+ values: [e.position]
38
+ }
39
+ ],
40
+ subtitle: e.label,
41
+ title: o.label
42
+ };
43
+ }
44
+ if (s.kind === "group") {
45
+ const { segments: e } = s, o = h(e, (m) => m.start), r = k(e, (m) => m.end), c = o === void 0 || r === void 0 ? void 0 : i({ end: r, start: o });
46
+ return {
47
+ computed: "none",
48
+ rows: [{ format: String, label: "Linhas", values: [s.rowCount] }],
49
+ subtitle: d([c, s.collapsed ? "Grupo recolhido" : void 0]),
50
+ title: s.group.label
51
+ };
52
+ }
53
+ const { row: a, segments: w } = s, v = l.seriesOrder.flatMap((e) => {
54
+ const o = s.rowBands.filter((r) => r.series === e);
55
+ return o.length ? [`${e} ${o.map(i).join(" · ")}`] : [];
56
+ }), b = d([a.description, ...v]), u = l.seriesOrder.flatMap((e) => {
57
+ const o = w.filter((r) => r.series === e);
58
+ return o.length ? [{ color: n(e), label: e, values: [$(o, f)] }] : [];
59
+ });
60
+ return u.length === 0 ? {
61
+ computed: "none",
62
+ rows: [{ label: s.empty ? l.emptyRowLabel : "Séries desligadas", values: [] }],
63
+ subtitle: b,
64
+ title: a.label
65
+ } : {
66
+ columns: [{ format: p }],
67
+ computed: "none",
68
+ rows: u,
69
+ showTotal: u.length > 1,
70
+ subtitle: b,
71
+ title: a.label
72
+ };
73
+ }
74
+ export {
75
+ g as timelineTooltip
76
+ };
77
+ //# sourceMappingURL=timelineTooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timelineTooltip.js","sources":["../../../../src/components/charts/ChartTimeline/timelineTooltip.ts"],"sourcesContent":["import { max, min, sum } from 'd3-array';\nimport type { ChartTooltipProps, ChartTooltipRow } from '../ChartTooltip';\nimport { formatarPercentual } from '../../../utils/formatters';\nimport type { ChartTimelineGroup, ChartTimelineMarker, ChartTimelineRow } from './ChartTimeline';\nimport type { TimelineRange, TimelineSegment } from './timelineLayout';\n\nexport interface TimelineMarker extends ChartTimelineMarker {\n position: number;\n}\n\nexport interface TimelineRowBand extends TimelineRange {\n row: string;\n series: string;\n}\n\n/** O que esta sob o ponteiro. Cada caso carrega o que o balao dele precisa. */\nexport type TimelineTarget =\n | { clip: string | undefined; kind: 'segment'; row: ChartTimelineRow; segment: TimelineSegment }\n | { kind: 'marker'; marker: TimelineMarker; row: ChartTimelineRow }\n | {\n collapsed: boolean;\n group: ChartTimelineGroup;\n kind: 'group';\n rowCount: number;\n segments: readonly TimelineSegment[];\n }\n | {\n /** A linha nao tem intervalo algum, de nenhuma serie. */\n empty: boolean;\n kind: 'row';\n row: ChartTimelineRow;\n rowBands: readonly TimelineRowBand[];\n segments: readonly TimelineSegment[];\n };\n\nexport interface TimelineTooltipOptions {\n colorOf: (series: string) => string | undefined;\n duration: (range: TimelineRange) => number;\n emptyRowLabel: string;\n formatDuration: (durationMs: number) => string;\n formatInstant: (position: number) => string;\n seriesOrder: readonly string[];\n showProgress: boolean;\n}\n\nexport type TimelineTooltip = Omit<ChartTooltipProps, 'children'>;\n\nfunction joined(parts: readonly (string | undefined)[]) {\n return parts.filter(Boolean).join(' · ') || undefined;\n}\n\nexport function timelineTooltip(target: TimelineTarget | null, options: TimelineTooltipOptions): TimelineTooltip {\n if (target === null) {\n return { rows: [] };\n }\n\n const { colorOf, duration, formatDuration, formatInstant } = options;\n const interval = (range: TimelineRange) => `${formatInstant(range.start)}–${formatInstant(range.end)}`;\n\n if (target.kind === 'segment') {\n const { row, segment } = target;\n const rows: ChartTooltipRow[] = [\n { color: colorOf(segment.series), emphasis: true, label: segment.series, values: [duration(segment)] },\n ];\n\n if (options.showProgress && segment.progress !== undefined) {\n rows.push({ format: (value) => formatarPercentual(value), label: 'Concluído', values: [segment.progress] });\n }\n\n return {\n columns: [{ format: formatDuration }],\n computed: 'none',\n rows,\n subtitle: joined([\n interval(segment),\n segment.label !== segment.series ? segment.label : undefined,\n row.description,\n target.clip,\n ]),\n title: row.label,\n };\n }\n\n if (target.kind === 'marker') {\n const { marker, row } = target;\n\n return {\n computed: 'none',\n rows: [\n {\n color: colorOf(marker.series),\n emphasis: true,\n format: formatInstant,\n label: marker.series,\n values: [marker.position],\n },\n ],\n subtitle: marker.label,\n title: row.label,\n };\n }\n\n if (target.kind === 'group') {\n const { segments } = target;\n const start = min(segments, (segment) => segment.start);\n const end = max(segments, (segment) => segment.end);\n const period = start === undefined || end === undefined ? undefined : interval({ end, start });\n\n return {\n computed: 'none',\n rows: [{ format: String, label: 'Linhas', values: [target.rowCount] }],\n subtitle: joined([period, target.collapsed ? 'Grupo recolhido' : undefined]),\n title: target.group.label,\n };\n }\n\n const { row, segments } = target;\n const scheduled = options.seriesOrder.flatMap((series) => {\n const bands = target.rowBands.filter((band) => band.series === series);\n return bands.length ? [`${series} ${bands.map(interval).join(' · ')}`] : [];\n });\n const subtitle = joined([row.description, ...scheduled]);\n const totals = options.seriesOrder.flatMap((series): ChartTooltipRow[] => {\n const ofSeries = segments.filter((segment) => segment.series === series);\n return ofSeries.length ? [{ color: colorOf(series), label: series, values: [sum(ofSeries, duration)] }] : [];\n });\n\n // Sem coluna declarada o balao nao inventa um valor para a linha que so tem rotulo.\n if (totals.length === 0) {\n return {\n computed: 'none',\n rows: [{ label: target.empty ? options.emptyRowLabel : 'Séries desligadas', values: [] }],\n subtitle,\n title: row.label,\n };\n }\n\n return {\n columns: [{ format: formatDuration }],\n computed: 'none',\n rows: totals,\n showTotal: totals.length > 1,\n subtitle,\n title: row.label,\n };\n}\n"],"names":["joined","parts","timelineTooltip","target","options","colorOf","duration","formatDuration","formatInstant","interval","range","row","segment","rows","value","formatarPercentual","marker","segments","start","min","end","max","period","scheduled","series","bands","band","subtitle","totals","ofSeries","sum"],"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":"oQAuDMA,EAAc,GAGdC,EAAS,EAEf,SAASC,EAAMC,EAA4B,CACzC,OAAOA,EAAQ,OAAO,CAACC,EAAOC,IAAUD,EAAQC,EAAO,CAAC,CAC1D,CAEA,SAASC,EAAUC,EAA6BJ,EAA4B,CAC1E,OAAI,OAAOI,GAAa,WACfA,EAASJ,CAAO,EAGrBI,IAAa,UACRJ,EAAQ,SAAW,EAAI,EAAID,EAAMC,CAAO,EAAIA,EAAQ,OAGtDD,EAAMC,CAAO,CACtB,CAMA,SAASK,EAAS,CAAE,EAAAC,EAAG,EAAAC,CAAA,EAAYC,EAAiBC,EAAuB,CACzE,MAAMC,EAAeJ,EAAIT,EAAcW,GAAW,OAAO,WAAaV,EAChEa,EAAaJ,EAAIV,EAAcY,GAAU,OAAO,YAAcX,EAEpE,MAAO,CACL,EAAGY,EAAeJ,EAAIT,EAAc,KAAK,IAAIS,EAAIT,EAAcW,EAASV,CAAM,EAC9E,EAAGa,EAAaJ,EAAIV,EAAc,KAAK,IAAIU,EAAIV,EAAcY,EAAQX,CAAM,CAAA,CAE/E,CAUO,SAASc,EAAa,CAC3B,SAAAC,EACA,QAAAC,EACA,SAAAC,EACA,KAAAC,EACA,UAAAC,EAAY,GACZ,SAAAC,EACA,MAAAC,EACA,WAAAC,EAAa,OACf,EAAsB,CACpB,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAuB,IAAI,EACrDC,EAAUH,IAAa,MAAQL,EAAK,OAAS,EAKnDS,EAAAA,UAAU,IAAM,CACd,GAAI,CAACD,EACH,OAGF,MAAME,EAAW,IAAMJ,EAAY,IAAI,EAEvC,cAAO,iBAAiB,SAAUI,EAAU,EAAI,EAChD,OAAO,iBAAiB,SAAUA,CAAQ,EAC1C,OAAO,iBAAiB,UAAWA,CAAQ,EAEpC,IAAM,CACX,OAAO,oBAAoB,SAAUA,EAAU,EAAI,EACnD,OAAO,oBAAoB,SAAUA,CAAQ,EAC7C,OAAO,oBAAoB,UAAWA,CAAQ,CAChD,CACF,EAAG,CAACF,CAAO,CAAC,EAEZ,MAAMG,EAAcC,GAClBN,EAAY,CAAE,EAAGM,EAAO,QAAS,EAAGA,EAAO,OAAA,CAAS,EAEtD,OACEC,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,QAAO,KAClB,eAAgB,IAAMR,EAAY,IAAI,EACtC,cAAeK,EAEd,SAAA,CAAAd,EAEAW,GACCO,EAAAA,aACEC,EAAAA,IAACC,EAAA,CACC,QAAAnB,EACA,SAAAC,EACA,SAAAM,EACA,KAAAL,EACA,UAAAC,EACA,SAAAC,EACA,MAAAC,EACA,WAAAC,CAAA,CAAA,EAEF,SAAS,IAAA,CACX,CAAA,CAAA,CAGR,CAIA,SAASa,EAAM,CACb,QAAAnB,EACA,SAAAC,EACA,SAAAM,EACA,KAAAL,EACA,UAAAC,EACA,SAAAC,EACA,MAAAC,EACA,WAAAC,CACF,EAAe,CACb,MAAMc,EAAMC,EAAAA,OAAuB,IAAI,EACjC,CAACC,EAAQC,CAAS,EAAId,EAAAA,SAAS,CAAE,OAAQ,EAAG,QAAS,EAAG,EAG9De,EAAAA,gBAAgB,IAAM,CACpB,MAAMC,EAAKL,EAAI,QAEf,GAAI,CAACK,EACH,OAGF,KAAM,CAAE,OAAAC,EAAQ,MAAAC,GAAUF,EAAG,sBAAA,GAEzBC,IAAWJ,EAAO,QAAUK,IAAUL,EAAO,UAC/CC,EAAU,CAAE,OAAQG,EAAQ,QAASC,EAAO,CAEhD,CAAC,EAED,MAAMC,EAAsB1B,EAAK,OAAO,CAAC2B,EAAOC,IAAU,KAAK,IAAID,EAAOC,EAAM,OAAO,MAAM,EAAG,CAAC,EAC3FC,EACJ/B,GAAW,MAAM,KAAK,CAAE,OAAQ4B,CAAA,EAAuB,KAAO,CAAA,EAAG,EAI7DI,EAAY/B,IAAa,QAAU8B,EAAQ,SAAW,EAAI,OAAY9B,GAAY,CAAA,EAClFgC,GAAaD,GAAA,YAAAA,EAAW,SAAUD,EAAQ,OAAS,EACnDG,EAAcjD,EAAMiB,EAAK,IAAK4B,GAAUA,EAAM,OAAOG,CAAU,GAAK,CAAC,CAAC,EACtEE,GAAWH,GAAA,YAAAA,EAAW,WAAY,CAAC5C,EAAeD,IAAmBA,IAAU,EAAI,EAAIC,EAAQD,GAC/FiD,GAAoBJ,GAAA,YAAAA,EAAW,UAAY5C,GAAkBiD,qBAAmBjD,EAAO,CAAE,cAAe,CAAA,CAAG,GAE3G,CAAE,EAAAI,EAAG,EAAAC,CAAA,EAAMF,EAASgB,EAAUe,EAAO,QAASA,EAAO,MAAM,EAC3DgB,EAAU,OAAO,QAAQ,OAAOP,EAAQ,QAAUC,EAAY,EAAI,EAAE,CAAC,GAAG,KAAA,EAE9E,OACEjB,EAAAA,KAAC,MAAA,CAAI,cAAY,OAAO,UAAWC,UAAO,QAAS,IAAAI,EAAU,MAAO,CAAE,KAAM5B,EAAG,IAAKC,GACjF,SAAA,CAAAY,IAAU,QAAaa,EAAAA,IAAC,IAAA,CAAE,UAAWF,EAAAA,QAAO,MAAQ,SAAAX,EAAM,EAC1DD,IAAa,QAAac,EAAAA,IAAC,KAAE,UAAWF,EAAAA,QAAO,SAAW,SAAAZ,EAAS,EAEpEW,EAAAA,KAAC,OAAI,UAAWC,UAAO,KAAM,MAAO,CAAE,oBAAqBsB,CAAA,EACxD,SAAA,CAAApC,EAAK,IAAI,CAAC4B,EAAOS,IAChBxB,OAACyB,EAAAA,SAAA,CACC,SAAA,CAAAzB,EAAAA,KAAC,OAAA,CAAK,UAAW,GAAGC,EAAAA,QAAO,KAAK,IAAIc,EAAM,SAAWd,EAAAA,QAAO,SAAW,EAAE,GACtE,SAAA,CAAAc,EAAM,QAAU,QACfZ,EAAAA,IAAC,OAAA,CAAK,UAAWF,EAAAA,QAAO,OAAQ,MAAO,CAAE,WAAYc,EAAM,KAAA,CAAM,CAAG,EAErEA,EAAM,KAAA,EACT,EAECC,EAAQ,IAAI,CAACU,EAAQC,IACpBxB,EAAAA,IAAC,OAAA,CAAK,UAAW,GAAGF,EAAAA,QAAO,KAAK,IAAIc,EAAM,SAAWd,EAAAA,QAAO,SAAW,EAAE,GACrE,UAAAyB,EAAO,QAAUE,EAAAA,gBAAgBb,EAAM,OAAOY,CAAM,GAAK,CAAC,CAAA,EADoBA,CAElF,CACD,EAEAV,SACE,OAAA,CAAK,UAAW,GAAGhB,EAAAA,QAAO,QAAQ,IAAIc,EAAM,SAAWd,EAAAA,QAAO,SAAW,EAAE,GACzE,SAAAoB,EAAkBD,EAASL,EAAM,OAAOG,CAAU,GAAK,EAAGC,CAAW,CAAC,CAAA,CACzE,CAAA,CAAA,EAjBWK,CAmBf,CACD,EAEApC,GACCY,EAAAA,KAAAyB,WAAA,CACE,SAAA,CAAAtB,EAAAA,IAAC,OAAA,CAAK,UAAWF,EAAAA,QAAO,IAAA,CAAM,EAC9BE,EAAAA,IAAC,OAAA,CAAK,UAAW,GAAGF,EAAAA,QAAO,KAAK,IAAIA,EAAAA,QAAO,UAAU,GAAK,SAAAV,CAAA,CAAW,EAEpEyB,EAAQ,IAAI,CAACU,EAAQC,IACpBxB,EAAAA,IAAC,OAAA,CAAK,UAAW,GAAGF,EAAAA,QAAO,KAAK,IAAIA,EAAAA,QAAO,UAAU,GAClD,SAAAyB,EAAO,QAAU,OACd,IACCA,EAAO,QAAUE,EAAAA,gBAChBtD,EAAUoD,EAAO,OAAS,MAAOvC,EAAK,IAAK4B,GAAUA,EAAM,OAAOY,CAAM,GAAK,CAAC,CAAC,CAAA,CACjF,EALwDA,CAM9D,CACD,EAEAV,GACCd,EAAAA,IAAC,OAAA,CAAK,UAAW,GAAGF,EAAAA,QAAO,QAAQ,IAAIA,EAAAA,QAAO,UAAU,GACrD,SAAAoB,EAAkBD,EAASD,EAAaA,CAAW,CAAC,CAAA,CACvD,CAAA,CAAA,CAEJ,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ"}
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: [
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTooltip.js","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":";;;;;AAuDA,MAAMA,IAAc,IAGdC,IAAS;AAEf,SAASC,EAAMC,GAA4B;AACzC,SAAOA,EAAQ,OAAO,CAACC,GAAOC,MAAUD,IAAQC,GAAO,CAAC;AAC1D;AAEA,SAASC,EAAUC,GAA6BJ,GAA4B;AAC1E,SAAI,OAAOI,KAAa,aACfA,EAASJ,CAAO,IAGrBI,MAAa,YACRJ,EAAQ,WAAW,IAAI,IAAID,EAAMC,CAAO,IAAIA,EAAQ,SAGtDD,EAAMC,CAAO;AACtB;AAMA,SAASK,EAAS,EAAE,GAAAC,GAAG,GAAAC,EAAA,GAAYC,GAAiBC,GAAuB;AACzE,QAAMC,IAAeJ,IAAIT,IAAcW,KAAW,OAAO,aAAaV,GAChEa,IAAaJ,IAAIV,IAAcY,KAAU,OAAO,cAAcX;AAEpE,SAAO;AAAA,IACL,GAAGY,IAAeJ,IAAIT,IAAc,KAAK,IAAIS,IAAIT,IAAcW,GAASV,CAAM;AAAA,IAC9E,GAAGa,IAAaJ,IAAIV,IAAc,KAAK,IAAIU,IAAIV,IAAcY,GAAQX,CAAM;AAAA,EAAA;AAE/E;AAUO,SAASc,EAAa;AAAA,EAC3B,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,YAAAC,IAAa;AACf,GAAsB;AACpB,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAuB,IAAI,GACrDC,IAAUH,MAAa,QAAQL,EAAK,SAAS;AAKnD,EAAAS,EAAU,MAAM;AACd,QAAI,CAACD;AACH;AAGF,UAAME,IAAW,MAAMJ,EAAY,IAAI;AAEvC,kBAAO,iBAAiB,UAAUI,GAAU,EAAI,GAChD,OAAO,iBAAiB,UAAUA,CAAQ,GAC1C,OAAO,iBAAiB,WAAWA,CAAQ,GAEpC,MAAM;AACX,aAAO,oBAAoB,UAAUA,GAAU,EAAI,GACnD,OAAO,oBAAoB,UAAUA,CAAQ,GAC7C,OAAO,oBAAoB,WAAWA,CAAQ;AAAA,IAChD;AAAA,EACF,GAAG,CAACF,CAAO,CAAC;AAEZ,QAAMG,IAAa,CAACC,MAClBN,EAAY,EAAE,GAAGM,EAAO,SAAS,GAAGA,EAAO,QAAA,CAAS;AAEtD,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAO;AAAA,MAClB,gBAAgB,MAAMR,EAAY,IAAI;AAAA,MACtC,eAAeK;AAAA,MAEd,UAAA;AAAA,QAAAd;AAAA,QAEAW,KACCO;AAAA,UACE,gBAAAC;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,SAAAnB;AAAA,cACA,UAAAC;AAAA,cACA,UAAAM;AAAA,cACA,MAAAL;AAAA,cACA,WAAAC;AAAA,cACA,UAAAC;AAAA,cACA,OAAAC;AAAA,cACA,YAAAC;AAAA,YAAA;AAAA,UAAA;AAAA,UAEF,SAAS;AAAA,QAAA;AAAA,MACX;AAAA,IAAA;AAAA,EAAA;AAGR;AAIA,SAASa,EAAM;AAAA,EACb,SAAAnB;AAAA,EACA,UAAAC;AAAA,EACA,UAAAM;AAAA,EACA,MAAAL;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,YAAAC;AACF,GAAe;AACb,QAAMc,IAAMC,EAAuB,IAAI,GACjC,CAACC,GAAQC,CAAS,IAAId,EAAS,EAAE,QAAQ,GAAG,SAAS,GAAG;AAG9D,EAAAe,EAAgB,MAAM;AACpB,UAAMC,IAAKL,EAAI;AAEf,QAAI,CAACK;AACH;AAGF,UAAM,EAAE,QAAAC,GAAQ,OAAAC,MAAUF,EAAG,sBAAA;AAE7B,KAAIC,MAAWJ,EAAO,UAAUK,MAAUL,EAAO,YAC/CC,EAAU,EAAE,QAAQG,GAAQ,SAASC,GAAO;AAAA,EAEhD,CAAC;AAED,QAAMC,IAAsB1B,EAAK,OAAO,CAAC2B,GAAOC,MAAU,KAAK,IAAID,GAAOC,EAAM,OAAO,MAAM,GAAG,CAAC,GAC3FC,IACJ/B,KAAW,MAAM,KAAK,EAAE,QAAQ4B,EAAA,GAAuB,OAAO,CAAA,EAAG,GAI7DI,IAAY/B,MAAa,UAAU8B,EAAQ,WAAW,IAAI,SAAY9B,KAAY,CAAA,GAClFgC,KAAaD,KAAA,gBAAAA,EAAW,WAAUD,EAAQ,SAAS,GACnDG,IAAcjD,EAAMiB,EAAK,IAAI,CAAC4B,MAAUA,EAAM,OAAOG,CAAU,KAAK,CAAC,CAAC,GACtEE,KAAWH,KAAA,gBAAAA,EAAW,aAAY,CAAC5C,GAAeD,MAAmBA,MAAU,IAAI,IAAIC,IAAQD,IAC/FiD,KAAoBJ,KAAA,gBAAAA,EAAW,YAAW,CAAC5C,MAAkBiD,EAAmBjD,GAAO,EAAE,eAAe,EAAA,CAAG,IAE3G,EAAE,GAAAI,GAAG,GAAAC,EAAA,IAAMF,EAASgB,GAAUe,EAAO,SAASA,EAAO,MAAM,GAC3DgB,IAAU,OAAO,QAAQ,OAAOP,EAAQ,UAAUC,IAAY,IAAI,EAAE,CAAC,GAAG,KAAA;AAE9E,SACE,gBAAAjB,EAAC,OAAA,EAAI,eAAY,QAAO,WAAWC,EAAO,SAAS,KAAAI,GAAU,OAAO,EAAE,MAAM5B,GAAG,KAAKC,KACjF,UAAA;AAAA,IAAAY,MAAU,UAAa,gBAAAa,EAAC,KAAA,EAAE,WAAWF,EAAO,OAAQ,UAAAX,GAAM;AAAA,IAC1DD,MAAa,UAAa,gBAAAc,EAAC,OAAE,WAAWF,EAAO,UAAW,UAAAZ,GAAS;AAAA,IAEpE,gBAAAW,EAAC,SAAI,WAAWC,EAAO,MAAM,OAAO,EAAE,qBAAqBsB,EAAA,GACxD,UAAA;AAAA,MAAApC,EAAK,IAAI,CAAC4B,GAAOS,MAChB,gBAAAxB,EAACyB,GAAA,EACC,UAAA;AAAA,QAAA,gBAAAzB,EAAC,QAAA,EAAK,WAAW,GAAGC,EAAO,KAAK,IAAIc,EAAM,WAAWd,EAAO,WAAW,EAAE,IACtE,UAAA;AAAA,UAAAc,EAAM,UAAU,UACf,gBAAAZ,EAAC,QAAA,EAAK,WAAWF,EAAO,QAAQ,OAAO,EAAE,YAAYc,EAAM,MAAA,EAAM,CAAG;AAAA,UAErEA,EAAM;AAAA,QAAA,GACT;AAAA,QAECC,EAAQ,IAAI,CAACU,GAAQC,MACpB,gBAAAxB,EAAC,QAAA,EAAK,WAAW,GAAGF,EAAO,KAAK,IAAIc,EAAM,WAAWd,EAAO,WAAW,EAAE,IACrE,WAAAyB,EAAO,UAAUE,GAAgBb,EAAM,OAAOY,CAAM,KAAK,CAAC,EAAA,GADoBA,CAElF,CACD;AAAA,QAEAV,uBACE,QAAA,EAAK,WAAW,GAAGhB,EAAO,QAAQ,IAAIc,EAAM,WAAWd,EAAO,WAAW,EAAE,IACzE,UAAAoB,EAAkBD,EAASL,EAAM,OAAOG,CAAU,KAAK,GAAGC,CAAW,CAAC,EAAA,CACzE;AAAA,MAAA,EAAA,GAjBWK,CAmBf,CACD;AAAA,MAEApC,KACC,gBAAAY,EAAAyB,GAAA,EACE,UAAA;AAAA,QAAA,gBAAAtB,EAAC,QAAA,EAAK,WAAWF,EAAO,KAAA,CAAM;AAAA,QAC9B,gBAAAE,EAAC,QAAA,EAAK,WAAW,GAAGF,EAAO,KAAK,IAAIA,EAAO,UAAU,IAAK,UAAAV,EAAA,CAAW;AAAA,QAEpEyB,EAAQ,IAAI,CAACU,GAAQC,MACpB,gBAAAxB,EAAC,QAAA,EAAK,WAAW,GAAGF,EAAO,KAAK,IAAIA,EAAO,UAAU,IAClD,UAAAyB,EAAO,UAAU,SACd,MACCA,EAAO,UAAUE;AAAA,UAChBtD,EAAUoD,EAAO,SAAS,OAAOvC,EAAK,IAAI,CAAC4B,MAAUA,EAAM,OAAOY,CAAM,KAAK,CAAC,CAAC;AAAA,QAAA,EACjF,GALwDA,CAM9D,CACD;AAAA,QAEAV,KACC,gBAAAd,EAAC,QAAA,EAAK,WAAW,GAAGF,EAAO,QAAQ,IAAIA,EAAO,UAAU,IACrD,UAAAoB,EAAkBD,EAASD,GAAaA,CAAW,CAAC,EAAA,CACvD;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"ChartTooltip.js","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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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),E=require("react"),S=require("d3-hierarchy"),m=require("./ChartTreemap.module.css.cjs"),W=require("../core/useChartMetrics.cjs"),z=require("../core/useSeriesToggle.cjs"),c=require("../palette/seriesColor.cjs"),G=require("../core/ChartFrame.cjs"),s=require("../core/spacing.cjs"),V=require("../../../utils/formatters/formatarNumero.cjs"),v=require("../core/measureText.cjs"),k=require("../core/cartesianLayout.cjs");function F(u){return Number.isFinite(u.value)?Math.max(u.value??0,0):0}function J({accent:u,defaultHiddenGroups:H,emptyMessage:y="Sem dados no período",formatValue:b=V.formatarNumero,gap:C=5,height:N=280,hiddenGroups:O,intentLabels:g,legend:A="bottom",legendAlign:L,nodes:i,onHiddenGroupsChange:q,showDataLabels:R=!0,title:j}){const{font:l,height:M,ref:B,width:d}=W.useChartMetrics(),{fillHeight:f,value:T}=k.chartHeight(N,M),{isHidden:h,toggle:D}=z.useSeriesToggle({defaultHiddenSeries:H,hiddenSeries:O,onHiddenSeriesChange:q}),_=E.useMemo(()=>c.resolveSeriesColors(i,{accent:u}),[u,i]),I=E.useMemo(()=>!((S.hierarchy({children:i,label:""}).sum(F).value??0)>0),[i]),$=E.useMemo(()=>{const e=i.filter(t=>!h(t.label));if(d===0||T===0||e.length===0)return[];const r=S.hierarchy({children:e,label:""}).sum(F).sort((t,n)=>(n.value??0)-(t.value??0));return S.treemap().size([d,T]).paddingInner(C).round(!0)(r).leaves()},[T,C,h,i,d]);function K(e){var t;const r=e.data;if(r.color)return r.color;if(r.intent)return c.INTENT_TOKENS[r.intent];const a=(t=e.ancestors().find(n=>n.depth===1))==null?void 0:t.data;return _[i.findIndex(n=>n.label===(a==null?void 0:a.label))]??c.INTENT_TOKENS.neutral}const w=g?Object.entries(g).map(([e,r])=>({color:c.INTENT_TOKENS[e],label:r})):i.map((e,r)=>({color:_[r],hidden:h(e.label),label:e.label}));return o.jsx(G.ChartFrame,{containerRef:B,empty:i.length===0||I,emptyMessage:y,fillHeight:f,height:T,legend:w,legendAlign:L,legendPosition:A,onToggleSeries:g?void 0:D,title:j,width:d,children:$.map(e=>{const r=e.x1-e.x0,a=e.y1-e.y0,t=r-s.CHART_LABEL_OFFSET*2,n=R&&t>0&&a>=l.lineHeight+s.CHART_LABEL_OFFSET,P=n&&a>=l.lineHeight*2+s.CHART_LABEL_OFFSET,p=`${e.data.label}: ${b(e.value??0)}`,x=K(e);return o.jsxs("g",{className:m.default.cell,children:[o.jsx("rect",{"aria-label":p,className:m.default.tile,fill:x,height:a,width:r,x:e.x0,y:e.y0,children:o.jsx("title",{children:p})}),n&&o.jsx("text",{className:m.default.label,fill:c.textColorOn(x),x:e.x0+s.CHART_LABEL_OFFSET,y:e.y0+s.CHART_LABEL_OFFSET+l.lineHeight*.6,children:v.truncateToWidth(e.data.label,l,t)}),P&&o.jsx("text",{className:m.default.value,fill:c.textColorOn(x),x:e.x0+s.CHART_LABEL_OFFSET,y:e.y0+s.CHART_LABEL_OFFSET+l.lineHeight*1.6,children:v.truncateToWidth(b(e.value??0),l,t)})]},`${e.data.label}-${e.x0}-${e.y0}`)})})}exports.ChartTreemap=J;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const l=require("react/jsx-runtime"),g=require("react"),F=require("d3-hierarchy"),x=require("./ChartTreemap.module.css.cjs"),X=require("../core/useChartMetrics.cjs"),Y=require("../core/useSeriesToggle.cjs"),o=require("../palette/seriesColor.cjs"),Z=require("../core/ChartFrame.cjs"),s=require("../core/spacing.cjs"),ee=require("../../../utils/formatters/formatarNumero.cjs"),H=require("../core/measureText.cjs"),te=require("../core/tooltips.cjs"),N=require("../core/hoverPath.cjs"),re=require("../core/cartesianLayout.cjs");function M(u){return Number.isFinite(u.value)?Math.max(u.value??0,0):0}function ie({accent:u,defaultHiddenGroups:R,emptyMessage:j="Sem dados no período",formatTooltipValue:B,formatValue:E=ee.formatarNumero,gap:v=5,height:f=280,hiddenGroups:D,intentLabels:p,legend:I="bottom",legendAlign:P,nodes:i,onHiddenGroupsChange:$,onHoverNode:d,showDataLabels:K=!0,showTooltip:_=!0,title:W}){const{font:c,height:w,ref:z,width:m}=X.useChartMetrics(),{fillHeight:G,value:T}=re.chartHeight(f,w),{isHidden:S,toggle:k}=Y.useSeriesToggle({defaultHiddenSeries:R,hiddenSeries:D,onHiddenSeriesChange:$}),y=g.useMemo(()=>o.resolveSeriesColors(i,{accent:u}),[u,i]),J=g.useMemo(()=>!((F.hierarchy({children:i,label:""}).sum(M).value??0)>0),[i]),O=g.useMemo(()=>{const e=i.filter(r=>!S(r.label));if(m===0||T===0||e.length===0)return[];const t=F.hierarchy({children:e,label:""}).sum(M).sort((r,a)=>(a.value??0)-(r.value??0));return F.treemap().size([m,T]).paddingInner(v).round(!0)(t).leaves()},[T,v,S,i,m]),[b,Q]=g.useState(null),h=b&&O.includes(b)?b:null;function L(e){Q(e),d==null||d(e&&N.hoverPath(e))}function q(e){var r;const t=e.data;if(t.color)return t.color;if(t.intent)return o.INTENT_TOKENS[t.intent];const n=(r=e.ancestors().find(a=>a.depth===1))==null?void 0:r.data;return y[i.findIndex(a=>a.label===(n==null?void 0:n.label))]??o.INTENT_TOKENS.neutral}const U=p?Object.entries(p).map(([e,t])=>({color:o.INTENT_TOKENS[e],label:t})):i.map((e,t)=>({color:y[t],hidden:S(e.label),label:e.label}));return l.jsx(Z.ChartFrame,{containerRef:z,empty:i.length===0||J,emptyMessage:j,fillHeight:G,height:T,legend:U,legendAlign:P,legendPosition:I,onToggleSeries:p?void 0:k,title:W,tooltip:_?te.pathTooltip({color:h?q(h):void 0,format:B??E,path:h&&N.hoverPath(h)}):void 0,width:m,children:O.map(e=>{const t=e.x1-e.x0,n=e.y1-e.y0,r=t-s.CHART_LABEL_OFFSET*2,a=K&&r>0&&n>=c.lineHeight+s.CHART_LABEL_OFFSET,V=a&&n>=c.lineHeight*2+s.CHART_LABEL_OFFSET,A=`${e.data.label}: ${E(e.value??0)}`,C=q(e);return l.jsxs("g",{className:x.default.cell,children:[l.jsx("rect",{"aria-label":A,className:x.default.tile,fill:C,height:n,width:t,onMouseEnter:()=>L(e),onMouseLeave:()=>L(null),x:e.x0,y:e.y0,children:!_&&!d&&l.jsx("title",{children:A})}),a&&l.jsx("text",{className:x.default.label,fill:o.textColorOn(C),x:e.x0+s.CHART_LABEL_OFFSET,y:e.y0+s.CHART_LABEL_OFFSET+c.lineHeight*.6,children:H.truncateToWidth(e.data.label,c,r)}),V&&l.jsx("text",{className:x.default.value,fill:o.textColorOn(C),x:e.x0+s.CHART_LABEL_OFFSET,y:e.y0+s.CHART_LABEL_OFFSET+c.lineHeight*1.6,children:H.truncateToWidth(E(e.value??0),c,r)})]},`${e.data.label}-${e.x0}-${e.y0}`)})})}exports.ChartTreemap=ie;
2
2
  //# sourceMappingURL=ChartTreemap.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChartTreemap.cjs","sources":["../../../../src/components/charts/ChartTreemap/ChartTreemap.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { hierarchy, treemap } from 'd3-hierarchy';\nimport {\n CHART_LABEL_OFFSET,\n ChartFrame,\n chartHeight,\n truncateToWidth,\n useChartMetrics,\n useSeriesToggle,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport {\n INTENT_TOKENS,\n resolveSeriesColors,\n textColorOn,\n type SeriesAppearance,\n type SeriesIntent,\n} from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartTreemap.module.css';\n\nexport interface ChartTreemapNode extends SeriesAppearance {\n children?: readonly ChartTreemapNode[];\n label: string;\n value?: number;\n}\n\nexport interface ChartTreemapProps {\n accent?: string;\n defaultHiddenGroups?: readonly string[];\n emptyMessage?: string;\n formatValue?: (value: number) => string;\n /** Folga entre dois retangulos vizinhos. */\n gap?: number;\n height?: ChartHeight;\n hiddenGroups?: readonly string[];\n /**\n * Nome de cada intencao na legenda. Informado, a legenda deixa de listar os\n * grupos e passa a nomear as cores: e o caso do mapa colorido por status,\n * onde o que a legenda explica e o significado da cor, nao a categoria.\n */\n intentLabels?: Partial<Record<SeriesIntent, string>>;\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n nodes: readonly ChartTreemapNode[];\n onHiddenGroupsChange?: (hidden: readonly string[]) => void;\n showDataLabels?: boolean;\n title: string;\n}\n\n\n/** Area que o no ocupa. Invalido ou negativo nao ocupa nada. */\nfunction ocupacao(no: ChartTreemapNode) {\n return Number.isFinite(no.value) ? Math.max(no.value ?? 0, 0) : 0;\n}\n\nexport function ChartTreemap({\n accent,\n defaultHiddenGroups,\n emptyMessage = 'Sem dados no período',\n formatValue = formatarNumero,\n gap = 5,\n height = 280,\n hiddenGroups,\n intentLabels,\n legend = 'bottom',\n legendAlign,\n nodes,\n onHiddenGroupsChange,\n showDataLabels = true,\n title,\n}: ChartTreemapProps) {\n const { font, height: alturaMedida, 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\n // A cor sai da lista inteira, e nao das visiveis: desligar um grupo nao pode\n // repintar os demais.\n const coresDeGrupo = useMemo(() => resolveSeriesColors(nodes, { accent }), [accent, nodes]);\n\n // Sem valor positivo nao ha area a repartir: anuncia vazio. Desligar todos os grupos, nao: a legenda e a volta.\n const semValor = useMemo(\n () => !((hierarchy<ChartTreemapNode>({ children: nodes, label: '' }).sum(ocupacao).value ?? 0) > 0),\n [nodes],\n );\n\n const retangulos = useMemo(() => {\n const visiveis = nodes.filter((grupo) => !isHidden(grupo.label));\n\n if (width === 0 || alturaDoDesenho === 0 || visiveis.length === 0) {\n return [];\n }\n\n const arvore = hierarchy<ChartTreemapNode>({ children: visiveis, label: '' })\n .sum(ocupacao)\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n const posicionar = treemap<ChartTreemapNode>()\n .size([width, alturaDoDesenho])\n .paddingInner(gap)\n .round(true);\n\n return posicionar(arvore).leaves();\n }, [alturaDoDesenho, gap, isHidden, nodes, width]);\n\n /** A folha herda a cor do grupo, e a intencao propria vence a herdada. */\n function corDa(folha: (typeof retangulos)[number]) {\n const proprio = folha.data;\n\n if (proprio.color) {\n return proprio.color;\n }\n\n if (proprio.intent) {\n return INTENT_TOKENS[proprio.intent];\n }\n\n const grupo = folha.ancestors().find((ancestral) => ancestral.depth === 1)?.data;\n\n return coresDeGrupo[nodes.findIndex((no) => no.label === grupo?.label)] ?? INTENT_TOKENS.neutral;\n }\n\n const entradasDaLegenda = intentLabels\n ? (Object.entries(intentLabels) as [SeriesIntent, string][]).map(([intencao, rotulo]) => ({\n color: INTENT_TOKENS[intencao],\n label: rotulo,\n }))\n : nodes.map((grupo, indice) => ({\n color: coresDeGrupo[indice],\n hidden: isHidden(grupo.label),\n label: grupo.label,\n }));\n\n return (\n <ChartFrame\n containerRef={ref}\n empty={nodes.length === 0 || semValor}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={entradasDaLegenda}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={intentLabels ? undefined : toggle}\n title={title}\n width={width}\n >\n {retangulos.map((folha) => {\n const largura = folha.x1 - folha.x0;\n const altura = folha.y1 - folha.y0;\n const disponivel = largura - CHART_LABEL_OFFSET * 2;\n const cabeORotulo = showDataLabels && disponivel > 0 && altura >= font.lineHeight + CHART_LABEL_OFFSET;\n const cabeOValor = cabeORotulo && altura >= font.lineHeight * 2 + CHART_LABEL_OFFSET;\n const descricao = `${folha.data.label}: ${formatValue(folha.value ?? 0)}`;\n const cor = corDa(folha);\n\n return (\n <g className={styles.cell} key={`${folha.data.label}-${folha.x0}-${folha.y0}`}>\n <rect\n aria-label={descricao}\n className={styles.tile}\n fill={cor}\n height={altura}\n width={largura}\n x={folha.x0}\n y={folha.y0}\n >\n <title>{descricao}</title>\n </rect>\n\n {cabeORotulo && (\n <text\n className={styles.label}\n fill={textColorOn(cor)}\n x={folha.x0 + CHART_LABEL_OFFSET}\n y={folha.y0 + CHART_LABEL_OFFSET + font.lineHeight * 0.6}\n >\n {truncateToWidth(folha.data.label, font, disponivel)}\n </text>\n )}\n\n {cabeOValor && (\n <text\n className={styles.value}\n fill={textColorOn(cor)}\n x={folha.x0 + CHART_LABEL_OFFSET}\n y={folha.y0 + CHART_LABEL_OFFSET + font.lineHeight * 1.6}\n >\n {truncateToWidth(formatValue(folha.value ?? 0), font, disponivel)}\n </text>\n )}\n </g>\n );\n })}\n </ChartFrame>\n );\n}\n"],"names":["ocupacao","no","ChartTreemap","accent","defaultHiddenGroups","emptyMessage","formatValue","formatarNumero","gap","height","hiddenGroups","intentLabels","legend","legendAlign","nodes","onHiddenGroupsChange","showDataLabels","title","font","alturaMedida","ref","width","useChartMetrics","fillHeight","alturaDoDesenho","chartHeight","isHidden","toggle","useSeriesToggle","coresDeGrupo","useMemo","resolveSeriesColors","semValor","hierarchy","retangulos","visiveis","grupo","arvore","a","b","treemap","corDa","folha","proprio","INTENT_TOKENS","_a","ancestral","entradasDaLegenda","intencao","rotulo","indice","jsx","ChartFrame","largura","altura","disponivel","CHART_LABEL_OFFSET","cabeORotulo","cabeOValor","descricao","cor","jsxs","styles","textColorOn","truncateToWidth"],"mappings":"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"}
1
+ {"version":3,"file":"ChartTreemap.cjs","sources":["../../../../src/components/charts/ChartTreemap/ChartTreemap.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { hierarchy, treemap } from 'd3-hierarchy';\nimport {\n CHART_LABEL_OFFSET,\n ChartFrame,\n chartHeight,\n hoverPath,\n pathTooltip,\n truncateToWidth,\n useChartMetrics,\n useSeriesToggle,\n type ChartHeight,\n type ChartHoveredNode,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport {\n INTENT_TOKENS,\n resolveSeriesColors,\n textColorOn,\n type SeriesAppearance,\n type SeriesIntent,\n} from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartTreemap.module.css';\n\nexport interface ChartTreemapNode extends SeriesAppearance {\n children?: readonly ChartTreemapNode[];\n label: string;\n value?: number;\n}\n\nexport interface ChartTreemapProps {\n accent?: string;\n defaultHiddenGroups?: readonly string[];\n emptyMessage?: 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 /** Folga entre dois retangulos vizinhos. */\n gap?: number;\n height?: ChartHeight;\n hiddenGroups?: readonly string[];\n /**\n * Nome de cada intencao na legenda. Informado, a legenda deixa de listar os\n * grupos e passa a nomear as cores: e o caso do mapa colorido por status,\n * onde o que a legenda explica e o significado da cor, nao a categoria.\n */\n intentLabels?: Partial<Record<SeriesIntent, string>>;\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n nodes: readonly ChartTreemapNode[];\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 showDataLabels?: 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\n\n/** Area que o no ocupa. Invalido ou negativo nao ocupa nada. */\nfunction ocupacao(no: ChartTreemapNode) {\n return Number.isFinite(no.value) ? Math.max(no.value ?? 0, 0) : 0;\n}\n\nexport function ChartTreemap({\n accent,\n defaultHiddenGroups,\n emptyMessage = 'Sem dados no período',\n formatTooltipValue,\n formatValue = formatarNumero,\n gap = 5,\n height = 280,\n hiddenGroups,\n intentLabels,\n legend = 'bottom',\n legendAlign,\n nodes,\n onHiddenGroupsChange,\n onHoverNode,\n showDataLabels = true,\n showTooltip = true,\n title,\n}: ChartTreemapProps) {\n const { font, height: alturaMedida, 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\n // A cor sai da lista inteira, e nao das visiveis: desligar um grupo nao pode\n // repintar os demais.\n const coresDeGrupo = useMemo(() => resolveSeriesColors(nodes, { accent }), [accent, nodes]);\n\n // Sem valor positivo nao ha area a repartir: anuncia vazio. Desligar todos os grupos, nao: a legenda e a volta.\n const semValor = useMemo(\n () => !((hierarchy<ChartTreemapNode>({ children: nodes, label: '' }).sum(ocupacao).value ?? 0) > 0),\n [nodes],\n );\n\n const retangulos = useMemo(() => {\n const visiveis = nodes.filter((grupo) => !isHidden(grupo.label));\n\n if (width === 0 || alturaDoDesenho === 0 || visiveis.length === 0) {\n return [];\n }\n\n const arvore = hierarchy<ChartTreemapNode>({ children: visiveis, label: '' })\n .sum(ocupacao)\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n const posicionar = treemap<ChartTreemapNode>()\n .size([width, alturaDoDesenho])\n .paddingInner(gap)\n .round(true);\n\n return posicionar(arvore).leaves();\n }, [alturaDoDesenho, gap, isHidden, nodes, width]);\n\n const [emFoco, setEmFoco] = useState<(typeof retangulos)[number] | null>(null);\n // A folha guardada deixa de existir quando o mapa e remontado; sem conferir, o balao falaria de um no que saiu.\n const foco = emFoco && retangulos.includes(emFoco) ? emFoco : null;\n\n function focar(folha: (typeof retangulos)[number] | null) {\n setEmFoco(folha);\n onHoverNode?.(folha && hoverPath(folha));\n }\n\n /** A folha herda a cor do grupo, e a intencao propria vence a herdada. */\n function corDa(folha: (typeof retangulos)[number]) {\n const proprio = folha.data;\n\n if (proprio.color) {\n return proprio.color;\n }\n\n if (proprio.intent) {\n return INTENT_TOKENS[proprio.intent];\n }\n\n const grupo = folha.ancestors().find((ancestral) => ancestral.depth === 1)?.data;\n\n return coresDeGrupo[nodes.findIndex((no) => no.label === grupo?.label)] ?? INTENT_TOKENS.neutral;\n }\n\n const entradasDaLegenda = intentLabels\n ? (Object.entries(intentLabels) as [SeriesIntent, string][]).map(([intencao, rotulo]) => ({\n color: INTENT_TOKENS[intencao],\n label: rotulo,\n }))\n : nodes.map((grupo, indice) => ({\n color: coresDeGrupo[indice],\n hidden: isHidden(grupo.label),\n label: grupo.label,\n }));\n\n return (\n <ChartFrame\n containerRef={ref}\n empty={nodes.length === 0 || semValor}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={entradasDaLegenda}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={intentLabels ? undefined : toggle}\n title={title}\n tooltip={\n showTooltip\n ? pathTooltip({ color: foco ? corDa(foco) : undefined, format: formatTooltipValue ?? formatValue, path: foco && hoverPath(foco) })\n : undefined\n }\n width={width}\n >\n {retangulos.map((folha) => {\n const largura = folha.x1 - folha.x0;\n const altura = folha.y1 - folha.y0;\n const disponivel = largura - CHART_LABEL_OFFSET * 2;\n const cabeORotulo = showDataLabels && disponivel > 0 && altura >= font.lineHeight + CHART_LABEL_OFFSET;\n const cabeOValor = cabeORotulo && altura >= font.lineHeight * 2 + CHART_LABEL_OFFSET;\n const descricao = `${folha.data.label}: ${formatValue(folha.value ?? 0)}`;\n const cor = corDa(folha);\n\n return (\n <g className={styles.cell} key={`${folha.data.label}-${folha.x0}-${folha.y0}`}>\n <rect\n aria-label={descricao}\n className={styles.tile}\n fill={cor}\n height={altura}\n width={largura}\n onMouseEnter={() => focar(folha)}\n onMouseLeave={() => focar(null)}\n x={folha.x0}\n y={folha.y0}\n >\n {!showTooltip && !onHoverNode && <title>{descricao}</title>}\n </rect>\n\n {cabeORotulo && (\n <text\n className={styles.label}\n fill={textColorOn(cor)}\n x={folha.x0 + CHART_LABEL_OFFSET}\n y={folha.y0 + CHART_LABEL_OFFSET + font.lineHeight * 0.6}\n >\n {truncateToWidth(folha.data.label, font, disponivel)}\n </text>\n )}\n\n {cabeOValor && (\n <text\n className={styles.value}\n fill={textColorOn(cor)}\n x={folha.x0 + CHART_LABEL_OFFSET}\n y={folha.y0 + CHART_LABEL_OFFSET + font.lineHeight * 1.6}\n >\n {truncateToWidth(formatValue(folha.value ?? 0), font, disponivel)}\n </text>\n )}\n </g>\n );\n })}\n </ChartFrame>\n );\n}\n"],"names":["ocupacao","no","ChartTreemap","accent","defaultHiddenGroups","emptyMessage","formatTooltipValue","formatValue","formatarNumero","gap","height","hiddenGroups","intentLabels","legend","legendAlign","nodes","onHiddenGroupsChange","onHoverNode","showDataLabels","showTooltip","title","font","alturaMedida","ref","width","useChartMetrics","fillHeight","alturaDoDesenho","chartHeight","isHidden","toggle","useSeriesToggle","coresDeGrupo","useMemo","resolveSeriesColors","semValor","hierarchy","retangulos","visiveis","grupo","arvore","a","b","treemap","emFoco","setEmFoco","useState","foco","focar","folha","hoverPath","corDa","proprio","INTENT_TOKENS","_a","ancestral","entradasDaLegenda","intencao","rotulo","indice","jsx","ChartFrame","pathTooltip","largura","altura","disponivel","CHART_LABEL_OFFSET","cabeORotulo","cabeOValor","descricao","cor","jsxs","styles","textColorOn","truncateToWidth"],"mappings":"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"}