@1doc/1ds-react 2.8.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/CHANGELOG.md +1540 -0
  2. package/dist/components/AILabel/AILabel.js +1 -1
  3. package/dist/components/Accordion/Accordion.css +13 -0
  4. package/dist/components/Accordion/Accordion.d.ts +9 -2
  5. package/dist/components/Accordion/Accordion.js +1 -0
  6. package/dist/components/AppSubheader/AppSubheader.css +10 -1
  7. package/dist/components/AttachmentCard/AttachmentCard.css +26 -8
  8. package/dist/components/AttachmentCard/AttachmentCard.d.ts +22 -2
  9. package/dist/components/AttachmentCard/AttachmentCard.js +47 -3
  10. package/dist/components/Avatar/Avatar.css +7 -2
  11. package/dist/components/Avatar/AvatarGroup.d.ts +17 -0
  12. package/dist/components/Avatar/AvatarGroup.js +22 -8
  13. package/dist/components/Badge/Badge.css +67 -2
  14. package/dist/components/Badge/Badge.d.ts +23 -4
  15. package/dist/components/Badge/Badge.js +4 -0
  16. package/dist/components/Box/Box.css +83 -0
  17. package/dist/components/Box/Box.d.ts +82 -2
  18. package/dist/components/Box/Box.js +42 -2
  19. package/dist/components/Button/Button.css +29 -0
  20. package/dist/components/Button/Button.d.ts +4 -4
  21. package/dist/components/Button/Button.js +4 -1
  22. package/dist/components/Calendar/Calendar.css +245 -0
  23. package/dist/components/Calendar/Calendar.d.ts +126 -0
  24. package/dist/components/Calendar/Calendar.js +320 -0
  25. package/dist/components/Chips/Chips.css +38 -0
  26. package/dist/components/Chips/Chips.d.ts +5 -2
  27. package/dist/components/Chips/Chips.js +2 -1
  28. package/dist/components/Coachmark/Coachmark.css +128 -0
  29. package/dist/components/Coachmark/Coachmark.d.ts +87 -0
  30. package/dist/components/Coachmark/Coachmark.js +362 -0
  31. package/dist/components/CodeBlock/CodeBlock.css +96 -0
  32. package/dist/components/CodeBlock/CodeBlock.d.ts +47 -0
  33. package/dist/components/CodeBlock/CodeBlock.js +103 -0
  34. package/dist/components/ColorPicker/ColorPicker.css +140 -0
  35. package/dist/components/ColorPicker/ColorPicker.d.ts +73 -0
  36. package/dist/components/ColorPicker/ColorPicker.js +219 -0
  37. package/dist/components/Combobox/Combobox.css +8 -0
  38. package/dist/components/DataTable/DataTable.css +254 -0
  39. package/dist/components/DataTable/DataTable.d.ts +81 -5
  40. package/dist/components/DataTable/DataTable.js +335 -19
  41. package/dist/components/DatePicker/DatePicker.css +8 -0
  42. package/dist/components/DatePicker/DatePicker.js +10 -1
  43. package/dist/components/DescriptionList/DescriptionList.css +127 -0
  44. package/dist/components/DescriptionList/DescriptionList.d.ts +62 -0
  45. package/dist/components/DescriptionList/DescriptionList.js +52 -0
  46. package/dist/components/EmptyState/EmptyState.d.ts +4 -2
  47. package/dist/components/EmptyState/EmptyState.js +2 -2
  48. package/dist/components/FileInput/FileInput.css +16 -0
  49. package/dist/components/FileInput/FileInput.d.ts +4 -2
  50. package/dist/components/FileInput/FileInput.js +8 -2
  51. package/dist/components/Grid/Grid.js +5 -5
  52. package/dist/components/IconPicker/IconPicker.css +107 -0
  53. package/dist/components/IconPicker/IconPicker.d.ts +74 -0
  54. package/dist/components/IconPicker/IconPicker.js +194 -0
  55. package/dist/components/Input/Input.css +59 -0
  56. package/dist/components/Input/Input.d.ts +17 -1
  57. package/dist/components/Input/Input.js +67 -5
  58. package/dist/components/Kanban/Kanban.css +4 -0
  59. package/dist/components/Kbd/Kbd.css +66 -0
  60. package/dist/components/Kbd/Kbd.d.ts +32 -0
  61. package/dist/components/Kbd/Kbd.js +40 -0
  62. package/dist/components/List/List.css +136 -0
  63. package/dist/components/List/List.d.ts +82 -0
  64. package/dist/components/List/List.js +53 -0
  65. package/dist/components/List/ListItem.d.ts +97 -0
  66. package/dist/components/List/ListItem.js +82 -0
  67. package/dist/components/Modal/Modal.css +80 -0
  68. package/dist/components/Modal/Modal.d.ts +33 -6
  69. package/dist/components/Modal/Modal.js +101 -6
  70. package/dist/components/MultiSelect/MultiSelect.css +8 -0
  71. package/dist/components/MultiSelect/MultiSelect.js +10 -1
  72. package/dist/components/OrgChart/OrgChart.css +149 -0
  73. package/dist/components/OrgChart/OrgChart.d.ts +83 -0
  74. package/dist/components/OrgChart/OrgChart.js +297 -0
  75. package/dist/components/OtpInput/OtpInput.css +93 -0
  76. package/dist/components/OtpInput/OtpInput.d.ts +60 -0
  77. package/dist/components/OtpInput/OtpInput.js +215 -0
  78. package/dist/components/PhoneInput/PhoneInput.css +8 -0
  79. package/dist/components/Popover/Popover.d.ts +7 -0
  80. package/dist/components/Popover/Popover.js +11 -1
  81. package/dist/components/RichTextEditor/RichTextEditor.css +250 -0
  82. package/dist/components/RichTextEditor/RichTextEditor.d.ts +97 -0
  83. package/dist/components/RichTextEditor/RichTextEditor.js +951 -0
  84. package/dist/components/SegmentedControl/SegmentedControl.css +24 -0
  85. package/dist/components/SegmentedControl/SegmentedControl.d.ts +2 -0
  86. package/dist/components/SegmentedControl/SegmentedControl.js +10 -2
  87. package/dist/components/Select/Select.css +164 -0
  88. package/dist/components/Select/Select.d.ts +34 -0
  89. package/dist/components/Select/Select.js +258 -28
  90. package/dist/components/Stack/Stack.css +49 -0
  91. package/dist/components/Stack/Stack.d.ts +65 -7
  92. package/dist/components/Stack/Stack.js +30 -2
  93. package/dist/components/StatCard/StatCard.css +138 -0
  94. package/dist/components/StatCard/StatCard.d.ts +26 -0
  95. package/dist/components/StatCard/StatCard.js +13 -1
  96. package/dist/components/Tabs/Tab.d.ts +15 -0
  97. package/dist/components/Tabs/Tab.js +30 -1
  98. package/dist/components/Tabs/Tabs.css +132 -0
  99. package/dist/components/Tabs/Tabs.d.ts +7 -0
  100. package/dist/components/Tabs/Tabs.js +13 -2
  101. package/dist/components/Tag/Tag.css +85 -2
  102. package/dist/components/Tag/Tag.d.ts +13 -6
  103. package/dist/components/Tag/Tag.js +1 -0
  104. package/dist/components/Text/Text.js +2 -2
  105. package/dist/components/Textarea/Textarea.css +8 -0
  106. package/dist/components/TimePicker/TimePicker.css +8 -0
  107. package/dist/components/Toast/Toast.css +32 -0
  108. package/dist/components/Toast/Toast.d.ts +18 -0
  109. package/dist/components/Toast/Toast.js +14 -1
  110. package/dist/components/Toast/ToastStack.js +8 -1
  111. package/dist/components/Tooltip/Tooltip.css +25 -0
  112. package/dist/components/Tooltip/Tooltip.d.ts +11 -0
  113. package/dist/components/Tooltip/Tooltip.js +18 -3
  114. package/dist/index.d.ts +25 -0
  115. package/dist/index.js +14 -0
  116. package/dist/teste/AILabel.test.d.ts +1 -0
  117. package/dist/teste/AILabel.test.js +33 -0
  118. package/dist/teste/AccordionConteudoLivre.test.d.ts +1 -0
  119. package/dist/teste/AccordionConteudoLivre.test.js +29 -0
  120. package/dist/teste/AccordionTituloNeutro.test.d.ts +1 -0
  121. package/dist/teste/AccordionTituloNeutro.test.js +23 -0
  122. package/dist/teste/AppSubheaderRegiao.test.d.ts +1 -0
  123. package/dist/teste/AppSubheaderRegiao.test.js +13 -0
  124. package/dist/teste/AtributosRepassados.test.d.ts +1 -0
  125. package/dist/teste/AtributosRepassados.test.js +52 -0
  126. package/dist/teste/AttachmentCardIA.test.d.ts +1 -0
  127. package/dist/teste/AttachmentCardIA.test.js +89 -0
  128. package/dist/teste/AttachmentCardLista.test.d.ts +1 -0
  129. package/dist/teste/AttachmentCardLista.test.js +49 -0
  130. package/dist/teste/AttachmentCardSm.test.d.ts +1 -0
  131. package/dist/teste/AttachmentCardSm.test.js +26 -0
  132. package/dist/teste/AvatarGroupOverlap.test.d.ts +1 -0
  133. package/dist/teste/AvatarGroupOverlap.test.js +56 -0
  134. package/dist/teste/BadgeNeutroColado.test.d.ts +1 -0
  135. package/dist/teste/BadgeNeutroColado.test.js +11 -0
  136. package/dist/teste/BadgeTag.test.d.ts +1 -0
  137. package/dist/teste/BadgeTag.test.js +55 -0
  138. package/dist/teste/BoxItemFlex.test.d.ts +1 -0
  139. package/dist/teste/BoxItemFlex.test.js +54 -0
  140. package/dist/teste/BoxLayout.test.d.ts +1 -0
  141. package/dist/teste/BoxLayout.test.js +35 -0
  142. package/dist/teste/Button.test.d.ts +1 -0
  143. package/dist/teste/Button.test.js +27 -0
  144. package/dist/teste/Calendar.test.d.ts +1 -0
  145. package/dist/teste/Calendar.test.js +221 -0
  146. package/dist/teste/CalendarCabecalho.test.d.ts +1 -0
  147. package/dist/teste/CalendarCabecalho.test.js +11 -0
  148. package/dist/teste/ChipsXs.test.d.ts +1 -0
  149. package/dist/teste/ChipsXs.test.js +31 -0
  150. package/dist/teste/Coachmark.test.d.ts +1 -0
  151. package/dist/teste/Coachmark.test.js +149 -0
  152. package/dist/teste/CoachmarkSemVeu.test.d.ts +1 -0
  153. package/dist/teste/CoachmarkSemVeu.test.js +85 -0
  154. package/dist/teste/ColorPicker.test.d.ts +1 -0
  155. package/dist/teste/ColorPicker.test.js +132 -0
  156. package/dist/teste/ColorPickerXs.test.d.ts +1 -0
  157. package/dist/teste/ColorPickerXs.test.js +21 -0
  158. package/dist/teste/DataTableArvoreEVariantes.test.d.ts +1 -0
  159. package/dist/teste/DataTableArvoreEVariantes.test.js +190 -0
  160. package/dist/teste/DataTableCelulaLivre.test.d.ts +1 -0
  161. package/dist/teste/DataTableCelulaLivre.test.js +76 -0
  162. package/dist/teste/DataTableDocumento.test.d.ts +1 -0
  163. package/dist/teste/DataTableDocumento.test.js +92 -0
  164. package/dist/teste/DatePicker.test.js +23 -0
  165. package/dist/teste/DescriptionListCompacta.test.d.ts +1 -0
  166. package/dist/teste/DescriptionListCompacta.test.js +22 -0
  167. package/dist/teste/EmptyStateTituloRico.test.d.ts +1 -0
  168. package/dist/teste/EmptyStateTituloRico.test.js +23 -0
  169. package/dist/teste/FileInputTrigger.test.d.ts +1 -0
  170. package/dist/teste/FileInputTrigger.test.js +53 -0
  171. package/dist/teste/IconPicker.test.d.ts +1 -0
  172. package/dist/teste/IconPicker.test.js +130 -0
  173. package/dist/teste/InputAgrupado.test.d.ts +1 -0
  174. package/dist/teste/InputAgrupado.test.js +24 -0
  175. package/dist/teste/InputMascaraEAfins.test.d.ts +1 -0
  176. package/dist/teste/InputMascaraEAfins.test.js +99 -0
  177. package/dist/teste/KbdCodeBlock.test.d.ts +1 -0
  178. package/dist/teste/KbdCodeBlock.test.js +95 -0
  179. package/dist/teste/List.test.d.ts +1 -0
  180. package/dist/teste/List.test.js +153 -0
  181. package/dist/teste/ListItemTooltipStandalone.test.d.ts +1 -0
  182. package/dist/teste/ListItemTooltipStandalone.test.js +39 -0
  183. package/dist/teste/ModalVariantes.test.d.ts +1 -0
  184. package/dist/teste/ModalVariantes.test.js +151 -0
  185. package/dist/teste/NomeAcessivelSsr.test.d.ts +1 -0
  186. package/dist/teste/NomeAcessivelSsr.test.js +88 -0
  187. package/dist/teste/OrgChart.test.d.ts +1 -0
  188. package/dist/teste/OrgChart.test.js +162 -0
  189. package/dist/teste/OtpInput.test.d.ts +1 -0
  190. package/dist/teste/OtpInput.test.js +143 -0
  191. package/dist/teste/PopoverMaxHeight.test.d.ts +1 -0
  192. package/dist/teste/PopoverMaxHeight.test.js +38 -0
  193. package/dist/teste/RichTextEditor.test.d.ts +1 -0
  194. package/dist/teste/RichTextEditor.test.js +287 -0
  195. package/dist/teste/RichTextEditorAlinhaImagemTabela.test.d.ts +1 -0
  196. package/dist/teste/RichTextEditorAlinhaImagemTabela.test.js +212 -0
  197. package/dist/teste/RichTextEditorEstiloDeTexto.test.d.ts +1 -0
  198. package/dist/teste/RichTextEditorEstiloDeTexto.test.js +120 -0
  199. package/dist/teste/SegmentedControlContador.test.d.ts +1 -0
  200. package/dist/teste/SegmentedControlContador.test.js +39 -0
  201. package/dist/teste/SelectAbertoControladoEFlutuante.test.d.ts +1 -0
  202. package/dist/teste/SelectAbertoControladoEFlutuante.test.js +145 -0
  203. package/dist/teste/SelectFiltroCorETamanho.test.d.ts +1 -0
  204. package/dist/teste/SelectFiltroCorETamanho.test.js +77 -0
  205. package/dist/teste/SelectPlacementFiltro.test.d.ts +1 -0
  206. package/dist/teste/SelectPlacementFiltro.test.js +88 -0
  207. package/dist/teste/Stack.test.d.ts +1 -0
  208. package/dist/teste/Stack.test.js +57 -0
  209. package/dist/teste/StatCardRotuloTopo.test.d.ts +1 -0
  210. package/dist/teste/StatCardRotuloTopo.test.js +34 -0
  211. package/dist/teste/StatCardSecundariaETom.test.d.ts +1 -0
  212. package/dist/teste/StatCardSecundariaETom.test.js +45 -0
  213. package/dist/teste/TabsContadorFechavel.test.d.ts +1 -0
  214. package/dist/teste/TabsContadorFechavel.test.js +79 -0
  215. package/dist/teste/ToastAcaoEDetalhes.test.d.ts +1 -0
  216. package/dist/teste/ToastAcaoEDetalhes.test.js +94 -0
  217. package/dist/teste/TooltipDark.test.d.ts +1 -0
  218. package/dist/teste/TooltipDark.test.js +31 -0
  219. package/dist/utils/calendario.d.ts +28 -0
  220. package/dist/utils/calendario.js +73 -0
  221. package/dist/utils/html-seguro.d.ts +45 -0
  222. package/dist/utils/html-seguro.js +208 -0
  223. package/dist/utils/paleta-de-cores.d.ts +26 -0
  224. package/dist/utils/paleta-de-cores.js +10 -0
  225. package/dist/utils/texto.d.ts +5 -0
  226. package/dist/utils/texto.js +5 -0
  227. package/dist/utils/toast.d.ts +10 -1
  228. package/dist/utils/toast.js +2 -1
  229. package/package.json +3 -3
  230. package/src/index.ts +26 -0
  231. package/src/teste/AILabel.test.tsx +41 -0
  232. package/src/teste/AccordionConteudoLivre.test.tsx +39 -0
  233. package/src/teste/AccordionTituloNeutro.test.tsx +25 -0
  234. package/src/teste/AppSubheaderRegiao.test.tsx +17 -0
  235. package/src/teste/AtributosRepassados.test.tsx +73 -0
  236. package/src/teste/AttachmentCardIA.test.tsx +126 -0
  237. package/src/teste/AttachmentCardLista.test.tsx +53 -0
  238. package/src/teste/AttachmentCardSm.test.tsx +29 -0
  239. package/src/teste/AvatarGroupOverlap.test.tsx +74 -0
  240. package/src/teste/BadgeNeutroColado.test.tsx +15 -0
  241. package/src/teste/BadgeTag.test.tsx +85 -0
  242. package/src/teste/BoxItemFlex.test.tsx +81 -0
  243. package/src/teste/BoxLayout.test.tsx +50 -0
  244. package/src/teste/Button.test.tsx +39 -0
  245. package/src/teste/Calendar.test.tsx +282 -0
  246. package/src/teste/CalendarCabecalho.test.tsx +11 -0
  247. package/src/teste/ChipsXs.test.tsx +41 -0
  248. package/src/teste/Coachmark.test.tsx +198 -0
  249. package/src/teste/CoachmarkSemVeu.test.tsx +101 -0
  250. package/src/teste/ColorPicker.test.tsx +153 -0
  251. package/src/teste/ColorPickerXs.test.tsx +22 -0
  252. package/src/teste/DataTableArvoreEVariantes.test.tsx +240 -0
  253. package/src/teste/DataTableCelulaLivre.test.tsx +103 -0
  254. package/src/teste/DataTableDocumento.test.tsx +102 -0
  255. package/src/teste/DatePicker.test.tsx +38 -0
  256. package/src/teste/DescriptionListCompacta.test.tsx +24 -0
  257. package/src/teste/EmptyStateTituloRico.test.tsx +34 -0
  258. package/src/teste/FileInputTrigger.test.tsx +89 -0
  259. package/src/teste/IconPicker.test.tsx +145 -0
  260. package/src/teste/InputAgrupado.test.tsx +26 -0
  261. package/src/teste/InputMascaraEAfins.test.tsx +124 -0
  262. package/src/teste/KbdCodeBlock.test.tsx +106 -0
  263. package/src/teste/List.test.tsx +269 -0
  264. package/src/teste/ListItemTooltipStandalone.test.tsx +64 -0
  265. package/src/teste/ModalVariantes.test.tsx +173 -0
  266. package/src/teste/NomeAcessivelSsr.test.tsx +110 -0
  267. package/src/teste/OrgChart.test.tsx +183 -0
  268. package/src/teste/OtpInput.test.tsx +163 -0
  269. package/src/teste/PopoverMaxHeight.test.tsx +47 -0
  270. package/src/teste/RichTextEditor.test.tsx +329 -0
  271. package/src/teste/RichTextEditorAlinhaImagemTabela.test.tsx +238 -0
  272. package/src/teste/RichTextEditorEstiloDeTexto.test.tsx +137 -0
  273. package/src/teste/SegmentedControlContador.test.tsx +43 -0
  274. package/src/teste/SelectAbertoControladoEFlutuante.test.tsx +180 -0
  275. package/src/teste/SelectFiltroCorETamanho.test.tsx +90 -0
  276. package/src/teste/SelectPlacementFiltro.test.tsx +110 -0
  277. package/src/teste/Stack.test.tsx +80 -0
  278. package/src/teste/StatCardRotuloTopo.test.tsx +44 -0
  279. package/src/teste/StatCardSecundariaETom.test.tsx +51 -0
  280. package/src/teste/TabsContadorFechavel.test.tsx +144 -0
  281. package/src/teste/ToastAcaoEDetalhes.test.tsx +109 -0
  282. package/src/teste/TooltipDark.test.tsx +51 -0
  283. package/src/utils/calendario.ts +78 -0
  284. package/src/utils/html-seguro.ts +197 -0
  285. package/src/utils/paleta-de-cores.ts +34 -0
  286. package/src/utils/texto.ts +5 -0
  287. package/src/utils/toast.ts +12 -2
