@plenustech/design-system 0.2.3 → 0.2.5

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 (233) hide show
  1. package/README.md +8 -0
  2. package/dist/components/actions/ButtonTile/ButtonTile.module.css.cjs +1 -1
  3. package/dist/components/actions/ButtonTile/ButtonTile.module.css.js +10 -10
  4. package/dist/components/actions/Toolbar/Toolbar.cjs +1 -1
  5. package/dist/components/actions/Toolbar/Toolbar.cjs.map +1 -1
  6. package/dist/components/actions/Toolbar/Toolbar.js +64 -53
  7. package/dist/components/actions/Toolbar/Toolbar.js.map +1 -1
  8. package/dist/components/charts/ChartGauge/ChartGauge.cjs +2 -0
  9. package/dist/components/charts/ChartGauge/ChartGauge.cjs.map +1 -0
  10. package/dist/components/charts/ChartGauge/ChartGauge.js +307 -0
  11. package/dist/components/charts/ChartGauge/ChartGauge.js.map +1 -0
  12. package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs +2 -0
  13. package/dist/components/charts/ChartGauge/ChartGauge.module.css.cjs.map +1 -0
  14. package/dist/components/charts/ChartGauge/ChartGauge.module.css.js +76 -0
  15. package/dist/components/charts/ChartGauge/ChartGauge.module.css.js.map +1 -0
  16. package/dist/components/charts/ChartGauge/gaugeLayout.cjs +2 -0
  17. package/dist/components/charts/ChartGauge/gaugeLayout.cjs.map +1 -0
  18. package/dist/components/charts/ChartGauge/gaugeLayout.js +107 -0
  19. package/dist/components/charts/ChartGauge/gaugeLayout.js.map +1 -0
  20. package/dist/components/charts/ChartGauge/gaugeReading.cjs +2 -0
  21. package/dist/components/charts/ChartGauge/gaugeReading.cjs.map +1 -0
  22. package/dist/components/charts/ChartGauge/gaugeReading.js +112 -0
  23. package/dist/components/charts/ChartGauge/gaugeReading.js.map +1 -0
  24. package/dist/components/charts/ChartGauge/gaugeScale.cjs +2 -0
  25. package/dist/components/charts/ChartGauge/gaugeScale.cjs.map +1 -0
  26. package/dist/components/charts/ChartGauge/gaugeScale.js +57 -0
  27. package/dist/components/charts/ChartGauge/gaugeScale.js.map +1 -0
  28. package/dist/components/charts/ChartMap/ChartMap.cjs +2 -0
  29. package/dist/components/charts/ChartMap/ChartMap.cjs.map +1 -0
  30. package/dist/components/charts/ChartMap/ChartMap.js +523 -0
  31. package/dist/components/charts/ChartMap/ChartMap.js.map +1 -0
  32. package/dist/components/charts/ChartMap/ChartMap.module.css.cjs +2 -0
  33. package/dist/components/charts/ChartMap/ChartMap.module.css.cjs.map +1 -0
  34. package/dist/components/charts/ChartMap/ChartMap.module.css.js +124 -0
  35. package/dist/components/charts/ChartMap/ChartMap.module.css.js.map +1 -0
  36. package/dist/components/charts/ChartMap/ChartMapLegend.cjs +2 -0
  37. package/dist/components/charts/ChartMap/ChartMapLegend.cjs.map +1 -0
  38. package/dist/components/charts/ChartMap/ChartMapLegend.js +102 -0
  39. package/dist/components/charts/ChartMap/ChartMapLegend.js.map +1 -0
  40. package/dist/components/charts/ChartMap/ChartMapTable.cjs +2 -0
  41. package/dist/components/charts/ChartMap/ChartMapTable.cjs.map +1 -0
  42. package/dist/components/charts/ChartMap/ChartMapTable.js +118 -0
  43. package/dist/components/charts/ChartMap/ChartMapTable.js.map +1 -0
  44. package/dist/components/charts/ChartMap/mapGeometry.cjs +2 -0
  45. package/dist/components/charts/ChartMap/mapGeometry.cjs.map +1 -0
  46. package/dist/components/charts/ChartMap/mapGeometry.js +113 -0
  47. package/dist/components/charts/ChartMap/mapGeometry.js.map +1 -0
  48. package/dist/components/charts/ChartMap/mapLabels.cjs +2 -0
  49. package/dist/components/charts/ChartMap/mapLabels.cjs.map +1 -0
  50. package/dist/components/charts/ChartMap/mapLabels.js +80 -0
  51. package/dist/components/charts/ChartMap/mapLabels.js.map +1 -0
  52. package/dist/components/charts/ChartMap/mapScales.cjs +2 -0
  53. package/dist/components/charts/ChartMap/mapScales.cjs.map +1 -0
  54. package/dist/components/charts/ChartMap/mapScales.js +131 -0
  55. package/dist/components/charts/ChartMap/mapScales.js.map +1 -0
  56. package/dist/components/charts/ChartMap/polylabel.cjs +2 -0
  57. package/dist/components/charts/ChartMap/polylabel.cjs.map +1 -0
  58. package/dist/components/charts/ChartMap/polylabel.js +50 -0
  59. package/dist/components/charts/ChartMap/polylabel.js.map +1 -0
  60. package/dist/components/charts/ChartTimeline/ChartTimeline.cjs +2 -0
  61. package/dist/components/charts/ChartTimeline/ChartTimeline.cjs.map +1 -0
  62. package/dist/components/charts/ChartTimeline/ChartTimeline.js +703 -0
  63. package/dist/components/charts/ChartTimeline/ChartTimeline.js.map +1 -0
  64. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs +2 -0
  65. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.cjs.map +1 -0
  66. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js +124 -0
  67. package/dist/components/charts/ChartTimeline/ChartTimeline.module.css.js.map +1 -0
  68. package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs +2 -0
  69. package/dist/components/charts/ChartTimeline/ChartTimelineTable.cjs.map +1 -0
  70. package/dist/components/charts/ChartTimeline/ChartTimelineTable.js +42 -0
  71. package/dist/components/charts/ChartTimeline/ChartTimelineTable.js.map +1 -0
  72. package/dist/components/charts/ChartTimeline/timelineLayout.cjs +2 -0
  73. package/dist/components/charts/ChartTimeline/timelineLayout.cjs.map +1 -0
  74. package/dist/components/charts/ChartTimeline/timelineLayout.js +109 -0
  75. package/dist/components/charts/ChartTimeline/timelineLayout.js.map +1 -0
  76. package/dist/components/charts/ChartTimeline/timelineTime.cjs +2 -0
  77. package/dist/components/charts/ChartTimeline/timelineTime.cjs.map +1 -0
  78. package/dist/components/charts/ChartTimeline/timelineTime.js +91 -0
  79. package/dist/components/charts/ChartTimeline/timelineTime.js.map +1 -0
  80. package/dist/components/charts/ChartTimeline/timelineTooltip.cjs +2 -0
  81. package/dist/components/charts/ChartTimeline/timelineTooltip.cjs.map +1 -0
  82. package/dist/components/charts/ChartTimeline/timelineTooltip.js +77 -0
  83. package/dist/components/charts/ChartTimeline/timelineTooltip.js.map +1 -0
  84. package/dist/components/charts/core/ChartLegend.cjs +1 -1
  85. package/dist/components/charts/core/ChartLegend.cjs.map +1 -1
  86. package/dist/components/charts/core/ChartLegend.js +37 -25
  87. package/dist/components/charts/core/ChartLegend.js.map +1 -1
  88. package/dist/components/charts/core/useChartMetrics.cjs +1 -1
  89. package/dist/components/charts/core/useChartMetrics.cjs.map +1 -1
  90. package/dist/components/charts/core/useChartMetrics.js +20 -25
  91. package/dist/components/charts/core/useChartMetrics.js.map +1 -1
  92. package/dist/components/data-display/CodeBlock/syntax.cjs +10 -3
  93. package/dist/components/data-display/CodeBlock/syntax.cjs.map +1 -1
  94. package/dist/components/data-display/CodeBlock/syntax.js +68 -48
  95. package/dist/components/data-display/CodeBlock/syntax.js.map +1 -1
  96. package/dist/components/data-display/List/List.cjs.map +1 -1
  97. package/dist/components/data-display/List/List.js.map +1 -1
  98. package/dist/components/data-display/List/List.module.css.cjs +1 -1
  99. package/dist/components/data-display/List/List.module.css.js +34 -24
  100. package/dist/components/data-display/List/List.module.css.js.map +1 -1
  101. package/dist/components/data-display/List/ListingOptions.cjs +1 -1
  102. package/dist/components/data-display/List/ListingOptions.cjs.map +1 -1
  103. package/dist/components/data-display/List/ListingOptions.js +98 -74
  104. package/dist/components/data-display/List/ListingOptions.js.map +1 -1
  105. package/dist/components/data-display/List/useListing.cjs.map +1 -1
  106. package/dist/components/data-display/List/useListing.js.map +1 -1
  107. package/dist/components/data-display/Timeline/Timeline.cjs +1 -1
  108. package/dist/components/data-display/Timeline/Timeline.cjs.map +1 -1
  109. package/dist/components/data-display/Timeline/Timeline.js +6 -6
  110. package/dist/components/data-display/Timeline/Timeline.js.map +1 -1
  111. package/dist/components/data-display/Timeline/Timeline.module.css.cjs +1 -1
  112. package/dist/components/data-display/Timeline/Timeline.module.css.js +18 -16
  113. package/dist/components/data-display/Timeline/Timeline.module.css.js.map +1 -1
  114. package/dist/components/forms/Checkbox/Checkbox.module.css.cjs +1 -1
  115. package/dist/components/forms/Checkbox/Checkbox.module.css.js +5 -5
  116. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.cjs +1 -1
  117. package/dist/components/forms/CheckboxGroup/CheckboxGroup.module.css.js +1 -1
  118. package/dist/components/forms/ComboBox/ComboBox.cjs.map +1 -1
  119. package/dist/components/forms/ComboBox/ComboBox.js.map +1 -1
  120. package/dist/components/forms/Field/Field.cjs +1 -1
  121. package/dist/components/forms/Field/Field.cjs.map +1 -1
  122. package/dist/components/forms/Field/Field.js +22 -22
  123. package/dist/components/forms/Field/Field.js.map +1 -1
  124. package/dist/components/forms/Field/Field.module.css.cjs +1 -1
  125. package/dist/components/forms/Field/Field.module.css.js +19 -17
  126. package/dist/components/forms/Field/Field.module.css.js.map +1 -1
  127. package/dist/components/forms/InputText/InputText.cjs +1 -1
  128. package/dist/components/forms/InputText/InputText.cjs.map +1 -1
  129. package/dist/components/forms/InputText/InputText.js +24 -24
  130. package/dist/components/forms/InputText/InputText.js.map +1 -1
  131. package/dist/components/forms/InputText/InputText.module.css.cjs +1 -1
  132. package/dist/components/forms/InputText/InputText.module.css.js +9 -7
  133. package/dist/components/forms/InputText/InputText.module.css.js.map +1 -1
  134. package/dist/components/forms/RadioGroup/RadioGroup.module.css.cjs +1 -1
  135. package/dist/components/forms/RadioGroup/RadioGroup.module.css.js +4 -4
  136. package/dist/components/forms/Select/Select.cjs.map +1 -1
  137. package/dist/components/forms/Select/Select.js.map +1 -1
  138. package/dist/components/forms/Switch/Switch.module.css.cjs +1 -1
  139. package/dist/components/forms/Switch/Switch.module.css.js +6 -6
  140. package/dist/components/icons/suite.cjs +1 -0
  141. package/dist/components/icons/suite.js +10894 -0
  142. package/dist/components/navigation/Pagination/Pagination.cjs +1 -1
  143. package/dist/components/navigation/Pagination/Pagination.cjs.map +1 -1
  144. package/dist/components/navigation/Pagination/Pagination.js +71 -44
  145. package/dist/components/navigation/Pagination/Pagination.js.map +1 -1
  146. package/dist/components/navigation/Pagination/Pagination.module.css.cjs +1 -1
  147. package/dist/components/navigation/Pagination/Pagination.module.css.js +18 -14
  148. package/dist/components/navigation/Pagination/Pagination.module.css.js.map +1 -1
  149. package/dist/components/navigation/TabsNav/TabsNav.cjs +2 -0
  150. package/dist/components/navigation/TabsNav/TabsNav.cjs.map +1 -0
  151. package/dist/components/navigation/TabsNav/TabsNav.js +21 -0
  152. package/dist/components/navigation/TabsNav/TabsNav.js.map +1 -0
  153. package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs +2 -0
  154. package/dist/components/navigation/TabsNav/TabsNav.module.css.cjs.map +1 -0
  155. package/dist/components/navigation/TabsNav/TabsNav.module.css.js +18 -0
  156. package/dist/components/navigation/TabsNav/TabsNav.module.css.js.map +1 -0
  157. package/dist/components/overlays/Dialog/Dialog.cjs.map +1 -1
  158. package/dist/components/overlays/Dialog/Dialog.js.map +1 -1
  159. package/dist/components/overlays/Dialog/DialogFrame.cjs +1 -1
  160. package/dist/components/overlays/Dialog/DialogFrame.cjs.map +1 -1
  161. package/dist/components/overlays/Dialog/DialogFrame.js +30 -30
  162. package/dist/components/overlays/Dialog/DialogFrame.js.map +1 -1
  163. package/dist/components/overlays/Drawer/Drawer.cjs.map +1 -1
  164. package/dist/components/overlays/Drawer/Drawer.js.map +1 -1
  165. package/dist/components/overlays/Menu/Menu.cjs +1 -1
  166. package/dist/components/overlays/Menu/Menu.cjs.map +1 -1
  167. package/dist/components/overlays/Menu/Menu.js +37 -36
  168. package/dist/components/overlays/Menu/Menu.js.map +1 -1
  169. package/dist/components/overlays/Menu/keyShortcuts.cjs +2 -0
  170. package/dist/components/overlays/Menu/keyShortcuts.cjs.map +1 -0
  171. package/dist/components/overlays/Menu/keyShortcuts.js +55 -0
  172. package/dist/components/overlays/Menu/keyShortcuts.js.map +1 -0
  173. package/dist/components/overlays/Tooltip/Tooltip.cjs +1 -1
  174. package/dist/components/overlays/Tooltip/Tooltip.cjs.map +1 -1
  175. package/dist/components/overlays/Tooltip/Tooltip.js +81 -56
  176. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  177. package/dist/design-system.css +1 -1
  178. package/dist/icons.cjs +2 -0
  179. package/dist/icons.cjs.map +1 -0
  180. package/dist/icons.js +2054 -0
  181. package/dist/icons.js.map +1 -0
  182. package/dist/index.cjs +1 -1
  183. package/dist/index.js +184 -174
  184. package/dist/index.js.map +1 -1
  185. package/dist/types/components/charts/ChartGauge/ChartGauge.d.ts +83 -0
  186. package/dist/types/components/charts/ChartGauge/gaugeLayout.d.ts +64 -0
  187. package/dist/types/components/charts/ChartGauge/gaugeReading.d.ts +97 -0
  188. package/dist/types/components/charts/ChartGauge/gaugeScale.d.ts +38 -0
  189. package/dist/types/components/charts/ChartGauge/index.d.ts +2 -0
  190. package/dist/types/components/charts/ChartMap/ChartMap.d.ts +104 -0
  191. package/dist/types/components/charts/ChartMap/ChartMapLegend.d.ts +44 -0
  192. package/dist/types/components/charts/ChartMap/ChartMapTable.d.ts +38 -0
  193. package/dist/types/components/charts/ChartMap/index.d.ts +4 -0
  194. package/dist/types/components/charts/ChartMap/mapGeometry.d.ts +56 -0
  195. package/dist/types/components/charts/ChartMap/mapLabels.d.ts +51 -0
  196. package/dist/types/components/charts/ChartMap/mapScales.d.ts +76 -0
  197. package/dist/types/components/charts/ChartMap/polylabel.d.ts +9 -0
  198. package/dist/types/components/charts/ChartTimeline/ChartTimeline.d.ts +137 -0
  199. package/dist/types/components/charts/ChartTimeline/ChartTimelineTable.d.ts +25 -0
  200. package/dist/types/components/charts/ChartTimeline/index.d.ts +2 -0
  201. package/dist/types/components/charts/ChartTimeline/timelineLayout.d.ts +70 -0
  202. package/dist/types/components/charts/ChartTimeline/timelineTime.d.ts +16 -0
  203. package/dist/types/components/charts/ChartTimeline/timelineTooltip.d.ts +45 -0
  204. package/dist/types/components/charts/core/ChartLegend.d.ts +3 -1
  205. package/dist/types/components/data-display/CodeBlock/syntax.d.ts +1 -1
  206. package/dist/types/components/data-display/List/List.d.ts +1 -1
  207. package/dist/types/components/data-display/List/useListing.d.ts +7 -1
  208. package/dist/types/components/data-display/Timeline/Timeline.d.ts +4 -1
  209. package/dist/types/components/data-display/Timeline/index.d.ts +1 -1
  210. package/dist/types/components/forms/ComboBox/ComboBox.d.ts +7 -1
  211. package/dist/types/components/forms/Field/Field.d.ts +1 -1
  212. package/dist/types/components/forms/InputText/InputText.d.ts +1 -1
  213. package/dist/types/components/forms/Select/Select.d.ts +5 -1
  214. package/dist/types/components/icons/suite.d.ts +2051 -0
  215. package/dist/types/components/navigation/Pagination/Pagination.d.ts +13 -1
  216. package/dist/types/components/navigation/Pagination/index.d.ts +1 -1
  217. package/dist/types/components/navigation/TabsNav/TabsNav.d.ts +20 -0
  218. package/dist/types/components/navigation/TabsNav/index.d.ts +2 -0
  219. package/dist/types/components/overlays/Dialog/Dialog.d.ts +19 -7
  220. package/dist/types/components/overlays/Dialog/DialogFrame.d.ts +8 -2
  221. package/dist/types/components/overlays/Drawer/Drawer.d.ts +2 -2
  222. package/dist/types/components/overlays/Menu/Menu.d.ts +3 -1
  223. package/dist/types/components/overlays/Menu/keyShortcuts.d.ts +2 -0
  224. package/dist/types/components/overlays/Tooltip/Tooltip.d.ts +26 -5
  225. package/dist/types/icons.d.ts +6 -0
  226. package/dist/types/index.d.ts +11 -3
  227. package/dist/types/utils/formatters/formatarDuracao.d.ts +5 -0
  228. package/dist/types/utils/formatters/index.d.ts +1 -0
  229. package/dist/utils/formatters/formatarDuracao.cjs +2 -0
  230. package/dist/utils/formatters/formatarDuracao.cjs.map +1 -0
  231. package/dist/utils/formatters/formatarDuracao.js +10 -0
  232. package/dist/utils/formatters/formatarDuracao.js.map +1 -0
  233. package/package.json +10 -1
