@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
@@ -45,7 +45,7 @@ function ConfirmDialog(props) {
45
45
  }
46
46
  function confirmText() {
47
47
  return props.confirmLoading
48
- ? "Aguarde..."
48
+ ? props.loadingLabel || "Aguarde..."
49
49
  : props.confirmLabel || "Confirmar";
50
50
  }
51
51
  function handleCancel(event) {
@@ -148,6 +148,6 @@ function ConfirmDialog(props) {
148
148
  removeOverlay(uid);
149
149
  };
150
150
  }, []);
151
- return (_jsx(_Fragment, { children: props.open ? (_jsx(_Fragment, { children: _jsx("div", { onClick: (event) => handleOverlayClick(event), className: overlayClasses(), children: _jsxs("div", { role: "alertdialog", "aria-modal": "true", ref: dialogRef, "aria-label": props.title, tabIndex: -1, onClick: (event) => stopPropagation(event), onKeyDown: (event) => handleTrapKeydown(event), className: dialogClasses(), children: [_jsx("div", { className: "umds-confirm-dialog__icon-wrap", children: _jsx(Icon, { variant: "inherit", customSize: "24px", icon: iconName() }) }), _jsxs("div", { className: "umds-confirm-dialog__content", children: [_jsx("h2", { className: "umds-confirm-dialog__title", children: props.title }), props.description ? (_jsx("p", { className: "umds-confirm-dialog__description", children: props.description })) : null, props.children ? (_jsx("div", { className: "umds-confirm-dialog__body", children: _jsx(_Fragment, { children: props.children }) })) : null] }), _jsxs("div", { className: "umds-confirm-dialog__footer", children: [_jsx("button", { type: "button", className: "umds-confirm-dialog__btn umds-confirm-dialog__btn--cancel", ref: cancelBtnRef, onClick: (event) => props.onCancel?.(event), children: props.cancelLabel || "Cancelar" }), _jsx("button", { type: "button", onClick: (event) => props.onConfirm?.(event), disabled: props.confirmLoading, className: confirmBtnClass(), children: confirmText() })] })] }) }) })) : null }));
151
+ return (_jsx(_Fragment, { children: props.open ? (_jsx(_Fragment, { children: _jsx("div", { onClick: (event) => handleOverlayClick(event), className: overlayClasses(), children: _jsxs("div", { role: "alertdialog", "aria-modal": "true", ref: dialogRef, "aria-label": props.title, tabIndex: -1, onClick: (event) => stopPropagation(event), onKeyDown: (event) => handleTrapKeydown(event), className: dialogClasses(), children: [_jsx("div", { className: "umds-confirm-dialog__icon-wrap", children: _jsx(Icon, { variant: "inherit", customSize: "24px", icon: iconName() }) }), _jsxs("div", { className: "umds-confirm-dialog__content", children: [_jsx("h2", { className: "umds-confirm-dialog__title", children: props.title }), props.description ? (_jsx("p", { className: "umds-confirm-dialog__description", children: props.description })) : null, props.children ? (_jsx("div", { className: "umds-confirm-dialog__body", children: _jsx(_Fragment, { children: props.children }) })) : null] }), _jsxs("div", { className: "umds-confirm-dialog__footer", children: [_jsx("button", { type: "button", className: "umds-confirm-dialog__btn umds-confirm-dialog__btn--cancel", ref: cancelBtnRef, onClick: (event) => props.onCancel?.(event), children: props.cancelLabel || "Cancelar" }), _jsx("button", { type: "button", onClick: (event) => props.onConfirm?.(event), disabled: props.confirmLoading || props.confirmDisabled, className: confirmBtnClass(), children: confirmText() })] })] }) }) })) : null }));
152
152
  }
153
153
  export default ConfirmDialog;
@@ -154,6 +154,26 @@
154
154
  outline-offset: -2px;
155
155
  }
156
156
 
157
+ /* ── Linha de grupo (prop rowGroup) ──
158
+ Um <th scope="rowgroup"> que atravessa a tabela. Não é clicável nem
159
+ selecionável, então o hover da linha comum não se aplica. */
160
+ .umds-datatable__row--group,
161
+ .umds-datatable__row--group:hover {
162
+ background: var(--umds-semantic-color-background-light); /* #F4F6F9 */
163
+ }
164
+
165
+ .umds-datatable__group {
166
+ padding: var(--umds-primitive-spacing-nano) var(--umds-primitive-spacing-xxxs); /* 8px 16px */
167
+ font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
168
+ font-weight: 700;
169
+ text-align: left;
170
+ color: var(--umds-semantic-color-neutral-dark-down); /* #565656 */
171
+ }
172
+
173
+ .umds-datatable--compact .umds-datatable__group {
174
+ padding: var(--umds-primitive-spacing-quarck) var(--umds-primitive-spacing-nano); /* 4px 8px */
175
+ }
176
+
157
177
  /* ── Células ── */
158
178
  .umds-datatable__td {
159
179
  padding: var(--umds-primitive-spacing-mini) var(--umds-primitive-spacing-xxxs); /* protótipo --space-3 (12px): candidato a novo token; 16px */
@@ -237,3 +257,63 @@
237
257
  0% { background-position: 200% 0; }
238
258
  100% { background-position: -200% 0; }
239
259
  }
