@1doc/1ds-react 2.7.2 → 2.9.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 (302) hide show
  1. package/CHANGELOG.md +1280 -0
  2. package/dist/components/AIContent/AIContent.d.ts +10 -0
  3. package/dist/components/AIContent/AIContent.js +1 -1
  4. package/dist/components/AILabel/AILabel.d.ts +4 -0
  5. package/dist/components/AILabel/AILabel.js +2 -2
  6. package/dist/components/Accordion/Accordion.d.ts +6 -2
  7. package/dist/components/Alert/Alert.css +2 -0
  8. package/dist/components/Alert/Alert.d.ts +3 -1
  9. package/dist/components/Alert/Alert.js +7 -1
  10. package/dist/components/AppHeader/AppHeader.css +82 -8
  11. package/dist/components/AppHeader/AppHeader.d.ts +12 -1
  12. package/dist/components/AppHeader/AppHeader.js +186 -1
  13. package/dist/components/AppNavItem/AppNavItem.css +11 -3
  14. package/dist/components/AppShell/AppShell.css +9 -0
  15. package/dist/components/AppShell/AppShell.d.ts +8 -0
  16. package/dist/components/AppShell/AppShell.js +4 -1
  17. package/dist/components/AppSidebar/AppSidebar.css +1 -1
  18. package/dist/components/AppSidebar/AppSidebar.d.ts +4 -0
  19. package/dist/components/AppSidebar/AppSidebar.js +3 -1
  20. package/dist/components/AttachmentCard/AttachmentCard.css +17 -1
  21. package/dist/components/AttachmentCard/AttachmentCard.d.ts +29 -2
  22. package/dist/components/AttachmentCard/AttachmentCard.js +88 -20
  23. package/dist/components/Avatar/Avatar.css +7 -2
  24. package/dist/components/Avatar/AvatarGroup.d.ts +27 -0
  25. package/dist/components/Avatar/AvatarGroup.js +28 -4
  26. package/dist/components/Badge/Badge.css +61 -3
  27. package/dist/components/Badge/Badge.d.ts +14 -4
  28. package/dist/components/Badge/Badge.js +1 -0
  29. package/dist/components/BottomSheet/BottomSheet.css +1 -0
  30. package/dist/components/BottomSheet/BottomSheet.d.ts +8 -0
  31. package/dist/components/BottomSheet/BottomSheet.js +14 -2
  32. package/dist/components/Box/Box.css +83 -0
  33. package/dist/components/Box/Box.d.ts +82 -2
  34. package/dist/components/Box/Box.js +42 -2
  35. package/dist/components/Button/Button.css +29 -0
  36. package/dist/components/Button/Button.d.ts +4 -4
  37. package/dist/components/Button/Button.js +4 -1
  38. package/dist/components/Calendar/Calendar.css +245 -0
  39. package/dist/components/Calendar/Calendar.d.ts +125 -0
  40. package/dist/components/Calendar/Calendar.js +320 -0
  41. package/dist/components/Chart/BarChart.d.ts +6 -0
  42. package/dist/components/Chart/BarChart.js +3 -1
  43. package/dist/components/Chart/LineChart.d.ts +6 -0
  44. package/dist/components/Chart/LineChart.js +3 -1
  45. package/dist/components/Checkbox/Checkbox.css +4 -1
  46. package/dist/components/Chips/Chips.css +39 -0
  47. package/dist/components/Chips/Chips.d.ts +7 -2
  48. package/dist/components/Chips/Chips.js +6 -2
  49. package/dist/components/Coachmark/Coachmark.css +118 -0
  50. package/dist/components/Coachmark/Coachmark.d.ts +75 -0
  51. package/dist/components/Coachmark/Coachmark.js +321 -0
  52. package/dist/components/CodeBlock/CodeBlock.css +96 -0
  53. package/dist/components/CodeBlock/CodeBlock.d.ts +47 -0
  54. package/dist/components/CodeBlock/CodeBlock.js +103 -0
  55. package/dist/components/ColorPicker/ColorPicker.css +133 -0
  56. package/dist/components/ColorPicker/ColorPicker.d.ts +73 -0
  57. package/dist/components/ColorPicker/ColorPicker.js +219 -0
  58. package/dist/components/Combobox/Combobox.css +11 -3
  59. package/dist/components/ConfirmAIAction/ConfirmAIAction.d.ts +11 -1
  60. package/dist/components/ConfirmAIAction/ConfirmAIAction.js +6 -1
  61. package/dist/components/ConfirmDialog/ConfirmDialog.css +3 -0
  62. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +14 -0
  63. package/dist/components/ConfirmDialog/ConfirmDialog.js +2 -2
  64. package/dist/components/DataTable/DataTable.css +80 -0
  65. package/dist/components/DataTable/DataTable.d.ts +23 -4
  66. package/dist/components/DataTable/DataTable.js +61 -15
  67. package/dist/components/DatePicker/DatePicker.css +8 -0
  68. package/dist/components/DatePicker/DatePicker.d.ts +4 -0
  69. package/dist/components/DatePicker/DatePicker.js +14 -1
  70. package/dist/components/DescriptionList/DescriptionList.css +113 -0
  71. package/dist/components/DescriptionList/DescriptionList.d.ts +59 -0
  72. package/dist/components/DescriptionList/DescriptionList.js +51 -0
  73. package/dist/components/Drawer/Drawer.css +1 -0
  74. package/dist/components/Dropdown/Dropdown.js +47 -29
  75. package/dist/components/FileInput/FileInput.css +24 -4
  76. package/dist/components/FileInput/FileInput.d.ts +22 -2
  77. package/dist/components/FileInput/FileInput.js +23 -2
  78. package/dist/components/Grid/Grid.js +5 -5
  79. package/dist/components/IconPicker/IconPicker.css +107 -0
  80. package/dist/components/IconPicker/IconPicker.d.ts +74 -0
  81. package/dist/components/IconPicker/IconPicker.js +194 -0
  82. package/dist/components/Input/Input.css +41 -3
  83. package/dist/components/Input/Input.d.ts +14 -1
  84. package/dist/components/Input/Input.js +72 -6
  85. package/dist/components/Kanban/Kanban.css +5 -0
  86. package/dist/components/Kanban/Kanban.d.ts +41 -0
  87. package/dist/components/Kanban/Kanban.js +59 -27
  88. package/dist/components/Kanban/KanbanCard.d.ts +2 -0
  89. package/dist/components/Kanban/KanbanCard.js +1 -1
  90. package/dist/components/Kanban/KanbanColumn.d.ts +2 -0
  91. package/dist/components/Kanban/KanbanColumn.js +3 -0
  92. package/dist/components/Kbd/Kbd.css +66 -0
  93. package/dist/components/Kbd/Kbd.d.ts +32 -0
  94. package/dist/components/Kbd/Kbd.js +40 -0
  95. package/dist/components/Link/Link.css +1 -1
  96. package/dist/components/List/List.css +136 -0
  97. package/dist/components/List/List.d.ts +82 -0
  98. package/dist/components/List/List.js +53 -0
  99. package/dist/components/List/ListItem.d.ts +85 -0
  100. package/dist/components/List/ListItem.js +81 -0
  101. package/dist/components/Modal/Modal.css +93 -8
  102. package/dist/components/Modal/Modal.d.ts +45 -7
  103. package/dist/components/Modal/Modal.js +106 -6
  104. package/dist/components/MultiSelect/MultiSelect.css +9 -1
  105. package/dist/components/MultiSelect/MultiSelect.js +45 -8
  106. package/dist/components/OrgChart/OrgChart.css +149 -0
  107. package/dist/components/OrgChart/OrgChart.d.ts +83 -0
  108. package/dist/components/OrgChart/OrgChart.js +297 -0
  109. package/dist/components/OtpInput/OtpInput.css +93 -0
  110. package/dist/components/OtpInput/OtpInput.d.ts +60 -0
  111. package/dist/components/OtpInput/OtpInput.js +215 -0
  112. package/dist/components/Pagination/Pagination.d.ts +6 -0
  113. package/dist/components/Pagination/Pagination.js +9 -1
  114. package/dist/components/PhoneInput/PhoneInput.css +9 -1
  115. package/dist/components/PhoneInput/PhoneInput.d.ts +10 -0
  116. package/dist/components/PhoneInput/PhoneInput.js +20 -3
  117. package/dist/components/Popover/Popover.d.ts +7 -0
  118. package/dist/components/Popover/Popover.js +11 -1
  119. package/dist/components/RichTextEditor/RichTextEditor.css +203 -0
  120. package/dist/components/RichTextEditor/RichTextEditor.d.ts +83 -0
  121. package/dist/components/RichTextEditor/RichTextEditor.js +494 -0
  122. package/dist/components/SegmentedControl/SegmentedControl.d.ts +2 -0
  123. package/dist/components/SegmentedControl/SegmentedControl.js +21 -8
  124. package/dist/components/Select/Select.css +71 -1
  125. package/dist/components/Select/Select.d.ts +12 -0
  126. package/dist/components/Select/Select.js +93 -10
  127. package/dist/components/SidePanel/SidePanel.css +4 -4
  128. package/dist/components/SidePanelItem/SidePanelItem.css +7 -5
  129. package/dist/components/SidePanelSearch/SidePanelSearch.css +2 -2
  130. package/dist/components/SidePanelSection/SidePanelSection.css +7 -5
  131. package/dist/components/Stack/Stack.css +49 -0
  132. package/dist/components/Stack/Stack.d.ts +65 -7
  133. package/dist/components/Stack/Stack.js +30 -2
  134. package/dist/components/StatCard/StatCard.css +73 -0
  135. package/dist/components/StatCard/StatCard.d.ts +17 -0
  136. package/dist/components/StatCard/StatCard.js +4 -1
  137. package/dist/components/Stepper/Stepper.css +4 -1
  138. package/dist/components/Stepper/Stepper.d.ts +8 -0
  139. package/dist/components/Stepper/Stepper.js +4 -4
  140. package/dist/components/Switch/Switch.css +1 -0
  141. package/dist/components/Tabs/Tab.d.ts +15 -0
  142. package/dist/components/Tabs/Tab.js +30 -1
  143. package/dist/components/Tabs/Tabs.css +132 -0
  144. package/dist/components/Tabs/Tabs.d.ts +7 -0
  145. package/dist/components/Tabs/Tabs.js +13 -2
  146. package/dist/components/Tag/Tag.css +85 -2
  147. package/dist/components/Tag/Tag.d.ts +13 -6
  148. package/dist/components/Tag/Tag.js +1 -0
  149. package/dist/components/Text/Text.d.ts +9 -1
  150. package/dist/components/Text/Text.js +2 -2
  151. package/dist/components/Textarea/Textarea.css +11 -3
  152. package/dist/components/TimePicker/TimePicker.css +8 -0
  153. package/dist/components/TimePicker/TimePicker.d.ts +6 -0
  154. package/dist/components/TimePicker/TimePicker.js +1 -1
  155. package/dist/components/Tooltip/Tooltip.css +40 -0
  156. package/dist/components/Tooltip/Tooltip.d.ts +11 -0
  157. package/dist/components/Tooltip/Tooltip.js +114 -11
  158. package/dist/index.d.ts +25 -0
  159. package/dist/index.js +14 -0
  160. package/dist/teste/AILabel.test.d.ts +1 -0
  161. package/dist/teste/AILabel.test.js +33 -0
  162. package/dist/teste/AccordionConteudoLivre.test.d.ts +1 -0
  163. package/dist/teste/AccordionConteudoLivre.test.js +29 -0
  164. package/dist/teste/Alert.test.d.ts +1 -0
  165. package/dist/teste/Alert.test.js +27 -0
  166. package/dist/teste/AtributosRepassados.test.d.ts +1 -0
  167. package/dist/teste/AtributosRepassados.test.js +52 -0
  168. package/dist/teste/AttachmentCardIA.test.d.ts +1 -0
  169. package/dist/teste/AttachmentCardIA.test.js +89 -0
  170. package/dist/teste/AvatarGroupOverlap.test.d.ts +1 -0
  171. package/dist/teste/AvatarGroupOverlap.test.js +56 -0
  172. package/dist/teste/BadgeTag.test.d.ts +1 -0
  173. package/dist/teste/BadgeTag.test.js +42 -0
  174. package/dist/teste/BottomSheet.test.d.ts +1 -0
  175. package/dist/teste/BottomSheet.test.js +23 -0
  176. package/dist/teste/BoxItemFlex.test.d.ts +1 -0
  177. package/dist/teste/BoxItemFlex.test.js +54 -0
  178. package/dist/teste/BoxLayout.test.d.ts +1 -0
  179. package/dist/teste/BoxLayout.test.js +35 -0
  180. package/dist/teste/Button.test.d.ts +1 -0
  181. package/dist/teste/Button.test.js +27 -0
  182. package/dist/teste/Calendar.test.d.ts +1 -0
  183. package/dist/teste/Calendar.test.js +221 -0
  184. package/dist/teste/ChipsXs.test.d.ts +1 -0
  185. package/dist/teste/ChipsXs.test.js +31 -0
  186. package/dist/teste/Coachmark.test.d.ts +1 -0
  187. package/dist/teste/Coachmark.test.js +149 -0
  188. package/dist/teste/ColorPicker.test.d.ts +1 -0
  189. package/dist/teste/ColorPicker.test.js +132 -0
  190. package/dist/teste/ConfirmAIAction.test.d.ts +1 -0
  191. package/dist/teste/ConfirmAIAction.test.js +33 -0
  192. package/dist/teste/DataTableCelulaLivre.test.d.ts +1 -0
  193. package/dist/teste/DataTableCelulaLivre.test.js +76 -0
  194. package/dist/teste/DataTableDocumento.test.d.ts +1 -0
  195. package/dist/teste/DataTableDocumento.test.js +92 -0
  196. package/dist/teste/DatePicker.test.js +23 -0
  197. package/dist/teste/Dropdown.test.js +111 -0
  198. package/dist/teste/FileInputTrigger.test.d.ts +1 -0
  199. package/dist/teste/FileInputTrigger.test.js +53 -0
  200. package/dist/teste/IconPicker.test.d.ts +1 -0
  201. package/dist/teste/IconPicker.test.js +130 -0
  202. package/dist/teste/InputMascaraEAfins.test.d.ts +1 -0
  203. package/dist/teste/InputMascaraEAfins.test.js +99 -0
  204. package/dist/teste/KbdCodeBlock.test.d.ts +1 -0
  205. package/dist/teste/KbdCodeBlock.test.js +95 -0
  206. package/dist/teste/List.test.d.ts +1 -0
  207. package/dist/teste/List.test.js +153 -0
  208. package/dist/teste/Modal.test.d.ts +1 -0
  209. package/dist/teste/Modal.test.js +26 -0
  210. package/dist/teste/ModalVariantes.test.d.ts +1 -0
  211. package/dist/teste/ModalVariantes.test.js +151 -0
  212. package/dist/teste/MultiSelectErro.test.d.ts +1 -0
  213. package/dist/teste/MultiSelectErro.test.js +62 -0
  214. package/dist/teste/NomeAcessivelSsr.test.d.ts +1 -0
  215. package/dist/teste/NomeAcessivelSsr.test.js +88 -0
  216. package/dist/teste/OrgChart.test.d.ts +1 -0
  217. package/dist/teste/OrgChart.test.js +162 -0
  218. package/dist/teste/OtpInput.test.d.ts +1 -0
  219. package/dist/teste/OtpInput.test.js +143 -0
  220. package/dist/teste/PopoverMaxHeight.test.d.ts +1 -0
  221. package/dist/teste/PopoverMaxHeight.test.js +38 -0
  222. package/dist/teste/RichTextEditor.test.d.ts +1 -0
  223. package/dist/teste/RichTextEditor.test.js +287 -0
  224. package/dist/teste/RotulosTraduziveis.test.d.ts +1 -0
  225. package/dist/teste/RotulosTraduziveis.test.js +405 -0
  226. package/dist/teste/SegmentedControl.test.js +33 -0
  227. package/dist/teste/Select.test.d.ts +1 -0
  228. package/dist/teste/Select.test.js +62 -0
  229. package/dist/teste/SelectPlacementFiltro.test.d.ts +1 -0
  230. package/dist/teste/SelectPlacementFiltro.test.js +88 -0
  231. package/dist/teste/Stack.test.d.ts +1 -0
  232. package/dist/teste/Stack.test.js +57 -0
  233. package/dist/teste/StatCardRotuloTopo.test.d.ts +1 -0
  234. package/dist/teste/StatCardRotuloTopo.test.js +34 -0
  235. package/dist/teste/TabsContadorFechavel.test.d.ts +1 -0
  236. package/dist/teste/TabsContadorFechavel.test.js +79 -0
  237. package/dist/teste/Tooltip.test.d.ts +1 -0
  238. package/dist/teste/Tooltip.test.js +109 -0
  239. package/dist/teste/TooltipDark.test.d.ts +1 -0
  240. package/dist/teste/TooltipDark.test.js +31 -0
  241. package/dist/utils/calendario.d.ts +28 -0
  242. package/dist/utils/calendario.js +73 -0
  243. package/dist/utils/chart.d.ts +4 -0
  244. package/dist/utils/chart.js +3 -2
  245. package/dist/utils/html-seguro.d.ts +27 -0
  246. package/dist/utils/html-seguro.js +97 -0
  247. package/dist/utils/id.d.ts +2 -0
  248. package/dist/utils/id.js +23 -0
  249. package/dist/utils/paleta-de-cores.d.ts +26 -0
  250. package/dist/utils/paleta-de-cores.js +10 -0
  251. package/dist/utils/texto.d.ts +5 -0
  252. package/dist/utils/texto.js +5 -0
  253. package/package.json +3 -3
  254. package/src/index.ts +26 -0
  255. package/src/teste/AILabel.test.tsx +41 -0
  256. package/src/teste/AccordionConteudoLivre.test.tsx +39 -0
  257. package/src/teste/Alert.test.tsx +32 -0
  258. package/src/teste/AtributosRepassados.test.tsx +73 -0
  259. package/src/teste/AttachmentCardIA.test.tsx +126 -0
  260. package/src/teste/AvatarGroupOverlap.test.tsx +74 -0
  261. package/src/teste/BadgeTag.test.tsx +64 -0
  262. package/src/teste/BottomSheet.test.tsx +25 -0
  263. package/src/teste/BoxItemFlex.test.tsx +81 -0
  264. package/src/teste/BoxLayout.test.tsx +50 -0
  265. package/src/teste/Button.test.tsx +39 -0
  266. package/src/teste/Calendar.test.tsx +282 -0
  267. package/src/teste/ChipsXs.test.tsx +41 -0
  268. package/src/teste/Coachmark.test.tsx +198 -0
  269. package/src/teste/ColorPicker.test.tsx +153 -0
  270. package/src/teste/ConfirmAIAction.test.tsx +41 -0
  271. package/src/teste/DataTableCelulaLivre.test.tsx +103 -0
  272. package/src/teste/DataTableDocumento.test.tsx +102 -0
  273. package/src/teste/DatePicker.test.tsx +38 -0
  274. package/src/teste/Dropdown.test.tsx +146 -0
  275. package/src/teste/FileInputTrigger.test.tsx +89 -0
  276. package/src/teste/IconPicker.test.tsx +145 -0
  277. package/src/teste/InputMascaraEAfins.test.tsx +124 -0
  278. package/src/teste/KbdCodeBlock.test.tsx +106 -0
  279. package/src/teste/List.test.tsx +269 -0
  280. package/src/teste/Modal.test.tsx +28 -0
  281. package/src/teste/ModalVariantes.test.tsx +173 -0
  282. package/src/teste/MultiSelectErro.test.tsx +97 -0
  283. package/src/teste/NomeAcessivelSsr.test.tsx +110 -0
  284. package/src/teste/OrgChart.test.tsx +183 -0
  285. package/src/teste/OtpInput.test.tsx +163 -0
  286. package/src/teste/PopoverMaxHeight.test.tsx +47 -0
  287. package/src/teste/RichTextEditor.test.tsx +329 -0
  288. package/src/teste/RotulosTraduziveis.test.tsx +545 -0
  289. package/src/teste/SegmentedControl.test.tsx +57 -0
  290. package/src/teste/Select.test.tsx +97 -0
  291. package/src/teste/SelectPlacementFiltro.test.tsx +110 -0
  292. package/src/teste/Stack.test.tsx +80 -0
  293. package/src/teste/StatCardRotuloTopo.test.tsx +44 -0
  294. package/src/teste/TabsContadorFechavel.test.tsx +144 -0
  295. package/src/teste/Tooltip.test.tsx +219 -0
  296. package/src/teste/TooltipDark.test.tsx +51 -0
  297. package/src/utils/calendario.ts +78 -0
  298. package/src/utils/chart.ts +7 -2
  299. package/src/utils/html-seguro.ts +94 -0
  300. package/src/utils/id.ts +24 -0
  301. package/src/utils/paleta-de-cores.ts +34 -0
  302. package/src/utils/texto.ts +5 -0