package/README.md CHANGED
@@ -92,6 +92,14 @@ import '@plenustech/design-system/reset.css';
92
92
 
93
93
  Uma aplicação nova ganha a aparência completa do sistema importando as duas. Uma aplicação existente, que já tem a própria base, importa apenas a primeira: os componentes não dependem do reset.
94
94
 
95
+ ### Ícones
96
+
97
+ Os ícones de interface vêm do ponto de entrada principal. A suíte completa do Bootstrap Icons, com os 2.050 desenhos pelo nome de cada um, tem entrada própria, e o bundle leva só os importados:
98
+
99
+ ```tsx
100
+ import { IconFolder, IconTruck } from '@plenustech/design-system/icons';
101
+ ```
102
+
95
103
  ### Fontes
96
104
 
97
105
  Os componentes usam três famílias, nos pesos definidos em [TOKENS-REFERENCE-TYPOGRAPHY.md](TOKENS-REFERENCE-TYPOGRAPHY.md): Poppins 600, Montserrat 400 e 600 e JetBrains Mono 500.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="_tile_yper1_2",l="_sm_yper1_24",t="_md_yper1_32",_="_icon_yper1_40",s="_label_yper1_54",o={tile:e,sm:l,md:t,icon:_,label:s};exports.default=o;exports.icon=_;exports.label=s;exports.md=t;exports.sm=l;exports.tile=e;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e="_tile_1xvjy_2",l="_sm_1xvjy_24",t="_md_1xvjy_32",_="_icon_1xvjy_40",s="_label_1xvjy_54",o={tile:e,sm:l,md:t,icon:_,label:s};exports.default=o;exports.icon=_;exports.label=s;exports.md=t;exports.sm=l;exports.tile=e;
2
2
  //# sourceMappingURL=ButtonTile.module.css.cjs.map