260
+
261
+ /* ── Variante document (variant="document") ──
262
+ Tabela de CONTEÚDO de documento (itens de nota, cotações): lê-se e imprime-se,
263
+ não se opera. Sem hover, sem cursor, sem cabeçalho grudado; grade de bordas
264
+ finas em todas as células, como no papel. Na impressão o cabeçalho se repete
265
+ a cada página e uma linha nunca é cortada ao meio. */
266
+ .umds-datatable--document {
267
+ border: none;
268
+ border-radius: var(--umds-primitive-border-radius-none);
269
+ background: transparent;
270
+ }
271
+
272
+ .umds-datatable--document .umds-datatable__table {
273
+ border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
274
+ }
275
+
276
+ .umds-datatable--document .umds-datatable__thead {
277
+ position: static;
278
+ border-bottom: none;
279
+ }
280
+
281
+ .umds-datatable--document .umds-datatable__th,
282
+ .umds-datatable--document .umds-datatable__td {
283
+ border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
284
+ vertical-align: top;
285
+ user-select: auto;
286
+ }
287
+
288
+ .umds-datatable--document .umds-datatable__th {
289
+ font-size: var(--umds-primitive-font-size-xxs); /* 14px: no papel o cabeçalho é lido, não escaneado */
290
+ white-space: normal;
291
+ color: var(--umds-semantic-color-neutral-dark-pure);
292
+ }
293
+
294
+ .umds-datatable--document .umds-datatable__row,
295
+ .umds-datatable--document .umds-datatable__row:hover {
296
+ background: transparent;
297
+ border-bottom: none;
298
+ }
299
+
300
+ .umds-datatable--document .umds-datatable__td {
301
+ overflow-wrap: anywhere;
302
+ }
303
+
304
+ @media print {
305
+ .umds-datatable--document {
306
+ overflow-x: visible;
307
+ -webkit-print-color-adjust: exact;
308
+ print-color-adjust: exact;
309
+ }
310
+
311
+ .umds-datatable--document .umds-datatable__thead {
312
+ display: table-header-group;
313
+ }
314
+
315
+ .umds-datatable--document .umds-datatable__row {
316
+ break-inside: avoid;
317
+ page-break-inside: avoid;
318
+ }
319
+ }
@@ -7,8 +7,10 @@ import './DataTable.css';
7
7
  * @property {string} width - Largura fixa da coluna (ex.: "120px")
8
8
  * @property {string} align - Alinhamento do conteúdo: 'left' | 'center' | 'right'
9
9
  * @property {function} render - Renderização customizada da célula: recebe a linha e o
10
- * índice e retorna o conteúdo (ReactNode no React; no Vue, prefira retornar string).
11
- * Sem `render`, a célula exibe `row[key]` — que também aceita ReactNode diretamente.
10
+ * índice e retorna o conteúdo. No React devolve qualquer nó (badge, avatar, botão).
11
+ * No Vue o retorno é tratado como TEXTO: para célula com markup use o slot
12
+ * `#cell-<key>` (recebe `{ row, value, rowIndex }`), que vale sobre o `render`.
13
+ * Sem `render` nem slot, a célula exibe `row[key]`.
12
14
  */