@@ -22,6 +22,9 @@ 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} 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).
27
+ * @property {string} infoLabel - Nome acessível do ⓘ. Troque para traduzir. Padrão: "Mais informações".
25
28
  * @property {string} align - Alinhamento do conteúdo
26
29
  * @property {string} className - Classes CSS adicionais
27
30
  * @property {function} onClick - Torna o cartão acionável (vira botão)
@@ -56,6 +59,20 @@ export interface StatCardProps {
56
59
  description?: string;
57
60
  /** Alinhamento do conteúdo. @default 'start' */
58
61
  align?: "start" | "center";
62
+ /**
63
+ * Onde o rótulo aparece. `top` põe o rótulo no topo do cartão, acima do
64
+ * ícone e do número (que passa a 32/800), como no painel da 1Doc. No HTML o
65
+ * número segue antes do rótulo: só a posição visual muda.
66
+ * @default 'bottom'
67
+ */
68
+ labelPosition?: "bottom" | "top";
69
+ /**
70
+ * Texto de ajuda: mostra o ⓘ ao lado do rótulo, com um Tooltip escuro. É um
71
+ * botão focável dentro do cartão; com `onClick` no cartão, evite.
72
+ */
73
+ infoTooltip?: string;
74
+ /** Nome acessível do ⓘ. @default 'Mais informações' */
75
+ infoLabel?: string;
59
76
  /** Classes CSS adicionais. */
60
77
  className?: string;
61
78
  /** Torna o cartão acionável. */
@@ -1,13 +1,16 @@
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" : "",
11
14
  props.onClick ? "umds-stat-card--acionavel" : "",
12
15
  props.className,
13
16
  ]
