@plenustech/design-system 0.2.1 → 0.2.2

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 (594) hide show
  1. package/dist/components/actions/Button/Button.cjs +2 -0
  2. package/dist/components/actions/Button/Button.cjs.map +1 -0
  3. package/dist/components/actions/Button/Button.js +47 -0
  4. package/dist/components/actions/Button/Button.js.map +1 -0
  5. package/dist/components/actions/Button/Button.module.css.cjs +2 -0
  6. package/dist/components/actions/Button/Button.module.css.cjs.map +1 -0
  7. package/dist/components/actions/Button/Button.module.css.js +24 -0
  8. package/dist/components/actions/Button/Button.module.css.js.map +1 -0
  9. package/dist/components/actions/ButtonIcon/ButtonIcon.cjs +2 -0
  10. package/dist/components/actions/ButtonIcon/ButtonIcon.cjs.map +1 -0
  11. package/dist/components/actions/ButtonIcon/ButtonIcon.js +21 -0
  12. package/dist/components/actions/ButtonIcon/ButtonIcon.js.map +1 -0
  13. package/dist/components/actions/ButtonIcon/ButtonIcon.module.css.cjs +2 -0
  14. package/dist/components/actions/ButtonIcon/ButtonIcon.module.css.cjs.map +1 -0
  15. package/dist/components/actions/ButtonIcon/ButtonIcon.module.css.js +14 -0
  16. package/dist/components/actions/ButtonIcon/ButtonIcon.module.css.js.map +1 -0
  17. package/dist/components/charts/ChartArea/ChartArea.cjs +2 -0
  18. package/dist/components/charts/ChartArea/ChartArea.cjs.map +1 -0
  19. package/dist/components/charts/ChartArea/ChartArea.js +205 -0
  20. package/dist/components/charts/ChartArea/ChartArea.js.map +1 -0
  21. package/dist/components/charts/ChartArea/ChartArea.module.css.cjs +2 -0
  22. package/dist/components/charts/ChartArea/ChartArea.module.css.cjs.map +1 -0
  23. package/dist/components/charts/ChartArea/ChartArea.module.css.js +18 -0
  24. package/dist/components/charts/ChartArea/ChartArea.module.css.js.map +1 -0
  25. package/dist/components/charts/ChartBar/ChartBar.cjs +2 -0
  26. package/dist/components/charts/ChartBar/ChartBar.cjs.map +1 -0
  27. package/dist/components/charts/ChartBar/ChartBar.js +216 -0
  28. package/dist/components/charts/ChartBar/ChartBar.js.map +1 -0
  29. package/dist/components/charts/ChartBar/ChartBar.module.css.cjs +2 -0
  30. package/dist/components/charts/ChartBar/ChartBar.module.css.cjs.map +1 -0
  31. package/dist/components/charts/ChartBar/ChartBar.module.css.js +14 -0
  32. package/dist/components/charts/ChartBar/ChartBar.module.css.js.map +1 -0
  33. package/dist/components/charts/ChartCombo/ChartCombo.cjs +2 -0
  34. package/dist/components/charts/ChartCombo/ChartCombo.cjs.map +1 -0
  35. package/dist/components/charts/ChartCombo/ChartCombo.js +248 -0
  36. package/dist/components/charts/ChartCombo/ChartCombo.js.map +1 -0
  37. package/dist/components/charts/ChartCombo/ChartCombo.module.css.cjs +2 -0
  38. package/dist/components/charts/ChartCombo/ChartCombo.module.css.cjs.map +1 -0
  39. package/dist/components/charts/ChartCombo/ChartCombo.module.css.js +20 -0
  40. package/dist/components/charts/ChartCombo/ChartCombo.module.css.js.map +1 -0
  41. package/dist/components/charts/ChartDonut/ChartDonut.cjs +2 -0
  42. package/dist/components/charts/ChartDonut/ChartDonut.cjs.map +1 -0
  43. package/dist/components/charts/ChartDonut/ChartDonut.js +107 -0
  44. package/dist/components/charts/ChartDonut/ChartDonut.js.map +1 -0
  45. package/dist/components/charts/ChartDonut/ChartDonut.module.css.cjs +2 -0
  46. package/dist/components/charts/ChartDonut/ChartDonut.module.css.cjs.map +1 -0
  47. package/dist/components/charts/ChartDonut/ChartDonut.module.css.js +14 -0
  48. package/dist/components/charts/ChartDonut/ChartDonut.module.css.js.map +1 -0
  49. package/dist/components/charts/ChartLine/ChartLine.cjs +2 -0
  50. package/dist/components/charts/ChartLine/ChartLine.cjs.map +1 -0
  51. package/dist/components/charts/ChartLine/ChartLine.js +166 -0
  52. package/dist/components/charts/ChartLine/ChartLine.js.map +1 -0
  53. package/dist/components/charts/ChartLine/ChartLine.module.css.cjs +2 -0
  54. package/dist/components/charts/ChartLine/ChartLine.module.css.cjs.map +1 -0
  55. package/dist/components/charts/ChartLine/ChartLine.module.css.js +18 -0
  56. package/dist/components/charts/ChartLine/ChartLine.module.css.js.map +1 -0
  57. package/dist/components/charts/ChartPie/ChartPie.cjs +2 -0
  58. package/dist/components/charts/ChartPie/ChartPie.cjs.map +1 -0
  59. package/dist/components/charts/ChartPie/ChartPie.js +99 -0
  60. package/dist/components/charts/ChartPie/ChartPie.js.map +1 -0
  61. package/dist/components/charts/ChartPie/ChartPie.module.css.cjs +2 -0
  62. package/dist/components/charts/ChartPie/ChartPie.module.css.cjs.map +1 -0
  63. package/dist/components/charts/ChartPie/ChartPie.module.css.js +10 -0
  64. package/dist/components/charts/ChartPie/ChartPie.module.css.js.map +1 -0
  65. package/dist/components/charts/ChartRadial/ChartRadial.cjs +2 -0
  66. package/dist/components/charts/ChartRadial/ChartRadial.cjs.map +1 -0
  67. package/dist/components/charts/ChartRadial/ChartRadial.js +121 -0
  68. package/dist/components/charts/ChartRadial/ChartRadial.js.map +1 -0
  69. package/dist/components/charts/ChartRadial/ChartRadial.module.css.cjs +2 -0
  70. package/dist/components/charts/ChartRadial/ChartRadial.module.css.cjs.map +1 -0
  71. package/dist/components/charts/ChartRadial/ChartRadial.module.css.js +16 -0
  72. package/dist/components/charts/ChartRadial/ChartRadial.module.css.js.map +1 -0
  73. package/dist/components/charts/ChartSankey/ChartSankey.cjs +2 -0
  74. package/dist/components/charts/ChartSankey/ChartSankey.cjs.map +1 -0
  75. package/dist/components/charts/ChartSankey/ChartSankey.js +209 -0
  76. package/dist/components/charts/ChartSankey/ChartSankey.js.map +1 -0
  77. package/dist/components/charts/ChartSankey/ChartSankey.module.css.cjs +2 -0
  78. package/dist/components/charts/ChartSankey/ChartSankey.module.css.cjs.map +1 -0
  79. package/dist/components/charts/ChartSankey/ChartSankey.module.css.js +22 -0
  80. package/dist/components/charts/ChartSankey/ChartSankey.module.css.js.map +1 -0
  81. package/dist/components/charts/ChartScatter/ChartScatter.cjs +2 -0
  82. package/dist/components/charts/ChartScatter/ChartScatter.cjs.map +1 -0
  83. package/dist/components/charts/ChartScatter/ChartScatter.js +137 -0
  84. package/dist/components/charts/ChartScatter/ChartScatter.js.map +1 -0
  85. package/dist/components/charts/ChartScatter/ChartScatter.module.css.cjs +2 -0
  86. package/dist/components/charts/ChartScatter/ChartScatter.module.css.cjs.map +1 -0
  87. package/dist/components/charts/ChartScatter/ChartScatter.module.css.js +14 -0
  88. package/dist/components/charts/ChartScatter/ChartScatter.module.css.js.map +1 -0
  89. package/dist/components/charts/ChartSunburst/ChartSunburst.cjs +2 -0
  90. package/dist/components/charts/ChartSunburst/ChartSunburst.cjs.map +1 -0
  91. package/dist/components/charts/ChartSunburst/ChartSunburst.js +144 -0
  92. package/dist/components/charts/ChartSunburst/ChartSunburst.js.map +1 -0
  93. package/dist/components/charts/ChartSunburst/ChartSunburst.module.css.cjs +2 -0
  94. package/dist/components/charts/ChartSunburst/ChartSunburst.module.css.cjs.map +1 -0
  95. package/dist/components/charts/ChartSunburst/ChartSunburst.module.css.js +16 -0
  96. package/dist/components/charts/ChartSunburst/ChartSunburst.module.css.js.map +1 -0
  97. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs +2 -0
  98. package/dist/components/charts/ChartTooltip/ChartTooltip.cjs.map +1 -0
  99. package/dist/components/charts/ChartTooltip/ChartTooltip.js +113 -0
  100. package/dist/components/charts/ChartTooltip/ChartTooltip.js.map +1 -0
  101. package/dist/components/charts/ChartTooltip/ChartTooltip.module.css.cjs +2 -0
  102. package/dist/components/charts/ChartTooltip/ChartTooltip.module.css.cjs.map +1 -0
  103. package/dist/components/charts/ChartTooltip/ChartTooltip.module.css.js +32 -0
  104. package/dist/components/charts/ChartTooltip/ChartTooltip.module.css.js.map +1 -0
  105. package/dist/components/charts/ChartTreemap/ChartTreemap.cjs +2 -0
  106. package/dist/components/charts/ChartTreemap/ChartTreemap.cjs.map +1 -0
  107. package/dist/components/charts/ChartTreemap/ChartTreemap.js +122 -0
  108. package/dist/components/charts/ChartTreemap/ChartTreemap.js.map +1 -0
  109. package/dist/components/charts/ChartTreemap/ChartTreemap.module.css.cjs +2 -0
  110. package/dist/components/charts/ChartTreemap/ChartTreemap.module.css.cjs.map +1 -0
  111. package/dist/components/charts/ChartTreemap/ChartTreemap.module.css.js +14 -0
  112. package/dist/components/charts/ChartTreemap/ChartTreemap.module.css.js.map +1 -0
  113. package/dist/components/charts/ChartWaterfall/ChartWaterfall.cjs +2 -0
  114. package/dist/components/charts/ChartWaterfall/ChartWaterfall.cjs.map +1 -0
  115. package/dist/components/charts/ChartWaterfall/ChartWaterfall.js +168 -0
  116. package/dist/components/charts/ChartWaterfall/ChartWaterfall.js.map +1 -0
  117. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.cjs +2 -0
  118. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.cjs.map +1 -0
  119. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.js +12 -0
  120. package/dist/components/charts/ChartWaterfall/ChartWaterfall.module.css.js.map +1 -0
  121. package/dist/components/charts/core/Axis.cjs +2 -0
  122. package/dist/components/charts/core/Axis.cjs.map +1 -0
  123. package/dist/components/charts/core/Axis.js +40 -0
  124. package/dist/components/charts/core/Axis.js.map +1 -0
  125. package/dist/components/charts/core/BandCursor.cjs +2 -0
  126. package/dist/components/charts/core/BandCursor.cjs.map +1 -0
  127. package/dist/components/charts/core/BandCursor.js +19 -0
  128. package/dist/components/charts/core/BandCursor.js.map +1 -0
  129. package/dist/components/charts/core/CartesianFrame.cjs +2 -0
  130. package/dist/components/charts/core/CartesianFrame.cjs.map +1 -0
  131. package/dist/components/charts/core/CartesianFrame.js +120 -0
  132. package/dist/components/charts/core/CartesianFrame.js.map +1 -0
  133. package/dist/components/charts/core/Chart.module.css.cjs +2 -0
  134. package/dist/components/charts/core/Chart.module.css.cjs.map +1 -0
  135. package/dist/components/charts/core/Chart.module.css.js +68 -0
  136. package/dist/components/charts/core/Chart.module.css.js.map +1 -0
  137. package/dist/components/charts/core/ChartFrame.cjs +2 -0
  138. package/dist/components/charts/core/ChartFrame.cjs.map +1 -0
  139. package/dist/components/charts/core/ChartFrame.js +65 -0
  140. package/dist/components/charts/core/ChartFrame.js.map +1 -0
  141. package/dist/components/charts/core/ChartLegend.cjs +2 -0
  142. package/dist/components/charts/core/ChartLegend.cjs.map +1 -0
  143. package/dist/components/charts/core/ChartLegend.js +44 -0
  144. package/dist/components/charts/core/ChartLegend.js.map +1 -0
  145. package/dist/components/charts/core/Grid.cjs +2 -0
  146. package/dist/components/charts/core/Grid.cjs.map +1 -0
  147. package/dist/components/charts/core/Grid.js +20 -0
  148. package/dist/components/charts/core/Grid.js.map +1 -0
  149. package/dist/components/charts/core/arcs.cjs +2 -0
  150. package/dist/components/charts/core/arcs.cjs.map +1 -0
  151. package/dist/components/charts/core/arcs.js +26 -0
  152. package/dist/components/charts/core/arcs.js.map +1 -0
  153. package/dist/components/charts/core/cartesianLayout.cjs +2 -0
  154. package/dist/components/charts/core/cartesianLayout.cjs.map +1 -0
  155. package/dist/components/charts/core/cartesianLayout.js +59 -0
  156. package/dist/components/charts/core/cartesianLayout.js.map +1 -0
  157. package/dist/components/charts/core/centerText.cjs +2 -0
  158. package/dist/components/charts/core/centerText.cjs.map +1 -0
  159. package/dist/components/charts/core/centerText.js +31 -0
  160. package/dist/components/charts/core/centerText.js.map +1 -0
  161. package/dist/components/charts/core/measureText.cjs +2 -0
  162. package/dist/components/charts/core/measureText.cjs.map +1 -0
  163. package/dist/components/charts/core/measureText.js +55 -0
  164. package/dist/components/charts/core/measureText.js.map +1 -0
  165. package/dist/components/charts/core/shapes.cjs +2 -0
  166. package/dist/components/charts/core/shapes.cjs.map +1 -0
  167. package/dist/components/charts/core/shapes.js +31 -0
  168. package/dist/components/charts/core/shapes.js.map +1 -0
  169. package/dist/components/charts/core/slices.cjs +2 -0
  170. package/dist/components/charts/core/slices.cjs.map +1 -0
  171. package/dist/components/charts/core/slices.js +22 -0
  172. package/dist/components/charts/core/slices.js.map +1 -0
  173. package/dist/components/charts/core/spacing.cjs +2 -0
  174. package/dist/components/charts/core/spacing.cjs.map +1 -0
  175. package/dist/components/charts/core/spacing.js +26 -0
  176. package/dist/components/charts/core/spacing.js.map +1 -0
  177. package/dist/components/charts/core/useChartMetrics.cjs +2 -0
  178. package/dist/components/charts/core/useChartMetrics.cjs.map +1 -0
  179. package/dist/components/charts/core/useChartMetrics.js +39 -0
  180. package/dist/components/charts/core/useChartMetrics.js.map +1 -0
  181. package/dist/components/charts/core/useHoveredBand.cjs +2 -0
  182. package/dist/components/charts/core/useHoveredBand.cjs.map +1 -0
  183. package/dist/components/charts/core/useHoveredBand.js +14 -0
  184. package/dist/components/charts/core/useHoveredBand.js.map +1 -0
  185. package/dist/components/charts/core/useSeriesToggle.cjs +2 -0
  186. package/dist/components/charts/core/useSeriesToggle.cjs.map +1 -0
  187. package/dist/components/charts/core/useSeriesToggle.js +22 -0
  188. package/dist/components/charts/core/useSeriesToggle.js.map +1 -0
  189. package/dist/components/charts/core/useSliceRing.cjs +2 -0
  190. package/dist/components/charts/core/useSliceRing.cjs.map +1 -0
  191. package/dist/components/charts/core/useSliceRing.js +55 -0
  192. package/dist/components/charts/core/useSliceRing.js.map +1 -0
  193. package/dist/components/charts/core/useTweenedNumbers.cjs +2 -0
  194. package/dist/components/charts/core/useTweenedNumbers.cjs.map +1 -0
  195. package/dist/components/charts/core/useTweenedNumbers.js +31 -0
  196. package/dist/components/charts/core/useTweenedNumbers.js.map +1 -0
  197. package/dist/components/charts/palette/palette.cjs +2 -0
  198. package/dist/components/charts/palette/palette.cjs.map +1 -0
  199. package/dist/components/charts/palette/palette.js +26 -0
  200. package/dist/components/charts/palette/palette.js.map +1 -0
  201. package/dist/components/charts/palette/seriesColor.cjs +2 -0
  202. package/dist/components/charts/palette/seriesColor.cjs.map +1 -0
  203. package/dist/components/charts/palette/seriesColor.js +43 -0
  204. package/dist/components/charts/palette/seriesColor.js.map +1 -0
  205. package/dist/components/charts/scales/scales.cjs +2 -0
  206. package/dist/components/charts/scales/scales.cjs.map +1 -0
  207. package/dist/components/charts/scales/scales.js +74 -0
  208. package/dist/components/charts/scales/scales.js.map +1 -0
  209. package/dist/components/data-display/Accordion/Accordion.cjs +2 -0
  210. package/dist/components/data-display/Accordion/Accordion.cjs.map +1 -0
  211. package/dist/components/data-display/Accordion/Accordion.js +91 -0
  212. package/dist/components/data-display/Accordion/Accordion.js.map +1 -0
  213. package/dist/components/data-display/Accordion/Accordion.module.css.cjs +2 -0
  214. package/dist/components/data-display/Accordion/Accordion.module.css.cjs.map +1 -0
  215. package/dist/components/data-display/Accordion/Accordion.module.css.js +26 -0
  216. package/dist/components/data-display/Accordion/Accordion.module.css.js.map +1 -0
  217. package/dist/components/data-display/Avatar/Avatar.cjs +2 -0
  218. package/dist/components/data-display/Avatar/Avatar.cjs.map +1 -0
  219. package/dist/components/data-display/Avatar/Avatar.js +20 -0
  220. package/dist/components/data-display/Avatar/Avatar.js.map +1 -0
  221. package/dist/components/data-display/Avatar/Avatar.module.css.cjs +2 -0
  222. package/dist/components/data-display/Avatar/Avatar.module.css.cjs.map +1 -0
  223. package/dist/components/data-display/Avatar/Avatar.module.css.js +14 -0
  224. package/dist/components/data-display/Avatar/Avatar.module.css.js.map +1 -0
  225. package/dist/components/data-display/Badge/Badge.cjs +2 -0
  226. package/dist/components/data-display/Badge/Badge.cjs.map +1 -0
  227. package/dist/components/data-display/Badge/Badge.js +13 -0
  228. package/dist/components/data-display/Badge/Badge.js.map +1 -0
  229. package/dist/components/data-display/Badge/Badge.module.css.cjs +2 -0
  230. package/dist/components/data-display/Badge/Badge.module.css.cjs.map +1 -0
  231. package/dist/components/data-display/Badge/Badge.module.css.js +22 -0
  232. package/dist/components/data-display/Badge/Badge.module.css.js.map +1 -0
  233. package/dist/components/data-display/Card/Card.cjs +2 -0
  234. package/dist/components/data-display/Card/Card.cjs.map +1 -0
  235. package/dist/components/data-display/Card/Card.js +51 -0
  236. package/dist/components/data-display/Card/Card.js.map +1 -0
  237. package/dist/components/data-display/Card/Card.module.css.cjs +2 -0
  238. package/dist/components/data-display/Card/Card.module.css.cjs.map +1 -0
  239. package/dist/components/data-display/Card/Card.module.css.js +26 -0
  240. package/dist/components/data-display/Card/Card.module.css.js.map +1 -0
  241. package/dist/components/data-display/CodeBlock/CodeBlock.cjs +2 -0
  242. package/dist/components/data-display/CodeBlock/CodeBlock.cjs.map +1 -0
  243. package/dist/components/data-display/CodeBlock/CodeBlock.js +65 -0
  244. package/dist/components/data-display/CodeBlock/CodeBlock.js.map +1 -0
  245. package/dist/components/data-display/CodeBlock/CodeBlock.module.css.cjs +2 -0
  246. package/dist/components/data-display/CodeBlock/CodeBlock.module.css.cjs.map +1 -0
  247. package/dist/components/data-display/CodeBlock/CodeBlock.module.css.js +47 -0
  248. package/dist/components/data-display/CodeBlock/CodeBlock.module.css.js.map +1 -0
  249. package/dist/components/data-display/CodeBlock/syntax.cjs +24 -0
  250. package/dist/components/data-display/CodeBlock/syntax.cjs.map +1 -0
  251. package/dist/components/data-display/CodeBlock/syntax.js +124 -0
  252. package/dist/components/data-display/CodeBlock/syntax.js.map +1 -0
  253. package/dist/components/data-display/List/List.cjs +2 -0
  254. package/dist/components/data-display/List/List.cjs.map +1 -0
  255. package/dist/components/data-display/List/List.js +99 -0
  256. package/dist/components/data-display/List/List.js.map +1 -0
  257. package/dist/components/data-display/List/List.module.css.cjs +2 -0
  258. package/dist/components/data-display/List/List.module.css.cjs.map +1 -0
  259. package/dist/components/data-display/List/List.module.css.js +32 -0
  260. package/dist/components/data-display/List/List.module.css.js.map +1 -0
  261. package/dist/components/data-display/List/ListingOptions.cjs +2 -0
  262. package/dist/components/data-display/List/ListingOptions.cjs.map +1 -0
  263. package/dist/components/data-display/List/ListingOptions.js +115 -0
  264. package/dist/components/data-display/List/ListingOptions.js.map +1 -0
  265. package/dist/components/data-display/List/useListing.cjs +2 -0
  266. package/dist/components/data-display/List/useListing.cjs.map +1 -0
  267. package/dist/components/data-display/List/useListing.js +85 -0
  268. package/dist/components/data-display/List/useListing.js.map +1 -0
  269. package/dist/components/data-display/List/useVirtualWindow.cjs +2 -0
  270. package/dist/components/data-display/List/useVirtualWindow.cjs.map +1 -0
  271. package/dist/components/data-display/List/useVirtualWindow.js +58 -0
  272. package/dist/components/data-display/List/useVirtualWindow.js.map +1 -0
  273. package/dist/components/data-display/Table/Table.cjs +2 -0
  274. package/dist/components/data-display/Table/Table.cjs.map +1 -0
  275. package/dist/components/data-display/Table/Table.js +238 -0
  276. package/dist/components/data-display/Table/Table.js.map +1 -0
  277. package/dist/components/data-display/Table/Table.module.css.cjs +2 -0
  278. package/dist/components/data-display/Table/Table.module.css.cjs.map +1 -0
  279. package/dist/components/data-display/Table/Table.module.css.js +69 -0
  280. package/dist/components/data-display/Table/Table.module.css.js.map +1 -0
  281. package/dist/components/feedback/Alert/Alert.cjs +2 -0
  282. package/dist/components/feedback/Alert/Alert.cjs.map +1 -0
  283. package/dist/components/feedback/Alert/Alert.js +13 -0
  284. package/dist/components/feedback/Alert/Alert.js.map +1 -0
  285. package/dist/components/feedback/Alert/Alert.module.css.cjs +2 -0
  286. package/dist/components/feedback/Alert/Alert.module.css.cjs.map +1 -0
  287. package/dist/components/feedback/Alert/Alert.module.css.js +20 -0
  288. package/dist/components/feedback/Alert/Alert.module.css.js.map +1 -0
  289. package/dist/components/feedback/EmptyState/EmptyState.cjs +2 -0
  290. package/dist/components/feedback/EmptyState/EmptyState.cjs.map +1 -0
  291. package/dist/components/feedback/EmptyState/EmptyState.js +49 -0
  292. package/dist/components/feedback/EmptyState/EmptyState.js.map +1 -0
  293. package/dist/components/feedback/EmptyState/EmptyState.module.css.cjs +2 -0
  294. package/dist/components/feedback/EmptyState/EmptyState.module.css.cjs.map +1 -0
  295. package/dist/components/feedback/EmptyState/EmptyState.module.css.js +36 -0
  296. package/dist/components/feedback/EmptyState/EmptyState.module.css.js.map +1 -0
  297. package/dist/components/feedback/Progress/Progress.cjs +2 -0
  298. package/dist/components/feedback/Progress/Progress.cjs.map +1 -0
  299. package/dist/components/feedback/Progress/Progress.js +34 -0
  300. package/dist/components/feedback/Progress/Progress.js.map +1 -0
  301. package/dist/components/feedback/Progress/Progress.module.css.cjs +2 -0
  302. package/dist/components/feedback/Progress/Progress.module.css.cjs.map +1 -0
  303. package/dist/components/feedback/Progress/Progress.module.css.js +21 -0
  304. package/dist/components/feedback/Progress/Progress.module.css.js.map +1 -0
  305. package/dist/components/feedback/Spinner/Spinner.cjs +2 -0
  306. package/dist/components/feedback/Spinner/Spinner.cjs.map +1 -0
  307. package/dist/components/feedback/Spinner/Spinner.js +10 -0
  308. package/dist/components/feedback/Spinner/Spinner.js.map +1 -0
  309. package/dist/components/feedback/Spinner/Spinner.module.css.cjs +2 -0
  310. package/dist/components/feedback/Spinner/Spinner.module.css.cjs.map +1 -0
  311. package/dist/components/feedback/Spinner/Spinner.module.css.js +15 -0
  312. package/dist/components/feedback/Spinner/Spinner.module.css.js.map +1 -0
  313. package/dist/components/forms/Checkbox/Checkbox.cjs +2 -0
  314. package/dist/components/forms/Checkbox/Checkbox.cjs.map +1 -0
  315. package/dist/components/forms/Checkbox/Checkbox.js +45 -0
  316. package/dist/components/forms/Checkbox/Checkbox.js.map +1 -0
  317. package/dist/components/forms/Checkbox/Checkbox.module.css.cjs +2 -0
  318. package/dist/components/forms/Checkbox/Checkbox.module.css.cjs.map +1 -0
  319. package/dist/components/forms/Checkbox/Checkbox.module.css.js +20 -0
  320. package/dist/components/forms/Checkbox/Checkbox.module.css.js.map +1 -0
  321. package/dist/components/forms/ComboBox/ComboBox.cjs +3 -0
  322. package/dist/components/forms/ComboBox/ComboBox.cjs.map +1 -0
  323. package/dist/components/forms/ComboBox/ComboBox.js +223 -0
  324. package/dist/components/forms/ComboBox/ComboBox.js.map +1 -0
  325. package/dist/components/forms/ComboBox/ComboBox.module.css.cjs +2 -0
  326. package/dist/components/forms/ComboBox/ComboBox.module.css.cjs.map +1 -0
  327. package/dist/components/forms/ComboBox/ComboBox.module.css.js +28 -0
  328. package/dist/components/forms/ComboBox/ComboBox.module.css.js.map +1 -0
  329. package/dist/components/forms/DatePicker/Calendar.cjs +2 -0
  330. package/dist/components/forms/DatePicker/Calendar.cjs.map +1 -0
  331. package/dist/components/forms/DatePicker/Calendar.js +86 -0
  332. package/dist/components/forms/DatePicker/Calendar.js.map +1 -0
  333. package/dist/components/forms/DatePicker/DatePicker.cjs +2 -0
  334. package/dist/components/forms/DatePicker/DatePicker.cjs.map +1 -0
  335. package/dist/components/forms/DatePicker/DatePicker.js +217 -0
  336. package/dist/components/forms/DatePicker/DatePicker.js.map +1 -0
  337. package/dist/components/forms/DatePicker/DatePicker.module.css.cjs +2 -0
  338. package/dist/components/forms/DatePicker/DatePicker.module.css.cjs.map +1 -0
  339. package/dist/components/forms/DatePicker/DatePicker.module.css.js +44 -0
  340. package/dist/components/forms/DatePicker/DatePicker.module.css.js.map +1 -0
  341. package/dist/components/forms/DatePicker/iso.cjs +2 -0
  342. package/dist/components/forms/DatePicker/iso.cjs.map +1 -0
  343. package/dist/components/forms/DatePicker/iso.js +18 -0
  344. package/dist/components/forms/DatePicker/iso.js.map +1 -0
  345. package/dist/components/forms/DateTimePicker/DateTimePicker.cjs +2 -0
  346. package/dist/components/forms/DateTimePicker/DateTimePicker.cjs.map +1 -0
  347. package/dist/components/forms/DateTimePicker/DateTimePicker.js +241 -0
  348. package/dist/components/forms/DateTimePicker/DateTimePicker.js.map +1 -0
  349. package/dist/components/forms/DateTimePicker/DateTimePicker.module.css.cjs +2 -0
  350. package/dist/components/forms/DateTimePicker/DateTimePicker.module.css.cjs.map +1 -0
  351. package/dist/components/forms/DateTimePicker/DateTimePicker.module.css.js +26 -0
  352. package/dist/components/forms/DateTimePicker/DateTimePicker.module.css.js.map +1 -0
  353. package/dist/components/forms/Field/Field.cjs +2 -0
  354. package/dist/components/forms/Field/Field.cjs.map +1 -0
  355. package/dist/components/forms/Field/Field.js +34 -0
  356. package/dist/components/forms/Field/Field.js.map +1 -0
  357. package/dist/components/forms/Field/Field.module.css.cjs +2 -0
  358. package/dist/components/forms/Field/Field.module.css.cjs.map +1 -0
  359. package/dist/components/forms/Field/Field.module.css.js +16 -0
  360. package/dist/components/forms/Field/Field.module.css.js.map +1 -0
  361. package/dist/components/forms/Field/FormValue.cjs +2 -0
  362. package/dist/components/forms/Field/FormValue.cjs.map +1 -0
  363. package/dist/components/forms/Field/FormValue.js +24 -0
  364. package/dist/components/forms/Field/FormValue.js.map +1 -0
  365. package/dist/components/forms/InputCurrency/InputCurrency.cjs +2 -0
  366. package/dist/components/forms/InputCurrency/InputCurrency.cjs.map +1 -0
  367. package/dist/components/forms/InputCurrency/InputCurrency.js +41 -0
  368. package/dist/components/forms/InputCurrency/InputCurrency.js.map +1 -0
  369. package/dist/components/forms/InputNumber/InputNumber.cjs +2 -0
  370. package/dist/components/forms/InputNumber/InputNumber.cjs.map +1 -0
  371. package/dist/components/forms/InputNumber/InputNumber.js +39 -0
  372. package/dist/components/forms/InputNumber/InputNumber.js.map +1 -0
  373. package/dist/components/forms/InputPassword/InputPassword.cjs +2 -0
  374. package/dist/components/forms/InputPassword/InputPassword.cjs.map +1 -0
  375. package/dist/components/forms/InputPassword/InputPassword.js +110 -0
  376. package/dist/components/forms/InputPassword/InputPassword.js.map +1 -0
  377. package/dist/components/forms/InputPassword/InputPassword.module.css.cjs +2 -0
  378. package/dist/components/forms/InputPassword/InputPassword.module.css.cjs.map +1 -0
  379. package/dist/components/forms/InputPassword/InputPassword.module.css.js +18 -0
  380. package/dist/components/forms/InputPassword/InputPassword.module.css.js.map +1 -0
  381. package/dist/components/forms/InputText/InputText.cjs +2 -0
  382. package/dist/components/forms/InputText/InputText.cjs.map +1 -0
  383. package/dist/components/forms/InputText/InputText.js +62 -0
  384. package/dist/components/forms/InputText/InputText.js.map +1 -0
  385. package/dist/components/forms/InputText/InputText.module.css.cjs +2 -0
  386. package/dist/components/forms/InputText/InputText.module.css.cjs.map +1 -0
  387. package/dist/components/forms/InputText/InputText.module.css.js +14 -0
  388. package/dist/components/forms/InputText/InputText.module.css.js.map +1 -0
  389. package/dist/components/forms/Label/Label.cjs +2 -0
  390. package/dist/components/forms/Label/Label.cjs.map +1 -0
  391. package/dist/components/forms/Label/Label.js +13 -0
  392. package/dist/components/forms/Label/Label.js.map +1 -0
  393. package/dist/components/forms/Label/Label.module.css.cjs +2 -0
  394. package/dist/components/forms/Label/Label.module.css.cjs.map +1 -0
  395. package/dist/components/forms/Label/Label.module.css.js +10 -0
  396. package/dist/components/forms/Label/Label.module.css.js.map +1 -0
  397. package/dist/components/forms/RadioGroup/Radio.cjs +2 -0
  398. package/dist/components/forms/RadioGroup/Radio.cjs.map +1 -0
  399. package/dist/components/forms/RadioGroup/Radio.js +43 -0
  400. package/dist/components/forms/RadioGroup/Radio.js.map +1 -0
  401. package/dist/components/forms/RadioGroup/RadioGroup.cjs +2 -0
  402. package/dist/components/forms/RadioGroup/RadioGroup.cjs.map +1 -0
  403. package/dist/components/forms/RadioGroup/RadioGroup.js +58 -0
  404. package/dist/components/forms/RadioGroup/RadioGroup.js.map +1 -0
  405. package/dist/components/forms/RadioGroup/RadioGroup.module.css.cjs +2 -0
  406. package/dist/components/forms/RadioGroup/RadioGroup.module.css.cjs.map +1 -0
  407. package/dist/components/forms/RadioGroup/RadioGroup.module.css.js +26 -0
  408. package/dist/components/forms/RadioGroup/RadioGroup.module.css.js.map +1 -0
  409. package/dist/components/forms/Select/Select.cjs +2 -0
  410. package/dist/components/forms/Select/Select.cjs.map +1 -0
  411. package/dist/components/forms/Select/Select.js +191 -0
  412. package/dist/components/forms/Select/Select.js.map +1 -0
  413. package/dist/components/forms/Select/Select.module.css.cjs +2 -0
  414. package/dist/components/forms/Select/Select.module.css.cjs.map +1 -0
  415. package/dist/components/forms/Select/Select.module.css.js +22 -0
  416. package/dist/components/forms/Select/Select.module.css.js.map +1 -0
  417. package/dist/components/forms/Switch/Switch.cjs +2 -0
  418. package/dist/components/forms/Switch/Switch.cjs.map +1 -0
  419. package/dist/components/forms/Switch/Switch.js +39 -0
  420. package/dist/components/forms/Switch/Switch.js.map +1 -0
  421. package/dist/components/forms/Switch/Switch.module.css.cjs +2 -0
  422. package/dist/components/forms/Switch/Switch.module.css.cjs.map +1 -0
  423. package/dist/components/forms/Switch/Switch.module.css.js +20 -0
  424. package/dist/components/forms/Switch/Switch.module.css.js.map +1 -0
  425. package/dist/components/forms/Textarea/Textarea.cjs +2 -0
  426. package/dist/components/forms/Textarea/Textarea.cjs.map +1 -0
  427. package/dist/components/forms/Textarea/Textarea.js +64 -0
  428. package/dist/components/forms/Textarea/Textarea.js.map +1 -0
  429. package/dist/components/forms/Textarea/Textarea.module.css.cjs +2 -0
  430. package/dist/components/forms/Textarea/Textarea.module.css.cjs.map +1 -0
  431. package/dist/components/forms/Textarea/Textarea.module.css.js +14 -0
  432. package/dist/components/forms/Textarea/Textarea.module.css.js.map +1 -0
  433. package/dist/components/forms/TimePicker/TimePicker.cjs +2 -0
  434. package/dist/components/forms/TimePicker/TimePicker.cjs.map +1 -0
  435. package/dist/components/forms/TimePicker/TimePicker.js +176 -0
  436. package/dist/components/forms/TimePicker/TimePicker.js.map +1 -0
  437. package/dist/components/forms/TimePicker/TimePicker.module.css.cjs +2 -0
  438. package/dist/components/forms/TimePicker/TimePicker.module.css.cjs.map +1 -0
  439. package/dist/components/forms/TimePicker/TimePicker.module.css.js +26 -0
  440. package/dist/components/forms/TimePicker/TimePicker.module.css.js.map +1 -0
  441. package/dist/components/forms/TimePicker/TimeSlots.cjs +2 -0
  442. package/dist/components/forms/TimePicker/TimeSlots.cjs.map +1 -0
  443. package/dist/components/forms/TimePicker/TimeSlots.js +81 -0
  444. package/dist/components/forms/TimePicker/TimeSlots.js.map +1 -0
  445. package/dist/components/icons/Icon.cjs +2 -0
  446. package/dist/components/icons/Icon.cjs.map +1 -0
  447. package/dist/components/icons/Icon.js +24 -0
  448. package/dist/components/icons/Icon.js.map +1 -0
  449. package/dist/components/icons/icons.cjs +2 -0
  450. package/dist/components/icons/icons.cjs.map +1 -0
  451. package/dist/components/icons/icons.js +116 -0
  452. package/dist/components/icons/icons.js.map +1 -0
  453. package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs +2 -0
  454. package/dist/components/navigation/Breadcrumb/Breadcrumb.cjs.map +1 -0
  455. package/dist/components/navigation/Breadcrumb/Breadcrumb.js +22 -0
  456. package/dist/components/navigation/Breadcrumb/Breadcrumb.js.map +1 -0
  457. package/dist/components/navigation/Breadcrumb/Breadcrumb.module.css.cjs +2 -0
  458. package/dist/components/navigation/Breadcrumb/Breadcrumb.module.css.cjs.map +1 -0
  459. package/dist/components/navigation/Breadcrumb/Breadcrumb.module.css.js +16 -0
  460. package/dist/components/navigation/Breadcrumb/Breadcrumb.module.css.js.map +1 -0
  461. package/dist/components/navigation/Pagination/Pagination.cjs +2 -0
  462. package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -0
  463. package/dist/components/navigation/Pagination/Pagination.js +70 -0
  464. package/dist/components/navigation/Pagination/Pagination.js.map +1 -0
  465. package/dist/components/navigation/Pagination/Pagination.module.css.cjs +2 -0
  466. package/dist/components/navigation/Pagination/Pagination.module.css.cjs.map +1 -0
  467. package/dist/components/navigation/Pagination/Pagination.module.css.js +18 -0
  468. package/dist/components/navigation/Pagination/Pagination.module.css.js.map +1 -0
  469. package/dist/components/navigation/Tabs/Tabs.cjs +2 -0
  470. package/dist/components/navigation/Tabs/Tabs.cjs.map +1 -0
  471. package/dist/components/navigation/Tabs/Tabs.js +96 -0
  472. package/dist/components/navigation/Tabs/Tabs.js.map +1 -0
  473. package/dist/components/navigation/Tabs/Tabs.module.css.cjs +2 -0
  474. package/dist/components/navigation/Tabs/Tabs.module.css.cjs.map +1 -0
  475. package/dist/components/navigation/Tabs/Tabs.module.css.js +20 -0
  476. package/dist/components/navigation/Tabs/Tabs.module.css.js.map +1 -0
  477. package/dist/components/overlays/Dialog/Dialog.cjs +2 -0
  478. package/dist/components/overlays/Dialog/Dialog.cjs.map +1 -0
  479. package/dist/components/overlays/Dialog/Dialog.js +64 -0
  480. package/dist/components/overlays/Dialog/Dialog.js.map +1 -0
  481. package/dist/components/overlays/Dialog/Dialog.module.css.cjs +2 -0
  482. package/dist/components/overlays/Dialog/Dialog.module.css.cjs.map +1 -0
  483. package/dist/components/overlays/Dialog/Dialog.module.css.js +36 -0
  484. package/dist/components/overlays/Dialog/Dialog.module.css.js.map +1 -0
  485. package/dist/components/overlays/Menu/Menu.cjs +2 -0
  486. package/dist/components/overlays/Menu/Menu.cjs.map +1 -0
  487. package/dist/components/overlays/Menu/Menu.js +137 -0
  488. package/dist/components/overlays/Menu/Menu.js.map +1 -0
  489. package/dist/components/overlays/Menu/Menu.module.css.cjs +2 -0
  490. package/dist/components/overlays/Menu/Menu.module.css.cjs.map +1 -0
  491. package/dist/components/overlays/Menu/Menu.module.css.js +10 -0
  492. package/dist/components/overlays/Menu/Menu.module.css.js.map +1 -0
  493. package/dist/components/overlays/Popover/Popover.cjs +2 -0
  494. package/dist/components/overlays/Popover/Popover.cjs.map +1 -0
  495. package/dist/components/overlays/Popover/Popover.js +59 -0
  496. package/dist/components/overlays/Popover/Popover.js.map +1 -0
  497. package/dist/components/overlays/Popover/Popover.module.css.cjs +2 -0
  498. package/dist/components/overlays/Popover/Popover.module.css.cjs.map +1 -0
  499. package/dist/components/overlays/Popover/Popover.module.css.js +8 -0
  500. package/dist/components/overlays/Popover/Popover.module.css.js.map +1 -0
  501. package/dist/components/overlays/Tooltip/Tooltip.cjs +2 -0
  502. package/dist/components/overlays/Tooltip/Tooltip.cjs.map +1 -0
  503. package/dist/components/overlays/Tooltip/Tooltip.js +84 -0
  504. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -0
  505. package/dist/components/overlays/Tooltip/Tooltip.module.css.cjs +2 -0
  506. package/dist/components/overlays/Tooltip/Tooltip.module.css.cjs.map +1 -0
  507. package/dist/components/overlays/Tooltip/Tooltip.module.css.js +8 -0
  508. package/dist/components/overlays/Tooltip/Tooltip.module.css.js.map +1 -0
  509. package/dist/design-system.css +1 -1
  510. package/dist/hooks/useCalendar/calendar.cjs +2 -0
  511. package/dist/hooks/useCalendar/calendar.cjs.map +1 -0
  512. package/dist/hooks/useCalendar/calendar.js +56 -0
  513. package/dist/hooks/useCalendar/calendar.js.map +1 -0
  514. package/dist/hooks/useCalendar/useCalendar.cjs +2 -0
  515. package/dist/hooks/useCalendar/useCalendar.cjs.map +1 -0
  516. package/dist/hooks/useCalendar/useCalendar.js +48 -0
  517. package/dist/hooks/useCalendar/useCalendar.js.map +1 -0
  518. package/dist/hooks/useCharacterCount/useCharacterCount.cjs +2 -0
  519. package/dist/hooks/useCharacterCount/useCharacterCount.cjs.map +1 -0
  520. package/dist/hooks/useCharacterCount/useCharacterCount.js +27 -0
  521. package/dist/hooks/useCharacterCount/useCharacterCount.js.map +1 -0
  522. package/dist/hooks/useDecimalInput.cjs +2 -0
  523. package/dist/hooks/useDecimalInput.cjs.map +1 -0
  524. package/dist/hooks/useDecimalInput.js +17 -0
  525. package/dist/hooks/useDecimalInput.js.map +1 -0
  526. package/dist/hooks/useFormReset.cjs +2 -0
  527. package/dist/hooks/useFormReset.cjs.map +1 -0
  528. package/dist/hooks/useFormReset.js +16 -0
  529. package/dist/hooks/useFormReset.js.map +1 -0
  530. package/dist/hooks/useMergedRefs.cjs +2 -0
  531. package/dist/hooks/useMergedRefs.cjs.map +1 -0
  532. package/dist/hooks/useMergedRefs.js +24 -0
  533. package/dist/hooks/useMergedRefs.js.map +1 -0
  534. package/dist/hooks/useSelection/selection.cjs +2 -0
  535. package/dist/hooks/useSelection/selection.cjs.map +1 -0
  536. package/dist/hooks/useSelection/selection.js +78 -0
  537. package/dist/hooks/useSelection/selection.js.map +1 -0
  538. package/dist/hooks/useSelection/useSelection.cjs +2 -0
  539. package/dist/hooks/useSelection/useSelection.cjs.map +1 -0
  540. package/dist/hooks/useSelection/useSelection.js +68 -0
  541. package/dist/hooks/useSelection/useSelection.js.map +1 -0
  542. package/dist/index.cjs +2 -0
  543. package/dist/index.cjs.map +1 -0
  544. package/dist/index.js +131 -0
  545. package/dist/index.js.map +1 -0
  546. package/dist/types/components/actions/ButtonIcon/ButtonIcon.d.ts +12 -0
  547. package/dist/types/components/actions/ButtonIcon/index.d.ts +2 -0
  548. package/dist/types/components/data-display/CodeBlock/CodeBlock.d.ts +16 -0
  549. package/dist/types/components/data-display/CodeBlock/index.d.ts +3 -0
  550. package/dist/types/components/data-display/CodeBlock/syntax.d.ts +15 -0
  551. package/dist/types/components/data-display/Table/Table.d.ts +4 -2
  552. package/dist/types/components/feedback/EmptyState/EmptyState.d.ts +14 -0
  553. package/dist/types/components/feedback/EmptyState/index.d.ts +2 -0
  554. package/dist/types/components/icons/icons.d.ts +2 -0
  555. package/dist/types/components/icons/index.d.ts +1 -1
  556. package/dist/types/components/overlays/Dialog/Dialog.d.ts +2 -0
  557. package/dist/types/index.d.ts +7 -1
  558. package/dist/utils/formatters/formatarData.cjs +2 -0
  559. package/dist/utils/formatters/formatarData.cjs.map +1 -0
  560. package/dist/utils/formatters/formatarData.js +32 -0
  561. package/dist/utils/formatters/formatarData.js.map +1 -0
  562. package/dist/utils/formatters/formatarEntradaData.cjs +2 -0
  563. package/dist/utils/formatters/formatarEntradaData.cjs.map +1 -0
  564. package/dist/utils/formatters/formatarEntradaData.js +22 -0
  565. package/dist/utils/formatters/formatarEntradaData.js.map +1 -0
  566. package/dist/utils/formatters/formatarEntradaDecimal.cjs +2 -0
  567. package/dist/utils/formatters/formatarEntradaDecimal.cjs.map +1 -0
  568. package/dist/utils/formatters/formatarEntradaDecimal.js +35 -0
  569. package/dist/utils/formatters/formatarEntradaDecimal.js.map +1 -0
  570. package/dist/utils/formatters/formatarEntradaHora.cjs +2 -0
  571. package/dist/utils/formatters/formatarEntradaHora.cjs.map +1 -0
  572. package/dist/utils/formatters/formatarEntradaHora.js +32 -0
  573. package/dist/utils/formatters/formatarEntradaHora.js.map +1 -0
  574. package/dist/utils/formatters/formatarEntradaMonetaria.cjs +2 -0
  575. package/dist/utils/formatters/formatarEntradaMonetaria.cjs.map +1 -0
  576. package/dist/utils/formatters/formatarEntradaMonetaria.js +17 -0
  577. package/dist/utils/formatters/formatarEntradaMonetaria.js.map +1 -0
  578. package/dist/utils/formatters/formatarNumero.cjs +2 -0
  579. package/dist/utils/formatters/formatarNumero.cjs.map +1 -0
  580. package/dist/utils/formatters/formatarNumero.js +28 -0
  581. package/dist/utils/formatters/formatarNumero.js.map +1 -0
  582. package/dist/utils/formatters/mascararPartes.cjs +2 -0
  583. package/dist/utils/formatters/mascararPartes.cjs.map +1 -0
  584. package/dist/utils/formatters/mascararPartes.js +17 -0
  585. package/dist/utils/formatters/mascararPartes.js.map +1 -0
  586. package/dist/utils/textSearch/textSearch.cjs +2 -0
  587. package/dist/utils/textSearch/textSearch.cjs.map +1 -0
  588. package/dist/utils/textSearch/textSearch.js +22 -0
  589. package/dist/utils/textSearch/textSearch.js.map +1 -0
  590. package/package.json +5 -5
  591. package/dist/plenus-design-system.cjs +0 -3
  592. package/dist/plenus-design-system.cjs.map +0 -1
  593. package/dist/plenus-design-system.es.js +0 -6387
  594. package/dist/plenus-design-system.es.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"plenus-design-system.es.js","sources":["../src/components/icons/Icon.tsx","../src/components/icons/icons.tsx","../src/components/feedback/Spinner/Spinner.tsx","../src/components/actions/Button/Button.tsx","../src/components/forms/Label/Label.tsx","../src/components/forms/Field/Field.tsx","../src/hooks/useCharacterCount/useCharacterCount.ts","../src/hooks/useMergedRefs.ts","../src/components/forms/InputText/InputText.tsx","../src/utils/formatters/formatarEntradaDecimal.ts","../src/utils/formatters/formatarEntradaMonetaria.ts","../src/utils/formatters/formatarData.ts","../src/utils/formatters/formatarNumero.ts","../src/utils/formatters/mascararPartes.ts","../src/utils/formatters/formatarEntradaData.ts","../src/utils/formatters/formatarEntradaHora.ts","../src/hooks/useFormReset.ts","../src/hooks/useDecimalInput.ts","../src/components/forms/InputNumber/InputNumber.tsx","../src/components/forms/InputPassword/InputPassword.tsx","../src/components/forms/InputCurrency/InputCurrency.tsx","../src/components/forms/Textarea/Textarea.tsx","../src/components/forms/Checkbox/Checkbox.tsx","../src/components/forms/RadioGroup/RadioGroup.tsx","../src/components/forms/RadioGroup/Radio.tsx","../src/components/forms/Switch/Switch.tsx","../src/components/feedback/Alert/Alert.tsx","../src/components/feedback/Progress/Progress.tsx","../src/components/overlays/Popover/Popover.tsx","../src/utils/textSearch/textSearch.ts","../src/hooks/useSelection/selection.ts","../src/hooks/useSelection/useSelection.ts","../src/components/navigation/Tabs/Tabs.tsx","../src/components/navigation/Breadcrumb/Breadcrumb.tsx","../src/components/navigation/Pagination/Pagination.tsx","../src/components/data-display/Accordion/Accordion.tsx","../src/components/data-display/List/useVirtualWindow.ts","../src/components/data-display/List/ListingOptions.tsx","../src/components/data-display/List/useListing.ts","../src/components/forms/Field/FormValue.tsx","../src/components/forms/Select/Select.tsx","../src/components/data-display/Badge/Badge.tsx","../src/components/forms/ComboBox/ComboBox.tsx","../src/components/overlays/Menu/Menu.tsx","../src/components/overlays/Tooltip/Tooltip.tsx","../src/components/overlays/Dialog/Dialog.tsx","../src/components/data-display/Avatar/Avatar.tsx","../src/components/data-display/List/List.tsx","../src/components/data-display/Card/Card.tsx","../src/components/data-display/Table/Table.tsx","../src/hooks/useCalendar/calendar.ts","../src/hooks/useCalendar/useCalendar.ts","../src/components/forms/DatePicker/Calendar.tsx","../src/components/forms/DatePicker/iso.ts","../src/components/forms/DatePicker/DatePicker.tsx","../src/components/forms/TimePicker/TimeSlots.tsx","../src/components/forms/TimePicker/TimePicker.tsx","../src/components/forms/DateTimePicker/DateTimePicker.tsx","../src/components/charts/core/BandCursor.tsx","../src/components/charts/core/spacing.ts","../src/components/charts/core/Axis.tsx","../src/components/charts/core/Grid.tsx","../src/components/charts/core/measureText.ts","../src/components/charts/scales/scales.ts","../src/components/charts/core/cartesianLayout.ts","../src/components/charts/core/arcs.ts","../src/components/charts/core/centerText.ts","../src/components/charts/core/ChartLegend.tsx","../src/components/charts/core/ChartFrame.tsx","../src/components/charts/core/CartesianFrame.tsx","../src/components/charts/core/shapes.ts","../src/components/charts/core/slices.ts","../src/components/charts/core/useChartMetrics.ts","../src/components/charts/core/useHoveredBand.ts","../src/components/charts/core/useSeriesToggle.ts","../src/components/charts/palette/palette.ts","../src/components/charts/palette/seriesColor.ts","../src/components/charts/core/useTweenedNumbers.ts","../src/components/charts/core/useSliceRing.ts","../src/components/charts/ChartBar/ChartBar.tsx","../src/components/charts/ChartLine/ChartLine.tsx","../src/components/charts/ChartTooltip/ChartTooltip.tsx","../src/components/charts/ChartCombo/ChartCombo.tsx","../src/components/charts/ChartArea/ChartArea.tsx","../src/components/charts/ChartScatter/ChartScatter.tsx","../src/components/charts/ChartPie/ChartPie.tsx","../src/components/charts/ChartDonut/ChartDonut.tsx","../src/components/charts/ChartRadial/ChartRadial.tsx","../src/components/charts/ChartWaterfall/ChartWaterfall.tsx","../src/components/charts/ChartTreemap/ChartTreemap.tsx","../src/components/charts/ChartSunburst/ChartSunburst.tsx","../src/components/charts/ChartSankey/ChartSankey.tsx"],"sourcesContent":["import type { ReactNode, SVGProps } from 'react';\n\nexport interface IconProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n /**\n * Nome acessivel. Sem ele o icone e decorativo e sai da arvore de\n * acessibilidade — que e o caso sempre que houver texto ao lado dizendo a\n * mesma coisa.\n */\n label?: string;\n /** Sem medida declarada, o icone acompanha o tamanho do texto ao redor. */\n size?: number | string;\n}\n\ninterface DesenhoProps extends IconProps {\n children: ReactNode;\n}\n\n/**\n * Base dos icones do Design System. **Interna**: ela fecha o conjunto, para que\n * a aplicacao use a biblioteca oficial em vez de desenhar o proprio caminho,\n * conforme `ARCHITECTURE.md` secao 12.\n *\n * A cor vem de `currentColor`, entao o icone herda a cor do texto em que esta.\n */\nexport function Icon({ children, label, size = '1em', ...props }: DesenhoProps) {\n const nome = label ?? props['aria-label'];\n\n return (\n <svg\n aria-hidden={nome ? undefined : true}\n aria-label={nome}\n fill=\"currentColor\"\n focusable=\"false\"\n height={size}\n role={nome ? 'img' : undefined}\n viewBox=\"0 0 16 16\"\n width={size}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n {children}\n </svg>\n );\n}\n","import { Icon, type IconProps } from './Icon';\n\n/*\n * Caminhos do Bootstrap Icons, sob licenca MIT — Copyright (c) 2019-2024 The\n * Bootstrap Authors. Copiados os de que o projeto precisa, em vez de adicionar\n * o pacote inteiro: sao dois mil icones para resolver uma duzia, e o mandamento\n * 13 pesa contra a dependencia nesse caso.\n *\n * Onde existe variante preenchida e ela le bem no tamanho de interface, e a\n * preenchida que vale. As setas e os chevrons nao tem variante: ja sao caminhos\n * cheios.\n */\n\nexport function IconArrowDown(props: IconProps) {\n return (\n <Icon {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M8 1a.5.5 0 0 1 .5.5v11.793l3.146-3.147a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 .708-.708L7.5 13.293V1.5A.5.5 0 0 1 8 1\"\n />\n </Icon>\n );\n}\n\nexport function IconArrowUp(props: IconProps) {\n return (\n <Icon {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M8 15a.5.5 0 0 0 .5-.5V2.707l3.146 3.147a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 1 0 .708.708L7.5 2.707V14.5a.5.5 0 0 0 .5.5\"\n />\n </Icon>\n );\n}\n\nexport function IconCalendar(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V5h16V4H0V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5\" />\n </Icon>\n );\n}\n\nexport function IconChevronDown(props: IconProps) {\n return (\n <Icon {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708\"\n />\n </Icon>\n );\n}\n\nexport function IconChevronExpand(props: IconProps) {\n return (\n <Icon {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M3.646 9.146a.5.5 0 0 1 .708 0L8 12.793l3.646-3.647a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 0-.708m0-2.292a.5.5 0 0 0 .708 0L8 3.207l3.646 3.647a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 0 0 0 .708\"\n />\n </Icon>\n );\n}\n\nexport function IconChevronLeft(props: IconProps) {\n return (\n <Icon {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0\"\n />\n </Icon>\n );\n}\n\nexport function IconChevronRight(props: IconProps) {\n return (\n <Icon {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708\"\n />\n </Icon>\n );\n}\n\nexport function IconChevronUp(props: IconProps) {\n return (\n <Icon {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M7.646 4.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1-.708.708L8 5.707l-5.646 5.647a.5.5 0 0 1-.708-.708z\"\n />\n </Icon>\n );\n}\n\nexport function IconClock(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8 3.5a.5.5 0 0 0-1 0V9a.5.5 0 0 0 .252.434l3.5 2a.5.5 0 0 0 .496-.868L8 8.71z\" />\n </Icon>\n );\n}\n\nexport function IconClose(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.146 2.854a.5.5 0 1 1 .708-.708L8 7.293l5.146-5.147a.5.5 0 0 1 .708.708L8.707 8l5.147 5.146a.5.5 0 0 1-.708.708L8 8.707l-5.146 5.147a.5.5 0 0 1-.708-.708L7.293 8z\" />\n </Icon>\n );\n}\n\nexport function IconMinusCircle(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\" />\n <path d=\"M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8\" />\n </Icon>\n );\n}\n\nexport function IconPlusCircle(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\" />\n <path d=\"M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4\" />\n </Icon>\n );\n}\n\nexport function IconQuestionCircle(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14m0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16\" />\n <path d=\"M5.255 5.786a.237.237 0 0 0 .241.247h.825c.138 0 .248-.113.266-.25.09-.656.54-1.134 1.342-1.134.686 0 1.314.343 1.314 1.168 0 .635-.374.927-.965 1.371-.673.489-1.206 1.06-1.168 1.987l.003.217a.25.25 0 0 0 .25.246h.811a.25.25 0 0 0 .25-.25v-.105c0-.718.273-.927 1.01-1.486.609-.463 1.244-.977 1.244-2.056 0-1.511-1.276-2.241-2.673-2.241-1.267 0-2.655.59-2.75 2.286m1.557 5.763c0 .533.425.927 1.01.927.609 0 1.028-.394 1.028-.927 0-.552-.42-.94-1.029-.94-.584 0-1.009.388-1.009.94\" />\n </Icon>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport styles from './Spinner.module.css';\n\nexport type SpinnerSize = 'sm' | 'md' | 'lg';\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n size?: SpinnerSize;\n label?: string;\n}\n\nexport function Spinner({ className, label, size = 'md', ...props }: SpinnerProps) {\n const classes = [styles.spinner, styles[size], className].filter(Boolean).join(' ');\n\n if (!label) {\n return <span {...props} className={classes} aria-hidden=\"true\" />;\n }\n\n return <span {...props} className={classes} role=\"status\" aria-label={label} />;\n}\n","import { forwardRef, type ButtonHTMLAttributes, type MouseEvent } from 'react';\nimport { Spinner } from '../../feedback/Spinner';\nimport styles from './Button.module.css';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'soft' | 'ghost' | 'danger';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n className,\n disabled = false,\n loading = false,\n onClick,\n size = 'md',\n type = 'button',\n variant = 'primary',\n ...props\n },\n ref,\n ) => {\n const classes = [styles.button, styles[variant], styles[size], className]\n .filter(Boolean)\n .join(' ');\n\n function handleClick(event: MouseEvent<HTMLButtonElement>) {\n if (loading) {\n event.preventDefault();\n return;\n }\n onClick?.(event);\n }\n\n return (\n <button\n {...props}\n ref={ref}\n className={classes}\n disabled={disabled}\n aria-disabled={loading || undefined}\n aria-busy={loading || undefined}\n onClick={handleClick}\n type={type}\n >\n {loading && <Spinner size={size === 'lg' ? 'md' : 'sm'} />}\n {children}\n </button>\n );\n },\n);\n","import type { LabelHTMLAttributes } from 'react';\nimport styles from './Label.module.css';\n\nexport interface LabelProps extends LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean;\n}\n\nexport function Label({ children, className, required = false, ...props }: LabelProps) {\n const classes = [styles.label, className].filter(Boolean).join(' ');\n\n return (\n <label {...props} className={classes}>\n {children}\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </label>\n );\n}\n","import { useId, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { Label } from '../Label';\nimport styles from './Field.module.css';\n\nexport interface FieldWiring {\n id: string;\n describedBy: string | undefined;\n invalid: boolean;\n}\n\nexport interface FieldProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n 'aria-describedby'?: string;\n characterCount?: number;\n children: (wiring: FieldWiring) => ReactNode;\n error?: string;\n hint?: string;\n id?: string;\n label?: string;\n maxLength?: number;\n required?: boolean;\n showCharacterCount?: boolean;\n}\n\nexport function Field({\n 'aria-describedby': ariaDescribedBy,\n className,\n characterCount = 0,\n children,\n error,\n hint,\n id: providedId,\n label,\n maxLength,\n required = false,\n showCharacterCount = false,\n ...props\n}: FieldProps) {\n const generatedId = useId();\n const id = providedId ?? `field-${generatedId}`;\n const messageId = `${id}-message`;\n const characterCountId = `${id}-character-count`;\n const describedBy = [\n ariaDescribedBy,\n error || hint ? messageId : undefined,\n showCharacterCount ? characterCountId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n return (\n <div {...props} className={[styles.field, className].filter(Boolean).join(' ')}>\n {label && <Label htmlFor={id} required={required}>{label}</Label>}\n {children({ id, describedBy, invalid: Boolean(error) })}\n {(error || hint) && (\n <span className={error ? styles.errorMessage : styles.hint} id={messageId} role={error ? 'alert' : undefined}>\n {error || hint}\n </span>\n )}\n {showCharacterCount && (\n <span className={styles.characterCount} id={characterCountId}>\n {maxLength ? `${characterCount}/${maxLength}` : characterCount}\n </span>\n )}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from 'react';\n\ntype FieldValue = string | number | readonly string[] | undefined;\n\n// Conta unidades UTF-16, a mesma medida do maxLength nativo, para que o\n// numero exibido corresponda ao ponto exato em que o navegador corta.\nfunction countCharacters(value: FieldValue) {\n return String(value ?? '').length;\n}\n\nexport function useCharacterCount<T extends HTMLInputElement | HTMLTextAreaElement>(\n value: FieldValue,\n defaultValue: FieldValue,\n) {\n const elementRef = useRef<T>(null);\n const [uncontrolledCount, setUncontrolledCount] = useState(() => countCharacters(defaultValue));\n\n useEffect(() => {\n const form = elementRef.current?.form;\n\n if (!form) {\n return;\n }\n\n function restoreInitialCount() {\n setUncontrolledCount(countCharacters(defaultValue));\n }\n\n form.addEventListener('reset', restoreInitialCount);\n\n return () => form.removeEventListener('reset', restoreInitialCount);\n }, [defaultValue]);\n\n return {\n ref: elementRef,\n count: value === undefined ? uncontrolledCount : countCharacters(value),\n updateCount(nextValue: string) {\n if (value === undefined) {\n setUncontrolledCount(countCharacters(nextValue));\n }\n },\n };\n}\n","import { useMemo, type Ref } from 'react';\n\nfunction attach<T>(ref: Ref<T> | undefined, node: T | null) {\n if (typeof ref === 'function') {\n const cleanup = ref(node);\n return typeof cleanup === 'function' ? cleanup : () => ref(null);\n }\n\n if (ref) {\n ref.current = node;\n return () => {\n ref.current = null;\n };\n }\n\n return () => undefined;\n}\n\n/**\n * Junta o ref interno ao que veio de fora numa funcao estavel, que devolve a limpeza do React 19.\n * Nova a cada render, ela desligava e religava o elemento em todo render.\n */\nexport function useMergedRefs<T>(...refs: readonly (Ref<T> | undefined)[]) {\n return useMemo(\n () => (node: T | null) => {\n const cleanups = refs.map((ref) => attach(ref, node));\n\n return () => cleanups.forEach((cleanup) => cleanup());\n },\n refs,\n );\n}\n","import { type ChangeEvent, type ComponentPropsWithRef } from 'react';\nimport { useCharacterCount } from '../../../hooks/useCharacterCount';\nimport { Field } from '../Field';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './InputText.module.css';\n\nexport type InputTextSize = 'sm' | 'md';\n\nexport interface InputTextProps extends Omit<ComponentPropsWithRef<'input'>, 'size'> {\n error?: string;\n hint?: string;\n label?: string;\n size?: InputTextSize;\n showCharacterCount?: boolean;\n}\n\nexport function InputText({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n className,\n error,\n hint,\n id: providedId,\n label,\n maxLength,\n required = false,\n size = 'md',\n showCharacterCount = false,\n defaultValue,\n onChange,\n value,\n ref,\n ...props\n}: InputTextProps) {\n const { ref: inputRef, count, updateCount } = useCharacterCount<HTMLInputElement>(value, defaultValue);\n const mergedRef = useMergedRefs(inputRef, ref);\n const classes = [styles.input, styles[size], error && styles.error, className]\n .filter(Boolean)\n .join(' ');\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n updateCount(event.target.value);\n onChange?.(event);\n }\n\n return (\n <Field\n aria-describedby={ariaDescribedBy}\n characterCount={count}\n error={error}\n hint={hint}\n id={providedId}\n label={label}\n maxLength={maxLength}\n required={required}\n showCharacterCount={showCharacterCount}\n >\n {({ id, describedBy, invalid }) => (\n <input\n {...props}\n defaultValue={defaultValue}\n id={id}\n ref={mergedRef}\n aria-describedby={describedBy}\n aria-invalid={invalid || ariaInvalid}\n className={classes}\n maxLength={maxLength}\n onChange={handleChange}\n required={required}\n value={value}\n />\n )}\n </Field>\n );\n}\n","const SEPARADOR_DECIMAL = ',';\n\n/** Quantos digitos formam um grupo de milhar. */\nconst DIGITOS_DO_GRUPO = 3;\n\n/** O que fica de cada lado do ponto, quando ha um so e nenhuma virgula. */\nfunction ladosDoPontoUnico(texto: string) {\n const partes = texto.split('.');\n\n if (texto.includes(SEPARADOR_DECIMAL) || partes.length !== 2) {\n return null;\n }\n\n return { inteiro: partes[0].replace(/\\D/g, ''), fracao: partes[1].replace(/\\D/g, '') };\n}\n\n/**\n * O ponto separa milhar em pt-BR e e decimal no teclado numerico e no texto colado: vale como decimal so quando e o\n * unico, sem virgula, e o que vem depois nao forma grupo de milhar ou o que vem antes e zero.\n */\nfunction normalizarPonto(texto: string) {\n const lados = ladosDoPontoUnico(texto);\n const decimal = lados !== null && (Number(lados.inteiro) === 0 || lados.fracao.length !== DIGITOS_DO_GRUPO);\n\n return decimal ? texto.replace('.', SEPARADOR_DECIMAL) : texto.replace(/\\./g, '');\n}\n\n/**\n * Numero que vem de fora **arredonda** nas casas pedidas, em vez de truncar, e\n * sai sem notacao exponencial. Truncar e o certo para o que se digita, porque\n * ali o valor ainda esta pela metade; para um valor pronto, e perda.\n */\nfunction comoTexto(valor: number, casasDecimais: number) {\n if (!Number.isFinite(valor)) {\n return '';\n }\n\n return new Intl.NumberFormat('en-US', {\n maximumFractionDigits: Math.max(casasDecimais, 0),\n useGrouping: false,\n })\n .format(valor)\n .replace('.', SEPARADOR_DECIMAL);\n}\n\nfunction sinalDe(texto: string) {\n return texto.trimStart().startsWith('-') ? '-' : '';\n}\n\nexport function formatarEntradaDecimal(valor: string | number, casasDecimais = 0): string {\n const texto = typeof valor === 'number' ? comoTexto(valor, casasDecimais) : normalizarPonto(valor);\n const sinal = sinalDe(texto);\n const limpo = texto.replace(/[^\\d,]/g, '');\n const [inteiroBruto = '', ...resto] = limpo.split(SEPARADOR_DECIMAL);\n const inteiro = inteiroBruto.replace(/\\D/g, '');\n\n if (casasDecimais <= 0) {\n return `${sinal}${inteiro}`;\n }\n\n if (!limpo.includes(SEPARADOR_DECIMAL)) {\n return `${sinal}${inteiro}`;\n }\n\n const decimais = resto.join('').replace(/\\D/g, '').slice(0, casasDecimais);\n return `${sinal}${inteiro}${SEPARADOR_DECIMAL}${decimais}`;\n}\n\n/**\n * O texto do campo enquanto se digita: o ponto que ainda pode virar milhar na proxima tecla fica como foi digitado, e\n * o valor o le como decimal ate la. Decidido na hora, `1.234` virava `1,23`.\n */\nexport function formatarEdicaoDecimal(texto: string, casasDecimais = 0): string {\n const lados = ladosDoPontoUnico(texto);\n\n if (casasDecimais <= 0 || lados === null || Number(lados.inteiro) === 0 || lados.fracao.length >= DIGITOS_DO_GRUPO) {\n return formatarEntradaDecimal(texto, casasDecimais);\n }\n\n return `${sinalDe(texto)}${lados.inteiro}.${lados.fracao}`;\n}\n","import { formatarEntradaDecimal } from './formatarEntradaDecimal';\n\n/** O simbolo da moeda em pt-BR, como o `Intl` escreve: US$ para o dolar. Codigo invalido fica como veio. */\nfunction simboloDa(moeda: string) {\n try {\n const partes = new Intl.NumberFormat('pt-BR', { currency: moeda, style: 'currency' }).formatToParts(0);\n\n return partes.find((parte) => parte.type === 'currency')?.value ?? moeda;\n } catch {\n return moeda;\n }\n}\n\nexport function formatarEntradaMonetaria(valor: string | number, moeda = 'BRL', casasDecimais = 2): string {\n const normalizado = formatarEntradaDecimal(valor, casasDecimais);\n const sinal = normalizado.startsWith('-') ? '-' : '';\n const [inteiroBruto = '', decimais = ''] = normalizado.replace('-', '').split(',');\n const inteiro = inteiroBruto || '0';\n const inteiroAgrupado = inteiro.replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.');\n const simbolo = simboloDa(moeda);\n\n if (casasDecimais <= 0) {\n return `${sinal}${simbolo} ${inteiroAgrupado}`;\n }\n\n return `${sinal}${simbolo} ${inteiroAgrupado},${decimais.padEnd(casasDecimais, '0')}`;\n}\n","export interface OpcoesDeData {\n localidade?: string;\n formato?: 'curto' | 'longo' | 'numerico';\n}\n\nexport interface OpcoesDeHora {\n localidade?: string;\n segundos?: boolean;\n}\n\nconst ESTILOS: Record<NonNullable<OpcoesDeData['formato']>, Intl.DateTimeFormatOptions> = {\n numerico: { day: '2-digit', month: '2-digit', year: 'numeric' },\n curto: { day: '2-digit', month: 'short', year: 'numeric' },\n longo: { day: '2-digit', month: 'long', year: 'numeric' },\n};\n\n/** Data sem hora, que precisa ser lida no fuso local. */\nconst DATA_SIMPLES = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/**\n * Data sem hora entra pelo fuso local: lida como UTC, ela recua um dia em\n * qualquer fuso negativo. Qualquer outra cadeia — a comecar pelo que sai de\n * `toISOString()` — vai inteira para o `Date`, que sabe ler o deslocamento.\n */\nfunction paraData(valor: Date | string) {\n if (valor instanceof Date) {\n return valor;\n }\n\n if (DATA_SIMPLES.test(valor)) {\n const [ano, mes, dia] = valor.split('-').map(Number);\n\n return new Date(ano, mes - 1, dia);\n }\n\n return new Date(valor);\n}\n\nexport function formatarData(valor: Date | string, { localidade = 'pt-BR', formato = 'numerico' }: OpcoesDeData = {}) {\n const data = paraData(valor);\n\n if (Number.isNaN(data.getTime())) {\n return '';\n }\n\n return new Intl.DateTimeFormat(localidade, ESTILOS[formato]).format(data);\n}\n\nexport function formatarHora(valor: Date | string, { localidade = 'pt-BR', segundos = false }: OpcoesDeHora = {}) {\n const data = typeof valor === 'string' && /^\\d{2}:\\d{2}/.test(valor) ? new Date(`1970-01-01T${valor}`) : paraData(valor);\n\n if (Number.isNaN(data.getTime())) {\n return '';\n }\n\n return new Intl.DateTimeFormat(localidade, {\n hour: '2-digit',\n minute: '2-digit',\n second: segundos ? '2-digit' : undefined,\n hourCycle: 'h23',\n }).format(data);\n}\n","export interface OpcoesDeNumero {\n /** Sem declarar, quem decide e a localidade — e, na moeda, a propria moeda. */\n casasDecimais?: number;\n compacto?: boolean;\n localidade?: string;\n}\n\nexport interface OpcoesDeMoeda extends OpcoesDeNumero {\n moeda?: string;\n}\n\nexport interface OpcoesDePercentual {\n casasDecimais?: number;\n localidade?: string;\n}\n\nfunction casas(casasDecimais?: number) {\n return casasDecimais === undefined\n ? {}\n : { maximumFractionDigits: casasDecimais, minimumFractionDigits: casasDecimais };\n}\n\n/**\n * A forma compacta sai da localidade, e nao de um sufixo proprio: em pt-BR um\n * milhao e `1 mi`, nao `1M`. Inventar o sufixo quebraria em qualquer outra.\n */\nfunction notacao(compacto?: boolean) {\n return compacto ? ({ compactDisplay: 'short', notation: 'compact' } as const) : {};\n}\n\n/** Sinal so no negativo de fato: `-0`, e o que arredonda para zero, saiam como `-0`. */\nconst SINAL = { signDisplay: 'negative' } as const;\n\nexport function formatarNumero(\n valor: number,\n { casasDecimais, compacto, localidade = 'pt-BR' }: OpcoesDeNumero = {},\n) {\n if (!Number.isFinite(valor)) {\n return '';\n }\n\n return new Intl.NumberFormat(localidade, { ...SINAL, ...notacao(compacto), ...casas(casasDecimais) }).format(valor);\n}\n\n/**\n * Valor monetario. O separador entre simbolo e numero e um espaco nao\n * separavel, escolha do `Intl`: ele impede que a quebra de linha afaste o\n * simbolo do valor. As mascaras de entrada usam espaco comum, e a convergencia\n * das duas ainda esta em aberto.\n */\nexport function formatarMoeda(\n valor: number,\n { casasDecimais, compacto, localidade = 'pt-BR', moeda = 'BRL' }: OpcoesDeMoeda = {},\n) {\n if (!Number.isFinite(valor)) {\n return '';\n }\n\n return new Intl.NumberFormat(localidade, {\n ...SINAL,\n currency: moeda,\n style: 'currency',\n ...notacao(compacto),\n ...casas(casasDecimais),\n }).format(valor);\n}\n\n/**\n * Percentual a partir da **fracao**: `0.42` vira `42%`. Receber o numero ja\n * multiplicado obrigaria cada consumidor a dividir antes de exibir, e e a\n * fracao que sai de uma divisao de duas medidas.\n */\nexport function formatarPercentual(\n valor: number,\n { casasDecimais = 0, localidade = 'pt-BR' }: OpcoesDePercentual = {},\n) {\n if (!Number.isFinite(valor)) {\n return '';\n }\n\n return new Intl.NumberFormat(localidade, { ...SINAL, style: 'percent', ...casas(casasDecimais) }).format(valor);\n}\n","/**\n * Mascara de partes com limite de digitos, como dia/mes/ano. O separador digitado fecha a parte antes\n * de encher, e ninguem empurra digito para a vizinha; sem ele, o excesso passa para a parte seguinte.\n */\nexport function mascararPartes(valor: string, limites: readonly number[], separadores: readonly string[]) {\n const trechos = valor.replace(/^\\D+/, '').split(/\\D+/);\n const partes: string[] = [];\n\n trechos.forEach((trecho, indice) => {\n const fechado = indice < trechos.length - 1;\n let resto = trecho;\n\n do {\n if (partes.length === limites.length) {\n return;\n }\n\n const limite = limites[partes.length];\n partes.push(resto.slice(0, limite));\n resto = fechado ? '' : resto.slice(limite);\n } while (resto);\n });\n\n return partes.map((parte, indice) => (indice === 0 ? parte : separadores[indice - 1] + parte)).join('');\n}\n","import { CalendarDate } from '@internationalized/date';\nimport { mascararPartes } from './mascararPartes';\n\n/** Data colada em ISO, com o ano na frente, que a mascara reordena. */\nconst DATA_ISO = /^\\s*(\\d{4})[/\\-.](\\d{1,2})[/\\-.](\\d{1,2})\\s*$/;\n\n/** Aplica a mascara dia/mes/ano conforme o usuario digita. */\nexport function formatarEntradaData(valor: string) {\n const iso = valor.match(DATA_ISO);\n const texto = iso ? [iso[3].padStart(2, '0'), iso[2].padStart(2, '0'), iso[1]].join('/') : valor;\n\n return mascararPartes(texto, [2, 2, 4], ['/', '/']);\n}\n\n/** Le dia, mes e ano separados por barra, traco, ponto ou espaco. */\nexport function lerEntradaData(valor: string) {\n const partes = valor.trim().split(/[/\\-.\\s]+/).filter(Boolean);\n\n if (partes.length !== 3) {\n return undefined;\n }\n\n const [dia, mes, ano] = partes.map(Number);\n\n if (![dia, mes, ano].every(Number.isInteger) || ano < 1000 || mes < 1 || mes > 12 || dia < 1) {\n return undefined;\n }\n\n const data = new CalendarDate(ano, mes, dia);\n\n return data.day === dia && data.month === mes ? data : undefined;\n}\n","import { CalendarDateTime, Time } from '@internationalized/date';\nimport { lerEntradaData } from './formatarEntradaData';\nimport { mascararPartes } from './mascararPartes';\n\n/** A hora fecha com os dois digitos do minuto; `18:4` fixaria o valor no terceiro digito. */\nconst HORA_INTEIRA = /^\\d{1,2}:\\d{2}$/;\n\n/** Aplica a mascara hora:minuto conforme o usuario digita. */\nexport function formatarEntradaHora(valor: string) {\n return mascararPartes(valor, [2, 2], [':']);\n}\n\nexport function lerEntradaHora(valor: string) {\n if (!HORA_INTEIRA.test(valor)) {\n return undefined;\n }\n\n const [hora, minuto] = valor.split(':').map(Number);\n\n return hora > 23 || minuto > 59 ? undefined : new Time(hora, minuto);\n}\n\n/** Aplica a mascara dia/mes/ano hora:minuto conforme o usuario digita. */\nexport function formatarEntradaDataHora(valor: string) {\n return mascararPartes(valor, [2, 2, 4, 2, 2], ['/', '/', ' ', ':']);\n}\n\nexport function lerEntradaDataHora(valor: string) {\n const [data, hora = ''] = valor.trim().split(/\\s+/);\n const dia = lerEntradaData(data);\n\n if (!dia) {\n return undefined;\n }\n\n // Sem hora nenhuma, meia-noite e o valor: a data sozinha e um instante legitimo.\n if (hora === '') {\n return new CalendarDateTime(dia.year, dia.month, dia.day, 0, 0);\n }\n\n // Hora pela metade ou impossivel nao tem valor; `25:99` viraria uma meia-noite que ninguem digitou.\n const horario = lerEntradaHora(hora);\n\n return horario && new CalendarDateTime(dia.year, dia.month, dia.day, horario.hour, horario.minute);\n}\n","import { useEffect, useRef } from 'react';\n\n/**\n * Restaura o valor inicial quando o formulario e reiniciado. Campo que guarda o\n * texto exibido em estado do React nao volta sozinho: o `reset` mexe no DOM, e\n * o estado continua onde estava.\n */\nexport function useFormReset<T extends HTMLElement>(restaurar: () => void) {\n const ref = useRef<T>(null);\n const acao = useRef(restaurar);\n\n acao.current = restaurar;\n\n useEffect(() => {\n const formulario = ref.current?.closest('form');\n\n if (!formulario) {\n return;\n }\n\n const ouvir = () => acao.current();\n\n formulario.addEventListener('reset', ouvir);\n\n return () => formulario.removeEventListener('reset', ouvir);\n }, []);\n\n return ref;\n}\n","import { useState, type ChangeEvent } from 'react';\nimport { formatarEdicaoDecimal, formatarEntradaDecimal } from '../utils/formatters';\nimport { useFormReset } from './useFormReset';\n\ninterface DecimalInputOptions {\n decimalScale: number;\n defaultValue: string | number;\n onValueChange?: (value: string) => void;\n value?: string | number;\n}\n\n/**\n * Estado dos campos decimais: o valor, controlado ou nao, e o texto que a\n * pessoa esta digitando, que pode ainda guardar um ponto sem papel decidido.\n */\nexport function useDecimalInput({ decimalScale, defaultValue, onValueChange, value }: DecimalInputOptions) {\n const [uncontrolledValue, setUncontrolledValue] = useState(() => formatarEntradaDecimal(defaultValue, decimalScale));\n const [editingText, setEditingText] = useState<string | null>(null);\n const ref = useFormReset<HTMLInputElement>(() => {\n setUncontrolledValue(formatarEntradaDecimal(defaultValue, decimalScale));\n setEditingText(null);\n });\n const currentValue = value === undefined ? uncontrolledValue : formatarEntradaDecimal(value, decimalScale);\n // O texto digitado so vale enquanto diz o mesmo que o valor; uma mudanca\n // externa, ou recusada pelo consumidor, volta a exibir o valor.\n const text =\n editingText !== null && formatarEntradaDecimal(editingText, decimalScale) === currentValue ? editingText : currentValue;\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n const nextValue = formatarEntradaDecimal(event.target.value, decimalScale);\n\n setEditingText(formatarEdicaoDecimal(event.target.value, decimalScale));\n setUncontrolledValue(nextValue);\n onValueChange?.(nextValue);\n }\n\n return { ref, value: currentValue, text, handleChange, endEditing: () => setEditingText(null) };\n}\n","import { type FocusEvent, type KeyboardEvent, type Ref } from 'react';\nimport { useDecimalInput } from '../../../hooks/useDecimalInput';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { InputText, type InputTextProps } from '../InputText';\n\nexport interface InputNumberProps extends Omit<InputTextProps, 'defaultValue' | 'onChange' | 'showCharacterCount' | 'type' | 'value'> {\n decimalScale?: number;\n defaultValue?: string | number;\n onValueChange?: (value: string) => void;\n value?: string | number;\n}\n\nexport function InputNumber({\n decimalScale = 0,\n defaultValue = '',\n onBlur,\n onKeyDown,\n onValueChange,\n value,\n ...props\n}: InputNumberProps) {\n const decimalInput = useDecimalInput({ decimalScale, defaultValue, onValueChange, value });\n const mergedRef = useMergedRefs(decimalInput.ref, props.ref as Ref<HTMLInputElement>);\n\n function handleBlur(event: FocusEvent<HTMLInputElement>) {\n decimalInput.endEditing();\n onBlur?.(event);\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n if (decimalScale === 0 && (event.key === ',' || event.key === '.')) {\n event.preventDefault();\n }\n onKeyDown?.(event);\n }\n\n return (\n <InputText\n {...props}\n ref={mergedRef}\n inputMode={decimalScale > 0 ? 'decimal' : 'numeric'}\n onBlur={handleBlur}\n onChange={decimalInput.handleChange}\n onKeyDown={handleKeyDown}\n pattern={decimalScale > 0 ? undefined : '-?[0-9]*'}\n type=\"text\"\n value={decimalInput.text}\n />\n );\n}\n","import {\n useEffect,\n useRef,\n useState,\n type ChangeEvent,\n type ClipboardEvent,\n type FocusEvent,\n type ComponentPropsWithRef,\n} from 'react';\nimport { Field } from '../Field';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './InputPassword.module.css';\n\nexport interface InputPasswordProps extends Omit<ComponentPropsWithRef<'input'>, 'type' | 'size'> {\n error?: string;\n hint?: string;\n label?: string;\n allowCopy?: boolean;\n onValidationChange?: (message?: string) => void;\n showToggle?: boolean;\n validate?: (value: string) => string | undefined;\n validateOnBlur?: boolean;\n size?: 'sm' | 'md';\n}\n\nexport function InputPassword({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n allowCopy = false,\n className,\n defaultValue,\n disabled = false,\n error,\n hint,\n id: providedId,\n label,\n maxLength,\n onChange,\n onCopy,\n onCut,\n onBlur,\n onValidationChange,\n required = false,\n showToggle = true,\n size = 'md',\n validate,\n validateOnBlur = true,\n value,\n ref,\n ...props\n}: InputPasswordProps) {\n const [visible, setVisible] = useState(false);\n const [blurred, setBlurred] = useState(false);\n const [validationMessage, setValidationMessage] = useState<string>();\n const inputRef = useRef<HTMLInputElement>(null);\n const mergedRef = useMergedRefs(inputRef, ref);\n const displayedError = error ?? validationMessage;\n const inputClasses = [styles.input, styles[size], displayedError && styles.error, className]\n .filter(Boolean)\n .join(' ');\n\n useEffect(() => {\n const form = inputRef.current?.form;\n\n if (!form) {\n return;\n }\n\n function ocultar() {\n setVisible(false);\n }\n\n form.addEventListener('submit', ocultar);\n\n return () => form.removeEventListener('submit', ocultar);\n }, []);\n\n function runValidation(nextValue: string) {\n const message = validate?.(nextValue);\n\n setValidationMessage(message);\n onValidationChange?.(message);\n }\n\n function handleChange(event: ChangeEvent<HTMLInputElement>) {\n if (validate && (blurred || !validateOnBlur)) {\n runValidation(event.target.value);\n }\n onChange?.(event);\n }\n\n function handleBlur(event: FocusEvent<HTMLInputElement>) {\n setBlurred(true);\n if (validate && validateOnBlur) {\n runValidation(event.target.value);\n }\n onBlur?.(event);\n }\n\n function handleCopy(event: ClipboardEvent<HTMLInputElement>) {\n onCopy?.(event);\n if (!allowCopy) {\n event.preventDefault();\n }\n }\n\n function handleCut(event: ClipboardEvent<HTMLInputElement>) {\n onCut?.(event);\n if (!allowCopy) {\n event.preventDefault();\n }\n }\n\n return (\n <Field\n aria-describedby={ariaDescribedBy}\n error={displayedError}\n hint={hint}\n id={providedId}\n label={label}\n maxLength={maxLength}\n required={required}\n >\n {({ id, describedBy, invalid }) => (\n <div className={styles.control}>\n <input\n {...props}\n autoComplete={props.autoComplete ?? 'current-password'}\n className={inputClasses}\n defaultValue={defaultValue}\n disabled={disabled}\n id={id}\n ref={mergedRef}\n aria-describedby={describedBy}\n aria-invalid={invalid || ariaInvalid}\n maxLength={maxLength}\n onChange={handleChange}\n onCopy={handleCopy}\n onCut={handleCut}\n onBlur={handleBlur}\n required={required}\n type={visible ? 'text' : 'password'}\n value={value}\n />\n {showToggle && (\n <button\n className={styles.toggle}\n type=\"button\"\n aria-label={visible ? 'Ocultar senha' : 'Mostrar senha'}\n disabled={disabled}\n onClick={() => setVisible((current) => !current)}\n >\n {visible ? 'Ocultar' : 'Mostrar'}\n </button>\n )}\n </div>\n )}\n </Field>\n );\n}\n","import { useState, type FocusEvent, type Ref } from 'react';\nimport { useDecimalInput } from '../../../hooks/useDecimalInput';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { InputText, type InputTextProps } from '../InputText';\nimport { formatarEntradaMonetaria } from '../../../utils/formatters';\n\nexport interface InputCurrencyProps extends Omit<InputTextProps, 'defaultValue' | 'onChange' | 'showCharacterCount' | 'type' | 'value'> {\n currency?: string;\n defaultValue?: string | number;\n decimalScale?: number;\n onValueChange?: (value: string) => void;\n value?: string | number;\n}\n\nexport function InputCurrency({\n currency = 'BRL',\n defaultValue = '',\n decimalScale = 2,\n onBlur,\n onFocus,\n onValueChange,\n value,\n ...props\n}: InputCurrencyProps) {\n const decimalInput = useDecimalInput({ decimalScale, defaultValue, onValueChange, value });\n const mergedRef = useMergedRefs(decimalInput.ref, props.ref as Ref<HTMLInputElement>);\n const [focused, setFocused] = useState(false);\n const displayValue =\n focused || !decimalInput.value ? decimalInput.text : formatarEntradaMonetaria(decimalInput.value, currency, decimalScale);\n\n function handleFocus(event: FocusEvent<HTMLInputElement>) {\n setFocused(true);\n onFocus?.(event);\n }\n\n function handleBlur(event: FocusEvent<HTMLInputElement>) {\n setFocused(false);\n decimalInput.endEditing();\n onBlur?.(event);\n }\n\n return (\n <InputText\n {...props}\n ref={mergedRef}\n inputMode=\"decimal\"\n onBlur={handleBlur}\n onChange={decimalInput.handleChange}\n onFocus={handleFocus}\n type=\"text\"\n value={displayValue}\n />\n );\n}\n","import { type ChangeEvent, type ComponentPropsWithRef } from 'react';\nimport { useCharacterCount } from '../../../hooks/useCharacterCount';\nimport { Field } from '../Field';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './Textarea.module.css';\n\nexport type TextareaSize = 'sm' | 'md';\n\nexport interface TextareaProps extends Omit<ComponentPropsWithRef<'textarea'>, 'size'> {\n error?: string;\n hint?: string;\n label?: string;\n size?: TextareaSize;\n showCharacterCount?: boolean;\n}\n\nexport function Textarea({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n className,\n error,\n hint,\n id: providedId,\n label,\n maxLength,\n required = false,\n rows = 4,\n size = 'md',\n showCharacterCount = false,\n defaultValue,\n onChange,\n value,\n ref,\n ...props\n}: TextareaProps) {\n const { ref: textareaRef, count, updateCount } = useCharacterCount<HTMLTextAreaElement>(value, defaultValue);\n const mergedRef = useMergedRefs(textareaRef, ref);\n const classes = [styles.textarea, styles[size], error && styles.error, className]\n .filter(Boolean)\n .join(' ');\n\n function handleChange(event: ChangeEvent<HTMLTextAreaElement>) {\n updateCount(event.target.value);\n onChange?.(event);\n }\n\n return (\n <Field\n aria-describedby={ariaDescribedBy}\n characterCount={count}\n error={error}\n hint={hint}\n id={providedId}\n label={label}\n maxLength={maxLength}\n required={required}\n showCharacterCount={showCharacterCount}\n >\n {({ id, describedBy, invalid }) => (\n <textarea\n {...props}\n defaultValue={defaultValue}\n id={id}\n ref={mergedRef}\n aria-describedby={describedBy}\n aria-invalid={invalid || ariaInvalid}\n className={classes}\n maxLength={maxLength}\n onChange={handleChange}\n required={required}\n rows={rows}\n value={value}\n />\n )}\n </Field>\n );\n}\n","import { useCallback, useId, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './Checkbox.module.css';\n\nexport interface CheckboxProps extends Omit<ComponentPropsWithRef<'input'>, 'type' | 'size'> {\n error?: string;\n hint?: string;\n indeterminate?: boolean;\n /** Sem rotulo visivel, o nome vem de `aria-label` ou `aria-labelledby`. */\n label?: ReactNode;\n}\n\nexport function Checkbox({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n className,\n error,\n hint,\n id: providedId,\n indeterminate = false,\n label,\n ref,\n ...props\n}: CheckboxProps) {\n const generatedId = useId();\n const id = providedId ?? `checkbox-${generatedId}`;\n const messageId = `${id}-message`;\n const describedBy = [ariaDescribedBy, error || hint ? messageId : undefined]\n .filter(Boolean)\n .join(' ') || undefined;\n const classes = [styles.input, error && styles.error, className].filter(Boolean).join(' ');\n\n const aplicarIndeterminado = useCallback(\n (node: HTMLInputElement | null) => {\n if (node) {\n node.indeterminate = indeterminate;\n }\n },\n [indeterminate],\n );\n const mergedRef = useMergedRefs(aplicarIndeterminado, ref);\n\n return (\n <div className={styles.field}>\n <label className={styles.control} htmlFor={id}>\n <input\n {...props}\n ref={mergedRef}\n className={classes}\n id={id}\n aria-describedby={describedBy}\n aria-invalid={error ? true : ariaInvalid}\n type=\"checkbox\"\n />\n {label && <span className={styles.text}>{label}</span>}\n </label>\n {(error || hint) && (\n <span className={error ? styles.errorMessage : styles.hint} id={messageId} role={error ? 'alert' : undefined}>\n {error || hint}\n </span>\n )}\n </div>\n );\n}\n","import { createContext, useContext, useId, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport styles from './RadioGroup.module.css';\n\ninterface RadioGroupContexto {\n defaultValue?: string;\n disabled: boolean;\n invalid: boolean;\n name: string;\n onValueChange?: (value: string) => void;\n required: boolean;\n value?: string;\n}\n\nconst RadioGroupContexto = createContext<RadioGroupContexto | null>(null);\n\nexport function useRadioGroupContexto() {\n const contexto = useContext(RadioGroupContexto);\n\n if (!contexto) {\n throw new Error('Radio precisa ser renderizado dentro de RadioGroup.');\n }\n\n return contexto;\n}\n\nexport interface RadioGroupProps extends Omit<ComponentPropsWithRef<'fieldset'>, 'onChange'> {\n children: ReactNode;\n defaultValue?: string;\n disabled?: boolean;\n error?: string;\n hint?: string;\n label: string;\n name?: string;\n onValueChange?: (value: string) => void;\n required?: boolean;\n value?: string;\n}\n\nexport function RadioGroup({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n children,\n className,\n defaultValue,\n disabled = false,\n error,\n hint,\n label,\n name: providedName,\n onValueChange,\n required = false,\n value,\n ...props\n}: RadioGroupProps) {\n const generatedId = useId();\n const name = providedName ?? `radio-group-${generatedId}`;\n // Do `useId`, e nao do nome: dois grupos com o mesmo nome dividiam o id da mensagem.\n const messageId = `radio-group-${generatedId}-message`;\n const describedBy = [ariaDescribedBy, error || hint ? messageId : undefined].filter(Boolean).join(' ') || undefined;\n\n return (\n <RadioGroupContexto.Provider\n value={{ defaultValue, disabled, invalid: Boolean(error), name, onValueChange, required, value }}\n >\n <fieldset\n {...props}\n className={[styles.group, className].filter(Boolean).join(' ')}\n role=\"radiogroup\"\n aria-describedby={describedBy}\n aria-invalid={error ? true : ariaInvalid}\n aria-required={required || undefined}\n >\n <legend className={styles.legend}>\n {label}\n {required && <span className={styles.required} aria-hidden=\"true\">*</span>}\n </legend>\n <div className={styles.options}>{children}</div>\n {(error || hint) && (\n <span className={error ? styles.errorMessage : styles.hint} id={messageId} role={error ? 'alert' : undefined}>\n {error || hint}\n </span>\n )}\n </fieldset>\n </RadioGroupContexto.Provider>\n );\n}\n","import { useId, type ChangeEvent, type ComponentPropsWithRef } from 'react';\nimport { useRadioGroupContexto } from './RadioGroup';\nimport styles from './RadioGroup.module.css';\n\nexport interface RadioProps\n extends Omit<ComponentPropsWithRef<'input'>, 'type' | 'size' | 'name' | 'checked' | 'defaultChecked' | 'value'> {\n label: string;\n value: string;\n}\n\nexport function Radio({\n className,\n disabled,\n id: providedId,\n label,\n onChange,\n ref,\n value,\n ...props\n}: RadioProps) {\n const grupo = useRadioGroupContexto();\n const generatedId = useId();\n const id = providedId ?? `radio-${generatedId}`;\n const controlado = grupo.value !== undefined;\n const classes = [styles.input, grupo.invalid && styles.error, className].filter(Boolean).join(' ');\n\n return (\n <label className={styles.control} htmlFor={id}>\n <input\n {...props}\n className={classes}\n id={id}\n checked={controlado ? grupo.value === value : undefined}\n defaultChecked={controlado ? undefined : grupo.defaultValue === value}\n disabled={disabled ?? grupo.disabled}\n name={grupo.name}\n required={grupo.required}\n onChange={(evento: ChangeEvent<HTMLInputElement>) => {\n grupo.onValueChange?.(value);\n onChange?.(evento);\n }}\n ref={ref}\n type=\"radio\"\n value={value}\n />\n <span className={styles.text}>{label}</span>\n </label>\n );\n}\n","import { useId, type ComponentPropsWithRef } from 'react';\nimport styles from './Switch.module.css';\n\nexport interface SwitchProps extends Omit<ComponentPropsWithRef<'input'>, 'type' | 'size'> {\n error?: string;\n hint?: string;\n label: string;\n}\n\nexport function Switch({\n 'aria-describedby': ariaDescribedBy,\n 'aria-invalid': ariaInvalid,\n className,\n error,\n hint,\n id: providedId,\n label,\n ref,\n ...props\n}: SwitchProps) {\n const generatedId = useId();\n const id = providedId ?? `switch-${generatedId}`;\n const messageId = `${id}-message`;\n const describedBy = [ariaDescribedBy, error || hint ? messageId : undefined]\n .filter(Boolean)\n .join(' ') || undefined;\n const classes = [styles.input, error && styles.error, className].filter(Boolean).join(' ');\n\n return (\n <div className={styles.field}>\n <label className={styles.control} htmlFor={id}>\n <input\n {...props}\n ref={ref}\n className={classes}\n id={id}\n aria-describedby={describedBy}\n aria-invalid={error ? true : ariaInvalid}\n role=\"switch\"\n type=\"checkbox\"\n />\n <span className={styles.text}>{label}</span>\n </label>\n {(error || hint) && (\n <span className={error ? styles.errorMessage : styles.hint} id={messageId} role={error ? 'alert' : undefined}>\n {error || hint}\n </span>\n )}\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from 'react';\nimport styles from './Alert.module.css';\n\nexport type AlertTone = 'info' | 'success' | 'warning' | 'danger';\n\nexport interface AlertProps extends HTMLAttributes<HTMLDivElement> {\n tone?: AlertTone;\n title?: string;\n children?: ReactNode;\n}\n\nexport function Alert({ children, className, title, tone = 'info', ...props }: AlertProps) {\n const classes = [styles.alert, styles[tone], className].filter(Boolean).join(' ');\n const urgente = tone === 'danger' || tone === 'warning';\n\n return (\n <div role={urgente ? 'alert' : 'status'} {...props} className={classes}>\n {title && <strong className={styles.title}>{title}</strong>}\n {children && <div className={styles.body}>{children}</div>}\n </div>\n );\n}\n","import type { ComponentPropsWithRef } from 'react';\nimport styles from './Progress.module.css';\n\nexport type ProgressSize = 'sm' | 'md';\n\nexport interface ProgressProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n label: string;\n max?: number;\n showValue?: boolean;\n size?: ProgressSize;\n value?: number;\n}\n\nexport function Progress({ className, label, max = 100, showValue = false, size = 'md', value, ...props }: ProgressProps) {\n const indeterminate = value === undefined;\n const limitado = indeterminate ? 0 : Math.min(Math.max(value, 0), max);\n const percentual = max > 0 ? (limitado / max) * 100 : 0;\n const classes = [styles.progress, styles[size], className].filter(Boolean).join(' ');\n\n return (\n <div\n {...props}\n className={classes}\n role=\"progressbar\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={indeterminate ? undefined : limitado}\n >\n <div className={styles.track}>\n <div\n className={indeterminate ? styles.indeterminate : styles.fill}\n style={indeterminate ? undefined : { width: `${percentual}%` }}\n />\n </div>\n {showValue && !indeterminate && (\n <span className={styles.value}>{Math.round(percentual)}%</span>\n )}\n </div>\n );\n}\n","import { useRef, type ComponentPropsWithRef, type ReactNode, type RefObject } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './Popover.module.css';\n\nexport type PopoverPlacement =\n | 'top'\n | 'top start'\n | 'top end'\n | 'bottom'\n | 'bottom start'\n | 'bottom end'\n | 'left'\n | 'right';\n\n/** As propriedades nativas vao ao elemento do painel; o `className` soma ao do sistema. */\nexport interface PopoverProps extends Omit<ComponentPropsWithRef<'div'>, 'children'> {\n children: ReactNode;\n offset?: number;\n onClose: () => void;\n open: boolean;\n placement?: PopoverPlacement;\n triggerRef: RefObject<HTMLElement | null>;\n}\n\nexport function Popover({ open, ...props }: PopoverProps) {\n // No servidor nao ha `document` para o portal; o Popover nasce na hidratacao.\n if (!open || typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<PopoverContent {...props} />, document.body);\n}\n\nfunction PopoverContent({\n children,\n className,\n offset = 8,\n onClose,\n placement = 'bottom start',\n ref: refDoConsumidor,\n style,\n triggerRef,\n ...props\n}: Omit<PopoverProps, 'open'>) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n // O gatilho nao conta como \"fora\": o clique dele e do consumidor, que decide se alterna.\n shouldCloseOnInteractOutside: (elemento) => !triggerRef.current?.contains(elemento),\n },\n ref,\n );\n\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: ref,\n placement,\n offset,\n isOpen: true,\n });\n\n // Sem `contain`: o Popover nao bloqueia a pagina. O `restoreFocus` leva o Tab da borda ao elemento seguinte\n // ao gatilho, e nao ao fim do `body`, onde o painel vive.\n return (\n <FocusScope restoreFocus autoFocus>\n <div\n {...props}\n {...overlayProps}\n ref={mergedRef}\n className={[styles.popover, className].filter(Boolean).join(' ')}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n style={{ ...style, ...positionProps.style }}\n role=\"dialog\"\n >\n {children}\n </div>\n </FocusScope>\n );\n}\n","const collator = new Intl.Collator(undefined, { sensitivity: 'base', usage: 'search' });\n\nfunction equals(text: string, term: string) {\n return collator.compare(text, term) === 0;\n}\n\nexport function startsWithTerm(text: string, term: string) {\n const target = text.normalize('NFC');\n const search = term.normalize('NFC');\n\n return equals(target.slice(0, search.length), search);\n}\n\nexport function containsTerm(text: string, term: string) {\n const target = text.normalize('NFC');\n const search = term.normalize('NFC');\n\n if (!search) {\n return true;\n }\n\n for (let start = 0; start + search.length <= target.length; start += 1) {\n if (equals(target.slice(start, start + search.length), search)) {\n return true;\n }\n }\n\n return false;\n}\n","import { startsWithTerm } from '../../utils/textSearch';\n\nexport type SelectionMode = 'none' | 'single' | 'multiple';\n\nexport interface SelectionItem {\n key: string;\n disabled?: boolean;\n textValue?: string;\n}\n\nexport type SelectionStatus = 'none' | 'partial' | 'all';\n\nexport interface SelectionState {\n anchorKey?: string;\n focusedKey?: string;\n selectedKeys: ReadonlySet<string>;\n}\n\nexport const emptySelection: SelectionState = { selectedKeys: new Set() };\n\nfunction indexOfKey(items: readonly SelectionItem[], key: string | undefined) {\n return key === undefined ? -1 : items.findIndex((item) => item.key === key);\n}\n\nexport function firstKey(items: readonly SelectionItem[]) {\n return items.find((item) => !item.disabled)?.key;\n}\n\nexport function lastKey(items: readonly SelectionItem[]) {\n for (let i = items.length - 1; i >= 0; i -= 1) {\n if (!items[i].disabled) {\n return items[i].key;\n }\n }\n\n return undefined;\n}\n\nexport function nextKey(items: readonly SelectionItem[], from: string | undefined) {\n for (let i = indexOfKey(items, from) + 1; i < items.length; i += 1) {\n if (!items[i].disabled) {\n return items[i].key;\n }\n }\n\n return undefined;\n}\n\nexport function previousKey(items: readonly SelectionItem[], from: string | undefined) {\n const start = indexOfKey(items, from);\n\n for (let i = (start < 0 ? items.length : start) - 1; i >= 0; i -= 1) {\n if (!items[i].disabled) {\n return items[i].key;\n }\n }\n\n return undefined;\n}\n\nexport function matchKey(items: readonly SelectionItem[], query: string, from: string | undefined) {\n const term = query.trim();\n\n if (!term || items.length === 0) {\n return undefined;\n }\n\n const start = indexOfKey(items, from);\n\n for (let step = 1; step <= items.length; step += 1) {\n const item = items[(start + step + items.length) % items.length];\n\n if (item.disabled) {\n continue;\n }\n\n if (startsWithTerm(item.textValue ?? item.key, term)) {\n return item.key;\n }\n }\n\n return undefined;\n}\n\nexport function select(\n state: SelectionState,\n key: string,\n mode: SelectionMode,\n { allowEmpty = false }: { allowEmpty?: boolean } = {},\n): SelectionState {\n if (mode === 'none') {\n return state;\n }\n\n if (mode === 'single') {\n // Escolher de novo o que ja estava escolhido desfaz a escolha apenas onde o\n // vazio e um estado valido: uma secao de acordeao fecha, uma aba nao.\n const desfaz = allowEmpty && state.selectedKeys.has(key);\n\n return { focusedKey: key, selectedKeys: desfaz ? new Set() : new Set([key]) };\n }\n\n const selectedKeys = new Set(state.selectedKeys);\n\n if (selectedKeys.has(key)) {\n selectedKeys.delete(key);\n } else {\n selectedKeys.add(key);\n }\n\n return { anchorKey: key, focusedKey: key, selectedKeys };\n}\n\nexport function selectRange(\n state: SelectionState,\n key: string,\n items: readonly SelectionItem[],\n): SelectionState {\n const anchor = state.anchorKey ?? state.focusedKey ?? key;\n const from = indexOfKey(items, anchor);\n const to = indexOfKey(items, key);\n\n if (from < 0 || to < 0) {\n return select(state, key, 'multiple');\n }\n\n const [inicio, fim] = from <= to ? [from, to] : [to, from];\n const selectedKeys = new Set(state.selectedKeys);\n\n for (let i = inicio; i <= fim; i += 1) {\n if (!items[i].disabled) {\n selectedKeys.add(items[i].key);\n }\n }\n\n return { anchorKey: anchor, focusedKey: key, selectedKeys };\n}\n\nexport function selectionStatus(state: SelectionState, items: readonly SelectionItem[]): SelectionStatus {\n const available = items.filter((item) => !item.disabled);\n const chosen = available.filter((item) => state.selectedKeys.has(item.key)).length;\n\n if (chosen === 0) {\n return 'none';\n }\n\n return chosen === available.length ? 'all' : 'partial';\n}\n\nexport function toggleAll(state: SelectionState, items: readonly SelectionItem[]): SelectionState {\n const available = items.filter((item) => !item.disabled);\n const selectedKeys = new Set(state.selectedKeys);\n const marcar = selectionStatus(state, items) !== 'all';\n\n available.forEach((item) => (marcar ? selectedKeys.add(item.key) : selectedKeys.delete(item.key)));\n\n return { ...state, selectedKeys };\n}\n\nexport function clearSelection(state: SelectionState): SelectionState {\n return { focusedKey: state.focusedKey, selectedKeys: new Set() };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n clearSelection,\n firstKey,\n lastKey,\n matchKey,\n nextKey,\n previousKey,\n select,\n selectRange,\n selectionStatus,\n toggleAll,\n type SelectionItem,\n type SelectionMode,\n type SelectionState,\n type SelectionStatus,\n} from './selection';\n\nexport interface UseSelectionOptions {\n /** Em modo unico, escolher de novo o mesmo item desfaz a escolha. */\n allowEmpty?: boolean;\n defaultSelectedKeys?: Iterable<string>;\n items: readonly SelectionItem[];\n mode?: SelectionMode;\n onSelectionChange?: (keys: ReadonlySet<string>) => void;\n selectedKeys?: Iterable<string>;\n typeaheadDelay?: number;\n}\n\nexport interface UseSelectionResult extends SelectionState {\n selectedItems: readonly SelectionItem[];\n clear: () => void;\n focus: (key?: string) => void;\n focusFirst: (extend?: boolean) => void;\n focusLast: (extend?: boolean) => void;\n focusNext: (extend?: boolean) => void;\n focusPrevious: (extend?: boolean) => void;\n reset: () => void;\n search: (character: string) => void;\n select: (key: string) => void;\n selectRange: (key: string) => void;\n status: SelectionStatus;\n toggleAll: () => void;\n}\n\nexport function useSelection({\n allowEmpty = false,\n defaultSelectedKeys,\n items,\n mode = 'single',\n onSelectionChange,\n selectedKeys,\n typeaheadDelay = 500,\n}: UseSelectionOptions): UseSelectionResult {\n const [internal, setInternal] = useState<SelectionState>(() => ({\n selectedKeys: new Set(defaultSelectedKeys ?? []),\n }));\n const controlledKeys = useMemo(\n () => (selectedKeys === undefined ? undefined : new Set(selectedKeys)),\n [selectedKeys],\n );\n const state: SelectionState = controlledKeys\n ? { focusedKey: internal.focusedKey, selectedKeys: controlledKeys }\n : internal;\n\n const itemsByKey = useMemo(() => new Map(items.map((item) => [item.key, item])), [items]);\n const retained = useRef(new Map<string, SelectionItem>());\n const selectedItems = useMemo(() => {\n const resolved = [...state.selectedKeys].map(\n (key) => itemsByKey.get(key) ?? retained.current.get(key) ?? { key },\n );\n\n retained.current = new Map(resolved.map((item) => [item.key, item]));\n\n return resolved;\n }, [itemsByKey, state.selectedKeys]);\n\n const buffer = useRef('');\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n const focus = useCallback((key?: string) => {\n setInternal((current) => (current.focusedKey === key ? current : { ...current, focusedKey: key }));\n }, []);\n\n const applySelection = useCallback(\n (next: SelectionState) => {\n setInternal((current) => ({ ...next, selectedKeys: controlledKeys ? current.selectedKeys : next.selectedKeys }));\n onSelectionChange?.(next.selectedKeys);\n },\n [controlledKeys, onSelectionChange],\n );\n\n function move(key: string | undefined, extend?: boolean) {\n if (key === undefined) {\n return;\n }\n\n if (extend && mode === 'multiple') {\n applySelection(selectRange(state, key, items));\n return;\n }\n\n focus(key);\n }\n\n return {\n ...state,\n selectedItems,\n clear: () => applySelection(clearSelection(state)),\n focus,\n focusFirst: (extend?: boolean) => move(firstKey(items), extend),\n focusLast: (extend?: boolean) => move(lastKey(items), extend),\n focusNext: (extend?: boolean) => move(nextKey(items, state.focusedKey) ?? state.focusedKey, extend),\n focusPrevious: (extend?: boolean) => move(previousKey(items, state.focusedKey) ?? state.focusedKey, extend),\n // Volta a escolha inicial sem avisar, como o `reset` do formulario faz num controle nativo.\n reset: () => setInternal({ selectedKeys: new Set(defaultSelectedKeys ?? []) }),\n select: (key: string) => applySelection(select(state, key, mode, { allowEmpty })),\n selectRange: (key: string) => applySelection(selectRange(state, key, items)),\n status: selectionStatus(state, items),\n toggleAll: () => applySelection(toggleAll(state, items)),\n search: (character: string) => {\n buffer.current += character;\n clearTimeout(timer.current);\n timer.current = setTimeout(() => {\n buffer.current = '';\n }, typeaheadDelay);\n\n // Com mais de um caractere a busca inclui o item focado, para que\n // digitar \"ca\" nao pule o \"Cartao\" que \"c\" acabou de encontrar.\n const origin = buffer.current.length > 1 ? previousKey(items, state.focusedKey) : state.focusedKey;\n const found = matchKey(items, buffer.current, origin);\n\n if (found) {\n focus(found);\n }\n },\n };\n}\n","import {\n useEffect,\n useId,\n useMemo,\n useRef,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useSelection, type SelectionItem } from '../../../hooks/useSelection';\nimport styles from './Tabs.module.css';\n\nexport interface TabItem {\n content: ReactNode;\n disabled?: boolean;\n key: string;\n label: string;\n}\n\nexport type TabsOrientation = 'horizontal' | 'vertical';\n\nexport interface TabsProps extends ComponentPropsWithRef<'div'> {\n defaultSelectedKey?: string;\n items: readonly TabItem[];\n label: string;\n onSelectionChange?: (key: string) => void;\n orientation?: TabsOrientation;\n selectedKey?: string;\n}\n\nexport function Tabs({\n className,\n defaultSelectedKey,\n items,\n label,\n onSelectionChange,\n orientation = 'horizontal',\n selectedKey,\n ...props\n}: TabsProps) {\n const baseId = `tabs-${useId()}`;\n const nodes = useRef(new Map<string, HTMLElement>());\n const collection = useMemo<SelectionItem[]>(\n () => items.map((item) => ({ key: item.key, disabled: item.disabled, textValue: item.label })),\n [items],\n );\n const primeira = collection.find((item) => !item.disabled)?.key;\n const selection = useSelection({\n items: collection,\n mode: 'single',\n defaultSelectedKeys: selectedKey === undefined ? [defaultSelectedKey ?? primeira ?? ''] : undefined,\n selectedKeys: selectedKey === undefined ? undefined : [selectedKey],\n onSelectionChange: (keys) => {\n const [escolhida] = keys;\n if (escolhida !== undefined) {\n onSelectionChange?.(escolhida);\n }\n },\n });\n const [ativa] = selection.selectedKeys;\n const painel = items.find((item) => item.key === ativa);\n // A lista sempre tem uma parada de Tab: com a escolhida inexistente ou desabilitada, nenhuma aba era alcancavel.\n const parada = collection.some((item) => item.key === ativa && !item.disabled) ? ativa : primeira;\n\n useEffect(() => {\n if (selection.focusedKey) {\n nodes.current.get(selection.focusedKey)?.focus();\n }\n }, [selection.focusedKey]);\n\n // Ativacao automatica: mover o foco troca a aba, conforme o padrao do APG\n // para paineis que carregam instantaneamente.\n function mover(proxima: string | undefined) {\n if (proxima) {\n selection.select(proxima);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n const atual = selection.focusedKey ?? ativa;\n const avancar = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const voltar = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (event.key === avancar) {\n event.preventDefault();\n mover(proximaChave(collection, atual, 1));\n } else if (event.key === voltar) {\n event.preventDefault();\n mover(proximaChave(collection, atual, -1));\n } else if (event.key === 'Home') {\n event.preventDefault();\n mover(collection.find((item) => !item.disabled)?.key);\n } else if (event.key === 'End') {\n event.preventDefault();\n mover([...collection].reverse().find((item) => !item.disabled)?.key);\n }\n }\n\n return (\n <div {...props} className={[styles.tabs, styles[orientation], className].filter(Boolean).join(' ')}>\n <div\n className={styles.list}\n role=\"tablist\"\n aria-label={label}\n aria-orientation={orientation}\n onKeyDown={handleKeyDown}\n >\n {items.map((item) => (\n <button\n key={item.key}\n ref={(node) => {\n if (node) {\n nodes.current.set(item.key, node);\n } else {\n nodes.current.delete(item.key);\n }\n }}\n className={[styles.tab, ativa === item.key && styles.active].filter(Boolean).join(' ')}\n type=\"button\"\n role=\"tab\"\n id={`${baseId}-${item.key}`}\n aria-controls={ativa === item.key ? `${baseId}-${item.key}-panel` : undefined}\n aria-selected={ativa === item.key}\n disabled={item.disabled}\n tabIndex={parada === item.key ? 0 : -1}\n onClick={() => selection.select(item.key)}\n >\n {item.label}\n </button>\n ))}\n </div>\n {painel && (\n <div\n className={styles.panel}\n role=\"tabpanel\"\n id={`${baseId}-${painel.key}-panel`}\n aria-labelledby={`${baseId}-${painel.key}`}\n tabIndex={0}\n >\n {painel.content}\n </div>\n )}\n </div>\n );\n}\n\n// Percorre em circulo, como o APG define para abas.\nfunction proximaChave(items: readonly SelectionItem[], from: string | undefined, passo: 1 | -1) {\n const total = items.length;\n const inicio = items.findIndex((item) => item.key === from);\n\n for (let i = 1; i <= total; i += 1) {\n const item = items[(inicio + passo * i + total * total) % total];\n if (!item.disabled) {\n return item.key;\n }\n }\n\n return from;\n}\n","import type { ComponentPropsWithRef, ElementType } from 'react';\nimport styles from './Breadcrumb.module.css';\nimport { IconChevronRight } from '../../icons';\n\nexport interface BreadcrumbItem {\n href?: string;\n label: string;\n /**\n * Propriedades entregues inteiras ao componente de link. Serve ao roteador\n * que nao usa `href` — o do React Router pede `to`.\n */\n linkProps?: Record<string, unknown>;\n}\n\nexport interface BreadcrumbProps extends ComponentPropsWithRef<'nav'> {\n /** Componente de link da aplicacao, para nao acoplar o sistema a um roteador. */\n as?: ElementType;\n items: readonly BreadcrumbItem[];\n label?: string;\n}\n\nexport function Breadcrumb({\n as: Link = 'a',\n className,\n items,\n label = 'Trilha de navegação',\n ...props\n}: BreadcrumbProps) {\n return (\n <nav {...props} aria-label={label} className={className}>\n <ol className={styles.list}>\n {items.map((item, index) => {\n const atual = index === items.length - 1;\n\n return (\n <li className={styles.item} key={`${item.label}-${index}`}>\n {atual || (item.href === undefined && item.linkProps === undefined) ? (\n <span className={styles.current} aria-current={atual ? 'page' : undefined}>\n {item.label}\n </span>\n ) : (\n <Link className={styles.link} href={item.href} {...item.linkProps}>\n {item.label}\n </Link>\n )}\n {!atual && (\n <IconChevronRight className={styles.separator} size={12} />\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","import { type ComponentPropsWithRef } from 'react';\nimport styles from './Pagination.module.css';\nimport { IconChevronLeft, IconChevronRight } from '../../icons';\n\nexport interface PaginationProps extends ComponentPropsWithRef<'nav'> {\n /** Suspende a troca de pagina, como enquanto a pagina pedida carrega. Os botoes continuam focaveis. */\n disabled?: boolean;\n label?: string;\n onPageChange: (page: number) => void;\n page: number;\n pageCount: number;\n /** Quantidade de paginas mostradas de cada lado da atual. */\n siblings?: number;\n}\n\nexport function Pagination({\n className,\n disabled = false,\n label = 'Paginação',\n onPageChange,\n page,\n pageCount,\n siblings = 1,\n ...props\n}: PaginationProps) {\n if (pageCount <= 1) {\n return null;\n }\n\n const atual = Math.min(Math.max(page, 1), pageCount);\n const paginas = montarFaixa(atual, pageCount, siblings);\n\n function irPara(pagina: number) {\n if (!disabled) {\n onPageChange(pagina);\n }\n }\n\n return (\n <nav {...props} aria-label={label} className={[styles.pagination, className].filter(Boolean).join(' ')}>\n {/* `aria-disabled`, e nao `disabled`: desabilitado na borda, o botao perdia o foco de quem acabou de usa-lo. */}\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Página anterior\"\n aria-disabled={disabled || atual === 1 || undefined}\n onClick={() => atual > 1 && irPara(atual - 1)}\n >\n <IconChevronLeft size={14} />\n </button>\n <ol className={styles.list}>\n {paginas.map((numero, indice) =>\n numero === null ? (\n <li className={styles.gap} key={`gap-${indice}`} aria-hidden=\"true\">\n &hellip;\n </li>\n ) : (\n <li key={numero}>\n <button\n className={[styles.page, numero === atual && styles.current].filter(Boolean).join(' ')}\n type=\"button\"\n aria-label={`Página ${numero}`}\n aria-current={numero === atual ? 'page' : undefined}\n aria-disabled={disabled || undefined}\n onClick={() => irPara(numero)}\n >\n {numero}\n </button>\n </li>\n ),\n )}\n </ol>\n <button\n className={styles.step}\n type=\"button\"\n aria-label=\"Próxima página\"\n aria-disabled={disabled || atual === pageCount || undefined}\n onClick={() => atual < pageCount && irPara(atual + 1)}\n >\n <IconChevronRight size={14} />\n </button>\n </nav>\n );\n}\n\n/**\n * Primeira e ultima pagina sempre visiveis; null representa a reticencia. A faixa tem sempre as mesmas vagas: perto\n * da ponta a janela encosta nela em vez de encolher, e reticencia nunca esconde uma pagina so.\n */\nexport function montarFaixa(atual: number, total: number, vizinhos: number): (number | null)[] {\n const vagas = vizinhos * 2 + 5;\n\n if (total <= vagas) {\n return Array.from({ length: total }, (_, indice) => indice + 1);\n }\n\n const inicio = Math.max(Math.min(atual - vizinhos, total - vizinhos * 2 - 2), 3);\n const fim = Math.min(Math.max(atual + vizinhos, vizinhos * 2 + 3), total - 2);\n const janela = Array.from({ length: fim - inicio + 1 }, (_, indice) => inicio + indice);\n\n return [1, inicio > 3 ? null : 2, ...janela, fim < total - 2 ? null : total - 1, total];\n}\n","import {\n useId,\n useMemo,\n useRef,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type ReactNode,\n} from 'react';\nimport { useSelection, type SelectionItem } from '../../../hooks/useSelection';\nimport styles from './Accordion.module.css';\nimport { IconMinusCircle, IconPlusCircle } from '../../icons';\n\nexport interface AccordionItem {\n content: ReactNode;\n disabled?: boolean;\n key: string;\n label: string;\n}\n\nexport type AccordionIconPosition = 'left' | 'right';\n\nexport interface AccordionProps extends ComponentPropsWithRef<'div'> {\n defaultExpandedKeys?: readonly string[];\n expandedKeys?: readonly string[];\n items: readonly AccordionItem[];\n multiple?: boolean;\n onExpandedChange?: (keys: readonly string[]) => void;\n /** Direita e a convencao da web; esquerda serve a rotulos curtos em coluna estreita. */\n iconPosition?: AccordionIconPosition;\n /** Divisor entre as secoes, com a folga que ele exige. */\n divider?: boolean;\n}\n\nexport function Accordion({\n className,\n defaultExpandedKeys,\n expandedKeys,\n items,\n multiple = false,\n onExpandedChange,\n iconPosition = 'right',\n divider = true,\n ...props\n}: AccordionProps) {\n const baseId = `accordion-${useId()}`;\n const nodes = useRef(new Map<string, HTMLElement>());\n const collection = useMemo<SelectionItem[]>(\n () => items.map((item) => ({ key: item.key, disabled: item.disabled, textValue: item.label })),\n [items],\n );\n const selection = useSelection({\n // Uma secao aberta fecha ao ser clicada de novo, e nenhuma aberta e um\n // estado valido do acordeao — ao contrario de uma aba, que sempre tem uma.\n allowEmpty: true,\n items: collection,\n mode: multiple ? 'multiple' : 'single',\n defaultSelectedKeys: expandedKeys === undefined ? defaultExpandedKeys : undefined,\n selectedKeys: expandedKeys,\n onSelectionChange: (keys) => onExpandedChange?.([...keys]),\n });\n\n function handleKeyDown(event: KeyboardEvent<HTMLButtonElement>, key: string) {\n let destino: string | undefined;\n\n if (event.key === 'ArrowDown') {\n destino = proxima(collection, key, 1);\n } else if (event.key === 'ArrowUp') {\n destino = proxima(collection, key, -1);\n } else if (event.key === 'Home') {\n destino = collection.find((item) => !item.disabled)?.key;\n } else if (event.key === 'End') {\n destino = [...collection].reverse().find((item) => !item.disabled)?.key;\n }\n\n if (destino) {\n event.preventDefault();\n nodes.current.get(destino)?.focus();\n }\n }\n\n return (\n <div\n {...props}\n className={[styles.accordion, divider && styles.divided, className].filter(Boolean).join(' ')}\n >\n {items.map((item) => {\n const aberto = selection.selectedKeys.has(item.key);\n\n return (\n <div className={styles.item} key={item.key}>\n <h3 className={styles.heading}>\n <button\n ref={(node) => {\n if (node) {\n nodes.current.set(item.key, node);\n } else {\n nodes.current.delete(item.key);\n }\n }}\n className={[styles.trigger, iconPosition === 'left' && styles.iconLeft].filter(Boolean).join(' ')}\n type=\"button\"\n id={`${baseId}-${item.key}`}\n aria-controls={`${baseId}-${item.key}-panel`}\n aria-expanded={aberto}\n disabled={item.disabled}\n onClick={() => selection.select(item.key)}\n onKeyDown={(event) => handleKeyDown(event, item.key)}\n >\n <span className={styles.label}>{item.label}</span>\n {aberto ? (\n <IconMinusCircle className={styles.icon} size={20} />\n ) : (\n <IconPlusCircle className={styles.icon} size={20} />\n )}\n </button>\n </h3>\n <div\n className={styles.panel}\n id={`${baseId}-${item.key}-panel`}\n role=\"region\"\n aria-labelledby={`${baseId}-${item.key}`}\n hidden={!aberto}\n >\n {item.content}\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction proxima(items: readonly SelectionItem[], from: string, passo: 1 | -1) {\n const total = items.length;\n const inicio = items.findIndex((item) => item.key === from);\n\n for (let i = 1; i <= total; i += 1) {\n const item = items[(inicio + passo * i + total * total) % total];\n if (!item.disabled) {\n return item.key;\n }\n }\n\n return from;\n}\n","import { useCallback, useRef, useState } from 'react';\n\nconst OVERSCAN = 6;\n\n/** Quantos itens entram antes da primeira medida: montar dez mil nos para medir um custava o primeiro render. */\nconst PRIMEIRA_JANELA = 24;\n\n/** O passo entre itens inclui o espaco que o container coloca entre eles; so a altura acumulava erro. */\nfunction medirPasso(node: HTMLElement) {\n const proximo = node.nextElementSibling as HTMLElement | null;\n\n return proximo ? proximo.offsetTop - node.offsetTop : node.offsetHeight;\n}\n\nexport function useVirtualWindow(total: number, height?: number) {\n const scrollElement = useRef<HTMLElement | null>(null);\n const firstItem = useRef<HTMLElement | null>(null);\n const firstIndex = useRef(0);\n const observer = useRef<ResizeObserver | null>(null);\n // `null` e \"ainda nao medido\"; zero e \"sem layout\", como no jsdom ou na lista montada escondida.\n const [itemHeight, setItemHeight] = useState<number | null>(null);\n const [scrollTop, setScrollTop] = useState(0);\n\n const measureItem = useCallback((node: HTMLElement | null) => {\n firstItem.current = node;\n\n if (node) {\n const passo = medirPasso(node);\n setItemHeight((current) => (passo > 0 ? passo : (current ?? 0)));\n }\n }, []);\n\n const attachScroll = useCallback((node: HTMLElement | null) => {\n scrollElement.current = node;\n observer.current?.disconnect();\n observer.current = null;\n\n if (!node || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n // Montada escondida, a lista mede zero; quando aparece, o tamanho muda e ela mede de novo.\n observer.current = new ResizeObserver(() => {\n const passo = firstItem.current ? medirPasso(firstItem.current) : 0;\n\n if (passo > 0) {\n setItemHeight(passo);\n }\n });\n observer.current.observe(node);\n }, []);\n\n const onScroll = useCallback(() => {\n setScrollTop(scrollElement.current?.scrollTop ?? 0);\n }, []);\n\n const passo = itemHeight ?? 0;\n const active = height !== undefined && passo > 0 && total * passo > height;\n const medindo = height !== undefined && itemHeight === null;\n\n const scrollToIndex = useCallback(\n (index: number) => {\n const element = scrollElement.current;\n const primeiro = firstItem.current;\n\n if (!element || !primeiro || index < 0 || passo <= 0) {\n return;\n }\n\n // A conta parte do primeiro item montado, e nao do topo: antes dele pode haver o grupo de selecionados.\n const topoDoPrimeiro = primeiro.getBoundingClientRect().top - element.getBoundingClientRect().top + element.scrollTop;\n const top = topoDoPrimeiro + (index - firstIndex.current) * passo;\n const bottom = top + passo;\n\n if (top < element.scrollTop) {\n element.scrollTop = top;\n } else if (bottom > element.scrollTop + element.clientHeight) {\n element.scrollTop = bottom - element.clientHeight;\n }\n },\n [passo],\n );\n\n if (!active) {\n firstIndex.current = 0;\n\n return {\n active,\n attachScroll,\n measureItem,\n onScroll,\n padding: { before: 0, after: 0 },\n scrollToIndex,\n start: 0,\n end: medindo ? Math.min(total, PRIMEIRA_JANELA) : total,\n };\n }\n\n const perScreen = Math.ceil(height / passo);\n const start = Math.max(0, Math.floor(scrollTop / passo) - OVERSCAN);\n const end = Math.min(total, start + perScreen + OVERSCAN * 2);\n\n firstIndex.current = start;\n\n return {\n active,\n attachScroll,\n measureItem,\n onScroll,\n padding: { before: start * passo, after: (total - end) * passo },\n scrollToIndex,\n start,\n end,\n };\n}\n","import { useCallback, useEffect, type CSSProperties, type KeyboardEvent, type ReactNode, type RefObject } from 'react';\nimport type { Listing, ListingItem } from './useListing';\nimport { useVirtualWindow } from './useVirtualWindow';\nimport styles from './List.module.css';\n\nexport interface ListingOptionsProps {\n baseId: string;\n className?: string;\n elementRef?: RefObject<HTMLElement | null>;\n empty?: ReactNode;\n height?: number;\n label?: string;\n listing: Listing;\n loading?: boolean;\n loadingMessage?: string;\n holdsFocus?: boolean;\n onKeyDown?: (event: KeyboardEvent<HTMLElement>) => void;\n onSelect?: (item: ListingItem) => void;\n style?: CSSProperties;\n tabIndex?: number;\n}\n\nexport function optionId(baseId: string, index: number) {\n return baseId + '-option-' + index;\n}\n\nexport function ListingOptions({\n baseId,\n className,\n elementRef,\n empty,\n height,\n holdsFocus = true,\n label,\n listing,\n loading = false,\n loadingMessage = 'Carregando',\n onKeyDown,\n onSelect,\n style,\n tabIndex = 0,\n}: ListingOptionsProps) {\n const { detached, focusedKey, isSelected, select, selectionMode, visible } = listing;\n const activeIndex = visible.findIndex((item) => item.value === focusedKey);\n\n function choose(item: ListingItem, extend: boolean) {\n if (item.disabled) {\n return;\n }\n\n select(item, extend);\n onSelect?.(item);\n }\n const { active, attachScroll, measureItem, onScroll, padding, scrollToIndex, start, end } = useVirtualWindow(\n visible.length,\n height,\n );\n\n const attachElement = useCallback(\n (node: HTMLElement | null) => {\n attachScroll(node);\n\n if (elementRef) {\n elementRef.current = node;\n }\n },\n [attachScroll, elementRef],\n );\n\n useEffect(() => {\n const index = visible.findIndex((item) => item.value === focusedKey);\n\n if (focusedKey === undefined || index < 0) {\n return;\n }\n\n if (active) {\n scrollToIndex(index);\n } else {\n document.getElementById(optionId(baseId, index))?.scrollIntoView?.({ block: 'nearest' });\n }\n }, [active, baseId, focusedKey, scrollToIndex, visible]);\n\n const rendered = visible.slice(start, end);\n\n if (selectionMode === 'none') {\n return (\n <ul\n aria-busy={loading || undefined}\n className={[styles.options, className].filter(Boolean).join(' ')}\n id={baseId + '-options'}\n onScroll={onScroll}\n ref={attachElement}\n style={{ height, ...style }}\n >\n {loading && <li className={styles.status}>{loadingMessage}</li>}\n <li aria-hidden=\"true\" className={styles.spacer} style={{ height: padding.before }} />\n {rendered.map((item, index) => (\n <li className={styles.option} key={item.value} ref={index === 0 ? measureItem : undefined}>\n {item.label}\n </li>\n ))}\n <li aria-hidden=\"true\" className={styles.spacer} style={{ height: padding.after }} />\n {!loading && visible.length === 0 && empty}\n </ul>\n );\n }\n\n function renderOption(item: ListingItem, position: number, measured: boolean) {\n const selected = isSelected(item.value);\n\n return (\n <div\n aria-disabled={item.disabled || undefined}\n aria-posinset={position > 0 ? position : undefined}\n aria-selected={selected}\n aria-setsize={position > 0 ? visible.length : undefined}\n className={[styles.option, focusedKey === item.value && styles.focused, item.disabled && styles.disabled]\n .filter(Boolean)\n .join(' ')}\n id={position > 0 ? optionId(baseId, position - 1) : undefined}\n key={item.value}\n onClick={(event) => choose(item, event.shiftKey)}\n // So segura o foco onde ele esta quando quem o tem e o campo de busca; a lista que detem o foco o recebe.\n onMouseDown={holdsFocus ? undefined : (event) => event.preventDefault()}\n ref={measured ? measureItem : undefined}\n role=\"option\"\n >\n {selectionMode === 'multiple' && (\n <span aria-hidden=\"true\" className={[styles.box, selected && styles.checked].filter(Boolean).join(' ')} />\n )}\n {item.label}\n </div>\n );\n }\n\n return (\n <div\n aria-activedescendant={holdsFocus && activeIndex >= 0 ? optionId(baseId, activeIndex) : undefined}\n aria-busy={loading || undefined}\n aria-label={label}\n aria-multiselectable={selectionMode === 'multiple' || undefined}\n className={[styles.options, className].filter(Boolean).join(' ')}\n id={baseId + '-options'}\n onKeyDown={onKeyDown}\n onScroll={onScroll}\n ref={attachElement}\n role=\"listbox\"\n style={{ height, ...style }}\n tabIndex={holdsFocus ? tabIndex : undefined}\n >\n {loading && <p className={styles.status}>{loadingMessage}</p>}\n {detached.length > 0 && (\n <div aria-label=\"Selecionados\" className={styles.group} role=\"group\">\n {detached.map((item) => renderOption(item, 0, false))}\n </div>\n )}\n <div aria-hidden=\"true\" className={styles.spacer} style={{ height: padding.before }} />\n {rendered.map((item, index) => renderOption(item, start + index + 1, index === 0))}\n <div aria-hidden=\"true\" className={styles.spacer} style={{ height: padding.after }} />\n {!loading && visible.length === 0 && empty}\n </div>\n );\n}\n","import { useMemo, useRef, useState, type KeyboardEvent } from 'react';\nimport { useSelection, type SelectionItem, type SelectionStatus } from '../../../hooks/useSelection';\nimport { containsTerm } from '../../../utils/textSearch';\n\nexport type ListingSelectionMode = 'none' | 'single' | 'multiple';\n\nexport interface ListingItem {\n disabled?: boolean;\n label: string;\n value: string;\n}\n\nexport interface UseListingOptions {\n defaultValue?: readonly ListingItem[];\n items: readonly ListingItem[];\n onSearch?: (term: string) => void;\n onSelectionChange?: (items: readonly ListingItem[]) => void;\n selectionMode?: ListingSelectionMode;\n value?: readonly ListingItem[];\n}\n\nexport interface Listing {\n detached: readonly ListingItem[];\n focus: (value?: string) => void;\n focusFirst: () => void;\n focusLast: () => void;\n focusedKey?: string;\n handleKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n isSelected: (value: string) => boolean;\n filter: (term: string) => void;\n reset: () => void;\n typeahead: (character: string) => void;\n select: (item: ListingItem, extend?: boolean) => void;\n selected: readonly ListingItem[];\n selectionMode: ListingSelectionMode;\n status: SelectionStatus;\n toggleAll: () => void;\n term: string;\n visible: readonly ListingItem[];\n}\n\n/** Teclas que, num campo de texto, editam o texto; nele, a listagem nao as toma para si. */\nconst TECLAS_DE_EDICAO = ['Home', 'End', ' '];\n\nexport function useListing({\n defaultValue,\n items,\n onSearch,\n onSelectionChange,\n selectionMode = 'none',\n value,\n}: UseListingOptions): Listing {\n const [term, setTerm] = useState('');\n\n const visible = useMemo(() => {\n if (onSearch || !term) {\n return items;\n }\n\n return items.filter((item) => containsTerm(item.label, term));\n }, [items, onSearch, term]);\n\n const collection = useMemo<SelectionItem[]>(\n () => visible.map((item) => ({ key: item.value, disabled: item.disabled, textValue: item.label })),\n [visible],\n );\n\n // Toda opcao ja vista fica registrada, inclusive a que so chegou pelo valor. Com busca assincrona, `items`\n // e trocada a cada consulta, e resolver a escolha so contra ela descartava o que veio de outra consulta.\n const conhecidos = useRef(new Map<string, ListingItem>());\n\n for (const item of [...(defaultValue ?? []), ...(value ?? [])]) {\n if (!conhecidos.current.has(item.value)) {\n conhecidos.current.set(item.value, item);\n }\n }\n\n for (const item of items) {\n conhecidos.current.set(item.value, item);\n }\n\n const conhecido = (chave: string): ListingItem => conhecidos.current.get(chave) ?? { value: chave, label: '' };\n\n const selection = useSelection({\n items: collection,\n mode: selectionMode,\n defaultSelectedKeys: defaultValue?.map((item) => item.value),\n selectedKeys: value?.map((item) => item.value),\n onSelectionChange: (keys) => onSelectionChange?.([...keys].map(conhecido)),\n });\n\n const selected = (value ?? selection.selectedItems.map((item) => ({ value: item.key, label: '' }))).map((item) =>\n conhecido(item.value),\n );\n\n const detached = useMemo(() => {\n if (!term || selectionMode !== 'multiple') {\n return [];\n }\n\n const visibleValues = new Set(visible.map((item) => item.value));\n\n return selected.filter((item) => !visibleValues.has(item.value));\n }, [selected, selectionMode, term, visible]);\n\n function handleKeyDown(event: KeyboardEvent<HTMLElement>) {\n if (selectionMode === 'none' || (event.target instanceof HTMLInputElement && TECLAS_DE_EDICAO.includes(event.key))) {\n return;\n }\n\n const estender = event.shiftKey;\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n if (selection.focusedKey === undefined) {\n selection.focusFirst(estender);\n } else {\n selection.focusNext(estender);\n }\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n selection.focusPrevious(estender);\n } else if (event.key === 'Home') {\n event.preventDefault();\n selection.focusFirst(estender);\n } else if (event.key === 'End') {\n event.preventDefault();\n selection.focusLast(estender);\n } else if (event.key === 'Enter' || event.key === ' ') {\n const focused = visible.find((item) => item.value === selection.focusedKey);\n\n if (focused && !focused.disabled) {\n event.preventDefault();\n selection.select(focused.value);\n }\n }\n }\n\n return {\n detached,\n focus: selection.focus,\n focusFirst: selection.focusFirst,\n focusLast: selection.focusLast,\n focusedKey: selection.focusedKey,\n handleKeyDown,\n isSelected: (itemValue) => selected.some((item) => item.value === itemValue),\n filter: (nextTerm) => {\n setTerm(nextTerm);\n selection.focus(undefined);\n onSearch?.(nextTerm);\n },\n reset: selection.reset,\n typeahead: selection.search,\n select: (item, extend) => {\n if (item.disabled) {\n return;\n }\n\n if (extend && selectionMode === 'multiple') {\n selection.selectRange(item.value);\n return;\n }\n\n selection.select(item.value);\n },\n selected,\n selectionMode,\n status: selection.status,\n toggleAll: selection.toggleAll,\n term,\n visible,\n };\n}\n","import styles from './Field.module.css';\n\nexport interface FormValueProps {\n disabled: boolean;\n name?: string;\n /** O navegador foca o campo invalido no envio; o foco segue para o controle que a pessoa enxerga. */\n onFocus: () => void;\n required: boolean;\n value: string;\n}\n\n/**\n * Leva ao formulario o valor de um campo sem controle nativo por baixo. Oculto quando basta enviar; obrigatorio, vai\n * num campo que o navegador valida, porque o oculto fica fora da validacao e o envio vazio passava.\n */\nexport function FormValue({ disabled, name, onFocus, required, value }: FormValueProps) {\n if (required) {\n return (\n <input\n aria-hidden\n autoComplete=\"off\"\n className={styles.formValue}\n disabled={disabled}\n name={name}\n onChange={() => undefined}\n onFocus={onFocus}\n required\n tabIndex={-1}\n value={value}\n />\n );\n }\n\n return name === undefined ? null : <input disabled={disabled} name={name} type=\"hidden\" value={value} />;\n}\n","import {\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions } from '../../data-display/List/ListingOptions';\nimport { useListing, type Listing } from '../../data-display/List/useListing';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './Select.module.css';\nimport { IconChevronDown } from '../../icons';\n\nexport type SelectSize = 'sm' | 'md';\n\nexport interface SelectOption {\n disabled?: boolean;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao gatilho, que e o controle; o `className` soma ao do sistema. */\nexport interface SelectProps\n extends Omit<ComponentPropsWithRef<'button'>, 'children' | 'defaultValue' | 'name' | 'onChange' | 'type' | 'value'> {\n defaultValue?: string;\n error?: string;\n hint?: string;\n label?: string;\n /**\n * Nome do campo no formulario. Com ele, um input oculto carrega o valor para\n * o `FormData`: sem controle nativo por baixo, o envio ignorava o campo.\n */\n name?: string;\n onValueChange?: (value: string) => void;\n options: readonly SelectOption[];\n placeholder?: string;\n required?: boolean;\n size?: SelectSize;\n value?: string;\n}\n\nexport function Select({\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n error,\n hint,\n id: providedId,\n label,\n onClick,\n onKeyDown,\n onValueChange,\n options,\n placeholder = 'Selecione',\n ref,\n required = false,\n size = 'md',\n value,\n ...props\n}: SelectProps) {\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const resetRef = useFormReset<HTMLButtonElement>(() => listing.reset());\n const mergedRef = useMergedRefs(triggerRef, resetRef, ref);\n\n // O valor e a chave, e nao a opcao: com opcoes que chegam depois, filtrar por elas perdia a escolha.\n const listing = useListing({\n items: options,\n selectionMode: 'single',\n defaultValue: defaultValue === undefined ? undefined : [{ value: defaultValue, label: '' }],\n value: value === undefined ? undefined : [{ value, label: '' }],\n onSelectionChange: (chosen) => {\n const [first] = chosen;\n\n if (first) {\n onValueChange?.(first.value);\n }\n },\n });\n\n const [chosen] = listing.selected;\n\n function fechar() {\n setOpen(false);\n triggerRef.current?.focus();\n }\n\n function abrir() {\n if (disabled) {\n return;\n }\n\n listing.focus(chosen?.value ?? options.find((option) => !option.disabled)?.value);\n setOpen(true);\n }\n\n function handleTriggerKeyDown(event: KeyboardEvent<HTMLButtonElement>) {\n onKeyDown?.(event);\n\n if (['ArrowDown', 'ArrowUp', 'Enter', ' '].includes(event.key)) {\n event.preventDefault();\n abrir();\n }\n }\n\n function handleTriggerClick(event: MouseEvent<HTMLButtonElement>) {\n onClick?.(event);\n\n if (open) {\n fechar();\n } else {\n abrir();\n }\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => (\n <>\n <FormValue\n disabled={disabled}\n name={name}\n onFocus={() => triggerRef.current?.focus()}\n required={required}\n value={chosen?.value ?? ''}\n />\n <button\n {...props}\n ref={mergedRef}\n className={[styles.trigger, styles[size], error && styles.error, className].filter(Boolean).join(' ')}\n type=\"button\"\n id={id}\n role=\"combobox\"\n aria-describedby={describedBy}\n aria-invalid={invalid || undefined}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-required={required || undefined}\n disabled={disabled}\n onClick={handleTriggerClick}\n onKeyDown={handleTriggerKeyDown}\n >\n <span className={chosen?.label ? styles.value : styles.placeholder}>{chosen?.label || placeholder}</span>\n <IconChevronDown className={styles.chevron} size={14} />\n </button>\n {open &&\n createPortal(\n <SelectListbox\n label={label ?? placeholder}\n listing={listing}\n onClose={fechar}\n triggerRef={triggerRef}\n />,\n document.body,\n )}\n </>\n )}\n </Field>\n );\n}\n\nfunction SelectListbox({\n label,\n listing,\n onClose,\n triggerRef,\n}: {\n label: string;\n listing: Listing;\n onClose: () => void;\n triggerRef: React.RefObject<HTMLButtonElement | null>;\n}) {\n const panelRef = useRef<HTMLDivElement>(null);\n const listboxRef = useRef<HTMLElement | null>(null);\n // `Math.random` mudava entre servidor e cliente.\n const baseId = `listbox-${useId()}`;\n\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: true,\n shouldCloseOnBlur: false,\n // O gatilho nao conta como \"fora\": sem isto o ponteiro fecha o painel e o\n // clique dele reabre em seguida, e ele pisca sem abrir.\n shouldCloseOnInteractOutside: (elemento) => !triggerRef.current?.contains(elemento),\n },\n panelRef,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: true,\n });\n const [largura, setLargura] = useState<number>();\n // useOverlayPosition entrega toda a altura disponivel; limitamos para que\n // uma lista longa nao ocupe a tela inteira.\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(triggerRef.current?.offsetWidth);\n }, [triggerRef]);\n\n useEffect(() => {\n listboxRef.current?.focus();\n }, []);\n\n function handleKeyDown(event: KeyboardEvent<HTMLElement>) {\n if (event.key === 'Escape' || event.key === 'Tab') {\n onClose();\n return;\n }\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (alvo && !alvo.disabled) {\n listing.select(alvo);\n onClose();\n }\n return;\n }\n\n if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n listing.typeahead(event.key);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <div\n {...overlayProps}\n ref={panelRef}\n className={styles.panel}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n elementRef={listboxRef}\n label={label}\n listing={listing}\n onKeyDown={(event) => {\n // Espalhar overlayProps antes nao basta: este onKeyDown o substituiria.\n handleKeyDown(event);\n overlayProps.onKeyDown?.(event as KeyboardEvent<HTMLDivElement>);\n }}\n onSelect={onClose}\n tabIndex={-1}\n />\n </div>\n );\n}\n","import type { HTMLAttributes } from 'react';\nimport styles from './Badge.module.css';\n\nexport type BadgeTone = 'ok' | 'warn' | 'info' | 'danger' | 'primary' | 'neutral';\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n dot?: boolean;\n outline?: boolean;\n tone?: BadgeTone;\n}\n\nexport function Badge({ children, className, dot = false, outline = false, tone = 'neutral', ...props }: BadgeProps) {\n const classes = [styles.badge, styles[tone], outline && styles.outline, className]\n .filter(Boolean)\n .join(' ');\n\n return (\n <span {...props} className={classes}>\n {dot && <span className={styles.dot} aria-hidden=\"true\" />}\n {children}\n </span>\n );\n}\n","import {\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n} from 'react';\nimport { createPortal, flushSync } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { ListingOptions, optionId } from '../../data-display/List/ListingOptions';\nimport { useListing, type ListingItem } from '../../data-display/List/useListing';\nimport { Badge } from '../../data-display/Badge';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './ComboBox.module.css';\n\nexport type ComboBoxSize = 'sm' | 'md';\n\nexport interface ComboBoxOption {\n disabled?: boolean;\n label: string;\n value: string;\n}\n\n/** As propriedades nativas vao ao campo de texto, que e o controle; o `className` soma ao do sistema. */\ninterface ComboBoxBaseProps\n extends Omit<ComponentPropsWithRef<'input'>, 'defaultValue' | 'name' | 'onChange' | 'size' | 'type' | 'value'> {\n emptyMessage?: string;\n error?: string;\n hint?: string;\n label?: string;\n /**\n * Nome do campo no formulario. Com ele, um input oculto carrega o valor para\n * o `FormData`: sem controle nativo por baixo, o envio ignorava o campo.\n */\n name?: string;\n loading?: boolean;\n onSearch?: (term: string) => void;\n options: readonly ComboBoxOption[];\n size?: ComboBoxSize;\n}\n\nexport interface ComboBoxSingleProps extends ComboBoxBaseProps {\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n selectionMode?: 'single';\n value?: string;\n}\n\nexport interface ComboBoxMultipleProps extends ComboBoxBaseProps {\n defaultValue?: readonly string[];\n onValueChange?: (values: readonly string[]) => void;\n selectionMode: 'multiple';\n value?: readonly string[];\n}\n\nexport type ComboBoxProps = ComboBoxSingleProps | ComboBoxMultipleProps;\n\nfunction comoItens(valor: string | readonly string[] | undefined): ListingItem[] | undefined {\n if (valor === undefined) {\n return undefined;\n }\n\n return (typeof valor === 'string' ? [valor] : valor).map((value) => ({ value, label: '' }));\n}\n\nfunction relatarEscolha(props: ComboBoxProps, escolhidos: readonly ListingItem[]) {\n if (props.selectionMode === 'multiple') {\n props.onValueChange?.(escolhidos.map((item) => item.value));\n return;\n }\n\n const [primeiro] = escolhidos;\n\n if (primeiro) {\n props.onValueChange?.(primeiro.value);\n }\n}\n\nexport function ComboBox(allProps: ComboBoxProps) {\n const {\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n emptyMessage = 'Nenhum resultado',\n error,\n hint,\n id: providedId,\n label,\n loading = false,\n onBlur,\n onClick,\n onKeyDown,\n onSearch,\n // Fora do resto, que vai ao campo: quem o chama e `relatarEscolha`, que conhece o modo.\n onValueChange,\n options,\n placeholder,\n ref,\n required = false,\n selectionMode = 'single',\n size = 'md',\n value,\n ...props\n } = allProps;\n const multiple = selectionMode === 'multiple';\n const inputRef = useRef<HTMLInputElement>(null);\n const controlRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const baseId = `combobox-${useId()}`;\n const [open, setOpen] = useState(false);\n const [filtering, setFiltering] = useState(false);\n const resetRef = useFormReset<HTMLInputElement>(() => {\n listing.reset();\n fechar();\n });\n const mergedRef = useMergedRefs(inputRef, resetRef, ref);\n\n // O valor e a chave, e nao a opcao: com opcoes que chegam depois, filtrar por elas perdia a escolha.\n const listing = useListing({\n items: options,\n selectionMode,\n defaultValue: comoItens(defaultValue),\n value: comoItens(value),\n onSearch,\n onSelectionChange: (escolhidos) => relatarEscolha(allProps, escolhidos),\n });\n\n const escolhidos = listing.selected;\n const [chosen] = escolhidos;\n // Na escolha multipla o campo so guarda a busca: quem mostra o que esta escolhido sao as etiquetas.\n const texto = multiple || filtering ? listing.term : chosen?.label ?? '';\n const ancoraRef = multiple ? controlRef : inputRef;\n const activeIndex = listing.visible.findIndex((option) => option.value === listing.focusedKey);\n\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: ancoraRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: open,\n });\n const [largura, setLargura] = useState<number>();\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 280, 280);\n\n useLayoutEffect(() => {\n setLargura(ancoraRef.current?.offsetWidth);\n }, [ancoraRef, open]);\n\n // Sem medida, como no servidor, o campo resume as escolhas; medido, mostra todas as etiquetas enquanto couberem.\n const [resumir, setResumir] = useState(true);\n const selecaoRef = useRef<HTMLSpanElement>(null);\n const chaveDasEscolhas = escolhidos.map((item) => item.value).join('\\n');\n\n useLayoutEffect(() => {\n const moldura = controlRef.current;\n\n if (!moldura || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n // Desenhar todas e medir na mesma passada, antes da pintura, para o campo nao piscar ao redimensionar.\n const observador = new ResizeObserver(() => {\n flushSync(() => setResumir(false));\n const selecao = selecaoRef.current;\n flushSync(() => setResumir(Boolean(selecao && selecao.scrollWidth > selecao.clientWidth)));\n });\n\n observador.observe(moldura);\n\n return () => observador.disconnect();\n }, [chaveDasEscolhas, multiple]);\n\n function encerrarFiltro() {\n setFiltering(false);\n listing.filter('');\n }\n\n function fechar() {\n setOpen(false);\n encerrarFiltro();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n listing.focusFirst();\n return;\n }\n\n if (event.key === 'Escape') {\n fechar();\n return;\n }\n\n if (event.key === 'Enter') {\n const alvo = listing.visible.find((option) => option.value === listing.focusedKey);\n\n if (open && alvo && !alvo.disabled) {\n event.preventDefault();\n listing.select(alvo);\n\n if (!multiple) {\n fechar();\n }\n }\n return;\n }\n\n const ultimo = escolhidos[escolhidos.length - 1];\n\n if (event.key === 'Backspace' && multiple && texto === '' && ultimo) {\n listing.select(ultimo);\n return;\n }\n\n listing.handleKeyDown(event);\n }\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => {\n const resumoId = id + '-selection';\n const campo = (\n <input\n {...props}\n ref={mergedRef}\n className={[multiple ? styles.search : styles.input, !multiple && styles[size], !multiple && error && styles.error, className]\n .filter(Boolean)\n .join(' ')}\n id={id}\n type=\"text\"\n role=\"combobox\"\n autoComplete=\"off\"\n aria-describedby={[describedBy, multiple && escolhidos.length > 0 && resumoId].filter(Boolean).join(' ') || undefined}\n aria-invalid={invalid || undefined}\n aria-expanded={open}\n aria-autocomplete=\"list\"\n aria-controls={open ? baseId + '-options' : undefined}\n aria-activedescendant={open && activeIndex >= 0 ? optionId(baseId, activeIndex) : undefined}\n aria-required={required || undefined}\n disabled={disabled}\n placeholder={placeholder}\n value={texto}\n // Sair do campo desfaz a busca: o texto volta a dizer o que esta escolhido.\n onBlur={(event: FocusEvent<HTMLInputElement>) => {\n fechar();\n onBlur?.(event);\n }}\n onChange={(event) => {\n setFiltering(true);\n setOpen(true);\n listing.filter(event.target.value);\n }}\n onClick={(event: MouseEvent<HTMLInputElement>) => {\n setOpen(true);\n onClick?.(event);\n }}\n onKeyDown={handleKeyDown}\n />\n );\n\n return (\n <>\n {(escolhidos.length > 0 ? escolhidos : [undefined]).map((item) => (\n <FormValue\n disabled={disabled}\n key={item?.value ?? ''}\n name={name}\n onFocus={() => inputRef.current?.focus()}\n required={required}\n value={item?.value ?? ''}\n />\n ))}\n {multiple ? (\n <div\n className={[styles.control, styles[size], error && styles.error].filter(Boolean).join(' ')}\n // O clique na moldura, fora do campo, leva o foco a ele em vez de tira-lo.\n onMouseDown={(event) => {\n if (event.target !== inputRef.current) {\n event.preventDefault();\n inputRef.current?.focus();\n }\n }}\n ref={controlRef}\n >\n {chosen && (\n <>\n <span aria-hidden=\"true\" className={styles.selection} ref={selecaoRef}>\n {(resumir ? [chosen] : escolhidos).map((item) => (\n <Badge key={item.value}>{item.label}</Badge>\n ))}\n {resumir && escolhidos.length > 1 && (\n <span className={styles.rest}>+{escolhidos.length - 1}</span>\n )}\n </span>\n <span className={styles.summary} id={resumoId}>\n {escolhidos.length === 1 ? '1 selecionado' : `${escolhidos.length} selecionados`}:{' '}\n {escolhidos.map((item) => item.label).join(', ')}\n </span>\n </>\n )}\n {campo}\n </div>\n ) : (\n campo\n )}\n {open &&\n createPortal(\n <div\n ref={panelRef}\n className={styles.panel}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n // O clique no painel, fora de uma opcao, nao tira o foco do campo nem fecha a lista.\n onMouseDown={(event) => event.preventDefault()}\n style={{ ...positionProps.style, width: largura, maxHeight: alturaMaxima }}\n >\n <ListingOptions\n baseId={baseId}\n empty={<p className={styles.empty}>{emptyMessage}</p>}\n holdsFocus={false}\n label={label ?? placeholder ?? 'Opções'}\n listing={listing}\n loading={loading}\n onSelect={multiple ? undefined : fechar}\n />\n </div>,\n document.body,\n )}\n </>\n );\n }}\n </Field>\n );\n}\n","import {\n cloneElement,\n useEffect,\n useMemo,\n useRef,\n useState,\n type KeyboardEvent,\n type ReactElement,\n type Ref,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { FocusScope } from '@react-aria/focus';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { useSelection, type SelectionItem } from '../../../hooks/useSelection';\nimport styles from './Menu.module.css';\n\nexport interface MenuItem {\n disabled?: boolean;\n key: string;\n label: string;\n onSelect?: () => void;\n}\n\nexport interface MenuProps {\n children: ReactElement<Record<string, unknown>>;\n /** Abertura inicial no modo nao controlado. */\n defaultOpen?: boolean;\n items: readonly MenuItem[];\n label: string;\n /** Avisa cada abertura e fechamento pedidos pelo gatilho, pelo teclado, pela opcao ou pelo clique fora. */\n onOpenChange?: (open: boolean) => void;\n /** Controla a abertura; sem ele, o menu guarda o proprio estado. */\n open?: boolean;\n}\n\n/** Encadeia o manipulador do gatilho ao do menu, em vez de substitui-lo. */\nfunction encadear<E>(proprio: ((evento: E) => void) | undefined, seguinte: (evento: E) => void) {\n return (evento: E) => {\n proprio?.(evento);\n seguinte(evento);\n };\n}\n\nexport function Menu({ children, defaultOpen = false, items, label, onOpenChange, open: controlledOpen }: MenuProps) {\n const triggerRef = useRef<HTMLElement>(null);\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const [openedWith, setOpenedWith] = useState<'first' | 'last'>('first');\n const open = controlledOpen ?? internalOpen;\n\n function setOpen(proximo: boolean) {\n setInternalOpen(proximo);\n onOpenChange?.(proximo);\n }\n\n function abrir(from: 'first' | 'last') {\n setOpenedWith(from);\n setOpen(true);\n }\n\n // O foco volta na hora, antes de o `onSelect` montar o que vem depois, como um campo com `autoFocus` ou\n // um Dialog, que guarda o elemento em foco para devolver. Clique fora nao devolve: o foco e de quem foi clicado.\n function fechar(devolverFoco: boolean) {\n setOpen(false);\n\n if (devolverFoco) {\n triggerRef.current?.focus();\n }\n }\n\n const dono = children.props;\n const mergedTriggerRef = useMergedRefs(triggerRef, dono.ref as Ref<HTMLElement> | undefined);\n const trigger = cloneElement(children, {\n ref: mergedTriggerRef,\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n onClick: encadear(dono.onClick as (evento: unknown) => void, () =>\n open ? fechar(true) : abrir('first'),\n ),\n onKeyDown: encadear(dono.onKeyDown as (evento: KeyboardEvent) => void, (event: KeyboardEvent) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n abrir(event.key === 'ArrowDown' ? 'first' : 'last');\n }\n }),\n });\n\n return (\n <>\n {trigger}\n {open &&\n typeof document !== 'undefined' &&\n createPortal(\n // O escopo proprio poe o menu na arvore de escopos do Dialog, cujo `contain` puxaria o foco de volta.\n // Sem `contain` aqui: ele disputaria o foco com o gatilho quando o menu fecha.\n <FocusScope>\n <MenuList\n items={items}\n label={label}\n openedWith={openedWith}\n onClose={fechar}\n triggerRef={triggerRef}\n />\n </FocusScope>,\n document.body,\n )}\n </>\n );\n}\n\nfunction MenuList({\n items,\n label,\n onClose,\n openedWith,\n triggerRef,\n}: {\n items: readonly MenuItem[];\n label: string;\n onClose: (devolverFoco: boolean) => void;\n openedWith: 'first' | 'last';\n triggerRef: React.RefObject<HTMLElement | null>;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const nodes = useRef(new Map<string, HTMLElement>());\n const collection = useMemo<SelectionItem[]>(\n () => items.map((item) => ({ key: item.key, disabled: item.disabled, textValue: item.label })),\n [items],\n );\n const selection = useSelection({ items: collection, mode: 'none' });\n const { focusedKey, focusFirst, focusLast, focusNext, focusPrevious, search } = selection;\n\n // useOverlayPosition entrega toda a altura disponivel; limitamos para que\n // uma lista longa nao ocupe a tela inteira.\n // Sem isto o gatilho conta como \"fora\": o ponteiro fecha o menu e o clique\n // dele reabre em seguida, e o menu pisca sem abrir.\n const { overlayProps } = useOverlay(\n {\n isOpen: true,\n onClose: () => onClose(false),\n isDismissable: true,\n shouldCloseOnBlur: false,\n shouldCloseOnInteractOutside: (elemento) => !triggerRef.current?.contains(elemento),\n },\n ref,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: ref,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: true,\n });\n\n const alturaMaxima = Math.min(Number(positionProps.style?.maxHeight) || 360, 360);\n\n useEffect(() => {\n if (openedWith === 'last') {\n focusLast();\n } else {\n focusFirst();\n }\n // Posicao inicial depende apenas de como o menu foi aberto.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (focusedKey) {\n nodes.current.get(focusedKey)?.focus();\n }\n }, [focusedKey]);\n\n function acionar(item: MenuItem) {\n if (item.disabled) {\n return;\n }\n\n onClose(true);\n item.onSelect?.();\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n focusNext();\n } else if (event.key === 'ArrowUp') {\n event.preventDefault();\n focusPrevious();\n } else if (event.key === 'Home') {\n event.preventDefault();\n focusFirst();\n } else if (event.key === 'End') {\n event.preventDefault();\n focusLast();\n } else if (event.key === 'Escape' || event.key === 'Tab') {\n onClose(true);\n } else if (event.key.length === 1 && !event.metaKey && !event.ctrlKey) {\n search(event.key);\n }\n }\n\n return (\n <div\n {...overlayProps}\n data-react-aria-top-layer=\"true\"\n ref={ref}\n className={styles.menu}\n style={{ ...positionProps.style, maxHeight: alturaMaxima }}\n role=\"menu\"\n aria-label={label}\n onKeyDown={(event) => {\n // Espalhar overlayProps antes nao basta: este onKeyDown o substituiria.\n handleKeyDown(event);\n overlayProps.onKeyDown?.(event);\n }}\n >\n {items.map((item) => (\n <button\n key={item.key}\n ref={(node) => {\n if (node) {\n nodes.current.set(item.key, node);\n } else {\n nodes.current.delete(item.key);\n }\n }}\n className={styles.item}\n type=\"button\"\n role=\"menuitem\"\n disabled={item.disabled}\n tabIndex={focusedKey === item.key ? 0 : -1}\n onClick={() => acionar(item)}\n >\n {item.label}\n </button>\n ))}\n </div>\n );\n}\n","import {\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type FocusEvent,\n type KeyboardEvent,\n type MouseEvent,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './Tooltip.module.css';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n children: ReactElement<Record<string, unknown>>;\n content: ReactNode;\n delay?: number;\n placement?: TooltipPlacement;\n}\n\n/** Tempo para o ponteiro atravessar a folga entre o gatilho e o balao. */\nconst TRAVESSIA = 120;\n\nfunction chain<E>(own: ((event: E) => void) | undefined, next: (event: E) => void) {\n return (event: E) => {\n own?.(event);\n next(event);\n };\n}\n\nexport function Tooltip({ children, content, delay = 500, placement = 'top' }: TooltipProps) {\n const triggerRef = useRef<HTMLElement>(null);\n const [open, setOpen] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout>>(undefined);\n const id = `tooltip-${useId()}`;\n\n const hide = useCallback(() => {\n clearTimeout(timer.current);\n setOpen(false);\n }, []);\n\n // O balao aceita o ponteiro (WCAG 1.4.13): sair do gatilho espera a travessia ate ele antes de fechar.\n const hideSoon = useCallback(() => {\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setOpen(false), TRAVESSIA);\n }, []);\n\n useEffect(() => () => clearTimeout(timer.current), []);\n\n const props = children.props;\n const mergedTriggerRef = useMergedRefs(triggerRef, props.ref as Ref<HTMLElement> | undefined);\n const trigger = cloneElement(children, {\n ref: mergedTriggerRef,\n 'aria-describedby': open ? [props['aria-describedby'], id].filter(Boolean).join(' ') : props['aria-describedby'],\n onMouseEnter: chain(props.onMouseEnter as (e: MouseEvent) => void, () => {\n clearTimeout(timer.current);\n timer.current = setTimeout(() => setOpen(true), delay);\n }),\n onMouseLeave: chain(props.onMouseLeave as (e: MouseEvent) => void, hideSoon),\n onFocus: chain(props.onFocus as (e: FocusEvent) => void, () => setOpen(true)),\n onBlur: chain(props.onBlur as (e: FocusEvent) => void, hide),\n onKeyDown: chain(props.onKeyDown as (e: KeyboardEvent) => void, (event) => {\n if (event.key === 'Escape') {\n hide();\n }\n }),\n });\n\n return (\n <>\n {trigger}\n {open &&\n createPortal(\n <TooltipBubble\n content={content}\n id={id}\n onMouseEnter={() => clearTimeout(timer.current)}\n onMouseLeave={hide}\n placement={placement}\n triggerRef={triggerRef}\n />,\n document.body,\n )}\n </>\n );\n}\n\nfunction TooltipBubble({\n content,\n id,\n onMouseEnter,\n onMouseLeave,\n placement,\n triggerRef,\n}: {\n content: ReactNode;\n id: string;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n placement: TooltipPlacement;\n triggerRef: React.RefObject<HTMLElement | null>;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const { overlayProps } = useOverlayPosition({\n targetRef: triggerRef,\n overlayRef: ref,\n placement,\n offset: 6,\n isOpen: true,\n });\n\n return (\n <div\n ref={ref}\n className={styles.tooltip}\n data-react-aria-top-layer=\"true\"\n id={id}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n role=\"tooltip\"\n style={overlayProps.style}\n >\n {content}\n </div>\n );\n}\n","import { useEffect, useId, useRef, type ComponentPropsWithRef, type ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { FocusScope } from '@react-aria/focus';\nimport { ariaHideOutside, useOverlay, usePreventScroll } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport styles from './Dialog.module.css';\nimport { IconClose } from '../../icons';\n\nexport type DialogSize = 'sm' | 'md' | 'lg';\nexport type DialogRole = 'dialog' | 'alertdialog';\n\n/** As propriedades nativas vao ao elemento do dialogo; o `className` soma ao do sistema. */\nexport interface DialogProps extends Omit<ComponentPropsWithRef<'div'>, 'children' | 'role' | 'title'> {\n children?: ReactNode;\n description?: string;\n dismissable?: boolean;\n footer?: ReactNode;\n onClose: () => void;\n open: boolean;\n /** `alertdialog` para a confirmacao que interrompe e exige resposta, como a de uma acao destrutiva. */\n role?: DialogRole;\n size?: DialogSize;\n title: string;\n}\n\nexport function Dialog({ open, ...props }: DialogProps) {\n // No servidor nao ha `document` para o portal; o Dialog nasce na hidratacao.\n if (!open || typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<DialogContent {...props} />, document.body);\n}\n\nfunction DialogContent({\n children,\n className,\n description,\n dismissable = true,\n footer,\n onClose,\n ref: refDoConsumidor,\n role = 'dialog',\n size = 'md',\n title,\n ...props\n}: Omit<DialogProps, 'open'>) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const generatedId = useId();\n const titleId = `${generatedId}-title`;\n const descriptionId = `${generatedId}-description`;\n\n const { overlayProps, underlayProps } = useOverlay(\n {\n isOpen: true,\n onClose,\n isDismissable: dismissable,\n isKeyboardDismissDisabled: !dismissable,\n },\n ref,\n );\n\n usePreventScroll();\n\n useEffect(() => (ref.current ? ariaHideOutside([ref.current]) : undefined), []);\n\n return (\n <div {...underlayProps} className={styles.underlay}>\n <FocusScope contain restoreFocus autoFocus>\n <div\n {...props}\n {...overlayProps}\n ref={mergedRef}\n className={[styles.dialog, styles[size], className].filter(Boolean).join(' ')}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={description ? descriptionId : undefined}\n >\n <header className={styles.header}>\n <h2 className={styles.title} id={titleId}>{title}</h2>\n {dismissable && (\n <button className={styles.close} type=\"button\" aria-label=\"Fechar\" onClick={onClose}>\n <IconClose size={16} />\n </button>\n )}\n </header>\n {description && <p className={styles.description} id={descriptionId}>{description}</p>}\n {children && <div className={styles.body}>{children}</div>}\n {footer && <div className={styles.footer}>{footer}</div>}\n </div>\n </FocusScope>\n </div>\n );\n}\n","import { useEffect, useState, type HTMLAttributes, type SyntheticEvent } from 'react';\nimport styles from './Avatar.module.css';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\n\nexport interface AvatarProps extends HTMLAttributes<HTMLElement> {\n name: string;\n size?: AvatarSize;\n src?: string;\n}\n\nfunction getInitials(name: string) {\n const names = name.trim().split(/\\s+/).filter(Boolean);\n return names.slice(0, 2).map((part) => part[0]).join('').toUpperCase() || '?';\n}\n\nexport function Avatar({ className, name, onError, size = 'md', src, ...props }: AvatarProps) {\n const [imageFailed, setImageFailed] = useState(false);\n const classes = [styles.avatar, styles[size], className].filter(Boolean).join(' ');\n const showImage = Boolean(src) && !imageFailed;\n\n useEffect(() => {\n setImageFailed(false);\n }, [src]);\n\n function handleError(event: SyntheticEvent<HTMLElement, Event>) {\n setImageFailed(true);\n onError?.(event);\n }\n\n if (!showImage) {\n return (\n <span {...props} className={classes} role=\"img\" aria-label={name}>\n {getInitials(name)}\n </span>\n );\n }\n\n return <img {...props} className={classes} src={src} alt={name} onError={handleError} />;\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useState,\n type ComponentPropsWithRef,\n type ReactNode,\n} from 'react';\nimport { Checkbox } from '../../forms/Checkbox';\nimport { ListingOptions, optionId } from './ListingOptions';\nimport { useListing, type Listing, type ListingItem, type ListingSelectionMode } from './useListing';\nimport styles from './List.module.css';\n\nexport type ListSelectionMode = ListingSelectionMode;\nexport type ListItem = ListingItem;\n\nexport interface ListProps extends Omit<ComponentPropsWithRef<'div'>, 'defaultValue'> {\n children: ReactNode;\n defaultValue?: readonly ListItem[];\n items: readonly ListItem[];\n label?: string;\n loading?: boolean;\n loadingMessage?: string;\n onSearch?: (term: string) => void;\n onSelectionChange?: (items: readonly ListItem[]) => void;\n selectionMode?: ListSelectionMode;\n value?: readonly ListItem[];\n}\n\ninterface ListContextValue {\n baseId: string;\n claimFocus: () => void;\n label?: string;\n listing: Listing;\n loading: boolean;\n loadingMessage: string;\n searchPresent: boolean;\n}\n\nconst ListContext = createContext<ListContextValue | undefined>(undefined);\n\nfunction useListContext(part: string) {\n const context = useContext(ListContext);\n\n if (!context) {\n throw new Error(part + ' deve ser usado dentro de List.');\n }\n\n return context;\n}\n\nexport function List({\n children,\n className,\n defaultValue,\n items,\n label,\n loading = false,\n loadingMessage = 'Carregando',\n onSearch,\n onSelectionChange,\n selectionMode = 'none',\n value,\n ...props\n}: ListProps) {\n const baseId = useId();\n const [searchPresent, setSearchPresent] = useState(false);\n const listing = useListing({ defaultValue, items, onSearch, onSelectionChange, selectionMode, value });\n\n const context: ListContextValue = {\n baseId,\n claimFocus: useCallback(() => setSearchPresent(true), []),\n label,\n listing,\n loading,\n loadingMessage,\n searchPresent,\n };\n\n return (\n <div {...props} className={[styles.list, className].filter(Boolean).join(' ')}>\n <ListContext.Provider value={context}>{children}</ListContext.Provider>\n </div>\n );\n}\n\nexport interface ListSearchProps {\n placeholder?: string;\n}\n\nfunction ListSearch({ placeholder = 'Buscar' }: ListSearchProps) {\n const { baseId, claimFocus, label, listing } = useListContext('List.Search');\n\n useEffect(claimFocus, [claimFocus]);\n\n const activeIndex = listing.visible.findIndex((item) => item.value === listing.focusedKey);\n\n return (\n <input\n aria-activedescendant={activeIndex >= 0 ? optionId(baseId, activeIndex) : undefined}\n aria-controls={baseId + '-options'}\n aria-label={label ? 'Buscar em ' + label : placeholder}\n autoComplete=\"off\"\n className={styles.search}\n onChange={(event) => listing.filter(event.target.value)}\n onKeyDown={listing.handleKeyDown}\n placeholder={placeholder}\n type=\"search\"\n value={listing.term}\n />\n );\n}\n\nexport interface ListOptionsProps {\n height?: number;\n}\n\nfunction ListOptions({ height }: ListOptionsProps) {\n const { baseId, label, listing, loading, loadingMessage, searchPresent } = useListContext('List.Options');\n\n return (\n <ListingOptions\n baseId={baseId}\n height={height}\n label={label}\n holdsFocus={!searchPresent}\n listing={listing}\n loading={loading}\n loadingMessage={loadingMessage}\n onKeyDown={searchPresent ? undefined : listing.handleKeyDown}\n />\n );\n}\n\nexport interface ListSelectAllProps {\n label?: string;\n}\n\nfunction ListSelectAll({ label = 'Selecionar todos' }: ListSelectAllProps) {\n const { listing } = useListContext('List.SelectAll');\n\n if (listing.selectionMode !== 'multiple') {\n return null;\n }\n\n return (\n <Checkbox\n checked={listing.status === 'all'}\n indeterminate={listing.status === 'partial'}\n label={label}\n onChange={() => listing.toggleAll()}\n />\n );\n}\n\nexport interface ListEmptyProps {\n children: ReactNode;\n}\n\nfunction ListEmpty({ children }: ListEmptyProps) {\n const { listing, loading } = useListContext('List.Empty');\n\n if (loading || listing.visible.length > 0) {\n return null;\n }\n\n return <p className={styles.empty}>{children}</p>;\n}\n\nList.Search = ListSearch;\nList.SelectAll = ListSelectAll;\nList.Options = ListOptions;\nList.Empty = ListEmpty;\n","import {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useState,\n type ComponentPropsWithRef,\n type ReactNode,\n} from 'react';\nimport styles from './Card.module.css';\n\nexport type CardHeadingLevel = 2 | 3 | 4 | 5 | 6;\n\nexport interface CardProps extends ComponentPropsWithRef<'section'> {\n children: ReactNode;\n}\n\ninterface CardContextValue {\n registerTitle: () => () => void;\n titleId: string;\n}\n\nconst CardContext = createContext<CardContextValue | undefined>(undefined);\n\nfunction useCardContext(part: string) {\n const context = useContext(CardContext);\n\n if (!context) {\n throw new Error(part + ' deve ser usado dentro de Card.');\n }\n\n return context;\n}\n\nexport function Card({ 'aria-labelledby': ariaLabelledBy, children, className, ...props }: CardProps) {\n const baseId = useId();\n const [titled, setTitled] = useState(false);\n const titleId = baseId + '-title';\n\n // O titulo que sai da tela desfaz o registro; senao o cartao apontava para um id que nao existe mais.\n const context: CardContextValue = {\n registerTitle: useCallback(() => {\n setTitled(true);\n return () => setTitled(false);\n }, []),\n titleId,\n };\n\n return (\n <section\n {...props}\n aria-labelledby={ariaLabelledBy ?? (titled ? titleId : undefined)}\n className={[styles.card, className].filter(Boolean).join(' ')}\n >\n <CardContext.Provider value={context}>{children}</CardContext.Provider>\n </section>\n );\n}\n\nexport interface CardHeaderProps {\n badge?: ReactNode;\n description?: ReactNode;\n headingLevel?: CardHeadingLevel;\n title: string;\n trailing?: ReactNode;\n}\n\nfunction CardHeader({ badge, description, headingLevel = 3, title, trailing }: CardHeaderProps) {\n const { registerTitle, titleId } = useCardContext('Card.Header');\n const Heading = ('h' + headingLevel) as 'h2';\n\n useEffect(registerTitle, [registerTitle]);\n\n return (\n <header className={styles.header}>\n <div className={styles.headline}>\n <div className={styles.titleRow}>\n <Heading className={styles.title} id={titleId}>\n {title}\n </Heading>\n {badge}\n </div>\n {description && <p className={styles.description}>{description}</p>}\n </div>\n {trailing && <div className={styles.trailing}>{trailing}</div>}\n </header>\n );\n}\n\nexport interface CardBodyProps {\n children: ReactNode;\n flush?: boolean;\n}\n\nfunction CardBody({ children, flush = false }: CardBodyProps) {\n return <div className={flush ? styles.bodyFlush : styles.body}>{children}</div>;\n}\n\nexport interface CardFooterProps {\n children: ReactNode;\n}\n\nfunction CardFooter({ children }: CardFooterProps) {\n return <footer className={styles.footer}>{children}</footer>;\n}\n\nCard.Header = CardHeader;\nCard.Body = CardBody;\nCard.Footer = CardFooter;\n","import {\n createContext,\n Fragment,\n type ComponentPropsWithRef,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useState,\n type ReactNode,\n} from 'react';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { useSelection, type SelectionItem } from '../../../hooks/useSelection';\nimport { Tooltip } from '../../overlays/Tooltip';\nimport styles from './Table.module.css';\nimport { IconArrowUp, IconChevronExpand, IconQuestionCircle } from '../../icons';\n\nexport type TableSize = 'sm' | 'md';\nexport type TableAlign = 'start' | 'center' | 'end';\nexport type TableBreakpoint = 'sm' | 'md' | 'lg';\nexport type SortDirection = 'ascending' | 'descending';\nexport type TableSelectionMode = 'none' | 'single' | 'multiple';\nexport type TableSelectionControl = 'checkbox' | 'radio' | 'toggle';\n\nexport interface TableRowItem {\n disabled?: boolean;\n id: string;\n}\n\nexport interface TableSort {\n column: string;\n direction: SortDirection;\n}\n\nexport interface TableProps extends ComponentPropsWithRef<'div'> {\n children: ReactNode;\n /** Escolha inicial no modo nao controlado. */\n defaultSelectedIds?: readonly string[];\n defaultSort?: TableSort;\n divider?: boolean;\n label?: string;\n loading?: boolean;\n loadingMessage?: string;\n highlightSelectedRow?: boolean;\n onSelectionChange?: (ids: readonly string[]) => void;\n onSortChange?: (sort: TableSort) => void;\n rows?: readonly TableRowItem[];\n selectedIds?: readonly string[];\n selectionControl?: TableSelectionControl;\n selectionMode?: TableSelectionMode;\n size?: TableSize;\n sort?: TableSort;\n /** Cabecalho colado no topo da rolagem da pagina; com a tabela mais larga ou mais alta que o espaco, no dela. */\n stickyHeader?: boolean;\n striped?: boolean;\n}\n\ninterface TableContextValue {\n baseId: string;\n countColumns: () => number;\n loading: boolean;\n registerColumn: (id: string) => () => void;\n requestSort: (column: string) => void;\n selection: TableSelection;\n size: TableSize;\n sort?: TableSort;\n}\n\ninterface TableSelection {\n control: TableSelectionControl;\n empty: boolean;\n highlight: boolean;\n isSelected: (id: string) => boolean;\n mode: TableSelectionMode;\n status: 'none' | 'partial' | 'all';\n toggle: (id: string, extend: boolean) => void;\n toggleAll: () => void;\n}\n\nconst TableContext = createContext<TableContextValue | undefined>(undefined);\n\nfunction useTableContext(part: string) {\n const context = useContext(TableContext);\n\n if (!context) {\n throw new Error(part + ' deve ser usado dentro de Table.');\n }\n\n return context;\n}\n\nexport function Table({\n children,\n className,\n defaultSelectedIds,\n defaultSort,\n divider = true,\n highlightSelectedRow = true,\n label,\n loading = false,\n loadingMessage = 'Carregando',\n onSelectionChange,\n onSortChange,\n rows = [],\n selectedIds,\n selectionControl,\n selectionMode = 'none',\n size = 'md',\n sort,\n stickyHeader = false,\n striped = false,\n ref,\n ...props\n}: TableProps) {\n const baseId = useId();\n const [internalSort, setInternalSort] = useState(defaultSort);\n const [columns, setColumns] = useState<ReadonlySet<string>>(() => new Set());\n const currentSort = sort ?? internalSort;\n const control = selectionControl ?? (selectionMode === 'single' ? 'radio' : 'checkbox');\n\n // Rolar dentro da tabela e colar o cabecalho na rolagem da pagina se excluem em CSS: o envoltorio so\n // continua conteiner de rolagem quando a tabela transborda dele.\n const [precisaRolar, setPrecisaRolar] = useState(true);\n const observarTransbordo = useCallback((envoltorio: HTMLDivElement | null) => {\n if (!envoltorio || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n const observador = new ResizeObserver(() =>\n setPrecisaRolar(\n envoltorio.scrollWidth > envoltorio.clientWidth || envoltorio.scrollHeight > envoltorio.clientHeight,\n ),\n );\n\n observador.observe(envoltorio);\n\n if (envoltorio.firstElementChild) {\n observador.observe(envoltorio.firstElementChild);\n }\n\n return () => observador.disconnect();\n }, []);\n const envoltorioRef = useMergedRefs(stickyHeader ? observarTransbordo : undefined, ref);\n\n // A coluna se registra enquanto esta na tela e sai quando sai: registrada para sempre, o vazio ocupava colunas\n // que nao existiam mais.\n const registerColumn = useCallback((id: string) => {\n setColumns((atuais) => new Set(atuais).add(id));\n\n return () =>\n setColumns((atuais) => {\n const restantes = new Set(atuais);\n restantes.delete(id);\n return restantes;\n });\n }, []);\n\n function requestSort(column: string) {\n const next: TableSort = {\n column,\n direction:\n currentSort?.column === column && currentSort.direction === 'ascending' ? 'descending' : 'ascending',\n };\n\n if (sort === undefined) {\n setInternalSort(next);\n }\n\n onSortChange?.(next);\n }\n\n const collection = useMemo<SelectionItem[]>(\n () => rows.map((row) => ({ key: row.id, disabled: row.disabled })),\n [rows],\n );\n\n const selection = useSelection({\n // Caixa e chave desmarcam ao clicar de novo; o radio, nao.\n allowEmpty: control !== 'radio',\n defaultSelectedKeys: defaultSelectedIds,\n items: collection,\n mode: selectionMode,\n selectedKeys: selectedIds,\n onSelectionChange: (keys) => onSelectionChange?.([...keys]),\n });\n\n const context: TableContextValue = {\n baseId,\n countColumns: () => Math.max(columns.size, 1),\n loading,\n registerColumn,\n requestSort,\n selection: {\n control,\n empty: rows.length === 0,\n highlight: highlightSelectedRow,\n isSelected: (id) => selection.selectedKeys.has(id),\n mode: selectionMode,\n status: selection.status,\n toggle: (id, extend) => {\n if (extend && selectionMode === 'multiple') {\n selection.selectRange(id);\n return;\n }\n\n selection.select(id);\n },\n toggleAll: selection.toggleAll,\n },\n size,\n sort: currentSort,\n };\n\n const classes = [\n styles.table,\n styles[size],\n divider && styles.divider,\n striped && styles.striped,\n stickyHeader && styles.sticky,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n {...props}\n className={[styles.scroll, stickyHeader && !precisaRolar && styles.noScroll, className].filter(Boolean).join(' ')}\n ref={envoltorioRef}\n >\n <table aria-busy={loading || undefined} aria-label={label} className={classes}>\n <TableContext.Provider value={context}>{children}</TableContext.Provider>\n </table>\n {loading && (\n <p className={styles.status} role=\"status\">\n {loadingMessage}\n </p>\n )}\n </div>\n );\n}\n\nexport interface TableHeaderProps {\n children: ReactNode;\n}\n\nfunction TableHeader({ children }: TableHeaderProps) {\n const { registerColumn, selection } = useTableContext('Table.Header');\n\n useEffect(() => (selection.mode === 'none' ? undefined : registerColumn('__selecao__')), [registerColumn, selection.mode]);\n\n return (\n <thead className={styles.head}>\n <tr>\n {selection.mode === 'multiple' && (\n <th className={[styles.column, styles.lead].join(' ')} scope=\"col\">\n {/* Sem `rows` nao ha o que marcar, e o clique so apagava a escolha que ja havia. */}\n <input\n aria-label=\"Selecionar todas as linhas\"\n checked={selection.status === 'all'}\n className={styles.checkbox}\n disabled={selection.empty}\n onChange={selection.toggleAll}\n ref={(node) => {\n if (node) {\n node.indeterminate = selection.status === 'partial';\n }\n }}\n type=\"checkbox\"\n />\n </th>\n )}\n {selection.mode === 'single' && <th className={[styles.column, styles.lead].join(' ')} scope=\"col\" />}\n {children}\n </tr>\n </thead>\n );\n}\n\nexport interface TableColumnProps {\n align?: TableAlign;\n children: ReactNode;\n help?: string;\n hideBelow?: TableBreakpoint;\n id: string;\n numeric?: boolean;\n sortable?: boolean;\n width?: string;\n}\n\nfunction TableColumn({ align, children, help, hideBelow, id, numeric = false, sortable = false, width }: TableColumnProps) {\n const { registerColumn, requestSort, sort } = useTableContext('Table.Column');\n\n useEffect(() => registerColumn(id), [id, registerColumn]);\n\n const sorted = sort?.column === id ? sort.direction : undefined;\n\n // A ajuda e focavel e fica fora do botao de ordenacao: controle dentro de controle nao e HTML valido.\n const ajuda = help && (\n <Tooltip content={help}>\n <span aria-label={help} className={styles.help} role=\"img\" tabIndex={0}>\n <IconQuestionCircle size={14} />\n </span>\n </Tooltip>\n );\n\n return (\n <th\n aria-sort={sortable ? sorted ?? 'none' : undefined}\n className={[styles.column, styles[align ?? (numeric ? 'end' : 'start')], sortable && styles.sortable]\n .filter(Boolean)\n .join(' ')}\n data-hide-below={hideBelow}\n scope=\"col\"\n style={{ width }}\n >\n {sortable ? (\n <div className={styles.sortHeader}>\n <button className={styles.sortButton} onClick={() => requestSort(id)} type=\"button\">\n {children}\n {sorted ? (\n <IconArrowUp\n className={[styles.sortIcon, sorted === 'descending' && styles.sortDescending].filter(Boolean).join(' ')}\n size={12}\n />\n ) : (\n <IconChevronExpand className={styles.sortIcon} size={12} />\n )}\n </button>\n {ajuda}\n </div>\n ) : (\n <>\n {children}\n {ajuda}\n </>\n )}\n </th>\n );\n}\n\nexport interface TableBodyProps<T extends TableRowItem> {\n children: (item: T) => ReactNode;\n empty?: ReactNode;\n items: readonly T[];\n}\n\nfunction TableBody<T extends TableRowItem>({ children, empty, items }: TableBodyProps<T>) {\n const { countColumns, loading } = useTableContext('Table.Body');\n\n if (items.length === 0 && !loading && empty !== undefined) {\n return (\n <tbody>\n <tr>\n <td className={styles.empty} colSpan={countColumns()}>\n {empty}\n </td>\n </tr>\n </tbody>\n );\n }\n\n return (\n <tbody>\n {items.map((item) => (\n <Fragment key={item.id}>{children(item)}</Fragment>\n ))}\n </tbody>\n );\n}\n\nexport interface TableRowProps {\n children: ReactNode;\n disabled?: boolean;\n id: string;\n label?: string;\n}\n\nfunction TableRow({ children, disabled = false, id, label }: TableRowProps) {\n const { baseId, selection } = useTableContext('Table.Row');\n const selected = selection.mode !== 'none' && selection.isSelected(id);\n\n return (\n // Sem `aria-selected` na linha: ele so vale em grade, e numa tabela quem anuncia a marcacao e o controle.\n <tr className={[styles.row, selected && selection.highlight && styles.selected].filter(Boolean).join(' ')}>\n {selection.mode !== 'none' && (\n <td className={[styles.cell, styles.lead].join(' ')}>\n <input\n aria-label={label ?? 'Selecionar linha'}\n checked={selected}\n className={styles[selection.control]}\n disabled={disabled}\n name={selection.control === 'radio' ? `${baseId}-selecao` : undefined}\n onChange={() => undefined}\n onClick={(event) => selection.toggle(id, event.shiftKey)}\n role={selection.control === 'toggle' ? 'switch' : undefined}\n type={selection.control === 'radio' ? 'radio' : 'checkbox'}\n />\n </td>\n )}\n {children}\n </tr>\n );\n}\n\nexport interface TableCellProps {\n align?: TableAlign;\n children?: ReactNode;\n hideBelow?: TableBreakpoint;\n numeric?: boolean;\n}\n\nfunction TableCell({ align, children, hideBelow, numeric = false }: TableCellProps) {\n return (\n <td\n className={[styles.cell, styles[align ?? (numeric ? 'end' : 'start')], numeric && styles.numeric]\n .filter(Boolean)\n .join(' ')}\n data-hide-below={hideBelow}\n >\n {children}\n </td>\n );\n}\n\nTable.Header = TableHeader;\nTable.Column = TableColumn;\nTable.Body = TableBody;\nTable.Row = TableRow;\nTable.Cell = TableCell;\n","import {\n endOfMonth,\n getWeeksInMonth,\n isSameDay,\n isSameMonth,\n startOfMonth,\n startOfWeek,\n type CalendarDate,\n} from '@internationalized/date';\n\nexport interface CalendarLimits {\n isDateUnavailable?: (date: CalendarDate) => boolean;\n max?: CalendarDate;\n min?: CalendarDate;\n}\n\nexport interface CalendarDay {\n date: CalendarDate;\n outside: boolean;\n unavailable: boolean;\n}\n\nexport function isUnavailable(date: CalendarDate, { isDateUnavailable, max, min }: CalendarLimits) {\n if (min && date.compare(min) < 0) {\n return true;\n }\n\n if (max && date.compare(max) > 0) {\n return true;\n }\n\n return isDateUnavailable?.(date) ?? false;\n}\n\nexport function buildMonth(anchor: CalendarDate, locale: string, limits: CalendarLimits = {}): CalendarDay[][] {\n const first = startOfMonth(anchor);\n const start = startOfWeek(first, locale);\n const weeks: CalendarDay[][] = [];\n\n for (let week = 0; week < getWeeksInMonth(anchor, locale); week += 1) {\n const days: CalendarDay[] = [];\n\n for (let day = 0; day < 7; day += 1) {\n const date = start.add({ days: week * 7 + day });\n\n days.push({\n date,\n outside: !isSameMonth(date, anchor),\n unavailable: isUnavailable(date, limits),\n });\n }\n\n weeks.push(days);\n }\n\n return weeks;\n}\n\nexport function clamp(date: CalendarDate, { max, min }: CalendarLimits) {\n if (min && date.compare(min) < 0) {\n return min;\n }\n\n if (max && date.compare(max) > 0) {\n return max;\n }\n\n return date;\n}\n\nexport function moveFocus(date: CalendarDate, key: string, shift: boolean, limits: CalendarLimits) {\n switch (key) {\n case 'ArrowLeft':\n return clamp(date.subtract({ days: 1 }), limits);\n case 'ArrowRight':\n return clamp(date.add({ days: 1 }), limits);\n case 'ArrowUp':\n return clamp(date.subtract({ weeks: 1 }), limits);\n case 'ArrowDown':\n return clamp(date.add({ weeks: 1 }), limits);\n case 'Home':\n return clamp(startOfMonth(date), limits);\n case 'End':\n return clamp(endOfMonth(date), limits);\n case 'PageUp':\n return clamp(shift ? date.subtract({ years: 1 }) : date.subtract({ months: 1 }), limits);\n case 'PageDown':\n return clamp(shift ? date.add({ years: 1 }) : date.add({ months: 1 }), limits);\n default:\n return undefined;\n }\n}\n\nexport function sameDay(a: CalendarDate | undefined, b: CalendarDate | undefined) {\n return Boolean(a && b && isSameDay(a, b));\n}\n","import { useMemo, useState, type KeyboardEvent } from 'react';\nimport { endOfMonth, getLocalTimeZone, startOfMonth, today, type CalendarDate } from '@internationalized/date';\nimport { buildMonth, clamp, isUnavailable, moveFocus, sameDay, type CalendarDay, type CalendarLimits } from './calendar';\n\nexport interface UseCalendarOptions extends CalendarLimits {\n locale?: string;\n onSelect?: (date: CalendarDate) => void;\n value?: CalendarDate;\n}\n\nexport interface UseCalendarResult {\n /** Leva o foco a uma data e traz o mes dela para a grade. */\n focus: (date: CalendarDate) => void;\n focusedDate: CalendarDate;\n goToMonth: (offset: number) => void;\n handleKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n isSelected: (date: CalendarDate) => boolean;\n isToday: (date: CalendarDate) => boolean;\n select: (date: CalendarDate) => void;\n visibleMonth: CalendarDate;\n weeks: CalendarDay[][];\n}\n\nexport function useCalendar({\n isDateUnavailable,\n locale = 'pt-BR',\n max,\n min,\n onSelect,\n value,\n}: UseCalendarOptions = {}): UseCalendarResult {\n const limits: CalendarLimits = { isDateUnavailable, max, min };\n const hoje = useMemo(() => today(getLocalTimeZone()), []);\n const [focusedDate, setFocusedDate] = useState(() => clamp(value ?? hoje, limits));\n const anchor = value ?? focusedDate;\n const [visibleMonth, setVisibleMonth] = useState(() => startOfMonth(anchor));\n const [ultimoValor, setUltimoValor] = useState(value);\n\n // O mes visivel segue o valor quando ele muda de fora. Sem isto, digitar uma\n // data e abrir o painel mostrava o mes corrente, e nao o da data digitada.\n if (value && (!ultimoValor || value.compare(ultimoValor) !== 0)) {\n setUltimoValor(value);\n setVisibleMonth(startOfMonth(value));\n setFocusedDate(clamp(value, limits));\n }\n\n const weeks = useMemo(() => buildMonth(visibleMonth, locale, limits), [locale, visibleMonth, max, min, isDateUnavailable]);\n\n function focus(date: CalendarDate) {\n setFocusedDate(date);\n\n if (date.compare(startOfMonth(visibleMonth)) < 0 || date.compare(startOfMonth(visibleMonth).add({ months: 1 })) >= 0) {\n setVisibleMonth(startOfMonth(date));\n }\n }\n\n function select(date: CalendarDate) {\n if (isUnavailable(date, limits)) {\n return;\n }\n\n focus(date);\n onSelect?.(date);\n }\n\n return {\n focus,\n focusedDate,\n goToMonth: (offset) => {\n const destino = startOfMonth(visibleMonth.add({ months: offset }));\n\n setVisibleMonth(destino);\n // O foco acompanha o mes; parado, a proxima seta devolvia a grade ao mes\n // anterior no quadro seguinte.\n setFocusedDate(\n clamp(destino.set({ day: Math.min(focusedDate.day, endOfMonth(destino).day) }), limits),\n );\n },\n handleKeyDown: (event) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n select(focusedDate);\n return;\n }\n\n const next = moveFocus(focusedDate, event.key, event.shiftKey, limits);\n\n if (next) {\n event.preventDefault();\n focus(next);\n }\n },\n isSelected: (date) => sameDay(date, value),\n isToday: (date) => sameDay(date, hoje),\n select,\n visibleMonth,\n weeks,\n };\n}\n","import { useEffect, useMemo, useRef, type FocusEvent } from 'react';\nimport { getLocalTimeZone, type CalendarDate } from '@internationalized/date';\nimport { useCalendar, type CalendarLimits } from '../../../hooks/useCalendar';\nimport styles from './DatePicker.module.css';\nimport { IconChevronLeft, IconChevronRight } from '../../icons';\n\nexport interface CalendarProps extends CalendarLimits {\n autoFocus?: boolean;\n locale?: string;\n onSelect: (date: CalendarDate) => void;\n value?: CalendarDate;\n}\n\nexport function Calendar({ autoFocus = false, locale = 'pt-BR', onSelect, value, ...limits }: CalendarProps) {\n const calendario = useCalendar({ ...limits, locale, onSelect, value });\n const fuso = getLocalTimeZone();\n const nomeDoMes = useMemo(() => new Intl.DateTimeFormat(locale, { month: 'long', year: 'numeric' }), [locale]);\n const nomeDoDia = useMemo(() => new Intl.DateTimeFormat(locale, { dateStyle: 'long' }), [locale]);\n const diasDaSemana = useMemo(() => {\n const curto = new Intl.DateTimeFormat(locale, { weekday: 'short' });\n const longo = new Intl.DateTimeFormat(locale, { weekday: 'long' });\n\n return calendario.weeks[0].map((dia) => {\n const data = dia.date.toDate(fuso);\n return { curto: curto.format(data).replace('.', ''), longo: longo.format(data) };\n });\n }, [calendario.weeks, fuso, locale]);\n\n const titulo = nomeDoMes.format(calendario.visibleMonth.toDate(fuso));\n const diaEmFoco = useRef<HTMLButtonElement>(null);\n const gradeComFoco = useRef(false);\n const chaveEmFoco = calendario.focusedDate.toString();\n\n useEffect(() => {\n if (autoFocus) {\n diaEmFoco.current?.focus();\n }\n }, []);\n\n // O foco do teclado anda com o dia, mas so se ja estava na grade: o clique no mes seguinte nao o puxa para ca.\n useEffect(() => {\n if (gradeComFoco.current) {\n diaEmFoco.current?.focus();\n }\n }, [chaveEmFoco]);\n\n // Sem destino, o foco saiu com o dia que deixou a grade na troca de mes, e nao da grade.\n function handleBlur(event: FocusEvent<HTMLTableElement>) {\n if (event.relatedTarget && !event.currentTarget.contains(event.relatedTarget)) {\n gradeComFoco.current = false;\n }\n }\n\n return (\n <div className={styles.calendar}>\n <div className={styles.calendarHeader}>\n <button\n aria-label=\"Mês anterior\"\n className={styles.navigate}\n onClick={() => calendario.goToMonth(-1)}\n type=\"button\"\n >\n <IconChevronLeft size={14} />\n </button>\n <span aria-live=\"polite\" className={styles.month}>\n {titulo}\n </span>\n <button\n aria-label=\"Próximo mês\"\n className={styles.navigate}\n onClick={() => calendario.goToMonth(1)}\n type=\"button\"\n >\n <IconChevronRight size={14} />\n </button>\n </div>\n <table\n aria-label={titulo}\n className={styles.grid}\n onBlur={handleBlur}\n onFocus={() => (gradeComFoco.current = true)}\n onKeyDown={calendario.handleKeyDown}\n role=\"grid\"\n >\n <thead>\n <tr>\n {diasDaSemana.map((dia) => (\n <th abbr={dia.longo} className={styles.weekday} key={dia.longo} scope=\"col\">\n {dia.curto}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {calendario.weeks.map((semana) => (\n <tr key={semana[0].date.toString()}>\n {semana.map((dia) => {\n const selecionado = calendario.isSelected(dia.date);\n const focado = dia.date.toString() === chaveEmFoco;\n\n return (\n <td className={styles.dayCell} key={dia.date.toString()}>\n {/* Dia indisponivel continua focavel, como o teclado o alcanca; quem recusa a escolha e o motor. */}\n <button\n aria-current={calendario.isToday(dia.date) ? 'date' : undefined}\n aria-disabled={dia.unavailable || undefined}\n aria-label={nomeDoDia.format(dia.date.toDate(fuso))}\n aria-pressed={selecionado}\n className={[styles.day, dia.outside && styles.outside, selecionado && styles.selectedDay]\n .filter(Boolean)\n .join(' ')}\n onClick={() => calendario.select(dia.date)}\n ref={focado ? diaEmFoco : undefined}\n tabIndex={focado ? 0 : -1}\n type=\"button\"\n >\n {dia.date.day}\n </button>\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import { parseDate, parseDateTime, parseTime, type CalendarDateTime, type Time } from '@internationalized/date';\n\n/** A API publica fala em texto ISO; o que nao e data valida conta como ausente, em vez de derrubar o componente. */\nfunction ler<T>(texto: string | null | undefined, interpretar: (texto: string) => T) {\n if (!texto) {\n return undefined;\n }\n\n try {\n return interpretar(texto);\n } catch {\n return undefined;\n }\n}\n\nexport const readIsoDate = (texto?: string | null) => ler(texto, parseDate);\nexport const readIsoTime = (texto?: string | null) => ler(texto, parseTime);\nexport const readIsoDateTime = (texto?: string | null) => ler(texto, parseDateTime);\n\n/** Hora e data com hora saem sem segundos, que os seletores nao escolhem: `09:30` e `2026-03-09T09:30`. */\nexport const toIsoTime = (hora: Time) => hora.toString().slice(0, 5);\nexport const toIsoDateTime = (instante: CalendarDateTime) => instante.toString().slice(0, 16);\n","import { useEffect, useRef, useState, type ComponentPropsWithRef, type KeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport { getLocalTimeZone, today, type CalendarDate } from '@internationalized/date';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { formatarEntradaData, lerEntradaData } from '../../../utils/formatters';\nimport { Button } from '../../actions/Button';\nimport { isUnavailable, type CalendarLimits } from '../../../hooks/useCalendar/calendar';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport { Calendar } from './Calendar';\nimport { readIsoDate } from './iso';\nimport styles from './DatePicker.module.css';\nimport { IconCalendar } from '../../icons';\n\nexport type DatePickerSize = 'sm' | 'md';\n\n/**\n * As propriedades nativas vao ao campo de texto, que e o controle; o `className` soma a caixa do campo, que e o que\n * se posiciona e dimensiona.\n */\nexport interface DatePickerProps\n extends Omit<\n ComponentPropsWithRef<'input'>,\n 'defaultValue' | 'max' | 'min' | 'name' | 'onChange' | 'size' | 'type' | 'value'\n > {\n /** Data em ISO, `2026-03-09`, como no `FormData`: a API nao expoe tipo de biblioteca de terceiros. */\n defaultValue?: string;\n disabled?: boolean;\n error?: string;\n hint?: string;\n id?: string;\n isDateUnavailable?: (date: string) => boolean;\n label?: string;\n /**\n * Nome do campo no formulario. Com ele, um input oculto carrega o valor para\n * o `FormData`: sem controle nativo por baixo, o envio ignorava o campo.\n */\n name?: string;\n locale?: string;\n max?: string;\n min?: string;\n /** Sem data inteira e permitida, o valor e `null`, que mantem o campo controlado e vazio. */\n onValueChange?: (value: string | null) => void;\n placeholder?: string;\n required?: boolean;\n size?: DatePickerSize;\n /**\n * `null` e \"controlado e vazio\": devolver a propriedade a `undefined` nao\n * limpa o campo, porque ali ele volta a ser nao controlado.\n */\n value?: string | null;\n}\n\nexport function DatePicker({\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n error,\n hint,\n id: providedId,\n isDateUnavailable,\n label,\n locale = 'pt-BR',\n max,\n min,\n onValueChange,\n onBlur,\n onKeyDown,\n placeholder = 'dd/mm/aaaa',\n required = false,\n size = 'md',\n ref,\n value,\n ...props\n}: DatePickerProps) {\n const fieldRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const limites: CalendarLimits = {\n isDateUnavailable: isDateUnavailable && ((data) => isDateUnavailable(data.toString())),\n max: readIsoDate(max),\n min: readIsoDate(min),\n };\n const [internalValue, setInternalValue] = useState<CalendarDate | null>(() => readIsoDate(defaultValue) ?? null);\n const controlado = value === undefined ? undefined : (readIsoDate(value) ?? null);\n const escolhido = (controlado === undefined ? internalValue : controlado) ?? undefined;\n const [texto, setTexto] = useState('');\n const [digitando, setDigitando] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const resetRef = useFormReset<HTMLInputElement>(() => {\n setInternalValue(readIsoDate(defaultValue) ?? null);\n setDigitando(false);\n });\n const mergedRef = useMergedRefs(inputRef, resetRef, ref);\n const [rascunho, setRascunho] = useState(escolhido);\n const [versaoDoCalendario, setVersaoDoCalendario] = useState(0);\n\n useEffect(() => {\n if (open) {\n setRascunho(escolhido);\n }\n }, [open]);\n\n const exibido = digitando\n ? texto\n : escolhido\n ? [String(escolhido.day).padStart(2, '0'), String(escolhido.month).padStart(2, '0'), escolhido.year].join('/')\n : '';\n\n // O interno acompanha mesmo controlado: se o consumidor devolver `undefined`, nao ressurge um valor velho.\n function definir(proximo: CalendarDate | null) {\n setInternalValue(proximo);\n onValueChange?.(proximo?.toString() ?? null);\n }\n\n function fechar(devolverFoco = true) {\n setOpen(false);\n\n if (devolverFoco) {\n triggerRef.current?.focus();\n }\n }\n\n function handleChange(entrada: string) {\n const mascarado = formatarEntradaData(entrada);\n\n setDigitando(true);\n setTexto(mascarado);\n\n // Data fora dos limites nao se grava: o calendario ja a recusa, e o campo\n // digitado nao pode ser a porta dos fundos dela.\n const lido = lerEntradaData(mascarado);\n const permitido = lido && !isUnavailable(lido, limites) ? lido : null;\n\n definir(permitido);\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n } else if (event.key === 'Escape' && open) {\n fechar(false);\n }\n }\n\n const { overlayProps } = useOverlay(\n {\n isOpen: open,\n onClose: () => fechar(false),\n isDismissable: true,\n shouldCloseOnBlur: false,\n // O gatilho nao conta como \"fora\": sem isto o ponteiro fecha o painel e o\n // clique dele reabre em seguida, e ele pisca sem abrir.\n shouldCloseOnInteractOutside: (elemento) => !fieldRef.current?.contains(elemento),\n },\n panelRef,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: fieldRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: open,\n });\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => (\n <>\n <FormValue\n disabled={disabled}\n name={name}\n onFocus={() => inputRef.current?.focus()}\n required={required}\n value={escolhido?.toString() ?? ''}\n />\n <div\n className={[styles.field, styles[size], error && styles.error, className].filter(Boolean).join(' ')}\n ref={fieldRef}\n >\n <input\n {...props}\n aria-describedby={describedBy}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n autoComplete=\"off\"\n className={styles.input}\n disabled={disabled}\n id={id}\n inputMode=\"numeric\"\n onBlur={(event) => {\n setDigitando(false);\n onBlur?.(event);\n }}\n onChange={(event) => handleChange(event.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={mergedRef}\n type=\"text\"\n value={exibido}\n />\n <button\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label=\"Abrir calendário\"\n className={styles.trigger}\n disabled={disabled}\n onClick={() => (open ? fechar() : setOpen(true))}\n ref={triggerRef}\n type=\"button\"\n >\n <IconCalendar size={15} />\n </button>\n </div>\n {open &&\n createPortal(\n <div\n {...overlayProps}\n aria-label={label ? 'Calendário de ' + label : 'Calendário'}\n className={styles.panel}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n fechar();\n }\n overlayProps.onKeyDown?.(event);\n }}\n ref={panelRef}\n role=\"dialog\"\n style={positionProps.style}\n >\n <Calendar\n autoFocus\n key={versaoDoCalendario}\n isDateUnavailable={limites.isDateUnavailable}\n locale={locale}\n max={limites.max}\n min={limites.min}\n onSelect={setRascunho}\n value={rascunho}\n />\n <div className={styles.footer}>\n <Button\n onClick={() => {\n // Remontada, a grade volta ao mes de hoje mesmo que o rascunho ja fosse hoje.\n setRascunho(today(getLocalTimeZone()));\n setVersaoDoCalendario((versao) => versao + 1);\n }}\n size=\"sm\"\n variant=\"ghost\"\n type=\"button\"\n >\n Hoje\n </Button>\n <div className={styles.actions}>\n <Button onClick={() => fechar()} size=\"sm\" variant=\"secondary\" type=\"button\">\n Cancelar\n </Button>\n <Button\n onClick={() => {\n definir(rascunho ?? null);\n setDigitando(false);\n fechar();\n }}\n size=\"sm\"\n type=\"button\"\n >\n Aplicar\n </Button>\n </div>\n </div>\n </div>,\n document.body,\n )}\n </>\n )}\n </Field>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { Time } from '@internationalized/date';\nimport { ListingOptions } from '../../data-display/List/ListingOptions';\nimport { useListing, type ListingItem } from '../../data-display/List/useListing';\nimport { formatarEntradaHora, lerEntradaHora } from '../../../utils/formatters';\nimport styles from './TimePicker.module.css';\n\nexport interface TimeSlotsProps {\n autoFocus?: boolean;\n baseId: string;\n label?: string;\n max?: Time;\n min?: Time;\n onChange: (value: Time) => void;\n step?: number;\n value?: Time;\n}\n\nconst doisDigitos = (valor: number) => String(valor).padStart(2, '0');\n\nexport function paraTextoDeHora(hora?: Time) {\n return hora ? doisDigitos(hora.hour) + ':' + doisDigitos(hora.minute) : '';\n}\n\n/** A hora digitada respeita os limites que a lista ja respeita. */\nexport function isTimeAllowed(time: Time, min?: Time, max?: Time) {\n return (!min || time.compare(min) >= 0) && (!max || time.compare(max) <= 0);\n}\n\n/** Horarios do dia inteiro, do primeiro ao ultimo que couber no passo. */\nexport function gerarHorarios(step: number, min = new Time(0, 0), max = new Time(23, 59)) {\n if (step <= 0) {\n return [];\n }\n\n const inicio = min.hour * 60 + min.minute;\n const fim = max.hour * 60 + max.minute;\n const horarios: Time[] = [];\n\n for (let minutos = inicio; minutos <= fim; minutos += step) {\n horarios.push(new Time(Math.floor(minutos / 60), minutos % 60));\n }\n\n return horarios;\n}\n\nexport function TimeSlots({ autoFocus = false, baseId, label = 'Horário', max, min, onChange, step = 30, value }: TimeSlotsProps) {\n const [texto, setTexto] = useState(() => paraTextoDeHora(value));\n const [digitando, setDigitando] = useState(false);\n const listboxRef = useRef<HTMLElement | null>(null);\n\n const horarios = useMemo<ListingItem[]>(\n () => gerarHorarios(step, min, max).map((hora) => ({ value: paraTextoDeHora(hora), label: paraTextoDeHora(hora) })),\n [max, min, step],\n );\n\n const escolhido = paraTextoDeHora(value);\n const listagem = useListing({\n items: horarios,\n selectionMode: 'single',\n value: value ? [{ value: escolhido, label: escolhido }] : [],\n onSelectionChange: ([item]) => {\n const lido = item && lerEntradaHora(item.value);\n\n if (lido) {\n setDigitando(false);\n onChange(lido);\n }\n },\n });\n\n // Na abertura, o teclado parte do horario escolhido, como no Select; sem isso, partia da meia-noite.\n useEffect(() => {\n listagem.focus(horarios.some((horario) => horario.value === escolhido) ? escolhido : undefined);\n\n if (autoFocus) {\n listboxRef.current?.focus();\n }\n }, []);\n\n function handleChange(entrada: string) {\n const mascarado = formatarEntradaHora(entrada);\n\n setDigitando(true);\n setTexto(mascarado);\n\n const lido = lerEntradaHora(mascarado);\n\n if (lido && isTimeAllowed(lido, min, max)) {\n onChange(lido);\n }\n }\n\n return (\n <div className={styles.slots}>\n <input\n aria-label={label + ' em horas e minutos'}\n autoComplete=\"off\"\n className={styles.slotInput}\n inputMode=\"numeric\"\n onBlur={() => setDigitando(false)}\n onChange={(event) => handleChange(event.target.value)}\n placeholder=\"hh:mm\"\n type=\"text\"\n value={digitando ? texto : escolhido}\n />\n <ListingOptions\n baseId={baseId}\n className={styles.slotList}\n elementRef={listboxRef}\n holdsFocus\n label={label}\n listing={listagem}\n onKeyDown={listagem.handleKeyDown}\n />\n </div>\n );\n}\n","import { useId, useRef, useState, type ComponentPropsWithRef, type KeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport type { Time } from '@internationalized/date';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { formatarEntradaHora, lerEntradaHora } from '../../../utils/formatters';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport { readIsoTime, toIsoTime } from '../DatePicker/iso';\nimport { TimeSlots, isTimeAllowed, paraTextoDeHora } from './TimeSlots';\nimport styles from './TimePicker.module.css';\nimport { IconClock } from '../../icons';\n\nexport type TimePickerSize = 'sm' | 'md';\n\n/**\n * As propriedades nativas vao ao campo de texto, que e o controle; o `className` soma a caixa do campo, que e o que\n * se posiciona e dimensiona.\n */\nexport interface TimePickerProps\n extends Omit<\n ComponentPropsWithRef<'input'>,\n 'defaultValue' | 'max' | 'min' | 'name' | 'onChange' | 'size' | 'type' | 'value' | 'step'\n > {\n /** Hora em `HH:mm`, como no `FormData`: a API nao expoe tipo de biblioteca de terceiros. */\n defaultValue?: string;\n disabled?: boolean;\n error?: string;\n hint?: string;\n id?: string;\n label?: string;\n /**\n * Nome do campo no formulario. Com ele, um input oculto carrega o valor para\n * o `FormData`: sem controle nativo por baixo, o envio ignorava o campo.\n */\n name?: string;\n max?: string;\n min?: string;\n step?: number;\n /** Sem hora inteira e permitida, o valor e `null`, que mantem o campo controlado e vazio. */\n onValueChange?: (value: string | null) => void;\n placeholder?: string;\n required?: boolean;\n size?: TimePickerSize;\n /**\n * `null` e \"controlado e vazio\": devolver a propriedade a `undefined` nao\n * limpa o campo, porque ali ele volta a ser nao controlado.\n */\n value?: string | null;\n}\n\nexport function TimePicker({\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n error,\n hint,\n id: providedId,\n label,\n max,\n min,\n step = 30,\n onValueChange,\n onBlur,\n onKeyDown,\n placeholder = 'hh:mm',\n required = false,\n size = 'md',\n ref,\n value,\n ...props\n}: TimePickerProps) {\n const fieldRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n // Sem isto, dois seletores de hora na mesma pagina dividiam os ids das opcoes.\n const idDaLista = `hora-${useId()}`;\n const triggerRef = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n const horaMinima = readIsoTime(min);\n const horaMaxima = readIsoTime(max);\n const [internalValue, setInternalValue] = useState<Time | null>(() => readIsoTime(defaultValue) ?? null);\n const [texto, setTexto] = useState('');\n const [digitando, setDigitando] = useState(false);\n const controlado = value === undefined ? undefined : (readIsoTime(value) ?? null);\n const escolhido = (controlado === undefined ? internalValue : controlado) ?? undefined;\n const exibido = digitando ? texto : paraTextoDeHora(escolhido);\n const inputRef = useRef<HTMLInputElement>(null);\n const resetRef = useFormReset<HTMLInputElement>(() => {\n setInternalValue(readIsoTime(defaultValue) ?? null);\n setDigitando(false);\n });\n const mergedRef = useMergedRefs(inputRef, resetRef, ref);\n\n // O interno acompanha mesmo controlado: se o consumidor devolver `undefined`, nao ressurge um valor velho.\n function definir(proximo: Time | null) {\n setInternalValue(proximo);\n onValueChange?.(proximo ? toIsoTime(proximo) : null);\n }\n\n function fechar(devolverFoco = true) {\n setOpen(false);\n\n if (devolverFoco) {\n triggerRef.current?.focus();\n }\n }\n\n function handleChange(entrada: string) {\n const mascarado = formatarEntradaHora(entrada);\n\n setDigitando(true);\n setTexto(mascarado);\n\n // O valor acompanha o texto: `18:4` ou `25:99` na tela nao convivem com a hora anterior.\n const lido = lerEntradaHora(mascarado);\n\n definir(lido && isTimeAllowed(lido, horaMinima, horaMaxima) ? lido : null);\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n } else if (event.key === 'Escape' && open) {\n fechar(false);\n }\n }\n\n const { overlayProps } = useOverlay(\n {\n isOpen: open,\n onClose: () => fechar(false),\n isDismissable: true,\n shouldCloseOnBlur: false,\n // O gatilho nao conta como \"fora\": sem isto o ponteiro fecha o painel e o\n // clique dele reabre em seguida, e ele pisca sem abrir.\n shouldCloseOnInteractOutside: (elemento) => !fieldRef.current?.contains(elemento),\n },\n panelRef,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: fieldRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: open,\n });\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => (\n <>\n <FormValue\n disabled={disabled}\n name={name}\n onFocus={() => inputRef.current?.focus()}\n required={required}\n value={paraTextoDeHora(escolhido)}\n />\n <div\n className={[styles.field, styles[size], error && styles.error, className].filter(Boolean).join(' ')}\n ref={fieldRef}\n >\n <input\n {...props}\n aria-describedby={describedBy}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n autoComplete=\"off\"\n className={styles.input}\n disabled={disabled}\n id={id}\n inputMode=\"numeric\"\n onBlur={(event) => {\n setDigitando(false);\n onBlur?.(event);\n }}\n onChange={(event) => handleChange(event.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={mergedRef}\n type=\"text\"\n value={exibido}\n />\n <button\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label=\"Abrir seletor de hora\"\n className={styles.trigger}\n disabled={disabled}\n onClick={() => (open ? fechar() : setOpen(true))}\n ref={triggerRef}\n type=\"button\"\n >\n <IconClock size={15} />\n </button>\n </div>\n {open &&\n createPortal(\n <div\n {...overlayProps}\n aria-label={label ? 'Horas de ' + label : 'Horas'}\n className={styles.panel}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n fechar();\n }\n overlayProps.onKeyDown?.(event);\n }}\n ref={panelRef}\n role=\"dialog\"\n style={positionProps.style}\n >\n <TimeSlots\n autoFocus\n baseId={providedId ?? idDaLista}\n max={horaMaxima}\n min={horaMinima}\n onChange={(hora) => {\n definir(hora);\n setDigitando(false);\n fechar();\n }}\n step={step}\n value={escolhido}\n />\n </div>,\n document.body,\n )}\n </>\n )}\n </Field>\n );\n}\n","import { useEffect, useId, useRef, useState, type ComponentPropsWithRef, type KeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlay, useOverlayPosition } from '@react-aria/overlays';\nimport {\n CalendarDate,\n CalendarDateTime,\n Time,\n getLocalTimeZone,\n now,\n toCalendarDate,\n toCalendarDateTime,\n today,\n} from '@internationalized/date';\nimport { useFormReset } from '../../../hooks/useFormReset';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport { formatarEntradaDataHora, lerEntradaDataHora } from '../../../utils/formatters';\nimport { Button } from '../../actions/Button';\nimport { Calendar } from '../DatePicker/Calendar';\nimport { readIsoDate, readIsoDateTime, toIsoDateTime } from '../DatePicker/iso';\nimport { TimeSlots } from '../TimePicker/TimeSlots';\nimport { isUnavailable, type CalendarLimits } from '../../../hooks/useCalendar/calendar';\nimport { Field } from '../Field';\nimport { FormValue } from '../Field/FormValue';\nimport styles from './DateTimePicker.module.css';\nimport { IconCalendar } from '../../icons';\n\nexport type DateTimePickerSize = 'sm' | 'md';\n\n/**\n * As propriedades nativas vao ao campo de texto, que e o controle; o `className` soma a caixa do campo, que e o que\n * se posiciona e dimensiona.\n */\nexport interface DateTimePickerProps\n extends Omit<\n ComponentPropsWithRef<'input'>,\n 'defaultValue' | 'max' | 'min' | 'name' | 'onChange' | 'size' | 'type' | 'value' | 'step'\n > {\n /** Data e hora em ISO, `2026-03-09T18:40`, como no `FormData`: a API nao expoe tipo de biblioteca de terceiros. */\n defaultValue?: string;\n disabled?: boolean;\n error?: string;\n hint?: string;\n id?: string;\n isDateUnavailable?: (date: string) => boolean;\n label?: string;\n /**\n * Nome do campo no formulario. Com ele, um input oculto carrega o valor para\n * o `FormData`: sem controle nativo por baixo, o envio ignorava o campo.\n */\n name?: string;\n locale?: string;\n /** Limites de data, em `2026-03-09`. */\n max?: string;\n min?: string;\n step?: number;\n /** Sem data e hora inteiras e permitidas, o valor e `null`, que mantem o campo controlado e vazio. */\n onValueChange?: (value: string | null) => void;\n placeholder?: string;\n required?: boolean;\n size?: DateTimePickerSize;\n /**\n * `null` e \"controlado e vazio\": devolver a propriedade a `undefined` nao\n * limpa o campo, porque ali ele volta a ser nao controlado.\n */\n value?: string | null;\n}\n\nconst doisDigitos = (valor: number) => String(valor).padStart(2, '0');\n\nfunction paraTexto(valor?: CalendarDateTime) {\n if (!valor) {\n return '';\n }\n\n const data = [doisDigitos(valor.day), doisDigitos(valor.month), valor.year].join('/');\n\n return data + ' ' + doisDigitos(valor.hour) + ':' + doisDigitos(valor.minute);\n}\n\nexport function DateTimePicker({\n 'aria-describedby': ariaDescribedBy,\n className,\n defaultValue,\n name,\n disabled = false,\n error,\n hint,\n id: providedId,\n isDateUnavailable,\n label,\n locale = 'pt-BR',\n max,\n min,\n step = 30,\n onValueChange,\n onBlur,\n onKeyDown,\n placeholder = 'dd/mm/aaaa hh:mm',\n required = false,\n size = 'md',\n ref,\n value,\n ...props\n}: DateTimePickerProps) {\n const fieldRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n // Fixo, o id fazia dois seletores dividirem os ids das opcoes de hora.\n const idDaLista = `datetime-hora-${useId()}`;\n const [open, setOpen] = useState(false);\n const limites: CalendarLimits = {\n isDateUnavailable: isDateUnavailable && ((data) => isDateUnavailable(data.toString())),\n max: readIsoDate(max),\n min: readIsoDate(min),\n };\n const [internalValue, setInternalValue] = useState<CalendarDateTime | null>(() => readIsoDateTime(defaultValue) ?? null);\n const [texto, setTexto] = useState('');\n const [digitando, setDigitando] = useState(false);\n const controlado = value === undefined ? undefined : (readIsoDateTime(value) ?? null);\n const escolhido = (controlado === undefined ? internalValue : controlado) ?? undefined;\n const [rascunho, setRascunho] = useState(escolhido);\n const [versaoDoCalendario, setVersaoDoCalendario] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const resetRef = useFormReset<HTMLInputElement>(() => {\n setInternalValue(readIsoDateTime(defaultValue) ?? null);\n setDigitando(false);\n });\n const mergedRef = useMergedRefs(inputRef, resetRef, ref);\n\n useEffect(() => {\n if (open) {\n setRascunho(escolhido);\n }\n }, [open]);\n const exibido = digitando ? texto : paraTexto(escolhido);\n\n // O interno acompanha mesmo controlado: se o consumidor devolver `undefined`, nao ressurge um valor velho.\n function definir(proximo: CalendarDateTime | null) {\n setInternalValue(proximo);\n onValueChange?.(proximo ? toIsoDateTime(proximo) : null);\n }\n\n function rascunharData(data: CalendarDate) {\n setRascunho(new CalendarDateTime(data.year, data.month, data.day, rascunho?.hour ?? 0, rascunho?.minute ?? 0));\n }\n\n // Sem data escolhida, a hora se apoia em hoje: inventar outra data\n // faria o campo exibir um dia que o usuario nunca escolheu.\n function rascunharHora(hora: Time) {\n const base = rascunho ?? today(getLocalTimeZone());\n\n setRascunho(new CalendarDateTime(base.year, base.month, base.day, hora.hour, hora.minute));\n }\n\n function fechar(devolverFoco = true) {\n setOpen(false);\n\n if (devolverFoco) {\n triggerRef.current?.focus();\n }\n }\n\n function handleChange(entrada: string) {\n const mascarado = formatarEntradaDataHora(entrada);\n\n setDigitando(true);\n setTexto(mascarado);\n\n // O texto e o valor tem de concordar. Enquanto o que esta escrito nao e uma\n // data e hora inteiras, o campo nao tem valor — segurar o ultimo deixava o\n // consumidor com meia-noite enquanto a tela mostrava `18:4`.\n const lido = lerEntradaDataHora(mascarado);\n const dia = lido && toCalendarDate(lido);\n\n definir(lido && dia && !isUnavailable(dia, limites) ? lido : null);\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLInputElement>) {\n onKeyDown?.(event);\n\n if (event.key === 'ArrowDown' && !open) {\n event.preventDefault();\n setOpen(true);\n } else if (event.key === 'Escape' && open) {\n fechar(false);\n }\n }\n\n const { overlayProps } = useOverlay(\n {\n isOpen: open,\n onClose: () => fechar(false),\n isDismissable: true,\n shouldCloseOnBlur: false,\n // O gatilho nao conta como \"fora\": sem isto o ponteiro fecha o painel e o\n // clique dele reabre em seguida, e ele pisca sem abrir.\n shouldCloseOnInteractOutside: (elemento) => !fieldRef.current?.contains(elemento),\n },\n panelRef,\n );\n const { overlayProps: positionProps } = useOverlayPosition({\n targetRef: fieldRef,\n overlayRef: panelRef,\n placement: 'bottom start',\n offset: 6,\n containerPadding: 8,\n isOpen: open,\n });\n\n return (\n <Field aria-describedby={ariaDescribedBy} error={error} hint={hint} id={providedId} label={label} required={required}>\n {({ id, describedBy, invalid }) => (\n <>\n <FormValue\n disabled={disabled}\n name={name}\n onFocus={() => inputRef.current?.focus()}\n required={required}\n value={escolhido ? toIsoDateTime(escolhido) : ''}\n />\n <div\n className={[styles.field, styles[size], error && styles.error, className].filter(Boolean).join(' ')}\n ref={fieldRef}\n >\n <input\n {...props}\n aria-describedby={describedBy}\n aria-invalid={invalid || undefined}\n aria-required={required || undefined}\n autoComplete=\"off\"\n className={styles.input}\n disabled={disabled}\n id={id}\n inputMode=\"numeric\"\n onBlur={(event) => {\n setDigitando(false);\n onBlur?.(event);\n }}\n onChange={(event) => handleChange(event.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={mergedRef}\n type=\"text\"\n value={exibido}\n />\n <button\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n aria-label=\"Abrir calendário\"\n className={styles.trigger}\n disabled={disabled}\n onClick={() => (open ? fechar() : setOpen(true))}\n ref={triggerRef}\n type=\"button\"\n >\n <IconCalendar size={15} />\n </button>\n </div>\n {open &&\n createPortal(\n <div\n {...overlayProps}\n aria-label={label ? 'Calendário de ' + label : 'Calendário'}\n className={styles.panel}\n // Camada de cima: o `ariaHideOutside` do Dialog ignora quem a declara.\n data-react-aria-top-layer=\"true\"\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n fechar();\n }\n overlayProps.onKeyDown?.(event);\n }}\n ref={panelRef}\n role=\"dialog\"\n style={positionProps.style}\n >\n <div className={styles.columns}>\n <Calendar\n autoFocus\n key={versaoDoCalendario}\n isDateUnavailable={limites.isDateUnavailable}\n locale={locale}\n max={limites.max}\n min={limites.min}\n onSelect={rascunharData}\n value={rascunho && new CalendarDate(rascunho.year, rascunho.month, rascunho.day)}\n />\n <TimeSlots\n baseId={idDaLista}\n onChange={rascunharHora}\n step={step}\n value={rascunho && new Time(rascunho.hour, rascunho.minute)}\n />\n </div>\n <div className={styles.footer}>\n <Button\n onClick={() => {\n // Remontada, a grade volta ao mes de hoje mesmo que o rascunho ja fosse hoje.\n setRascunho(toCalendarDateTime(now(getLocalTimeZone())).set({ second: 0, millisecond: 0 }));\n setVersaoDoCalendario((versao) => versao + 1);\n }}\n size=\"sm\"\n variant=\"ghost\"\n type=\"button\"\n >\n Agora\n </Button>\n <div className={styles.actions}>\n <Button onClick={() => fechar()} size=\"sm\" variant=\"secondary\" type=\"button\">\n Cancelar\n </Button>\n <Button\n onClick={() => {\n definir(rascunho ?? null);\n setDigitando(false);\n fechar();\n }}\n size=\"sm\"\n type=\"button\"\n >\n Aplicar\n </Button>\n </div>\n </div>\n </div>,\n document.body,\n )}\n </>\n )}\n </Field>\n );\n}\n","import type { ChartPlot } from './cartesianLayout';\nimport styles from './Chart.module.css';\n\nexport type BandOrientation = 'vertical' | 'horizontal';\n\nexport interface BandCursorProps {\n /** Comeco da faixa no eixo de categorias. */\n offset: number;\n orientation?: BandOrientation;\n plot: ChartPlot;\n /** Largura da faixa, que e a banda da escala de categorias. */\n size: number;\n}\n\n/**\n * Realce da faixa sob o ponteiro, atras das marcas. Na vertical ele e uma\n * coluna e na horizontal uma linha: so o eixo troca.\n */\nexport function BandCursor({ offset, orientation = 'vertical', plot, size }: BandCursorProps) {\n const vertical = orientation === 'vertical';\n\n return (\n <rect\n className={styles.cursor}\n height={vertical ? plot.height : size}\n width={vertical ? size : plot.width}\n x={vertical ? offset : 0}\n y={vertical ? 0 : offset}\n />\n );\n}\n","import type { LabelFont } from './measureText';\n\n/**\n * Medidas de espaco do desenho. Elas vivem aqui, e nao em cada grafico, porque\n * sao a mesma decisao visual repetida: quando cada arquivo guardava a sua, o\n * mesmo conceito aparecia com valores diferentes em dois vizinhos.\n *\n * Geometria em SVG nao le variavel CSS, entao estes sao numeros — mas numeros\n * de um lugar so.\n */\n\n/** Distancia entre uma marca e o rotulo que a descreve. */\nexport const CHART_LABEL_OFFSET = 8;\n\n/** Folga minima nas bordas, para o rotulo das pontas nao encostar no limite. */\nexport const CHART_EDGE_GAP = 12;\n\n/** Teto da banda de rotulos projetados, como fracao da largura. */\nexport const CHART_LABEL_BAND = 0.24;\n\n/**\n * Espaco que um rotulo de valor ocupa acima da marca. Sai da entrelinha medida,\n * e nao de um numero fixo: o rotulo ocupa o que o texto ocupa.\n */\nexport function valueLabelRoom(font: LabelFont) {\n return font.lineHeight + CHART_LABEL_OFFSET / 2;\n}\n\n/** Folga entre duas barras vizinhas dentro da mesma faixa. */\nexport const CHART_BAR_GAP = 2;\n\nexport interface BarSlot {\n offset: number;\n thickness: number;\n}\n\n/**\n * Faixa de um indice que ainda nao existe. Quando entra uma serie, o tween\n * devolve o array anterior por um render, e ali a nova nao tem presenca.\n */\nexport const NO_BAR_SLOT: BarSlot = { offset: 0, thickness: 0 };\n\n/**\n * Espessura e deslocamento de cada barra dentro da faixa, a partir da presenca\n * de cada serie. A barra desligada encolhe a zero e as demais ocupam o lugar\n * dela, sem deixar a folga sobrando no fim.\n */\nexport function barSlots(band: number, presences: readonly number[]): BarSlot[] {\n const total = presences.reduce((soma, presenca) => soma + presenca, 0);\n const unit = Math.max((band - CHART_BAR_GAP * Math.max(total - 1, 0)) / Math.max(total, 1), 0);\n\n return presences.map((presenca, indice) => ({\n offset: presences\n .slice(0, indice)\n .reduce((soma, anterior) => soma + (unit + CHART_BAR_GAP) * anterior, 0),\n thickness: unit * presenca,\n }));\n}\n\n/** Diametro do anel: o lado menor da area disponivel, menos a folga. */\nexport function ringDiameter(width: number, height: number) {\n return Math.max(Math.min(width, height) - CHART_LABEL_OFFSET * 2, 0);\n}\n","import type { AxisLabelRotation } from './cartesianLayout';\nimport { CHART_LABEL_OFFSET } from './spacing';\nimport styles from './Chart.module.css';\n\nexport type AxisOrientation = 'bottom' | 'left' | 'right';\n\nexport interface AxisTick {\n label: string;\n position: number;\n}\n\nexport interface AxisProps {\n hideLine?: boolean;\n labelRotation?: AxisLabelRotation;\n length: number;\n orientation: AxisOrientation;\n ticks: readonly AxisTick[];\n}\n\nconst ANCORA: Record<AxisOrientation, 'start' | 'end' | 'middle'> = {\n bottom: 'middle',\n left: 'end',\n right: 'start',\n};\n\n/**\n * Eixo de um grafico cartesiano. Recebe as marcas ja posicionadas: a conversao\n * de valor em pixel pertence a escala, nao ao desenho.\n */\nexport function Axis({ hideLine = false, labelRotation = 0, length, orientation, ticks }: AxisProps) {\n const deBaixo = orientation === 'bottom';\n const afastamento = orientation === 'left' ? -CHART_LABEL_OFFSET : CHART_LABEL_OFFSET;\n\n return (\n <g aria-hidden=\"true\" className={styles.axis}>\n {!hideLine && (\n <line\n className={styles.axisLine}\n x1={0}\n x2={deBaixo ? length : 0}\n y1={0}\n y2={deBaixo ? 0 : length}\n />\n )}\n {ticks.map((marca, indice) => (\n <text\n className={styles.axisLabel}\n dominantBaseline={deBaixo ? 'hanging' : 'middle'}\n key={indice}\n textAnchor={deBaixo && labelRotation !== 0 ? 'end' : ANCORA[orientation]}\n transform={\n deBaixo && labelRotation !== 0\n ? `rotate(${-labelRotation} ${marca.position} ${CHART_LABEL_OFFSET})`\n : undefined\n }\n x={deBaixo ? marca.position : afastamento}\n y={deBaixo ? CHART_LABEL_OFFSET : marca.position}\n >\n {marca.label}\n </text>\n ))}\n </g>\n );\n}\n","import styles from './Chart.module.css';\n\nexport type GridOrientation = 'horizontal' | 'vertical';\n\nexport interface GridProps {\n baseline?: number;\n length: number;\n lines: readonly number[];\n orientation: GridOrientation;\n}\n\n/**\n * Linhas de referencia do grafico. A linha da base recebe destaque proprio:\n * ela separa valores positivos de negativos e nao e apenas mais uma marca.\n */\nexport function Grid({ baseline, length, lines, orientation }: GridProps) {\n const horizontal = orientation === 'horizontal';\n\n return (\n <g aria-hidden=\"true\">\n {lines.map((posicao, indice) => (\n <line\n className={posicao === baseline ? styles.gridBaseline : styles.gridLine}\n key={indice}\n x1={horizontal ? 0 : posicao}\n x2={horizontal ? length : posicao}\n y1={horizontal ? posicao : 0}\n y2={horizontal ? posicao : length}\n />\n ))}\n </g>\n );\n}\n","/** Um degrau da escala tipografica para o valor do centro de um anel. */\nexport interface CenterStep {\n display: boolean;\n lineHeight: number;\n size: number;\n}\n\nexport interface LabelFont {\n /** Degraus do valor do centro, do maior ao menor: display, headline e title. */\n centerSteps: readonly CenterStep[];\n family: string;\n /** Familia de display, usada onde o valor e um KPI. */\n headingFamily: string;\n lineHeight: number;\n size: number;\n}\n\n/** Os papeis de cada degrau do centro e o valor deles na referencia tipografica, para quando nao ha CSS. */\nconst DEGRAUS_DO_CENTRO = [\n { display: true, papel: 'display-large', size: 36, lineHeight: 44 },\n { display: true, papel: 'headline-medium', size: 24, lineHeight: 32 },\n { display: false, papel: 'title', size: 16, lineHeight: 24 },\n];\n\nconst PADRAO: LabelFont = {\n centerSteps: DEGRAUS_DO_CENTRO.map(({ display, lineHeight, size }) => ({ display, lineHeight, size })),\n family: 'sans-serif',\n headingFamily: 'sans-serif',\n lineHeight: 16,\n size: 12,\n};\n\n/** Proporcao entre a largura media de um caractere e o corpo da fonte. */\nconst LARGURA_POR_CARACTERE = 0.58;\n\n/**\n * Fonte dos rotulos, lida dos tokens no proprio elemento do grafico. Ler do\n * elemento evita repetir em JavaScript um valor que ja pertence ao CSS.\n */\nexport function labelFontOf(node: Element | null): LabelFont {\n if (!node || typeof getComputedStyle !== 'function') {\n return PADRAO;\n }\n\n const estilo = getComputedStyle(node);\n const family = estilo.getPropertyValue('--pl-font-body').trim() || estilo.fontFamily || PADRAO.family;\n const headingFamily = estilo.getPropertyValue('--pl-font-heading').trim() || family;\n const size = Number.parseFloat(estilo.getPropertyValue('--pl-type-caption-size')) || PADRAO.size;\n const lineHeight = Number.parseFloat(estilo.getPropertyValue('--pl-type-caption-line-height'));\n const token = (nome: string) => Number.parseFloat(estilo.getPropertyValue(`--pl-type-${nome}`));\n const centerSteps = DEGRAUS_DO_CENTRO.map((degrau) => ({\n display: degrau.display,\n lineHeight: token(`${degrau.papel}-line-height`) || degrau.lineHeight,\n size: token(`${degrau.papel}-size`) || degrau.size,\n }));\n\n return { centerSteps, family, headingFamily, lineHeight: lineHeight || size * 1.34, size };\n}\n\nlet contexto: CanvasRenderingContext2D | null | undefined;\n\nfunction contextoDeMedida() {\n if (contexto === undefined) {\n try {\n contexto = document.createElement('canvas').getContext('2d');\n } catch {\n contexto = null;\n }\n }\n\n return contexto;\n}\n\n/**\n * Largura do texto na fonte informada. O canvas mede sem inserir nada na\n * pagina; onde ele nao existe, a estimativa por caractere mantem o calculo\n * deterministico, em vez de devolver zero e amontoar os rotulos.\n */\nexport function measureLabel(text: string, font: LabelFont) {\n const estimativa = text.length * font.size * LARGURA_POR_CARACTERE;\n const medida = contextoDeMedida();\n\n if (!medida) {\n return estimativa;\n }\n\n medida.font = `${font.size}px ${font.family}`;\n\n return medida.measureText(text).width || estimativa;\n}\n\nexport function widestLabel(labels: readonly string[], font: LabelFont) {\n return labels.reduce((maior, rotulo) => Math.max(maior, measureLabel(rotulo, font)), 0);\n}\n\n/**\n * Texto cortado para caber na largura, com reticencia. Onde o desenho e o\n * proprio espaco — o centro de um anel, o retangulo de um mapa de area — nao ha\n * caixa que corte por conta propria.\n */\nexport function truncateToWidth(text: string, font: LabelFont, maxWidth: number) {\n if (maxWidth <= 0) {\n return '';\n }\n\n if (measureLabel(text, font) <= maxWidth) {\n return text;\n }\n\n let corte = text.length;\n\n while (corte > 0 && measureLabel(`${text.slice(0, corte)}…`, font) > maxWidth) {\n corte -= 1;\n }\n\n return corte > 0 ? `${text.slice(0, corte)}…` : '';\n}\n\n","import { scaleBand, scaleLinear, scalePoint, scaleSqrt } from 'd3-scale';\nimport { extent, max, min } from 'd3-array';\n\nexport interface NumericRange {\n max: number;\n min: number;\n}\n\nexport interface ContinuousScaleOptions {\n clamp?: boolean;\n domain: NumericRange;\n nice?: boolean;\n range: [number, number];\n}\n\nexport interface CategoricalScaleOptions {\n domain: readonly string[];\n padding?: number;\n range: [number, number];\n}\n\n/**\n * Faixa que cobre os valores, com o zero incluido por padrao. Uma barra que\n * nao parte do zero exagera a diferenca entre os valores.\n */\nexport function domainOf(values: readonly number[], { includeZero = true } = {}): NumericRange {\n const finitos = values.filter(Number.isFinite);\n\n if (finitos.length === 0) {\n return { min: 0, max: 0 };\n }\n\n const [menor = 0, maior = 0] = extent(finitos);\n\n return {\n min: includeZero ? Math.min(menor, 0) : menor,\n max: includeZero ? Math.max(maior, 0) : maior,\n };\n}\n\n/**\n * Pilha divergente: positivos sobem do zero e negativos descem dele, cada sinal com o proprio acumulado.\n * Na soma corrida, `+10` e `-5` desenhavam o negativo por cima do positivo.\n */\nexport function stackDiverging(contributions: readonly number[]): [number, number][] {\n let positivos = 0;\n let negativos = 0;\n\n return contributions.map((valor) => {\n const parcela = Number.isFinite(valor) ? valor : 0;\n\n if (parcela < 0) {\n const inicio = negativos;\n negativos += parcela;\n return [inicio, negativos];\n }\n\n const inicio = positivos;\n positivos += parcela;\n return [inicio, positivos];\n });\n}\n\n/** Une varias series na mesma faixa, para que compartilhem um unico eixo. */\nexport function mergeDomains(domains: readonly NumericRange[]): NumericRange {\n if (domains.length === 0) {\n return { min: 0, max: 0 };\n }\n\n return {\n min: min(domains, (faixa) => faixa.min) ?? 0,\n max: max(domains, (faixa) => faixa.max) ?? 0,\n };\n}\n\n/** Parte da faixa abaixo do zero; sem amplitude, nao ha o que alinhar. */\nfunction parteNegativa({ min: menor, max: maior }: NumericRange) {\n return maior > menor ? -menor / (maior - menor) : undefined;\n}\n\n/** Estende a faixa do lado que falta para o zero ficar na altura pedida, em fracao do eixo. */\nfunction levarZeroA(faixa: NumericRange, parte: number, altura: number): NumericRange {\n if (parte > altura) {\n return { min: faixa.min, max: (-faixa.min * (1 - altura)) / altura };\n }\n\n if (parte < altura) {\n return { min: (-faixa.max * altura) / (1 - altura), max: faixa.max };\n }\n\n return faixa;\n}\n\n/**\n * Estende dois dominios que contem o zero para que ele caia na mesma altura nos\n * dois eixos. Cada um cresce so do lado que precisa, e a folga sai igual nos dois.\n */\nexport function alignZeros(a: NumericRange, b: NumericRange): [NumericRange, NumericRange] {\n const parteA = parteNegativa(a);\n const parteB = parteNegativa(b);\n\n if (parteA === undefined || parteB === undefined) {\n return [a, b];\n }\n\n const altura = Math.max(parteA, parteB) / (1 + Math.abs(parteA - parteB));\n\n return [levarZeroA(a, parteA, altura), levarZeroA(b, parteB, altura)];\n}\n\nfunction guardFlat({ min: menor, max: maior }: NumericRange): [number, number] {\n return menor === maior ? [menor, menor + 1] : [menor, maior];\n}\n\nexport function linearScale({ clamp = false, domain, nice = true, range }: ContinuousScaleOptions) {\n const escala = scaleLinear().domain(guardFlat(domain)).range(range).clamp(clamp);\n\n return nice ? escala.nice() : escala;\n}\n\n/** Faixas de largura igual, uma por categoria. Serve barras. */\nexport function bandScale({ domain, padding = 0.2, range }: CategoricalScaleOptions) {\n return scaleBand().domain([...domain]).range(range).paddingInner(padding).paddingOuter(padding / 2);\n}\n\n/** Pontos sem largura, um por categoria. Serve linhas e dispersao. */\nexport function pointScale({ domain, padding = 0.5, range }: CategoricalScaleOptions) {\n return scalePoint().domain([...domain]).range(range).padding(padding);\n}\n\n/**\n * Raio pela raiz do valor, para que a area da bolha acompanhe o dado em vez do\n * raio. Mapeando o valor direto ao raio, a area cresceria com o quadrado dele e\n * exageraria a diferenca.\n */\nexport function radiusScale(maxValue: number, range: [number, number]) {\n return scaleSqrt().domain([0, maxValue > 0 ? maxValue : 1]).range(range);\n}\n\n/**\n * Marcas de um eixo continuo. Sem contagem informada, o eixo decide pelo\n * espaco que tem, para nao amontoar rotulos em area estreita. Em escala\n * categorica as marcas sao o proprio dominio.\n */\nexport function ticksFor(scale: { ticks: (count?: number) => number[] }, length: number, count?: number) {\n return scale.ticks(count ?? Math.max(2, Math.min(10, Math.floor(length / 64))));\n}\n","import { widestLabel, type LabelFont } from './measureText';\nimport { CHART_EDGE_GAP, CHART_LABEL_OFFSET } from './spacing';\nimport { linearScale, ticksFor, type NumericRange } from '../scales';\n\nexport type AxisLabelRotation = 0 | 45 | 90;\nexport type AxisLabelAngle = AxisLabelRotation | 'auto';\n\n/**\n * Como o eixo se mostra. `onHover` reserva a calha e desliza o eixo para dentro\n * dela, de modo que o desenho nao se mexa sob o ponteiro; `hidden` dispensa a\n * calha, e e o unico modo em que a area de desenho realmente cresce.\n */\nexport type AxisVisibility = 'visible' | 'hidden' | 'onHover';\n\n/** Altura do desenho: um numero fixa, `fill` entrega a decisao ao contêiner. */\nexport type ChartHeight = number | 'fill';\n\nexport interface ResolvedHeight {\n fillHeight: boolean;\n value: number;\n}\n\n/**\n * Altura efetiva do desenho. Com `fill`, ela vem da medida do contêiner, o que\n * permite ao grafico ocupar a celula de um painel sem que ninguem repita a\n * medida em JavaScript.\n */\nexport function chartHeight(height: ChartHeight, measured: number): ResolvedHeight {\n return { fillHeight: height === 'fill', value: height === 'fill' ? measured : height };\n}\n\nexport interface ChartMargins {\n bottom: number;\n left: number;\n right: number;\n top: number;\n}\n\nexport interface ChartPlot {\n height: number;\n width: number;\n}\n\nexport interface CartesianLayoutOptions {\n bottomLabels: readonly string[];\n font: LabelFont;\n height: number;\n labelAngle: AxisLabelAngle;\n leftLabels: readonly string[];\n rightLabels: readonly string[];\n topRoom: number;\n width: number;\n xAxis: AxisVisibility;\n yAxis: AxisVisibility;\n yAxisRight: AxisVisibility;\n}\n\nexport interface CartesianLayout {\n margins: ChartMargins;\n plot: ChartPlot;\n rotation: AxisLabelRotation;\n}\n\nfunction calha(visibility: AxisVisibility, labels: readonly string[], font: LabelFont) {\n return visibility === 'hidden' ? 0 : widestLabel(labels, font) + CHART_LABEL_OFFSET;\n}\n\n/**\n * Angulo dos rotulos do eixo de baixo. Em zero grau, dois rotulos vizinhos nao\n * podem se tocar. Girados, o que precisa caber e a distancia perpendicular\n * entre duas linhas de base vizinhas, que vale o passo vezes o seno do angulo.\n */\nexport function bottomLabelRotation(\n labels: readonly string[],\n font: LabelFont,\n step: number,\n): AxisLabelRotation {\n if (labels.length === 0 || step <= 0) {\n return 0;\n }\n\n if (widestLabel(labels, font) + CHART_LABEL_OFFSET <= step) {\n return 0;\n }\n\n return step * Math.SQRT1_2 >= font.lineHeight ? 45 : 90;\n}\n\n/** Altura que os rotulos de baixo ocupam, que e a caixa do texto ja girado. */\nfunction alturaDosRotulos(\n labels: readonly string[],\n font: LabelFont,\n rotation: AxisLabelRotation,\n visibility: AxisVisibility,\n) {\n if (visibility === 'hidden') {\n return 0;\n }\n\n if (rotation === 0) {\n return font.lineHeight + CHART_LABEL_OFFSET;\n }\n\n const radianos = (rotation * Math.PI) / 180;\n const caixa = widestLabel(labels, font) * Math.sin(radianos) + font.lineHeight * Math.cos(radianos);\n\n return caixa + CHART_LABEL_OFFSET;\n}\n\n/**\n * Margens derivadas do conteudo, e nao de constantes. A ordem resolve sozinha a\n * dependencia entre elas: as calhas laterais definem a largura util, a largura\n * util define o passo entre categorias, o passo define o angulo dos rotulos e o\n * angulo define a altura que eles ocupam embaixo.\n */\nexport function cartesianLayout({\n bottomLabels,\n font,\n height,\n labelAngle,\n leftLabels,\n rightLabels,\n topRoom,\n width,\n xAxis,\n yAxis,\n yAxisRight,\n}: CartesianLayoutOptions): CartesianLayout {\n const meioRotulo = xAxis === 'hidden' ? 0 : widestLabel(bottomLabels, font) / 2;\n\n const left = Math.max(calha(yAxis, leftLabels, font), CHART_EDGE_GAP);\n const right = Math.max(calha(yAxisRight, rightLabels, font), CHART_EDGE_GAP);\n const plotWidth = Math.max(width - left - right, 0);\n\n const rotation =\n labelAngle === 'auto'\n ? bottomLabelRotation(bottomLabels, font, plotWidth / Math.max(bottomLabels.length, 1))\n : labelAngle;\n\n // Sem rotacao o rotulo das pontas transborda meia largura para cada lado; a\n // folga so precisa cobrir o que a calha lateral ainda nao cobre.\n const bordaLateral = rotation === 0 ? meioRotulo : 0;\n const margins: ChartMargins = {\n bottom: alturaDosRotulos(bottomLabels, font, rotation, xAxis),\n left: Math.max(left, bordaLateral),\n right: Math.max(right, bordaLateral),\n top: Math.max(topRoom, CHART_EDGE_GAP),\n };\n\n return {\n margins,\n plot: {\n width: Math.max(width - margins.left - margins.right, 0),\n height: Math.max(height - margins.top - margins.bottom, 0),\n },\n rotation,\n };\n}\n\n/**\n * Rotulos de valor usados apenas para medir a calha do eixo, antes de a area de\n * desenho existir. Eles saem da altura total em vez da altura util, o que pode\n * render uma marca a mais ou a menos: a largura do rotulo mais largo nao muda\n * por isso, e e so ela que a medida precisa.\n */\nexport function valueLabelsFor(\n domain: NumericRange,\n length: number,\n format: (value: number) => string,\n) {\n const escala = linearScale({ domain, range: [length, 0] });\n\n return ticksFor(escala, length).map(format);\n}\n","import { arc, pie } from 'd3-shape';\n\nexport const VOLTA = Math.PI * 2;\n\nexport interface ArcAngles {\n endAngle: number;\n startAngle: number;\n}\n\nexport interface ArcShape extends ArcAngles {\n cornerRadius?: number;\n innerRadius: number;\n outerRadius: number;\n padAngle?: number;\n}\n\nexport interface SliceAnglesOptions {\n endAngle?: number;\n padAngle?: number;\n startAngle?: number;\n}\n\n/**\n * Angulo de cada fatia, **na ordem recebida**. A ordenacao por valor fica de\n * fora: a fatia precisa ficar onde o consumidor a colocou, porque e essa ordem\n * que a legenda repete.\n */\nexport function sliceAngles(\n values: readonly number[],\n { endAngle = VOLTA, padAngle = 0, startAngle = 0 }: SliceAnglesOptions = {},\n): ArcAngles[] {\n return pie<number>()\n .sort(null)\n .sortValues(null)\n .value((valor) => Math.max(valor, 0))\n .startAngle(startAngle)\n .endAngle(endAngle)\n .padAngle(padAngle)(\n [...values],\n ).map(({ endAngle: fim, startAngle: comeco }) => ({ endAngle: fim, startAngle: comeco }));\n}\n\nexport function arcPath({ cornerRadius = 0, endAngle, innerRadius, outerRadius, padAngle = 0, startAngle }: ArcShape) {\n return (\n arc<ArcShape>()\n .cornerRadius(cornerRadius)\n .innerRadius(innerRadius)\n .outerRadius(outerRadius)\n .padAngle(padAngle)\n .startAngle(startAngle)\n .endAngle(endAngle)({ cornerRadius, endAngle, innerRadius, outerRadius, padAngle, startAngle }) ?? ''\n );\n}\n\n/** Centro geometrico do arco, onde um rotulo sobre a fatia se apoia. */\nexport function arcCentroid({ endAngle, innerRadius, outerRadius, startAngle }: ArcShape): [number, number] {\n const raio = (innerRadius + outerRadius) / 2;\n const angulo = (startAngle + endAngle) / 2 - Math.PI / 2;\n\n return [Math.cos(angulo) * raio, Math.sin(angulo) * raio];\n}\n\n/** Ponto na borda do arco, de onde parte o conector de um rotulo externo. */\nexport function arcAnchor(angles: ArcAngles, radius: number): [number, number] {\n const angulo = (angles.startAngle + angles.endAngle) / 2 - Math.PI / 2;\n\n return [Math.cos(angulo) * radius, Math.sin(angulo) * radius];\n}\n","import { measureLabel, truncateToWidth, type LabelFont } from './measureText';\nimport { CHART_LABEL_OFFSET } from './spacing';\n\nexport interface CenterText {\n family: string;\n label: string;\n lineHeight: number;\n size: number;\n value: string;\n}\n\n/** Raio do vazio central em que o valor cabe inteiro no menor degrau da escala. */\nexport function centerTextRadius(value: string, font: LabelFont) {\n const menor = font.centerSteps[font.centerSteps.length - 1];\n const largura = measureLabel(value, {\n ...font,\n family: menor.display ? font.headingFamily : font.family,\n size: menor.size,\n });\n\n return largura / 2 + CHART_LABEL_OFFSET;\n}\n\n/**\n * Valor e rotulo do centro, no maior degrau da escala oficial em que o texto ainda cabe dentro do anel: o valor e um\n * KPI, e anel pequeno desce na escala em vez de sair dela. O SVG nao corta o que transborda; no ultimo degrau, corta-se.\n */\nexport function fitCenterText(\n value: string,\n label: string,\n font: LabelFont,\n innerDiameter: number,\n): CenterText {\n // A largura util e a corda do circulo interno na altura do texto, e nao o\n // diametro: no centro do anel o texto tem o diametro inteiro, mas o rotulo,\n // logo abaixo, tem menos.\n const disponivel = Math.max(innerDiameter - CHART_LABEL_OFFSET * 2, 0);\n\n const degraus = font.centerSteps;\n const degrau =\n degraus.find((candidato) =>\n measureLabel(value, {\n ...font,\n family: candidato.display ? font.headingFamily : font.family,\n size: candidato.size,\n }) <= disponivel,\n ) ?? degraus[degraus.length - 1];\n\n const family = degrau.display ? font.headingFamily : font.family;\n\n return {\n family,\n label: truncateToWidth(label, font, disponivel),\n lineHeight: degrau.lineHeight,\n size: degrau.size,\n value: truncateToWidth(value, { ...font, family, size: degrau.size }, disponivel),\n };\n}\n","import styles from './Chart.module.css';\n\nexport type ChartLegendPosition = 'top' | 'bottom' | 'left' | 'right' | 'none';\n\nexport interface ChartLegendEntry {\n color: string;\n hidden?: boolean;\n label: string;\n /** Medida da entrada, alinhada a direita. Serve a legenda em lista do anel. */\n value?: string;\n}\n\nexport type ChartLegendSwatch = 'square' | 'dot';\n\n/** Onde a legenda horizontal se apoia na largura do grafico. */\nexport type ChartLegendAlign = 'left' | 'center' | 'right';\n\nconst ALINHAMENTO: Record<ChartLegendAlign, string> = {\n left: styles.legendLeft,\n center: styles.legendCenter,\n right: styles.legendRight,\n};\n\ninterface ChartLegendProps {\n align?: ChartLegendAlign;\n entries: readonly ChartLegendEntry[];\n onToggle?: (label: string) => void;\n position: ChartLegendPosition;\n swatch?: ChartLegendSwatch;\n}\n\n/**\n * Legenda do grafico. Quando existe um alvo para o clique, cada entrada vira um\n * botao que liga e desliga a serie, com o estado exposto por `aria-pressed`.\n */\nexport function ChartLegend({\n align = 'center',\n entries,\n onToggle,\n position,\n swatch = 'square',\n}: ChartLegendProps) {\n const lateral = position === 'left' || position === 'right';\n\n return (\n <ul className={`${styles.legend} ${lateral ? styles.legendSide : ALINHAMENTO[align]}`}>\n {entries.map((entrada, indice) => {\n const conteudo = (\n <>\n <span\n aria-hidden=\"true\"\n className={`${styles.swatch} ${swatch === 'dot' ? styles.swatchDot : ''}`}\n style={entrada.hidden ? undefined : { background: entrada.color }}\n />\n <span className={styles.legendLabel}>{entrada.label}</span>\n {entrada.value !== undefined && <span className={styles.legendValue}>{entrada.value}</span>}\n </>\n );\n\n return (\n <li className={styles.legendItem} key={indice}>\n {onToggle ? (\n <button\n aria-pressed={!entrada.hidden}\n className={`${styles.legendButton} ${entrada.hidden ? styles.legendOff : ''}`}\n onClick={() => onToggle(entrada.label)}\n type=\"button\"\n >\n {conteudo}\n </button>\n ) : (\n conteudo\n )}\n </li>\n );\n })}\n </ul>\n );\n}\n","import { useId, type ReactNode } from 'react';\nimport {\n ChartLegend,\n type ChartLegendAlign,\n type ChartLegendEntry,\n type ChartLegendPosition,\n type ChartLegendSwatch,\n} from './ChartLegend';\nimport styles from './Chart.module.css';\n\nexport interface ChartFrameProps {\n /** Marcas do grafico, em coordenadas da area de desenho. */\n children: ReactNode;\n /**\n * Leva a origem das marcas para o centro da area, de modo que o filho\n * raciocine em raio e angulo em vez de converter coordenadas.\n */\n centerOrigin?: boolean;\n containerRef: (node: HTMLElement | null) => void;\n empty: boolean;\n emptyMessage: string;\n fillHeight: boolean;\n height: number;\n legend?: readonly ChartLegendEntry[];\n legendAlign?: ChartLegendAlign;\n legendPosition: ChartLegendPosition;\n /** A partir de quantas entradas a legenda aparece. */\n minLegendEntries?: number;\n onToggleSeries?: (label: string) => void;\n swatch?: ChartLegendSwatch;\n title: string;\n width: number;\n}\n\n/**\n * Moldura de qualquer grafico: titulo, area de desenho, estado vazio e legenda.\n * O que muda entre as familias e o que se desenha dentro dela — eixos, aneis ou\n * a area inteira —, e nao o cerco, que era o mesmo repetido tres vezes.\n */\nexport function ChartFrame({\n children,\n centerOrigin = false,\n containerRef,\n empty,\n emptyMessage,\n fillHeight,\n height,\n legend,\n legendAlign,\n legendPosition,\n minLegendEntries = 1,\n onToggleSeries,\n swatch = 'square',\n title,\n width,\n}: ChartFrameProps) {\n const tituloId = useId();\n const lateral = legendPosition === 'left' || legendPosition === 'right';\n const legenda = legendPosition !== 'none' && legend !== undefined && legend.length >= minLegendEntries && (\n <ChartLegend\n align={legendAlign}\n entries={legend}\n onToggle={onToggleSeries}\n position={legendPosition}\n swatch={swatch}\n />\n );\n\n return (\n <figure className={styles.figure}>\n <figcaption className={styles.title} id={tituloId}>\n {title}\n </figcaption>\n\n <div className={`${styles.body} ${lateral ? styles.bodyRow : styles.bodyColumn}`}>\n {(legendPosition === 'top' || legendPosition === 'left') && legenda}\n\n <div\n className={`${styles.plot} ${fillHeight ? styles.plotFill : ''}`}\n ref={containerRef}\n style={fillHeight ? undefined : { minHeight: height }}\n >\n {/* Sem medida ainda — SSR, aba escondida, contêiner recolhido — o\n desenho espera. Anunciar ausencia de dados ali seria mentira: eles\n estao la, e o que falta e largura. */}\n {empty ? (\n <p className={styles.empty}>{emptyMessage}</p>\n ) : width === 0 || height === 0 ? null : (\n <svg\n aria-labelledby={tituloId}\n className={styles.canvas}\n height={height}\n role=\"img\"\n viewBox={`0 0 ${width} ${height}`}\n width={width}\n >\n {centerOrigin ? (\n <g transform={`translate(${width / 2} ${height / 2})`}>{children}</g>\n ) : (\n children\n )}\n </svg>\n )}\n </div>\n\n {(legendPosition === 'bottom' || legendPosition === 'right') && legenda}\n </div>\n </figure>\n );\n}\n","import type { ReactNode } from 'react';\nimport { Axis, type AxisOrientation, type AxisTick } from './Axis';\nimport { ChartFrame } from './ChartFrame';\nimport type { ChartLegendAlign, ChartLegendEntry, ChartLegendPosition } from './ChartLegend';\nimport { Grid, type GridOrientation } from './Grid';\nimport type { AxisLabelRotation, AxisVisibility, ChartMargins, ChartPlot } from './cartesianLayout';\nimport styles from './Chart.module.css';\n\nexport interface CartesianAxis {\n hideLine?: boolean;\n labelRotation?: AxisLabelRotation;\n ticks: readonly AxisTick[];\n visibility?: AxisVisibility;\n}\n\nexport interface CartesianGrid {\n baseline?: number;\n lines: readonly number[];\n orientation: GridOrientation;\n}\n\nexport interface CartesianFrameProps {\n children: ReactNode;\n containerRef: (node: HTMLElement | null) => void;\n empty: boolean;\n emptyMessage: string;\n fillHeight: boolean;\n grid?: readonly CartesianGrid[];\n height: number;\n legend?: readonly ChartLegendEntry[];\n legendAlign?: ChartLegendAlign;\n legendPosition: ChartLegendPosition;\n margins: ChartMargins;\n onToggleSeries?: (label: string) => void;\n plot: ChartPlot;\n title: string;\n width: number;\n xAxis: CartesianAxis;\n yAxis: CartesianAxis;\n yAxisRight?: CartesianAxis;\n}\n\nconst DESLIZE: Record<AxisOrientation, string> = {\n bottom: styles.slideUp,\n left: styles.slideRight,\n right: styles.slideLeft,\n};\n\ninterface EixoProps {\n axis: CartesianAxis;\n gutter: { height: number; width: number; x: number; y: number };\n length: number;\n orientation: AxisOrientation;\n}\n\n/**\n * Um eixo e a sua calha. No modo `onHover` a calha e um alvo transparente: o\n * eixo desliza para dentro dela depois de um instante de ponteiro parado, e sai\n * na hora em que o ponteiro deixa a area.\n */\nfunction EixoComCalha({ axis, gutter, length, orientation }: EixoProps) {\n const visibility = axis.visibility ?? 'visible';\n\n if (visibility === 'hidden') {\n return null;\n }\n\n const dinamico = visibility === 'onHover';\n const eixo = (\n <Axis\n hideLine={axis.hideLine}\n labelRotation={axis.labelRotation}\n length={length}\n orientation={orientation}\n ticks={axis.ticks}\n />\n );\n\n if (!dinamico) {\n return eixo;\n }\n\n return (\n <g className={`${styles.dynamicAxis} ${DESLIZE[orientation]}`}>\n <rect\n className={styles.gutter}\n height={gutter.height}\n width={gutter.width}\n x={gutter.x}\n y={gutter.y}\n />\n {eixo}\n </g>\n );\n}\n\n/**\n * Camada cartesiana sobre a moldura comum: grade, os dois eixos e as marcas,\n * todos dentro das margens ja calculadas a partir dos rotulos.\n */\nexport function CartesianFrame({\n children,\n containerRef,\n empty,\n emptyMessage,\n fillHeight,\n grid,\n height,\n legend,\n legendAlign,\n legendPosition,\n margins,\n onToggleSeries,\n plot,\n title,\n width,\n xAxis,\n yAxis,\n yAxisRight,\n}: CartesianFrameProps) {\n return (\n <ChartFrame\n containerRef={containerRef}\n empty={empty}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={height}\n legend={legend}\n legendAlign={legendAlign}\n legendPosition={legendPosition}\n minLegendEntries={2}\n onToggleSeries={onToggleSeries}\n title={title}\n width={width}\n >\n <g transform={`translate(${margins.left} ${margins.top})`}>\n {grid?.map((linhas) => (\n <Grid\n baseline={linhas.baseline}\n key={linhas.orientation}\n length={linhas.orientation === 'horizontal' ? plot.width : plot.height}\n lines={linhas.lines}\n orientation={linhas.orientation}\n />\n ))}\n\n {children}\n\n <g transform={`translate(0 ${plot.height})`}>\n <EixoComCalha\n axis={xAxis}\n gutter={{ height: margins.bottom, width: plot.width, x: 0, y: 0 }}\n length={plot.width}\n orientation=\"bottom\"\n />\n </g>\n\n <EixoComCalha\n axis={yAxis}\n gutter={{ height: plot.height, width: margins.left, x: -margins.left, y: 0 }}\n length={plot.height}\n orientation=\"left\"\n />\n\n {yAxisRight && (\n <g transform={`translate(${plot.width} 0)`}>\n <EixoComCalha\n axis={yAxisRight}\n gutter={{ height: plot.height, width: margins.right, x: 0, y: 0 }}\n length={plot.height}\n orientation=\"right\"\n />\n </g>\n )}\n </g>\n </ChartFrame>\n );\n}\n","import { area, curveLinear, curveMonotoneX, line } from 'd3-shape';\n\nexport type ChartCurve = 'smooth' | 'straight';\n\nexport interface ChartPoint {\n x: number;\n y: number;\n}\n\nexport interface ChartBand {\n x: number;\n y0: number;\n y1: number;\n}\n\nfunction curveOf(curve: ChartCurve) {\n return curve === 'smooth' ? curveMonotoneX : curveLinear;\n}\n\n/**\n * Caminho de uma curva, com interrupcao onde o valor nao existe. Emendar sobre\n * o buraco desenharia um trecho que o dado nao afirma.\n */\nexport function linePath(points: readonly (ChartPoint | null)[], curve: ChartCurve) {\n return (\n line<ChartPoint | null>()\n .defined((ponto) => ponto !== null && Number.isFinite(ponto.x) && Number.isFinite(ponto.y))\n .x((ponto) => ponto?.x ?? 0)\n .y((ponto) => ponto?.y ?? 0)\n .curve(curveOf(curve))(points) ?? ''\n );\n}\n\n/** Caminho da faixa entre duas linhas. A base varia quando as areas empilham. */\nexport function areaPath(bands: readonly (ChartBand | null)[], curve: ChartCurve) {\n return (\n area<ChartBand | null>()\n .defined((banda) => banda !== null && Number.isFinite(banda.y0) && Number.isFinite(banda.y1))\n .x((banda) => banda?.x ?? 0)\n .y0((banda) => banda?.y0 ?? 0)\n .y1((banda) => banda?.y1 ?? 0)\n .curve(curveOf(curve))(bands) ?? ''\n );\n}\n\n/** Raios dos quatro cantos, no sentido horario a partir do superior esquerdo. */\nexport type CornerRadii = [number, number, number, number];\n\n/**\n * Retangulo com raio por canto, arredondado por curva quadratica com o controle\n * no proprio canto. O atributo `rx` arredonda os quatro de uma vez, e numa barra\n * empilhada isso separa os segmentos: a pilha precisa das duas pontas\n * arredondadas e do meio reto, para parecer uma barra so.\n */\nexport function roundedBarPath(\n x: number,\n y: number,\n width: number,\n height: number,\n radii: CornerRadii,\n) {\n const limite = Math.max(Math.min(width, height) / 2, 0);\n const [se, sd, id, ie] = radii.map((raio) => Math.max(Math.min(raio, limite), 0));\n const direita = x + width;\n const base = y + height;\n\n // Todos os comandos levam par de coordenadas, sem `H` nem `V`: o caminho fica\n // uniforme e as suas medidas saem dele sem interpretar comando a comando.\n return [\n `M${x + se},${y}`,\n `L${direita - sd},${y}`,\n sd ? `Q${direita},${y} ${direita},${y + sd}` : '',\n `L${direita},${base - id}`,\n id ? `Q${direita},${base} ${direita - id},${base}` : '',\n `L${x + ie},${base}`,\n ie ? `Q${x},${base} ${x},${base - ie}` : '',\n `L${x},${y + se}`,\n se ? `Q${x},${y} ${x + se},${y}` : '',\n 'Z',\n ]\n .filter(Boolean)\n .join('');\n}\n","import type { SeriesAppearance } from '../palette';\n\nexport interface ChartSlice extends SeriesAppearance {\n label: string;\n value: number;\n}\n\nexport interface GroupSmallSlicesOptions {\n label: string;\n threshold: number;\n}\n\n/**\n * Reune as fatias pequenas numa so. Abaixo de um limiar a fatia deixa de ser\n * legivel no anel e ainda ocupa uma linha da legenda; o agrupamento e a regra\n * de percentual minimo da referencia.\n *\n * A fatia reunida entra no lugar da primeira pequena, para que a ordem das\n * demais, que a legenda repete, permaneca a mesma.\n */\n/** Valor que a fatia ocupa no anel. Invalido tem o destino do ausente; um so desligava o agrupamento. */\nfunction ocupacao(fatia: ChartSlice) {\n return Number.isFinite(fatia.value) ? Math.max(fatia.value, 0) : 0;\n}\n\nexport function groupSmallSlices(\n slices: readonly ChartSlice[],\n { label, threshold }: GroupSmallSlicesOptions,\n): readonly ChartSlice[] {\n const total = slices.reduce((soma, fatia) => soma + ocupacao(fatia), 0);\n\n if (threshold <= 0 || total <= 0) {\n return slices;\n }\n\n const pequena = (fatia: ChartSlice) => Number.isFinite(fatia.value) && ocupacao(fatia) / total < threshold;\n const pequenas = slices.filter(pequena);\n\n if (pequenas.length < 2) {\n return slices;\n }\n\n const reunida: ChartSlice = {\n intent: 'neutral',\n label,\n value: pequenas.reduce((soma, fatia) => soma + ocupacao(fatia), 0),\n };\n\n let inserida = false;\n\n return slices.flatMap((fatia) => {\n if (!pequena(fatia)) {\n return [fatia];\n }\n\n if (inserida) {\n return [];\n }\n\n inserida = true;\n\n return [reunida];\n });\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { labelFontOf, type LabelFont } from './measureText';\n\nexport interface ChartMetrics {\n font: LabelFont;\n height: number;\n /** Raio dos cantos, lido do token: geometria de caminho nao le variavel CSS. */\n radius: number;\n ref: (node: HTMLElement | null) => void;\n width: number;\n}\n\nconst RAIO_PADRAO = 5;\n\nfunction raioDe(node: Element | null) {\n if (!node || typeof getComputedStyle !== 'function') {\n return RAIO_PADRAO;\n }\n\n return Number.parseFloat(getComputedStyle(node).getPropertyValue('--pl-radius-sm')) || RAIO_PADRAO;\n}\n\n/**\n * Mede o espaco em que o grafico sera desenhado: largura, altura e a fonte que\n * os rotulos vao usar. A area de desenho nao entra no fluxo, entao a medida e\n * sempre o que o layout concedeu, e nunca o que o proprio grafico ocupou.\n *\n * A fonte sai da mesma medida porque as duas vem do elemento e mudam juntas:\n * as margens do grafico dependem da largura dos rotulos, e a largura de um\n * rotulo depende da fonte resolvida ali.\n */\nexport function useChartMetrics(): ChartMetrics {\n const [medida, setMedida] = useState<{\n font: LabelFont;\n height: number;\n radius: number;\n width: number;\n }>(() => ({ font: labelFontOf(null), height: 0, radius: RAIO_PADRAO, width: 0 }));\n const elemento = useRef<HTMLElement | null>(null);\n\n const medir = useCallback(() => {\n const node = elemento.current;\n const width = node?.clientWidth ?? 0;\n const height = node?.clientHeight ?? 0;\n const font = labelFontOf(node);\n const radius = raioDe(node);\n\n setMedida((atual) =>\n atual.width === width &&\n atual.height === height &&\n atual.radius === radius &&\n atual.font.family === font.family &&\n atual.font.size === font.size &&\n atual.font.lineHeight === font.lineHeight &&\n atual.font.centerSteps.every((degrau, indice) => degrau.size === font.centerSteps[indice]?.size)\n ? atual\n : { font, height, radius, width },\n );\n }, []);\n\n const ref = useCallback(\n (node: HTMLElement | null) => {\n elemento.current = node;\n medir();\n },\n [medir],\n );\n\n useEffect(() => {\n const node = elemento.current;\n\n if (!node || typeof ResizeObserver === 'undefined') {\n return;\n }\n\n const observador = new ResizeObserver(medir);\n observador.observe(node);\n\n return () => observador.disconnect();\n }, [medir]);\n\n return {\n font: medida.font,\n height: medida.height,\n radius: medida.radius,\n ref,\n width: medida.width,\n };\n}\n","import { useState } from 'react';\n\nexport interface HoveredBand {\n hover: (index: number | null) => void;\n hovered: number | null;\n}\n\n/**\n * Faixa sob o ponteiro. O grafico a usa para o realce e o consumidor recebe o\n * aviso pela mesma porta, em vez de cada grafico repetir estado e callback.\n */\nexport function useHoveredBand(onHover?: (index: number | null) => void): HoveredBand {\n const [hovered, setHovered] = useState<number | null>(null);\n\n return {\n hover: (index) => {\n setHovered(index);\n onHover?.(index);\n },\n hovered,\n };\n}\n","import { useCallback, useState } from 'react';\n\nexport interface UseSeriesToggleOptions {\n defaultHiddenSeries?: readonly string[];\n hiddenSeries?: readonly string[];\n onHiddenSeriesChange?: (hidden: readonly string[]) => void;\n}\n\nexport interface SeriesToggle {\n isHidden: (label: string) => boolean;\n toggle: (label: string) => void;\n}\n\n/**\n * Quais series estao ocultas. Controlado quando o produto informa\n * `hiddenSeries`, nao controlado em caso contrario, conforme `COMPONENTS.md`\n * secao 6. Trabalha com rotulos porque e o rotulo que a legenda exibe e o que\n * o produto reconhece; indices mudariam de significado ao reordenar as series.\n */\nexport function useSeriesToggle({\n defaultHiddenSeries = [],\n hiddenSeries,\n onHiddenSeriesChange,\n}: UseSeriesToggleOptions): SeriesToggle {\n const [internas, setInternas] = useState<readonly string[]>(defaultHiddenSeries);\n const ocultas = hiddenSeries ?? internas;\n\n const toggle = useCallback(\n (label: string) => {\n const proximas = ocultas.includes(label)\n ? ocultas.filter((oculta) => oculta !== label)\n : [...ocultas, label];\n\n if (hiddenSeries === undefined) {\n setInternas(proximas);\n }\n\n onHiddenSeriesChange?.(proximas);\n },\n [hiddenSeries, ocultas, onHiddenSeriesChange],\n );\n\n return {\n isHidden: useCallback((label: string) => ocultas.includes(label), [ocultas]),\n toggle,\n };\n}\n","/** Quantidade de series que a paleta do Design System cobre. */\nexport const SERIES_TOKENS = 6;\n\n/**\n * Cores das series na paleta do Design System, como variaveis CSS. Resolvem\n * tema claro e escuro sozinhas, e a serie N usa sempre o mesmo token, para que\n * um filtro que reduza as series nao repinte as restantes.\n */\nexport function seriesColors(quantidade: number) {\n return Array.from(\n { length: Math.max(quantidade, 0) },\n (_, indice) => `var(--pl-chart-series-${(indice % SERIES_TOKENS) + 1})`,\n );\n}\n\n/** Cores de marca que ja ocupam uma posicao fixa na paleta do sistema. */\nconst POSICAO_NA_PALETA: Record<string, number> = {\n '#49619c': 1,\n '#f26b35': 2,\n '#6e2a92': 3,\n};\n\n/**\n * Paleta que abre com a cor escolhida pela aplicacao e segue com as do Design\n * System, saltando a posicao que repetiria essa cor.\n *\n * Gerar as demais a partir da cor escolhida foi medido e descartado: girar a\n * matiz em passos iguais nao separa as series de forma perceptivel, e a paleta\n * resultante reprova na verificacao de deficiencia de visao de cores.\n */\nexport function paletteWithAccent(accent: string, quantidade: number) {\n if (quantidade <= 0) {\n return [];\n }\n\n const ocupada = POSICAO_NA_PALETA[accent.trim().toLowerCase()];\n const restantes = seriesColors(SERIES_TOKENS).filter(\n (_, indice) => ocupada === undefined || indice + 1 !== ocupada,\n );\n\n return [accent, ...Array.from({ length: quantidade - 1 }, (_, i) => restantes[i % restantes.length])];\n}\n","import { SERIES_TOKENS, paletteWithAccent, seriesColors } from './palette';\n\n/**\n * Papel da serie quando a cor carrega significado. Uma serie com intencao nao\n * entra na rotacao categorica: pintar despesa com a cor de tema do usuario\n * trocaria o significado da barra a cada usuario.\n */\nexport type SeriesIntent = 'positive' | 'negative' | 'warning' | 'neutral';\n\nexport interface SeriesAppearance {\n color?: string;\n intent?: SeriesIntent;\n}\n\nexport interface ResolveSeriesColorsOptions {\n accent?: string;\n}\n\n/** Token de cada intencao. A paleta e quem detem esse mapa. */\nexport const INTENT_TOKENS: Record<SeriesIntent, string> = {\n positive: 'var(--pl-chart-positive)',\n negative: 'var(--pl-chart-negative)',\n warning: 'var(--pl-chart-warning)',\n neutral: 'var(--pl-chart-neutral)',\n};\n\n/** Cores da paleta e das intencoes, que tem token de texto proprio, medido em cada tema. */\nconst COR_COM_TEXTO_PROPRIO = /^var\\(--pl-chart-(series-\\d|positive|negative|warning|neutral)\\)$/;\n\n/** Luminancia em que branco e preto medem o mesmo contraste; acima dela, o preto mede mais. */\nconst LUMINANCIA_DE_EMPATE = Math.sqrt(1.05 * 0.05) - 0.05;\n\nfunction luminanciaDoHexadecimal(cor: string) {\n const hexadecimal = cor.trim().replace(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i, '#$1$1$2$2$3$3');\n const canais = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(hexadecimal);\n\n if (!canais) {\n return undefined;\n }\n\n const [r, g, b] = canais.slice(1).map((canal) => {\n const valor = parseInt(canal, 16) / 255;\n\n return valor <= 0.04045 ? valor / 12.92 : ((valor + 0.055) / 1.055) ** 2.4;\n });\n\n return 0.2126 * r + 0.7152 * g + 0.0722 * b;\n}\n\n/**\n * Cor do texto escrito sobre a marca, como a porcentagem dentro da fatia. A cor\n * informada em hexadecimal e medida; em outro formato, o texto fica branco.\n */\nexport function textColorOn(color: string) {\n const token = COR_COM_TEXTO_PROPRIO.exec(color.trim())?.[1];\n\n if (token) {\n return `var(--pl-chart-on-${token})`;\n }\n\n const luminancia = luminanciaDoHexadecimal(color);\n\n return luminancia !== undefined && luminancia > LUMINANCIA_DE_EMPATE\n ? 'var(--pl-chart-on-light)'\n : 'var(--pl-chart-on-dark)';\n}\n\n/**\n * Cor de cada serie, em tres niveis de precedencia: a cor informada pelo\n * implementador vence; depois a intencao semantica; por fim a paleta\n * categorica, que abre com a cor de tema quando houver.\n *\n * Series com cor ou intencao nao consomem posicao da paleta, para que as\n * categoricas sigam a ordem sem deixar buracos.\n */\nexport function resolveSeriesColors(\n series: readonly SeriesAppearance[],\n { accent }: ResolveSeriesColorsOptions = {},\n) {\n const categoricas = series.filter((serie) => !serie.color && !serie.intent).length;\n const paleta = accent ? paletteWithAccent(accent, categoricas) : seriesColors(categoricas);\n let proxima = 0;\n\n return series.map((serie) => {\n if (serie.color) {\n return serie.color;\n }\n\n if (serie.intent) {\n return INTENT_TOKENS[serie.intent];\n }\n\n const cor = paleta[proxima] ?? seriesColors(SERIES_TOKENS)[proxima % SERIES_TOKENS];\n proxima += 1;\n\n return cor;\n });\n}\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * Duracao do movimento dos dados. Ela e mais longa que os tokens de `speed`,\n * que medem resposta a um gesto: aqui o olho precisa acompanhar uma barra\n * mudando de altura, nao apenas notar que algo respondeu.\n */\nconst DURACAO = 320;\n\n/**\n * Sem `matchMedia` nao ha navegador para animar, e sem preferencia conhecida o\n * salto e a escolha segura. Isso tambem mantem o resultado deterministico fora\n * do navegador, onde nao existe quadro a quadro.\n */\nfunction podeAnimar() {\n return typeof matchMedia === 'function' && !matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/** Desacelera no fim, para o valor chegar ao alvo sem parecer que bateu nele. */\nfunction suavizar(t: number) {\n return 1 - (1 - t) ** 3;\n}\n\n/**\n * Numeros que caminham ate o alvo em vez de saltar. Animar o dominio de uma\n * escala move o grafico inteiro — barras, curvas, grade e marcas do eixo — com\n * uma unica animacao, em vez de uma por marca.\n *\n * Quando a quantidade de numeros muda nao existe par para interpolar, e o valor\n * assume o alvo de imediato.\n */\nexport interface TweenOptions {\n duration?: number;\n /** Ponto de partida do primeiro quadro, para o grafico entrar em vez de surgir pronto. */\n from?: readonly number[];\n}\n\nexport function useTweenedNumbers(target: readonly number[], { duration = DURACAO, from }: TweenOptions = {}) {\n const [valores, setValores] = useState(from ?? target);\n const atual = useRef(from ?? target);\n\n // A chave resume os numeros: o efeito reage ao valor, e nao a identidade do\n // array, que e outra a cada render.\n const chave = target.join(',');\n\n useEffect(() => {\n const inicio = atual.current;\n\n const assumir = (proximos: readonly number[]) => {\n atual.current = proximos;\n setValores(proximos);\n };\n\n if (inicio.length !== target.length || duration <= 0 || !podeAnimar()) {\n assumir(target);\n return;\n }\n\n const comeco = performance.now();\n let quadro = 0;\n\n const passo = () => {\n const decorrido = Math.min((performance.now() - comeco) / duration, 1);\n const fator = suavizar(decorrido);\n\n assumir(inicio.map((valor, indice) => valor + (target[indice] - valor) * fator));\n\n if (decorrido < 1) {\n quadro = requestAnimationFrame(passo);\n }\n };\n\n quadro = requestAnimationFrame(passo);\n\n return () => cancelAnimationFrame(quadro);\n }, [chave, duration]);\n\n return valores;\n}\n","import { useMemo, useState } from 'react';\nimport { resolveSeriesColors } from '../palette';\nimport { sliceAngles, type ArcAngles } from './arcs';\nimport { groupSmallSlices, type ChartSlice } from './slices';\nimport { useSeriesToggle } from './useSeriesToggle';\nimport { useTweenedNumbers } from './useTweenedNumbers';\n\nexport interface UseSliceRingOptions {\n accent?: string;\n defaultHiddenSlices?: readonly string[];\n hiddenSlices?: readonly string[];\n onHiddenSlicesChange?: (hidden: readonly string[]) => void;\n /** Fatia sob o ponteiro, ja agrupada, ou `null` ao sair dela. */\n onHoverSlice?: (slice: ChartSlice | null) => void;\n otherLabel: string;\n slices: readonly ChartSlice[];\n smallSliceThreshold: number;\n}\n\nexport interface SliceRing {\n angles: readonly ArcAngles[];\n colors: readonly string[];\n focus: (index: number | null) => void;\n focused: number | null;\n isHidden: (label: string) => boolean;\n ratioOf: (index: number) => number;\n slices: readonly ChartSlice[];\n toggle: (label: string) => void;\n total: number;\n values: readonly number[];\n}\n\n/**\n * O anel repartido: fatias pequenas ja reunidas, cores resolvidas, valores das\n * fatias ligadas e os angulos em movimento. E o que `ChartPie` e `ChartDonut`\n * compartilham — o anel, nao o componente.\n */\nexport function useSliceRing({\n accent,\n defaultHiddenSlices,\n hiddenSlices,\n onHiddenSlicesChange,\n onHoverSlice,\n otherLabel,\n slices,\n smallSliceThreshold,\n}: UseSliceRingOptions): SliceRing {\n const { isHidden, toggle } = useSeriesToggle({\n defaultHiddenSeries: defaultHiddenSlices,\n hiddenSeries: hiddenSlices,\n onHiddenSeriesChange: onHiddenSlicesChange,\n });\n const [focused, setFocused] = useState<number | null>(null);\n\n const reunidas = useMemo(\n () => groupSmallSlices(slices, { label: otherLabel, threshold: smallSliceThreshold }),\n [otherLabel, slices, smallSliceThreshold],\n );\n\n // A cor sai da lista inteira, e nao das visiveis: desligar uma fatia nao pode\n // repintar as demais.\n const colors = useMemo(() => resolveSeriesColors(reunidas, { accent }), [accent, reunidas]);\n\n const values = reunidas.map((fatia) =>\n isHidden(fatia.label) || !Number.isFinite(fatia.value) ? 0 : Math.max(fatia.value, 0),\n );\n const total = values.reduce((soma, valor) => soma + valor, 0);\n\n // Os angulos caminham ate o alvo, entao desligar uma fatia reparte o anel em\n // movimento. Partindo de zero, o anel tambem varre ao aparecer.\n const alvo = useMemo(\n () => sliceAngles(values).flatMap((angulo) => [angulo.startAngle, angulo.endAngle]),\n // A chave resume os valores: o alvo muda com o numero, nao com a identidade\n // do array, que e outra a cada render.\n [values.join()],\n );\n const animados = useTweenedNumbers(alvo, { from: alvo.map(() => 0) });\n\n const angles = reunidas.map((_, indice) => ({\n startAngle: animados[indice * 2] ?? 0,\n endAngle: animados[indice * 2 + 1] ?? 0,\n }));\n\n return {\n angles,\n colors,\n // A fatia entregue e a **agrupada**: as pequenas ja viraram uma so, entao o\n // indice do anel nao corresponde ao que o consumidor informou.\n focus: (indice) => {\n setFocused(indice);\n onHoverSlice?.(indice === null ? null : reunidas[indice] ?? null);\n },\n focused,\n isHidden,\n ratioOf: (indice) => (total > 0 ? (values[indice] ?? 0) / total : 0),\n slices: reunidas,\n toggle,\n total,\n values,\n };\n}\n","import { useMemo } from 'react';\nimport {\n BandCursor,\n CartesianFrame,\n NO_BAR_SLOT,\n barSlots,\n cartesianLayout,\n chartHeight,\n roundedBarPath,\n useChartMetrics,\n useHoveredBand,\n useSeriesToggle,\n useTweenedNumbers,\n valueLabelRoom,\n valueLabelsFor,\n type AxisLabelAngle,\n type AxisTick,\n type AxisVisibility,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n type CornerRadii,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { bandScale, domainOf, linearScale, mergeDomains, stackDiverging, ticksFor } from '../scales';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartBar.module.css';\n\nexport type ChartBarOrientation = 'vertical' | 'horizontal';\n\nexport interface ChartBarSeries extends SeriesAppearance {\n label: string;\n values: readonly number[];\n}\n\nexport interface ChartBarProps {\n accent?: string;\n categories: readonly string[];\n defaultHiddenSeries?: readonly string[];\n emptyMessage?: string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenSeries?: readonly string[];\n labelAngle?: AxisLabelAngle;\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n onHiddenSeriesChange?: (hidden: readonly string[]) => void;\n /** Indice da categoria sob o ponteiro, ou `null` ao sair dela. */\n onHoverCategory?: (index: number | null) => void;\n orientation?: ChartBarOrientation;\n series: readonly ChartBarSeries[];\n /** Valor alem da ponta de cada barra; empilhada, o total da categoria alem da ponta da pilha. */\n showDataLabels?: boolean;\n stacked?: boolean;\n title: string;\n xAxis?: AxisVisibility;\n yAxis?: AxisVisibility;\n yAxisRight?: AxisVisibility;\n}\n\nexport function ChartBar({\n accent,\n categories,\n defaultHiddenSeries,\n emptyMessage = 'Sem dados no período',\n formatValue = formatarNumero,\n height = 260,\n hiddenSeries,\n labelAngle = 'auto',\n legend = 'bottom',\n legendAlign,\n onHiddenSeriesChange,\n onHoverCategory,\n orientation = 'vertical',\n series,\n showDataLabels = false,\n stacked = false,\n title,\n xAxis = 'visible',\n yAxis = 'visible',\n yAxisRight = 'hidden',\n}: ChartBarProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({ defaultHiddenSeries, hiddenSeries, onHiddenSeriesChange });\n const { hover: focarFaixa, hovered: faixaEmFoco } = useHoveredBand(onHoverCategory);\n const vertical = orientation === 'vertical';\n\n // A cor sai da lista inteira, e nao das visiveis: desligar uma serie nao pode\n // repintar as demais.\n const cores = useMemo(() => resolveSeriesColors(series, { accent }), [accent, series]);\n\n // Presenca de cada serie, entre zero e um. E ela que reparte a faixa, entao a\n // serie desligada encolhe enquanto as demais ocupam o lugar dela.\n const presencas = useTweenedNumbers(series.map((serie) => (isHidden(serie.label) ? 0 : 1)));\n const presenca = (indice: number) => presencas[indice] ?? 0;\n\n const dominio = useMemo(() => {\n const visiveis = series.filter((serie) => !isHidden(serie.label));\n\n if (stacked) {\n return domainOf(\n categories.flatMap((_, indice) => stackDiverging(visiveis.map((serie) => serie.values[indice] ?? 0)).flat()),\n );\n }\n\n return mergeDomains(visiveis.map((serie) => domainOf([...serie.values])));\n }, [categories, isHidden, series, stacked]);\n\n // Barras horizontais consomem a largura: a legenda ao lado espremeria o desenho.\n const posicaoDaLegenda = !vertical && (legend === 'left' || legend === 'right') ? 'bottom' : legend;\n\n const rotulosDeValor = valueLabelsFor(dominio, vertical ? alturaDoDesenho : width, formatValue);\n\n const { margins, plot, rotation } = cartesianLayout({\n bottomLabels: vertical ? categories : rotulosDeValor,\n font,\n height: alturaDoDesenho,\n labelAngle,\n leftLabels: vertical ? rotulosDeValor : categories,\n rightLabels: vertical ? rotulosDeValor : categories,\n topRoom: showDataLabels && vertical ? valueLabelRoom(font) : 0,\n width,\n xAxis,\n yAxis,\n yAxisRight,\n });\n\n const comprimentoCategorias = vertical ? plot.width : plot.height;\n const comprimentoValores = vertical ? plot.height : plot.width;\n const inicioDaFaixa = vertical ? comprimentoValores : 0;\n const fimDaFaixa = vertical ? 0 : comprimentoValores;\n\n const escalaCategorias = useMemo(\n () => bandScale({ domain: categories, range: [0, comprimentoCategorias] }),\n [categories, comprimentoCategorias],\n );\n\n // A escala alvo fixa as marcas; a animada posiciona o desenho. Sem separar as\n // duas, as marcas exibiriam valores quebrados durante a transicao.\n const escalaAlvo = useMemo(\n () => linearScale({ domain: dominio, range: [inicioDaFaixa, fimDaFaixa] }),\n [dominio, fimDaFaixa, inicioDaFaixa],\n );\n\n const [minimo, maximo] = useTweenedNumbers(escalaAlvo.domain());\n\n const escalaValores = useMemo(\n () =>\n linearScale({\n domain: { min: minimo, max: maximo },\n nice: false,\n range: [inicioDaFaixa, fimDaFaixa],\n }),\n [fimDaFaixa, inicioDaFaixa, maximo, minimo],\n );\n\n const marcasDeValor = ticksFor(escalaAlvo, comprimentoValores);\n\n const vao = escalaCategorias.bandwidth();\n const faixas = barSlots(vao, presencas);\n\n // Empilhada, a serie ocupa a faixa inteira: quem reparte e a pilha, nao a faixa.\n function faixaDa(indiceSerie: number) {\n return faixas[indiceSerie] ?? NO_BAR_SLOT;\n }\n\n function espessuraDa(indiceSerie: number) {\n return stacked ? vao : faixaDa(indiceSerie).thickness;\n }\n\n function deslocamentoDa(indiceSerie: number) {\n return stacked ? 0 : faixaDa(indiceSerie).offset;\n }\n\n /** Valor que a serie empilha, ja pesado pela presenca, para a pilha encolher junto; invalido conta zero. */\n function contribuicao(indiceSerie: number, indiceCategoria: number) {\n const valor = series[indiceSerie].values[indiceCategoria];\n const real = Number.isFinite(valor) ? (valor as number) : 0;\n\n return real * (stacked ? presenca(indiceSerie) : 1);\n }\n\n const pilhas = categories.map((_, indiceCategoria) =>\n stacked ? stackDiverging(series.map((_, indiceSerie) => contribuicao(indiceSerie, indiceCategoria))) : [],\n );\n\n function segmentoDa(indiceSerie: number, indiceCategoria: number): [number, number] {\n return pilhas[indiceCategoria][indiceSerie] ?? [0, contribuicao(indiceSerie, indiceCategoria)];\n }\n\n /**\n * Cantos de um segmento. Empilhado, so as pontas de cada pilha, a de cima do zero e a de baixo,\n * sao arredondadas e o meio fica reto, para os segmentos lerem como uma barra so.\n */\n function cantosDa(indiceSerie: number, indiceCategoria: number): CornerRadii {\n const [inicio, fim] = segmentoDa(indiceSerie, indiceCategoria);\n\n if (!stacked) {\n return [raioDoCanto, raioDoCanto, raioDoCanto, raioDoCanto];\n }\n\n const pilha = pilhas[indiceCategoria];\n const extremo = fim < inicio ? Math.min(...pilha.map(([, ate]) => ate)) : Math.max(...pilha.map(([, ate]) => ate));\n const abre = fim !== inicio && inicio === 0 ? raioDoCanto : 0;\n const fecha = fim !== inicio && fim === extremo ? raioDoCanto : 0;\n // Na tela, o lado de maior valor fica em cima na vertical e a direita na horizontal.\n const [menor, maior] = fim < inicio ? [fecha, abre] : [abre, fecha];\n\n return vertical ? [maior, maior, menor, menor] : [menor, maior, maior, menor];\n }\n\n /** Rotulo alem da ponta da barra: no negativo ela esta embaixo, ou a esquerda. */\n function rotuloAlemDaPonta(valor: number, ponta: number, centro: number, chave: number) {\n const negativo = valor < 0;\n\n return (\n <text\n className={styles.valueLabel}\n dominantBaseline={vertical ? (negativo ? 'hanging' : 'auto') : 'middle'}\n key={chave}\n textAnchor={vertical ? 'middle' : negativo ? 'end' : 'start'}\n x={vertical ? centro : ponta + (negativo ? -6 : 6)}\n y={vertical ? ponta + (negativo ? 6 : -6) : centro}\n >\n {formatValue(valor)}\n </text>\n );\n }\n\n const marcasCategoria: AxisTick[] = categories.map((categoria) => ({\n label: categoria,\n position: (escalaCategorias(categoria) ?? 0) + vao / 2,\n }));\n\n const marcasValor: AxisTick[] = marcasDeValor.map((valor) => ({\n label: formatValue(valor),\n position: escalaValores(valor),\n }));\n\n const eixoDeCategoria = { labelRotation: rotation, ticks: marcasCategoria };\n const eixoDeValor = { hideLine: true, ticks: marcasValor };\n\n return (\n <CartesianFrame\n containerRef={ref}\n empty={series.length === 0 || categories.length === 0}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n grid={[\n {\n baseline: escalaValores(0),\n lines: marcasDeValor.map((valor) => escalaValores(valor)),\n orientation: vertical ? 'horizontal' : 'vertical',\n },\n ]}\n height={alturaDoDesenho}\n legend={series.map((serie, indice) => ({\n color: cores[indice],\n hidden: isHidden(serie.label),\n label: serie.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={posicaoDaLegenda}\n margins={margins}\n onToggleSeries={toggle}\n plot={plot}\n title={title}\n width={width}\n xAxis={{ ...(vertical ? eixoDeCategoria : eixoDeValor), visibility: xAxis }}\n yAxis={{ ...(vertical ? eixoDeValor : eixoDeCategoria), visibility: yAxis }}\n yAxisRight={{ ...(vertical ? eixoDeValor : eixoDeCategoria), hideLine: true, visibility: yAxisRight }}\n >\n {faixaEmFoco !== null && (\n <BandCursor\n offset={escalaCategorias(categories[faixaEmFoco]) ?? 0}\n orientation={orientation}\n plot={plot}\n size={vao}\n />\n )}\n\n {series.map((serie, indiceSerie) => {\n const oculta = isHidden(serie.label);\n\n return (\n <g\n aria-hidden={oculta || undefined}\n className={`${styles.series} ${oculta ? styles.seriesOff : ''}`}\n key={indiceSerie}\n >\n {categories.map((categoria, indiceCategoria) => {\n if (!Number.isFinite(serie.values[indiceCategoria])) {\n return null;\n }\n\n const inicioCategoria = escalaCategorias(categoria) ?? 0;\n const [de, ate] = segmentoDa(indiceSerie, indiceCategoria);\n const comeco = escalaValores(de);\n const fim = escalaValores(ate);\n const tamanho = Math.abs(fim - comeco);\n const espessura = espessuraDa(indiceSerie);\n const deslocamento = deslocamentoDa(indiceSerie);\n\n return (\n <path\n aria-label={`${serie.label}, ${categoria}: ${formatValue(serie.values[indiceCategoria])}`}\n className={styles.bar}\n d={roundedBarPath(\n vertical ? inicioCategoria + deslocamento : Math.min(comeco, fim),\n vertical ? Math.min(comeco, fim) : inicioCategoria + deslocamento,\n vertical ? espessura : tamanho,\n vertical ? tamanho : espessura,\n cantosDa(indiceSerie, indiceCategoria),\n )}\n fill={cores[indiceSerie]}\n key={indiceCategoria}\n onMouseEnter={() => focarFaixa(indiceCategoria)}\n onMouseLeave={() => focarFaixa(null)}\n />\n );\n })}\n\n {showDataLabels &&\n !stacked &&\n categories.map((categoria, indiceCategoria) => {\n const valor = serie.values[indiceCategoria];\n\n if (!Number.isFinite(valor)) {\n return null;\n }\n\n const centro =\n (escalaCategorias(categoria) ?? 0) + deslocamentoDa(indiceSerie) + espessuraDa(indiceSerie) / 2;\n\n return rotuloAlemDaPonta(valor, escalaValores(valor), centro, indiceCategoria);\n })}\n </g>\n );\n })}\n\n {showDataLabels &&\n stacked &&\n categories.map((categoria, indiceCategoria) => {\n const presentes = series.filter(\n (serie) => !isHidden(serie.label) && Number.isFinite(serie.values[indiceCategoria]),\n );\n\n if (presentes.length === 0) {\n return null;\n }\n\n const total = presentes.reduce((soma, serie) => soma + serie.values[indiceCategoria], 0);\n const pontas = pilhas[indiceCategoria].map(([, ate]) => ate);\n const extremo = total < 0 ? Math.min(0, ...pontas) : Math.max(0, ...pontas);\n const centro = (escalaCategorias(categoria) ?? 0) + vao / 2;\n\n return rotuloAlemDaPonta(total, escalaValores(extremo), centro, indiceCategoria);\n })}\n </CartesianFrame>\n );\n}\n","import { useMemo } from 'react';\nimport {\n CartesianFrame,\n cartesianLayout,\n chartHeight,\n linePath,\n useChartMetrics,\n useSeriesToggle,\n useTweenedNumbers,\n valueLabelRoom,\n valueLabelsFor,\n type AxisLabelAngle,\n type AxisTick,\n type AxisVisibility,\n type ChartCurve,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n type ChartPoint,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { domainOf, linearScale, mergeDomains, pointScale, ticksFor } from '../scales';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartLine.module.css';\n/**\n * Ponto sem vizinho desenhado. A curva entre ele e o nada nao tem tracado, e o\n * marcador so no hover deixaria o dado invisivel — entao ele aparece sempre.\n */\nfunction isolado(pontos: readonly (ChartPoint | null)[], indice: number) {\n return pontos[indice] !== null && !pontos[indice - 1] && !pontos[indice + 1];\n}\n\n\nexport interface ChartLineSeries extends SeriesAppearance {\n label: string;\n values: readonly (number | null)[];\n}\n\nexport interface ChartLineProps {\n accent?: string;\n categories: readonly string[];\n curve?: ChartCurve;\n defaultHiddenSeries?: readonly string[];\n emptyMessage?: string;\n formatValue?: (value: number) => string;\n /**\n * Inclui o zero no dominio do eixo de valor. Ligado por padrao, porque marca\n * que nao parte do zero exagera a diferenca; para medidas que nao se comparam\n * a ele — um ano, uma temperatura — desligue; um ano pede tambem um formato sem separador de milhar em `formatValue`.\n */\n includeZero?: boolean;\n height?: ChartHeight;\n hiddenSeries?: readonly string[];\n labelAngle?: AxisLabelAngle;\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n onHiddenSeriesChange?: (hidden: readonly string[]) => void;\n series: readonly ChartLineSeries[];\n showDataLabels?: boolean;\n showDots?: boolean;\n title: string;\n xAxis?: AxisVisibility;\n yAxis?: AxisVisibility;\n yAxisRight?: AxisVisibility;\n}\n\nexport function ChartLine({\n accent,\n categories,\n curve = 'smooth',\n defaultHiddenSeries,\n emptyMessage = 'Sem dados no período',\n formatValue = formatarNumero,\n height = 260,\n includeZero = true,\n hiddenSeries,\n labelAngle = 'auto',\n legend = 'bottom',\n legendAlign,\n onHiddenSeriesChange,\n series,\n showDataLabels = false,\n showDots = false,\n title,\n xAxis = 'visible',\n yAxis = 'visible',\n yAxisRight = 'hidden',\n}: ChartLineProps) {\n const { font, height: alturaMedida, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({ defaultHiddenSeries, hiddenSeries, onHiddenSeriesChange });\n\n // A cor sai da lista inteira, e nao das visiveis: desligar uma serie nao pode\n // repintar as demais.\n const cores = useMemo(() => resolveSeriesColors(series, { accent }), [accent, series]);\n\n const dominio = useMemo(\n () =>\n mergeDomains(\n series\n .filter((serie) => !isHidden(serie.label))\n .map((serie) => domainOf(serie.values.filter((valor) => valor !== null), { includeZero })),\n ),\n [includeZero, isHidden, series],\n );\n\n const rotulosDeValor = valueLabelsFor(dominio, alturaDoDesenho, formatValue);\n\n const { margins, plot, rotation } = cartesianLayout({\n bottomLabels: categories,\n font,\n height: alturaDoDesenho,\n labelAngle,\n leftLabels: rotulosDeValor,\n rightLabels: rotulosDeValor,\n topRoom: showDataLabels ? valueLabelRoom(font) : 0,\n width,\n xAxis,\n yAxis,\n yAxisRight,\n });\n\n const escalaCategorias = useMemo(\n () => pointScale({ domain: categories, padding: 0, range: [0, plot.width] }),\n [categories, plot.width],\n );\n\n // A escala alvo fixa as marcas; a animada posiciona o desenho. Sem separar as\n // duas, as marcas exibiriam valores quebrados durante a transicao.\n const escalaAlvo = useMemo(\n () => linearScale({ domain: dominio, range: [plot.height, 0] }),\n [dominio, plot.height],\n );\n\n const [minimo, maximo] = useTweenedNumbers(escalaAlvo.domain());\n\n const escalaValores = useMemo(\n () => linearScale({ domain: { min: minimo, max: maximo }, nice: false, range: [plot.height, 0] }),\n [maximo, minimo, plot.height],\n );\n\n const marcasDeValor = ticksFor(escalaAlvo, plot.height);\n\n const pontosPorSerie = series.map((serie) =>\n categories.map<ChartPoint | null>((categoria, indice) => {\n const valor = serie.values[indice];\n\n if (valor === null || valor === undefined || !Number.isFinite(valor)) {\n return null;\n }\n\n return { x: escalaCategorias(categoria) ?? 0, y: escalaValores(valor) };\n }),\n );\n\n const marcasCategoria: AxisTick[] = categories.map((categoria) => ({\n label: categoria,\n position: escalaCategorias(categoria) ?? 0,\n }));\n\n const marcasValor: AxisTick[] = marcasDeValor.map((valor) => ({\n label: formatValue(valor),\n position: escalaValores(valor),\n }));\n\n return (\n <CartesianFrame\n containerRef={ref}\n empty={series.length === 0 || categories.length === 0}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n grid={[\n {\n baseline: escalaValores(0),\n lines: marcasDeValor.map((valor) => escalaValores(valor)),\n orientation: 'horizontal',\n },\n ]}\n height={alturaDoDesenho}\n legend={series.map((serie, indice) => ({\n color: cores[indice],\n hidden: isHidden(serie.label),\n label: serie.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n margins={margins}\n onToggleSeries={toggle}\n plot={plot}\n title={title}\n width={width}\n xAxis={{ labelRotation: rotation, ticks: marcasCategoria, visibility: xAxis }}\n yAxis={{ hideLine: true, ticks: marcasValor, visibility: yAxis }}\n yAxisRight={{ hideLine: true, ticks: marcasValor, visibility: yAxisRight }}\n >\n {series.map((serie, indiceSerie) => {\n const oculta = isHidden(serie.label);\n\n return (\n <g\n aria-hidden={oculta || undefined}\n className={`${styles.series} ${oculta ? styles.seriesOff : ''}`}\n key={indiceSerie}\n >\n <path\n className={styles.line}\n d={linePath(pontosPorSerie[indiceSerie], curve)}\n fill=\"none\"\n stroke={cores[indiceSerie]}\n />\n\n {pontosPorSerie[indiceSerie].map((ponto, indice) => {\n if (ponto === null) {\n return null;\n }\n\n const descricao = `${serie.label}, ${categories[indice]}: ${formatValue(serie.values[indice] ?? 0)}`;\n\n return (\n <circle\n aria-label={descricao}\n className={\n showDots || isolado(pontosPorSerie[indiceSerie], indice)\n ? styles.dotVisible\n : styles.dot\n }\n cx={ponto.x}\n cy={ponto.y}\n fill={cores[indiceSerie]}\n key={indice}\n r={4}\n >\n <title>{descricao}</title>\n </circle>\n );\n })}\n\n {showDataLabels &&\n pontosPorSerie[indiceSerie].map((ponto, indice) =>\n ponto === null ? null : (\n <text\n className={styles.valueLabel}\n key={indice}\n textAnchor=\"middle\"\n x={ponto.x}\n y={ponto.y - 10}\n >\n {formatValue(serie.values[indice] ?? 0)}\n </text>\n ),\n )}\n </g>\n );\n })}\n </CartesianFrame>\n );\n}\n","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","import { useMemo } from 'react';\nimport {\n BandCursor,\n CartesianFrame,\n NO_BAR_SLOT,\n barSlots,\n cartesianLayout,\n chartHeight,\n linePath,\n roundedBarPath,\n useChartMetrics,\n useHoveredBand,\n useSeriesToggle,\n useTweenedNumbers,\n valueLabelRoom,\n valueLabelsFor,\n type AxisLabelAngle,\n type AxisTick,\n type AxisVisibility,\n type ChartCurve,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n type ChartPoint,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { alignZeros, bandScale, domainOf, linearScale, mergeDomains, ticksFor, type NumericRange } from '../scales';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartCombo.module.css';\n/**\n * Ponto sem vizinho desenhado. A curva entre ele e o nada nao tem tracado, e o\n * marcador so no hover deixaria o dado invisivel — entao ele aparece sempre.\n */\nfunction isolado(pontos: readonly (ChartPoint | null)[], indice: number) {\n return pontos[indice] !== null && !pontos[indice - 1] && !pontos[indice + 1];\n}\n\n\nexport type ChartComboKind = 'bar' | 'line';\n\n/**\n * Eixo de valor a que a serie pertence. A escolha e sempre do produto: o\n * grafico nunca parte a escala por conta propria.\n */\nexport type ChartComboAxis = 'left' | 'right';\n\nexport interface ChartComboSeries extends SeriesAppearance {\n axis?: ChartComboAxis;\n kind: ChartComboKind;\n label: string;\n values: readonly (number | null)[];\n}\n\nexport interface ChartComboProps {\n accent?: string;\n categories: readonly string[];\n curve?: ChartCurve;\n defaultHiddenSeries?: readonly string[];\n emptyMessage?: string;\n formatRightValue?: (value: number) => string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenSeries?: readonly string[];\n labelAngle?: AxisLabelAngle;\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n onHiddenSeriesChange?: (hidden: readonly string[]) => void;\n /** Indice da categoria sob o ponteiro, ou `null` ao sair dela. */\n onHoverCategory?: (index: number | null) => void;\n series: readonly ChartComboSeries[];\n showDataLabels?: boolean;\n showDots?: boolean;\n title: string;\n xAxis?: AxisVisibility;\n yAxis?: AxisVisibility;\n yAxisRight?: AxisVisibility;\n}\n\nfunction eixoDa(serie: ChartComboSeries): ChartComboAxis {\n return serie.axis ?? 'left';\n}\n\n/** Dominio de um eixo: so as series visiveis que pertencem a ele. */\nfunction dominioDoEixo(\n series: readonly ChartComboSeries[],\n axis: ChartComboAxis,\n oculta: (label: string) => boolean,\n) {\n return mergeDomains(\n series\n .filter((serie) => eixoDa(serie) === axis && !oculta(serie.label))\n .map((serie) => domainOf(serie.values.filter((valor) => valor !== null))),\n );\n}\n\n/** Dominio com os limites arredondados que o eixo mostraria sozinho. */\nfunction arredondado(dominio: NumericRange): NumericRange {\n const [min = 0, max = 0] = linearScale({ domain: dominio, range: [0, 1] }).domain();\n\n return { max, min };\n}\n\n/**\n * Barras e linhas sobre o mesmo eixo de categorias. Uma serie declara a que\n * eixo de valor pertence; sem nenhuma a direita, o dominio e unico e o eixo\n * direito espelha o esquerdo.\n */\nexport function ChartCombo({\n accent,\n categories,\n curve = 'smooth',\n defaultHiddenSeries,\n emptyMessage = 'Sem dados no período',\n formatRightValue,\n formatValue = formatarNumero,\n height = 260,\n hiddenSeries,\n labelAngle = 'auto',\n legend = 'bottom',\n legendAlign,\n onHiddenSeriesChange,\n onHoverCategory,\n series,\n showDataLabels = false,\n showDots = false,\n title,\n xAxis = 'visible',\n yAxis = 'visible',\n yAxisRight,\n}: ChartComboProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({ defaultHiddenSeries, hiddenSeries, onHiddenSeriesChange });\n const { hover: focarFaixa, hovered: faixaEmFoco } = useHoveredBand(onHoverCategory);\n\n const formatarDireita = formatRightValue ?? formatValue;\n const temEixoDireito = series.some((serie) => eixoDa(serie) === 'right');\n\n // A cor sai da lista inteira, e nao das visiveis: desligar uma serie nao pode\n // repintar as demais.\n const cores = useMemo(() => resolveSeriesColors(series, { accent }), [accent, series]);\n\n // Presenca de cada serie, entre zero e um. E ela que reparte a faixa, entao a\n // barra desligada encolhe enquanto as demais ocupam o lugar dela.\n const presencas = useTweenedNumbers(series.map((serie) => (isHidden(serie.label) ? 0 : 1)));\n\n // Com serie a direita, o zero fica na mesma altura nos dois eixos: as barras crescem da mesma base.\n const [dominioEsquerda, dominioDireita] = useMemo(() => {\n const esquerda = arredondado(dominioDoEixo(series, 'left', isHidden));\n\n return temEixoDireito\n ? alignZeros(esquerda, arredondado(dominioDoEixo(series, 'right', isHidden)))\n : [esquerda, esquerda];\n }, [isHidden, series, temEixoDireito]);\n\n // Uma segunda escala sem eixo para le-la e o duplo eixo que engana. Havendo\n // serie a direita, o eixo aparece sem ninguem pedir.\n const visibilidadeDireita = yAxisRight ?? (temEixoDireito ? 'visible' : 'hidden');\n\n const { margins, plot, rotation } = cartesianLayout({\n bottomLabels: categories,\n font,\n height: alturaDoDesenho,\n labelAngle,\n leftLabels: valueLabelsFor(dominioEsquerda, alturaDoDesenho, formatValue),\n rightLabels: valueLabelsFor(dominioDireita, alturaDoDesenho, formatarDireita),\n topRoom: showDataLabels ? valueLabelRoom(font) : 0,\n width,\n xAxis,\n yAxis,\n yAxisRight: visibilidadeDireita,\n });\n\n // Barras e linhas compartilham a escala de faixas: a linha passa pelo centro\n // da faixa, que e onde a marca do eixo de categoria tambem fica.\n const escalaCategorias = useMemo(\n () => bandScale({ domain: categories, range: [0, plot.width] }),\n [categories, plot.width],\n );\n\n // A escala alvo fixa as marcas; a animada posiciona o desenho. Sem separar as\n // duas, as marcas exibiriam valores quebrados durante a transicao.\n const alvoEsquerda = useMemo(\n () => linearScale({ domain: dominioEsquerda, nice: false, range: [plot.height, 0] }),\n [dominioEsquerda, plot.height],\n );\n\n const alvoDireita = useMemo(\n () => linearScale({ domain: dominioDireita, nice: false, range: [plot.height, 0] }),\n [dominioDireita, plot.height],\n );\n\n // Os dois dominios caminham numa animacao so, e por isso chegam juntos.\n const [minEsquerda, maxEsquerda, minDireita, maxDireita] = useTweenedNumbers([\n ...alvoEsquerda.domain(),\n ...alvoDireita.domain(),\n ]);\n\n const escalaEsquerda = useMemo(\n () =>\n linearScale({ domain: { min: minEsquerda, max: maxEsquerda }, nice: false, range: [plot.height, 0] }),\n [maxEsquerda, minEsquerda, plot.height],\n );\n\n const escalaDireita = useMemo(\n () => linearScale({ domain: { min: minDireita, max: maxDireita }, nice: false, range: [plot.height, 0] }),\n [maxDireita, minDireita, plot.height],\n );\n\n const escalaDa = (serie: ChartComboSeries) =>\n eixoDa(serie) === 'right' ? escalaDireita : escalaEsquerda;\n const formatoDa = (serie: ChartComboSeries) =>\n eixoDa(serie) === 'right' ? formatarDireita : formatValue;\n\n const marcasEsquerda = ticksFor(alvoEsquerda, plot.height);\n const marcasDireita = ticksFor(alvoDireita, plot.height);\n\n const vao = escalaCategorias.bandwidth();\n\n // So as barras repartem a faixa: a linha passa pelo centro dela, e por isso\n // entra na conta com presenca zero.\n const faixas = barSlots(\n vao,\n series.map((serie, indice) => (serie.kind === 'bar' ? presencas[indice] ?? 0 : 0)),\n );\n const faixaDa = (indice: number) => faixas[indice] ?? NO_BAR_SLOT;\n\n const marcasCategoria: AxisTick[] = categories.map((categoria) => ({\n label: categoria,\n position: (escalaCategorias(categoria) ?? 0) + vao / 2,\n }));\n\n const marcasDeValor = (\n valores: readonly number[],\n escala: (valor: number) => number,\n formatar: (valor: number) => string,\n ): AxisTick[] => valores.map((valor) => ({ label: formatar(valor), position: escala(valor) }));\n\n return (\n <CartesianFrame\n containerRef={ref}\n empty={series.length === 0 || categories.length === 0}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n grid={[\n {\n baseline: escalaEsquerda(0),\n lines: marcasEsquerda.map((valor) => escalaEsquerda(valor)),\n orientation: 'horizontal',\n },\n ]}\n height={alturaDoDesenho}\n legend={series.map((serie, indice) => ({\n color: cores[indice],\n hidden: isHidden(serie.label),\n label: serie.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n margins={margins}\n onToggleSeries={toggle}\n plot={plot}\n title={title}\n width={width}\n xAxis={{ labelRotation: rotation, ticks: marcasCategoria, visibility: xAxis }}\n yAxis={{\n hideLine: true,\n ticks: marcasDeValor(marcasEsquerda, escalaEsquerda, formatValue),\n visibility: yAxis,\n }}\n yAxisRight={{\n hideLine: true,\n ticks: marcasDeValor(marcasDireita, escalaDireita, formatarDireita),\n visibility: visibilidadeDireita,\n }}\n >\n {faixaEmFoco !== null && (\n <BandCursor offset={escalaCategorias(categories[faixaEmFoco]) ?? 0} plot={plot} size={vao} />\n )}\n\n {series.map((serie, indiceSerie) => {\n if (serie.kind !== 'bar') {\n return null;\n }\n\n const oculta = isHidden(serie.label);\n const escala = escalaDa(serie);\n const formatar = formatoDa(serie);\n const base = escala(0);\n\n return (\n <g\n aria-hidden={oculta || undefined}\n className={`${styles.series} ${oculta ? styles.seriesOff : ''}`}\n key={indiceSerie}\n >\n {categories.map((categoria, indiceCategoria) => {\n const valor = serie.values[indiceCategoria];\n\n if (valor === null || valor === undefined || !Number.isFinite(valor)) {\n return null;\n }\n\n const ponta = escala(valor);\n\n return (\n <path\n aria-label={`${serie.label}, ${categoria}: ${formatar(valor)}`}\n className={styles.bar}\n d={roundedBarPath(\n (escalaCategorias(categoria) ?? 0) + faixaDa(indiceSerie).offset,\n Math.min(base, ponta),\n faixaDa(indiceSerie).thickness,\n Math.abs(ponta - base),\n [raioDoCanto, raioDoCanto, raioDoCanto, raioDoCanto],\n )}\n fill={cores[indiceSerie]}\n key={indiceCategoria}\n onMouseEnter={() => focarFaixa(indiceCategoria)}\n onMouseLeave={() => focarFaixa(null)}\n />\n );\n })}\n\n {showDataLabels &&\n categories.map((categoria, indiceCategoria) => {\n const valor = serie.values[indiceCategoria];\n\n if (valor === null || valor === undefined || !Number.isFinite(valor)) {\n return null;\n }\n\n return (\n <text\n className={styles.valueLabel}\n key={indiceCategoria}\n textAnchor=\"middle\"\n x={\n (escalaCategorias(categoria) ?? 0) +\n faixaDa(indiceSerie).offset +\n faixaDa(indiceSerie).thickness / 2\n }\n y={escala(valor) - 6}\n >\n {formatar(valor)}\n </text>\n );\n })}\n </g>\n );\n })}\n\n {series.map((serie, indiceSerie) => {\n if (serie.kind !== 'line') {\n return null;\n }\n\n const oculta = isHidden(serie.label);\n const escala = escalaDa(serie);\n const formatar = formatoDa(serie);\n const pontos = categories.map<ChartPoint | null>((categoria, indice) => {\n const valor = serie.values[indice];\n\n if (valor === null || valor === undefined || !Number.isFinite(valor)) {\n return null;\n }\n\n return { x: (escalaCategorias(categoria) ?? 0) + vao / 2, y: escala(valor) };\n });\n\n return (\n <g\n aria-hidden={oculta || undefined}\n className={`${styles.series} ${oculta ? styles.seriesOff : ''}`}\n key={indiceSerie}\n >\n <path\n className={styles.line}\n d={linePath(pontos, curve)}\n fill=\"none\"\n stroke={cores[indiceSerie]}\n />\n\n {pontos.map((ponto, indice) =>\n ponto === null ? null : (\n <circle\n aria-label={`${serie.label}, ${categories[indice]}: ${formatar(serie.values[indice] ?? 0)}`}\n className={showDots || isolado(pontos, indice) ? styles.dotVisible : styles.dot}\n cx={ponto.x}\n cy={ponto.y}\n fill={cores[indiceSerie]}\n key={indice}\n r={4}\n />\n ),\n )}\n\n {showDataLabels &&\n pontos.map((ponto, indice) =>\n ponto === null ? null : (\n <text\n className={styles.valueLabel}\n key={indice}\n textAnchor=\"middle\"\n x={ponto.x}\n y={ponto.y - 10}\n >\n {formatar(serie.values[indice] ?? 0)}\n </text>\n ),\n )}\n </g>\n );\n })}\n </CartesianFrame>\n );\n}\n","import { useId, useMemo } from 'react';\nimport {\n CartesianFrame,\n areaPath,\n cartesianLayout,\n chartHeight,\n linePath,\n useChartMetrics,\n useSeriesToggle,\n useTweenedNumbers,\n valueLabelRoom,\n valueLabelsFor,\n type AxisLabelAngle,\n type AxisTick,\n type AxisVisibility,\n type ChartBand,\n type ChartCurve,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n type ChartPoint,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { domainOf, linearScale, mergeDomains, pointScale, stackDiverging, ticksFor } from '../scales';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartArea.module.css';\n/**\n * Faixa sem vizinha desenhada. O contorno entre ela e o nada nao tem tracado, e\n * o marcador so no hover deixaria o dado invisivel.\n */\nfunction isolada(faixas: readonly (ChartBand | null)[], indice: number) {\n return faixas[indice] !== null && !faixas[indice - 1] && !faixas[indice + 1];\n}\n\n/** Altura do zero dentro da area da serie, de 0 no topo a 1 na base. O degrade clareia rumo a ele pelos dois lados. */\nfunction alturaDoZero(faixas: readonly (ChartBand | null)[], base: number) {\n const pontas = faixas.flatMap((faixa) => (faixa === null ? [] : [faixa.y1]));\n const topo = Math.min(base, ...pontas);\n const fundo = Math.max(base, ...pontas);\n\n return fundo > topo ? (base - topo) / (fundo - topo) : 1;\n}\n\nexport interface ChartAreaSeries extends SeriesAppearance {\n label: string;\n values: readonly (number | null)[];\n}\n\nexport interface ChartAreaProps {\n accent?: string;\n categories: readonly string[];\n curve?: ChartCurve;\n defaultHiddenSeries?: readonly string[];\n emptyMessage?: string;\n formatValue?: (value: number) => string;\n /**\n * Inclui o zero no dominio do eixo de valor. Ligado por padrao, porque marca\n * que nao parte do zero exagera a diferenca; para medidas que nao se comparam\n * a ele — um ano, uma temperatura — desligue; um ano pede tambem um formato sem separador de milhar em `formatValue`.\n */\n includeZero?: boolean;\n height?: ChartHeight;\n hiddenSeries?: readonly string[];\n labelAngle?: AxisLabelAngle;\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n onHiddenSeriesChange?: (hidden: readonly string[]) => void;\n series: readonly ChartAreaSeries[];\n showDataLabels?: boolean;\n showDots?: boolean;\n stacked?: boolean;\n title: string;\n xAxis?: AxisVisibility;\n yAxis?: AxisVisibility;\n yAxisRight?: AxisVisibility;\n}\n\n\nexport function ChartArea({\n accent,\n categories,\n curve = 'smooth',\n defaultHiddenSeries,\n emptyMessage = 'Sem dados no período',\n formatValue = formatarNumero,\n height = 260,\n includeZero = true,\n hiddenSeries,\n labelAngle = 'auto',\n legend = 'bottom',\n legendAlign,\n onHiddenSeriesChange,\n series,\n showDataLabels = false,\n showDots = false,\n stacked = false,\n title,\n xAxis = 'visible',\n yAxis = 'visible',\n yAxisRight = 'hidden',\n}: ChartAreaProps) {\n const gradienteId = useId();\n const { font, height: alturaMedida, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({ defaultHiddenSeries, hiddenSeries, onHiddenSeriesChange });\n\n // A cor sai da lista inteira, e nao das visiveis: desligar uma serie nao pode\n // repintar as demais.\n const cores = useMemo(() => resolveSeriesColors(series, { accent }), [accent, series]);\n\n // Presenca de cada serie, entre zero e um. Empilhadas, ela pesa a\n // contribuicao, entao a faixa desligada encolhe e a pilha acompanha.\n const presencas = useTweenedNumbers(series.map((serie) => (isHidden(serie.label) ? 0 : 1)));\n const presenca = (indice: number) => presencas[indice] ?? 0;\n\n const dominio = useMemo(() => {\n const visivel = (ordem: number) => (isHidden(series[ordem].label) ? 0 : 1);\n\n if (stacked) {\n return domainOf(\n categories.flatMap((_, indice) =>\n stackDiverging(series.map((serie, ordem) => (serie.values[indice] ?? 0) * visivel(ordem))).flat(),\n ),\n );\n }\n\n return mergeDomains(\n series\n .filter((serie) => !isHidden(serie.label))\n .map((serie) => domainOf(serie.values.filter((valor) => valor !== null), { includeZero })),\n );\n }, [categories, includeZero, isHidden, series, stacked]);\n\n const rotulosDeValor = valueLabelsFor(dominio, alturaDoDesenho, formatValue);\n\n const { margins, plot, rotation } = cartesianLayout({\n bottomLabels: categories,\n font,\n height: alturaDoDesenho,\n labelAngle,\n leftLabels: rotulosDeValor,\n rightLabels: rotulosDeValor,\n topRoom: showDataLabels ? valueLabelRoom(font) : 0,\n width,\n xAxis,\n yAxis,\n yAxisRight,\n });\n\n const escalaCategorias = useMemo(\n () => pointScale({ domain: categories, padding: 0, range: [0, plot.width] }),\n [categories, plot.width],\n );\n\n // A escala alvo fixa as marcas; a animada posiciona o desenho. Sem separar as\n // duas, as marcas exibiriam valores quebrados durante a transicao.\n const escalaAlvo = useMemo(\n () => linearScale({ domain: dominio, range: [plot.height, 0] }),\n [dominio, plot.height],\n );\n\n const [minimo, maximo] = useTweenedNumbers(escalaAlvo.domain());\n\n const escalaValores = useMemo(\n () => linearScale({ domain: { min: minimo, max: maximo }, nice: false, range: [plot.height, 0] }),\n [maximo, minimo, plot.height],\n );\n\n const marcasDeValor = ticksFor(escalaAlvo, plot.height);\n // Sem o zero no dominio, a area desce ate o limite do eixo, e nao ate um zero fora do desenho.\n const base = escalaValores(Math.min(Math.max(0, minimo), maximo));\n const pilhas = categories.map((_, indice) =>\n stackDiverging(series.map((serie, ordem) => (serie.values[indice] ?? 0) * presenca(ordem))),\n );\n\n const faixasPorSerie = series.map((serie, indiceSerie) =>\n categories.map<ChartBand | null>((categoria, indice) => {\n const valor = serie.values[indice];\n\n if (valor === null || valor === undefined || !Number.isFinite(valor)) {\n return null;\n }\n\n const [de, ate] = pilhas[indice][indiceSerie];\n\n return {\n x: escalaCategorias(categoria) ?? 0,\n y0: stacked ? escalaValores(de) : base,\n y1: stacked ? escalaValores(ate) : escalaValores(valor),\n };\n }),\n );\n\n const marcasCategoria: AxisTick[] = categories.map((categoria) => ({\n label: categoria,\n position: escalaCategorias(categoria) ?? 0,\n }));\n\n const marcasValor: AxisTick[] = marcasDeValor.map((valor) => ({\n label: formatValue(valor),\n position: escalaValores(valor),\n }));\n\n return (\n <CartesianFrame\n containerRef={ref}\n empty={series.length === 0 || categories.length === 0}\n emptyMessage={emptyMessage}\n grid={[\n {\n baseline: escalaValores(0),\n lines: marcasDeValor.map((valor) => escalaValores(valor)),\n orientation: 'horizontal',\n },\n ]}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={series.map((serie, indice) => ({\n color: cores[indice],\n hidden: isHidden(serie.label),\n label: serie.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n margins={margins}\n onToggleSeries={toggle}\n plot={plot}\n title={title}\n width={width}\n xAxis={{ labelRotation: rotation, ticks: marcasCategoria, visibility: xAxis }}\n yAxis={{ hideLine: true, ticks: marcasValor, visibility: yAxis }}\n yAxisRight={{ hideLine: true, ticks: marcasValor, visibility: yAxisRight }}\n >\n {/* Sem empilhamento as areas se sobrepoem, e um topo opaco esconderia a de\n baixo. O contorno em cor cheia e que marca o limite de cada faixa. */}\n {!stacked && (\n <defs>\n {series.map((serie, indice) => {\n const zero = alturaDoZero(faixasPorSerie[indice], base);\n\n return (\n <linearGradient id={`${gradienteId}-${indice}`} key={indice} x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\">\n {zero > 0 && <stop offset={zero * 0.05} stopColor={cores[indice]} stopOpacity={0.6} />}\n <stop offset={zero} stopColor={cores[indice]} stopOpacity={0.05} />\n {zero < 1 && <stop offset={zero + (1 - zero) * 0.95} stopColor={cores[indice]} stopOpacity={0.6} />}\n </linearGradient>\n );\n })}\n </defs>\n )}\n\n {series.map((serie, indiceSerie) => {\n const faixas = faixasPorSerie[indiceSerie];\n const contorno = faixas.map<ChartPoint | null>((faixa) =>\n faixa === null ? null : { x: faixa.x, y: faixa.y1 },\n );\n\n const oculta = isHidden(serie.label);\n\n return (\n <g\n aria-hidden={oculta || undefined}\n className={`${styles.series} ${oculta ? styles.seriesOff : ''}`}\n key={indiceSerie}\n >\n <path\n d={areaPath(faixas, curve)}\n fill={stacked ? cores[indiceSerie] : `url(#${gradienteId}-${indiceSerie})`}\n />\n <path\n className={styles.outline}\n d={linePath(contorno, curve)}\n fill=\"none\"\n stroke={cores[indiceSerie]}\n />\n\n {categories.map((categoria, indice) => {\n const faixa = faixas[indice];\n\n if (faixa === null) {\n return null;\n }\n\n const descricao = `${serie.label}, ${categoria}: ${formatValue(serie.values[indice] ?? 0)}`;\n\n return (\n <circle\n aria-label={descricao}\n className={showDots || isolada(faixas, indice) ? styles.dotVisible : styles.dot}\n cx={faixa.x}\n cy={faixa.y1}\n fill={cores[indiceSerie]}\n key={indice}\n r={4}\n >\n <title>{descricao}</title>\n </circle>\n );\n })}\n\n {showDataLabels &&\n categories.map((categoria, indice) => {\n const faixa = faixas[indice];\n\n if (faixa === null) {\n return null;\n }\n\n return (\n <text\n className={styles.valueLabel}\n key={indice}\n textAnchor=\"middle\"\n x={faixa.x}\n y={faixa.y1 - 10}\n >\n {formatValue(serie.values[indice] ?? 0)}\n </text>\n );\n })}\n </g>\n );\n })}\n </CartesianFrame>\n );\n}\n","import { useMemo, useState } from 'react';\nimport {\n CartesianFrame,\n cartesianLayout,\n chartHeight,\n useChartMetrics,\n useSeriesToggle,\n useTweenedNumbers,\n valueLabelsFor,\n type AxisTick,\n type AxisVisibility,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { domainOf, linearScale, mergeDomains, radiusScale, ticksFor } from '../scales';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartScatter.module.css';\n\nexport interface ChartScatterPoint {\n label?: string;\n x: number;\n y: number;\n z?: number;\n}\n\nexport interface ChartScatterSeries extends SeriesAppearance {\n label: string;\n points: readonly ChartScatterPoint[];\n}\n\nexport interface ChartScatterProps {\n accent?: string;\n defaultHiddenSeries?: readonly string[];\n emptyMessage?: string;\n formatX?: (value: number) => string;\n formatY?: (value: number) => string;\n formatZ?: (value: number) => string;\n /**\n * Inclui o zero no dominio: `true` nos dois eixos, `'x'` ou `'y'` so naquele, `false` em nenhum.\n * Medida que nao se compara ao zero — um ano, uma temperatura — fica com o eixo dela de fora;\n * um ano pede tambem um formato sem separador de milhar em `formatX` ou `formatY`.\n */\n includeZero?: boolean | 'x' | 'y';\n height?: ChartHeight;\n hiddenSeries?: readonly string[];\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n onHiddenSeriesChange?: (hidden: readonly string[]) => void;\n series: readonly ChartScatterSeries[];\n title: string;\n xAxis?: AxisVisibility;\n yAxis?: AxisVisibility;\n yAxisRight?: AxisVisibility;\n}\n\nconst RAIO_SEM_Z = 5;\nconst FAIXA_DE_RAIO: [number, number] = [4, 18];\n\ninterface Guia {\n x: number;\n y: number;\n}\n\n/** Tamanho invalido tem o destino do ausente: a bolha fica no raio padrao. */\nfunction zValido(ponto: ChartScatterPoint) {\n return ponto.z !== undefined && Number.isFinite(ponto.z) ? ponto.z : undefined;\n}\n\nexport function ChartScatter({\n accent,\n defaultHiddenSeries,\n emptyMessage = 'Sem dados no período',\n formatX = formatarNumero,\n formatY = formatarNumero,\n formatZ = formatarNumero,\n height = 280,\n includeZero = true,\n hiddenSeries,\n legend = 'bottom',\n legendAlign,\n onHiddenSeriesChange,\n series,\n title,\n xAxis = 'visible',\n yAxis = 'visible',\n yAxisRight = 'hidden',\n}: ChartScatterProps) {\n const { font, height: alturaMedida, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({ defaultHiddenSeries, hiddenSeries, onHiddenSeriesChange });\n const [guia, setGuia] = useState<Guia | null>(null);\n\n // A cor sai da lista inteira, e nao das visiveis: desligar uma serie nao pode\n // repintar as demais.\n const cores = useMemo(() => resolveSeriesColors(series, { accent }), [accent, series]);\n\n const visiveis = useMemo(() => series.filter((serie) => !isHidden(serie.label)), [isHidden, series]);\n\n const zeroEmX = includeZero === true || includeZero === 'x';\n const zeroEmY = includeZero === true || includeZero === 'y';\n\n const dominioX = useMemo(\n () =>\n mergeDomains(visiveis.map((serie) => domainOf(serie.points.map((p) => p.x), { includeZero: zeroEmX }))),\n [visiveis, zeroEmX],\n );\n\n const dominioY = useMemo(\n () =>\n mergeDomains(visiveis.map((serie) => domainOf(serie.points.map((p) => p.y), { includeZero: zeroEmY }))),\n [visiveis, zeroEmY],\n );\n\n const maiorZ = useMemo(\n () =>\n series.reduce(\n (maior, serie) => serie.points.reduce((parcial, ponto) => Math.max(parcial, zValido(ponto) ?? 0), maior),\n 0,\n ),\n [series],\n );\n\n const rotulosY = valueLabelsFor(dominioY, alturaDoDesenho, formatY);\n const rotulosX = valueLabelsFor(dominioX, width, formatX);\n\n const { margins, plot, rotation } = cartesianLayout({\n bottomLabels: rotulosX,\n font,\n height: alturaDoDesenho,\n labelAngle: 'auto',\n leftLabels: rotulosY,\n rightLabels: rotulosY,\n topRoom: 0,\n width,\n xAxis,\n yAxis,\n yAxisRight,\n });\n\n // As escalas alvo fixam as marcas; as animadas posicionam o desenho. Sem\n // separar as duas, as marcas exibiriam valores quebrados durante a transicao.\n const alvoX = useMemo(() => linearScale({ domain: dominioX, range: [0, plot.width] }), [dominioX, plot.width]);\n const alvoY = useMemo(() => linearScale({ domain: dominioY, range: [plot.height, 0] }), [dominioY, plot.height]);\n\n const [minX, maxX, minY, maxY] = useTweenedNumbers([...alvoX.domain(), ...alvoY.domain()]);\n\n const escalaX = useMemo(\n () => linearScale({ domain: { min: minX, max: maxX }, nice: false, range: [0, plot.width] }),\n [maxX, minX, plot.width],\n );\n const escalaY = useMemo(\n () => linearScale({ domain: { min: minY, max: maxY }, nice: false, range: [plot.height, 0] }),\n [maxY, minY, plot.height],\n );\n const escalaRaio = useMemo(() => radiusScale(maiorZ, FAIXA_DE_RAIO), [maiorZ]);\n\n const marcasX = ticksFor(alvoX, plot.width);\n const marcasY = ticksFor(alvoY, plot.height);\n\n const ticksX: AxisTick[] = marcasX.map((valor) => ({ label: formatX(valor), position: escalaX(valor) }));\n const ticksY: AxisTick[] = marcasY.map((valor) => ({ label: formatY(valor), position: escalaY(valor) }));\n\n function descrever(serie: ChartScatterSeries, ponto: ChartScatterPoint) {\n const inicio = ponto.label ? `${serie.label}, ${ponto.label}` : serie.label;\n const posicao = `${formatX(ponto.x)} × ${formatY(ponto.y)}`;\n const z = zValido(ponto);\n\n return z === undefined ? `${inicio}: ${posicao}` : `${inicio}: ${posicao} (${formatZ(z)})`;\n }\n\n return (\n <CartesianFrame\n containerRef={ref}\n empty={series.every((serie) => serie.points.length === 0)}\n emptyMessage={emptyMessage}\n grid={[\n { lines: marcasY.map((valor) => escalaY(valor)), orientation: 'horizontal' },\n { lines: marcasX.map((valor) => escalaX(valor)), orientation: 'vertical' },\n ]}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={series.map((serie, indice) => ({\n color: cores[indice],\n hidden: isHidden(serie.label),\n label: serie.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n margins={margins}\n onToggleSeries={toggle}\n plot={plot}\n title={title}\n width={width}\n xAxis={{ hideLine: true, labelRotation: rotation, ticks: ticksX, visibility: xAxis }}\n yAxis={{ hideLine: true, ticks: ticksY, visibility: yAxis }}\n yAxisRight={{ hideLine: true, ticks: ticksY, visibility: yAxisRight }}\n >\n {guia && (\n <g aria-hidden=\"true\">\n <line className={styles.guide} x1={guia.x} x2={guia.x} y1={guia.y} y2={plot.height} />\n <line className={styles.guide} x1={0} x2={guia.x} y1={guia.y} y2={guia.y} />\n </g>\n )}\n\n {series.map((serie, indiceSerie) => (\n <g\n aria-hidden={isHidden(serie.label) || undefined}\n className={`${styles.series} ${isHidden(serie.label) ? styles.seriesOff : ''}`}\n key={indiceSerie}\n >\n {serie.points.map((ponto, indice) => {\n if (!Number.isFinite(ponto.x) || !Number.isFinite(ponto.y)) {\n return null;\n }\n\n const x = escalaX(ponto.x);\n const y = escalaY(ponto.y);\n const z = zValido(ponto);\n\n return (\n <circle\n aria-label={descrever(serie, ponto)}\n className={styles.bubble}\n cx={x}\n cy={y}\n fill={cores[indiceSerie]}\n key={indice}\n onMouseEnter={() => setGuia({ x, y })}\n onMouseLeave={() => setGuia(null)}\n r={z === undefined ? RAIO_SEM_Z : escalaRaio(z)}\n >\n <title>{descrever(serie, ponto)}</title>\n </circle>\n );\n })}\n </g>\n ))}\n </CartesianFrame>\n );\n}\n","import {\n ChartFrame,\n arcCentroid,\n arcPath,\n chartHeight,\n measureLabel,\n ringDiameter,\n useChartMetrics,\n useSliceRing,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n type ChartSlice,\n} from '../core';\nimport { textColorOn } from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartPie.module.css';\n\nexport type { ChartSlice as ChartPieSlice };\n\nexport interface ChartPieProps {\n accent?: string;\n defaultHiddenSlices?: readonly string[];\n emptyMessage?: string;\n formatPercent?: (ratio: number) => string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenSlices?: readonly string[];\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n onHiddenSlicesChange?: (hidden: readonly string[]) => void;\n /** Fatia sob o ponteiro, ja agrupada, ou `null` ao sair dela. */\n onHoverSlice?: (slice: ChartSlice | null) => void;\n /** Rotulo da fatia que reune as pequenas. */\n otherLabel?: string;\n showDataLabels?: boolean;\n showLegendValues?: boolean;\n /** Raio dos cantos de cada fatia. Sem valor, o token de raio pequeno. */\n sliceRadius?: number;\n slices: readonly ChartSlice[];\n /** Fracao do total abaixo da qual a fatia entra no agrupamento. */\n smallSliceThreshold?: number;\n title: string;\n}\n\nexport function ChartPie({\n accent,\n defaultHiddenSlices,\n emptyMessage = 'Sem dados no período',\n formatPercent = (fracao) => `${Math.round(fracao * 100)}%`,\n formatValue = formatarNumero,\n height = 260,\n hiddenSlices,\n legend = 'bottom',\n legendAlign,\n onHiddenSlicesChange,\n onHoverSlice,\n otherLabel = 'Outros',\n showDataLabels = false,\n showLegendValues = false,\n sliceRadius,\n slices,\n smallSliceThreshold = 0.02,\n title,\n}: ChartPieProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n\n const anel = useSliceRing({\n accent,\n defaultHiddenSlices,\n hiddenSlices,\n onHiddenSlicesChange,\n onHoverSlice,\n otherLabel,\n slices,\n smallSliceThreshold,\n });\n\n const raio = ringDiameter(width, alturaDoDesenho) / 2;\n const canto = sliceRadius ?? raioDoCanto;\n\n return (\n <ChartFrame\n centerOrigin\n containerRef={ref}\n empty={anel.slices.length === 0 || slices.every((fatia) => !(fatia.value > 0))}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={anel.slices.map((fatia, indice) => ({\n color: anel.colors[indice],\n hidden: anel.isHidden(fatia.label),\n label: fatia.label,\n value: showLegendValues ? formatPercent(anel.ratioOf(indice)) : undefined,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={anel.toggle}\n swatch=\"dot\"\n title={title}\n width={width}\n >\n {anel.slices.map((fatia, indice) => (\n <path\n aria-label={`${fatia.label}: ${formatValue(Math.max(fatia.value, 0))} (${formatPercent(anel.ratioOf(indice))})`}\n className={styles.slice}\n d={arcPath({ ...anel.angles[indice], cornerRadius: canto, innerRadius: 0, outerRadius: raio })}\n fill={anel.colors[indice]}\n key={indice}\n onMouseEnter={() => anel.focus(indice)}\n onMouseLeave={() => anel.focus(null)}\n />\n ))}\n\n {showDataLabels &&\n anel.slices.map((fatia, indice) => {\n const rotulo = formatPercent(anel.ratioOf(indice));\n const [x, y] = arcCentroid({ ...anel.angles[indice], innerRadius: 0, outerRadius: raio });\n const angulo = anel.angles[indice].endAngle - anel.angles[indice].startAngle;\n\n // O rotulo so entra quando a fatia o comporta. Ate meia volta a\n // largura disponivel e a corda no centro do arco; dali em diante a\n // corda volta a encolher, e quem manda e o raio.\n const disponivel =\n angulo >= Math.PI ? raio : 2 * (raio / 2) * Math.sin(angulo / 2);\n\n if (anel.isHidden(fatia.label) || measureLabel(rotulo, font) > disponivel) {\n return null;\n }\n\n return (\n <text\n className={styles.sliceLabel}\n dominantBaseline=\"middle\"\n fill={textColorOn(anel.colors[indice])}\n key={indice}\n textAnchor=\"middle\"\n x={x}\n y={y}\n >\n {rotulo}\n </text>\n );\n })}\n </ChartFrame>\n );\n}\n","import {\n ChartFrame,\n arcPath,\n chartHeight,\n fitCenterText,\n ringDiameter,\n useChartMetrics,\n useSliceRing,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n type ChartSlice,\n} from '../core';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartDonut.module.css';\n\nexport type { ChartSlice as ChartDonutSlice };\n\nexport interface ChartDonutProps {\n accent?: string;\n /** Texto sob o valor do centro, trocado pelo rotulo da fatia sob o ponteiro. */\n centerLabel?: string;\n defaultHiddenSlices?: readonly string[];\n emptyMessage?: string;\n formatPercent?: (ratio: number) => string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenSlices?: readonly string[];\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n onHiddenSlicesChange?: (hidden: readonly string[]) => void;\n /** Fatia sob o ponteiro, ja agrupada, ou `null` ao sair dela. */\n onHoverSlice?: (slice: ChartSlice | null) => void;\n /** Rotulo da fatia que reune as pequenas. */\n otherLabel?: string;\n /** Raio dos cantos de cada fatia. Sem valor, o token de raio pequeno. */\n sliceRadius?: number;\n showCenter?: boolean;\n showLegendValues?: boolean;\n slices: readonly ChartSlice[];\n /** Fracao do total abaixo da qual a fatia entra no agrupamento. */\n smallSliceThreshold?: number;\n /** Espessura do anel, como fracao do raio. */\n thickness?: number;\n title: string;\n}\n\nexport function ChartDonut({\n accent,\n centerLabel = 'Total',\n defaultHiddenSlices,\n emptyMessage = 'Sem dados no período',\n formatPercent = (fracao) => `${Math.round(fracao * 100)}%`,\n formatValue = formatarNumero,\n height = 260,\n hiddenSlices,\n legend = 'right',\n legendAlign,\n onHiddenSlicesChange,\n onHoverSlice,\n otherLabel = 'Outros',\n showCenter = true,\n showLegendValues = true,\n sliceRadius,\n slices,\n smallSliceThreshold = 0.02,\n thickness = 0.38,\n title,\n}: ChartDonutProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n\n const anel = useSliceRing({\n accent,\n defaultHiddenSlices,\n hiddenSlices,\n onHiddenSlicesChange,\n onHoverSlice,\n otherLabel,\n slices,\n smallSliceThreshold,\n });\n\n const diametro = ringDiameter(width, alturaDoDesenho);\n const raio = diametro / 2;\n const raioInterno = raio * (1 - Math.min(Math.max(thickness, 0), 1));\n\n const canto = sliceRadius ?? raioDoCanto;\n const focada = anel.focused === null ? undefined : anel.slices[anel.focused];\n const centro = fitCenterText(\n formatValue(focada ? Math.max(focada.value, 0) : anel.total),\n focada ? focada.label : centerLabel,\n font,\n raioInterno * 2,\n );\n\n return (\n <ChartFrame\n centerOrigin\n containerRef={ref}\n empty={anel.slices.length === 0 || slices.every((fatia) => !(fatia.value > 0))}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={anel.slices.map((fatia, indice) => ({\n color: anel.colors[indice],\n hidden: anel.isHidden(fatia.label),\n label: fatia.label,\n value: showLegendValues ? formatPercent(anel.ratioOf(indice)) : undefined,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={anel.toggle}\n swatch=\"dot\"\n title={title}\n width={width}\n >\n {anel.slices.map((fatia, indice) => (\n <path\n aria-label={`${fatia.label}: ${formatValue(Math.max(fatia.value, 0))} (${formatPercent(anel.ratioOf(indice))})`}\n className={styles.slice}\n d={arcPath({\n ...anel.angles[indice],\n cornerRadius: canto,\n innerRadius: raioInterno,\n outerRadius: raio,\n })}\n fill={anel.colors[indice]}\n key={indice}\n onMouseEnter={() => anel.focus(indice)}\n onMouseLeave={() => anel.focus(null)}\n />\n ))}\n\n {showCenter && (\n <g className={styles.center}>\n <text\n className={styles.centerValue}\n dy={centro.size * 0.1}\n style={{ fontFamily: centro.family, fontSize: centro.size }}\n textAnchor=\"middle\"\n >\n {centro.value}\n </text>\n <text className={styles.centerLabel} dy={centro.lineHeight * 0.62} textAnchor=\"middle\">\n {centro.label}\n </text>\n </g>\n )}\n </ChartFrame>\n );\n}\n","import { useMemo } from 'react';\nimport {\n ChartFrame,\n VOLTA,\n arcPath,\n chartHeight,\n centerTextRadius,\n fitCenterText,\n ringDiameter,\n useChartMetrics,\n useSeriesToggle,\n useTweenedNumbers,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartRadial.module.css';\n\nexport interface ChartRadialTrack extends SeriesAppearance {\n label: string;\n /** Meta da medida. Sem ela, a meta e o maior valor entre os aneis. */\n max?: number;\n value: number;\n}\n\nexport interface ChartRadialProps {\n accent?: string;\n /** Texto sob o valor do centro. Sem ele, o rotulo do primeiro anel. */\n centerLabel?: string;\n defaultHiddenTracks?: readonly string[];\n emptyMessage?: string;\n /** Angulo final da volta, em graus a partir do topo. Meia-lua usa 180. */\n endAngle?: number;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenTracks?: readonly string[];\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n onHiddenTracksChange?: (hidden: readonly string[]) => void;\n /** Valor no centro. Ele reserva o proprio espaco, ate metade do raio: com muitos aneis, quem cede e a espessura deles. */\n showCenter?: boolean;\n startAngle?: number;\n /** Raio das pontas do arco. Sem valor, o token de raio pequeno. */\n trackRadius?: number;\n /** Espessura de cada anel, em pixels. */\n thickness?: number;\n title: string;\n tracks: readonly ChartRadialTrack[];\n}\n\n/** Folga entre dois aneis vizinhos. */\nconst ESPACO_ENTRE_ANEIS = 6;\n\n/** Raio minimo do vazio central, com ou sem texto nele. */\nconst PISO_DO_RAIO = 8;\n\nfunction emRadianos(graus: number) {\n return (graus * Math.PI) / 180;\n}\n\nexport function ChartRadial({\n accent,\n centerLabel,\n defaultHiddenTracks,\n emptyMessage = 'Sem dados no período',\n endAngle = 360,\n formatValue = formatarNumero,\n height = 260,\n hiddenTracks,\n legend = 'bottom',\n legendAlign,\n onHiddenTracksChange,\n showCenter = true,\n startAngle = 0,\n thickness = 16,\n trackRadius,\n title,\n tracks,\n}: ChartRadialProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({\n defaultHiddenSeries: defaultHiddenTracks,\n hiddenSeries: hiddenTracks,\n onHiddenSeriesChange: onHiddenTracksChange,\n });\n\n // A cor sai da lista inteira, e nao das visiveis: desligar um anel nao pode\n // repintar os demais.\n const cores = useMemo(() => resolveSeriesColors(tracks, { accent }), [accent, tracks]);\n\n // Valor invalido tem o destino do ausente: nao entra no maximo nem preenche o anel.\n const valido = (anel: ChartRadialTrack) => Number.isFinite(anel.value);\n const maiorValor = tracks.reduce((maior, anel) => (valido(anel) ? Math.max(maior, anel.value) : maior), 0);\n const fracoes = tracks.map((anel) => {\n const meta = anel.max ?? maiorValor;\n\n return isHidden(anel.label) || !valido(anel) || !(meta > 0) ? 0 : Math.min(Math.max(anel.value, 0) / meta, 1);\n });\n\n // As fracoes caminham ate o alvo, entao o arco cresce ao aparecer e recolhe\n // quando o anel e desligado.\n const animadas = useTweenedNumbers(fracoes, { from: fracoes.map(() => 0) });\n\n const comeco = emRadianos(startAngle);\n const volta = Math.min(emRadianos(endAngle) - comeco, VOLTA);\n\n const raioExterno = ringDiameter(width, alturaDoDesenho) / 2;\n const destaque = tracks.find((anel) => !isHidden(anel.label));\n const valorDoCentro = showCenter && destaque ? formatValue(destaque.value) : undefined;\n // O centro reserva o que o valor pede no menor degrau da escala, ate metade do raio; quem cede e a espessura dos aneis.\n const piso =\n valorDoCentro === undefined\n ? PISO_DO_RAIO\n : Math.max(PISO_DO_RAIO, Math.min(centerTextRadius(valorDoCentro, font), raioExterno / 2));\n // Com muitos aneis, espessura e folga cedem na mesma proporcao ate caber; so a espessura cedia, e os ultimos\n // aneis passavam do centro.\n const cabe = Math.min(1, Math.max(raioExterno - piso, 0) / (Math.max(tracks.length, 1) * (thickness + ESPACO_ENTRE_ANEIS)));\n const espessuraCabivel = Math.max(thickness * cabe, 1);\n const folga = ESPACO_ENTRE_ANEIS * cabe;\n const raioDe = (indice: number) => raioExterno - indice * (espessuraCabivel + folga);\n const raioInterno = Math.max(raioDe(Math.max(tracks.length - 1, 0)) - espessuraCabivel, piso);\n\n const canto = trackRadius ?? raioDoCanto;\n const centro =\n destaque && valorDoCentro !== undefined\n ? fitCenterText(valorDoCentro, centerLabel ?? destaque.label, font, raioInterno * 2)\n : undefined;\n\n return (\n <ChartFrame\n centerOrigin\n containerRef={ref}\n empty={tracks.length === 0}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={tracks.map((anel, indice) => ({\n color: cores[indice],\n hidden: isHidden(anel.label),\n label: anel.label,\n value: valido(anel) ? formatValue(anel.value) : undefined,\n }))}\n legendAlign={legendAlign}\n legendPosition={tracks.length > 1 ? legend : 'none'}\n onToggleSeries={toggle}\n swatch=\"dot\"\n title={title}\n width={width}\n >\n {tracks.map((anel, indice) => {\n const externo = raioDe(indice);\n const interno = externo - espessuraCabivel;\n const fracao = animadas[indice] ?? 0;\n const preenchido = comeco + volta * fracao;\n const descricao = valido(anel) ? `${anel.label}: ${formatValue(anel.value)}` : anel.label;\n\n return (\n <g key={indice}>\n <path\n aria-label={descricao}\n className={styles.track}\n d={arcPath({\n cornerRadius: canto,\n endAngle: comeco + volta,\n innerRadius: interno,\n outerRadius: externo,\n startAngle: comeco,\n })}\n >\n <title>{descricao}</title>\n </path>\n {fracao > 0 && (\n <path\n className={styles.fill}\n d={arcPath({\n cornerRadius: canto,\n endAngle: preenchido,\n innerRadius: interno,\n outerRadius: externo,\n startAngle: comeco,\n })}\n fill={cores[indice]}\n />\n )}\n </g>\n );\n })}\n\n {centro && (\n <g className={styles.center}>\n <text\n className={styles.centerValue}\n dy={centro.size * 0.1}\n style={{ fontFamily: centro.family, fontSize: centro.size }}\n textAnchor=\"middle\"\n >\n {centro.value}\n </text>\n <text className={styles.centerLabel} dy={centro.lineHeight * 0.62} textAnchor=\"middle\">\n {centro.label}\n </text>\n </g>\n )}\n </ChartFrame>\n );\n}\n","import { useMemo } from 'react';\nimport {\n BandCursor,\n CartesianFrame,\n cartesianLayout,\n chartHeight,\n roundedBarPath,\n useChartMetrics,\n useHoveredBand,\n useTweenedNumbers,\n valueLabelRoom,\n valueLabelsFor,\n type AxisLabelAngle,\n type AxisTick,\n type AxisVisibility,\n type ChartHeight,\n} from '../core';\nimport { resolveSeriesColors, type SeriesIntent } from '../palette';\nimport { bandScale, domainOf, linearScale, ticksFor } from '../scales';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartWaterfall.module.css';\n\nexport interface ChartWaterfallStep {\n color?: string;\n intent?: SeriesIntent;\n label: string;\n total?: boolean;\n value: number;\n}\n\nexport interface ChartWaterfallProps {\n emptyMessage?: string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n labelAngle?: AxisLabelAngle;\n /** Indice do passo sob o ponteiro, ou `null` ao sair dele. */\n onHoverStep?: (index: number | null) => void;\n showDataLabels?: boolean;\n steps: readonly ChartWaterfallStep[];\n title: string;\n xAxis?: AxisVisibility;\n yAxis?: AxisVisibility;\n yAxisRight?: AxisVisibility;\n}\n\ninterface Trecho {\n fim: number;\n inicio: number;\n}\n\n/**\n * Cada passo ocupa a faixa entre o acumulado anterior e o novo acumulado; o total parte do zero, porque\n * fecha a conta. Passo invalido e ausente: nao se desenha nem move o acumulado.\n */\nfunction trechosDe(steps: readonly ChartWaterfallStep[]): (Trecho | null)[] {\n let acumulado = 0;\n\n return steps.map((passo) => {\n if (!Number.isFinite(passo.value)) {\n return null;\n }\n\n const inicio = passo.total ? 0 : acumulado;\n const fim = inicio + passo.value;\n acumulado = fim;\n\n return { inicio, fim };\n });\n}\n\n/** Passo sem intencao declarada recebe a do seu sinal. Total e fechamento, nao aporte. */\nfunction intencaoDe(step: ChartWaterfallStep): SeriesIntent {\n if (step.intent) {\n return step.intent;\n }\n\n if (step.total) {\n return 'neutral';\n }\n\n return step.value < 0 ? 'negative' : 'positive';\n}\n\n/**\n * O sinal e do grafico, nao do formatador: ele formata a magnitude. Delegar o\n * sinal perderia a variacao com qualquer formatador que exiba apenas o valor.\n */\nfunction comSinal(value: number, formatValue: (value: number) => string) {\n if (value === 0) {\n return formatValue(0);\n }\n\n return `${value < 0 ? '-' : '+'}${formatValue(Math.abs(value))}`;\n}\n\nexport function ChartWaterfall({\n emptyMessage = 'Sem dados no período',\n formatValue = formatarNumero,\n height = 280,\n labelAngle = 'auto',\n onHoverStep,\n showDataLabels = true,\n steps,\n title,\n xAxis = 'visible',\n yAxis = 'visible',\n yAxisRight = 'hidden',\n}: ChartWaterfallProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { hover: focarPasso, hovered: passoEmFoco } = useHoveredBand(onHoverStep);\n\n const trechos = useMemo(() => trechosDe(steps), [steps]);\n\n const cores = useMemo(\n () => resolveSeriesColors(steps.map((passo) => ({ color: passo.color, intent: intencaoDe(passo) }))),\n [steps],\n );\n\n const dominio = useMemo(\n () => domainOf(trechos.flatMap((trecho) => (trecho ? [trecho.inicio, trecho.fim] : []))),\n [trechos],\n );\n\n const rotulosDeValor = valueLabelsFor(dominio, alturaDoDesenho, formatValue);\n\n const { margins, plot, rotation } = cartesianLayout({\n bottomLabels: steps.map((passo) => passo.label),\n font,\n height: alturaDoDesenho,\n labelAngle,\n leftLabels: rotulosDeValor,\n rightLabels: rotulosDeValor,\n topRoom: showDataLabels ? valueLabelRoom(font) : 0,\n width,\n xAxis,\n yAxis,\n yAxisRight,\n });\n\n // A faixa e indexada pela posicao, nao pelo rotulo: numa sequencia de passos o\n // mesmo rotulo pode repetir, e a escala categorica funde dominios iguais.\n const escalaPassos = useMemo(\n () => bandScale({ domain: steps.map((_, indice) => String(indice)), range: [0, plot.width] }),\n [plot.width, steps],\n );\n\n const faixaDe = (indice: number) => escalaPassos(String(indice)) ?? 0;\n\n // A escala alvo fixa as marcas; a animada posiciona o desenho. Sem separar as\n // duas, as marcas exibiriam valores quebrados durante a transicao.\n const escalaAlvo = useMemo(\n () => linearScale({ domain: dominio, range: [plot.height, 0] }),\n [dominio, plot.height],\n );\n\n const [minimo, maximo] = useTweenedNumbers(escalaAlvo.domain());\n\n const escalaValores = useMemo(\n () => linearScale({ domain: { min: minimo, max: maximo }, nice: false, range: [plot.height, 0] }),\n [maximo, minimo, plot.height],\n );\n\n const marcasDeValor = ticksFor(escalaAlvo, plot.height);\n\n const marcasPassos: AxisTick[] = steps.map((passo, indice) => ({\n label: passo.label,\n position: faixaDe(indice) + escalaPassos.bandwidth() / 2,\n }));\n\n const marcasValor: AxisTick[] = marcasDeValor.map((valor) => ({\n label: formatValue(valor),\n position: escalaValores(valor),\n }));\n\n function rotuloDe(passo: ChartWaterfallStep) {\n return passo.total ? formatValue(passo.value) : comSinal(passo.value, formatValue);\n }\n\n return (\n <CartesianFrame\n containerRef={ref}\n empty={steps.length === 0}\n emptyMessage={emptyMessage}\n grid={[\n {\n baseline: escalaValores(0),\n lines: marcasDeValor.map((valor) => escalaValores(valor)),\n orientation: 'horizontal',\n },\n ]}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legendPosition=\"none\"\n margins={margins}\n plot={plot}\n title={title}\n width={width}\n xAxis={{ labelRotation: rotation, ticks: marcasPassos, visibility: xAxis }}\n yAxis={{ hideLine: true, ticks: marcasValor, visibility: yAxis }}\n yAxisRight={{ hideLine: true, ticks: marcasValor, visibility: yAxisRight }}\n >\n {passoEmFoco !== null && (\n <BandCursor offset={faixaDe(passoEmFoco)} plot={plot} size={escalaPassos.bandwidth()} />\n )}\n\n <g aria-hidden=\"true\">\n {trechos.slice(0, -1).map((trecho, indice) => {\n if (!trecho || !trechos[indice + 1]) {\n return null;\n }\n\n const nivel = escalaValores(trecho.fim);\n\n return (\n <line\n className={styles.connector}\n key={indice}\n x1={faixaDe(indice) + escalaPassos.bandwidth()}\n x2={faixaDe(indice + 1)}\n y1={nivel}\n y2={nivel}\n />\n );\n })}\n </g>\n\n {steps.map((passo, indice) => {\n const trecho = trechos[indice];\n\n if (!trecho) {\n return null;\n }\n\n const topo = Math.min(escalaValores(trecho.inicio), escalaValores(trecho.fim));\n const altura = Math.abs(escalaValores(trecho.fim) - escalaValores(trecho.inicio));\n\n return (\n <path\n aria-label={`${passo.label}: ${rotuloDe(passo)}`}\n className={styles.bar}\n d={roundedBarPath(faixaDe(indice), topo, escalaPassos.bandwidth(), altura, [\n raioDoCanto,\n raioDoCanto,\n raioDoCanto,\n raioDoCanto,\n ])}\n fill={cores[indice]}\n key={indice}\n onMouseEnter={() => focarPasso(indice)}\n onMouseLeave={() => focarPasso(null)}\n />\n );\n })}\n\n {showDataLabels &&\n steps.map((passo, indice) => {\n const trecho = trechos[indice];\n\n if (!trecho) {\n return null;\n }\n\n const topo = Math.min(escalaValores(trecho.inicio), escalaValores(trecho.fim));\n\n return (\n <text\n className={styles.valueLabel}\n key={indice}\n textAnchor=\"middle\"\n x={faixaDe(indice) + escalaPassos.bandwidth() / 2}\n y={topo - 6}\n >\n {rotuloDe(passo)}\n </text>\n );\n })}\n </CartesianFrame>\n );\n}\n","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","import { useMemo, useState } from 'react';\nimport { hierarchy, partition, type HierarchyRectangularNode } from 'd3-hierarchy';\nimport {\n CHART_LABEL_BAND,\n CHART_LABEL_OFFSET,\n ChartFrame,\n VOLTA,\n arcAnchor,\n arcPath,\n chartHeight,\n ringDiameter,\n truncateToWidth,\n useChartMetrics,\n useSeriesToggle,\n widestLabel,\n type ChartHeight,\n type ChartLegendAlign,\n type ChartLegendPosition,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartSunburst.module.css';\n\nexport interface ChartSunburstNode extends SeriesAppearance {\n children?: readonly ChartSunburstNode[];\n label: string;\n value?: number;\n}\n\nexport interface ChartSunburstProps {\n accent?: string;\n defaultHiddenGroups?: readonly string[];\n emptyMessage?: string;\n formatPercent?: (ratio: number) => string;\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n hiddenGroups?: readonly string[];\n legend?: ChartLegendPosition;\n legendAlign?: ChartLegendAlign;\n nodes: readonly ChartSunburstNode[];\n onHiddenGroupsChange?: (hidden: readonly string[]) => void;\n /** Folga entre dois aneis vizinhos. */\n ringGap?: number;\n /** Raio das pontas de cada arco. Sem valor, o token de raio pequeno. */\n sliceRadius?: number;\n showLabels?: boolean;\n title: string;\n}\n\ntype Arco = HierarchyRectangularNode<ChartSunburstNode>;\n\n/** Arco menor que isso nao comporta rotulo nem conector legivel. */\nconst ANGULO_MINIMO_DO_ROTULO = 0.18;\nconst COMPRIMENTO_DO_CONECTOR = 14;\n/**\n * Rotulos de cada nivel da arvore declarada. Medir a banda antes de montar o\n * anel exige saber os rotulos antes, e o nivel mais profundo declarado e o\n * mesmo que o anel externo tera.\n */\nfunction rotulosPorNivel(\n nodes: readonly ChartSunburstNode[],\n nivel = 1,\n por = new Map<number, string[]>(),\n) {\n nodes.forEach((no) => {\n por.set(nivel, [...(por.get(nivel) ?? []), no.label]);\n\n if (no.children?.length) {\n rotulosPorNivel(no.children, nivel + 1, por);\n }\n });\n\n return por;\n}\n\n/**\n * Cada anel clareia sobre o anterior, e o filho nasce da cor do pai. Sem isso a\n * hierarquia sumiria: os aneis externos repetiriam a cor do nivel zero e nada\n * distinguiria um filho do outro.\n */\nfunction tomDoNivel(cor: string, profundidade: number) {\n if (profundidade <= 1) {\n return cor;\n }\n\n const clareamento = Math.min((profundidade - 1) * 22, 66);\n\n return `color-mix(in oklab, ${cor} ${100 - clareamento}%, var(--pl-color-surface))`;\n}\n\nexport function ChartSunburst({\n accent,\n defaultHiddenGroups,\n emptyMessage = 'Sem dados no período',\n formatPercent = (fracao) => `${Math.round(fracao * 100)}%`,\n formatValue = formatarNumero,\n height = 320,\n hiddenGroups,\n legend = 'bottom',\n legendAlign,\n nodes,\n onHiddenGroupsChange,\n ringGap = 2,\n showLabels = true,\n sliceRadius,\n title,\n}: ChartSunburstProps) {\n const { font, height: alturaMedida, radius: raioDoCanto, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const { isHidden, toggle } = useSeriesToggle({\n defaultHiddenSeries: defaultHiddenGroups,\n hiddenSeries: hiddenGroups,\n onHiddenSeriesChange: onHiddenGroupsChange,\n });\n const [emFoco, setEmFoco] = useState<Arco | null>(null);\n\n // A cor sai da lista inteira, e nao das visiveis: desligar um grupo nao pode\n // repintar os demais.\n const coresDeNivelZero = useMemo(() => resolveSeriesColors(nodes, { accent }), [accent, nodes]);\n\n const visiveis = useMemo(\n () => nodes.filter((grupo) => !isHidden(grupo.label)),\n [isHidden, nodes],\n );\n\n // A banda dos rotulos e reservada antes do anel, medida pelo rotulo mais\n // largo do anel externo. Sem reservar, o rotulo era desenhado no que sobrasse\n // — quase nada nas laterais — e acabava cortado ate sumir.\n const rotulosExternos = useMemo(() => {\n const niveis = rotulosPorNivel(visiveis);\n const externo = Math.max(0, ...niveis.keys());\n\n return niveis.get(externo) ?? [];\n }, [visiveis]);\n\n const larguraDoRotulo = showLabels\n ? Math.min(widestLabel(rotulosExternos, font), width * CHART_LABEL_BAND)\n : 0;\n const banda = showLabels ? COMPRIMENTO_DO_CONECTOR * 2 + CHART_LABEL_OFFSET + larguraDoRotulo : 0;\n\n const diametro = ringDiameter(Math.max(width - banda * 2, 0), alturaDoDesenho);\n const raio = diametro / 2;\n\n const arcos = useMemo(() => {\n if (raio <= 0) {\n return [];\n }\n\n const arvore = hierarchy<ChartSunburstNode>({ children: visiveis, label: '' })\n .sum((no) => Math.max(no.value ?? 0, 0))\n .sort((a, b) => (b.value ?? 0) - (a.value ?? 0));\n\n const repartir = partition<ChartSunburstNode>().size([VOLTA, raio]);\n\n return repartir(arvore)\n .descendants()\n .filter((no) => no.depth > 0);\n }, [raio, visiveis]);\n\n const profundidadeMaxima = arcos.reduce((maior, arco) => Math.max(maior, arco.depth), 0);\n const total = arcos\n .filter((arco) => arco.depth === 1)\n .reduce((soma, arco) => soma + (arco.value ?? 0), 0);\n\n // O arco guardado deixa de existir quando a arvore e remontada, num\n // redimensionamento por exemplo. Sem conferir, o foco perdido apagaria tudo.\n const foco = emFoco && arcos.includes(emFoco) ? emFoco : null;\n\n /**\n * Acende o arco sob o ponteiro e os que o originaram. O caminho ate a raiz e\n * o que explica de onde aquela fatia veio; os filhos dela nao explicam nada\n * sobre ela, entao ficam apagados junto com o resto.\n */\n function aceso(arco: Arco) {\n return foco === null || foco.ancestors().includes(arco);\n }\n\n function corDe(arco: Arco) {\n const raizDoRamo = arco.ancestors().find((ancestral) => ancestral.depth === 1)?.data;\n const base =\n raizDoRamo?.color ?? coresDeNivelZero[nodes.findIndex((no) => no.label === raizDoRamo?.label)];\n\n return tomDoNivel(base ?? 'var(--pl-chart-neutral)', arco.depth);\n }\n\n function descreverArco(arco: Arco) {\n const fracao = total > 0 ? (arco.value ?? 0) / total : 0;\n\n return `${arco.data.label}: ${formatValue(arco.value ?? 0)} (${formatPercent(fracao)})`;\n }\n\n return (\n <ChartFrame\n centerOrigin\n containerRef={ref}\n empty={nodes.length === 0}\n emptyMessage={emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legend={nodes.map((grupo, indice) => ({\n color: coresDeNivelZero[indice],\n hidden: isHidden(grupo.label),\n label: grupo.label,\n }))}\n legendAlign={legendAlign}\n legendPosition={legend}\n onToggleSeries={toggle}\n swatch=\"dot\"\n title={title}\n width={width}\n >\n {arcos.map((arco, indice) => (\n <path\n aria-label={descreverArco(arco)}\n className={`${styles.arc} ${aceso(arco) ? '' : styles.arcDim}`}\n d={arcPath({\n cornerRadius: sliceRadius ?? raioDoCanto,\n endAngle: arco.x1,\n innerRadius: arco.y0 + (arco.depth > 1 ? ringGap : 0),\n outerRadius: arco.y1,\n startAngle: arco.x0,\n })}\n fill={corDe(arco)}\n key={indice}\n onMouseEnter={() => setEmFoco(arco)}\n onMouseLeave={() => setEmFoco(null)}\n >\n <title>{descreverArco(arco)}</title>\n </path>\n ))}\n\n {showLabels &&\n arcos\n .filter(\n (arco) => arco.depth === profundidadeMaxima && arco.x1 - arco.x0 >= ANGULO_MINIMO_DO_ROTULO,\n )\n .map((arco, indice) => {\n const angulos = { endAngle: arco.x1, startAngle: arco.x0 };\n const [xBorda, yBorda] = arcAnchor(angulos, arco.y1);\n const [xCotovelo, yCotovelo] = arcAnchor(angulos, arco.y1 + COMPRIMENTO_DO_CONECTOR);\n const paraDireita = xCotovelo >= 0;\n const xFim = xCotovelo + (paraDireita ? COMPRIMENTO_DO_CONECTOR : -COMPRIMENTO_DO_CONECTOR);\n\n return (\n <g className={styles.leader} key={indice}>\n <polyline\n className={styles.connector}\n points={`${xBorda},${yBorda} ${xCotovelo},${yCotovelo} ${xFim},${yCotovelo}`}\n />\n <text\n className={styles.label}\n dominantBaseline=\"middle\"\n textAnchor={paraDireita ? 'start' : 'end'}\n x={xFim + (paraDireita ? CHART_LABEL_OFFSET : -CHART_LABEL_OFFSET)}\n y={yCotovelo}\n >\n {truncateToWidth(arco.data.label, font, larguraDoRotulo)}\n </text>\n </g>\n );\n })}\n </ChartFrame>\n );\n}\n","import { useMemo, useState } from 'react';\nimport { sankey, sankeyCenter, sankeyJustify, sankeyLeft, sankeyRight } from 'd3-sankey';\nimport {\n CHART_LABEL_BAND,\n CHART_LABEL_OFFSET,\n ChartFrame,\n chartHeight,\n measureLabel,\n truncateToWidth,\n useChartMetrics,\n widestLabel,\n type ChartHeight,\n} from '../core';\nimport { resolveSeriesColors, type SeriesAppearance } from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport styles from './ChartSankey.module.css';\n\nexport interface ChartSankeyNode extends SeriesAppearance {\n label: string;\n}\n\nexport interface ChartSankeyFlow {\n source: string;\n target: string;\n value: number;\n}\n\n/** Onde os nos sem saida se encostam, conforme a referencia. */\nexport type ChartSankeyAlign = 'left' | 'right' | 'center' | 'justify';\n\n/** De onde a ligacao tira a cor: do no de origem, do de destino, ou de nenhum. */\nexport type ChartSankeyFlowColor = 'source' | 'target' | 'neutral';\n\n/**\n * Onde o valor da ligacao e escrito. O rotulo do no ocupa a faixa logo a\n * direita dele, entao `end` e o unico que nunca disputa espaco com o rotulo da\n * propria origem.\n */\nexport type ChartSankeyFlowValuePosition = 'start' | 'middle' | 'end';\n\nexport interface ChartSankeyProps {\n accent?: string;\n /** Mensagem quando o fluxo tem ciclo, que um diagrama de fluxo nao representa. */\n cyclicMessage?: string;\n emptyMessage?: string;\n flowColor?: ChartSankeyFlowColor;\n flowValuePosition?: ChartSankeyFlowValuePosition;\n flows: readonly ChartSankeyFlow[];\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n nodeAlign?: ChartSankeyAlign;\n /** Ordem e aparencia dos nos. Sem ela, os nos saem das proprias ligacoes. */\n nodes?: readonly ChartSankeyNode[];\n /** Folga vertical entre dois nos da mesma coluna. */\n nodePadding?: number;\n nodeWidth?: number;\n showFlowValues?: boolean;\n showLabels?: boolean;\n title: string;\n}\n\ninterface NoPosicionado {\n index: number;\n label: string;\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n}\n\ninterface Caixa {\n x0: number;\n x1: number;\n y0: number;\n y1: number;\n}\n\nfunction seCruzam(uma: Caixa, outra: Caixa) {\n return uma.x0 < outra.x1 && outra.x0 < uma.x1 && uma.y0 < outra.y1 && outra.y0 < uma.y1;\n}\n\ninterface LigacaoPosicionada {\n index: number;\n source: NoPosicionado;\n target: NoPosicionado;\n value: number;\n width: number;\n y0: number;\n y1: number;\n}\n\nconst ALINHAMENTO = {\n center: sankeyCenter,\n justify: sankeyJustify,\n left: sankeyLeft,\n right: sankeyRight,\n};\n\n/**\n * Bezier cubica entre a borda de saida e a borda de entrada, com os pontos de\n * controle no meio do vao. E o que da a ligacao a curva que sai e chega na\n * horizontal, sem torcer perto dos nos.\n */\nfunction caminhoDa(ligacao: LigacaoPosicionada) {\n const saida = ligacao.source.x1;\n const chegada = ligacao.target.x0;\n const meio = (saida + chegada) / 2;\n\n return `M${saida},${ligacao.y0}C${meio},${ligacao.y0} ${meio},${ligacao.y1} ${chegada},${ligacao.y1}`;\n}\n\n/**\n * Busca em profundidade atras de aresta de retorno. Um autolaco tambem conta:\n * o no seria origem e destino do mesmo caminho.\n */\nfunction temCiclo(flows: readonly ChartSankeyFlow[]) {\n const saidas = new Map<string, string[]>();\n\n for (const fluxo of flows) {\n saidas.set(fluxo.source, [...(saidas.get(fluxo.source) ?? []), fluxo.target]);\n }\n\n const encerrados = new Set<string>();\n const noCaminho = new Set<string>();\n\n function alcanca(no: string): boolean {\n if (noCaminho.has(no)) {\n return true;\n }\n\n if (encerrados.has(no)) {\n return false;\n }\n\n noCaminho.add(no);\n const achou = (saidas.get(no) ?? []).some(alcanca);\n noCaminho.delete(no);\n encerrados.add(no);\n\n return achou;\n }\n\n return [...saidas.keys()].some(alcanca);\n}\n\nexport function ChartSankey({\n accent,\n cyclicMessage = 'O fluxo volta sobre si mesmo e não pode ser desenhado',\n emptyMessage = 'Sem dados no período',\n flowColor = 'source',\n flowValuePosition = 'end',\n flows,\n formatValue = formatarNumero,\n height = 320,\n nodeAlign = 'justify',\n nodes,\n nodePadding = 12,\n nodeWidth = 12,\n showFlowValues = false,\n showLabels = true,\n title,\n}: ChartSankeyProps) {\n const { font, height: alturaMedida, ref, width } = useChartMetrics();\n const { fillHeight, value: alturaDoDesenho } = chartHeight(height, alturaMedida);\n const [emFoco, setEmFoco] = useState<number | null>(null);\n\n /** Os nos saem da ordem declarada, e o que faltar sai das proprias ligacoes. */\n const declarados = useMemo(() => {\n const rotulos = (nodes ?? []).map((no) => no.label);\n\n flows.forEach(({ source, target }) => {\n [source, target].forEach((rotulo) => {\n if (!rotulos.includes(rotulo)) {\n rotulos.push(rotulo);\n }\n });\n });\n\n return rotulos.map(\n (rotulo) => nodes?.find((no) => no.label === rotulo) ?? ({ label: rotulo } as ChartSankeyNode),\n );\n }, [flows, nodes]);\n\n // A cor sai da lista inteira e na ordem dos nos, para uma ligacao herdar\n // sempre a cor do no de que ela depende.\n const cores = useMemo(() => resolveSeriesColors(declarados, { accent }), [accent, declarados]);\n\n /**\n * O rotulo fica sempre a direita do no, como na referencia. So o de saida\n * precisa de espaco reservado: ele nao tem fluxo a direita para escrever por\n * cima, e sem a reserva o nome sairia pela borda.\n */\n const saidas = useMemo(() => {\n const origens = new Set(flows.map((fluxo) => fluxo.source));\n\n return declarados.map((no) => no.label).filter((rotulo) => !origens.has(rotulo));\n }, [declarados, flows]);\n\n const bandaDireita = showLabels\n ? Math.min(widestLabel(saidas, font), width * CHART_LABEL_BAND) + CHART_LABEL_OFFSET\n : 0;\n\n // Um diagrama de fluxo e aciclico por definicao, e o `d3-sankey` lanca ao\n // encontrar um ciclo. Detectar antes troca a queda da arvore inteira por uma\n // mensagem, sem descartar ligacao nenhuma pelas costas.\n const ciclico = useMemo(() => temCiclo(flows), [flows]);\n const totalDoFluxo = useMemo(\n () => flows.reduce((soma, fluxo) => soma + (Number.isFinite(fluxo.value) ? Math.max(fluxo.value, 0) : 0), 0),\n [flows],\n );\n\n const grafo = useMemo(() => {\n const util = width - bandaDireita;\n\n if (util <= 0 || alturaDoDesenho <= 0 || flows.length === 0 || ciclico || totalDoFluxo <= 0) {\n return { links: [] as LigacaoPosicionada[], nodes: [] as NoPosicionado[] };\n }\n\n const posicionar = sankey<{ label: string }, { value: number }>()\n .nodeId((no) => no.label)\n .nodeAlign(ALINHAMENTO[nodeAlign])\n .nodeWidth(nodeWidth)\n .nodePadding(nodePadding)\n .extent([\n [0, 2],\n [util, alturaDoDesenho - 2],\n ]);\n\n const resultado = posicionar({\n links: flows.map((fluxo) => ({\n ...fluxo,\n value: Number.isFinite(fluxo.value) ? Math.max(fluxo.value, 0) : 0,\n })),\n nodes: declarados.map((no) => ({ label: no.label })),\n });\n\n return resultado as unknown as { links: LigacaoPosicionada[]; nodes: NoPosicionado[] };\n }, [alturaDoDesenho, bandaDireita, ciclico, declarados, flows, nodeAlign, nodePadding, nodeWidth, totalDoFluxo, width]);\n\n const corDoNo = (indice: number) => cores[indice] ?? 'var(--pl-chart-neutral)';\n\n function corDa(ligacao: LigacaoPosicionada) {\n if (flowColor === 'neutral') {\n return 'var(--pl-chart-neutral)';\n }\n\n return corDoNo(flowColor === 'target' ? ligacao.target.index : ligacao.source.index);\n }\n\n function descreverLigacao(ligacao: LigacaoPosicionada) {\n return `${ligacao.source.label} → ${ligacao.target.label}: ${formatValue(ligacao.value)}`;\n }\n\n function classeDa(indice: number) {\n if (emFoco === null) {\n return styles.link;\n }\n\n return `${styles.link} ${emFoco === indice ? styles.linkOn : styles.linkDim}`;\n }\n\n /** Vao entre duas colunas, descontados o no e o recuo: e o que o rotulo tem. */\n const larguraDaEtapa = (() => {\n const colunas = [...new Set(grafo.nodes.map((no) => no.x0))].sort((a, b) => a - b);\n\n if (colunas.length < 2) {\n return width * CHART_LABEL_BAND;\n }\n\n const passo = Math.min(...colunas.slice(1).map((x, indice) => x - colunas[indice]));\n\n return Math.max(passo - nodeWidth - CHART_LABEL_OFFSET, 0);\n })();\n\n function rotuloDoNo(no: NoPosicionado) {\n const saida = saidas.includes(no.label);\n const texto = truncateToWidth(\n no.label,\n font,\n (saida ? bandaDireita : larguraDaEtapa) - CHART_LABEL_OFFSET,\n );\n const x = no.x1 + CHART_LABEL_OFFSET;\n const meio = (no.y0 + no.y1) / 2;\n\n return {\n caixa: {\n x0: x,\n x1: x + measureLabel(texto, font),\n y0: meio - font.lineHeight / 2,\n y1: meio + font.lineHeight / 2,\n } satisfies Caixa,\n texto,\n x,\n y: meio,\n };\n }\n\n const rotulosDosNos = showLabels ? grafo.nodes.map(rotuloDoNo) : [];\n\n /**\n * Valor de uma ligacao, ja posicionado. Ele e omitido quando cruza o rotulo\n * de algum no: dois textos sobrepostos nao informam nada, e o valor continua\n * no `title` da propria ligacao.\n */\n function valorDa(ligacao: LigacaoPosicionada) {\n const texto = formatValue(ligacao.value);\n const largura = measureLabel(texto, font);\n const saida = ligacao.source.x1;\n const chegada = ligacao.target.x0;\n const meio = (ligacao.y0 + ligacao.y1) / 2;\n\n const posicoes = {\n end: { anchor: 'end' as const, x: chegada - CHART_LABEL_OFFSET },\n middle: { anchor: 'middle' as const, x: (saida + chegada) / 2 },\n start: { anchor: 'start' as const, x: saida + CHART_LABEL_OFFSET },\n };\n\n const { anchor, x } = posicoes[flowValuePosition];\n const recuo = { end: largura, middle: largura / 2, start: 0 }[flowValuePosition];\n\n const caixa: Caixa = {\n x0: x - recuo,\n x1: x - recuo + largura,\n y0: meio - font.lineHeight / 2,\n y1: meio + font.lineHeight / 2,\n };\n\n if (rotulosDosNos.some((rotulo) => seCruzam(caixa, rotulo.caixa))) {\n return undefined;\n }\n\n return { anchor, texto, x, y: meio };\n }\n\n return (\n <ChartFrame\n containerRef={ref}\n empty={flows.length === 0 || ciclico || totalDoFluxo <= 0}\n emptyMessage={ciclico ? cyclicMessage : emptyMessage}\n fillHeight={fillHeight}\n height={alturaDoDesenho}\n legendPosition=\"none\"\n title={title}\n width={width}\n >\n <g className={styles.links}>\n {grafo.links.map((ligacao, indice) => (\n <path\n aria-label={descreverLigacao(ligacao)}\n className={classeDa(indice)}\n d={caminhoDa(ligacao)}\n key={indice}\n onMouseEnter={() => setEmFoco(indice)}\n onMouseLeave={() => setEmFoco(null)}\n stroke={corDa(ligacao)}\n strokeWidth={Math.max(ligacao.width, 1)}\n >\n <title>{descreverLigacao(ligacao)}</title>\n </path>\n ))}\n </g>\n\n {grafo.nodes.map((no) => (\n <rect\n aria-label={no.label}\n className={styles.node}\n fill={corDoNo(no.index)}\n height={Math.max(no.y1 - no.y0, 1)}\n key={no.label}\n width={no.x1 - no.x0}\n x={no.x0}\n y={no.y0}\n >\n <title>{no.label}</title>\n </rect>\n ))}\n\n {showFlowValues &&\n grafo.links.map((ligacao, indice) => {\n const valor = valorDa(ligacao);\n\n if (!valor) {\n return null;\n }\n\n return (\n <text\n className={`${styles.flowValue} ${styles.sobreFluxo}`}\n dominantBaseline=\"middle\"\n key={indice}\n textAnchor={valor.anchor}\n x={valor.x}\n y={valor.y}\n >\n {valor.texto}\n </text>\n );\n })}\n\n {/* O rotulo fica sempre a direita do no. No no de saida ele cai na banda\n reservada; nos demais, sobre o proprio fluxo, e um halo da cor da\n superficie o separa do que passa por baixo. */}\n {rotulosDosNos.map((rotulo, indice) => (\n <text\n className={`${styles.label} ${saidas.includes(grafo.nodes[indice].label) ? '' : styles.sobreFluxo}`}\n dominantBaseline=\"middle\"\n key={`rotulo-${grafo.nodes[indice].label}`}\n textAnchor=\"start\"\n x={rotulo.x}\n y={rotulo.y}\n >\n {rotulo.texto}\n </text>\n ))}\n </ChartFrame>\n );\n}\n"],"names":["Icon","children","label","size","props","nome","jsx","IconArrowDown","IconArrowUp","IconCalendar","IconChevronDown","IconChevronExpand","IconChevronLeft","IconChevronRight","IconChevronUp","IconClock","IconClose","IconMinusCircle","jsxs","IconPlusCircle","IconQuestionCircle","Spinner","className","classes","styles","Button","forwardRef","disabled","loading","onClick","type","variant","ref","handleClick","event","Label","required","Field","ariaDescribedBy","characterCount","error","hint","providedId","maxLength","showCharacterCount","generatedId","useId","id","messageId","characterCountId","describedBy","countCharacters","value","useCharacterCount","defaultValue","elementRef","useRef","uncontrolledCount","setUncontrolledCount","useState","useEffect","form","_a","restoreInitialCount","nextValue","attach","node","cleanup","useMergedRefs","refs","useMemo","cleanups","InputText","ariaInvalid","onChange","inputRef","count","updateCount","mergedRef","handleChange","invalid","SEPARADOR_DECIMAL","DIGITOS_DO_GRUPO","ladosDoPontoUnico","texto","partes","normalizarPonto","lados","comoTexto","valor","casasDecimais","sinalDe","formatarEntradaDecimal","sinal","limpo","inteiroBruto","resto","inteiro","decimais","formatarEdicaoDecimal","simboloDa","moeda","parte","formatarEntradaMonetaria","normalizado","inteiroAgrupado","simbolo","ESTILOS","DATA_SIMPLES","paraData","ano","mes","dia","formatarData","localidade","formato","data","formatarHora","segundos","casas","notacao","compacto","SINAL","formatarNumero","formatarMoeda","formatarPercentual","mascararPartes","limites","separadores","trechos","trecho","indice","fechado","limite","DATA_ISO","formatarEntradaData","iso","lerEntradaData","CalendarDate","HORA_INTEIRA","formatarEntradaHora","lerEntradaHora","hora","minuto","Time","formatarEntradaDataHora","lerEntradaDataHora","CalendarDateTime","horario","useFormReset","restaurar","acao","formulario","ouvir","useDecimalInput","decimalScale","onValueChange","uncontrolledValue","setUncontrolledValue","editingText","setEditingText","currentValue","text","InputNumber","onBlur","onKeyDown","decimalInput","handleBlur","handleKeyDown","InputPassword","allowCopy","onCopy","onCut","onValidationChange","showToggle","validate","validateOnBlur","visible","setVisible","blurred","setBlurred","validationMessage","setValidationMessage","displayedError","inputClasses","ocultar","runValidation","message","handleCopy","handleCut","current","InputCurrency","currency","onFocus","focused","setFocused","displayValue","handleFocus","Textarea","rows","textareaRef","Checkbox","indeterminate","aplicarIndeterminado","useCallback","RadioGroupContexto","createContext","useRadioGroupContexto","contexto","useContext","RadioGroup","providedName","name","Radio","grupo","controlado","evento","Switch","Alert","title","tone","Progress","max","showValue","limitado","percentual","Popover","open","createPortal","PopoverContent","offset","onClose","placement","refDoConsumidor","style","triggerRef","overlayProps","useOverlay","elemento","positionProps","useOverlayPosition","FocusScope","collator","equals","term","startsWithTerm","target","search","containsTerm","start","indexOfKey","items","key","item","firstKey","lastKey","i","nextKey","from","previousKey","matchKey","query","step","select","state","mode","allowEmpty","desfaz","selectedKeys","selectRange","anchor","to","inicio","fim","selectionStatus","available","chosen","toggleAll","marcar","clearSelection","useSelection","defaultSelectedKeys","onSelectionChange","typeaheadDelay","internal","setInternal","controlledKeys","itemsByKey","retained","selectedItems","resolved","buffer","timer","focus","applySelection","next","move","extend","character","origin","found","Tabs","defaultSelectedKey","orientation","selectedKey","baseId","nodes","collection","primeira","selection","keys","escolhida","ativa","painel","parada","mover","proxima","atual","avancar","voltar","proximaChave","_b","passo","total","Breadcrumb","Link","index","Pagination","onPageChange","page","pageCount","siblings","paginas","montarFaixa","irPara","pagina","numero","vizinhos","vagas","_","janela","Accordion","defaultExpandedKeys","expandedKeys","multiple","onExpandedChange","iconPosition","divider","destino","_c","aberto","OVERSCAN","PRIMEIRA_JANELA","medirPasso","proximo","useVirtualWindow","height","scrollElement","firstItem","firstIndex","observer","itemHeight","setItemHeight","scrollTop","setScrollTop","measureItem","attachScroll","onScroll","active","medindo","scrollToIndex","element","primeiro","top","bottom","perScreen","end","optionId","ListingOptions","empty","holdsFocus","listing","loadingMessage","onSelect","tabIndex","detached","focusedKey","isSelected","selectionMode","activeIndex","choose","padding","attachElement","rendered","renderOption","position","measured","selected","TECLAS_DE_EDICAO","useListing","onSearch","setTerm","conhecidos","conhecido","chave","visibleValues","estender","itemValue","nextTerm","FormValue","Select","options","placeholder","setOpen","resetRef","first","fechar","abrir","option","handleTriggerKeyDown","handleTriggerClick","Fragment","SelectListbox","panelRef","listboxRef","largura","setLargura","alturaMaxima","useLayoutEffect","alvo","Badge","dot","outline","comoItens","relatarEscolha","escolhidos","ComboBox","allProps","emptyMessage","controlRef","filtering","setFiltering","ancoraRef","resumir","setResumir","selecaoRef","chaveDasEscolhas","moldura","observador","flushSync","selecao","encerrarFiltro","ultimo","resumoId","campo","encadear","proprio","seguinte","Menu","defaultOpen","onOpenChange","controlledOpen","internalOpen","setInternalOpen","openedWith","setOpenedWith","devolverFoco","dono","mergedTriggerRef","trigger","cloneElement","MenuList","focusFirst","focusLast","focusNext","focusPrevious","acionar","TRAVESSIA","chain","own","Tooltip","content","delay","hide","hideSoon","TooltipBubble","onMouseEnter","onMouseLeave","Dialog","DialogContent","description","dismissable","footer","role","titleId","descriptionId","underlayProps","usePreventScroll","ariaHideOutside","getInitials","part","Avatar","onError","src","imageFailed","setImageFailed","showImage","handleError","ListContext","useListContext","context","List","searchPresent","setSearchPresent","ListSearch","claimFocus","ListOptions","ListSelectAll","ListEmpty","CardContext","useCardContext","Card","ariaLabelledBy","titled","setTitled","CardHeader","badge","headingLevel","trailing","registerTitle","Heading","CardBody","flush","CardFooter","TableContext","useTableContext","Table","defaultSelectedIds","defaultSort","highlightSelectedRow","onSortChange","selectedIds","selectionControl","sort","stickyHeader","striped","internalSort","setInternalSort","columns","setColumns","currentSort","control","precisaRolar","setPrecisaRolar","observarTransbordo","envoltorio","envoltorioRef","registerColumn","atuais","restantes","requestSort","column","row","TableHeader","TableColumn","align","help","hideBelow","numeric","sortable","width","sorted","ajuda","TableBody","countColumns","TableRow","TableCell","isUnavailable","date","isDateUnavailable","min","buildMonth","locale","limits","startOfMonth","startOfWeek","weeks","week","getWeeksInMonth","days","day","isSameMonth","clamp","moveFocus","shift","endOfMonth","sameDay","a","b","isSameDay","useCalendar","hoje","today","getLocalTimeZone","focusedDate","setFocusedDate","visibleMonth","setVisibleMonth","ultimoValor","setUltimoValor","Calendar","autoFocus","calendario","fuso","nomeDoMes","nomeDoDia","diasDaSemana","curto","longo","titulo","diaEmFoco","gradeComFoco","chaveEmFoco","semana","selecionado","focado","ler","interpretar","readIsoDate","parseDate","readIsoTime","parseTime","readIsoDateTime","parseDateTime","toIsoTime","toIsoDateTime","instante","DatePicker","fieldRef","internalValue","setInternalValue","escolhido","setTexto","digitando","setDigitando","rascunho","setRascunho","versaoDoCalendario","setVersaoDoCalendario","exibido","definir","entrada","mascarado","lido","permitido","versao","doisDigitos","paraTextoDeHora","isTimeAllowed","time","gerarHorarios","horarios","minutos","TimeSlots","listagem","TimePicker","idDaLista","horaMinima","horaMaxima","paraTexto","DateTimePicker","rascunharData","rascunharHora","base","toCalendarDate","toCalendarDateTime","now","BandCursor","plot","vertical","CHART_LABEL_OFFSET","CHART_EDGE_GAP","CHART_LABEL_BAND","valueLabelRoom","font","CHART_BAR_GAP","NO_BAR_SLOT","barSlots","band","presences","soma","presenca","unit","anterior","ringDiameter","ANCORA","Axis","hideLine","labelRotation","length","ticks","deBaixo","afastamento","marca","Grid","baseline","lines","horizontal","posicao","DEGRAUS_DO_CENTRO","PADRAO","display","lineHeight","LARGURA_POR_CARACTERE","labelFontOf","estilo","family","headingFamily","token","degrau","contextoDeMedida","measureLabel","estimativa","medida","widestLabel","labels","maior","rotulo","truncateToWidth","maxWidth","corte","domainOf","values","includeZero","finitos","menor","extent","stackDiverging","contributions","positivos","negativos","parcela","mergeDomains","domains","faixa","parteNegativa","levarZeroA","altura","alignZeros","parteA","parteB","guardFlat","linearScale","domain","nice","range","escala","scaleLinear","bandScale","scaleBand","pointScale","scalePoint","radiusScale","maxValue","scaleSqrt","ticksFor","scale","chartHeight","calha","visibility","bottomLabelRotation","alturaDosRotulos","rotation","radianos","cartesianLayout","bottomLabels","labelAngle","leftLabels","rightLabels","topRoom","xAxis","yAxis","yAxisRight","meioRotulo","left","right","plotWidth","bordaLateral","margins","valueLabelsFor","format","VOLTA","sliceAngles","endAngle","padAngle","startAngle","pie","comeco","arcPath","cornerRadius","innerRadius","outerRadius","arc","arcCentroid","raio","angulo","arcAnchor","angles","radius","centerTextRadius","fitCenterText","innerDiameter","disponivel","degraus","candidato","ALINHAMENTO","ChartLegend","entries","onToggle","swatch","lateral","conteudo","ChartFrame","centerOrigin","containerRef","fillHeight","legend","legendAlign","legendPosition","minLegendEntries","onToggleSeries","tituloId","legenda","DESLIZE","EixoComCalha","axis","gutter","dinamico","eixo","CartesianFrame","grid","linhas","curveOf","curve","curveMonotoneX","curveLinear","linePath","points","line","ponto","areaPath","bands","area","banda","roundedBarPath","x","y","radii","se","sd","ie","direita","ocupacao","fatia","groupSmallSlices","slices","threshold","pequena","pequenas","reunida","inserida","RAIO_PADRAO","raioDe","useChartMetrics","setMedida","medir","useHoveredBand","onHover","hovered","setHovered","useSeriesToggle","defaultHiddenSeries","hiddenSeries","onHiddenSeriesChange","internas","setInternas","ocultas","toggle","proximas","oculta","SERIES_TOKENS","seriesColors","quantidade","POSICAO_NA_PALETA","paletteWithAccent","accent","ocupada","INTENT_TOKENS","COR_COM_TEXTO_PROPRIO","LUMINANCIA_DE_EMPATE","luminanciaDoHexadecimal","cor","hexadecimal","canais","r","g","canal","textColorOn","color","luminancia","resolveSeriesColors","series","categoricas","serie","paleta","DURACAO","podeAnimar","suavizar","t","useTweenedNumbers","duration","valores","setValores","assumir","proximos","quadro","decorrido","fator","useSliceRing","defaultHiddenSlices","hiddenSlices","onHiddenSlicesChange","onHoverSlice","otherLabel","smallSliceThreshold","isHidden","reunidas","colors","animados","ChartBar","categories","formatValue","onHoverCategory","showDataLabels","stacked","alturaMedida","raioDoCanto","alturaDoDesenho","focarFaixa","faixaEmFoco","cores","presencas","dominio","visiveis","posicaoDaLegenda","rotulosDeValor","comprimentoCategorias","comprimentoValores","inicioDaFaixa","fimDaFaixa","escalaCategorias","escalaAlvo","minimo","maximo","escalaValores","marcasDeValor","vao","faixas","faixaDa","indiceSerie","espessuraDa","deslocamentoDa","contribuicao","indiceCategoria","pilhas","segmentoDa","cantosDa","pilha","extremo","ate","abre","fecha","rotuloAlemDaPonta","ponta","centro","negativo","marcasCategoria","categoria","marcasValor","eixoDeCategoria","eixoDeValor","inicioCategoria","de","tamanho","espessura","deslocamento","presentes","pontas","isolado","pontos","ChartLine","showDots","pontosPorSerie","descricao","AFASTAMENTO","MARGEM","somar","totalizar","operador","encaixar","cabeADireita","cabeAbaixo","ChartTooltip","computed","showTotal","subtitle","totalLabel","ponteiro","setPonteiro","visivel","esconder","acompanhar","Balao","no","quantidadeDeColunas","linha","colunas","calculada","colunaBase","baseDoTotal","calcular","formatarCalculada","celulas","indiceDaLinha","coluna","eixoDa","dominioDoEixo","arredondado","ChartCombo","formatRightValue","formatarDireita","temEixoDireito","dominioEsquerda","dominioDireita","esquerda","visibilidadeDireita","alvoEsquerda","alvoDireita","minEsquerda","maxEsquerda","minDireita","maxDireita","escalaEsquerda","escalaDireita","escalaDa","formatoDa","marcasEsquerda","marcasDireita","formatar","isolada","alturaDoZero","topo","fundo","ChartArea","gradienteId","ordem","faixasPorSerie","zero","contorno","RAIO_SEM_Z","FAIXA_DE_RAIO","zValido","ChartScatter","formatX","formatY","formatZ","guia","setGuia","zeroEmX","zeroEmY","dominioX","p","dominioY","maiorZ","parcial","rotulosY","rotulosX","alvoX","alvoY","minX","maxX","minY","maxY","escalaX","escalaY","escalaRaio","marcasX","marcasY","ticksX","ticksY","descrever","z","ChartPie","formatPercent","fracao","showLegendValues","sliceRadius","anel","canto","ChartDonut","centerLabel","showCenter","thickness","raioInterno","focada","ESPACO_ENTRE_ANEIS","PISO_DO_RAIO","emRadianos","graus","ChartRadial","defaultHiddenTracks","hiddenTracks","onHiddenTracksChange","trackRadius","tracks","valido","maiorValor","fracoes","meta","animadas","volta","raioExterno","destaque","valorDoCentro","piso","cabe","espessuraCabivel","folga","externo","interno","preenchido","trechosDe","steps","acumulado","intencaoDe","comSinal","ChartWaterfall","onHoverStep","focarPasso","passoEmFoco","escalaPassos","faixaDe","marcasPassos","rotuloDe","nivel","ChartTreemap","defaultHiddenGroups","gap","hiddenGroups","intentLabels","onHiddenGroupsChange","coresDeGrupo","semValor","hierarchy","retangulos","arvore","treemap","corDa","folha","ancestral","entradasDaLegenda","intencao","cabeORotulo","cabeOValor","ANGULO_MINIMO_DO_ROTULO","COMPRIMENTO_DO_CONECTOR","rotulosPorNivel","por","tomDoNivel","profundidade","clareamento","ChartSunburst","ringGap","showLabels","emFoco","setEmFoco","coresDeNivelZero","rotulosExternos","niveis","larguraDoRotulo","arcos","partition","profundidadeMaxima","arco","foco","aceso","corDe","raizDoRamo","descreverArco","angulos","xBorda","yBorda","xCotovelo","yCotovelo","paraDireita","xFim","seCruzam","uma","outra","sankeyCenter","sankeyJustify","sankeyLeft","sankeyRight","caminhoDa","ligacao","saida","chegada","meio","temCiclo","flows","saidas","fluxo","encerrados","noCaminho","alcanca","achou","ChartSankey","cyclicMessage","flowColor","flowValuePosition","nodeAlign","nodePadding","nodeWidth","showFlowValues","declarados","rotulos","source","origens","bandaDireita","ciclico","totalDoFluxo","grafo","util","sankey","corDoNo","descreverLigacao","classeDa","larguraDaEtapa","rotuloDoNo","rotulosDosNos","valorDa","posicoes","recuo","caixa"],"mappings":"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"}