@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,125 @@
1
+ import './Calendar.css';
2
+ /**
3
+ * Evento do Calendar.
4
+ * @property {string} id - Identidade do evento (opcional)
5
+ * @property {string} date - Dia do evento: `YYYY-MM-DD` (ou um `Date`)
6
+ * @property {string} title - Texto do evento
7
+ * @property {string} color - Cor de DADO do evento: nome de um token (`--umds-primitive-blue-pure`) ou uma cor. Padrão: o primário. A cor vai no fundo suave e na barra do lado; o texto é sempre escuro (a cor nunca fica sozinha).
8
+ * @property {string} time - Horário, mostrado antes do título (ex.: "09:00")
9
+ */
10
+ export interface CalendarEvent {
11
+ id?: string;
12
+ date: any;
13
+ title: string;
14
+ color?: string;
15
+ time?: string;
16
+ [key: string]: any;
17
+ }
18
+ /** Um dia da grade, já pronto para desenhar. */
19
+ /** Um dia da grade, já pronto para desenhar. */
20
+ export interface CalendarDayCell {
21
+ iso: string;
22
+ day: number;
23
+ outside: boolean;
24
+ today: boolean;
25
+ selected: boolean;
26
+ tabIndex: number;
27
+ label: string;
28
+ classes: string;
29
+ visible: CalendarEvent[];
30
+ hidden: number;
31
+ moreText: string;
32
+ moreAria: string;
33
+ [key: string]: any;
34
+ }
35
+ /**
36
+ * Calendar — agenda com eventos por dia, em visão de mês ou de semana.
37
+ *
38
+ * `events` é uma lista plana (`{ date, title, color? }`): o componente agrupa
39
+ * por dia. A cor é cor de DADO (um token, como o do `ColorPicker`), aplicada num
40
+ * fundo suave com uma barra do lado; o texto do evento é sempre escuro, então a
41
+ * cor nunca é a única informação.
42
+ *
43
+ * Mês: cada dia mostra até `maxVisible` eventos e um "+N" para o resto
44
+ * (`onMoreClick` recebe o dia e os eventos escondidos). O corte é por QUANTIDADE,
45
+ * não por altura. Semana: sete colunas, todos os eventos de cada dia.
46
+ *
47
+ * É uma grade acessível (`role="grid"`): um Tab entra no dia em foco (hoje, ou o
48
+ * primeiro), as setas movem de dia (mudando de mês ou de semana se for preciso),
49
+ * Home e End vão às pontas da semana, PageUp e PageDown trocam de mês (ou de
50
+ * semana), Enter e Espaço acionam `onDayClick`. Os eventos do dia em foco entram
51
+ * na ordem de Tab depois dele.
52
+ *
53
+ * A data mostrada (`date`) e a visão (`view`) são controláveis (`onDateChange`,
54
+ * `onViewChange`) ou internas (`defaultDate`, `defaultView`). O cabeçalho aceita
55
+ * o slot `headerStart` (um filtro de escopo, à esquerda) e `headerEnd` (a
56
+ * legenda, à direita). Nomes de mês e de dia saem do `Intl` no `locale` pedido;
57
+ * os demais textos são props.
58
+ * @property {CalendarEvent[]} events - Eventos (lista plana)
59
+ * @property {string} view - Visão: 'month' | 'week' (controlada)
60
+ * @property {string} defaultView - Visão inicial (não controlada; padrão 'month')
61
+ * @property {string} date - Data de referência `YYYY-MM-DD`: o mês ou a semana que ela contém é o que se vê (controlada)
62
+ * @property {string} defaultDate - Data inicial (não controlada; padrão hoje)
63
+ * @property {string} selectedDate - Dia marcado como selecionado (`YYYY-MM-DD`)
64
+ * @property {string} today - O "hoje" do calendário (`YYYY-MM-DD`; padrão a data do sistema). Útil em testes e em demonstração.
65
+ * @property {number} weekStartsOn - Primeiro dia da semana: 0 domingo (padrão) | 1 segunda
66
+ * @property {number} maxVisible - Eventos por dia na visão de mês antes do "+N" (padrão 3)
67
+ * @property {string} locale - Idioma dos nomes de mês e de dia (padrão 'pt-BR')
68
+ * @property {string} ariaLabel - Nome acessível da grade (padrão: o título, ex.: "Maio 2026")
69
+ * @property {string} previousLabel - Nome do botão de voltar (padrão "Anterior")
70
+ * @property {string} nextLabel - Nome do botão de avançar (padrão "Próximo")
71
+ * @property {string} todayLabel - Texto do botão de hoje (padrão "Hoje")
72
+ * @property {string} monthLabel - Texto da visão de mês (padrão "Mês")
73
+ * @property {string} weekLabel - Texto da visão de semana (padrão "Semana")
74
+ * @property {string} viewLabel - Nome do seletor de visão (padrão "Visão")
75
+ * @property {boolean} hideViewSwitcher - Esconde o seletor Mês/Semana
76
+ * @property {string} moreLabel - Texto do "+N"; `{count}` vira o número (padrão "+{count}")
77
+ * @property {string} moreAriaLabel - Nome do "+N"; `{count}` e `{date}` são trocados (padrão "{count} eventos a mais em {date}")
78
+ * @property {function} dayLabel - Nome acessível de cada dia: `(iso, quantidade) => texto` (padrão: "sexta-feira, 15 de maio de 2026, 2 eventos", no `locale`)
79
+ * @property {function} onDayClick - Clique (ou Enter) num dia: recebe `YYYY-MM-DD`
80
+ * @property {function} onEventClick - Clique num evento: recebe o evento
81
+ * @property {function} onMoreClick - Clique no "+N": recebe o dia e a lista dos eventos escondidos
82
+ * @property {function} onDateChange - Mudou a data de referência (navegação): recebe `YYYY-MM-DD`
83
+ * @property {function} onViewChange - Mudou a visão: recebe 'month' | 'week'
84
+ * @property {string} className - Classes CSS adicionais
85
+ * @slot headerStart - Cabeçalho, à esquerda: um filtro de escopo.
86
+ * @slot headerEnd - Cabeçalho, antes do seletor de visão: a legenda.
87
+ * @quandoUsar Mostrar prazos, vencimentos e compromissos distribuídos no tempo: agenda de documentos, de tarefas, de assinaturas.
88
+ * @quandoNaoUsar Para escolher UMA data num campo, use `DatePicker`. Para uma sequência de acontecimentos sem grade de dias, use `Timeline`. Para uma grade de horas (agenda com horário de início e fim), este componente não serve: não tem eixo de horas.
89
+ */
90
+ /** Um dia da grade, já pronto para desenhar. */
91
+ export interface CalendarProps {
92
+ events?: CalendarEvent[];
93
+ view?: "month" | "week";
94
+ defaultView?: "month" | "week";
95
+ date?: string;
96
+ defaultDate?: string;
97
+ selectedDate?: string;
98
+ today?: string;
99
+ weekStartsOn?: 0 | 1;
100
+ maxVisible?: number;
101
+ locale?: string;
102
+ ariaLabel?: string;
103
+ previousLabel?: string;
104
+ nextLabel?: string;
105
+ todayLabel?: string;
106
+ monthLabel?: string;
107
+ weekLabel?: string;
108
+ viewLabel?: string;
109
+ hideViewSwitcher?: boolean;
110
+ moreLabel?: string;
111
+ moreAriaLabel?: string;
112
+ dayLabel?: (iso: string, count: number) => string;
113
+ className?: string;
114
+ /** Slot `headerStart`: à esquerda do cabeçalho. */
115
+ headerStart?: any;
116
+ /** Slot `headerEnd`: à direita, antes do seletor de visão. */
117
+ headerEnd?: any;
118
+ onDayClick?: (iso: string) => void;
119
+ onEventClick?: (event: CalendarEvent) => void;
120
+ onMoreClick?: (iso: string, hidden: CalendarEvent[]) => void;
121
+ onDateChange?: (iso: string) => void;
122
+ onViewChange?: (view: "month" | "week") => void;
123
+ }
124
+ declare function Calendar(props: CalendarProps): import("react/jsx-runtime").JSX.Element;
125
+ export default Calendar;
@@ -0,0 +1,320 @@
1
+ "use client";
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import './Calendar.css';
4
+ import { useState, useRef, useEffect } from "react";
5
+ import { faChevronLeft, faChevronRight, } from "@fortawesome/free-solid-svg-icons";
6
+ import Button from "../Button/Button";
7
+ import Icon from "../Icon/Icon";
8
+ import SegmentedControl from "../SegmentedControl/SegmentedControl";
9
+ import { addDays, addMonths, isSameMonth, monthMatrix, normalizeIso, parseIso, startOfWeek, toIso, weekDays, } from "../../utils/calendario";
10
+ function Calendar(props) {
11
+ const rootRef = useRef(null);
12
+ const focoPendenteRef = useRef("");
13
+ const [internalDate, setInternalDate] = useState(() => "");
14
+ const [internalView, setInternalView] = useState(() => props.defaultView === "week" ? "week" : "month");
15
+ const [focusIso, setFocusIso] = useState(() => "");
16
+ function todayIso() {
17
+ return normalizeIso(props.today) || toIso(new Date());
18
+ }
19
+ function refIso() {
20
+ const informada = normalizeIso(props.date) ||
21
+ normalizeIso(internalDate) ||
22
+ normalizeIso(props.defaultDate);
23
+ return informada || todayIso();
24
+ }
25
+ function viewValue() {
26
+ const bruta = props.view !== undefined ? props.view : internalView;
27
+ return bruta === "week" ? "week" : "month";
28
+ }
29
+ function weekStart() {
30
+ return props.weekStartsOn === 1 ? 1 : 0;
31
+ }
32
+ function localeText() {
33
+ return props.locale || "pt-BR";
34
+ }
35
+ function limite() {
36
+ return props.maxVisible && props.maxVisible > 0 ? props.maxVisible : 3;
37
+ }
38
+ function rangeRows() {
39
+ return viewValue() === "week"
40
+ ? [weekDays(refIso(), weekStart())]
41
+ : monthMatrix(refIso(), weekStart());
42
+ }
43
+ function formatar(iso, opcoes) {
44
+ const texto = new Intl.DateTimeFormat(localeText(), opcoes).format(parseIso(iso));
45
+ const limpo = texto.replace(".", "");
46
+ return limpo.charAt(0).toUpperCase() + limpo.slice(1);
47
+ }
48
+ function titleText() {
49
+ if (viewValue() === "week") {
50
+ const dias = weekDays(refIso(), weekStart());
51
+ const formato = new Intl.DateTimeFormat(localeText(), {
52
+ day: "numeric",
53
+ month: "short",
54
+ year: "numeric",
55
+ });
56
+ const inicio = parseIso(dias[0]);
57
+ const fim = parseIso(dias[6]);
58
+ const anyFormato = formato;
59
+ return typeof anyFormato.formatRange === "function"
60
+ ? anyFormato.formatRange(inicio, fim)
61
+ : formato.format(inicio) + " – " + formato.format(fim);
62
+ }
63
+ return (formatar(refIso(), {
64
+ month: "long",
65
+ }) +
66
+ " " +
67
+ parseIso(refIso()).getFullYear());
68
+ }
69
+ function weekdayHeads() {
70
+ const base = rangeRows()[0] || [];
71
+ return base.map((iso) => ({
72
+ iso,
73
+ short: formatar(iso, {
74
+ weekday: "short",
75
+ }),
76
+ full: formatar(iso, {
77
+ weekday: "long",
78
+ }),
79
+ }));
80
+ }
81
+ function gridLabel() {
82
+ return props.ariaLabel || titleText();
83
+ }
84
+ function monthText() {
85
+ return props.monthLabel || "Mês";
86
+ }
87
+ function weekText() {
88
+ return props.weekLabel || "Semana";
89
+ }
90
+ function viewOptions() {
91
+ return [
92
+ {
93
+ value: "month",
94
+ label: monthText(),
95
+ },
96
+ {
97
+ value: "week",
98
+ label: weekText(),
99
+ },
100
+ ];
101
+ }
102
+ function rootClasses() {
103
+ return ["umds-calendar", "umds-calendar--" + viewValue(), props.className]
104
+ .filter(Boolean)
105
+ .join(" ");
106
+ }
107
+ function tabIso() {
108
+ const todos = rangeRows().reduce((soma, linha) => soma.concat(linha), []);
109
+ const dentro = (iso) => todos.indexOf(iso) !== -1 &&
110
+ (viewValue() === "week" || isSameMonth(iso, refIso()));
111
+ if (focusIso && dentro(focusIso))
112
+ return focusIso;
113
+ if (dentro(todayIso()))
114
+ return todayIso();
115
+ return viewValue() === "week" ? todos[0] : refIso().slice(0, 8) + "01";
116
+ }
117
+ function eventMap() {
118
+ const mapa = {};
119
+ const lista = props.events || [];
120
+ for (let i = 0; i < lista.length; i++) {
121
+ const dia = normalizeIso(lista[i].date);
122
+ if (!dia)
123
+ continue;
124
+ if (!mapa[dia])
125
+ mapa[dia] = [];
126
+ mapa[dia].push(lista[i]);
127
+ }
128
+ for (const dia in mapa) {
129
+ mapa[dia].sort((a, b) => String(a.time || "").localeCompare(String(b.time || "")));
130
+ }
131
+ return mapa;
132
+ }
133
+ function nomeDoDia(iso, quantidade) {
134
+ if (props.dayLabel)
135
+ return props.dayLabel(iso, quantidade);
136
+ const data = new Intl.DateTimeFormat(localeText(), {
137
+ weekday: "long",
138
+ day: "numeric",
139
+ month: "long",
140
+ year: "numeric",
141
+ }).format(parseIso(iso));
142
+ const eventos = quantidade === 0
143
+ ? "sem eventos"
144
+ : quantidade === 1
145
+ ? "1 evento"
146
+ : quantidade + " eventos";
147
+ return data + ", " + eventos;
148
+ }
149
+ function textoDoMais(quantidade) {
150
+ return (props.moreLabel || "+{count}").replace("{count}", String(quantidade));
151
+ }
152
+ function nomeDoMais(iso, quantidade) {
153
+ const modelo = props.moreAriaLabel || "{count} eventos a mais em {date}";
154
+ const data = new Intl.DateTimeFormat(localeText(), {
155
+ day: "numeric",
156
+ month: "long",
157
+ }).format(parseIso(iso));
158
+ return modelo
159
+ .replace("{count}", String(quantidade))
160
+ .replace("{date}", data);
161
+ }
162
+ function weeks() {
163
+ const hoje = todayIso();
164
+ const foco = tabIso();
165
+ const selecionado = normalizeIso(props.selectedDate);
166
+ const emSemana = viewValue() === "week";
167
+ return rangeRows().map((linha) => ({
168
+ key: linha[0],
169
+ days: linha.map((iso) => {
170
+ const doDia = eventMap()[iso] || [];
171
+ const fora = !emSemana && !isSameMonth(iso, refIso());
172
+ const visiveis = emSemana ? doDia : doDia.slice(0, limite());
173
+ const escondidos = doDia.length - visiveis.length;
174
+ return {
175
+ iso,
176
+ day: parseIso(iso).getDate(),
177
+ outside: fora,
178
+ today: iso === hoje,
179
+ selected: iso === selecionado,
180
+ tabIndex: iso === foco ? 0 : -1,
181
+ label: nomeDoDia(iso, doDia.length),
182
+ classes: [
183
+ "umds-calendar__cell",
184
+ fora ? "umds-calendar__cell--outside" : "",
185
+ iso === hoje ? "umds-calendar__cell--today" : "",
186
+ iso === selecionado ? "umds-calendar__cell--selected" : "",
187
+ ]
188
+ .filter(Boolean)
189
+ .join(" "),
190
+ visible: visiveis,
191
+ hidden: escondidos,
192
+ moreText: textoDoMais(escondidos),
193
+ moreAria: nomeDoMais(iso, escondidos),
194
+ };
195
+ }),
196
+ }));
197
+ }
198
+ function corCss(cor) {
199
+ const base = cor || "--umds-semantic-color-primary-pure";
200
+ return base.indexOf("--") === 0 ? "var(" + base + ")" : base;
201
+ }
202
+ function eventStyle(evento) {
203
+ const cor = corCss(evento.color || "");
204
+ return {
205
+ borderLeftColor: cor,
206
+ backgroundColor: "color-mix(in srgb, " +
207
+ cor +
208
+ " 16%, var(--umds-semantic-color-background-white))",
209
+ };
210
+ }
211
+ function mudarData(iso) {
212
+ setInternalDate(iso);
213
+ if (props.onDateChange)
214
+ props.onDateChange(iso);
215
+ }
216
+ function mudarVisao(valor) {
217
+ const visao = valor === "week" ? "week" : "month";
218
+ if (visao === viewValue())
219
+ return;
220
+ setInternalView(visao);
221
+ if (props.onViewChange)
222
+ props.onViewChange(visao);
223
+ }
224
+ function handlePrevious() {
225
+ mudarData(viewValue() === "week" ? addDays(refIso(), -7) : addMonths(refIso(), -1));
226
+ }
227
+ function handleNext() {
228
+ mudarData(viewValue() === "week" ? addDays(refIso(), 7) : addMonths(refIso(), 1));
229
+ }
230
+ function handleToday() {
231
+ mudarData(todayIso());
232
+ }
233
+ function irParaDia(iso) {
234
+ const visivel = rangeRows().some((linha) => linha.indexOf(iso) !== -1);
235
+ const nesteMes = viewValue() === "week" || isSameMonth(iso, refIso());
236
+ if (!visivel || !nesteMes)
237
+ mudarData(iso);
238
+ if (iso === focusIso && visivel && nesteMes) {
239
+ focarDia(iso);
240
+ return;
241
+ }
242
+ setFocusIso(iso);
243
+ focoPendenteRef.current = iso;
244
+ }
245
+ function focarDia(iso) {
246
+ if (!rootRef.current)
247
+ return;
248
+ const celula = rootRef.current.querySelector('[data-date="' + iso + '"]');
249
+ if (celula)
250
+ celula.focus();
251
+ }
252
+ function handleCellKeyDown(event, iso) {
253
+ if (!event || event.altKey || event.ctrlKey || event.metaKey)
254
+ return;
255
+ // Só o próprio dia navega: a tecla vinda de um evento dentro dele não.
256
+ if (event.target !== event.currentTarget)
257
+ return;
258
+ const tecla = event.key;
259
+ let alvo = "";
260
+ if (tecla === "ArrowLeft")
261
+ alvo = addDays(iso, -1);
262
+ else if (tecla === "ArrowRight")
263
+ alvo = addDays(iso, 1);
264
+ else if (tecla === "ArrowUp")
265
+ alvo = addDays(iso, -7);
266
+ else if (tecla === "ArrowDown")
267
+ alvo = addDays(iso, 7);
268
+ else if (tecla === "Home")
269
+ alvo = startOfWeek(iso, weekStart());
270
+ else if (tecla === "End")
271
+ alvo = addDays(startOfWeek(iso, weekStart()), 6);
272
+ else if (tecla === "PageUp")
273
+ alvo = viewValue() === "week" ? addDays(iso, -7) : addMonths(iso, -1);
274
+ else if (tecla === "PageDown")
275
+ alvo = viewValue() === "week" ? addDays(iso, 7) : addMonths(iso, 1);
276
+ else if (tecla === "Enter" || tecla === " ") {
277
+ event.preventDefault();
278
+ handleDayClick(iso);
279
+ return;
280
+ }
281
+ else
282
+ return;
283
+ event.preventDefault();
284
+ irParaDia(alvo);
285
+ }
286
+ function handleCellFocus(event, iso) {
287
+ // Só o foco no próprio dia conta: o foco num evento dentro dele não muda o dia.
288
+ if (event && event.target !== event.currentTarget)
289
+ return;
290
+ if (focusIso !== iso)
291
+ setFocusIso(iso);
292
+ }
293
+ function handleDayClick(iso) {
294
+ setFocusIso(iso);
295
+ if (props.onDayClick)
296
+ props.onDayClick(iso);
297
+ }
298
+ function handleEventClick(event, evento) {
299
+ if (event && event.stopPropagation)
300
+ event.stopPropagation();
301
+ if (props.onEventClick)
302
+ props.onEventClick(evento);
303
+ }
304
+ function handleMoreClick(event, iso) {
305
+ if (event && event.stopPropagation)
306
+ event.stopPropagation();
307
+ const todos = eventMap()[iso] || [];
308
+ if (props.onMoreClick)
309
+ props.onMoreClick(iso, todos.slice(limite()));
310
+ }
311
+ useEffect(() => {
312
+ if (focoPendenteRef.current) {
313
+ const alvo = focoPendenteRef.current;
314
+ focoPendenteRef.current = "";
315
+ focarDia(alvo);
316
+ }
317
+ });
318
+ return (_jsxs("div", { ref: rootRef, className: rootClasses(), children: [_jsxs("div", { className: "umds-calendar__toolbar", children: [_jsx("div", { className: "umds-calendar__toolbar-start", children: props.headerStart ? _jsx(_Fragment, { children: props.headerStart }) : null }), _jsxs("div", { className: "umds-calendar__nav", children: [_jsx(Button, { variant: "icon", size: "sm", ariaLabel: props.previousLabel || "Anterior", onClick: (event) => handlePrevious(), children: _jsx(Icon, { size: "sm", variant: "inherit", icon: faChevronLeft }) }), _jsx("span", { "aria-live": "polite", className: "umds-calendar__title", children: titleText() }), _jsx(Button, { variant: "icon", size: "sm", ariaLabel: props.nextLabel || "Próximo", onClick: (event) => handleNext(), children: _jsx(Icon, { size: "sm", variant: "inherit", icon: faChevronRight }) }), _jsx(Button, { variant: "secondary", size: "sm", onClick: (event) => handleToday(), children: props.todayLabel || "Hoje" })] }), _jsxs("div", { className: "umds-calendar__toolbar-end", children: [props.headerEnd ? _jsx(_Fragment, { children: props.headerEnd }) : null, !props.hideViewSwitcher ? (_jsx("div", { role: "group", "aria-label": props.viewLabel || "Visão", children: _jsx(SegmentedControl, { size: "sm", options: viewOptions(), value: viewValue(), onChange: (valor) => mudarVisao(valor) }) })) : null] })] }), _jsxs("div", { role: "grid", className: "umds-calendar__grid", "aria-label": gridLabel(), children: [_jsx("div", { role: "row", className: "umds-calendar__weekdays", children: weekdayHeads()?.map((cabecalho) => (_jsx("div", { role: "columnheader", className: "umds-calendar__weekday", "aria-label": cabecalho.full, children: _jsx("span", { "aria-hidden": "true", children: cabecalho.short }) }, cabecalho.iso))) }), weeks()?.map((semana) => (_jsx("div", { role: "row", className: "umds-calendar__week", children: semana.days?.map((dia) => (_jsxs("div", { role: "gridcell", "data-date": dia.iso, tabIndex: dia.tabIndex, "aria-label": dia.label, "aria-selected": dia.selected ? "true" : undefined, "aria-current": dia.today ? "date" : undefined, onClick: (event) => handleDayClick(dia.iso), onKeyDown: (event) => handleCellKeyDown(event, dia.iso), onFocus: (event) => handleCellFocus(event, dia.iso), className: dia.classes, children: [_jsx("span", { "aria-hidden": "true", className: "umds-calendar__day-number", children: dia.day }), _jsxs("div", { className: "umds-calendar__events", children: [dia.visible?.map((evento, posicao) => (_jsxs("button", { type: "button", className: "umds-calendar__event", style: eventStyle(evento), tabIndex: dia.tabIndex, title: evento.title, onClick: (event) => handleEventClick(event, evento), children: [evento.time ? (_jsx("span", { className: "umds-calendar__event-time", children: evento.time })) : null, _jsx("span", { className: "umds-calendar__event-title", children: evento.title })] }, evento.id || dia.iso + "-" + posicao))), dia.hidden > 0 ? (_jsx("button", { type: "button", className: "umds-calendar__more", tabIndex: dia.tabIndex, "aria-label": dia.moreAria, onClick: (event) => handleMoreClick(event, dia.iso), children: dia.moreText })) : null] })] }, dia.iso))) }, semana.key)))] })] }));
319
+ }
320
+ export default Calendar;
@@ -61,6 +61,12 @@ export interface BarChartProps {
61
61
  showLegend?: any;
62
62
  showGrid?: any;
63
63
  emptyText?: string;
64
+ /** Cabeçalho da coluna de categorias na tabela oculta lida pelo leitor de tela. Troque para traduzir. @default 'Categoria' */
65
+ categoryLabel?: string;
66
+ /** Nome acessível da lista de categorias focáveis; o `title`, se houver, vem depois de " — ". Troque para traduzir. @default 'Valores por categoria' */
67
+ valuesListLabel?: string;
68
+ /** Nome do tipo de gráfico: legenda da tabela oculta quando não há `title` e começo do resumo automático. O resumo automático é em português; em outro idioma, passe também `ariaLabel`. @default 'Gráfico de barras' */
69
+ typeLabel?: string;
64
70
  className?: string;
65
71
  }