@@ -1,16 +1,16 @@
1
- const _ = "_tile_yper1_2", e = "_sm_yper1_24", s = "_md_yper1_32", t = "_icon_yper1_40", l = "_label_yper1_54", o = {
1
+ const _ = "_tile_1xvjy_2", s = "_sm_1xvjy_24", t = "_md_1xvjy_32", l = "_icon_1xvjy_40", o = "_label_1xvjy_54", c = {
2
2
  tile: _,
3
- sm: e,
4
- md: s,
5
- icon: t,
6
- label: l
3
+ sm: s,
4
+ md: t,
5
+ icon: l,
6
+ label: o
7
7
  };
8
8
  export {
9
- o as default,
10
- t as icon,
11
- l as label,
12
- s as md,
13
- e as sm,
9
+ c as default,
10
+ l as icon,
11
+ o as label,
12
+ t as md,
13
+ s as sm,
14
14
  _ as tile
15
15
  };
16
16
  //# sourceMappingURL=ButtonTile.module.css.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const g=require("react/jsx-runtime"),m=require("react"),M=require("react-dom"),S=require("@react-aria/overlays"),h=require("../../../hooks/useMergedRefs.cjs"),i=require("./Toolbar.module.css.cjs"),D="button, a[href], input, select, textarea, [tabindex]",N='input:not([type="checkbox"]), textarea, select, [contenteditable="true"]',w=8;function p(e){return[...e.querySelectorAll(D)].filter(o=>!o.matches(":disabled"))}function T(e,o){const r=e.find(a=>a===o)??e[0];e.forEach(a=>{a.tabIndex=a===r?0:-1})}function E(e,o,r,a){const l=a==="vertical"?"ArrowDown":"ArrowRight",s=a==="vertical"?"ArrowUp":"ArrowLeft";return e===l?(o+1)%r:e===s?(o-1+r)%r:e==="Home"?0:e==="End"?r-1:void 0}function v({anchorRef:e,placement:o="top start",...r}){return e?typeof document>"u"?null:M.createPortal(g.jsx(k,{...r,anchorRef:e,placement:o}),document.body):g.jsx(A,{...r})}function k({anchorRef:e,placement:o,ref:r,style:a,...l}){const s=m.useRef(null),f=h.useMergedRefs(s,r),{overlayProps:d}=S.useOverlayPosition({targetRef:e,overlayRef:s,placement:o,offset:w,isOpen:!0});return g.jsx(A,{...l,ref:f,anchored:!0,"data-react-aria-top-layer":"true",style:{...a,...d.style}})}function A({anchored:e=!1,appearance:o="floating",children:r,className:a,label:l,onFocus:s,onKeyDown:f,orientation:d="horizontal",ref:R,sticky:j=!1,...q}){const x=m.useRef(null),O=h.useMergedRefs(x,R),y=m.useRef(null);m.useLayoutEffect(()=>{const t=x.current,n=()=>T(p(t),y.current);n();const u=new MutationObserver(n);return u.observe(t,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["disabled"]}),()=>u.disconnect()},[]);function P(t){var b;s==null||s(t);const n=p(t.currentTarget);if(t.target===t.currentTarget){(b=n.find(c=>c.tabIndex===0)??n[0])==null||b.focus();return}const u=n.find(c=>c===t.target);u&&(y.current=u,T(n,u))}function I(t){f==null||f(t);const n=t.target;if(t.defaultPrevented||n.matches(N))return;const u=p(t.currentTarget),b=u.indexOf(n),c=b===-1?void 0:E(t.key,b,u.length,d);c!==void 0&&(t.preventDefault(),u[c].focus())}return g.jsx("div",{...q,ref:O,"aria-label":l,"aria-orientation":d,className:[i.default.toolbar,i.default[d],i.default[o],j&&!e&&i.default.sticky,e&&i.default.anchored,a].filter(Boolean).join(" "),onFocus:P,onKeyDown:I,role:"toolbar",tabIndex:-1,children:r})}function B({className:e,label:o,...r}){return g.jsx("div",{...r,"aria-label":o,className:[i.default.group,e].filter(Boolean).join(" "),role:"group"})}v.Group=B;exports.Toolbar=v;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const y=require("react/jsx-runtime"),v=require("react"),S=require("react-dom"),I=require("@react-aria/overlays"),w=require("../../../hooks/useMergedRefs.cjs"),l=require("./Toolbar.module.css.cjs"),M="button, a[href], input, select, textarea, [tabindex]",N='input:not([type="checkbox"]), textarea, select, [contenteditable="true"]',O=8;function A(e){return[...e.querySelectorAll(M)].filter(o=>!o.matches(":disabled"))}function h(e,o){const r=e.find(n=>n===o)??e[0];e.forEach(n=>{n.tabIndex=n===r?0:-1})}function D(e,o,r,n){const f=n==="vertical"?"ArrowDown":"ArrowRight",c=n==="vertical"?"ArrowUp":"ArrowLeft";return e===f?(o+1)%r:e===c?(o-1+r)%r:e==="Home"?0:e==="End"?r-1:void 0}function j({anchorRef:e,placement:o="top start",...r}){return e?typeof document>"u"?null:S.createPortal(y.jsx(L,{...r,anchorRef:e,placement:o}),document.body):y.jsx(P,{...r})}function L({anchorRef:e,placement:o,ref:r,style:n,...f}){const c=v.useRef(null),d=w.useMergedRefs(c,r),{overlayProps:b,updatePosition:g}=I.useOverlayPosition({targetRef:e,overlayRef:c,placement:o,offset:O,isOpen:!0});return v.useEffect(()=>{const p=e.current;if(!p)return;function x(T){T.target instanceof Node&&T.target.contains(p)&&g()}const s=typeof ResizeObserver>"u"?void 0:new ResizeObserver(()=>g());return s==null||s.observe(p),window.addEventListener("scroll",x,{capture:!0,passive:!0}),()=>{s==null||s.disconnect(),window.removeEventListener("scroll",x,{capture:!0})}},[e,e.current,g]),y.jsx(P,{...f,ref:d,anchored:!0,"data-react-aria-top-layer":"true",style:{...n,...b.style}})}function P({anchored:e=!1,appearance:o="floating",children:r,className:n,label:f,onFocus:c,onKeyDown:d,orientation:b="horizontal",ref:g,sticky:p=!1,...x}){const s=v.useRef(null),T=w.useMergedRefs(s,g),R=v.useRef(null);v.useLayoutEffect(()=>{const t=s.current,a=()=>h(A(t),R.current);a();const u=new MutationObserver(a);return u.observe(t,{subtree:!0,childList:!0,attributes:!0,attributeFilter:["disabled"]}),()=>u.disconnect()},[]);function q(t){var m;c==null||c(t);const a=A(t.currentTarget);if(t.target===t.currentTarget){(m=a.find(i=>i.tabIndex===0)??a[0])==null||m.focus();return}const u=a.find(i=>i===t.target);u&&(R.current=u,h(a,u))}function E(t){d==null||d(t);const a=t.target;if(t.defaultPrevented||a.matches(N))return;const u=A(t.currentTarget),m=u.indexOf(a),i=m===-1?void 0:D(t.key,m,u.length,b);i!==void 0&&(t.preventDefault(),u[i].focus())}return y.jsx("div",{...x,ref:T,"aria-label":f,"aria-orientation":b,className:[l.default.toolbar,l.default[b],l.default[o],p&&!e&&l.default.sticky,e&&l.default.anchored,n].filter(Boolean).join(" "),onFocus:q,onKeyDown:E,role:"toolbar",tabIndex:-1,children:r})}function k({className:e,label:o,...r}){return y.jsx("div",{...r,"aria-label":o,className:[l.default.group,e].filter(Boolean).join(" "),role:"group"})}j.Group=k;exports.Toolbar=j;
2
2
  //# sourceMappingURL=Toolbar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.cjs","sources":["../../../../src/components/actions/Toolbar/Toolbar.tsx"],"sourcesContent":["import {\n useLayoutEffect,\n useRef,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport type { PopoverPlacement } from '../../overlays/Popover';\nimport styles from './Toolbar.module.css';\n\nexport type ToolbarOrientation = 'horizontal' | 'vertical';\nexport type ToolbarAppearance = 'floating' | 'flat';\nexport type ToolbarPlacement = PopoverPlacement;\n\nexport interface ToolbarProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n /** A barra flutua ancorada a este elemento, num portal, sem tirar o foco de quem o tem. */\n anchorRef?: RefObject<HTMLElement | null>;\n appearance?: ToolbarAppearance;\n children: ReactNode;\n label: string;\n orientation?: ToolbarOrientation;\n placement?: ToolbarPlacement;\n /** Gruda a barra no topo da área que rola. Vale para a barra no fluxo, sem `anchorRef`. */\n sticky?: boolean;\n}\n\nconst ITENS = 'button, a[href], input, select, textarea, [tabindex]';\n// Campos que usam as setas para si mesmos: nelas, a barra não toma a tecla.\nconst CAMPOS = 'input:not([type=\"checkbox\"]), textarea, select, [contenteditable=\"true\"]';\nconst DISTANCIA_DA_ANCORA = 8;\n\nfunction itensDe(barra: HTMLElement) {\n return [...barra.querySelectorAll<HTMLElement>(ITENS)].filter((item) => !item.matches(':disabled'));\n}\n\nfunction marcarParada(itens: readonly HTMLElement[], ativo: HTMLElement | null) {\n const parada = itens.find((item) => item === ativo) ?? itens[0];\n itens.forEach((item) => {\n item.tabIndex = item === parada ? 0 : -1;\n });\n}\n\nfunction destinoDaTecla(tecla: string, atual: number, total: number, orientation: ToolbarOrientation) {\n const avancar = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const voltar = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (tecla === avancar) {\n return (atual + 1) % total;\n }\n\n if (tecla === voltar) {\n return (atual - 1 + total) % total;\n }\n\n if (tecla === 'Home') {\n return 0;\n }\n\n return tecla === 'End' ? total - 1 : undefined;\n}\n\nexport function Toolbar({ anchorRef, placement = 'top start', ...props }: ToolbarProps) {\n if (!anchorRef) {\n return <ToolbarBar {...props} />;\n }\n\n // No servidor não há `document` para o portal; a barra ancorada nasce na hidratação.\n if (typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<AnchoredToolbar {...props} anchorRef={anchorRef} placement={placement} />, document.body);\n}\n\nfunction AnchoredToolbar({\n anchorRef,\n placement,\n ref: refDoConsumidor,\n style,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchorRef: RefObject<HTMLElement | null>; placement: ToolbarPlacement }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const { overlayProps } = useOverlayPosition({\n targetRef: anchorRef,\n overlayRef: ref,\n placement,\n offset: DISTANCIA_DA_ANCORA,\n isOpen: true,\n });\n\n // Sem FocusScope: a barra aparece sobre o bloco e o cursor continua no texto.\n return (\n <ToolbarBar\n {...props}\n ref={mergedRef}\n anchored\n data-react-aria-top-layer=\"true\"\n style={{ ...style, ...overlayProps.style }}\n />\n );\n}\n\nfunction ToolbarBar({\n anchored = false,\n appearance = 'floating',\n children,\n className,\n label,\n onFocus,\n onKeyDown,\n orientation = 'horizontal',\n ref: refDoConsumidor,\n sticky = false,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchored?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const ativo = useRef<HTMLElement | null>(null);\n\n // Uma só parada de Tab: o item ativo. Itens que entram, saem ou se desabilitam refazem a marcação.\n useLayoutEffect(() => {\n const barra = ref.current!;\n const remarcar = () => marcarParada(itensDe(barra), ativo.current);\n\n remarcar();\n const observador = new MutationObserver(remarcar);\n observador.observe(barra, { subtree: true, childList: true, attributes: true, attributeFilter: ['disabled'] });\n\n return () => observador.disconnect();\n }, []);\n\n function handleFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n const itens = itensDe(event.currentTarget);\n\n // Focar a própria barra, como num atalho do produto, leva ao item ativo.\n if (event.target === event.currentTarget) {\n (itens.find((item) => item.tabIndex === 0) ?? itens[0])?.focus();\n return;\n }\n\n const item = itens.find((candidato) => candidato === event.target);\n if (item) {\n ativo.current = item;\n marcarParada(itens, item);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const alvo = event.target as HTMLElement;\n\n if (event.defaultPrevented || alvo.matches(CAMPOS)) {\n return;\n }\n\n const itens = itensDe(event.currentTarget);\n const atual = itens.indexOf(alvo);\n const destino = atual === -1 ? undefined : destinoDaTecla(event.key, atual, itens.length, orientation);\n\n if (destino === undefined) {\n return;\n }\n\n event.preventDefault();\n itens[destino]!.focus();\n }\n\n return (\n <div\n {...props}\n ref={mergedRef}\n aria-label={label}\n aria-orientation={orientation}\n className={[\n styles.toolbar,\n styles[orientation],\n styles[appearance],\n sticky && !anchored && styles.sticky,\n anchored && styles.anchored,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n role=\"toolbar\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n children: ReactNode;\n /** Nome do grupo, quando os botões dele formam um conjunto, como os alinhamentos. */\n label?: string;\n}\n\nfunction ToolbarGroup({ className, label, ...props }: ToolbarGroupProps) {\n return <div {...props} aria-label={label} className={[styles.group, className].filter(Boolean).join(' ')} role=\"group\" />;\n}\n\nToolbar.Group = ToolbarGroup;\n"],"names":["ITENS","CAMPOS","DISTANCIA_DA_ANCORA","itensDe","barra","item","marcarParada","itens","ativo","parada","destinoDaTecla","tecla","atual","total","orientation","avancar","voltar","Toolbar","anchorRef","placement","props","createPortal","AnchoredToolbar","jsx","ToolbarBar","refDoConsumidor","style","ref","useRef","mergedRef","useMergedRefs","overlayProps","useOverlayPosition","anchored","appearance","children","className","label","onFocus","onKeyDown","sticky","useLayoutEffect","remarcar","observador","handleFocus","event","_a","candidato","handleKeyDown","alvo","destino","styles","ToolbarGroup"],"mappings":"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"}
1
+ {"version":3,"file":"Toolbar.cjs","sources":["../../../../src/components/actions/Toolbar/Toolbar.tsx"],"sourcesContent":["import {\n useEffect,\n useLayoutEffect,\n useRef,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport type { PopoverPlacement } from '../../overlays/Popover';\nimport styles from './Toolbar.module.css';\n\nexport type ToolbarOrientation = 'horizontal' | 'vertical';\nexport type ToolbarAppearance = 'floating' | 'flat';\nexport type ToolbarPlacement = PopoverPlacement;\n\nexport interface ToolbarProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n /** A barra flutua ancorada a este elemento, num portal, sem tirar o foco de quem o tem. */\n anchorRef?: RefObject<HTMLElement | null>;\n appearance?: ToolbarAppearance;\n children: ReactNode;\n label: string;\n orientation?: ToolbarOrientation;\n placement?: ToolbarPlacement;\n /** Gruda a barra no topo da área que rola. Vale para a barra no fluxo, sem `anchorRef`. */\n sticky?: boolean;\n}\n\nconst ITENS = 'button, a[href], input, select, textarea, [tabindex]';\n// Campos que usam as setas para si mesmos: nelas, a barra não toma a tecla.\nconst CAMPOS = 'input:not([type=\"checkbox\"]), textarea, select, [contenteditable=\"true\"]';\nconst DISTANCIA_DA_ANCORA = 8;\n\nfunction itensDe(barra: HTMLElement) {\n return [...barra.querySelectorAll<HTMLElement>(ITENS)].filter((item) => !item.matches(':disabled'));\n}\n\nfunction marcarParada(itens: readonly HTMLElement[], ativo: HTMLElement | null) {\n const parada = itens.find((item) => item === ativo) ?? itens[0];\n itens.forEach((item) => {\n item.tabIndex = item === parada ? 0 : -1;\n });\n}\n\nfunction destinoDaTecla(tecla: string, atual: number, total: number, orientation: ToolbarOrientation) {\n const avancar = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const voltar = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (tecla === avancar) {\n return (atual + 1) % total;\n }\n\n if (tecla === voltar) {\n return (atual - 1 + total) % total;\n }\n\n if (tecla === 'Home') {\n return 0;\n }\n\n return tecla === 'End' ? total - 1 : undefined;\n}\n\nexport function Toolbar({ anchorRef, placement = 'top start', ...props }: ToolbarProps) {\n if (!anchorRef) {\n return <ToolbarBar {...props} />;\n }\n\n // No servidor não há `document` para o portal; a barra ancorada nasce na hidratação.\n if (typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<AnchoredToolbar {...props} anchorRef={anchorRef} placement={placement} />, document.body);\n}\n\nfunction AnchoredToolbar({\n anchorRef,\n placement,\n ref: refDoConsumidor,\n style,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchorRef: RefObject<HTMLElement | null>; placement: ToolbarPlacement }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const { overlayProps, updatePosition } = useOverlayPosition({\n targetRef: anchorRef,\n overlayRef: ref,\n placement,\n offset: DISTANCIA_DA_ANCORA,\n isOpen: true,\n });\n\n // O posicionamento não refaz a conta quando rola um contêiner da âncora e só observa o tamanho da âncora da montagem.\n // Aqui, a barra acompanha as duas coisas, também na âncora trocada depois, como o bloco selecionado de um editor.\n useEffect(() => {\n const anchor = anchorRef.current;\n\n if (!anchor) {\n return;\n }\n\n function followScroll(event: Event) {\n if (event.target instanceof Node && event.target.contains(anchor)) {\n updatePosition();\n }\n }\n\n const resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(() => updatePosition());\n resizeObserver?.observe(anchor);\n window.addEventListener('scroll', followScroll, { capture: true, passive: true });\n\n return () => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', followScroll, { capture: true });\n };\n }, [anchorRef, anchorRef.current, updatePosition]);\n\n // Sem FocusScope: a barra aparece sobre o bloco e o cursor continua no texto.\n return (\n <ToolbarBar\n {...props}\n ref={mergedRef}\n anchored\n data-react-aria-top-layer=\"true\"\n style={{ ...style, ...overlayProps.style }}\n />\n );\n}\n\nfunction ToolbarBar({\n anchored = false,\n appearance = 'floating',\n children,\n className,\n label,\n onFocus,\n onKeyDown,\n orientation = 'horizontal',\n ref: refDoConsumidor,\n sticky = false,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchored?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const ativo = useRef<HTMLElement | null>(null);\n\n // Uma só parada de Tab: o item ativo. Itens que entram, saem ou se desabilitam refazem a marcação.\n useLayoutEffect(() => {\n const barra = ref.current!;\n const remarcar = () => marcarParada(itensDe(barra), ativo.current);\n\n remarcar();\n const observador = new MutationObserver(remarcar);\n observador.observe(barra, { subtree: true, childList: true, attributes: true, attributeFilter: ['disabled'] });\n\n return () => observador.disconnect();\n }, []);\n\n function handleFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n const itens = itensDe(event.currentTarget);\n\n // Focar a própria barra, como num atalho do produto, leva ao item ativo.\n if (event.target === event.currentTarget) {\n (itens.find((item) => item.tabIndex === 0) ?? itens[0])?.focus();\n return;\n }\n\n const item = itens.find((candidato) => candidato === event.target);\n if (item) {\n ativo.current = item;\n marcarParada(itens, item);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const alvo = event.target as HTMLElement;\n\n if (event.defaultPrevented || alvo.matches(CAMPOS)) {\n return;\n }\n\n const itens = itensDe(event.currentTarget);\n const atual = itens.indexOf(alvo);\n const destino = atual === -1 ? undefined : destinoDaTecla(event.key, atual, itens.length, orientation);\n\n if (destino === undefined) {\n return;\n }\n\n event.preventDefault();\n itens[destino]!.focus();\n }\n\n return (\n <div\n {...props}\n ref={mergedRef}\n aria-label={label}\n aria-orientation={orientation}\n className={[\n styles.toolbar,\n styles[orientation],\n styles[appearance],\n sticky && !anchored && styles.sticky,\n anchored && styles.anchored,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n role=\"toolbar\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n children: ReactNode;\n /** Nome do grupo, quando os botões dele formam um conjunto, como os alinhamentos. */\n label?: string;\n}\n\nfunction ToolbarGroup({ className, label, ...props }: ToolbarGroupProps) {\n return <div {...props} aria-label={label} className={[styles.group, className].filter(Boolean).join(' ')} role=\"group\" />;\n}\n\nToolbar.Group = ToolbarGroup;\n"],"names":["ITENS","CAMPOS","DISTANCIA_DA_ANCORA","itensDe","barra","item","marcarParada","itens","ativo","parada","destinoDaTecla","tecla","atual","total","orientation","avancar","voltar","Toolbar","anchorRef","placement","props","createPortal","AnchoredToolbar","jsx","ToolbarBar","refDoConsumidor","style","ref","useRef","mergedRef","useMergedRefs","overlayProps","updatePosition","useOverlayPosition","useEffect","anchor","followScroll","event","resizeObserver","anchored","appearance","children","className","label","onFocus","onKeyDown","sticky","useLayoutEffect","remarcar","observador","handleFocus","_a","candidato","handleKeyDown","alvo","destino","styles","ToolbarGroup"],"mappings":"qRAgCMA,EAAQ,uDAERC,EAAS,2EACTC,EAAsB,EAE5B,SAASC,EAAQC,EAAoB,CACnC,MAAO,CAAC,GAAGA,EAAM,iBAA8BJ,CAAK,CAAC,EAAE,OAAQK,GAAS,CAACA,EAAK,QAAQ,WAAW,CAAC,CACpG,CAEA,SAASC,EAAaC,EAA+BC,EAA2B,CAC9E,MAAMC,EAASF,EAAM,KAAMF,GAASA,IAASG,CAAK,GAAKD,EAAM,CAAC,EAC9DA,EAAM,QAASF,GAAS,CACtBA,EAAK,SAAWA,IAASI,EAAS,EAAI,EACxC,CAAC,CACH,CAEA,SAASC,EAAeC,EAAeC,EAAeC,EAAeC,EAAiC,CACpG,MAAMC,EAAUD,IAAgB,WAAa,YAAc,aACrDE,EAASF,IAAgB,WAAa,UAAY,YAExD,OAAIH,IAAUI,GACJH,EAAQ,GAAKC,EAGnBF,IAAUK,GACJJ,EAAQ,EAAIC,GAASA,EAG3BF,IAAU,OACL,EAGFA,IAAU,MAAQE,EAAQ,EAAI,MACvC,CAEO,SAASI,EAAQ,CAAE,UAAAC,EAAW,UAAAC,EAAY,YAAa,GAAGC,GAAuB,CACtF,OAAKF,EAKD,OAAO,SAAa,IACf,KAGFG,qBAAcC,EAAA,CAAiB,GAAGF,EAAO,UAAAF,EAAsB,UAAAC,CAAA,CAAsB,EAAI,SAAS,IAAI,EARpGI,MAACC,EAAA,CAAY,GAAGJ,CAAA,CAAO,CASlC,CAEA,SAASE,EAAgB,CACvB,UAAAJ,EACA,UAAAC,EACA,IAAKM,EACL,MAAAC,EACA,GAAGN,CACL,EAA8H,CAC5H,MAAMO,EAAMC,EAAAA,OAAuB,IAAI,EACjCC,EAAYC,EAAAA,cAAcH,EAAKF,CAAe,EAC9C,CAAE,aAAAM,EAAc,eAAAC,CAAA,EAAmBC,qBAAmB,CAC1D,UAAWf,EACX,WAAYS,EACZ,UAAAR,EACA,OAAQjB,EACR,OAAQ,EAAA,CACT,EAIDgC,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAASjB,EAAU,QAEzB,GAAI,CAACiB,EACH,OAGF,SAASC,EAAaC,EAAc,CAC9BA,EAAM,kBAAkB,MAAQA,EAAM,OAAO,SAASF,CAAM,GAC9DH,EAAA,CAEJ,CAEA,MAAMM,EAAiB,OAAO,eAAmB,IAAc,OAAY,IAAI,eAAe,IAAMN,GAAgB,EACpH,OAAAM,GAAA,MAAAA,EAAgB,QAAQH,GACxB,OAAO,iBAAiB,SAAUC,EAAc,CAAE,QAAS,GAAM,QAAS,GAAM,EAEzE,IAAM,CACXE,GAAA,MAAAA,EAAgB,aAChB,OAAO,oBAAoB,SAAUF,EAAc,CAAE,QAAS,GAAM,CACtE,CACF,EAAG,CAAClB,EAAWA,EAAU,QAASc,CAAc,CAAC,EAI/CT,EAAAA,IAACC,EAAA,CACE,GAAGJ,EACJ,IAAKS,EACL,SAAQ,GACR,4BAA0B,OAC1B,MAAO,CAAE,GAAGH,EAAO,GAAGK,EAAa,KAAA,CAAM,CAAA,CAG/C,CAEA,SAASP,EAAW,CAClB,SAAAe,EAAW,GACX,WAAAC,EAAa,WACb,SAAAC,EACA,UAAAC,EACA,MAAAC,EACA,QAAAC,EACA,UAAAC,EACA,YAAA/B,EAAc,aACd,IAAKW,EACL,OAAAqB,EAAS,GACT,GAAG1B,CACL,EAA2E,CACzE,MAAMO,EAAMC,EAAAA,OAAuB,IAAI,EACjCC,EAAYC,EAAAA,cAAcH,EAAKF,CAAe,EAC9CjB,EAAQoB,EAAAA,OAA2B,IAAI,EAG7CmB,EAAAA,gBAAgB,IAAM,CACpB,MAAM3C,EAAQuB,EAAI,QACZqB,EAAW,IAAM1C,EAAaH,EAAQC,CAAK,EAAGI,EAAM,OAAO,EAEjEwC,EAAA,EACA,MAAMC,EAAa,IAAI,iBAAiBD,CAAQ,EAChD,OAAAC,EAAW,QAAQ7C,EAAO,CAAE,QAAS,GAAM,UAAW,GAAM,WAAY,GAAM,gBAAiB,CAAC,UAAU,EAAG,EAEtG,IAAM6C,EAAW,WAAA,CAC1B,EAAG,CAAA,CAAE,EAEL,SAASC,EAAYb,EAAmC,OACtDO,GAAA,MAAAA,EAAUP,GACV,MAAM9B,EAAQJ,EAAQkC,EAAM,aAAa,EAGzC,GAAIA,EAAM,SAAWA,EAAM,cAAe,EACvCc,EAAA5C,EAAM,KAAMF,GAASA,EAAK,WAAa,CAAC,GAAKE,EAAM,CAAC,IAApD,MAAA4C,EAAwD,QACzD,MACF,CAEA,MAAM9C,EAAOE,EAAM,KAAM6C,GAAcA,IAAcf,EAAM,MAAM,EAC7DhC,IACFG,EAAM,QAAUH,EAChBC,EAAaC,EAAOF,CAAI,EAE5B,CAEA,SAASgD,EAAchB,EAAsC,CAC3DQ,GAAA,MAAAA,EAAYR,GACZ,MAAMiB,EAAOjB,EAAM,OAEnB,GAAIA,EAAM,kBAAoBiB,EAAK,QAAQrD,CAAM,EAC/C,OAGF,MAAMM,EAAQJ,EAAQkC,EAAM,aAAa,EACnCzB,EAAQL,EAAM,QAAQ+C,CAAI,EAC1BC,EAAU3C,IAAU,GAAK,OAAYF,EAAe2B,EAAM,IAAKzB,EAAOL,EAAM,OAAQO,CAAW,EAEjGyC,IAAY,SAIhBlB,EAAM,eAAA,EACN9B,EAAMgD,CAAO,EAAG,MAAA,EAClB,CAEA,OACEhC,EAAAA,IAAC,MAAA,CACE,GAAGH,EACJ,IAAKS,EACL,aAAYc,EACZ,mBAAkB7B,EAClB,UAAW,CACT0C,EAAAA,QAAO,QACPA,EAAAA,QAAO1C,CAAW,EAClB0C,EAAAA,QAAOhB,CAAU,EACjBM,GAAU,CAACP,GAAYiB,EAAAA,QAAO,OAC9BjB,GAAYiB,EAAAA,QAAO,SACnBd,CAAA,EAEC,OAAO,OAAO,EACd,KAAK,GAAG,EACX,QAASQ,EACT,UAAWG,EACX,KAAK,UACL,SAAU,GAET,SAAAZ,CAAA,CAAA,CAGP,CAQA,SAASgB,EAAa,CAAE,UAAAf,EAAW,MAAAC,EAAO,GAAGvB,GAA4B,CACvE,aAAQ,MAAA,CAAK,GAAGA,EAAO,aAAYuB,EAAO,UAAW,CAACa,EAAAA,QAAO,MAAOd,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,EAAG,KAAK,QAAQ,CACzH,CAEAzB,EAAQ,MAAQwC"}
@@ -1,106 +1,117 @@
1
- import { jsx as m } from "react/jsx-runtime";
2
- import { useRef as g, useLayoutEffect as w } from "react";
3
- import { createPortal as D } from "react-dom";
4
- import { useOverlayPosition as E } from "@react-aria/overlays";
5
- import { useMergedRefs as v } from "../../../hooks/useMergedRefs.js";
1
+ import { jsx as v } from "react/jsx-runtime";
2
+ import { useRef as w, useLayoutEffect as R, useEffect as L } from "react";
3
+ import { createPortal as O } from "react-dom";
4
+ import { useOverlayPosition as S } from "@react-aria/overlays";
5
+ import { useMergedRefs as E } from "../../../hooks/useMergedRefs.js";
6
6
  import f from "./Toolbar.module.css.js";
7
- const S = "button, a[href], input, select, textarea, [tabindex]", j = 'input:not([type="checkbox"]), textarea, select, [contenteditable="true"]', k = 8;
8
- function p(r) {
9
- return [...r.querySelectorAll(S)].filter((o) => !o.matches(":disabled"));
7
+ const D = "button, a[href], input, select, textarea, [tabindex]", j = 'input:not([type="checkbox"]), textarea, select, [contenteditable="true"]', k = 8;
8
+ function h(r) {
9
+ return [...r.querySelectorAll(D)].filter((o) => !o.matches(":disabled"));
10
10
  }
11
- function A(r, o) {
11
+ function T(r, o) {
12
12
  const t = r.find((n) => n === o) ?? r[0];
13
13
  r.forEach((n) => {
14
14
  n.tabIndex = n === t ? 0 : -1;
15
15
  });
16
16
  }
17
17
  function B(r, o, t, n) {
18
- const s = n === "vertical" ? "ArrowDown" : "ArrowRight", u = n === "vertical" ? "ArrowUp" : "ArrowLeft";
19
- return r === s ? (o + 1) % t : r === u ? (o - 1 + t) % t : r === "Home" ? 0 : r === "End" ? t - 1 : void 0;
18
+ const l = n === "vertical" ? "ArrowDown" : "ArrowRight", c = n === "vertical" ? "ArrowUp" : "ArrowLeft";
19
+ return r === l ? (o + 1) % t : r === c ? (o - 1 + t) % t : r === "Home" ? 0 : r === "End" ? t - 1 : void 0;
20
20
  }
21
21
  function C({ anchorRef: r, placement: o = "top start", ...t }) {
22
- return r ? typeof document > "u" ? null : D(/* @__PURE__ */ m(L, { ...t, anchorRef: r, placement: o }), document.body) : /* @__PURE__ */ m(x, { ...t });
22
+ return r ? typeof document > "u" ? null : O(/* @__PURE__ */ v(M, { ...t, anchorRef: r, placement: o }), document.body) : /* @__PURE__ */ v(P, { ...t });
23
23
  }
24
- function L({
24
+ function M({
25
25
  anchorRef: r,
26
26
  placement: o,
27
27
  ref: t,
28
28
  style: n,
29
- ...s
29
+ ...l
30
30
  }) {
31
- const u = g(null), l = v(u, t), { overlayProps: d } = E({
31
+ const c = w(null), d = E(c, t), { overlayProps: b, updatePosition: p } = S({
32
32
  targetRef: r,
33
- overlayRef: u,
33
+ overlayRef: c,
34
34
  placement: o,
35
35
  offset: k,
36
36
  isOpen: !0
37
37
  });
38
- return /* @__PURE__ */ m(
39
- x,
38
+ return L(() => {
39
+ const m = r.current;
40
+ if (!m)
41
+ return;
42
+ function y(A) {
43
+ A.target instanceof Node && A.target.contains(m) && p();
44
+ }
45
+ const u = typeof ResizeObserver > "u" ? void 0 : new ResizeObserver(() => p());
46
+ return u == null || u.observe(m), window.addEventListener("scroll", y, { capture: !0, passive: !0 }), () => {
47
+ u == null || u.disconnect(), window.removeEventListener("scroll", y, { capture: !0 });
48
+ };
49
+ }, [r, r.current, p]), /* @__PURE__ */ v(
50
+ P,
40
51
  {
41
- ...s,
42
- ref: l,
52
+ ...l,
53
+ ref: d,
43
54
  anchored: !0,
44
55
  "data-react-aria-top-layer": "true",
45
- style: { ...n, ...d.style }
56
+ style: { ...n, ...b.style }
46
57
  }
47
58
  );
48
59
  }
49
- function x({
60
+ function P({
50
61
  anchored: r = !1,
51
62
  appearance: o = "floating",
52
63
  children: t,
53
64
  className: n,
54
- label: s,
55
- onFocus: u,
56
- onKeyDown: l,
57
- orientation: d = "horizontal",
58
- ref: T,
59
- sticky: R = !1,
60
- ...I
65
+ label: l,
66
+ onFocus: c,
67
+ onKeyDown: d,
68
+ orientation: b = "horizontal",
69
+ ref: p,
70
+ sticky: m = !1,
71
+ ...y
61
72
  }) {
62
- const h = g(null), O = v(h, T), y = g(null);
63
- w(() => {
64
- const e = h.current, a = () => A(p(e), y.current);
73
+ const u = w(null), A = E(u, p), x = w(null);
74
+ R(() => {
75
+ const e = u.current, a = () => T(h(e), x.current);
65
76
  a();
66
77
  const i = new MutationObserver(a);
67
78
  return i.observe(e, { subtree: !0, childList: !0, attributes: !0, attributeFilter: ["disabled"] }), () => i.disconnect();
68
79
  }, []);
69
- function P(e) {
70
- var b;
71
- u == null || u(e);
72
- const a = p(e.currentTarget);
80
+ function I(e) {
81
+ var g;
82
+ c == null || c(e);
83
+ const a = h(e.currentTarget);
73
84
  if (e.target === e.currentTarget) {
74
- (b = a.find((c) => c.tabIndex === 0) ?? a[0]) == null || b.focus();
85
+ (g = a.find((s) => s.tabIndex === 0) ?? a[0]) == null || g.focus();
75
86
  return;
76
87
  }
77
- const i = a.find((c) => c === e.target);
78
- i && (y.current = i, A(a, i));
88
+ const i = a.find((s) => s === e.target);
89
+ i && (x.current = i, T(a, i));
79
90
  }
80
91
  function N(e) {
81
- l == null || l(e);
92
+ d == null || d(e);
82
93
  const a = e.target;
83
94
  if (e.defaultPrevented || a.matches(j))
84
95
  return;
85
- const i = p(e.currentTarget), b = i.indexOf(a), c = b === -1 ? void 0 : B(e.key, b, i.length, d);
86
- c !== void 0 && (e.preventDefault(), i[c].focus());
96
+ const i = h(e.currentTarget), g = i.indexOf(a), s = g === -1 ? void 0 : B(e.key, g, i.length, b);
97
+ s !== void 0 && (e.preventDefault(), i[s].focus());
87
98
  }
88
- return /* @__PURE__ */ m(
99
+ return /* @__PURE__ */ v(
89
100
  "div",
90
101
  {
91
- ...I,
92
- ref: O,
93
- "aria-label": s,
94
- "aria-orientation": d,
102
+ ...y,
103
+ ref: A,
104
+ "aria-label": l,
105
+ "aria-orientation": b,
95
106
  className: [
96
107
  f.toolbar,
97
- f[d],
108
+ f[b],
98
109
  f[o],
99
- R && !r && f.sticky,
110
+ m && !r && f.sticky,
100
111
  r && f.anchored,
101
112
  n
102
113
  ].filter(Boolean).join(" "),
103
- onFocus: P,
114
+ onFocus: I,
104
115
  onKeyDown: N,
105
116
  role: "toolbar",
106
117
  tabIndex: -1,
@@ -108,10 +119,10 @@ function x({
108
119
  }
109
120
  );
110
121
  }
111
- function M({ className: r, label: o, ...t }) {
112
- return /* @__PURE__ */ m("div", { ...t, "aria-label": o, className: [f.group, r].filter(Boolean).join(" "), role: "group" });
122
+ function G({ className: r, label: o, ...t }) {
123
+ return /* @__PURE__ */ v("div", { ...t, "aria-label": o, className: [f.group, r].filter(Boolean).join(" "), role: "group" });
113
124
  }
114
- C.Group = M;
125
+ C.Group = G;
115
126
  export {
116
127
  C as Toolbar
117
128
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.js","sources":["../../../../src/components/actions/Toolbar/Toolbar.tsx"],"sourcesContent":["import {\n useLayoutEffect,\n useRef,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport type { PopoverPlacement } from '../../overlays/Popover';\nimport styles from './Toolbar.module.css';\n\nexport type ToolbarOrientation = 'horizontal' | 'vertical';\nexport type ToolbarAppearance = 'floating' | 'flat';\nexport type ToolbarPlacement = PopoverPlacement;\n\nexport interface ToolbarProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n /** A barra flutua ancorada a este elemento, num portal, sem tirar o foco de quem o tem. */\n anchorRef?: RefObject<HTMLElement | null>;\n appearance?: ToolbarAppearance;\n children: ReactNode;\n label: string;\n orientation?: ToolbarOrientation;\n placement?: ToolbarPlacement;\n /** Gruda a barra no topo da área que rola. Vale para a barra no fluxo, sem `anchorRef`. */\n sticky?: boolean;\n}\n\nconst ITENS = 'button, a[href], input, select, textarea, [tabindex]';\n// Campos que usam as setas para si mesmos: nelas, a barra não toma a tecla.\nconst CAMPOS = 'input:not([type=\"checkbox\"]), textarea, select, [contenteditable=\"true\"]';\nconst DISTANCIA_DA_ANCORA = 8;\n\nfunction itensDe(barra: HTMLElement) {\n return [...barra.querySelectorAll<HTMLElement>(ITENS)].filter((item) => !item.matches(':disabled'));\n}\n\nfunction marcarParada(itens: readonly HTMLElement[], ativo: HTMLElement | null) {\n const parada = itens.find((item) => item === ativo) ?? itens[0];\n itens.forEach((item) => {\n item.tabIndex = item === parada ? 0 : -1;\n });\n}\n\nfunction destinoDaTecla(tecla: string, atual: number, total: number, orientation: ToolbarOrientation) {\n const avancar = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const voltar = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (tecla === avancar) {\n return (atual + 1) % total;\n }\n\n if (tecla === voltar) {\n return (atual - 1 + total) % total;\n }\n\n if (tecla === 'Home') {\n return 0;\n }\n\n return tecla === 'End' ? total - 1 : undefined;\n}\n\nexport function Toolbar({ anchorRef, placement = 'top start', ...props }: ToolbarProps) {\n if (!anchorRef) {\n return <ToolbarBar {...props} />;\n }\n\n // No servidor não há `document` para o portal; a barra ancorada nasce na hidratação.\n if (typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<AnchoredToolbar {...props} anchorRef={anchorRef} placement={placement} />, document.body);\n}\n\nfunction AnchoredToolbar({\n anchorRef,\n placement,\n ref: refDoConsumidor,\n style,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchorRef: RefObject<HTMLElement | null>; placement: ToolbarPlacement }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const { overlayProps } = useOverlayPosition({\n targetRef: anchorRef,\n overlayRef: ref,\n placement,\n offset: DISTANCIA_DA_ANCORA,\n isOpen: true,\n });\n\n // Sem FocusScope: a barra aparece sobre o bloco e o cursor continua no texto.\n return (\n <ToolbarBar\n {...props}\n ref={mergedRef}\n anchored\n data-react-aria-top-layer=\"true\"\n style={{ ...style, ...overlayProps.style }}\n />\n );\n}\n\nfunction ToolbarBar({\n anchored = false,\n appearance = 'floating',\n children,\n className,\n label,\n onFocus,\n onKeyDown,\n orientation = 'horizontal',\n ref: refDoConsumidor,\n sticky = false,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchored?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const ativo = useRef<HTMLElement | null>(null);\n\n // Uma só parada de Tab: o item ativo. Itens que entram, saem ou se desabilitam refazem a marcação.\n useLayoutEffect(() => {\n const barra = ref.current!;\n const remarcar = () => marcarParada(itensDe(barra), ativo.current);\n\n remarcar();\n const observador = new MutationObserver(remarcar);\n observador.observe(barra, { subtree: true, childList: true, attributes: true, attributeFilter: ['disabled'] });\n\n return () => observador.disconnect();\n }, []);\n\n function handleFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n const itens = itensDe(event.currentTarget);\n\n // Focar a própria barra, como num atalho do produto, leva ao item ativo.\n if (event.target === event.currentTarget) {\n (itens.find((item) => item.tabIndex === 0) ?? itens[0])?.focus();\n return;\n }\n\n const item = itens.find((candidato) => candidato === event.target);\n if (item) {\n ativo.current = item;\n marcarParada(itens, item);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const alvo = event.target as HTMLElement;\n\n if (event.defaultPrevented || alvo.matches(CAMPOS)) {\n return;\n }\n\n const itens = itensDe(event.currentTarget);\n const atual = itens.indexOf(alvo);\n const destino = atual === -1 ? undefined : destinoDaTecla(event.key, atual, itens.length, orientation);\n\n if (destino === undefined) {\n return;\n }\n\n event.preventDefault();\n itens[destino]!.focus();\n }\n\n return (\n <div\n {...props}\n ref={mergedRef}\n aria-label={label}\n aria-orientation={orientation}\n className={[\n styles.toolbar,\n styles[orientation],\n styles[appearance],\n sticky && !anchored && styles.sticky,\n anchored && styles.anchored,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n role=\"toolbar\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n children: ReactNode;\n /** Nome do grupo, quando os botões dele formam um conjunto, como os alinhamentos. */\n label?: string;\n}\n\nfunction ToolbarGroup({ className, label, ...props }: ToolbarGroupProps) {\n return <div {...props} aria-label={label} className={[styles.group, className].filter(Boolean).join(' ')} role=\"group\" />;\n}\n\nToolbar.Group = ToolbarGroup;\n"],"names":["ITENS","CAMPOS","DISTANCIA_DA_ANCORA","itensDe","barra","item","marcarParada","itens","ativo","parada","destinoDaTecla","tecla","atual","total","orientation","avancar","voltar","Toolbar","anchorRef","placement","props","createPortal","AnchoredToolbar","jsx","ToolbarBar","refDoConsumidor","style","ref","useRef","mergedRef","useMergedRefs","overlayProps","useOverlayPosition","anchored","appearance","children","className","label","onFocus","onKeyDown","sticky","useLayoutEffect","remarcar","observador","handleFocus","event","_a","candidato","handleKeyDown","alvo","destino","styles","ToolbarGroup"],"mappings":"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"}
1
+ {"version":3,"file":"Toolbar.js","sources":["../../../../src/components/actions/Toolbar/Toolbar.tsx"],"sourcesContent":["import {\n useEffect,\n useLayoutEffect,\n useRef,\n type ComponentPropsWithRef,\n type FocusEvent,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOverlayPosition } from '@react-aria/overlays';\nimport { useMergedRefs } from '../../../hooks/useMergedRefs';\nimport type { PopoverPlacement } from '../../overlays/Popover';\nimport styles from './Toolbar.module.css';\n\nexport type ToolbarOrientation = 'horizontal' | 'vertical';\nexport type ToolbarAppearance = 'floating' | 'flat';\nexport type ToolbarPlacement = PopoverPlacement;\n\nexport interface ToolbarProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n /** A barra flutua ancorada a este elemento, num portal, sem tirar o foco de quem o tem. */\n anchorRef?: RefObject<HTMLElement | null>;\n appearance?: ToolbarAppearance;\n children: ReactNode;\n label: string;\n orientation?: ToolbarOrientation;\n placement?: ToolbarPlacement;\n /** Gruda a barra no topo da área que rola. Vale para a barra no fluxo, sem `anchorRef`. */\n sticky?: boolean;\n}\n\nconst ITENS = 'button, a[href], input, select, textarea, [tabindex]';\n// Campos que usam as setas para si mesmos: nelas, a barra não toma a tecla.\nconst CAMPOS = 'input:not([type=\"checkbox\"]), textarea, select, [contenteditable=\"true\"]';\nconst DISTANCIA_DA_ANCORA = 8;\n\nfunction itensDe(barra: HTMLElement) {\n return [...barra.querySelectorAll<HTMLElement>(ITENS)].filter((item) => !item.matches(':disabled'));\n}\n\nfunction marcarParada(itens: readonly HTMLElement[], ativo: HTMLElement | null) {\n const parada = itens.find((item) => item === ativo) ?? itens[0];\n itens.forEach((item) => {\n item.tabIndex = item === parada ? 0 : -1;\n });\n}\n\nfunction destinoDaTecla(tecla: string, atual: number, total: number, orientation: ToolbarOrientation) {\n const avancar = orientation === 'vertical' ? 'ArrowDown' : 'ArrowRight';\n const voltar = orientation === 'vertical' ? 'ArrowUp' : 'ArrowLeft';\n\n if (tecla === avancar) {\n return (atual + 1) % total;\n }\n\n if (tecla === voltar) {\n return (atual - 1 + total) % total;\n }\n\n if (tecla === 'Home') {\n return 0;\n }\n\n return tecla === 'End' ? total - 1 : undefined;\n}\n\nexport function Toolbar({ anchorRef, placement = 'top start', ...props }: ToolbarProps) {\n if (!anchorRef) {\n return <ToolbarBar {...props} />;\n }\n\n // No servidor não há `document` para o portal; a barra ancorada nasce na hidratação.\n if (typeof document === 'undefined') {\n return null;\n }\n\n return createPortal(<AnchoredToolbar {...props} anchorRef={anchorRef} placement={placement} />, document.body);\n}\n\nfunction AnchoredToolbar({\n anchorRef,\n placement,\n ref: refDoConsumidor,\n style,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchorRef: RefObject<HTMLElement | null>; placement: ToolbarPlacement }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const { overlayProps, updatePosition } = useOverlayPosition({\n targetRef: anchorRef,\n overlayRef: ref,\n placement,\n offset: DISTANCIA_DA_ANCORA,\n isOpen: true,\n });\n\n // O posicionamento não refaz a conta quando rola um contêiner da âncora e só observa o tamanho da âncora da montagem.\n // Aqui, a barra acompanha as duas coisas, também na âncora trocada depois, como o bloco selecionado de um editor.\n useEffect(() => {\n const anchor = anchorRef.current;\n\n if (!anchor) {\n return;\n }\n\n function followScroll(event: Event) {\n if (event.target instanceof Node && event.target.contains(anchor)) {\n updatePosition();\n }\n }\n\n const resizeObserver = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(() => updatePosition());\n resizeObserver?.observe(anchor);\n window.addEventListener('scroll', followScroll, { capture: true, passive: true });\n\n return () => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', followScroll, { capture: true });\n };\n }, [anchorRef, anchorRef.current, updatePosition]);\n\n // Sem FocusScope: a barra aparece sobre o bloco e o cursor continua no texto.\n return (\n <ToolbarBar\n {...props}\n ref={mergedRef}\n anchored\n data-react-aria-top-layer=\"true\"\n style={{ ...style, ...overlayProps.style }}\n />\n );\n}\n\nfunction ToolbarBar({\n anchored = false,\n appearance = 'floating',\n children,\n className,\n label,\n onFocus,\n onKeyDown,\n orientation = 'horizontal',\n ref: refDoConsumidor,\n sticky = false,\n ...props\n}: Omit<ToolbarProps, 'anchorRef' | 'placement'> & { anchored?: boolean }) {\n const ref = useRef<HTMLDivElement>(null);\n const mergedRef = useMergedRefs(ref, refDoConsumidor);\n const ativo = useRef<HTMLElement | null>(null);\n\n // Uma só parada de Tab: o item ativo. Itens que entram, saem ou se desabilitam refazem a marcação.\n useLayoutEffect(() => {\n const barra = ref.current!;\n const remarcar = () => marcarParada(itensDe(barra), ativo.current);\n\n remarcar();\n const observador = new MutationObserver(remarcar);\n observador.observe(barra, { subtree: true, childList: true, attributes: true, attributeFilter: ['disabled'] });\n\n return () => observador.disconnect();\n }, []);\n\n function handleFocus(event: FocusEvent<HTMLDivElement>) {\n onFocus?.(event);\n const itens = itensDe(event.currentTarget);\n\n // Focar a própria barra, como num atalho do produto, leva ao item ativo.\n if (event.target === event.currentTarget) {\n (itens.find((item) => item.tabIndex === 0) ?? itens[0])?.focus();\n return;\n }\n\n const item = itens.find((candidato) => candidato === event.target);\n if (item) {\n ativo.current = item;\n marcarParada(itens, item);\n }\n }\n\n function handleKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n onKeyDown?.(event);\n const alvo = event.target as HTMLElement;\n\n if (event.defaultPrevented || alvo.matches(CAMPOS)) {\n return;\n }\n\n const itens = itensDe(event.currentTarget);\n const atual = itens.indexOf(alvo);\n const destino = atual === -1 ? undefined : destinoDaTecla(event.key, atual, itens.length, orientation);\n\n if (destino === undefined) {\n return;\n }\n\n event.preventDefault();\n itens[destino]!.focus();\n }\n\n return (\n <div\n {...props}\n ref={mergedRef}\n aria-label={label}\n aria-orientation={orientation}\n className={[\n styles.toolbar,\n styles[orientation],\n styles[appearance],\n sticky && !anchored && styles.sticky,\n anchored && styles.anchored,\n className,\n ]\n .filter(Boolean)\n .join(' ')}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n role=\"toolbar\"\n tabIndex={-1}\n >\n {children}\n </div>\n );\n}\n\nexport interface ToolbarGroupProps extends Omit<ComponentPropsWithRef<'div'>, 'aria-label' | 'role'> {\n children: ReactNode;\n /** Nome do grupo, quando os botões dele formam um conjunto, como os alinhamentos. */\n label?: string;\n}\n\nfunction ToolbarGroup({ className, label, ...props }: ToolbarGroupProps) {\n return <div {...props} aria-label={label} className={[styles.group, className].filter(Boolean).join(' ')} role=\"group\" />;\n}\n\nToolbar.Group = ToolbarGroup;\n"],"names":["ITENS","CAMPOS","DISTANCIA_DA_ANCORA","itensDe","barra","item","marcarParada","itens","ativo","parada","destinoDaTecla","tecla","atual","total","orientation","avancar","voltar","Toolbar","anchorRef","placement","props","createPortal","AnchoredToolbar","jsx","ToolbarBar","refDoConsumidor","style","ref","useRef","mergedRef","useMergedRefs","overlayProps","updatePosition","useOverlayPosition","useEffect","anchor","followScroll","event","resizeObserver","anchored","appearance","children","className","label","onFocus","onKeyDown","sticky","useLayoutEffect","remarcar","observador","handleFocus","_a","candidato","handleKeyDown","alvo","destino","styles","ToolbarGroup"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),ye=require("react"),te=require("./gaugeLayout.cjs"),x=require("./gaugeReading.cjs"),g=require("./gaugeScale.cjs"),t=require("./ChartGauge.module.css.cjs"),nt=require("../core/useChartMetrics.cjs"),lt=require("../core/useTweenedNumbers.cjs"),Te=require("../palette/seriesColor.cjs"),ot=require("../../../utils/formatters/formatarNumero.cjs"),rt=require("../core/ChartLegend.cjs"),it=require("../ChartTooltip/ChartTooltip.cjs"),ct=require("../core/cartesianLayout.cjs"),ee=require("../core/arcs.cjs"),ut=10,dt=4,mt={rows:[]},Le=n=>n*Math.PI/180,ht=n=>n*180/Math.PI;function b(n,j,A){const[i,N]=te.pointAt(n,j),[v,E]=te.pointAt(n,A);return`M${i},${N}L${v},${E}`}function gt({accent:n,ariaValueText:j,centerLabel:A,colorBySegment:i=!1,color:N,delta:v,emptyMessage:E="Sem dados no período",endAngle:be=90,formatTooltipValue:ke,formatValue:ae=ot.formatarNumero,height:Ae,indicator:se="fill",intent:Ce,legend:$="none",loading:ne=!1,max:we,min:Re,origin:Pe,scaleLabels:qe="minMax",segmentStyle:le="track",segmentUnit:oe="value",segments:Oe=[],showCenter:Se=!0,showSegmentLabels:He="hidden",showTooltip:re=!0,size:Ee="default",startAngle:Ie=-90,target:M,thickness:ie=16,tickCount:De=5,ticks:Ge="hidden",title:C,trackRadius:_e,value:ce,valueDisplay:Be="value"}){const f=Ee==="compact",{font:ze,height:Fe,radius:Ke,ref:Ve,width:I}=nt.useChartMetrics(),{fillHeight:ue,value:w}=ct.chartHeight(Ae??(f?96:220),Fe),de=ye.useId().replace(/[^\w-]/g,""),[R,D]=ye.useState(null),u=!ne&&g.isNumber(ce)?ce:null,c=ne?"loading":u===null?"empty":"value",o=g.gaugeDomain(Re,we,M),P=g.targetBase(M),p=x.gaugeReading({base:P,formatTooltipValue:ke,formatValue:ae,segmentUnit:oe,valueDisplay:Be}),We=oe==="percentOfTarget"&&P!==null?P:1,d=g.gaugeSegments(Oe,o,{accent:n,unit:We}),G=g.gaugeOrigin(Pe,o),_=u===null?G:g.clampToDomain(u,o),[Xe=_]=lt.useTweenedNumbers([_]),K=g.clampToDomain(Xe,o),q=u===null?void 0:g.segmentAt(d,_),V=Te.resolveSeriesColors([{color:N,intent:Ce}],{accent:n})[0],k=Le(Ie),O=Le(be),r=l=>k+(g.clampToDomain(l,o)-o.min)/(o.max-o.min)*(O-k),W=se!=="needle",me=se!=="fill"&&c==="value",he=le==="rim"&&d.length>0&&c!=="loading",Ze=le==="track"&&d.length>0&&c!=="loading",S=f?2:3,X=f?3:4,y=M&&g.isNumber(M.value)&&c!=="loading"?M:void 0,Z=f?"hidden":Ge,ge=f?"hidden":qe,fe=f?"hidden":He,T=g.majorTicks(o,De,p.showsPercent?P:null),Je=[...(fe==="hidden"?[]:d).filter(l=>l.label).map(l=>({angle:r((l.from+l.to)/2),kind:"segment",text:l.label})),...y&&!f?[{angle:r(y.value),kind:"target",text:`${y.label||"Meta"} ${ae(y.value)}`}]:[]],Qe=x.gaugeCenter({centerLabel:A,compact:f,delta:v,domain:o,emptyMessage:E,reading:p,showCenter:Se,status:c,value:u??0}),J=u===null?void 0:j??x.gaugeValueText({delta:v,domain:o,reading:p,segment:q,target:M,value:u}),Ye=c==="loading"?`${C}: carregando`:c==="empty"?`${C}: ${E.toLocaleLowerCase("pt-BR")}`:C;function Ue(){if(u===null||R===null)return mt;if(R==="value"){const l=i&&q?q.color:V;return x.valueTooltip({color:l,delta:v,domain:o,reading:p,segment:q,target:M,title:C,value:u})}return x.segmentTooltip({current:q,reading:p,segment:d[R],target:M,value:u})}const B=(he?S+X:0)+(y?dt:0);function xe(){var Me;const l=te.layoutGauge({center:Qe,compact:f,endAngle:O,font:ze,height:w,minMaxLabels:[{angle:k,text:x.formatShown(p,o.min)},{angle:O,text:x.formatShown(p,o.max)}],needle:me,outerBand:B,outsideLabels:Je,scaleLabels:ge,startAngle:k,thickness:f?Math.min(ie,ut):ie,tickLabels:g.tickLabelPriority(T,P).map(a=>({angle:r(T[a]),text:x.formatShown(p,T[a])})),ticks:Z,width:I}),{innerRadius:m,radius:h}=l,ve=Math.max(0,Math.min(_e??Ke,l.thickness/2)),z=(a,s,L=m,H=h)=>ee.arcPath({endAngle:s,innerRadius:L,outerRadius:H,startAngle:a}),je=ee.arcPath({cornerRadius:ve,endAngle:O,innerRadius:m,outerRadius:h,startAngle:k}),at=c!=="value"?.5:W?.32:1,Ne=a=>`${t.default.segment} ${R===a?t.default.segmentHot:typeof R=="number"?t.default.segmentDimmed:""}`,F=r(G),Q=r(K),st=i?((Me=g.segmentAt(d,K))==null?void 0:Me.color)??V:V,Y=m-4,$e=h+B+3,U=a=>re?null:e.jsx("title",{children:a});return e.jsxs("svg",{"aria-busy":c==="loading"||void 0,"aria-label":Ye,"aria-valuemax":u===null?void 0:o.max,"aria-valuemin":u===null?void 0:o.min,"aria-valuenow":u===null?void 0:_,"aria-valuetext":J,className:t.default.canvas,height:w,role:u===null?"img":"meter",viewBox:`0 0 ${I} ${w}`,width:I,children:[e.jsx("defs",{children:e.jsx("clipPath",{id:de,children:e.jsx("path",{d:je})})}),e.jsxs("g",{transform:`translate(${l.cx} ${l.cy})`,children:[e.jsxs("g",{className:c==="loading"?t.default.loading:void 0,children:[e.jsx("path",{className:t.default.track,d:je}),Ze&&e.jsxs("g",{clipPath:`url(#${de})`,children:[d.map((a,s)=>e.jsx("path",{className:Ne(s),d:z(r(a.from),r(a.to)),fill:a.color,opacity:at},s)),d.slice(1).map((a,s)=>e.jsx("path",{className:t.default.separator,d:b(r(a.from),m,h)},s))]})]}),he&&e.jsxs("g",{children:[d.map((a,s)=>e.jsx("path",{className:Ne(s),d:z(r(a.from),r(a.to),h+S,h+S+X),fill:a.color,opacity:c==="value"?1:.5},s)),d.slice(1).map((a,s)=>e.jsx("path",{className:t.default.separator,d:b(r(a.from),h+S-1,h+S+X+1)},s))]}),Z!=="hidden"&&e.jsxs("g",{children:[Z==="majorAndMinor"&&T.slice(1).flatMap((a,s)=>[1,2,3,4].map(L=>e.jsx("path",{className:t.default.tickMinor,d:b(r(T[s]+L*(a-T[s])/5),m-3,m-6)},`${s}-${L}`))),T.map((a,s)=>e.jsx("path",{className:t.default.tickMajor,d:b(r(a),m-3,m-9)},s))]}),l.scaleLabels.map(({anchor:a,label:s,x:L,y:H})=>e.jsx("text",{className:t.default.scaleLabel,dominantBaseline:ge==="ticks"?"central":void 0,textAnchor:a,x:L,y:H,children:s.text},`${s.angle}-${s.text}`)),c==="value"&&G>o.min&&G<o.max&&e.jsx("path",{className:t.default.originMark,d:b(F,m-2,h+2)}),W&&c==="value"&&Math.abs(Q-F)>1e-4&&e.jsx("path",{className:t.default.fill,d:ee.arcPath({cornerRadius:ve,endAngle:Math.max(F,Q),innerRadius:m,outerRadius:h,startAngle:Math.min(F,Q)}),fill:st}),y&&e.jsxs("g",{children:[e.jsx("path",{className:t.default.targetOutline,d:b(r(y.value),m-3,h+B)}),e.jsx("path",{className:t.default.targetLine,d:b(r(y.value),m-3,h+B)})]}),l.outsideLabels.map(({anchor:a,label:s,x:L,y:H})=>e.jsx("text",{className:s.kind==="target"?t.default.targetLabel:`${t.default.segmentLabel} ${fe==="onHover"?t.default.segmentLabelOnHover:""}`,dominantBaseline:"central",textAnchor:a,x:L,y:H,children:s.text},`${s.kind}-${s.angle}`)),me&&e.jsxs("g",{children:[e.jsx("path",{className:t.default.needle,d:ft(W?m-5:h-l.thickness*.3,f?2.2:3.6),transform:`rotate(${ht(r(K))})`}),e.jsx("circle",{className:t.default.needle,r:l.pinRadius}),e.jsx("circle",{className:t.default.pinDot,r:f?1.5:2.6})]}),e.jsx(xt,{center:l.center,empty:c==="empty"}),c==="value"&&e.jsxs("g",{className:t.default.hits,onMouseLeave:()=>D(null),children:[d.length>0?d.map((a,s)=>e.jsx("path",{d:z(r(a.from),r(a.to),Y,$e),onMouseEnter:()=>D(s),children:U(`${x.segmentName(a)}: ${x.rangeText(p,a)}`)},s)):e.jsx("path",{d:z(k,O,Y,$e),onMouseEnter:()=>D("value"),children:U(J??"")}),e.jsx("circle",{onMouseEnter:()=>D("value"),r:Math.max(Y*.85,8),children:U(J??"")})]})]})]})}const et=$==="left"||$==="right",pe=$!=="none"&&d.length>0&&e.jsx(rt.ChartLegend,{entries:d.map(l=>({color:l.color,label:x.segmentName(l),value:x.rangeText(p,l)})),position:$}),tt=Ue();return e.jsxs("figure",{className:t.default.figure,children:[e.jsx("figcaption",{className:t.default.title,children:C}),e.jsxs("div",{className:`${t.default.body} ${et?t.default.bodyRow:t.default.bodyColumn}`,children:[($==="top"||$==="left")&&pe,e.jsx("div",{className:`${t.default.plot} ${ue?t.default.plotFill:""}`,ref:Ve,style:ue?void 0:{minHeight:w},children:I===0||w===0?null:re?e.jsx(it.ChartTooltip,{columns:[{format:p.formatExact}],computed:"none",...tt,children:xe()}):xe()}),($==="bottom"||$==="right")&&pe]})]})}function ft(n,j){return`M${-j},0L-0.8,${-n}L0.8,${-n}L${j},0Z`}function xt({center:n,empty:j}){const A=n.value?n.value.size:0;return e.jsxs("g",{className:t.default.center,children:[n.value&&e.jsx("text",{className:`${t.default.centerValue} ${j?t.default.centerValueEmpty:""}`,style:{fontFamily:n.value.family,fontSize:n.value.size},textAnchor:"middle",y:n.top+n.value.size*.84,children:n.value.text}),n.lines.map((i,N)=>{const v=n.top+A+(N+1)*n.lineHeight-3;return i.kind==="text"?e.jsx("text",{className:t.default.centerLine,textAnchor:"middle",y:v,children:i.text},N):i.kind==="warn"?e.jsxs("text",{className:t.default.centerWarn,textAnchor:"middle",y:v,children:[e.jsx("tspan",{className:t.default.warnGlyph,children:`${i.glyph} `}),i.text]},N):e.jsxs("text",{className:t.default.centerLine,textAnchor:"middle",y:v,children:[e.jsx("tspan",{fill:Te.INTENT_TOKENS[i.intent],children:`${i.glyph} `}),e.jsx("tspan",{className:t.default.deltaNumber,children:i.text}),i.label&&e.jsx("tspan",{className:t.default.deltaLabel,children:` ${i.label}`})]},N)})]})}exports.ChartGauge=gt;
2
+ //# sourceMappingURL=ChartGauge.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartGauge.cjs","sources":["../../../../src/components/charts/ChartGauge/ChartGauge.tsx"],"sourcesContent":["import { useId, useState } from 'react';\nimport { ChartTooltip } from '../ChartTooltip';\nimport {\n ChartLegend,\n arcPath,\n chartHeight,\n useChartMetrics,\n useTweenedNumbers,\n type ChartHeight,\n type ChartLegendPosition,\n type MarkVisibility,\n} from '../core';\nimport { INTENT_TOKENS, resolveSeriesColors, type SeriesAppearance, type SeriesIntent } from '../palette';\nimport { formatarNumero } from '../../../utils/formatters';\nimport { layoutGauge, pointAt, type GaugeCenterLayout, type OutsideLabel } from './gaugeLayout';\nimport {\n gaugeCenter,\n gaugeReading,\n gaugeValueText,\n rangeText,\n segmentName,\n segmentTooltip,\n valueTooltip,\n formatShown,\n type GaugeStatus,\n type GaugeTooltip,\n} from './gaugeReading';\nimport {\n clampToDomain,\n gaugeDomain,\n gaugeOrigin,\n gaugeSegments,\n isNumber,\n majorTicks,\n segmentAt,\n targetBase,\n tickLabelPriority,\n} from './gaugeScale';\nimport styles from './ChartGauge.module.css';\n\n/** Uma faixa da escala. A cor segue a regra da família: `color`, depois `intent`, depois a paleta. */\nexport interface ChartGaugeSegment extends SeriesAppearance {\n label?: string;\n /** Limite superior, na unidade de `segmentUnit`. Omitido na última faixa, vai até `max`. */\n to?: number;\n}\n\nexport interface ChartGaugeTarget {\n label?: string;\n value: number;\n}\n\nexport interface ChartGaugeDelta {\n /** Formato do módulo da variação; o sinal é do componente. */\n format?: (delta: number) => string;\n /** Sem ela, positiva quando sobe e negativa quando desce. */\n intent?: SeriesIntent;\n label?: string;\n value: number;\n}\n\nexport type ChartGaugeIndicator = 'fill' | 'needle' | 'fillAndNeedle';\nexport type ChartGaugeSegmentStyle = 'track' | 'rim' | 'hidden';\nexport type ChartGaugeScaleLabels = 'hidden' | 'minMax' | 'ticks';\nexport type ChartGaugeSize = 'default' | 'compact';\nexport type ChartGaugeTicks = 'hidden' | 'major' | 'majorAndMinor';\n/** Leitura contra a meta: a mesma palavra na exibição e na unidade das faixas. */\nexport type ChartGaugeValueDisplay = 'value' | 'percentOfTarget';\nexport type ChartGaugeSegmentUnit = 'value' | 'percentOfTarget';\n\nexport interface ChartGaugeProps {\n accent?: string;\n /** Troca a frase montada do `aria-valuetext`. */\n ariaValueText?: string;\n /** Texto sob o valor. Sem ele, na leitura contra a meta, a outra leitura. */\n centerLabel?: string;\n /** O arco assume a cor da faixa onde o valor está. */\n colorBySegment?: boolean;\n /** Cor do arco fora de `colorBySegment`. Vence `intent`. */\n color?: string;\n delta?: ChartGaugeDelta;\n emptyMessage?: string;\n /** Ângulo final, em graus a partir do topo. */\n endAngle?: number;\n /** Formato exato do balão e, na leitura contra a meta, do `aria-valuetext`. */\n formatTooltipValue?: (value: number) => string;\n /** Formato do centro, da escala e da meta. */\n formatValue?: (value: number) => string;\n height?: ChartHeight;\n indicator?: ChartGaugeIndicator;\n intent?: SeriesIntent;\n legend?: ChartLegendPosition;\n loading?: boolean;\n /** Fim da escala. Omitido com meta, vai a 120% dela. */\n max?: number;\n min?: number;\n /** De onde o arco preenchido parte. Sem ele, o zero quando a escala o cruza; senão, `min`. */\n origin?: number;\n scaleLabels?: ChartGaugeScaleLabels;\n segmentStyle?: ChartGaugeSegmentStyle;\n segmentUnit?: ChartGaugeSegmentUnit;\n segments?: readonly ChartGaugeSegment[];\n showCenter?: boolean;\n showSegmentLabels?: MarkVisibility;\n showTooltip?: boolean;\n size?: ChartGaugeSize;\n /** Ângulo inicial, em graus a partir do topo. */\n startAngle?: number;\n target?: ChartGaugeTarget;\n /** Espessura do arco, em pixels. No compacto, até 10. */\n thickness?: number;\n tickCount?: number;\n ticks?: ChartGaugeTicks;\n title: string;\n /** Raio das pontas, limitado a metade da espessura. Sem valor, o token de raio pequeno. */\n trackRadius?: number;\n /** `null` é sem dado. */\n value: number | null;\n valueDisplay?: ChartGaugeValueDisplay;\n}\n\ntype Hovered = number | 'value' | null;\n\nconst COMPACT_MAX_THICKNESS = 10;\nconst TARGET_MARK = 4;\nconst NO_TOOLTIP: GaugeTooltip = { rows: [] };\n\nconst toRadians = (degrees: number) => (degrees * Math.PI) / 180;\nconst toDegrees = (radians: number) => (radians * 180) / Math.PI;\n\nfunction radialPath(angle: number, from: number, to: number) {\n const [x1, y1] = pointAt(angle, from);\n const [x2, y2] = pointAt(angle, to);\n\n return `M${x1},${y1}L${x2},${y2}`;\n}\n\n/**\n * Medidor de um valor numa escala com faixas de significado. É `role=\"meter\"`: o leitor de tela ouve o valor, a faixa,\n * a meta e a variação. Carregando ou sem dado, vira `role=\"img\"`.\n */\nexport function ChartGauge({\n accent,\n ariaValueText,\n centerLabel,\n colorBySegment = false,\n color,\n delta,\n emptyMessage = 'Sem dados no período',\n endAngle = 90,\n formatTooltipValue,\n formatValue = formatarNumero,\n height,\n indicator = 'fill',\n intent,\n legend = 'none',\n loading = false,\n max,\n min,\n origin,\n scaleLabels = 'minMax',\n segmentStyle = 'track',\n segmentUnit = 'value',\n segments = [],\n showCenter = true,\n showSegmentLabels = 'hidden',\n showTooltip = true,\n size = 'default',\n startAngle = -90,\n target,\n thickness = 16,\n tickCount = 5,\n ticks = 'hidden',\n title,\n trackRadius,\n value,\n valueDisplay = 'value',\n}: ChartGaugeProps) {\n const compact = size === 'compact';\n const { font, height: measuredHeight, radius: tokenRadius, ref, width } = useChartMetrics();\n const { fillHeight, value: drawingHeight } = chartHeight(height ?? (compact ? 96 : 220), measuredHeight);\n const clipId = useId().replace(/[^\\w-]/g, '');\n const [hovered, setHovered] = useState<Hovered>(null);\n\n const measured = !loading && isNumber(value) ? value : null;\n const status: GaugeStatus = loading ? 'loading' : measured === null ? 'empty' : 'value';\n const domain = gaugeDomain(min, max, target);\n const base = targetBase(target);\n const reading = gaugeReading({ base, formatTooltipValue, formatValue, segmentUnit, valueDisplay });\n const unit = segmentUnit === 'percentOfTarget' && base !== null ? base : 1;\n const bands = gaugeSegments(segments, domain, { accent, unit });\n const start = gaugeOrigin(origin, domain);\n const reached = measured === null ? start : clampToDomain(measured, domain);\n const [tweened = reached] = useTweenedNumbers([reached]);\n const shown = clampToDomain(tweened, domain);\n const current = measured === null ? undefined : segmentAt(bands, reached);\n const arcColor = resolveSeriesColors([{ color, intent }], { accent })[0];\n\n const startRadians = toRadians(startAngle);\n const endRadians = toRadians(endAngle);\n const angleOf = (at: number) =>\n startRadians + ((clampToDomain(at, domain) - domain.min) / (domain.max - domain.min)) * (endRadians - startRadians);\n\n const showFill = indicator !== 'needle';\n const needle = indicator !== 'fill' && status === 'value';\n const rim = segmentStyle === 'rim' && bands.length > 0 && status !== 'loading';\n const trackBands = segmentStyle === 'track' && bands.length > 0 && status !== 'loading';\n const rimGap = compact ? 2 : 3;\n const rimWidth = compact ? 3 : 4;\n const shownTarget = target && isNumber(target.value) && status !== 'loading' ? target : undefined;\n const tickMode = compact ? 'hidden' : ticks;\n const scaleMode = compact ? 'hidden' : scaleLabels;\n const segmentLabels = compact ? 'hidden' : showSegmentLabels;\n const majors = majorTicks(domain, tickCount, reading.showsPercent ? base : null);\n\n const outsideLabels: OutsideLabel[] = [\n ...(segmentLabels === 'hidden' ? [] : bands)\n .filter((band) => band.label)\n .map((band) => ({ angle: angleOf((band.from + band.to) / 2), kind: 'segment' as const, text: band.label! })),\n ...(shownTarget && !compact\n ? [{ angle: angleOf(shownTarget.value), kind: 'target' as const, text: `${shownTarget.label || 'Meta'} ${formatValue(shownTarget.value)}` }]\n : []),\n ];\n\n const center = gaugeCenter({\n centerLabel,\n compact,\n delta,\n domain,\n emptyMessage,\n reading,\n showCenter,\n status,\n value: measured ?? 0,\n });\n\n const valueText =\n measured === null\n ? undefined\n : (ariaValueText ?? gaugeValueText({ delta, domain, reading, segment: current, target, value: measured }));\n const accessibleName =\n status === 'loading'\n ? `${title}: carregando`\n : status === 'empty'\n ? `${title}: ${emptyMessage.toLocaleLowerCase('pt-BR')}`\n : title;\n\n function tooltip(): GaugeTooltip {\n if (measured === null || hovered === null) {\n return NO_TOOLTIP;\n }\n\n if (hovered === 'value') {\n const tipColor = colorBySegment && current ? current.color : arcColor;\n return valueTooltip({ color: tipColor, delta, domain, reading, segment: current, target, title, value: measured });\n }\n\n return segmentTooltip({ current, reading, segment: bands[hovered], target, value: measured });\n }\n\n const outerBand = (rim ? rimGap + rimWidth : 0) + (shownTarget ? TARGET_MARK : 0);\n\n function drawing() {\n const layout = layoutGauge({\n center,\n compact,\n endAngle: endRadians,\n font,\n height: drawingHeight,\n minMaxLabels: [\n { angle: startRadians, text: formatShown(reading, domain.min) },\n { angle: endRadians, text: formatShown(reading, domain.max) },\n ],\n needle,\n outerBand,\n outsideLabels,\n scaleLabels: scaleMode,\n startAngle: startRadians,\n thickness: compact ? Math.min(thickness, COMPACT_MAX_THICKNESS) : thickness,\n tickLabels: tickLabelPriority(majors, base).map((index) => ({\n angle: angleOf(majors[index]),\n text: formatShown(reading, majors[index]),\n })),\n ticks: tickMode,\n width,\n });\n const { innerRadius, radius } = layout;\n const corner = Math.max(0, Math.min(trackRadius ?? tokenRadius, layout.thickness / 2));\n const ring = (from: number, to: number, inner = innerRadius, outer = radius) =>\n arcPath({ endAngle: to, innerRadius: inner, outerRadius: outer, startAngle: from });\n const trackPath = arcPath({\n cornerRadius: corner,\n endAngle: endRadians,\n innerRadius,\n outerRadius: radius,\n startAngle: startRadians,\n });\n const bandOpacity = status !== 'value' ? 0.5 : showFill ? 0.32 : 1;\n const bandClass = (index: number) =>\n `${styles.segment} ${hovered === index ? styles.segmentHot : typeof hovered === 'number' ? styles.segmentDimmed : ''}`;\n const fillStart = angleOf(start);\n const fillEnd = angleOf(shown);\n const fillColor = colorBySegment ? (segmentAt(bands, shown)?.color ?? arcColor) : arcColor;\n const hitInner = innerRadius - 4;\n const hitOuter = radius + outerBand + 3;\n const describe = (text: string) => (showTooltip ? null : <title>{text}</title>);\n\n return (\n <svg\n aria-busy={status === 'loading' || undefined}\n aria-label={accessibleName}\n aria-valuemax={measured === null ? undefined : domain.max}\n aria-valuemin={measured === null ? undefined : domain.min}\n aria-valuenow={measured === null ? undefined : reached}\n aria-valuetext={valueText}\n className={styles.canvas}\n height={drawingHeight}\n role={measured === null ? 'img' : 'meter'}\n viewBox={`0 0 ${width} ${drawingHeight}`}\n width={width}\n >\n <defs>\n <clipPath id={clipId}>\n <path d={trackPath} />\n </clipPath>\n </defs>\n\n <g transform={`translate(${layout.cx} ${layout.cy})`}>\n <g className={status === 'loading' ? styles.loading : undefined}>\n <path className={styles.track} d={trackPath} />\n {trackBands && (\n <g clipPath={`url(#${clipId})`}>\n {bands.map((band, index) => (\n <path\n className={bandClass(index)}\n d={ring(angleOf(band.from), angleOf(band.to))}\n fill={band.color}\n key={index}\n opacity={bandOpacity}\n />\n ))}\n {bands.slice(1).map((band, index) => (\n <path className={styles.separator} d={radialPath(angleOf(band.from), innerRadius, radius)} key={index} />\n ))}\n </g>\n )}\n </g>\n\n {rim && (\n <g>\n {bands.map((band, index) => (\n <path\n className={bandClass(index)}\n d={ring(angleOf(band.from), angleOf(band.to), radius + rimGap, radius + rimGap + rimWidth)}\n fill={band.color}\n key={index}\n opacity={status === 'value' ? 1 : 0.5}\n />\n ))}\n {bands.slice(1).map((band, index) => (\n <path\n className={styles.separator}\n d={radialPath(angleOf(band.from), radius + rimGap - 1, radius + rimGap + rimWidth + 1)}\n key={index}\n />\n ))}\n </g>\n )}\n\n {tickMode !== 'hidden' && (\n <g>\n {tickMode === 'majorAndMinor' &&\n majors.slice(1).flatMap((major, index) =>\n [1, 2, 3, 4].map((step) => (\n <path\n className={styles.tickMinor}\n d={radialPath(angleOf(majors[index] + (step * (major - majors[index])) / 5), innerRadius - 3, innerRadius - 6)}\n key={`${index}-${step}`}\n />\n )),\n )}\n {majors.map((major, index) => (\n <path className={styles.tickMajor} d={radialPath(angleOf(major), innerRadius - 3, innerRadius - 9)} key={index} />\n ))}\n </g>\n )}\n\n {layout.scaleLabels.map(({ anchor, label, x, y }) => (\n <text\n className={styles.scaleLabel}\n dominantBaseline={scaleMode === 'ticks' ? 'central' : undefined}\n key={`${label.angle}-${label.text}`}\n textAnchor={anchor}\n x={x}\n y={y}\n >\n {label.text}\n </text>\n ))}\n\n {status === 'value' && start > domain.min && start < domain.max && (\n <path className={styles.originMark} d={radialPath(fillStart, innerRadius - 2, radius + 2)} />\n )}\n\n {showFill && status === 'value' && Math.abs(fillEnd - fillStart) > 1e-4 && (\n <path\n className={styles.fill}\n d={arcPath({\n cornerRadius: corner,\n endAngle: Math.max(fillStart, fillEnd),\n innerRadius,\n outerRadius: radius,\n startAngle: Math.min(fillStart, fillEnd),\n })}\n fill={fillColor}\n />\n )}\n\n {shownTarget && (\n <g>\n <path className={styles.targetOutline} d={radialPath(angleOf(shownTarget.value), innerRadius - 3, radius + outerBand)} />\n <path className={styles.targetLine} d={radialPath(angleOf(shownTarget.value), innerRadius - 3, radius + outerBand)} />\n </g>\n )}\n\n {layout.outsideLabels.map(({ anchor, label, x, y }) => (\n <text\n className={\n label.kind === 'target'\n ? styles.targetLabel\n : `${styles.segmentLabel} ${segmentLabels === 'onHover' ? styles.segmentLabelOnHover : ''}`\n }\n dominantBaseline=\"central\"\n key={`${label.kind}-${label.angle}`}\n textAnchor={anchor}\n x={x}\n y={y}\n >\n {label.text}\n </text>\n ))}\n\n {needle && (\n <g>\n <path\n className={styles.needle}\n d={needlePath(showFill ? innerRadius - 5 : radius - layout.thickness * 0.3, compact ? 2.2 : 3.6)}\n transform={`rotate(${toDegrees(angleOf(shown))})`}\n />\n <circle className={styles.needle} r={layout.pinRadius} />\n <circle className={styles.pinDot} r={compact ? 1.5 : 2.6} />\n </g>\n )}\n\n <CenterText center={layout.center} empty={status === 'empty'} />\n\n {status === 'value' && (\n <g className={styles.hits} onMouseLeave={() => setHovered(null)}>\n {bands.length > 0\n ? bands.map((band, index) => (\n <path\n d={ring(angleOf(band.from), angleOf(band.to), hitInner, hitOuter)}\n key={index}\n onMouseEnter={() => setHovered(index)}\n >\n {describe(`${segmentName(band)}: ${rangeText(reading, band)}`)}\n </path>\n ))\n : (\n <path d={ring(startRadians, endRadians, hitInner, hitOuter)} onMouseEnter={() => setHovered('value')}>\n {describe(valueText ?? '')}\n </path>\n )}\n <circle onMouseEnter={() => setHovered('value')} r={Math.max(hitInner * 0.85, 8)}>\n {describe(valueText ?? '')}\n </circle>\n </g>\n )}\n </g>\n </svg>\n );\n }\n\n const lateral = legend === 'left' || legend === 'right';\n const legendView = legend !== 'none' && bands.length > 0 && (\n <ChartLegend\n entries={bands.map((band) => ({ color: band.color, label: segmentName(band), value: rangeText(reading, band) }))}\n position={legend}\n />\n );\n const tip = tooltip();\n\n return (\n <figure className={styles.figure}>\n <figcaption className={styles.title}>{title}</figcaption>\n\n <div className={`${styles.body} ${lateral ? styles.bodyRow : styles.bodyColumn}`}>\n {(legend === 'top' || legend === 'left') && legendView}\n\n <div\n className={`${styles.plot} ${fillHeight ? styles.plotFill : ''}`}\n ref={ref}\n style={fillHeight ? undefined : { minHeight: drawingHeight }}\n >\n {width === 0 || drawingHeight === 0 ? null : showTooltip ? (\n <ChartTooltip columns={[{ format: reading.formatExact }]} computed=\"none\" {...tip}>\n {drawing()}\n </ChartTooltip>\n ) : (\n drawing()\n )}\n </div>\n\n {(legend === 'bottom' || legend === 'right') && legendView}\n </div>\n </figure>\n );\n}\n\nfunction needlePath(length: number, halfBase: number) {\n return `M${-halfBase},0L-0.8,${-length}L0.8,${-length}L${halfBase},0Z`;\n}\n\n/** Valor e linhas do centro, cada linha na sua altura dentro do bloco medido pelo layout. */\nfunction CenterText({ center, empty }: { center: GaugeCenterLayout; empty: boolean }) {\n const valueHeight = center.value ? center.value.size : 0;\n\n return (\n <g className={styles.center}>\n {center.value && (\n <text\n className={`${styles.centerValue} ${empty ? styles.centerValueEmpty : ''}`}\n style={{ fontFamily: center.value.family, fontSize: center.value.size }}\n textAnchor=\"middle\"\n y={center.top + center.value.size * 0.84}\n >\n {center.value.text}\n </text>\n )}\n {center.lines.map((line, index) => {\n const y = center.top + valueHeight + (index + 1) * center.lineHeight - 3;\n\n if (line.kind === 'text') {\n return (\n <text className={styles.centerLine} key={index} textAnchor=\"middle\" y={y}>\n {line.text}\n </text>\n );\n }\n\n if (line.kind === 'warn') {\n return (\n <text className={styles.centerWarn} key={index} textAnchor=\"middle\" y={y}>\n <tspan className={styles.warnGlyph}>{`${line.glyph} `}</tspan>\n {line.text}\n </text>\n );\n }\n\n return (\n <text className={styles.centerLine} key={index} textAnchor=\"middle\" y={y}>\n <tspan fill={INTENT_TOKENS[line.intent]}>{`${line.glyph} `}</tspan>\n <tspan className={styles.deltaNumber}>{line.text}</tspan>\n {line.label && <tspan className={styles.deltaLabel}>{` ${line.label}`}</tspan>}\n </text>\n );\n })}\n </g>\n );\n}\n"],"names":["COMPACT_MAX_THICKNESS","TARGET_MARK","NO_TOOLTIP","toRadians","degrees","toDegrees","radians","radialPath","angle","from","to","x1","y1","pointAt","x2","y2","ChartGauge","accent","ariaValueText","centerLabel","colorBySegment","color","delta","emptyMessage","endAngle","formatTooltipValue","formatValue","formatarNumero","height","indicator","intent","legend","loading","max","min","origin","scaleLabels","segmentStyle","segmentUnit","segments","showCenter","showSegmentLabels","showTooltip","size","startAngle","target","thickness","tickCount","ticks","title","trackRadius","value","valueDisplay","compact","font","measuredHeight","tokenRadius","ref","width","useChartMetrics","fillHeight","drawingHeight","chartHeight","clipId","useId","hovered","setHovered","useState","measured","isNumber","status","domain","gaugeDomain","base","targetBase","reading","gaugeReading","unit","bands","gaugeSegments","start","gaugeOrigin","reached","clampToDomain","tweened","useTweenedNumbers","shown","current","segmentAt","arcColor","resolveSeriesColors","startRadians","endRadians","angleOf","at","showFill","needle","rim","trackBands","rimGap","rimWidth","shownTarget","tickMode","scaleMode","segmentLabels","majors","majorTicks","outsideLabels","band","center","gaugeCenter","valueText","gaugeValueText","accessibleName","tooltip","tipColor","valueTooltip","segmentTooltip","outerBand","drawing","layout","layoutGauge","formatShown","tickLabelPriority","index","innerRadius","radius","corner","ring","inner","outer","arcPath","trackPath","bandOpacity","bandClass","styles","fillStart","fillEnd","fillColor","hitInner","hitOuter","describe","text","jsx","jsxs","major","step","anchor","label","x","y","needlePath","CenterText","segmentName","rangeText","lateral","legendView","ChartLegend","tip","ChartTooltip","length","halfBase","empty","valueHeight","line","INTENT_TOKENS"],"mappings":"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"}