@@ -45,6 +48,6 @@ function StatCard(props) {
45
48
  if (props.onClick)
46
49
  props.onClick();
47
50
  }
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] })] }));
51
+ 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] })] }));
49
52
  }
50
53
  export default StatCard;
@@ -84,7 +84,10 @@
84
84
  .umds-stepper__step--pending .umds-stepper__indicator {
85
85
  background: var(--umds-semantic-color-background-white); /* #FFFFFF */
86
86
  border-color: var(--umds-semantic-color-neutral-light-down); /* #D5D5D5 */
87
- color: var(--umds-semantic-color-neutral-dark-up); /* #A3A3A3 */
87
+ /* O número da etapa pendente é texto, e a etapa não está desabilitada:
88
+ neutral-dark-up (#A3A3A3, 2,5:1) reprovava o WCAG 1.4.3. Mesma cor do
89
+ título pendente — #565656, 7,34:1. */
90
+ color: var(--umds-semantic-color-neutral-dark-down);
88
91
  }
89
92
 
90
93
  /* Status: active */
@@ -25,6 +25,14 @@ export interface StepperProps {
25
25
  currentStep?: number;
26
26
  orientation?: "horizontal" | "vertical";
27
27
  className?: string;
28
+ /** Estado lido pelo leitor de tela num passo concluído. Troque para traduzir. @default 'concluído' */
29
+ completedLabel?: string;
30
+ /** Estado lido pelo leitor de tela num passo com erro. Troque para traduzir. @default 'erro' */
31
+ errorLabel?: string;
32
+ /** Estado lido pelo leitor de tela no passo atual. Troque para traduzir. @default 'atual' */
33
+ activeLabel?: string;
34
+ /** Estado lido pelo leitor de tela num passo pendente. Troque para traduzir. @default 'pendente' */
35
+ pendingLabel?: string;
28
36
  }