66
72
  declare function BarChart(props: BarChartProps): import("react/jsx-runtime").JSX.Element;
@@ -32,6 +32,8 @@ function BarChart(props) {
32
32
  unit: props.unit,
33
33
  showLegend: props.showLegend,
34
34
  showGrid: props.showGrid,
35
+ typeLabel: props.typeLabel,
36
+ valuesListLabel: props.valuesListLabel,
35
37
  }, largura, props.height || 240);
36
38
  }
37
39
  function classeDaSerie(serie) {
@@ -135,6 +137,6 @@ function BarChart(props) {
135
137
  }
136
138
  };
137
139
  }, []);
138
- return (_jsxs("figure", { ref: figuraRef, className: classes(), children: [props.title ? (_jsx("figcaption", { className: "umds-chart__titulo", children: props.title })) : null, modelo().mostraLegenda ? (_jsx("ul", { role: "list", className: "umds-chart__legenda", children: modelo().legenda?.map((item) => (_jsxs("li", { className: "umds-chart__legenda-item", children: [_jsx("span", { "aria-hidden": "true", className: classeDaSerie(item.serie) }), _jsx("span", { children: item.nome })] }, item.chave))) })) : null, modelo().vazio ? (_jsx("div", { className: "umds-chart__vazio", style: estiloDaArea(), children: props.emptyText || "Sem dados para exibir." })) : null, !modelo().vazio ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "umds-chart__area", style: estiloDaArea(), children: [_jsx("div", { role: "img", className: "umds-chart__desenho", "aria-label": modelo().resumo, children: _jsxs("svg", { preserveAspectRatio: "none", "aria-hidden": "true", focusable: "false", className: "umds-chart__svg", viewBox: modelo().viewBox, children: [modelo().mostraGrade ? (_jsx(_Fragment, { children: modelo().grade?.map((linha) => (_jsx("line", { className: "umds-chart__grade", x1: linha.x1, x2: linha.x2, y1: linha.y, y2: linha.y }, linha.chave))) })) : null, modelo().grade?.map((linha) => (_jsx("text", { className: "umds-chart__tick", x: linha.xTexto, y: linha.y, children: linha.texto }, linha.chave))), modelo().rotulosX?.map((rotulo) => (_jsx("text", { className: "umds-chart__rotulo-x", x: rotulo.x, y: rotulo.y, children: rotulo.texto }, rotulo.chave))), modelo().barras?.map((barra) => (_jsx("path", { d: barra.d, className: classesDaBarra(barra.serie, barra.indice) }, barra.chave))), _jsx("line", { className: "umds-chart__base", x1: modelo().esquerda, x2: modelo().fimX, y1: modelo().y0, y2: modelo().y0 })] }) }), _jsx("div", { role: "list", className: "umds-chart__alvos", "aria-label": modelo().rotuloDaLista, children: modelo().alvos?.map((alvo) => (_jsxs("div", { role: "listitem", className: "umds-chart__alvo", tabIndex: tabIndexDoAlvo(alvo.indice, modelo().alvos.length), style: estiloDoAlvo(alvo.esquerda, alvo.largura, modelo().topo, modelo().base), onMouseEnter: (event) => ativar(alvo.indice), onMouseLeave: (event) => desativar(), onFocus: (event) => aoFocar(alvo.indice), onBlur: (event) => aoDesfocar(), onKeyDown: (event) => aoTeclar(event, alvo.indice, modelo().alvos.length), children: [_jsx("span", { className: "umds-chart__oculto", children: alvo.descricao }), ehAtivo(alvo.indice) ? (_jsxs("div", { "aria-hidden": "true", className: classesDoTooltip(alvo.lado), children: [_jsx("span", { className: "umds-chart__tooltip-categoria", children: alvo.categoria }), alvo.linhas?.map((linha) => (_jsxs("span", { className: "umds-chart__tooltip-linha", children: [_jsx("span", { className: classeDaChaveDoTooltip(linha.serie) }), _jsx("span", { className: "umds-chart__tooltip-valor", children: linha.texto }), alvo.linhas.length > 1 ? (_jsx("span", { className: "umds-chart__tooltip-nome", children: linha.nome })) : null] }, linha.serie)))] })) : null] }, alvo.indice))) })] }), _jsxs("table", { className: "umds-chart__oculto", children: [_jsx("caption", { children: modelo().legendaDaTabela }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "Categoria" }), modelo().cabecalhos?.map((item) => (_jsx("th", { scope: "col", children: item.nome }, item.chave)))] }) }), _jsx("tbody", { children: modelo().tabela?.map((linha) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", children: linha.categoria }), linha.valores?.map((valor) => (_jsx("td", { children: valor.texto }, valor.chave)))] }, linha.chave))) })] })] })) : null] }));
140
+ return (_jsxs("figure", { ref: figuraRef, className: classes(), children: [props.title ? (_jsx("figcaption", { className: "umds-chart__titulo", children: props.title })) : null, modelo().mostraLegenda ? (_jsx("ul", { role: "list", className: "umds-chart__legenda", children: modelo().legenda?.map((item) => (_jsxs("li", { className: "umds-chart__legenda-item", children: [_jsx("span", { "aria-hidden": "true", className: classeDaSerie(item.serie) }), _jsx("span", { children: item.nome })] }, item.chave))) })) : null, modelo().vazio ? (_jsx("div", { className: "umds-chart__vazio", style: estiloDaArea(), children: props.emptyText || "Sem dados para exibir." })) : null, !modelo().vazio ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "umds-chart__area", style: estiloDaArea(), children: [_jsx("div", { role: "img", className: "umds-chart__desenho", "aria-label": modelo().resumo, children: _jsxs("svg", { preserveAspectRatio: "none", "aria-hidden": "true", focusable: "false", className: "umds-chart__svg", viewBox: modelo().viewBox, children: [modelo().mostraGrade ? (_jsx(_Fragment, { children: modelo().grade?.map((linha) => (_jsx("line", { className: "umds-chart__grade", x1: linha.x1, x2: linha.x2, y1: linha.y, y2: linha.y }, linha.chave))) })) : null, modelo().grade?.map((linha) => (_jsx("text", { className: "umds-chart__tick", x: linha.xTexto, y: linha.y, children: linha.texto }, linha.chave))), modelo().rotulosX?.map((rotulo) => (_jsx("text", { className: "umds-chart__rotulo-x", x: rotulo.x, y: rotulo.y, children: rotulo.texto }, rotulo.chave))), modelo().barras?.map((barra) => (_jsx("path", { d: barra.d, className: classesDaBarra(barra.serie, barra.indice) }, barra.chave))), _jsx("line", { className: "umds-chart__base", x1: modelo().esquerda, x2: modelo().fimX, y1: modelo().y0, y2: modelo().y0 })] }) }), _jsx("div", { role: "list", className: "umds-chart__alvos", "aria-label": modelo().rotuloDaLista, children: modelo().alvos?.map((alvo) => (_jsxs("div", { role: "listitem", className: "umds-chart__alvo", tabIndex: tabIndexDoAlvo(alvo.indice, modelo().alvos.length), style: estiloDoAlvo(alvo.esquerda, alvo.largura, modelo().topo, modelo().base), onMouseEnter: (event) => ativar(alvo.indice), onMouseLeave: (event) => desativar(), onFocus: (event) => aoFocar(alvo.indice), onBlur: (event) => aoDesfocar(), onKeyDown: (event) => aoTeclar(event, alvo.indice, modelo().alvos.length), children: [_jsx("span", { className: "umds-chart__oculto", children: alvo.descricao }), ehAtivo(alvo.indice) ? (_jsxs("div", { "aria-hidden": "true", className: classesDoTooltip(alvo.lado), children: [_jsx("span", { className: "umds-chart__tooltip-categoria", children: alvo.categoria }), alvo.linhas?.map((linha) => (_jsxs("span", { className: "umds-chart__tooltip-linha", children: [_jsx("span", { className: classeDaChaveDoTooltip(linha.serie) }), _jsx("span", { className: "umds-chart__tooltip-valor", children: linha.texto }), alvo.linhas.length > 1 ? (_jsx("span", { className: "umds-chart__tooltip-nome", children: linha.nome })) : null] }, linha.serie)))] })) : null] }, alvo.indice))) })] }), _jsxs("table", { className: "umds-chart__oculto", children: [_jsx("caption", { children: modelo().legendaDaTabela }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: props.categoryLabel || "Categoria" }), modelo().cabecalhos?.map((item) => (_jsx("th", { scope: "col", children: item.nome }, item.chave)))] }) }), _jsx("tbody", { children: modelo().tabela?.map((linha) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", children: linha.categoria }), linha.valores?.map((valor) => (_jsx("td", { children: valor.texto }, valor.chave)))] }, linha.chave))) })] })] })) : null] }));
139
141
  }
140
142
  export default BarChart;
@@ -42,6 +42,12 @@ export interface LineChartProps {
42
42
  showGrid?: any;
43
43
  showPoints?: any;
44
44
  emptyText?: string;
45
+ /** Cabeçalho da coluna de categorias na tabela oculta lida pelo leitor de tela. Troque para traduzir. @default 'Categoria' */
46
+ categoryLabel?: string;
47
+ /** Nome acessível da lista de categorias focáveis; o `title`, se houver, vem depois de " — ". Troque para traduzir. @default 'Valores por categoria' */
48
+ valuesListLabel?: string;
49
+ /** Nome do tipo de gráfico: legenda da tabela oculta quando não há `title` e começo do resumo automático. O resumo automático é em português; em outro idioma, passe também `ariaLabel`. @default 'Gráfico de linhas' */
50
+ typeLabel?: string;
45
51
  className?: string;
46
52
  }
47
53
  import type { ChartDatum, ChartSeries } from "./BarChart";
@@ -32,6 +32,8 @@ function LineChart(props) {
32
32
  unit: props.unit,
33
33
  showLegend: props.showLegend,
34
34
  showGrid: props.showGrid,
35
+ typeLabel: props.typeLabel,
36
+ valuesListLabel: props.valuesListLabel,
35
37
  }, largura, props.height || 240);
36
38
  }
37
39
  function classeDaChaveDoTooltip(serie) {
@@ -134,6 +136,6 @@ function LineChart(props) {
134
136
  }
135
137
  };
136
138
  }, []);