@@ -1,6 +1,10 @@
1
- import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
1
+ "use client";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
3
  import './Stack.css';
3
4
  function Stack(props) {
5
+ function elementTag() {
6
+ return props.as || "div";
7
+ }
4
8
  function classes() {
5
9
  return [
6
10
  "umds-stack",
@@ -10,11 +14,35 @@ function Stack(props) {
10
14
  props.justify ? `umds-stack--justify-${props.justify}` : "",
11
15
  props.wrap ? "umds-stack--wrap" : "",
12
16
  props.inline ? "umds-stack--inline" : "",
17
+ props.grow ? "umds-stack--grow" : "",
18
+ props.shrink ? `umds-stack--shrink-${props.shrink}` : "",
19
+ props.basis ? `umds-stack--basis-${props.basis}` : "",
20
+ props.minWidth ? `umds-stack--min-w-${props.minWidth}` : "",
21
+ props.overflow ? `umds-stack--overflow-${props.overflow}` : "",
22
+ props.overflowX ? `umds-stack--overflow-x-${props.overflowX}` : "",
23
+ props.overflowY ? `umds-stack--overflow-y-${props.overflowY}` : "",
24
+ props.fullHeight ? "umds-stack--full-height" : "",
25
+ props.fullWidth ? "umds-stack--full-width" : "",
13
26
  props.className,
14
27
  ]
15
28
  .filter(Boolean)
16
29
  .join(" ");
17
30
  }
18
- return (_jsx("div", { className: classes(), children: _jsx(_Fragment, { children: props.children }) }));
31
+ function htmlAttrs() {
32
+ const out = {};
33
+ for (const chave in props) {
34
+ if (chave.indexOf("data-") === 0 ||
35
+ chave.indexOf("aria-") === 0 ||
36
+ chave === "style" ||
37
+ chave === "class" ||
38
+ chave === "title" ||
39
+ chave === "role" ||
40
+ chave === "tabIndex") {
41
+ out[chave] = props[chave];
42
+ }
43
+ }
44
+ return out;
45
+ }
46
+ return (_jsxs(_Fragment, { children: [elementTag() === "div" ? (_jsx("div", { id: props.id, ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null, elementTag() === "span" ? (_jsx("span", { id: props.id, ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null, elementTag() === "ul" ? (_jsx("ul", { role: "list", id: props.id, ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null, elementTag() === "ol" ? (_jsx("ol", { role: "list", id: props.id, ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null, elementTag() === "li" ? (_jsx("li", { id: props.id, ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null, elementTag() === "section" ? (_jsx("section", { id: props.id, ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null, elementTag() === "nav" ? (_jsx("nav", { id: props.id, ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null, elementTag() === "header" ? (_jsx("header", { id: props.id, ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null, elementTag() === "footer" ? (_jsx("footer", { id: props.id, ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null, elementTag() === "form" ? (_jsx("form", { id: props.id, onSubmit: (event) => props.onSubmit && props.onSubmit(event), ...htmlAttrs(), className: classes(), children: _jsx(_Fragment, { children: props.children }) })) : null] }));
19
47
  }
20
48
  export default Stack;
@@ -152,3 +152,141 @@
152
152
  .umds-stat-card__variacao--neutral {
153
153
  color: var(--umds-semantic-color-neutral-dark-down);
154
154
  }
155
+
156
+ /* ── ⓘ de ajuda ao lado do rótulo (infoTooltip) ── */
157
+ .umds-stat-card__rotulo {
158
+ display: inline-flex;
159
+ align-items: center;
160
+ gap: var(--umds-primitive-spacing-nano);
161
+ }
162
+
163
+ .umds-stat-card__info {
164
+ display: inline-flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ padding: 0;
168
+ border: none;
169
+ background: transparent;
170
+ color: var(--umds-semantic-color-neutral-dark-medium);
171
+ cursor: help;
172
+ border-radius: var(--umds-primitive-border-radius-circular);
173
+ }
174
+
175
+ .umds-stat-card__info:hover {
176
+ color: var(--umds-semantic-color-neutral-dark-pure);
177
+ }
178
+
179
+ .umds-stat-card__info:focus-visible {
180
+ outline: 2px solid var(--umds-semantic-color-primary-pure);
181
+ outline-offset: 2px;
182
+ }
183
+
184
+ /* ── labelPosition="top": rótulo no topo, ícone e número embaixo ──
185
+ O HTML segue com o número antes do rótulo (a ordem do leitor de tela); só a
186
+ grade muda a ordem visual. O corpo vira `display: contents` para o rótulo,
187
+ o número e o resto virarem itens da própria grade do cartão. */
188
+ .umds-stat-card--rotulo-topo {
189
+ display: grid;
190
+ grid-template-columns: auto 1fr;
191
+ align-items: center;
192
+ column-gap: 0;
193
+ row-gap: var(--umds-primitive-spacing-nano);
194
+ }
195
+
196
+ .umds-stat-card--rotulo-topo .umds-stat-card__corpo {
197
+ display: contents;
198
+ }
199
+
200
+ .umds-stat-card--rotulo-topo .umds-stat-card__rotulo {
201
+ grid-column: 1 / -1;
202
+ grid-row: 1;
203
+ font-weight: var(--umds-primitive-font-weight-semibold);
204
+ }
205
+
206
+ .umds-stat-card--rotulo-topo .umds-stat-card__icone {
207
+ grid-column: 1;
208
+ grid-row: 2;
209
+ margin-right: var(--umds-primitive-spacing-mini);
210
+ }
211
+
212
+ .umds-stat-card--rotulo-topo .umds-stat-card__valor {
213
+ grid-column: 2;
214
+ grid-row: 2;
215
+ font-size: var(--umds-primitive-font-size-lg); /* 32px */
216
+ font-weight: var(--umds-primitive-font-weight-extrabold);
217
+ }
218
+
219
+ .umds-stat-card--rotulo-topo .umds-stat-card__descricao,
220
+ .umds-stat-card--rotulo-topo .umds-stat-card__variacao {
221
+ grid-column: 1 / -1;
222
+ }
223
+
224
+ /* Sem ícone, o número ocupa a linha toda. */
225
+ .umds-stat-card--rotulo-topo:not(:has(.umds-stat-card__icone)) .umds-stat-card__valor {
226
+ grid-column: 1 / -1;
227
+ }
228
+
229
+ /* ── valueTone: cor do número principal (variantes escuras: contraste AA no branco) ── */
230
+ .umds-stat-card--valor-primary .umds-stat-card__valor {
231
+ color: var(--umds-semantic-color-primary-pure);
232
+ }
233
+
234
+ .umds-stat-card--valor-positive .umds-stat-card__valor {
235
+ color: var(--umds-semantic-color-feedback-positive-dark);
236
+ }
237
+
238
+ .umds-stat-card--valor-negative .umds-stat-card__valor {
239
+ color: var(--umds-semantic-color-feedback-negative-dark);
240
+ }
241
+
242
+ .umds-stat-card--valor-info .umds-stat-card__valor {
243
+ color: var(--umds-semantic-color-feedback-info-dark);
244
+ }
245
+
246
+ /* ── Segunda medida (secondaryValue, secondaryLabel) ──
247
+ Menor, à direita da principal, separada por um filete. Vem depois do corpo no HTML. */
248
+ .umds-stat-card__secundaria {
249
+ display: flex;
250
+ flex-direction: column;
251
+ gap: var(--umds-primitive-spacing-micro);
252
+ margin-left: auto;
253
+ padding-left: var(--umds-primitive-spacing-xxxs);
254
+ border-left: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
255
+ text-align: right;
256
+ }
257
+
258
+ .umds-stat-card--centro .umds-stat-card__secundaria {
259
+ margin-left: 0;
260
+ padding-left: 0;
261
+ border-left: none;
262
+ align-items: center;
263
+ text-align: center;
264
+ }
265
+
266
+ .umds-stat-card__valor-secundario {
267
+ font-size: var(--umds-primitive-font-size-sm); /* 20px */
268
+ font-weight: var(--umds-primitive-font-weight-bold);
269
+ line-height: 1.15;
270
+ font-variant-numeric: tabular-nums;
271
+ color: var(--umds-semantic-color-neutral-dark-down);
272
+ }
273
+
274
+ .umds-stat-card__rotulo-secundario {
275
+ font-size: var(--umds-primitive-font-size-xxxs);
276
+ color: var(--umds-semantic-color-neutral-dark-down);
277
+ line-height: 1.4;
278
+ }
279
+
280
+ /* Com o rótulo no topo a grade ganha uma terceira coluna para a segunda medida. */
281
+ .umds-stat-card--rotulo-topo.umds-stat-card--com-secundaria {
282
+ grid-template-columns: auto 1fr auto;
283
+ }
284
+
285
+ .umds-stat-card--rotulo-topo .umds-stat-card__secundaria {
286
+ grid-column: 3;
287
+ grid-row: 2;
288
+ }
289
+
290
+ .umds-stat-card--rotulo-topo.umds-stat-card--com-secundaria:not(:has(.umds-stat-card__icone)) .umds-stat-card__valor {
291
+ grid-column: 1 / 3;
292
+ }
@@ -22,6 +22,12 @@ import './StatCard.css';
22
22
  * @property {string} trendIntent - Se a variação é boa ou ruim (cor), independente da direção: 'positive' | 'negative' | 'neutral'
23
23
  * @property {string} trendLabel - Texto da variação (ex.: '12% em relação ao mês anterior')
24
24
  * @property {string} description - Texto auxiliar abaixo do rótulo
25
+ * @property {string} labelPosition - Onde o rótulo aparece: 'bottom' (padrão, embaixo do número) | 'top' (no topo do cartão, acima do ícone e do número, com o número em 32/800). No HTML o número continua vindo antes do rótulo, então o leitor de tela anuncia igual.
26
+ * @property {string|number} secondaryValue - Segunda medida do cartão, menor, à direita da principal ("22,31%" do setor e "14,11%" do geral). Vem depois do resto no HTML. `0` aparece; vazio e ausente não.
27
+ * @property {string} secondaryLabel - O que a segunda medida significa ("Geral")
28
+ * @property {string} valueTone - Cor do número principal: 'default' (cor do texto) | 'primary' | 'positive' | 'negative' | 'info'. Usa as variantes escuras (contraste AA sobre o branco). Não confunda com `variant`, que pinta o ícone e a variação.
29
+ * @property {string} infoTooltip - Texto de ajuda: mostra um ⓘ ao lado do rótulo com um Tooltip escuro. É um botão dentro do cartão; com `onClick` no cartão, evite (botão dentro de botão).
30
+ * @property {string} infoLabel - Nome acessível do ⓘ. Troque para traduzir. Padrão: "Mais informações".
25
31
  * @property {string} align - Alinhamento do conteúdo
26
32
  * @property {string} className - Classes CSS adicionais
27
33
  * @property {function} onClick - Torna o cartão acionável (vira botão)
@@ -56,6 +62,26 @@ export interface StatCardProps {
56
62
  description?: string;
57
63
  /** Alinhamento do conteúdo. @default 'start' */
58
64
  align?: "start" | "center";
65
+ /**
66
+ * Onde o rótulo aparece. `top` põe o rótulo no topo do cartão, acima do
67
+ * ícone e do número (que passa a 32/800), como no painel da 1Doc. No HTML o
68
+ * número segue antes do rótulo: só a posição visual muda.
69
+ * @default 'bottom'
70
+ */
71
+ labelPosition?: "bottom" | "top";
72
+ /** Segunda medida, menor, à direita da principal. 0 aparece; vazio e ausente não. */
73
+ secondaryValue?: string | number;
74
+ /** O que a segunda medida significa. */
75
+ secondaryLabel?: string;
76
+ /** Cor do número principal. @default 'default' */
77
+ valueTone?: "default" | "primary" | "positive" | "negative" | "info";
78
+ /**
79
+ * Texto de ajuda: mostra o ⓘ ao lado do rótulo, com um Tooltip escuro. É um
80
+ * botão focável dentro do cartão; com `onClick` no cartão, evite.
81
+ */
82
+ infoTooltip?: string;
83
+ /** Nome acessível do ⓘ. @default 'Mais informações' */
84
+ infoLabel?: string;
59
85
  /** Classes CSS adicionais. */
60
86
  className?: string;
61
87
  /** Torna o cartão acionável. */
@@ -1,13 +1,20 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import './StatCard.css';
4
+ import { faCircleInfo } from "@fortawesome/free-solid-svg-icons";
4
5
  import Icon from "../Icon/Icon";
6
+ import Tooltip from "../Tooltip/Tooltip";
5
7
  function StatCard(props) {
6
8
  function classes() {
7
9
  return [
8
10
  "umds-stat-card",
9
11
  `umds-stat-card--${props.variant || "neutral"}`,
10
12
  props.align === "center" ? "umds-stat-card--centro" : "",
13
+ props.labelPosition === "top" ? "umds-stat-card--rotulo-topo" : "",
14
+ temSecundaria() ? "umds-stat-card--com-secundaria" : "",
15
+ props.valueTone && props.valueTone !== "default"
16
+ ? "umds-stat-card--valor-" + props.valueTone
17
+ : "",
11
18
  props.onClick ? "umds-stat-card--acionavel" : "",
12
19
  props.className,
13
20
  ]
@@ -35,6 +42,11 @@ function StatCard(props) {
35
42
  return "↓";
36
43
  return "→";
37
44
  }
45
+ function temSecundaria() {
46
+ return (props.secondaryValue !== undefined &&
47
+ props.secondaryValue !== null &&
48
+ props.secondaryValue !== "");
49
+ }
38
50
  function ehAcionavel() {
39
51
  return !!props.onClick;
40
52
  }
@@ -45,6 +57,6 @@ function StatCard(props) {
45
57
  if (props.onClick)
46
58
  props.onClick();
47
59
  }
48
- return (_jsxs("div", { className: classes(), onClick: (event) => aoClicar(), role: ehAcionavel() ? "button" : undefined, tabIndex: ehAcionavel() ? 0 : undefined, children: [props.icon ? (_jsx("span", { className: "umds-stat-card__icone", "aria-hidden": "true", children: _jsx(Icon, { size: "md", variant: "inherit", icon: props.icon }) })) : null, _jsxs("div", { className: "umds-stat-card__corpo", children: [_jsx("span", { className: "umds-stat-card__valor", children: props.value }), _jsx("span", { className: "umds-stat-card__rotulo", children: props.label }), props.description ? (_jsx("span", { className: "umds-stat-card__descricao", children: props.description })) : null, props.trendLabel ? (_jsxs("span", { className: classesDaVariacao(), children: [_jsx("span", { "aria-hidden": "true", children: simboloDaVariacao() }), props.trendLabel] })) : null] })] }));
60
+ return (_jsxs("div", { className: classes(), onClick: (event) => aoClicar(), role: ehAcionavel() ? "button" : undefined, tabIndex: ehAcionavel() ? 0 : undefined, children: [props.icon ? (_jsx("span", { className: "umds-stat-card__icone", "aria-hidden": "true", children: _jsx(Icon, { size: "md", variant: "inherit", icon: props.icon }) })) : null, _jsxs("div", { className: "umds-stat-card__corpo", children: [_jsx("span", { className: "umds-stat-card__valor", children: props.value }), _jsxs("span", { className: "umds-stat-card__rotulo", children: [props.label, props.infoTooltip ? (_jsx(Tooltip, { variant: "dark", side: "top", content: props.infoTooltip, children: _jsx("button", { type: "button", className: "umds-stat-card__info", "aria-label": props.infoLabel || "Mais informações", children: _jsx(Icon, { variant: "inherit", customSize: "14px", icon: faCircleInfo }) }) })) : null] }), props.description ? (_jsx("span", { className: "umds-stat-card__descricao", children: props.description })) : null, props.trendLabel ? (_jsxs("span", { className: classesDaVariacao(), children: [_jsx("span", { "aria-hidden": "true", children: simboloDaVariacao() }), props.trendLabel] })) : null] }), temSecundaria() ? (_jsxs("div", { className: "umds-stat-card__secundaria", children: [_jsx("span", { className: "umds-stat-card__valor-secundario", children: props.secondaryValue }), props.secondaryLabel ? (_jsx("span", { className: "umds-stat-card__rotulo-secundario", children: props.secondaryLabel })) : null] })) : null] }));
49
61
  }
50
62
  export default StatCard;
@@ -16,6 +16,21 @@ export interface TabProps {
16
16
  icon?: IconProp;
17
17
  /** Se a tab está desabilitada */
18
18
  disabled?: boolean;
19
+ /**
20
+ * Contador em pílula ao lado do texto: azul na aba ativa, cinza nas outras.
21
+ * Aceita número ou texto; o `0` aparece. Sem a prop, não há pílula.
22
+ */
23
+ count?: number | string;
24
+ /**
25
+ * Mostra o × para fechar a aba (abas de navegador, documentos abertos). O
26
+ * × é um botão próprio, irmão da aba (não dentro dela), e a tecla Delete
27
+ * na aba focada faz o mesmo. Quem remove a aba é o app, em `onClose`.
28
+ */
29
+ closable?: boolean;
30
+ /** Chamado ao fechar a aba, com o `index` dela e o evento. */
31
+ onClose?: (index: string, event?: any) => void;
32
+ /** Prefixo do nome acessível do ×; o texto da aba vem depois ("Fechar Documento 1"). Troque para traduzir. @default 'Fechar' */
33
+ closeLabel?: string;
19
34
  /** Classes CSS adicionais */
20
35
  className?: string;
21
36
  }
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useContext } from "react";
4
+ import { faXmark } from "@fortawesome/free-solid-svg-icons";
4
5
  import TabsContext from "./tabs.context";
5
6
  import Icon from "../Icon/Icon";
6
7
  function Tab(props) {
@@ -17,11 +18,26 @@ function Tab(props) {
17
18
  ? tabsContext.tabsId + "-panel-" + props.index
18
19
  : undefined;
19
20
  }
21
+ function temContador() {
22
+ return (props.count !== undefined && props.count !== null && props.count !== "");
23
+ }
24
+ function itemClasses() {
25
+ return [
26
+ "umds-tabs__item",
27
+ props.closable ? "umds-tabs__item--closable" : "",
28
+ ]
29
+ .filter(Boolean)
30
+ .join(" ");
31
+ }
32
+ function closeAriaText() {
33
+ return (props.closeLabel || "Fechar") + " " + props.label;
34
+ }
20
35
  function classes() {
21
36
  return [
22
37
  "umds-tabs__tab",
23
38
  isSelected() ? "umds-tabs__tab--selected" : "",
24
39
  props.disabled ? "umds-tabs__tab--disabled" : "",
40
+ props.closable ? "umds-tabs__tab--closable" : "",
25
41
  props.className,
26
42
  ]
27
43
  .filter(Boolean)
@@ -42,9 +58,22 @@ function Tab(props) {
42
58
  tabsContext.onChange(props.index);
43
59
  }
44
60
  }
61
+ function handleClose(event) {
62
+ event.stopPropagation();
63
+ if (props.disabled)
64
+ return;
65
+ if (typeof props.onClose === "function") {
66
+ props.onClose(props.index, event);
67
+ }
68
+ }
45
69
  function handleKeyDown(event) {
46
70
  if (props.disabled)
47
71
  return;
72
+ if (props.closable && event.key === "Delete") {
73
+ event.preventDefault();
74
+ handleClose(event);
75
+ return;
76
+ }
48
77
  if (event.key === "Enter" || event.key === " ") {
49
78
  event.preventDefault();
50
79
  handleClick();
@@ -81,6 +110,6 @@ function Tab(props) {
81
110
  }
82
111
  }
83
112
  const tabsContext = useContext(TabsContext);
84
- return (_jsxs("button", { role: "tab", id: tabId(), "aria-controls": panelId(), "data-tab-index": props.index, "aria-selected": isSelected(), "aria-disabled": props.disabled, tabIndex: isSelected() ? 0 : -1, disabled: props.disabled, onClick: (event) => handleClick(), onKeyDown: (event) => handleKeyDown(event), className: classes(), children: [props.icon ? (_jsx(Icon, { size: "md", variant: "inherit", icon: props.icon })) : null, _jsx("span", { className: labelClasses(), children: props.label })] }));
113
+ return (_jsxs("span", { role: "presentation", className: itemClasses(), children: [_jsxs("button", { role: "tab", id: tabId(), "aria-controls": panelId(), "data-tab-index": props.index, "aria-selected": isSelected(), "aria-disabled": props.disabled, tabIndex: isSelected() ? 0 : -1, disabled: props.disabled, onClick: (event) => handleClick(), onKeyDown: (event) => handleKeyDown(event), className: classes(), children: [props.icon ? (_jsx(Icon, { size: "md", variant: "inherit", icon: props.icon })) : null, _jsx("span", { className: labelClasses(), children: props.label }), temContador() ? (_jsx("span", { className: "umds-tabs__count", children: props.count })) : null] }), props.closable ? (_jsx("button", { type: "button", className: "umds-tabs__close", "aria-label": closeAriaText(), disabled: props.disabled, tabIndex: -1, onClick: (event) => handleClose(event), children: _jsx(Icon, { variant: "inherit", customSize: "10px", icon: faXmark }) })) : null] }));
85
114
  }
86
115
  export default Tab;
@@ -8,6 +8,36 @@
8
8
  font-family: var(--umds-semantic-font-family-base);
9
9
  }
10
10
 
11
+ /* ============================
12
+ Barra: o tablist e, com onAdd, o botão "+" (fora do tablist)
13
+ ============================ */
14
+ .umds-tabs__bar {
15
+ display: flex;
16
+ align-items: stretch;
17
+ min-width: 0;
18
+ }
19
+
20
+ .umds-tabs__bar .umds-tabs__list {
21
+ flex: 1 1 auto;
22
+ min-width: 0;
23
+ }
24
+
25
+ /* Com "+", a lista não estica: o botão fica logo depois da última aba. */
26
+ .umds-tabs__bar--com-add .umds-tabs__list {
27
+ flex: 0 1 auto;
28
+ }
29
+
30
+ /* Envoltório de cada aba (presentation). Sem × é transparente para o layout;
31
+ com × vira a âncora do botão de fechar. */
32
+ .umds-tabs__item {
33
+ display: contents;
34
+ }
35
+
36
+ .umds-tabs__item--closable {
37
+ display: flex;
38
+ position: relative;
39
+ }
40
+
11
41
  /* ============================
12
42
  Tab List (tablist)
13
43
  ============================ */
@@ -150,3 +180,105 @@
150
180
  .umds-tabs-content {
151
181
  width: 100%;
152
182
  }
183
+
184
+ /* ============================
185
+ Contador em pílula (count)
186
+ Cinza nas abas inativas, azul na ativa. 18px de altura (16 + 2, dois degraus
187
+ do DS somados; sem token próprio).
188
+ ============================ */
189
+ .umds-tabs__count {
190
+ display: inline-flex;
191
+ align-items: center;
192
+ justify-content: center;
193
+ box-sizing: border-box;
194
+ height: calc(var(--umds-primitive-spacing-xxxs) + var(--umds-primitive-spacing-micro)); /* 18px */
195
+ min-width: calc(var(--umds-primitive-spacing-xxxs) + var(--umds-primitive-spacing-micro)); /* 18px */
196
+ padding: 0 var(--umds-primitive-spacing-quarck);
197
+ border-radius: var(--umds-primitive-border-radius-pill);
198
+ background-color: var(--umds-semantic-color-neutral-light-medium);
199
+ color: var(--umds-semantic-color-neutral-dark-down);
200
+ font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
201
+ font-weight: var(--umds-primitive-font-weight-semibold);
202
+ line-height: 1;
203
+ }
204
+
205
+ .umds-tabs__tab--selected .umds-tabs__count {
206
+ background-color: var(--umds-semantic-color-primary-pure);
207
+ color: var(--umds-semantic-color-neutral-light-pure);
208
+ }
209
+
210
+ .umds-tabs__tab--disabled .umds-tabs__count {
211
+ background-color: var(--umds-semantic-color-neutral-light-up);
212
+ color: var(--umds-semantic-color-neutral-dark-up);
213
+ }
214
+
215
+ /* ============================
216
+ Aba fechável (closable): × em botão próprio, sobre a folga direita da aba
217
+ ============================ */
218
+ .umds-tabs__tab--closable {
219
+ /* folga para o ×: 8 de margem + 20 do botão + 4 de respiro */
220
+ padding-right: var(--umds-primitive-spacing-xs); /* 32px */
221
+ }
222
+
223
+ .umds-tabs__close {
224
+ position: absolute;
225
+ top: 50%;
226
+ right: var(--umds-primitive-spacing-nano);
227
+ transform: translateY(-50%);
228
+ display: inline-flex;
229
+ align-items: center;
230
+ justify-content: center;
231
+ width: 20px; /* círculo de 20px: o glifo é de 10px */
232
+ height: 20px;
233
+ padding: 0;
234
+ border: none;
235
+ border-radius: var(--umds-primitive-border-radius-circular);
236
+ background: transparent;
237
+ color: var(--umds-semantic-color-neutral-dark-down);
238
+ cursor: pointer;
239
+ }
240
+
241
+ .umds-tabs__close:hover:not(:disabled) {
242
+ background-color: var(--umds-semantic-color-neutral-light-medium);
243
+ color: var(--umds-semantic-color-neutral-dark-pure);
244
+ }
245
+
246
+ .umds-tabs__close:focus-visible {
247
+ outline: 2px solid var(--umds-semantic-color-primary-pure);
248
+ outline-offset: 1px;
249
+ }
250
+
251
+ .umds-tabs__close:disabled {
252
+ cursor: not-allowed;
253
+ color: var(--umds-semantic-color-neutral-dark-up);
254
+ }
255
+
256
+ /* ============================
257
+ Botão "+" (onAdd)
258
+ ============================ */
259
+ .umds-tabs__add {
260
+ display: inline-flex;
261
+ align-items: center;
262
+ justify-content: center;
263
+ align-self: center;
264
+ flex-shrink: 0;
265
+ width: var(--umds-primitive-spacing-xs); /* 32px */
266
+ height: var(--umds-primitive-spacing-xs);
267
+ margin-left: var(--umds-primitive-spacing-quarck);
268
+ padding: 0;
269
+ border: none;
270
+ border-radius: var(--umds-primitive-border-radius-sm);
271
+ background: transparent;
272
+ color: var(--umds-semantic-color-neutral-dark-down);
273
+ cursor: pointer;
274
+ }
275
+
276
+ .umds-tabs__add:hover {
277
+ background-color: var(--umds-semantic-color-neutral-light-medium);
278
+ color: var(--umds-semantic-color-neutral-dark-pure);
279
+ }
280
+
281
+ .umds-tabs__add:focus-visible {
282
+ outline: 2px solid var(--umds-semantic-color-primary-pure);
283
+ outline-offset: 2px;
284
+ }
@@ -23,6 +23,13 @@ export interface TabsProps {
23
23
  * como gerar um id compartilhado automaticamente).
24
24
  */
25
25
  id?: string;
26
+ /**
27
+ * Mostra o botão "+" depois da última aba (abrir nova aba, como no navegador)
28
+ * e o chama com `onAdd`. O botão fica fora do `tablist`.
29
+ */
30
+ onAdd?: (event?: any) => void;
31
+ /** Nome acessível do botão "+". Troque para traduzir. @default 'Adicionar aba' */
32
+ addLabel?: string;
26
33
  /** Classes CSS adicionais */
27
34
  className?: string;
28
35
  /** Subcomponentes Tab */
@@ -1,15 +1,26 @@
1
1
  "use client";
2
- import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import './Tabs.css';
4
+ import { faPlus } from "@fortawesome/free-solid-svg-icons";
5
+ import Icon from "../Icon/Icon";
4
6
  import TabsContext from "./tabs.context";
5
7
  function Tabs(props) {
6
8
  function classes() {
7
9
  return ["umds-tabs", props.className].filter(Boolean).join(" ");
8
10
  }
11
+ function barClasses() {
12
+ return ["umds-tabs__bar", props.onAdd ? "umds-tabs__bar--com-add" : ""]
13
+ .filter(Boolean)
14
+ .join(" ");
15
+ }
16
+ function handleAdd(event) {
17
+ if (typeof props.onAdd === "function")
18
+ props.onAdd(event);
19
+ }
9
20
  return (_jsx(TabsContext.Provider, { value: {
10
21
  value: props.value,
11
22
  onChange: props.onChange,
12
23
  tabsId: props.id,
13
- }, children: _jsx("div", { className: classes(), children: _jsx("div", { role: "tablist", className: "umds-tabs__list", "aria-label": props.ariaLabel, children: props.children }) }) }));
24
+ }, children: _jsx("div", { className: classes(), children: _jsxs("div", { className: barClasses(), children: [_jsx("div", { role: "tablist", className: "umds-tabs__list", "aria-label": props.ariaLabel, children: props.children }), props.onAdd ? (_jsx("button", { type: "button", className: "umds-tabs__add", "aria-label": props.addLabel || "Adicionar aba", onClick: (event) => handleAdd(event), children: _jsx(Icon, { variant: "inherit", customSize: "12px", icon: faPlus }) })) : null] }) }) }));
14
25
  }
15
26
  export default Tabs;
@@ -1,7 +1,8 @@
1
1
  /* ============================================
2
2
  Tag Component
3
- Aparências (appearance): outlined, solid
4
- Tamanhos: sm, md, lg
3
+ Aparências (appearance): outlined, solid, soft
4
+ Tamanhos: xs, sm, md, lg
5
+ Modificador: pill
5
6
  ============================================ */
6
7
 
7
8
  .umds-tag {
@@ -84,6 +85,26 @@
84
85
 
85
86
  /* ── Tamanhos ── */
86
87
 
88
+ /* xs: 18px de altura (12 de fonte com line-height 1 + 2 + 2 de padding + 2 de
89
+ borda). O alvo de toque do × e dos ícones clicáveis continua em 24px, mas a
90
+ margem negativa devolve o excesso, então a tag não cresce. */
91
+ .umds-tag--xs {
92
+ gap: var(--umds-primitive-spacing-quarck);
93
+ padding: var(--umds-primitive-spacing-micro) var(--umds-primitive-spacing-nano);
94
+ border-radius: var(--umds-primitive-border-radius-sm);
95
+ font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
96
+ line-height: 1;
97
+ }
98
+
99
+ .umds-tag--xs .umds-icon {
100
+ font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
101
+ }
102
+
103
+ .umds-tag--xs .umds-tag__close,
104
+ .umds-tag--xs .umds-tag__icon--clickable {
105
+ margin: calc(-1 * var(--umds-primitive-spacing-nano)) 0;
106
+ }
107
+
87
108
  .umds-tag--sm {
88
109
  gap: var(--umds-primitive-spacing-quarck);
89
110
  padding: var(--umds-primitive-spacing-quarck) var(--umds-primitive-spacing-nano); /* 3px: candidato a novo token */
@@ -132,6 +153,38 @@
132
153
  border-color: var(--umds-semantic-color-primary-dark);
133
154
  }
134
155
 
156
+ /* ── Aparência: Soft (fundo claro da cor, sem contorno) ── */
157
+ .umds-tag--soft {
158
+ background-color: var(--umds-semantic-color-neutral-light-medium);
159
+ border-color: transparent;
160
+ color: var(--umds-semantic-color-neutral-dark-down);
161
+ }
162
+
163
+ .umds-tag--soft.umds-tag--primary {
164
+ background-color: var(--umds-semantic-color-primary-light);
165
+ color: var(--umds-semantic-color-primary-pure);
166
+ }
167
+
168
+ .umds-tag--soft.umds-tag--positive {
169
+ background-color: var(--umds-semantic-color-feedback-positive-light);
170
+ color: var(--umds-semantic-color-feedback-positive-dark);
171
+ }
172
+
173
+ .umds-tag--soft.umds-tag--negative {
174
+ background-color: var(--umds-semantic-color-feedback-negative-light);
175
+ color: var(--umds-semantic-color-feedback-negative-dark);
176
+ }
177
+
178
+ .umds-tag--soft.umds-tag--info {
179
+ background-color: var(--umds-semantic-color-feedback-info-light);
180
+ color: var(--umds-semantic-color-feedback-info-dark);
181
+ }
182
+
183
+ /* ── Formato pílula (depois dos tamanhos, para vencer o raio deles) ── */
184
+ .umds-tag--pill {
185
+ border-radius: var(--umds-primitive-border-radius-pill);
186
+ }
187
+
135
188
  /* ── Variantes semânticas (paridade com o Badge) ──
136
189
  neutral (default) não gera classe — visual histórico intacto. */
137
190
  .umds-tag--outlined.umds-tag--primary {
@@ -174,6 +227,36 @@
174
227
 
175
228
  /* solid+primary = visual default do solid (primary-pure) — sem regra extra. */
176
229
 
230
+ /* ── Variante new (novidade, amarelo) ──
231
+ O DS não tem token semântico de amarelo: usa os primitivos de amarelo e o
232
+ cinza escuro, fixos nos temas (candidato a token semântico de destaque). */
233
+ .umds-tag--new {
234
+ font-weight: var(--umds-primitive-font-weight-bold);
235
+ }
236
+
237
+ .umds-tag--outlined.umds-tag--new {
238
+ /* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
239
+ border-color: var(--umds-primitive-yellow-pure);
240
+ /* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
241
+ color: var(--umds-primitive-yellow-dark);
242
+ }
243
+
244
+ .umds-tag--solid.umds-tag--new {
245
+ /* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
246
+ background-color: var(--umds-primitive-yellow-medium);
247
+ /* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
248
+ border-color: var(--umds-primitive-yellow-medium);
249
+ /* stylelint-disable-next-line 1ds/cor-por-token -- par fixo do amarelo: o semântico inverte no tema escuro e perderia o contraste */
250
+ color: var(--umds-primitive-gray-darkest);
251
+ }
252
+
253
+ .umds-tag--soft.umds-tag--new {
254
+ /* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
255
+ background-color: var(--umds-primitive-yellow-light);
256
+ /* stylelint-disable-next-line 1ds/cor-por-token -- o DS não tem token semântico de amarelo (candidato a novo token) */
257
+ color: var(--umds-primitive-yellow-dark);
258
+ }
259
+
177
260
  /* ── Disabled ── */
178
261
  .umds-tag--disabled {
179
262
  opacity: 0.5;