13
15
  export interface DataTableColumn {
14
16
  key: string;
@@ -32,6 +34,7 @@ export interface DataTableColumn {
32
34
  * (selectedKeys/onSelectKeys) em vez de índice — sobrevive a paginação e ordenação.
33
35
  * @property {Array<string|number>} selectedKeys - Chaves das linhas selecionadas (controlado;
34
36
  * requer rowKey)
37
+ * @property {string} variant - 'default' (tabela de interface) | 'document' (tabela de CONTEÚDO de documento: sem ordenação, seleção nem clique de linha, bordas finas, cabeçalho repetido e linha inteira por página na impressão)
35
38
  * @property {string} density - Densidade das células: 'default' | 'compact'
36
39
  * @property {string} sortKey - Chave da coluna atualmente ordenada
37
40
  * @property {string} sortDirection - Direção da ordenação: 'asc' | 'desc'
@@ -42,8 +45,16 @@ export interface DataTableColumn {
42
45
  * @property {function} onSelectKeys - Callback ao alterar a seleção por chave (requer rowKey)
43
46
  * @property {function} onRowClick - Callback ao clicar numa linha (recebe índice e a linha);
44
47
  * cliques no checkbox de seleção não disparam
45
- * @quandoUsar Dados TABULARES que se comparam coluna a coluna, com ordenação, seleção e paginação. Semântica de tabela para leitor de tela.
46
- * @quandoNaoUsar Para hierarquia pai-filho — use `Tree`. Para cards em grade sem comparação coluna a coluna, use `Grid` com `Card`.
48
+ * @property {string|function} rowGroup - Agrupa linhas consecutivas: nome do campo ou função
49
+ * (row, rowIndex) => rótulo. Antes da primeira linha de cada grupo entra uma linha de
50
+ * grupo (`<th scope="rowgroup">` ocupando a largura toda). Linha sem rótulo não abre grupo.
51
+ * A tabela não reordena: ordene `data` por grupo antes de passar.
52
+ * @property {function} renderRowGroup - Conteúdo da linha de grupo: (label, row, rowIndex) => nó.
53
+ * Só no React. No Vue use o slot `#row-group` (recebe `{ label, row, rowIndex }`).
54
+ * @slot cell-<key> - Só no Vue. Célula livre da coluna `<key>`: `<template #cell-nome="{ row, value, rowIndex }">`.
55
+ * @slot row-group - Só no Vue. Conteúdo da linha de grupo: `{ label, row, rowIndex }`.
56
+ * @quandoUsar Dados TABULARES que se comparam coluna a coluna, com ordenação, seleção e paginação. Semântica de tabela para leitor de tela. Com `variant="document"`, a tabela que faz parte do TEXTO de um documento que se imprime (itens de nota, cotações): sem interação, com bordas finas e quebra de página que não corta linha.
57
+ * @quandoNaoUsar Para hierarquia pai-filho — use `Tree`. Para cards em grade sem comparação coluna a coluna, use `Grid` com `Card`. Para pares rótulo/valor de um documento (sem cabeçalho de coluna), use `DescriptionList`.
47
58
  */
48
59
  export interface DataTableProps {
49
60
  columns: DataTableColumn[];
@@ -53,7 +64,11 @@ export interface DataTableProps {
53
64
  selectable?: boolean;
54
65
  selectedRows?: number[];
55
66
  rowKey?: string | ((row: Record<string, any>) => string | number);
67
+ rowGroup?: string | ((row: Record<string, any>, rowIndex: number) => string | undefined);
68
+ renderRowGroup?: (label: string, row: Record<string, any>, rowIndex: number) => any;
56
69
  selectedKeys?: Array<string | number>;
70
+ /** `document`: tabela de conteúdo de documento, imprimível e sem interação. @default 'default' */
71
+ variant?: "default" | "document";
57
72
  density?: "default" | "compact";
58
73
  sortKey?: string;
59
74
  sortDirection?: "asc" | "desc";
@@ -63,6 +78,10 @@ export interface DataTableProps {
63
78
  onSelect?: (selectedIndexes: number[]) => void;
64
79
  onSelectKeys?: (selectedKeys: Array<string | number>) => void;
65
80
  onRowClick?: (rowIndex: number, row: Record<string, any>) => void;
81
+ /** Nome acessível do checkbox de selecionar todas as linhas. Troque para traduzir. @default 'Selecionar todas as linhas' */
82
+ selectAllLabel?: string;
83
+ /** Nome acessível do checkbox de cada linha. Recebe o número da linha (a partir de 1). Troque para traduzir. @default (rowNumber) => 'Selecionar linha ' + rowNumber */
84
+ selectRowLabel?: (rowNumber: number) => string;
66
85
  }
67
86
  declare function DataTable(props: DataTableProps): import("react/jsx-runtime").JSX.Element;
68
87
  export default DataTable;
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import './DataTable.css';
4
+ import * as React from "react";
4
5
  import { faSort, faSortUp, faSortDown, faInbox, } from "@fortawesome/free-solid-svg-icons";
5
6
  import Icon from "../Icon/Icon";
6
7
  import Checkbox from "../Checkbox/Checkbox";
@@ -11,7 +12,7 @@ function DataTable(props) {
11
12
  function rows() {
12
13
  return props.data || [];
13
14
  }
14
- function selected() {
15
+ function selectedIndexes() {
15
16
  return props.selectedRows || [];
16
17
  }
17
18
  function selectedKeysList() {
@@ -20,9 +21,16 @@ function DataTable(props) {
20
21
  function usesKeys() {
21
22
  return !!props.rowKey;
22
23
  }
24
+ function isDocument() {
25
+ return props.variant === "document";
26
+ }
27
+ function canSelect() {
28
+ return !!props.selectable && props.variant !== "document";
29
+ }
23
30
  function tableClasses() {
24
31
  return [
25
32
  "umds-datatable",
33
+ props.variant === "document" ? "umds-datatable--document" : "",
26
34
  props.density === "compact" ? "umds-datatable--compact" : "",
27
35
  props.className,
28
36
  ]
@@ -43,8 +51,31 @@ function DataTable(props) {
43
51
  function hasRows() {
44
52
  return !props.loading && rows().length > 0;
45
53
  }
54
+ function groupOf(row, index) {
55
+ if (!props.rowGroup)
56
+ return "";
57
+ const bruto = typeof props.rowGroup === "function"
58
+ ? props.rowGroup(row, index)
59
+ : row[props.rowGroup];
60
+ return bruto === undefined || bruto === null ? "" : String(bruto);
61
+ }
62
+ function newGroupLabel(index) {
63
+ if (!props.rowGroup)
64
+ return "";
65
+ const atual = groupOf(rows()[index], index);
66
+ if (!atual)
67
+ return "";
68
+ if (index === 0)
69
+ return atual;
70
+ return groupOf(rows()[index - 1], index - 1) === atual ? "" : atual;
71
+ }
72
+ function groupContent(label, row, index) {
73
+ if (props.renderRowGroup)
74
+ return props.renderRowGroup(label, row, index);
75
+ return label;
76
+ }
46
77
  function colSpan() {
47
- return columnsList().length + (props.selectable ? 1 : 0);
78
+ return columnsList().length + (canSelect() ? 1 : 0);
48
79
  }
49
80
  function rowKeyOf(row, index) {
50
81
  if (typeof props.rowKey === "function")
@@ -59,17 +90,17 @@ function DataTable(props) {
59
90
  if (usesKeys()) {
60
91
  return rows().every((row, i) => selectedKeysList().includes(rowKeyOf(row, i)));
61
92
  }
62
- return selected().length === rows().length;
93
+ return selectedIndexes().length === rows().length;
63
94
  }
64
95
  function someSelected() {
65
96
  if (usesKeys()) {
66
97
  return (!allSelected() &&
67
98
  rows().some((row, i) => selectedKeysList().includes(rowKeyOf(row, i))));
68
99
  }
69
- return selected().length > 0 && !allSelected();
100
+ return selectedIndexes().length > 0 && !allSelected();
70
101
  }
71
102
  function handleSort(col) {
72
- if (!col.sortable)
103
+ if (!col.sortable || props.variant === "document")
73
104
  return;
74
105
  const dir = props.sortKey === col.key && props.sortDirection === "asc"
75
106
  ? "desc"
@@ -110,7 +141,7 @@ function DataTable(props) {
110
141
  const nextKeys = current.includes(key)
111
142
  ? current.filter((k) => k !== key)
112
143
  : [...current, key];
113
- const currentIdx = selected();
144
+ const currentIdx = selectedIndexes();
114
145
  const nextIdx = currentIdx.includes(index)
115
146
  ? currentIdx.filter((i) => i !== index)
116
147
  : [...currentIdx, index];
@@ -119,7 +150,7 @@ function DataTable(props) {
119
150
  }
120
151
  if (!props.onSelect)
121
152
  return;
122
- const current = selected();
153
+ const current = selectedIndexes();
123
154
  const next = current.includes(index)
124
155
  ? current.filter((i) => i !== index)
125
156
  : [...current, index];
@@ -129,7 +160,7 @@ function DataTable(props) {
129
160
  if (usesKeys()) {
130
161
  return selectedKeysList().includes(rowKeyOf(row, index));
131
162
  }
132
- return selected().includes(index);
163
+ return selectedIndexes().includes(index);
133
164
  }
134
165
  function cellContent(col, row, rowIndex) {
135
166
  if (col.render)
@@ -137,11 +168,13 @@ function DataTable(props) {
137
168
  return row[col.key];
138
169
  }
139
170
  function handleRowClick(rowIndex, row) {
171
+ if (props.variant === "document")
172
+ return;
140
173
  if (props.onRowClick)
141
174
  props.onRowClick(rowIndex, row);
142
175
  }
143
176
  function aoTeclarNaLinha(rowIndex, row, event) {
144
- if (!props.onRowClick || !event)
177
+ if (!props.onRowClick || props.variant === "document" || !event)
145
178
  return;
146
179
  // Só a própria linha aciona. Sem esta guarda, o Espaço dentro do
147
180
  // checkbox de seleção era engolido pelo preventDefault abaixo e a
@@ -157,25 +190,33 @@ function DataTable(props) {
157
190
  handleRowClick(rowIndex, row);
158
191
  }
159
192
  function rowTabIndex() {
160
- return props.onRowClick ? 0 : undefined;
193
+ return props.onRowClick && props.variant !== "document" ? 0 : undefined;
161
194
  }
162
195
  function rowRole() {
163
196
  return undefined;
164
197
  }
165
198
  function rowSelectLabel(index) {
199
+ if (props.selectRowLabel)
200
+ return props.selectRowLabel(index + 1);
166
201
  return "Selecionar linha " + (index + 1);
167
202
  }
168
203
  function thClasses(col) {
169
204
  return [
170
205
  "umds-datatable__th",
171
- col.sortable ? "umds-datatable__th--sortable" : "",
172
- props.sortKey === col.key ? "umds-datatable__th--sorted" : "",
206
+ col.sortable && props.variant !== "document"
207
+ ? "umds-datatable__th--sortable"
208
+ : "",
209
+ props.sortKey === col.key && props.variant !== "document"
210
+ ? "umds-datatable__th--sorted"
211
+ : "",
173
212
  col.align ? `umds-datatable__th--${col.align}` : "",
174
213
  ]
175
214
  .filter(Boolean)
176
215
  .join(" ");
177
216
  }
178
217
  function ariaSort(col) {
218
+ if (props.variant === "document")
219
+ return undefined;
179
220
  if (props.sortKey !== col.key)
180
221
  return "none";
181
222
  return props.sortDirection === "asc" ? "ascending" : "descending";
@@ -193,6 +234,9 @@ function DataTable(props) {
193
234
  return faSort;
194
235
  return props.sortDirection === "desc" ? faSortDown : faSortUp;
195
236
  }
237
+ function sortableCol(col) {
238
+ return !!col.sortable && props.variant !== "document";
239
+ }
196
240
  function tdClasses(col) {
197
241
  return [
198
242
  "umds-datatable__td",
@@ -205,15 +249,17 @@ function DataTable(props) {
205
249
  return [
206
250
  "umds-datatable__row",
207
251
  isSelected(row, rowIdx) ? "umds-datatable__row--selected" : "",
208
- props.onRowClick ? "umds-datatable__row--clickable" : "",
252
+ props.onRowClick && props.variant !== "document"
253
+ ? "umds-datatable__row--clickable"
254
+ : "",
209
255
  ]
210
256
  .filter(Boolean)
211
257
  .join(" ");
212
258
  }
213
- return (_jsx("div", { className: tableClasses(), children: _jsxs("table", { className: "umds-datatable__table", "aria-busy": props.loading, children: [_jsx("thead", { className: "umds-datatable__thead", children: _jsxs("tr", { children: [props.selectable ? (_jsx("th", { scope: "col", className: "umds-datatable__th umds-datatable__th--checkbox", children: _jsx(Checkbox, { ariaLabel: "Selecionar todas as linhas", checked: allSelected(), indeterminate: someSelected(), onChange: (event) => toggleAll() }) })) : null, columnsList()?.map((col) => (_jsxs("th", { scope: "col", style: col.width
259
+ return (_jsx("div", { className: tableClasses(), children: _jsxs("table", { className: "umds-datatable__table", "aria-busy": props.loading, children: [_jsx("thead", { className: "umds-datatable__thead", children: _jsxs("tr", { children: [canSelect() ? (_jsx("th", { scope: "col", className: "umds-datatable__th umds-datatable__th--checkbox", children: _jsx(Checkbox, { checked: allSelected(), indeterminate: someSelected(), ariaLabel: props.selectAllLabel || "Selecionar todas as linhas", onChange: (event) => toggleAll() }) })) : null, columnsList()?.map((col) => (_jsxs("th", { scope: "col", style: col.width
214
260
  ? {
215
261
  width: col.width,
216
262
  }
217
- : {}, "aria-sort": ariaSort(col), className: thClasses(col), children: [col.sortable ? (_jsxs("button", { type: "button", className: "umds-datatable__sort-button umds-datatable__th-content", onClick: (event) => handleSort(col), children: [col.label, _jsx("span", { "aria-hidden": "true", className: sortIconClasses(col), children: _jsx(Icon, { variant: "inherit", customSize: "12px", icon: sortIconName(col) }) })] })) : null, !col.sortable ? (_jsx("span", { className: "umds-datatable__th-content", children: col.label })) : null] }, col.key)))] }) }), _jsxs("tbody", { className: "umds-datatable__tbody", children: [props.loading ? (_jsx(_Fragment, { children: skeletonRowsList()?.map((_, rowIdx) => (_jsxs("tr", { className: "umds-datatable__row umds-datatable__row--skeleton", children: [props.selectable ? (_jsx("td", { className: "umds-datatable__td umds-datatable__td--checkbox", children: _jsx("div", { className: "umds-datatable__skeleton umds-datatable__skeleton--checkbox" }) })) : null, columnsList()?.map((col) => (_jsx("td", { className: "umds-datatable__td", children: _jsx("div", { className: "umds-datatable__skeleton" }) }, col.key)))] }, `sk-${rowIdx}`))) })) : null, isEmpty() ? (_jsx("tr", { className: "umds-datatable__row--empty", children: _jsx("td", { className: "umds-datatable__td umds-datatable__td--empty", colSpan: colSpan(), children: _jsxs("div", { className: "umds-datatable__empty", children: [_jsx("span", { "aria-hidden": "true", className: "umds-datatable__empty-icon", children: _jsx(Icon, { variant: "inherit", customSize: "48px", icon: faInbox }) }), _jsx("span", { children: props.emptyMessage || "Nenhum registro encontrado" })] }) }) })) : null, hasRows() ? (_jsx(_Fragment, { children: rows()?.map((row, rowIdx) => (_jsxs("tr", { onClick: (event) => handleRowClick(rowIdx, row), onKeyDown: (event) => aoTeclarNaLinha(rowIdx, row, event), tabIndex: rowTabIndex(), role: rowRole(), className: rowClasses(row, rowIdx), children: [props.selectable ? (_jsx("td", { className: "umds-datatable__td umds-datatable__td--checkbox", onClick: (event) => event.stopPropagation(), children: _jsx(Checkbox, { checked: isSelected(row, rowIdx), ariaLabel: rowSelectLabel(rowIdx), onChange: (event) => toggleRow(row, rowIdx) }) })) : null, columnsList()?.map((col) => (_jsx("td", { className: tdClasses(col), children: cellContent(col, row, rowIdx) }, col.key)))] }, rowIdx))) })) : null] })] }) }));
263
+ : {}, "aria-sort": ariaSort(col), className: thClasses(col), children: [sortableCol(col) ? (_jsxs("button", { type: "button", className: "umds-datatable__sort-button umds-datatable__th-content", onClick: (event) => handleSort(col), children: [col.label, _jsx("span", { "aria-hidden": "true", className: sortIconClasses(col), children: _jsx(Icon, { variant: "inherit", customSize: "12px", icon: sortIconName(col) }) })] })) : null, !sortableCol(col) ? (_jsx("span", { className: "umds-datatable__th-content", children: col.label })) : null] }, col.key)))] }) }), _jsxs("tbody", { className: "umds-datatable__tbody", children: [props.loading ? (_jsx(_Fragment, { children: skeletonRowsList()?.map((_, rowIdx) => (_jsxs("tr", { className: "umds-datatable__row umds-datatable__row--skeleton", children: [canSelect() ? (_jsx("td", { className: "umds-datatable__td umds-datatable__td--checkbox", children: _jsx("div", { className: "umds-datatable__skeleton umds-datatable__skeleton--checkbox" }) })) : null, columnsList()?.map((col) => (_jsx("td", { className: "umds-datatable__td", children: _jsx("div", { className: "umds-datatable__skeleton" }) }, col.key)))] }, `sk-${rowIdx}`))) })) : null, isEmpty() ? (_jsx("tr", { className: "umds-datatable__row--empty", children: _jsx("td", { className: "umds-datatable__td umds-datatable__td--empty", colSpan: colSpan(), children: _jsxs("div", { className: "umds-datatable__empty", children: [_jsx("span", { "aria-hidden": "true", className: "umds-datatable__empty-icon", children: _jsx(Icon, { variant: "inherit", customSize: "48px", icon: faInbox }) }), _jsx("span", { children: props.emptyMessage || "Nenhum registro encontrado" })] }) }) })) : null, hasRows() ? (_jsx(_Fragment, { children: rows()?.map((row, rowIdx) => (_jsxs(React.Fragment, { children: [newGroupLabel(rowIdx) ? (_jsx("tr", { className: "umds-datatable__row umds-datatable__row--group", children: _jsx("th", { scope: "rowgroup", className: "umds-datatable__group", colSpan: colSpan(), children: groupContent(newGroupLabel(rowIdx), row, rowIdx) }) })) : null, _jsxs("tr", { onClick: (event) => handleRowClick(rowIdx, row), onKeyDown: (event) => aoTeclarNaLinha(rowIdx, row, event), tabIndex: rowTabIndex(), role: rowRole(), className: rowClasses(row, rowIdx), children: [canSelect() ? (_jsx("td", { className: "umds-datatable__td umds-datatable__td--checkbox", onClick: (event) => event.stopPropagation(), children: _jsx(Checkbox, { checked: isSelected(row, rowIdx), ariaLabel: rowSelectLabel(rowIdx), onChange: (event) => toggleRow(row, rowIdx) }) })) : null, columnsList()?.map((col) => (_jsx("td", { className: tdClasses(col), children: cellContent(col, row, rowIdx) }, col.key)))] })] }, rowIdx))) })) : null] })] }) }));
218
264
  }
219
265
  export default DataTable;
@@ -156,6 +156,14 @@
156
156
  background-color: var(--umds-semantic-field-readonly-background);
157
157
  }
158
158
 
159
+ /* Somente leitura não é desabilitado: o texto segue lido e o WCAG 1.4.3 vale
160
+ sem isenção. O placeholder padrão foi calibrado para fundo branco e cai para
161
+ ~4,2:1 sobre o fundo de somente leitura; neutral-dark-down passa 4,5:1 em
162
+ todos os temas (1doc 6,78:1 · 1doc-dark 10,83:1 · alto contraste 16,48:1). */
163
+ .umds-datepicker--readonly .umds-datepicker__placeholder {
164
+ color: var(--umds-semantic-color-neutral-dark-down);
165
+ }
166
+
159
167
  /* ── Wrapper flutuante (Portal no body; posicionado pelo floating-ui via style inline) ── */
160
168
  .umds-datepicker__floating {
161
169
  display: block;
@@ -67,6 +67,10 @@ export interface DatePickerProps {
67
67
  previousMonthLabel?: string;
68
68
  /** Rótulo acessível do botão de próximo mês. @default 'Próximo mês' */
69
69
  nextMonthLabel?: string;
70
+ /** Nome acessível do painel do calendário (e do campo, quando não há `label` nem `ariaLabel`). Troque para traduzir. @default 'Selecionar data' ou, com mode="range", 'Selecionar período' */
71
+ dialogLabel?: string;
72
+ /** Nome acessível de cada dia da grade. Recebe a data em ISO (YYYY-MM-DD). Troque para traduzir. @default (isoDate) => '20 de julho de 2026' (mês por `locale.months`, em minúsculas) */
73
+ dayLabel?: (isoDate: string) => string;
70
74
  /** Período selecionado (modo controlado). */
71
75
  /** Modo de seleção. "single" = uma data; "range" = período de duas datas. */
72
76
  mode?: "single" | "range";
@@ -34,14 +34,21 @@ function DatePicker(props) {
34
34
  const [viewYear, setViewYear] = useState(() => 0);
35
35
  const [viewMonth, setViewMonth] = useState(() => 0);
36
36
  const [uid, setUid] = useState(() => "umds-datepicker-" + Math.random().toString(36).slice(2, 9));
37
- const [internalFrom, setInternalFrom] = useState(() => (props.defaultRange && props.defaultRange.from) || "");
37
+ const [internalFrom, setInternalFrom] = useState(() => props.mode !== "range" && props.defaultValue
38
+ ? props.defaultValue
39
+ : (props.defaultRange && props.defaultRange.from) || "");
38
40
  const [internalTo, setInternalTo] = useState(() => (props.defaultRange && props.defaultRange.to) || "");
39
41
  const [hoverIso, setHoverIso] = useState(() => "");
40
42
  const [focusedIso, setFocusedIso] = useState(() => "");
41
43
  function currentFrom() {
44
+ if (props.mode !== "range" && props.value !== undefined) {
45
+ return props.value || "";
46
+ }
42
47
  return props.range !== undefined ? props.range.from || "" : internalFrom;
43
48
  }
44
49
  function currentTo() {
50
+ if (props.mode !== "range" && props.value !== undefined)
51
+ return "";
45
52
  return props.range !== undefined ? props.range.to || "" : internalTo;
46
53
  }
47
54
  function monthNames() {
@@ -83,6 +90,8 @@ function DatePicker(props) {
83
90
  return props.label ? labelId() : undefined;
84
91
  }
85
92
  function textoDoAlvo() {
93
+ if (props.dialogLabel)
94
+ return props.dialogLabel;
86
95
  return props.mode === "range" ? "Selecionar período" : "Selecionar data";
87
96
  }
88
97
  function comboboxAriaLabel() {
@@ -447,6 +456,8 @@ function DatePicker(props) {
447
456
  .join(" ");
448
457
  }
449
458
  function dayAriaLabel(cell) {
459
+ if (props.dayLabel)
460
+ return props.dayLabel(cell.iso);
450
461
  const parts = cell.iso.split("-");
451
462
  return (Number(parts[2]) +
452
463
  " de " +
@@ -487,6 +498,8 @@ function DatePicker(props) {
487
498
  }
488
499
  function handleKeydown(event) {
489
500
  if (event && event.key === "Escape" && open) {
501
+ // O Esc é do calendário (fecha só ele): o Modal em volta não reage.
502
+ event.preventDefault();
490
503
  closeCalendar();
491
504
  }
492
505
  }
@@ -0,0 +1,113 @@
1
+ /* ─────────────────────────────────────────────
2
+ DESCRIPTION LIST
3
+ Pares rótulo/valor de um documento, em <dl>.
4
+
5
+ inline: grade de bordas finas, rótulo pintado à esquerda, sem cabeçalho.
6
+ As linhas viram `display: contents` para as duas colunas alinharem
7
+ entre todos os pares; as bordas são as linhas de 1px que a grade
8
+ deixa entre as células (o fundo da lista é a cor da borda).
9
+ stacked: rótulo pequeno em cima, valor embaixo, em até 4 colunas.
10
+
11
+ Cores: semânticos · Medidas: primitivos
12
+ ───────────────────────────────────────────── */
13
+
14
+ .umds-description-list {
15
+ margin: 0;
16
+ padding: 0;
17
+ font-family: var(--umds-semantic-font-family-base);
18
+ font-size: var(--umds-primitive-font-size-xxs); /* 14px */
19
+ color: var(--umds-semantic-color-neutral-dark-pure);
20
+ }
21
+
22
+ .umds-description-list__term,
23
+ .umds-description-list__description {
24
+ margin: 0;
25
+ overflow-wrap: anywhere;
26
+ }
27
+
28
+ /* ── inline ── */
29
+ .umds-description-list--inline {
30
+ display: grid;
31
+ grid-template-columns: max-content minmax(0, 1fr);
32
+ gap: var(--umds-primitive-border-width-hairline);
33
+ border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
34
+ background: var(--umds-semantic-color-neutral-light-medium);
35
+ }
36
+
37
+ .umds-description-list--inline.umds-description-list--fit {
38
+ display: inline-grid;
39
+ }
40
+
41
+ .umds-description-list--inline .umds-description-list__item {
42
+ display: contents;
43
+ }
44
+
45
+ .umds-description-list--inline .umds-description-list__term,
46
+ .umds-description-list--inline .umds-description-list__description {
47
+ padding: var(--umds-primitive-spacing-quarck) var(--umds-primitive-spacing-nano); /* 4px 8px */
48
+ }
49
+
50
+ /* O rótulo é a coluna pintada: sem negrito e sem quebra. */
51
+ .umds-description-list--inline .umds-description-list__term {
52
+ background: var(--umds-semantic-color-background-light);
53
+ color: var(--umds-semantic-color-neutral-dark-down);
54
+ font-weight: var(--umds-primitive-font-weight-regular);
55
+ white-space: nowrap;
56
+ }
57
+
58
+ .umds-description-list--inline .umds-description-list__description {
59
+ background: var(--umds-semantic-color-background-white);
60
+ }
61
+
62
+ /* ── stacked ── */
63
+ .umds-description-list--stacked {
64
+ display: grid;
65
+ gap: var(--umds-primitive-spacing-xxxs); /* 16px */
66
+ }
67
+
68
+ .umds-description-list--cols-1 { grid-template-columns: minmax(0, 1fr); }
69
+ .umds-description-list--cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
70
+ .umds-description-list--cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
71
+ .umds-description-list--cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
72
+
73
+ .umds-description-list--stacked .umds-description-list__item {
74
+ display: flex;
75
+ flex-direction: column;
76
+ gap: var(--umds-primitive-spacing-quarck); /* 4px */
77
+ min-width: 0;
78
+ }
79
+
80
+ .umds-description-list--stacked .umds-description-list__term {
81
+ font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
82
+ font-weight: var(--umds-primitive-font-weight-semibold);
83
+ color: var(--umds-semantic-color-neutral-dark-down);
84
+ }
85
+
86
+ .umds-description-list--bordered .umds-description-list__description {
87
+ padding: var(--umds-primitive-spacing-nano) var(--umds-primitive-spacing-mini); /* 8px 12px */
88
+ border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
89
+ border-radius: var(--umds-primitive-border-radius-sm);
90
+ background: var(--umds-semantic-field-readonly-background);
91
+ }
92
+
93
+ /* Telas estreitas: o stacked vira uma coluna só. */
94
+ @media (max-width: 640px) {
95
+ .umds-description-list--cols-2,
96
+ .umds-description-list--cols-3,
97
+ .umds-description-list--cols-4 {
98
+ grid-template-columns: minmax(0, 1fr);
99
+ }
100
+ }
101
+
102
+ /* ── Impressão: o par não é cortado entre duas páginas e a cor do rótulo sai ── */
103
+ @media print {
104
+ .umds-description-list {
105
+ -webkit-print-color-adjust: exact;
106
+ print-color-adjust: exact;
107
+ }
108
+
109
+ .umds-description-list__item {
110
+ break-inside: avoid;
111
+ page-break-inside: avoid;
112
+ }
113
+ }
@@ -0,0 +1,59 @@
1
+ import './DescriptionList.css';
2
+ /**
3
+ * Par rótulo/valor da DescriptionList.
4
+ * @property {string} label - Rótulo (o termo).
5
+ * @property {any} value - Valor (a descrição). No Vue é tratado como texto.
6
+ * @property {string} id - Identidade estável do par (padrão: o próprio rótulo).
7
+ */
8
+ export interface DescriptionListItem {
9
+ label: string;
10
+ value?: any;
11
+ id?: string;
12
+ [key: string]: any;
13
+ }
14
+ /**
15
+ * DescriptionList — pares rótulo/valor de um documento, em `<dl>`.
16
+ *
17
+ * Dois desenhos para o mesmo dado:
18
+ * - `inline` (padrão): uma linha por par, rótulo pintado à esquerda e valor à
19
+ * direita, numa grade de bordas finas e SEM cabeçalho. Encolhe até o conteúdo
20
+ * (`fit`) ou ocupa a largura toda. É a tabela de "dotação orçamentária" de um
21
+ * despacho.
22
+ * - `stacked`: rótulo pequeno em cima e valor embaixo, em até 4 `columns`. É o
23
+ * bloco "Dados do processo". Com `bordered`, o valor ganha a caixa de um campo
24
+ * somente leitura.
25
+ *
26
+ * O que é do papel fica nela: sem hover, sem foco, sem clique, e na impressão o
27
+ * par nunca é cortado entre duas páginas. Para tabela com cabeçalho de coluna,
28
+ * use `DataTable variant="document"`.
29
+ *
30
+ * Semântica: `<dl>` com `<dt>` e `<dd>`, agrupados por `<div>` (HTML 5.2). O
31
+ * leitor de tela anuncia a lista de termos e a quantidade.
32
+ * @property {DescriptionListItem[]} items - Os pares, na ordem em que aparecem
33
+ * @property {string} layout - 'inline' (padrão) | 'stacked'
34
+ * @property {number} columns - Só no `stacked`: colunas de pares, de 1 a 4 (padrão 2)
35
+ * @property {boolean} bordered - Só no `stacked`: o valor numa caixa de campo somente leitura
36
+ * @property {boolean} fit - Só no `inline`: encolhe até o conteúdo em vez de ocupar a largura toda
37
+ * @property {string} emptyValue - Texto quando o valor vem vazio (padrão: "—")
38
+ * @property {string} ariaLabel - Nome acessível da lista
39
+ * @property {string} ariaLabelledby - Id do título visível que nomeia a lista
40
+ * @property {string} className - Classes CSS adicionais
41
+ * @quandoUsar Dados cadastrais e de empenho dentro do texto de um documento, ficha de processo, bloco de detalhes de uma tela de leitura: qualquer conjunto de "campo: valor".
42
+ * @quandoNaoUsar Para dados com várias linhas comparáveis coluna a coluna, use `DataTable`. Para campos que a pessoa edita, use `Input` e afins. Para valor com marcação (badge, link, botão), a DescriptionList no Vue só mostra texto: monte o bloco com `Stack` e `Text`.
43
+ */
44
+ export interface DescriptionListProps {
45
+ items?: DescriptionListItem[];
46
+ layout?: "inline" | "stacked";
47
+ columns?: 1 | 2 | 3 | 4;
48
+ bordered?: boolean;
49
+ fit?: boolean;
50
+ emptyValue?: string;
51
+ ariaLabel?: string;
52
+ ariaLabelledby?: string;
53
+ className?: string;
54
+ id?: string;
55
+ style?: any;
56
+ [key: string]: any;
57
+ }
58
+ declare function DescriptionList(props: DescriptionListProps): import("react/jsx-runtime").JSX.Element;
59
+ export default DescriptionList;