137
- return (_jsxs("figure", { ref: figuraRef, className: classes(), children: [props.title ? (_jsx("figcaption", { className: "umds-chart__titulo", children: props.title })) : null, modelo().mostraLegenda ? (_jsx("ul", { role: "list", className: "umds-chart__legenda", children: modelo().legenda?.map((item) => (_jsxs("li", { className: "umds-chart__legenda-item", children: [_jsx("span", { "aria-hidden": "true", className: classeDaChaveDoTooltip(item.serie) }), _jsx("span", { children: item.nome })] }, item.chave))) })) : null, modelo().vazio ? (_jsx("div", { className: "umds-chart__vazio", style: estiloDaArea(), children: props.emptyText || "Sem dados para exibir." })) : null, !modelo().vazio ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "umds-chart__area", style: estiloDaArea(), children: [_jsx("div", { role: "img", className: "umds-chart__desenho", "aria-label": modelo().resumo, children: _jsxs("svg", { preserveAspectRatio: "none", "aria-hidden": "true", focusable: "false", className: "umds-chart__svg", viewBox: modelo().viewBox, children: [modelo().mostraGrade ? (_jsx(_Fragment, { children: modelo().grade?.map((linha) => (_jsx("line", { className: "umds-chart__grade", x1: linha.x1, x2: linha.x2, y1: linha.y, y2: linha.y }, linha.chave))) })) : null, modelo().grade?.map((linha) => (_jsx("text", { className: "umds-chart__tick", x: linha.xTexto, y: linha.y, children: linha.texto }, linha.chave))), modelo().rotulosX?.map((rotulo) => (_jsx("text", { className: "umds-chart__rotulo-x", x: rotulo.x, y: rotulo.y, children: rotulo.texto }, rotulo.chave))), _jsx("line", { className: "umds-chart__base", x1: modelo().esquerda, x2: modelo().fimX, y1: modelo().y0, y2: modelo().y0 }), modelo().alvos?.map((alvo) => ehAtivo(alvo.indice) ? (_jsx("line", { className: "umds-chart__cursor", x1: alvo.cx, x2: alvo.cx, y1: modelo().topo, y2: modelo().base }, alvo.indice)) : null), modelo().tracos?.map((traco) => (_jsx("path", { d: traco.d, className: classesDaLinha(traco.serie) }, traco.chave))), modelo().pontos?.map((ponto) => pontoVisivel(ponto.indice) ? (_jsx("circle", { cx: ponto.x, cy: ponto.y, r: 5, className: classesDoPonto(ponto.serie) }, ponto.chave)) : null)] }) }), _jsx("div", { role: "list", className: "umds-chart__alvos", "aria-label": modelo().rotuloDaLista, children: modelo().alvos?.map((alvo) => (_jsxs("div", { role: "listitem", className: "umds-chart__alvo", tabIndex: tabIndexDoAlvo(alvo.indice, modelo().alvos.length), style: estiloDoAlvo(alvo.esquerda, alvo.largura, modelo().topo, modelo().base), onMouseEnter: (event) => ativar(alvo.indice), onMouseLeave: (event) => desativar(), onFocus: (event) => aoFocar(alvo.indice), onBlur: (event) => aoDesfocar(), onKeyDown: (event) => aoTeclar(event, alvo.indice, modelo().alvos.length), children: [_jsx("span", { className: "umds-chart__oculto", children: alvo.descricao }), ehAtivo(alvo.indice) ? (_jsxs("div", { "aria-hidden": "true", className: classesDoTooltip(alvo.lado), children: [_jsx("span", { className: "umds-chart__tooltip-categoria", children: alvo.categoria }), alvo.linhas?.map((linha) => (_jsxs("span", { className: "umds-chart__tooltip-linha", children: [_jsx("span", { className: classeDaChaveDoTooltip(linha.serie) }), _jsx("span", { className: "umds-chart__tooltip-valor", children: linha.texto }), alvo.linhas.length > 1 ? (_jsx("span", { className: "umds-chart__tooltip-nome", children: linha.nome })) : null] }, linha.serie)))] })) : null] }, alvo.indice))) })] }), _jsxs("table", { className: "umds-chart__oculto", children: [_jsx("caption", { children: modelo().legendaDaTabela }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "Categoria" }), modelo().cabecalhos?.map((item) => (_jsx("th", { scope: "col", children: item.nome }, item.chave)))] }) }), _jsx("tbody", { children: modelo().tabela?.map((linha) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", children: linha.categoria }), linha.valores?.map((valor) => (_jsx("td", { children: valor.texto }, valor.chave)))] }, linha.chave))) })] })] })) : null] }));
139
+ return (_jsxs("figure", { ref: figuraRef, className: classes(), children: [props.title ? (_jsx("figcaption", { className: "umds-chart__titulo", children: props.title })) : null, modelo().mostraLegenda ? (_jsx("ul", { role: "list", className: "umds-chart__legenda", children: modelo().legenda?.map((item) => (_jsxs("li", { className: "umds-chart__legenda-item", children: [_jsx("span", { "aria-hidden": "true", className: classeDaChaveDoTooltip(item.serie) }), _jsx("span", { children: item.nome })] }, item.chave))) })) : null, modelo().vazio ? (_jsx("div", { className: "umds-chart__vazio", style: estiloDaArea(), children: props.emptyText || "Sem dados para exibir." })) : null, !modelo().vazio ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "umds-chart__area", style: estiloDaArea(), children: [_jsx("div", { role: "img", className: "umds-chart__desenho", "aria-label": modelo().resumo, children: _jsxs("svg", { preserveAspectRatio: "none", "aria-hidden": "true", focusable: "false", className: "umds-chart__svg", viewBox: modelo().viewBox, children: [modelo().mostraGrade ? (_jsx(_Fragment, { children: modelo().grade?.map((linha) => (_jsx("line", { className: "umds-chart__grade", x1: linha.x1, x2: linha.x2, y1: linha.y, y2: linha.y }, linha.chave))) })) : null, modelo().grade?.map((linha) => (_jsx("text", { className: "umds-chart__tick", x: linha.xTexto, y: linha.y, children: linha.texto }, linha.chave))), modelo().rotulosX?.map((rotulo) => (_jsx("text", { className: "umds-chart__rotulo-x", x: rotulo.x, y: rotulo.y, children: rotulo.texto }, rotulo.chave))), _jsx("line", { className: "umds-chart__base", x1: modelo().esquerda, x2: modelo().fimX, y1: modelo().y0, y2: modelo().y0 }), modelo().alvos?.map((alvo) => ehAtivo(alvo.indice) ? (_jsx("line", { className: "umds-chart__cursor", x1: alvo.cx, x2: alvo.cx, y1: modelo().topo, y2: modelo().base }, alvo.indice)) : null), modelo().tracos?.map((traco) => (_jsx("path", { d: traco.d, className: classesDaLinha(traco.serie) }, traco.chave))), modelo().pontos?.map((ponto) => pontoVisivel(ponto.indice) ? (_jsx("circle", { cx: ponto.x, cy: ponto.y, r: 5, className: classesDoPonto(ponto.serie) }, ponto.chave)) : null)] }) }), _jsx("div", { role: "list", className: "umds-chart__alvos", "aria-label": modelo().rotuloDaLista, children: modelo().alvos?.map((alvo) => (_jsxs("div", { role: "listitem", className: "umds-chart__alvo", tabIndex: tabIndexDoAlvo(alvo.indice, modelo().alvos.length), style: estiloDoAlvo(alvo.esquerda, alvo.largura, modelo().topo, modelo().base), onMouseEnter: (event) => ativar(alvo.indice), onMouseLeave: (event) => desativar(), onFocus: (event) => aoFocar(alvo.indice), onBlur: (event) => aoDesfocar(), onKeyDown: (event) => aoTeclar(event, alvo.indice, modelo().alvos.length), children: [_jsx("span", { className: "umds-chart__oculto", children: alvo.descricao }), ehAtivo(alvo.indice) ? (_jsxs("div", { "aria-hidden": "true", className: classesDoTooltip(alvo.lado), children: [_jsx("span", { className: "umds-chart__tooltip-categoria", children: alvo.categoria }), alvo.linhas?.map((linha) => (_jsxs("span", { className: "umds-chart__tooltip-linha", children: [_jsx("span", { className: classeDaChaveDoTooltip(linha.serie) }), _jsx("span", { className: "umds-chart__tooltip-valor", children: linha.texto }), alvo.linhas.length > 1 ? (_jsx("span", { className: "umds-chart__tooltip-nome", children: linha.nome })) : null] }, linha.serie)))] })) : null] }, alvo.indice))) })] }), _jsxs("table", { className: "umds-chart__oculto", children: [_jsx("caption", { children: modelo().legendaDaTabela }), _jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: props.categoryLabel || "Categoria" }), modelo().cabecalhos?.map((item) => (_jsx("th", { scope: "col", children: item.nome }, item.chave)))] }) }), _jsx("tbody", { children: modelo().tabela?.map((linha) => (_jsxs("tr", { children: [_jsx("th", { scope: "row", children: linha.categoria }), linha.valores?.map((valor) => (_jsx("td", { children: valor.texto }, valor.chave)))] }, linha.chave))) })] })] })) : null] }));
138
140
  }
