@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
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { fireEvent, render, screen } from "@testing-library/react";
4
+ import Chips from "../components/Chips/Chips";
5
+ const raiz = (c) => c.firstElementChild;
6
+ describe("Chips · xs e × em círculo", () => {
7
+ it("size xs escreve a classe; sem size continua md", () => {
8
+ const { container } = render(_jsxs(_Fragment, { children: [_jsx(Chips, { label: "a", size: "xs" }), _jsx(Chips, { label: "b" })] }));
9
+ expect(container.children[0]).toHaveClass("umds-chip--xs");
10
+ expect(container.children[1]).toHaveClass("umds-chip--md");
11
+ });
12
+ it("circularRemove com removable escreve a classe do círculo", () => {
13
+ const { container } = render(_jsx(Chips, { label: "Marcador", removable: true, circularRemove: true }));
14
+ expect(raiz(container)).toHaveClass("umds-chip--remove-circle");
15
+ });
16
+ it("circularRemove sem removable não escreve a classe (não há ×)", () => {
17
+ const { container } = render(_jsx(Chips, { label: "Marcador", circularRemove: true }));
18
+ expect(raiz(container)).not.toHaveClass("umds-chip--remove-circle");
19
+ expect(screen.queryByRole("button")).toBeNull();
20
+ });
21
+ it("o × em círculo continua sendo o mesmo botão, com o mesmo nome e o mesmo clique", () => {
22
+ const aoRemover = vi.fn();
23
+ render(_jsx(Chips, { label: "Urgente", size: "xs", removable: true, circularRemove: true, onRemove: aoRemover }));
24
+ fireEvent.click(screen.getByRole("button", { name: "Remover Urgente" }));
25
+ expect(aoRemover).toHaveBeenCalledTimes(1);
26
+ });
27
+ it("sem circularRemove o chip removível é o de antes", () => {
28
+ const { container } = render(_jsx(Chips, { label: "x", removable: true }));
29
+ expect(raiz(container)).not.toHaveClass("umds-chip--remove-circle");
30
+ });
31
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,149 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { useRef, useState } from "react";
4
+ import { render, screen, waitFor } from "@testing-library/react";
5
+ import userEvent from "@testing-library/user-event";
6
+ import Coachmark from "../components/Coachmark/Coachmark";
7
+ const PASSOS = [
8
+ { target: "#alvo-a", title: "Cada item é uma aba", content: "Fluxos e formulários abrem em abas." },
9
+ { target: "#alvo-b", title: "Salvo sozinho", content: "Tudo fica neste navegador." },
10
+ { title: "Pronto", content: "Sem alvo: o cartão fica no centro." },
11
+ ];
12
+ function Pagina(props) {
13
+ return (_jsxs("div", { children: [_jsx("button", { id: "alvo-a", children: "A" }), _jsx("button", { id: "alvo-b", children: "B" }), _jsx(Coachmark, { steps: PASSOS, ...props })] }));
14
+ }
15
+ describe("Coachmark", () => {
16
+ it("fechado não desenha nada", () => {
17
+ render(_jsx(Pagina, { open: false }));
18
+ expect(screen.queryByRole("dialog")).toBeNull();
19
+ });
20
+ it("aberto é um diálogo modal nomeado pelo título, com contador e texto", () => {
21
+ render(_jsx(Pagina, { open: true }));
22
+ const dialogo = screen.getByRole("dialog", { name: "Cada item é uma aba" });
23
+ expect(dialogo).toHaveAttribute("aria-modal", "true");
24
+ expect(dialogo).toHaveAccessibleDescription("Fluxos e formulários abrem em abas.");
25
+ expect(screen.getAllByText("1 de 3").length).toBeGreaterThan(0);
26
+ expect(screen.getByRole("button", { name: "Próximo" })).toBeInTheDocument();
27
+ expect(screen.queryByRole("button", { name: "Anterior" })).toBeNull();
28
+ });
29
+ it("o foco entra no cartão ao abrir", () => {
30
+ render(_jsx(Pagina, { open: true }));
31
+ expect(screen.getByRole("dialog")).toHaveFocus();
32
+ });
33
+ it("Próximo e Anterior trocam de passo e avisam em onStepChange", async () => {
34
+ const usuario = userEvent.setup();
35
+ const aoMudar = vi.fn();
36
+ render(_jsx(Pagina, { open: true, onStepChange: aoMudar }));
37
+ await usuario.click(screen.getByRole("button", { name: "Próximo" }));
38
+ expect(aoMudar).toHaveBeenLastCalledWith(1);
39
+ expect(screen.getByRole("dialog", { name: "Salvo sozinho" })).toBeInTheDocument();
40
+ await usuario.click(screen.getByRole("button", { name: "Anterior" }));
41
+ expect(aoMudar).toHaveBeenLastCalledWith(0);
42
+ expect(screen.getByRole("dialog", { name: "Cada item é uma aba" })).toBeInTheDocument();
43
+ });
44
+ it("setas direita e esquerda avançam e voltam", async () => {
45
+ const usuario = userEvent.setup();
46
+ render(_jsx(Pagina, { open: true }));
47
+ await usuario.keyboard("{ArrowRight}");
48
+ expect(screen.getByRole("dialog", { name: "Salvo sozinho" })).toBeInTheDocument();
49
+ await usuario.keyboard("{ArrowLeft}");
50
+ expect(screen.getByRole("dialog", { name: "Cada item é uma aba" })).toBeInTheDocument();
51
+ });
52
+ it("o último passo troca Próximo por Concluir e fecha com 'finish'", async () => {
53
+ const usuario = userEvent.setup();
54
+ const aoFechar = vi.fn();
55
+ render(_jsx(Pagina, { open: true, defaultStep: 2, onClose: aoFechar }));
56
+ expect(screen.queryByRole("button", { name: "Próximo" })).toBeNull();
57
+ await usuario.click(screen.getByRole("button", { name: "Concluir" }));
58
+ expect(aoFechar).toHaveBeenCalledWith("finish");
59
+ });
60
+ it("Sair do tour fecha com 'skip' e hideSkip esconde o botão", async () => {
61
+ const usuario = userEvent.setup();
62
+ const aoFechar = vi.fn();
63
+ const { rerender } = render(_jsx(Pagina, { open: true, onClose: aoFechar }));
64
+ await usuario.click(screen.getByRole("button", { name: "Sair do tour" }));
65
+ expect(aoFechar).toHaveBeenCalledWith("skip");
66
+ rerender(_jsx(Pagina, { open: true, hideSkip: true, onClose: aoFechar }));
67
+ expect(screen.queryByRole("button", { name: "Sair do tour" })).toBeNull();
68
+ });
69
+ it("Esc fecha com 'escape'", async () => {
70
+ const usuario = userEvent.setup();
71
+ const aoFechar = vi.fn();
72
+ render(_jsx(Pagina, { open: true, onClose: aoFechar }));
73
+ await usuario.keyboard("{Escape}");
74
+ expect(aoFechar).toHaveBeenCalledWith("escape");
75
+ });
76
+ it("o foco fica preso no cartão: Tab gira e Shift+Tab volta", async () => {
77
+ const usuario = userEvent.setup();
78
+ render(_jsx(Pagina, { open: true }));
79
+ const sair = screen.getByRole("button", { name: "Sair do tour" });
80
+ const proximo = screen.getByRole("button", { name: "Próximo" });
81
+ proximo.focus();
82
+ await usuario.tab();
83
+ expect(sair).toHaveFocus();
84
+ await usuario.tab({ shift: true });
85
+ expect(proximo).toHaveFocus();
86
+ });
87
+ it("todos os textos vêm por prop", () => {
88
+ render(_jsx(Pagina, { open: true, defaultStep: 1, nextLabel: "Next", previousLabel: "Back", skipLabel: "Skip tour", counterLabel: "{current} of {total}" }));
89
+ expect(screen.getByRole("button", { name: "Next" })).toBeInTheDocument();
90
+ expect(screen.getByRole("button", { name: "Back" })).toBeInTheDocument();
91
+ expect(screen.getByRole("button", { name: "Skip tour" })).toBeInTheDocument();
92
+ expect(screen.getAllByText("2 of 3").length).toBeGreaterThan(0);
93
+ });
94
+ it("finishLabel troca o texto do último passo", () => {
95
+ render(_jsx(Pagina, { open: true, defaultStep: 2, finishLabel: "Done" }));
96
+ expect(screen.getByRole("button", { name: "Done" })).toBeInTheDocument();
97
+ });
98
+ it("com alvo, desenha o recorte; sem alvo (ou alvo que não existe), não", () => {
99
+ const { container, rerender } = render(_jsx(Pagina, { open: true }));
100
+ expect(document.querySelector(".umds-coachmark__cutout")).not.toBeNull();
101
+ rerender(_jsx(Pagina, { open: true, step: 2 }));
102
+ expect(document.querySelector(".umds-coachmark__cutout")).toBeNull();
103
+ expect(document.querySelector(".umds-coachmark--no-target")).not.toBeNull();
104
+ void container;
105
+ });
106
+ it("alvo por ref do React e por elemento", () => {
107
+ function ComRef() {
108
+ const ref = useRef(null);
109
+ return (_jsxs("div", { children: [_jsx("button", { ref: ref, children: "Alvo" }), _jsx(Coachmark, { open: true, steps: [{ target: ref, title: "Por ref" }] })] }));
110
+ }
111
+ render(_jsx(ComRef, {}));
112
+ expect(screen.getByRole("dialog", { name: "Por ref" })).toBeInTheDocument();
113
+ expect(document.querySelector(".umds-coachmark__cutout")).not.toBeNull();
114
+ });
115
+ it("step controlado manda no passo atual", () => {
116
+ render(_jsx(Pagina, { open: true, step: 1 }));
117
+ expect(screen.getByRole("dialog", { name: "Salvo sozinho" })).toBeInTheDocument();
118
+ });
119
+ it("ao fechar, o foco volta ao elemento de antes", async () => {
120
+ const usuario = userEvent.setup();
121
+ function Dono() {
122
+ const [aberto, setAberto] = useState(false);
123
+ return (_jsxs("div", { children: [_jsx("button", { id: "abrir", onClick: () => setAberto(true), children: "Fazer o tour" }), _jsx(Coachmark, { open: aberto, steps: PASSOS, onClose: () => setAberto(false) })] }));
124
+ }
125
+ render(_jsx(Dono, {}));
126
+ const abrir = screen.getByRole("button", { name: "Fazer o tour" });
127
+ await usuario.click(abrir);
128
+ expect(screen.getByRole("dialog")).toBeInTheDocument();
129
+ // O foco entra no cartão depois da montagem (um quadro de animação): na CI,
130
+ // mais lenta, o Esc chegava antes e caía no body.
131
+ await waitFor(() => expect(screen.getByRole("dialog").contains(document.activeElement)).toBe(true));
132
+ await usuario.keyboard("{Escape}");
133
+ await waitFor(() => expect(screen.queryByRole("dialog")).toBeNull());
134
+ expect(abrir).toHaveFocus();
135
+ });
136
+ it("reabrir recomeça do primeiro passo", async () => {
137
+ const usuario = userEvent.setup();
138
+ function Dono() {
139
+ const [aberto, setAberto] = useState(true);
140
+ return (_jsxs("div", { children: [_jsx("button", { onClick: () => setAberto(true), children: "Reabrir" }), _jsx(Coachmark, { open: aberto, steps: PASSOS, onClose: () => setAberto(false) })] }));
141
+ }
142
+ render(_jsx(Dono, {}));
143
+ await usuario.keyboard("{ArrowRight}");
144
+ expect(screen.getByRole("dialog", { name: "Salvo sozinho" })).toBeInTheDocument();
145
+ await usuario.keyboard("{Escape}");
146
+ await usuario.click(screen.getByRole("button", { name: "Reabrir" }));
147
+ expect(screen.getByRole("dialog", { name: "Cada item é uma aba" })).toBeInTheDocument();
148
+ });
149
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,132 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { useState } from "react";
4
+ import { render, screen } from "@testing-library/react";
5
+ import userEvent from "@testing-library/user-event";
6
+ import ColorPicker from "../components/ColorPicker/ColorPicker";
7
+ import { COLOR_PALETTE } from "../utils/paleta-de-cores";
8
+ describe("ColorPicker", () => {
9
+ it("é um radiogroup com uma amostra por primitivo de cor, cada uma com nome", () => {
10
+ render(_jsx(ColorPicker, { ariaLabel: "Cor do marcador" }));
11
+ const grupo = screen.getByRole("radiogroup", { name: "Cor do marcador" });
12
+ expect(grupo.querySelectorAll('[role="radio"]')).toHaveLength(COLOR_PALETTE.length);
13
+ expect(COLOR_PALETTE).toHaveLength(31);
14
+ expect(screen.getByRole("radio", { name: "Azul escuro" })).toBeInTheDocument();
15
+ expect(screen.getByRole("radio", { name: "Cinza muito claro" })).toBeInTheDocument();
16
+ });
17
+ it("pinta cada amostra com a variável do token", () => {
18
+ render(_jsx(ColorPicker, { ariaLabel: "Cor" }));
19
+ const azul = screen.getByRole("radio", { name: "Azul" });
20
+ expect(azul.style.backgroundColor).toBe("var(--umds-primitive-blue-pure)");
21
+ });
22
+ it("clicar escolhe e entrega o NOME do token em onChange", async () => {
23
+ const usuario = userEvent.setup();
24
+ const aoMudar = vi.fn();
25
+ render(_jsx(ColorPicker, { ariaLabel: "Cor", onChange: aoMudar }));
26
+ await usuario.click(screen.getByRole("radio", { name: "Verde" }));
27
+ expect(aoMudar).toHaveBeenCalledWith("--umds-primitive-green-pure");
28
+ expect(screen.getByRole("radio", { name: "Verde" })).toHaveAttribute("aria-checked", "true");
29
+ });
30
+ it("não escolhido tem aria-checked false e só a escolhida mostra a marcação", () => {
31
+ const { container } = render(_jsx(ColorPicker, { ariaLabel: "Cor", defaultValue: "--umds-primitive-red-pure" }));
32
+ expect(screen.getByRole("radio", { name: "Vermelho" })).toHaveAttribute("aria-checked", "true");
33
+ expect(screen.getByRole("radio", { name: "Azul" })).toHaveAttribute("aria-checked", "false");
34
+ expect(container.querySelectorAll(".umds-color-picker__swatch svg")).toHaveLength(1);
35
+ });
36
+ it("Tab entra na amostra escolhida (roving tabindex)", () => {
37
+ render(_jsx(ColorPicker, { ariaLabel: "Cor", value: "--umds-primitive-orange-pure" }));
38
+ const radios = screen.getAllByRole("radio");
39
+ const comTab = radios.filter((r) => r.getAttribute("tabindex") === "0");
40
+ expect(comTab).toHaveLength(1);
41
+ expect(comTab[0]).toHaveAccessibleName("Laranja");
42
+ });
43
+ it("sem valor, Tab entra na primeira amostra", () => {
44
+ render(_jsx(ColorPicker, { ariaLabel: "Cor" }));
45
+ expect(screen.getAllByRole("radio")[0]).toHaveAttribute("tabindex", "0");
46
+ });
47
+ it("setas movem a escolha e o foco; Home e End vão às pontas; dá a volta", async () => {
48
+ const usuario = userEvent.setup();
49
+ const aoMudar = vi.fn();
50
+ render(_jsx(ColorPicker, { ariaLabel: "Cor", families: ["blue"], defaultValue: "--umds-primitive-blue-dark", onChange: aoMudar }));
51
+ const radios = screen.getAllByRole("radio");
52
+ radios[0].focus();
53
+ await usuario.keyboard("{ArrowRight}");
54
+ expect(aoMudar).toHaveBeenLastCalledWith("--umds-primitive-blue-pure");
55
+ expect(radios[1]).toHaveFocus();
56
+ await usuario.keyboard("{ArrowLeft}{ArrowLeft}");
57
+ expect(aoMudar).toHaveBeenLastCalledWith("--umds-primitive-blue-light");
58
+ expect(radios[3]).toHaveFocus();
59
+ await usuario.keyboard("{Home}");
60
+ expect(radios[0]).toHaveFocus();
61
+ await usuario.keyboard("{End}");
62
+ expect(radios[3]).toHaveFocus();
63
+ await usuario.keyboard("{ArrowDown}");
64
+ expect(radios[0]).toHaveFocus();
65
+ });
66
+ it("pula amostra desabilitada no teclado", async () => {
67
+ const usuario = userEvent.setup();
68
+ const aoMudar = vi.fn();
69
+ render(_jsx(ColorPicker, { ariaLabel: "Cor", defaultValue: "a", onChange: aoMudar, swatches: [
70
+ { value: "a", label: "A" },
71
+ { value: "b", label: "B", disabled: true },
72
+ { value: "c", label: "C" },
73
+ ] }));
74
+ screen.getByRole("radio", { name: "A" }).focus();
75
+ await usuario.keyboard("{ArrowRight}");
76
+ expect(aoMudar).toHaveBeenLastCalledWith("c");
77
+ });
78
+ it("families recorta a paleta", () => {
79
+ render(_jsx(ColorPicker, { ariaLabel: "Cor", families: ["blue", "gray"] }));
80
+ expect(screen.getAllByRole("radio")).toHaveLength(11);
81
+ });
82
+ it("swatches substitui a paleta (nomes traduzidos)", () => {
83
+ render(_jsx(ColorPicker, { ariaLabel: "Color", swatches: [{ value: "--umds-primitive-blue-pure", label: "Blue" }] }));
84
+ expect(screen.getAllByRole("radio")).toHaveLength(1);
85
+ expect(screen.getByRole("radio", { name: "Blue" })).toBeInTheDocument();
86
+ });
87
+ it("disabled desabilita todas as amostras", () => {
88
+ render(_jsx(ColorPicker, { ariaLabel: "Cor", disabled: true }));
89
+ for (const r of screen.getAllByRole("radio"))
90
+ expect(r).toBeDisabled();
91
+ });
92
+ it("label visível nomeia o grupo", () => {
93
+ render(_jsx(ColorPicker, { label: "Cor de fundo", id: "cp" }));
94
+ expect(screen.getByRole("radiogroup", { name: "Cor de fundo" })).toBeInTheDocument();
95
+ });
96
+ it("cor livre vem desligada: sem campo de hexadecimal", () => {
97
+ render(_jsx(ColorPicker, { ariaLabel: "Cor" }));
98
+ expect(screen.queryByLabelText(/hexadecimal/i)).toBeNull();
99
+ });
100
+ it("allowCustom: hexadecimal completo vira #RRGGBB em maiúsculas; incompleto não emite", async () => {
101
+ const usuario = userEvent.setup();
102
+ const aoMudar = vi.fn();
103
+ render(_jsx(ColorPicker, { ariaLabel: "Cor", allowCustom: true, onChange: aoMudar }));
104
+ const campo = screen.getByLabelText("Cor livre (hexadecimal)");
105
+ await usuario.type(campo, "0058d");
106
+ expect(aoMudar).not.toHaveBeenCalled();
107
+ await usuario.type(campo, "b");
108
+ expect(aoMudar).toHaveBeenCalledTimes(1);
109
+ expect(aoMudar).toHaveBeenCalledWith("#0058DB");
110
+ });
111
+ it("allowCustom: hexadecimal inválido mostra a mensagem ao sair do campo", async () => {
112
+ const usuario = userEvent.setup();
113
+ render(_jsx(ColorPicker, { ariaLabel: "Cor", allowCustom: true, customErrorMessage: "Formato inv\u00E1lido" }));
114
+ const campo = screen.getByLabelText("Cor livre (hexadecimal)");
115
+ await usuario.type(campo, "xyz");
116
+ expect(screen.queryByText("Formato inválido")).toBeNull();
117
+ await usuario.tab();
118
+ expect(screen.getByText("Formato inválido")).toBeInTheDocument();
119
+ });
120
+ it("controlado: reflete o value e escolher uma amostra limpa o campo livre", async () => {
121
+ const usuario = userEvent.setup();
122
+ function Controlado() {
123
+ const [valor, setValor] = useState("#336699");
124
+ return _jsx(ColorPicker, { ariaLabel: "Cor", allowCustom: true, value: valor, onChange: setValor });
125
+ }
126
+ render(_jsx(Controlado, {}));
127
+ const campo = screen.getByLabelText("Cor livre (hexadecimal)");
128
+ expect(campo.value).toBe("#336699");
129
+ await usuario.click(screen.getByRole("radio", { name: "Azul" }));
130
+ expect(campo.value).toBe("");
131
+ });
132
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { render, screen } from "@testing-library/react";
4
+ import ConfirmDialog from "../components/ConfirmDialog/ConfirmDialog";
5
+ import ConfirmAIAction from "../components/ConfirmAIAction/ConfirmAIAction";
6
+ /**
7
+ * O ConfirmAIAction dizia "digite CONFIRMAR", mas o botão continuava
8
+ * clicável: o ConfirmDialog não tinha como desabilitá-lo. Agora tem
9
+ * (`confirmDisabled`), e em risco alto o botão só libera com a frase.
10
+ */
11
+ describe("ConfirmDialog · confirmDisabled", () => {
12
+ it("desabilita o confirmar sem mudar o texto do botão", () => {
13
+ render(_jsx(ConfirmDialog, { open: true, inline: true, title: "Excluir?", confirmLabel: "Excluir", confirmDisabled: true }));
14
+ expect(screen.getByRole("button", { name: "Excluir" })).toBeDisabled();
15
+ });
16
+ it("sem a prop, o confirmar fica habilitado", () => {
17
+ render(_jsx(ConfirmDialog, { open: true, inline: true, title: "Excluir?", confirmLabel: "Excluir" }));
18
+ expect(screen.getByRole("button", { name: "Excluir" })).toBeEnabled();
19
+ });
20
+ });
21
+ describe("ConfirmAIAction · risco alto", () => {
22
+ it("botão desabilitado até a frase conferir", () => {
23
+ const onConfirm = vi.fn();
24
+ const { rerender } = render(_jsx(ConfirmAIAction, { open: true, risk: "alto", title: "Arquivar", affected: ["Processo 1"], typedValue: "", onConfirm: onConfirm }));
25
+ expect(screen.getByRole("button", { name: "Confirmar" })).toBeDisabled();
26
+ rerender(_jsx(ConfirmAIAction, { open: true, risk: "alto", title: "Arquivar", affected: ["Processo 1"], typedValue: "confirmar", onConfirm: onConfirm }));
27
+ expect(screen.getByRole("button", { name: "Confirmar" })).toBeEnabled();
28
+ });
29
+ it("risco médio não exige digitação", () => {
30
+ render(_jsx(ConfirmAIAction, { open: true, risk: "medio", title: "Tramitar" }));
31
+ expect(screen.getByRole("button", { name: "Confirmar" })).toBeEnabled();
32
+ });
33
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,76 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { describe, expect, it } from "vitest";
3
+ import { render, screen, within } from "@testing-library/react";
4
+ import DataTable from "../components/DataTable/DataTable";
5
+ /**
6
+ * Célula livre (`render` devolvendo nó) e linha de grupo (`rowGroup`).
7
+ * No Vue o equivalente é o slot `#cell-<key>`: ver `datatable-slots.test.mjs`.
8
+ */
9
+ const USUARIOS = [
10
+ { id: 1, nome: "Lucas Andrade", setor: "SADM", perfil: "Administrador" },
11
+ { id: 2, nome: "Marina Souza", setor: "SADM", perfil: "Nível 1" },
12
+ { id: 3, nome: "Rafael Pereira", setor: "SOBR", perfil: "Nível 2" },
13
+ ];
14
+ describe("DataTable · célula livre", () => {
15
+ it("render devolvendo elemento desenha o nó, não texto", () => {
16
+ const colunas = [
17
+ { key: "nome", label: "Usuário", render: (row) => _jsx("strong", { "data-testid": "nome", children: row.nome }) },
18
+ { key: "perfil", label: "Perfil" },
19
+ ];
20
+ render(_jsx(DataTable, { columns: colunas, data: USUARIOS }));
21
+ const nos = screen.getAllByTestId("nome");
22
+ expect(nos).toHaveLength(3);
23
+ expect(nos[0].tagName).toBe("STRONG");
24
+ expect(nos[0]).toHaveTextContent("Lucas Andrade");
25
+ });
26
+ it("render recebe a linha e o índice", () => {
27
+ const colunas = [
28
+ { key: "nome", label: "Usuário", render: (row, i) => `${i + 1}. ${row.nome}` },
29
+ ];
30
+ render(_jsx(DataTable, { columns: colunas, data: USUARIOS }));
31
+ expect(screen.getByText("2. Marina Souza")).toBeInTheDocument();
32
+ });
33
+ it("DataTableColumn é exportado e tipa a coluna com render de nó", () => {
34
+ const coluna = {
35
+ key: "acoes",
36
+ label: "Ações",
37
+ render: () => _jsx("button", { type: "button", children: "Editar" }),
38
+ };
39
+ render(_jsx(DataTable, { columns: [coluna], data: USUARIOS }));
40
+ expect(screen.getAllByRole("button", { name: "Editar" })).toHaveLength(3);
41
+ });
42
+ });
43
+ describe("DataTable · linha de grupo (rowGroup)", () => {
44
+ const colunas = [
45
+ { key: "nome", label: "Usuário" },
46
+ { key: "perfil", label: "Perfil" },
47
+ ];
48
+ it("sem rowGroup não desenha linha de grupo", () => {
49
+ const { container } = render(_jsx(DataTable, { columns: colunas, data: USUARIOS }));
50
+ expect(container.querySelector("th[scope='rowgroup']")).toBeNull();
51
+ });
52
+ it("rowGroup por campo abre um grupo por valor consecutivo", () => {
53
+ const { container } = render(_jsx(DataTable, { columns: colunas, data: USUARIOS, rowGroup: "setor" }));
54
+ const grupos = container.querySelectorAll("th[scope='rowgroup']");
55
+ expect(Array.from(grupos).map((g) => g.textContent)).toEqual(["SADM", "SOBR"]);
56
+ // a linha de grupo atravessa as colunas todas
57
+ expect(grupos[0]).toHaveAttribute("colspan", "2");
58
+ });
59
+ it("rowGroup por função e colspan com selectable", () => {
60
+ const { container } = render(_jsx(DataTable, { columns: colunas, data: USUARIOS, selectable: true, rowGroup: (row) => (row.id === 3 ? undefined : "Equipe A") }));
61
+ const grupos = container.querySelectorAll("th[scope='rowgroup']");
62
+ expect(grupos).toHaveLength(1);
63
+ expect(grupos[0]).toHaveTextContent("Equipe A");
64
+ expect(grupos[0]).toHaveAttribute("colspan", "3");
65
+ });
66
+ it("renderRowGroup devolve nó", () => {
67
+ render(_jsx(DataTable, { columns: colunas, data: USUARIOS, rowGroup: "setor", renderRowGroup: (rotulo) => _jsxs("em", { "data-testid": "grupo", children: [rotulo, "!"] }) }));
68
+ expect(screen.getAllByTestId("grupo").map((n) => n.textContent)).toEqual(["SADM!", "SOBR!"]);
69
+ });
70
+ it("a linha de grupo não entra na seleção por índice", async () => {
71
+ const { container } = render(_jsx(DataTable, { columns: colunas, data: USUARIOS, rowGroup: "setor", selectable: true, selectedRows: [2] }));
72
+ const selecionadas = container.querySelectorAll(".umds-datatable__row--selected");
73
+ expect(selecionadas).toHaveLength(1);
74
+ expect(within(selecionadas[0]).getByText("Rafael Pereira")).toBeInTheDocument();
75
+ });
76
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,92 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { render, screen } from "@testing-library/react";
4
+ import userEvent from "@testing-library/user-event";
5
+ import DataTable from "../components/DataTable/DataTable";
6
+ import DescriptionList from "../components/DescriptionList/DescriptionList";
7
+ const COLUNAS = [
8
+ { key: "descricao", label: "Descrição", sortable: true },
9
+ { key: "quantidade", label: "Quantidade", align: "right" },
10
+ ];
11
+ const DADOS = [
12
+ { descricao: "Diesel S10", quantidade: "5.760" },
13
+ { descricao: "Gasolina comum", quantidade: "1.200" },
14
+ ];
15
+ describe("DataTable variant=document", () => {
16
+ it("é a tabela de documento: classe própria, cabeçalho e linhas", () => {
17
+ const { container } = render(_jsx(DataTable, { variant: "document", columns: COLUNAS, data: DADOS }));
18
+ expect(container.querySelector(".umds-datatable--document")).not.toBeNull();
19
+ expect(screen.getAllByRole("columnheader")).toHaveLength(2);
20
+ expect(screen.getByText("Diesel S10")).toBeInTheDocument();
21
+ });
22
+ it("não ordena: sem botão de ordenar, sem aria-sort", () => {
23
+ render(_jsx(DataTable, { variant: "document", columns: COLUNAS, data: DADOS, sortKey: "descricao", sortDirection: "asc" }));
24
+ expect(screen.queryByRole("button")).toBeNull();
25
+ for (const th of screen.getAllByRole("columnheader"))
26
+ expect(th).not.toHaveAttribute("aria-sort");
27
+ });
28
+ it("não seleciona: selectable é ignorado", () => {
29
+ render(_jsx(DataTable, { variant: "document", selectable: true, columns: COLUNAS, data: DADOS }));
30
+ expect(screen.queryByRole("checkbox")).toBeNull();
31
+ expect(screen.getAllByRole("columnheader")).toHaveLength(2);
32
+ });
33
+ it("linha não é clicável nem entra na ordem de Tab", async () => {
34
+ const usuario = userEvent.setup();
35
+ const aoClicar = vi.fn();
36
+ const { container } = render(_jsx(DataTable, { variant: "document", columns: COLUNAS, data: DADOS, onRowClick: aoClicar }));
37
+ const linha = container.querySelector("tbody tr");
38
+ expect(linha).not.toHaveAttribute("tabindex");
39
+ expect(linha).not.toHaveClass("umds-datatable__row--clickable");
40
+ await usuario.click(linha);
41
+ expect(aoClicar).not.toHaveBeenCalled();
42
+ });
43
+ it("a tabela de interface continua igual (ordena, seleciona, clica)", async () => {
44
+ const usuario = userEvent.setup();
45
+ const aoOrdenar = vi.fn();
46
+ render(_jsx(DataTable, { columns: COLUNAS, data: DADOS, selectable: true, onSort: aoOrdenar }));
47
+ expect(screen.getAllByRole("checkbox").length).toBeGreaterThan(0);
48
+ await usuario.click(screen.getByRole("button", { name: /Descrição/ }));
49
+ expect(aoOrdenar).toHaveBeenCalledWith("descricao", "asc");
50
+ });
51
+ });
52
+ describe("DescriptionList", () => {
53
+ const ITENS = [
54
+ { label: "Dotação", value: "02.031.0001" },
55
+ { label: "Empenho", value: "2026NE000184" },
56
+ { label: "Fonte", value: "" },
57
+ ];
58
+ it("é um dl com um dt e um dd por par", () => {
59
+ const { container } = render(_jsx(DescriptionList, { items: ITENS, ariaLabel: "Dados de empenho" }));
60
+ const dl = container.querySelector("dl");
61
+ expect(dl).toHaveAttribute("aria-label", "Dados de empenho");
62
+ expect(dl.querySelectorAll("dt")).toHaveLength(3);
63
+ expect(dl.querySelectorAll("dd")).toHaveLength(3);
64
+ expect(dl.querySelector("dt")).toHaveTextContent("Dotação");
65
+ expect(dl.querySelector("dd")).toHaveTextContent("02.031.0001");
66
+ });
67
+ it("valor vazio mostra o traço, ou o texto de emptyValue", () => {
68
+ const { container, rerender } = render(_jsx(DescriptionList, { items: ITENS }));
69
+ expect(container.querySelectorAll("dd")[2]).toHaveTextContent("—");
70
+ rerender(_jsx(DescriptionList, { items: ITENS, emptyValue: "N\u00E3o informado" }));
71
+ expect(container.querySelectorAll("dd")[2]).toHaveTextContent("Não informado");
72
+ });
73
+ it("inline é o padrão; fit encolhe", () => {
74
+ const { container, rerender } = render(_jsx(DescriptionList, { items: ITENS }));
75
+ const dl = container.querySelector("dl");
76
+ expect(dl).toHaveClass("umds-description-list--inline");
77
+ expect(dl).not.toHaveClass("umds-description-list--fit");
78
+ rerender(_jsx(DescriptionList, { items: ITENS, fit: true }));
79
+ expect(container.querySelector("dl")).toHaveClass("umds-description-list--fit");
80
+ });
81
+ it("stacked ganha as colunas e a caixa do valor", () => {
82
+ const { container } = render(_jsx(DescriptionList, { items: ITENS, layout: "stacked", columns: 3, bordered: true }));
83
+ const dl = container.querySelector("dl");
84
+ expect(dl).toHaveClass("umds-description-list--stacked");
85
+ expect(dl).toHaveClass("umds-description-list--cols-3");
86
+ expect(dl).toHaveClass("umds-description-list--bordered");
87
+ });
88
+ it("sem itens, não desenha par nenhum", () => {
89
+ const { container } = render(_jsx(DescriptionList, {}));
90
+ expect(container.querySelectorAll("dt")).toHaveLength(0);
91
+ });
92
+ });
@@ -69,3 +69,26 @@ describe("DatePicker · teclado", () => {
69
69
  expect(screen.getByRole("combobox")).toHaveTextContent(/15\/\d{2}\/\d{4}/);
70
70
  });
71
71
  });
72
+ /**
73
+ * A story "Com valor" mostrava "Selecione o período" com `value="2025-12-31"`.
74
+ * Não era a story: no modo single o componente só lia `range`, e `value` e
75
+ * `defaultValue` eram declarados e nunca chegavam ao campo.
76
+ */
77
+ describe("DatePicker · valor no modo single", () => {
78
+ it("`value` aparece no campo, no formato pedido", () => {
79
+ render(_jsx(DatePicker, { label: "Vencimento", value: "2025-12-31", format: "DD/MM/YYYY" }));
80
+ expect(screen.getByRole("combobox")).toHaveTextContent("31/12/2025");
81
+ });
82
+ it("`defaultValue` semeia o campo no modo não-controlado", () => {
83
+ render(_jsx(DatePicker, { label: "Vencimento", defaultValue: "2025-06-15" }));
84
+ expect(screen.getByRole("combobox")).toHaveTextContent("15/06/2025");
85
+ });
86
+ it("`value` vazio no modo controlado mostra o placeholder", () => {
87
+ render(_jsx(DatePicker, { label: "Vencimento", value: "", placeholder: "DD/MM/AAAA" }));
88
+ expect(screen.getByRole("combobox")).toHaveTextContent("DD/MM/AAAA");
89
+ });
90
+ it("o modo range continua lendo `range`, não `value`", () => {
91
+ render(_jsx(DatePicker, { mode: "range", label: "Per\u00EDodo", value: "2025-01-01", range: { from: "2025-03-01", to: "2025-03-10" } }));
92
+ expect(screen.getByRole("combobox")).toHaveTextContent("01/03/2025 – 10/03/2025");
93
+ });
94
+ });