29
37
  declare function Stepper(props: StepperProps): import("react/jsx-runtime").JSX.Element;
30
38
  export default Stepper;
@@ -49,12 +49,12 @@ function Stepper(props) {
49
49
  function statusLabel(step, index) {
50
50
  const s = resolveStatus(step, index);
51
51
  if (s === "completed")
52
- return "concluído";
52
+ return props.completedLabel || "concluído";
53
53
  if (s === "error")
54
- return "erro";
54
+ return props.errorLabel || "erro";
55
55
  if (s === "active")
56
- return "atual";
57
- return "pendente";
56
+ return props.activeLabel || "atual";
57
+ return props.pendingLabel || "pendente";
58
58
  }
59
59
  function stepAriaLabel(step, index) {
60
60
  const parts = [step.title];
@@ -115,6 +115,7 @@
115
115
  .umds-switch--sm {
116
116
  width: 44px;
117
117
  height: var(--umds-primitive-spacing-xxs);
118
+ /* stylelint-disable-next-line 1ds/espaco-da-escala -- geometria do trilho: (24px - 21px do polegar) / 2; 1px ou 2px descentraliza o polegar */
118
119
  padding: 1.5px; /* sem equivalente 1DS: candidato a novo token */
119
120
  }
120
121
 
@@ -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;
@@ -1,7 +1,7 @@
1
1
  import './Tag.css';
2
2
  /**
3
3
  * Componente Tag para exibir rótulos, categorias e seleções.
4
- * Suporta aparências outlined/solid, 3 tamanhos e ícones opcionais.
4
+ * Suporta aparências outlined/solid/soft, 4 tamanhos, formato pílula e ícones opcionais.
5
5
  * Ideal para uso em multi-select, filtros e categorização.
6
6
  * @quandoUsar Rótulo ESTÁTICO que classifica ou dá status a um item: categoria de um processo, estado ("Em andamento"), prioridade. É leitura, não controle.
7
7
  * @quandoNaoUsar Quando o usuário pode remover o item ou alternar a seleção — use `Chips`. Para contagem numérica sobreposta a um ícone, use `Badge`.
@@ -16,22 +16,29 @@ export interface TagProps {
16
16
  */
17
17
  label?: string;
18
18
  /**
19
- * Estilo visual da tag.
19
+ * Estilo visual da tag. `soft` é o fundo claro da cor da variante, sem
20
+ * contorno (setores, perfil, "Publicado", "Dado simulado").
20
21
  * @default 'outlined'
21
22
  */
22
- appearance?: "outlined" | "solid";
23
+ appearance?: "outlined" | "solid" | "soft";
24
+ /**
25
+ * Formato de pílula (cantos totalmente arredondados).
26
+ * @default false
27
+ */
28
+ pill?: boolean;
23
29
  /**
24
30
  * Variante semântica de cor (paridade com o Badge) — para tag de STATUS
25
31
  * (achado mobile/prefeitura: sem isso, status exigia trocar para Badge).
26
32
  * 'neutral' mantém o visual atual.
27
33
  * @default 'neutral'
28
34
  */
29
- variant?: "neutral" | "primary" | "positive" | "negative" | "info";
35
+ variant?: "neutral" | "primary" | "positive" | "negative" | "info" | "new";
30
36
  /**
31
- * Tamanho da tag.
37
+ * Tamanho da tag. `xs` é a compacta de 18px (`line-height: 1`), para linha
38
+ * de lista e card; `sm` continua com 27px.
32
39
  * @default 'md'
33
40
  */
34
- size?: "sm" | "md" | "lg";
41
+ size?: "xs" | "sm" | "md" | "lg";
35
42
  /**
36
43
  * Ícone Font Awesome exibido à esquerda do label.
37
44
  */
@@ -13,6 +13,7 @@ function Tag(props) {
13
13
  props.variant && props.variant !== "neutral"
14
14
  ? `umds-tag--${props.variant}`
15
15
  : "",
16
+ props.pill ? "umds-tag--pill" : "",
16
17
  props.disabled ? "umds-tag--disabled" : "",
17
18
  props.className,
18
19
  ]
@@ -59,7 +59,15 @@ export interface TextProps {
59
59
  as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" | "span" | "div" | "label";
60
60
  /** Alinhamento do texto */
61
61
  align?: "left" | "center" | "right" | "justify";
62
- /** Cor do texto usando tokens semânticos */
62
+ /**
63
+ * Cor do texto usando tokens semânticos.
64
+ *
65
+ * `disabled` (`neutral-dark-up`, #A3A3A3, 2,5:1 sobre branco) é SÓ para
66
+ * texto de controle desabilitado (rótulo, valor ou ajuda de um campo ou
67
+ * botão inativo), que o WCAG 1.4.3 isenta de contraste. Em qualquer outro
68
+ * texto (apoio, legenda, etapa pendente, placeholder) ela reprova o
69
+ * mínimo de 4,5:1: use `secondary` (`neutral-dark-down`, #565656, 7,34:1).
70
+ */
63
71
  color?: "primary" | "secondary" | "disabled" | "negative" | "inherit"
64
72
  /** @deprecated use "negative" — mantido para não quebrar Input, Select e Textarea */
65
73
  | "error";
@@ -77,7 +77,7 @@ function Text(props) {
77
77
  .filter(Boolean)
78
78
  .join(" ");
79
79
  }
80
- function style() {
80
+ function estiloInline() {
81
81
  const styles = {};
82
82
  if (props.maxLines) {
83
83
  styles["--umds-text-max-lines"] = String(props.maxLines);
@@ -98,6 +98,6 @@ function Text(props) {
98
98
  }
99
99
  return out;
100
100
  }
101
- return (_jsxs(_Fragment, { children: [elementTag() === "h1" ? (_jsx("h1", { id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h2" ? (_jsx("h2", { id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h3" ? (_jsx("h3", { id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h4" ? (_jsx("h4", { id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h5" ? (_jsx("h5", { id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h6" ? (_jsx("h6", { id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "p" ? (_jsx("p", { id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "span" ? (_jsx("span", { id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "label" ? (_jsx("label", { htmlFor: props.forId, id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "div" ? (_jsx("div", { id: props.id, style: style(), ...htmlAttrs(), className: classes(), children: props.children })) : null] }));
101
+ return (_jsxs(_Fragment, { children: [elementTag() === "h1" ? (_jsx("h1", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h2" ? (_jsx("h2", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h3" ? (_jsx("h3", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h4" ? (_jsx("h4", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h5" ? (_jsx("h5", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "h6" ? (_jsx("h6", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "p" ? (_jsx("p", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "span" ? (_jsx("span", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "label" ? (_jsx("label", { htmlFor: props.forId, id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null, elementTag() === "div" ? (_jsx("div", { id: props.id, style: estiloInline(), ...htmlAttrs(), className: classes(), children: props.children })) : null] }));
102
102
  }
103
103
  export default Text;
@@ -30,7 +30,7 @@
30
30
  align-items: flex-start;
31
31
  position: relative;
32
32
  background-color: var(--umds-semantic-color-background-white);
33
- border: 1px solid var(--umds-semantic-color-neutral-light-down);
33
+ border: 1px solid var(--umds-semantic-field-border-default);
34
34
  border-radius: var(--umds-primitive-border-radius-sm);
35
35
  transition: border-color 0.2s ease, box-shadow 0.2s ease;
36
36
  }
@@ -110,11 +110,11 @@
110
110
  /* Read Only State */
111
111
  .umds-textarea--readonly .umds-textarea__container {
112
112
  background-color: var(--umds-semantic-field-readonly-background);
113
- border-color: var(--umds-semantic-color-neutral-light-down);
113
+ border-color: var(--umds-semantic-field-border-default);
114
114
  }
115
115
 
116
116
  .umds-textarea--readonly .umds-textarea__container:hover {
117
- border-color: var(--umds-semantic-color-neutral-light-down);
117
+ border-color: var(--umds-semantic-field-border-default);
118
118
  }
119
119
 
120
120
  .umds-textarea--readonly .umds-textarea__container:focus-within {
@@ -128,6 +128,14 @@
128
128
  resize: none;
129
129
  }
130
130
 
131
+ /* Somente leitura não é desabilitado: o texto segue lido e a WCAG 1.4.3 vale
132
+ sem isenção. O placeholder padrão foi calibrado para fundo branco e cai para
133
+ ~4,2:1 sobre o fundo de somente leitura; neutral-dark-down passa 4,5:1 em
134
+ todos os temas (1doc 6,78:1 · 1doc-dark 10,83:1 · alto contraste 16,48:1). */
135
+ .umds-textarea--readonly .umds-textarea__control::placeholder {
136
+ color: var(--umds-semantic-color-neutral-dark-down);
137
+ }
138
+
131
139
  /* Footer (Helper/Error + Counter) */
132
140
  .umds-textarea__footer {
133
141
  display: flex;
@@ -297,6 +297,14 @@
297
297
  border-color: var(--umds-semantic-field-border-default);
298
298
  }
299
299
 
300
+ /* Somente leitura não é desabilitado: o texto segue lido e a WCAG 1.4.3 vale
301
+ sem isenção. O placeholder padrão foi calibrado para fundo branco e cai para
302
+ ~4,2:1 sobre o fundo de somente leitura; neutral-dark-down passa 4,5:1 em
303
+ todos os temas (1doc 6,78:1 · 1doc-dark 10,83:1 · alto contraste 16,48:1). */
304
+ .umds-timepicker--readonly .umds-timepicker__placeholder {
305
+ color: var(--umds-semantic-color-neutral-dark-down);
306
+ }
307
+
300
308
  /* ── Alto contraste ──
301
309
  O traço do painel é neutral-light-medium — #5A5A5A neste tema, 3:1 sobre o
302
310
  preto. As superfícies flutuantes do tema usam a borda branca