139
141
  export default LineChart;
@@ -43,6 +43,7 @@
43
43
  justify-content: center;
44
44
  flex-shrink: 0;
45
45
  border: 1.5px solid var(--umds-semantic-color-neutral-dark-up);
46
+ /* stylelint-disable-next-line 1ds/raio-canonico -- caixa de 14–20px: 8px viraria círculo; raio base sobrescrito pelos tamanhos abaixo (candidato a novo token) */
46
47
  border-radius: 3px; /* sem equivalente 1DS: candidato a novo token */
47
48
  background: var(--umds-semantic-color-background-white);
48
49
  color: var(--umds-semantic-color-background-white);
@@ -53,8 +54,10 @@
53
54
  }
54
55
 
55
56
  /* ── Tamanhos ── */
56
- .umds-checkbox--sm .umds-checkbox__control { width: 14px; height: 14px; border-radius: 2px; }
57
+ .umds-checkbox--sm .umds-checkbox__control { width: 14px; height: 14px; border-radius: var(--umds-primitive-border-radius-xxs); }
58
+ /* stylelint-disable-next-line 1ds/raio-canonico -- caixa de 16px/20px: 8px viraria círculo e 4px mudaria a forma; 3px é a spec do protótipo (candidato a novo token) */
57
59
  .umds-checkbox--md .umds-checkbox__control { width: 16px; height: 16px; border-radius: 3px; }
60
+ /* stylelint-disable-next-line 1ds/raio-canonico -- mesma razão da linha acima: caixa de 20px com 3px da spec */
58
61
  .umds-checkbox--lg .umds-checkbox__control { width: 20px; height: 20px; border-radius: 3px; }
59
62
 
60
63
  /* O tamanho do ícone (check/minus) é controlado via customSize no componente Icon:
@@ -28,6 +28,14 @@
28
28
  }
29
29
 
30
30
  /* ── Tamanhos ── */
31
+ /* xs: 20px de altura (16 + 4, dois degraus do DS somados; sem token próprio).
32
+ Fonte de 12px: a escala do DS não tem o 11px do CrisDoc. */
33
+ .umds-chip--xs {
34
+ height: calc(var(--umds-primitive-spacing-xxxs) + var(--umds-primitive-spacing-quarck));
35
+ padding: 0 var(--umds-primitive-spacing-nano); /* 8px */
36
+ font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
37
+ }
38
+
31
39
  .umds-chip--sm {
32
40
  height: 24px; /* dimensão do protótipo sem token 1DS */
33
41
  padding: 0 8px; /* dimensão do protótipo sem token 1DS */
@@ -92,6 +100,7 @@
92
100
  height: 14px; /* dimensão do protótipo sem token 1DS */
93
101
  min-width: var(--umds-primitive-spacing-xxs); /* 24px — alvo de toque */
94
102
  min-height: var(--umds-primitive-spacing-xxs);
103
+ /* stylelint-disable-next-line 1ds/espaco-da-escala -- compensação exata: devolve os 10px do alvo de toque de 24px para a altura do chip não mudar */
95
104
  margin: -5px 0; /* devolve os 10px extras: a altura do chip nao muda */
96
105
  flex-shrink: 0;
97
106
  background: none;
@@ -123,6 +132,36 @@
123
132
 
124
133
  /* Ícone do X (Icon FA "xmark") — tamanho via customSize no .lite.tsx (8px sm / 10px md) */
125
134
 
135
+ /* ── × em círculo (circularRemove) ──
136
+ O círculo é um ::before de 14px na cor do texto do chip com 15% de opacidade
137
+ (tinge cada variante sem cor própria); o glifo fica por cima. */
138
+ .umds-chip--remove-circle .umds-chip__remove {
139
+ position: relative;
140
+ opacity: 1;
141
+ }
142
+
143
+ .umds-chip--remove-circle .umds-chip__remove::before {
144
+ content: "";
145
+ position: absolute;
146
+ top: 50%;
147
+ left: 50%;
148
+ width: 14px; /* círculo de 14px, como o CrisDoc */
149
+ height: 14px;
150
+ transform: translate(-50%, -50%);
151
+ border-radius: var(--umds-primitive-border-radius-circular);
152
+ background-color: currentColor;
153
+ opacity: 0.15;
154
+ transition: opacity var(--umds-semantic-motion-duration-fast) var(--umds-semantic-motion-easing-standard);
155
+ }
156
+
157
+ .umds-chip--remove-circle .umds-chip__remove:hover:not(:disabled)::before {
158
+ opacity: 0.3;
159
+ }
160
+
161
+ .umds-chip--remove-circle .umds-chip__remove > * {
162
+ position: relative; /* o glifo fica acima do círculo */
163
+ }
164
+
126
165
  /* ── Filter chip (onClick/selected) ── */
127
166
  /* Botão transparente do label: herda tudo do chip — visual em repouso idêntico. */
128
167
  .umds-chip__action {
@@ -5,7 +5,8 @@ import './Chips.css';
5
5
  * @property {string} label - Texto exibido no chip (obrigatório)
6
6
  * @property {boolean} removable - Exibe o botão × para remover o chip
7
7
  * @property {boolean} disabled - Desabilita o chip (visual esmaecido e sem interação)
8
- * @property {string} size - Tamanho do chip: 'sm' | 'md'
8
+ * @property {string} size - Tamanho do chip: 'xs' (20px, para dentro de card e linha de lista) | 'sm' (24px) | 'md' (28px)
9
+ * @property {boolean} circularRemove - Põe o × do chip removível dentro de um círculo tingido da cor do chip (o marcador do card da inbox). Só vale com `removable`.
9
10
  * @property {string} variant - Variante visual: 'default' | 'primary' | 'positive' | 'negative' | 'info'
10
11
  * @property {boolean} selected - Estado selecionado (filter chip) — vira aria-pressed
11
12
  * @property {function} onClick - Torna o chip acionável (filter chip): o label vira um
@@ -19,7 +20,9 @@ export interface ChipsProps {
19
20
  label: string;
20
21
  removable?: boolean;
21
22
  disabled?: boolean;
22
- size?: "sm" | "md";
23
+ size?: "xs" | "sm" | "md";
24
+ /** × dentro de um círculo tingido da cor do chip. Só vale com `removable`. @default false */
25
+ circularRemove?: boolean;
23
26
  variant?: "default" | "primary" | "positive" | "negative" | "info";
24
27
  /** Estado selecionado do filter chip (comunicado via aria-pressed) */
25
28
  selected?: boolean;
@@ -27,6 +30,8 @@ export interface ChipsProps {
27
30
  /** Presente = chip acionável (filter chip): label vira botão real, com Enter/Espaço nativos */
28
31
  onClick?: (event: any) => void;
29
32
  onRemove?: (event: any) => void;
33
+ /** Prefixo do nome acessível do botão de remover (recebe o label do chip depois de um espaço), como no MultiSelect. Troque para traduzir. @default 'Remover' */
34
+ removeAriaLabel?: string;
30
35
  }
31
36
  declare function Chips(props: ChipsProps): import("react/jsx-runtime").JSX.Element;
32
37
  export default Chips;