@1doc/1ds-react 2.8.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/CHANGELOG.md +1540 -0
  2. package/dist/components/AILabel/AILabel.js +1 -1
  3. package/dist/components/Accordion/Accordion.css +13 -0
  4. package/dist/components/Accordion/Accordion.d.ts +9 -2
  5. package/dist/components/Accordion/Accordion.js +1 -0
  6. package/dist/components/AppSubheader/AppSubheader.css +10 -1
  7. package/dist/components/AttachmentCard/AttachmentCard.css +26 -8
  8. package/dist/components/AttachmentCard/AttachmentCard.d.ts +22 -2
  9. package/dist/components/AttachmentCard/AttachmentCard.js +47 -3
  10. package/dist/components/Avatar/Avatar.css +7 -2
  11. package/dist/components/Avatar/AvatarGroup.d.ts +17 -0
  12. package/dist/components/Avatar/AvatarGroup.js +22 -8
  13. package/dist/components/Badge/Badge.css +67 -2
  14. package/dist/components/Badge/Badge.d.ts +23 -4
  15. package/dist/components/Badge/Badge.js +4 -0
  16. package/dist/components/Box/Box.css +83 -0
  17. package/dist/components/Box/Box.d.ts +82 -2
  18. package/dist/components/Box/Box.js +42 -2
  19. package/dist/components/Button/Button.css +29 -0
  20. package/dist/components/Button/Button.d.ts +4 -4
  21. package/dist/components/Button/Button.js +4 -1
  22. package/dist/components/Calendar/Calendar.css +245 -0
  23. package/dist/components/Calendar/Calendar.d.ts +126 -0
  24. package/dist/components/Calendar/Calendar.js +320 -0
  25. package/dist/components/Chips/Chips.css +38 -0
  26. package/dist/components/Chips/Chips.d.ts +5 -2
  27. package/dist/components/Chips/Chips.js +2 -1
  28. package/dist/components/Coachmark/Coachmark.css +128 -0
  29. package/dist/components/Coachmark/Coachmark.d.ts +87 -0
  30. package/dist/components/Coachmark/Coachmark.js +362 -0
  31. package/dist/components/CodeBlock/CodeBlock.css +96 -0
  32. package/dist/components/CodeBlock/CodeBlock.d.ts +47 -0
  33. package/dist/components/CodeBlock/CodeBlock.js +103 -0
  34. package/dist/components/ColorPicker/ColorPicker.css +140 -0
  35. package/dist/components/ColorPicker/ColorPicker.d.ts +73 -0
  36. package/dist/components/ColorPicker/ColorPicker.js +219 -0
  37. package/dist/components/Combobox/Combobox.css +8 -0
  38. package/dist/components/DataTable/DataTable.css +254 -0
  39. package/dist/components/DataTable/DataTable.d.ts +81 -5
  40. package/dist/components/DataTable/DataTable.js +335 -19
  41. package/dist/components/DatePicker/DatePicker.css +8 -0
  42. package/dist/components/DatePicker/DatePicker.js +10 -1
  43. package/dist/components/DescriptionList/DescriptionList.css +127 -0
  44. package/dist/components/DescriptionList/DescriptionList.d.ts +62 -0
  45. package/dist/components/DescriptionList/DescriptionList.js +52 -0
  46. package/dist/components/EmptyState/EmptyState.d.ts +4 -2
  47. package/dist/components/EmptyState/EmptyState.js +2 -2
  48. package/dist/components/FileInput/FileInput.css +16 -0
  49. package/dist/components/FileInput/FileInput.d.ts +4 -2
  50. package/dist/components/FileInput/FileInput.js +8 -2
  51. package/dist/components/Grid/Grid.js +5 -5
  52. package/dist/components/IconPicker/IconPicker.css +107 -0
  53. package/dist/components/IconPicker/IconPicker.d.ts +74 -0
  54. package/dist/components/IconPicker/IconPicker.js +194 -0
  55. package/dist/components/Input/Input.css +59 -0
  56. package/dist/components/Input/Input.d.ts +17 -1
  57. package/dist/components/Input/Input.js +67 -5
  58. package/dist/components/Kanban/Kanban.css +4 -0
  59. package/dist/components/Kbd/Kbd.css +66 -0
  60. package/dist/components/Kbd/Kbd.d.ts +32 -0
  61. package/dist/components/Kbd/Kbd.js +40 -0
  62. package/dist/components/List/List.css +136 -0
  63. package/dist/components/List/List.d.ts +82 -0
  64. package/dist/components/List/List.js +53 -0
  65. package/dist/components/List/ListItem.d.ts +97 -0
  66. package/dist/components/List/ListItem.js +82 -0
  67. package/dist/components/Modal/Modal.css +80 -0
  68. package/dist/components/Modal/Modal.d.ts +33 -6
  69. package/dist/components/Modal/Modal.js +101 -6
  70. package/dist/components/MultiSelect/MultiSelect.css +8 -0
  71. package/dist/components/MultiSelect/MultiSelect.js +10 -1
  72. package/dist/components/OrgChart/OrgChart.css +149 -0
  73. package/dist/components/OrgChart/OrgChart.d.ts +83 -0
  74. package/dist/components/OrgChart/OrgChart.js +297 -0
  75. package/dist/components/OtpInput/OtpInput.css +93 -0
  76. package/dist/components/OtpInput/OtpInput.d.ts +60 -0
  77. package/dist/components/OtpInput/OtpInput.js +215 -0
  78. package/dist/components/PhoneInput/PhoneInput.css +8 -0
  79. package/dist/components/Popover/Popover.d.ts +7 -0
  80. package/dist/components/Popover/Popover.js +11 -1
  81. package/dist/components/RichTextEditor/RichTextEditor.css +250 -0
  82. package/dist/components/RichTextEditor/RichTextEditor.d.ts +97 -0
  83. package/dist/components/RichTextEditor/RichTextEditor.js +951 -0
  84. package/dist/components/SegmentedControl/SegmentedControl.css +24 -0
  85. package/dist/components/SegmentedControl/SegmentedControl.d.ts +2 -0
  86. package/dist/components/SegmentedControl/SegmentedControl.js +10 -2
  87. package/dist/components/Select/Select.css +164 -0
  88. package/dist/components/Select/Select.d.ts +34 -0
  89. package/dist/components/Select/Select.js +258 -28
  90. package/dist/components/Stack/Stack.css +49 -0
  91. package/dist/components/Stack/Stack.d.ts +65 -7
  92. package/dist/components/Stack/Stack.js +30 -2
  93. package/dist/components/StatCard/StatCard.css +138 -0
  94. package/dist/components/StatCard/StatCard.d.ts +26 -0
  95. package/dist/components/StatCard/StatCard.js +13 -1
  96. package/dist/components/Tabs/Tab.d.ts +15 -0
  97. package/dist/components/Tabs/Tab.js +30 -1
  98. package/dist/components/Tabs/Tabs.css +132 -0
  99. package/dist/components/Tabs/Tabs.d.ts +7 -0
  100. package/dist/components/Tabs/Tabs.js +13 -2
  101. package/dist/components/Tag/Tag.css +85 -2
  102. package/dist/components/Tag/Tag.d.ts +13 -6
  103. package/dist/components/Tag/Tag.js +1 -0
  104. package/dist/components/Text/Text.js +2 -2
  105. package/dist/components/Textarea/Textarea.css +8 -0
  106. package/dist/components/TimePicker/TimePicker.css +8 -0
  107. package/dist/components/Toast/Toast.css +32 -0
  108. package/dist/components/Toast/Toast.d.ts +18 -0
  109. package/dist/components/Toast/Toast.js +14 -1
  110. package/dist/components/Toast/ToastStack.js +8 -1
  111. package/dist/components/Tooltip/Tooltip.css +25 -0
  112. package/dist/components/Tooltip/Tooltip.d.ts +11 -0
  113. package/dist/components/Tooltip/Tooltip.js +18 -3
  114. package/dist/index.d.ts +25 -0
  115. package/dist/index.js +14 -0
  116. package/dist/teste/AILabel.test.d.ts +1 -0
  117. package/dist/teste/AILabel.test.js +33 -0
  118. package/dist/teste/AccordionConteudoLivre.test.d.ts +1 -0
  119. package/dist/teste/AccordionConteudoLivre.test.js +29 -0
  120. package/dist/teste/AccordionTituloNeutro.test.d.ts +1 -0
  121. package/dist/teste/AccordionTituloNeutro.test.js +23 -0
  122. package/dist/teste/AppSubheaderRegiao.test.d.ts +1 -0
  123. package/dist/teste/AppSubheaderRegiao.test.js +13 -0
  124. package/dist/teste/AtributosRepassados.test.d.ts +1 -0
  125. package/dist/teste/AtributosRepassados.test.js +52 -0
  126. package/dist/teste/AttachmentCardIA.test.d.ts +1 -0
  127. package/dist/teste/AttachmentCardIA.test.js +89 -0
  128. package/dist/teste/AttachmentCardLista.test.d.ts +1 -0
  129. package/dist/teste/AttachmentCardLista.test.js +49 -0
  130. package/dist/teste/AttachmentCardSm.test.d.ts +1 -0
  131. package/dist/teste/AttachmentCardSm.test.js +26 -0
  132. package/dist/teste/AvatarGroupOverlap.test.d.ts +1 -0
  133. package/dist/teste/AvatarGroupOverlap.test.js +56 -0
  134. package/dist/teste/BadgeNeutroColado.test.d.ts +1 -0
  135. package/dist/teste/BadgeNeutroColado.test.js +11 -0
  136. package/dist/teste/BadgeTag.test.d.ts +1 -0
  137. package/dist/teste/BadgeTag.test.js +55 -0
  138. package/dist/teste/BoxItemFlex.test.d.ts +1 -0
  139. package/dist/teste/BoxItemFlex.test.js +54 -0
  140. package/dist/teste/BoxLayout.test.d.ts +1 -0
  141. package/dist/teste/BoxLayout.test.js +35 -0
  142. package/dist/teste/Button.test.d.ts +1 -0
  143. package/dist/teste/Button.test.js +27 -0
  144. package/dist/teste/Calendar.test.d.ts +1 -0
  145. package/dist/teste/Calendar.test.js +221 -0
  146. package/dist/teste/CalendarCabecalho.test.d.ts +1 -0
  147. package/dist/teste/CalendarCabecalho.test.js +11 -0
  148. package/dist/teste/ChipsXs.test.d.ts +1 -0
  149. package/dist/teste/ChipsXs.test.js +31 -0
  150. package/dist/teste/Coachmark.test.d.ts +1 -0
  151. package/dist/teste/Coachmark.test.js +149 -0
  152. package/dist/teste/CoachmarkSemVeu.test.d.ts +1 -0
  153. package/dist/teste/CoachmarkSemVeu.test.js +85 -0
  154. package/dist/teste/ColorPicker.test.d.ts +1 -0
  155. package/dist/teste/ColorPicker.test.js +132 -0
  156. package/dist/teste/ColorPickerXs.test.d.ts +1 -0
  157. package/dist/teste/ColorPickerXs.test.js +21 -0
  158. package/dist/teste/DataTableArvoreEVariantes.test.d.ts +1 -0
  159. package/dist/teste/DataTableArvoreEVariantes.test.js +190 -0
  160. package/dist/teste/DataTableCelulaLivre.test.d.ts +1 -0
  161. package/dist/teste/DataTableCelulaLivre.test.js +76 -0
  162. package/dist/teste/DataTableDocumento.test.d.ts +1 -0
  163. package/dist/teste/DataTableDocumento.test.js +92 -0
  164. package/dist/teste/DatePicker.test.js +23 -0
  165. package/dist/teste/DescriptionListCompacta.test.d.ts +1 -0
  166. package/dist/teste/DescriptionListCompacta.test.js +22 -0
  167. package/dist/teste/EmptyStateTituloRico.test.d.ts +1 -0
  168. package/dist/teste/EmptyStateTituloRico.test.js +23 -0
  169. package/dist/teste/FileInputTrigger.test.d.ts +1 -0
  170. package/dist/teste/FileInputTrigger.test.js +53 -0
  171. package/dist/teste/IconPicker.test.d.ts +1 -0
  172. package/dist/teste/IconPicker.test.js +130 -0
  173. package/dist/teste/InputAgrupado.test.d.ts +1 -0
  174. package/dist/teste/InputAgrupado.test.js +24 -0
  175. package/dist/teste/InputMascaraEAfins.test.d.ts +1 -0
  176. package/dist/teste/InputMascaraEAfins.test.js +99 -0
  177. package/dist/teste/KbdCodeBlock.test.d.ts +1 -0
  178. package/dist/teste/KbdCodeBlock.test.js +95 -0
  179. package/dist/teste/List.test.d.ts +1 -0
  180. package/dist/teste/List.test.js +153 -0
  181. package/dist/teste/ListItemTooltipStandalone.test.d.ts +1 -0
  182. package/dist/teste/ListItemTooltipStandalone.test.js +39 -0
  183. package/dist/teste/ModalVariantes.test.d.ts +1 -0
  184. package/dist/teste/ModalVariantes.test.js +151 -0
  185. package/dist/teste/NomeAcessivelSsr.test.d.ts +1 -0
  186. package/dist/teste/NomeAcessivelSsr.test.js +88 -0
  187. package/dist/teste/OrgChart.test.d.ts +1 -0
  188. package/dist/teste/OrgChart.test.js +162 -0
  189. package/dist/teste/OtpInput.test.d.ts +1 -0
  190. package/dist/teste/OtpInput.test.js +143 -0
  191. package/dist/teste/PopoverMaxHeight.test.d.ts +1 -0
  192. package/dist/teste/PopoverMaxHeight.test.js +38 -0
  193. package/dist/teste/RichTextEditor.test.d.ts +1 -0
  194. package/dist/teste/RichTextEditor.test.js +287 -0
  195. package/dist/teste/RichTextEditorAlinhaImagemTabela.test.d.ts +1 -0
  196. package/dist/teste/RichTextEditorAlinhaImagemTabela.test.js +212 -0
  197. package/dist/teste/RichTextEditorEstiloDeTexto.test.d.ts +1 -0
  198. package/dist/teste/RichTextEditorEstiloDeTexto.test.js +120 -0
  199. package/dist/teste/SegmentedControlContador.test.d.ts +1 -0
  200. package/dist/teste/SegmentedControlContador.test.js +39 -0
  201. package/dist/teste/SelectAbertoControladoEFlutuante.test.d.ts +1 -0
  202. package/dist/teste/SelectAbertoControladoEFlutuante.test.js +145 -0
  203. package/dist/teste/SelectFiltroCorETamanho.test.d.ts +1 -0
  204. package/dist/teste/SelectFiltroCorETamanho.test.js +77 -0
  205. package/dist/teste/SelectPlacementFiltro.test.d.ts +1 -0
  206. package/dist/teste/SelectPlacementFiltro.test.js +88 -0
  207. package/dist/teste/Stack.test.d.ts +1 -0
  208. package/dist/teste/Stack.test.js +57 -0
  209. package/dist/teste/StatCardRotuloTopo.test.d.ts +1 -0
  210. package/dist/teste/StatCardRotuloTopo.test.js +34 -0
  211. package/dist/teste/StatCardSecundariaETom.test.d.ts +1 -0
  212. package/dist/teste/StatCardSecundariaETom.test.js +45 -0
  213. package/dist/teste/TabsContadorFechavel.test.d.ts +1 -0
  214. package/dist/teste/TabsContadorFechavel.test.js +79 -0
  215. package/dist/teste/ToastAcaoEDetalhes.test.d.ts +1 -0
  216. package/dist/teste/ToastAcaoEDetalhes.test.js +94 -0
  217. package/dist/teste/TooltipDark.test.d.ts +1 -0
  218. package/dist/teste/TooltipDark.test.js +31 -0
  219. package/dist/utils/calendario.d.ts +28 -0
  220. package/dist/utils/calendario.js +73 -0
  221. package/dist/utils/html-seguro.d.ts +45 -0
  222. package/dist/utils/html-seguro.js +208 -0
  223. package/dist/utils/paleta-de-cores.d.ts +26 -0
  224. package/dist/utils/paleta-de-cores.js +10 -0
  225. package/dist/utils/texto.d.ts +5 -0
  226. package/dist/utils/texto.js +5 -0
  227. package/dist/utils/toast.d.ts +10 -1
  228. package/dist/utils/toast.js +2 -1
  229. package/package.json +3 -3
  230. package/src/index.ts +26 -0
  231. package/src/teste/AILabel.test.tsx +41 -0
  232. package/src/teste/AccordionConteudoLivre.test.tsx +39 -0
  233. package/src/teste/AccordionTituloNeutro.test.tsx +25 -0
  234. package/src/teste/AppSubheaderRegiao.test.tsx +17 -0
  235. package/src/teste/AtributosRepassados.test.tsx +73 -0
  236. package/src/teste/AttachmentCardIA.test.tsx +126 -0
  237. package/src/teste/AttachmentCardLista.test.tsx +53 -0
  238. package/src/teste/AttachmentCardSm.test.tsx +29 -0
  239. package/src/teste/AvatarGroupOverlap.test.tsx +74 -0
  240. package/src/teste/BadgeNeutroColado.test.tsx +15 -0
  241. package/src/teste/BadgeTag.test.tsx +85 -0
  242. package/src/teste/BoxItemFlex.test.tsx +81 -0
  243. package/src/teste/BoxLayout.test.tsx +50 -0
  244. package/src/teste/Button.test.tsx +39 -0
  245. package/src/teste/Calendar.test.tsx +282 -0
  246. package/src/teste/CalendarCabecalho.test.tsx +11 -0
  247. package/src/teste/ChipsXs.test.tsx +41 -0
  248. package/src/teste/Coachmark.test.tsx +198 -0
  249. package/src/teste/CoachmarkSemVeu.test.tsx +101 -0
  250. package/src/teste/ColorPicker.test.tsx +153 -0
  251. package/src/teste/ColorPickerXs.test.tsx +22 -0
  252. package/src/teste/DataTableArvoreEVariantes.test.tsx +240 -0
  253. package/src/teste/DataTableCelulaLivre.test.tsx +103 -0
  254. package/src/teste/DataTableDocumento.test.tsx +102 -0
  255. package/src/teste/DatePicker.test.tsx +38 -0
  256. package/src/teste/DescriptionListCompacta.test.tsx +24 -0
  257. package/src/teste/EmptyStateTituloRico.test.tsx +34 -0
  258. package/src/teste/FileInputTrigger.test.tsx +89 -0
  259. package/src/teste/IconPicker.test.tsx +145 -0
  260. package/src/teste/InputAgrupado.test.tsx +26 -0
  261. package/src/teste/InputMascaraEAfins.test.tsx +124 -0
  262. package/src/teste/KbdCodeBlock.test.tsx +106 -0
  263. package/src/teste/List.test.tsx +269 -0
  264. package/src/teste/ListItemTooltipStandalone.test.tsx +64 -0
  265. package/src/teste/ModalVariantes.test.tsx +173 -0
  266. package/src/teste/NomeAcessivelSsr.test.tsx +110 -0
  267. package/src/teste/OrgChart.test.tsx +183 -0
  268. package/src/teste/OtpInput.test.tsx +163 -0
  269. package/src/teste/PopoverMaxHeight.test.tsx +47 -0
  270. package/src/teste/RichTextEditor.test.tsx +329 -0
  271. package/src/teste/RichTextEditorAlinhaImagemTabela.test.tsx +238 -0
  272. package/src/teste/RichTextEditorEstiloDeTexto.test.tsx +137 -0
  273. package/src/teste/SegmentedControlContador.test.tsx +43 -0
  274. package/src/teste/SelectAbertoControladoEFlutuante.test.tsx +180 -0
  275. package/src/teste/SelectFiltroCorETamanho.test.tsx +90 -0
  276. package/src/teste/SelectPlacementFiltro.test.tsx +110 -0
  277. package/src/teste/Stack.test.tsx +80 -0
  278. package/src/teste/StatCardRotuloTopo.test.tsx +44 -0
  279. package/src/teste/StatCardSecundariaETom.test.tsx +51 -0
  280. package/src/teste/TabsContadorFechavel.test.tsx +144 -0
  281. package/src/teste/ToastAcaoEDetalhes.test.tsx +109 -0
  282. package/src/teste/TooltipDark.test.tsx +51 -0
  283. package/src/utils/calendario.ts +78 -0
  284. package/src/utils/html-seguro.ts +197 -0
  285. package/src/utils/paleta-de-cores.ts +34 -0
  286. package/src/utils/texto.ts +5 -0
  287. package/src/utils/toast.ts +12 -2
@@ -184,3 +184,27 @@
184
184
  [data-density="touch"] .umds-segmented__item {
185
185
  min-height: var(--umds-semantic-field-height);
186
186
  }
187
+
188
+ /* ── Contador em pílula (count) ──
189
+ Mesmos 18px da pílula do Tab (16 + 2, dois degraus do DS somados; sem token
190
+ próprio): cinza no segmento solto, branco sobre o azul do escolhido. */
191
+ .umds-segmented__count {
192
+ display: inline-flex;
193
+ align-items: center;
194
+ justify-content: center;
195
+ box-sizing: border-box;
196
+ height: calc(var(--umds-primitive-spacing-xxxs) + var(--umds-primitive-spacing-micro)); /* 18px */
197
+ min-width: calc(var(--umds-primitive-spacing-xxxs) + var(--umds-primitive-spacing-micro)); /* 18px */
198
+ padding: 0 var(--umds-primitive-spacing-quarck); /* 4px */
199
+ border-radius: var(--umds-primitive-border-radius-pill);
200
+ background-color: var(--umds-semantic-color-neutral-light-medium);
201
+ color: var(--umds-semantic-color-neutral-dark-down);
202
+ font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
203
+ font-weight: var(--umds-primitive-font-weight-semibold);
204
+ line-height: 1;
205
+ }
206
+
207
+ .umds-segmented__input:checked + .umds-segmented__item .umds-segmented__count {
208
+ background-color: var(--umds-semantic-color-neutral-light-pure);
209
+ color: var(--umds-semantic-color-primary-pure);
210
+ }
@@ -6,6 +6,7 @@ import './SegmentedControl.css';
6
6
  * @property {any} icon - Ícone Font Awesome antes do texto. Com `label` vazio, o segmento vira só o ícone — e aí `ariaLabel` é obrigatório.
7
7
  * @property {string} ariaLabel - Nome acessível do segmento quando não há texto visível.
8
8
  * @property {boolean} disabled - Desabilita só este segmento.
9
+ * @property {number|string} count - Contador em pílula depois do texto (ex.: "Todas 31"), como o da `Tab`: cinza no segmento solto, branco sobre o azul do escolhido. É lido junto do nome do segmento. 0 aparece; vazio e `undefined` não.
9
10
  */
10
11
  export interface SegmentedControlOption {
11
12
  label?: string;
@@ -13,6 +14,7 @@ export interface SegmentedControlOption {
13
14
  icon?: any;
14
15
  ariaLabel?: string;
15
16
  disabled?: boolean;
17
+ count?: number | string;
16
18
  [key: string]: any;
17
19
  }
18
20
  /**
@@ -33,6 +33,9 @@ function SegmentedControl(props) {
33
33
  function labelledByText() {
34
34
  return props.label ? labelId() : undefined;
35
35
  }
36
+ function groupAriaLabel() {
37
+ return props.label && !baseId() ? props.label : undefined;
38
+ }
36
39
  function describedByText() {
37
40
  return props.errorMessage ? errorId() : undefined;
38
41
  }
@@ -60,14 +63,19 @@ function SegmentedControl(props) {
60
63
  function estaEscolhido(option) {
61
64
  return option.value === currentValue();
62
65
  }
66
+ function temContador(option) {
67
+ return (option.count !== undefined && option.count !== null && option.count !== "");
68
+ }
63
69
  function estaDesabilitado(option) {
64
70
  return !!props.disabled || !!option.disabled;
65
71
  }
66
72
  function rotuloDoSegmento(option) {
67
73
  // Com `label` visivel, o `ariaLabel` e IGNORADO de proposito: nome
68
74
  // acessivel diferente do texto visivel quebra o WCAG 2.5.3.
75
+ // Sem id (antes do onMount) o label-for nao liga a nada: o nome e o
76
+ // proprio texto visivel, o que tambem respeita o 2.5.3.
69
77
  if (option.label)
70
- return undefined;
78
+ return baseId() ? undefined : option.label;
71
79
  // Ultimo recurso. `value` e nome ruim, mas radio anonimo e pior — e o
72
80
  // TypeScript nao pega, porque `label` e `ariaLabel` sao os dois opcionais.
73
81
  return option.ariaLabel || option.value;
@@ -83,6 +91,6 @@ function SegmentedControl(props) {
83
91
  if (!props.id)
84
92
  setUid(gerarId("umds-segmented"));
85
93
  }, []);
86
- return (_jsxs("div", { className: groupClasses(), children: [props.label ? (_jsxs("span", { className: "umds-segmented__group-label", id: labelId(), children: [props.label, props.required ? (_jsx("span", { className: "umds-segmented__required", children: " *" })) : null] })) : null, _jsx("div", { role: "radiogroup", className: "umds-segmented__track", "aria-labelledby": labelledByText(), "aria-describedby": describedByText(), "aria-invalid": ariaInvalidText(), "aria-required": ariaRequiredText(), children: optionList()?.map((option, index) => (_jsxs(React.Fragment, { children: [_jsx("input", { type: "radio", className: "umds-segmented__input", id: inputId(index), name: groupName(), value: option.value, checked: estaEscolhido(option), disabled: estaDesabilitado(option), "aria-label": rotuloDoSegmento(option), onChange: (event) => handleChange(option) }), _jsx("label", { className: "umds-segmented__item", htmlFor: inputId(index), children: _jsxs("span", { className: "umds-segmented__conteudo", children: [option.icon ? (_jsx(Icon, { size: "sm", variant: "inherit", icon: option.icon })) : null, option.label ? (_jsx("span", { className: "umds-segmented__texto", children: option.label })) : null] }) })] }, option.value))) }), props.errorMessage ? (_jsx(Text, { as: "span", variant: "caption", color: "negative", className: "umds-segmented__error-message", id: errorId(), children: props.errorMessage })) : null] }));
94
+ return (_jsxs("div", { className: groupClasses(), children: [props.label ? (_jsxs("span", { className: "umds-segmented__group-label", id: labelId(), children: [props.label, props.required ? (_jsx("span", { className: "umds-segmented__required", children: " *" })) : null] })) : null, _jsx("div", { role: "radiogroup", className: "umds-segmented__track", "aria-labelledby": labelledByText(), "aria-label": groupAriaLabel(), "aria-describedby": describedByText(), "aria-invalid": ariaInvalidText(), "aria-required": ariaRequiredText(), children: optionList()?.map((option, index) => (_jsxs(React.Fragment, { children: [_jsx("input", { type: "radio", className: "umds-segmented__input", id: inputId(index), name: groupName(), value: option.value, checked: estaEscolhido(option), disabled: estaDesabilitado(option), "aria-label": rotuloDoSegmento(option), onChange: (event) => handleChange(option) }), _jsx("label", { className: "umds-segmented__item", htmlFor: inputId(index), children: _jsxs("span", { className: "umds-segmented__conteudo", children: [option.icon ? (_jsx(Icon, { size: "sm", variant: "inherit", icon: option.icon })) : null, option.label ? (_jsx("span", { className: "umds-segmented__texto", children: option.label })) : null, temContador(option) ? (_jsx("span", { className: "umds-segmented__count", children: option.count })) : null] }) })] }, option.value))) }), props.errorMessage ? (_jsx(Text, { as: "span", variant: "caption", color: "negative", className: "umds-segmented__error-message", id: errorId(), children: props.errorMessage })) : null] }));
87
95
  }
88
96
  export default SegmentedControl;
@@ -157,6 +157,162 @@
157
157
  overflow: hidden;
158
158
  }
159
159
 
160
+ /* ── Lista que abre para cima (placement top, ou auto sem espaço embaixo) ── */
161
+ .umds-select--placement-top .umds-select__dropdown {
162
+ top: auto;
163
+ bottom: calc(100% + 4px);
164
+ }
165
+
166
+ /* ── Rodapé da lista (slot footer): ações fixas abaixo das opções ── */
167
+ .umds-select__footer {
168
+ flex-shrink: 0;
169
+ display: flex;
170
+ align-items: center;
171
+ padding: var(--umds-primitive-spacing-nano) var(--umds-primitive-spacing-xxxs);
172
+ border-top: 1px solid var(--umds-semantic-color-neutral-light-medium);
173
+ background-color: var(--umds-semantic-color-background-elevated);
174
+ }
175
+
176
+ /* ── Variante filter: botão de filtro de barra de ferramentas ──
177
+ Contornado em azul, largura do conteúdo, lista mais larga que o botão. */
178
+ .umds-select--filter {
179
+ width: auto;
180
+ }
181
+
182
+ .umds-select--filter.umds-select--full-width {
183
+ width: 100%;
184
+ }
185
+
186
+ .umds-select--filter .umds-select__container {
187
+ width: auto;
188
+ }
189
+
190
+ .umds-select--filter.umds-select--full-width .umds-select__container {
191
+ width: 100%;
192
+ }
193
+
194
+ /* Fundo branco: o azul-claro do gatilho só vem depois de escolhido um valor (`--has-value`,
195
+ abaixo), que é quando o filtro está recortando a lista. O tamanho padrão é o sm (32px). */
196
+ .umds-select--filter .umds-select__trigger {
197
+ width: auto;
198
+ gap: var(--umds-primitive-spacing-nano);
199
+ border-color: var(--umds-semantic-color-primary-pure);
200
+ background-color: var(--umds-semantic-color-background-white);
201
+ }
202
+
203
+ .umds-select--filter.umds-select--has-value .umds-select__trigger {
204
+ background-color: var(--umds-semantic-color-primary-light);
205
+ }
206
+
207
+ .umds-select--filter.umds-select--full-width .umds-select__trigger {
208
+ width: 100%;
209
+ }
210
+
211
+ .umds-select--filter .umds-select__trigger:hover:not(.umds-select--disabled .umds-select__trigger) {
212
+ border-color: var(--umds-semantic-color-primary-dark);
213
+ }
214
+
215
+ .umds-select--filter .umds-select__trigger .umds-text,
216
+ .umds-select--filter .umds-select__actions {
217
+ color: var(--umds-semantic-color-primary-pure);
218
+ font-weight: var(--umds-primitive-font-weight-semibold);
219
+ }
220
+
221
+ /* Fonte de 12px no filtro pequeno (o tamanho do CrisDoc); no md segue 14px. */
222
+ .umds-select--filter.umds-select--sm .umds-select__trigger .umds-text {
223
+ font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
224
+ }
225
+
226
+ .umds-select--filter .umds-select__dropdown {
227
+ /* 240px: três vezes o degrau xxl (80px). Sem token de largura de menu. */
228
+ width: max-content;
229
+ min-width: max(100%, calc(var(--umds-primitive-spacing-xxl) * 3));
230
+ max-width: calc(100vw - var(--umds-primitive-spacing-xxxs) * 2);
231
+ }
232
+
233
+ /* ── Variante search: o filtro dentro de uma barra de busca ──
234
+ Altura de campo e contorno neutro, para ficar ao lado do campo de busca. */
235
+ .umds-select--filter-search .umds-select__trigger {
236
+ border-color: var(--umds-semantic-field-border-default);
237
+ background-color: var(--umds-semantic-color-background-white);
238
+ }
239
+
240
+ .umds-select--filter-search.umds-select--has-value .umds-select__trigger {
241
+ background-color: var(--umds-semantic-color-background-white);
242
+ }
243
+
244
+ .umds-select--filter-search .umds-select__trigger:hover:not(.umds-select--disabled .umds-select__trigger) {
245
+ border-color: var(--umds-semantic-field-border-hover);
246
+ }
247
+
248
+ .umds-select--filter-search .umds-select__trigger .umds-text,
249
+ .umds-select--filter-search .umds-select__actions {
250
+ color: var(--umds-semantic-color-neutral-dark-pure);
251
+ font-weight: var(--umds-primitive-font-weight-regular);
252
+ }
253
+
254
+ .umds-select--filter-search .umds-select__actions {
255
+ color: var(--umds-semantic-color-neutral-dark-medium);
256
+ }
257
+
258
+ /* ── Variante combo: o filtro colado a outro controle ──
259
+ Sem contorno nem raio próprios: quem desenha a borda é o contêiner do combo. */
260
+ .umds-select--filter-combo .umds-select__trigger {
261
+ border-color: transparent;
262
+ border-radius: var(--umds-primitive-border-radius-none);
263
+ background-color: transparent;
264
+ }
265
+
266
+ .umds-select--filter-combo.umds-select--has-value .umds-select__trigger {
267
+ background-color: transparent;
268
+ }
269
+
270
+ .umds-select--filter-combo .umds-select__trigger:hover:not(.umds-select--disabled .umds-select__trigger) {
271
+ border-color: transparent;
272
+ background-color: var(--umds-semantic-color-background-light);
273
+ }
274
+
275
+ .umds-select--filter-combo .umds-select__trigger .umds-text,
276
+ .umds-select--filter-combo .umds-select__actions {
277
+ color: var(--umds-semantic-color-neutral-dark-down);
278
+ font-weight: var(--umds-primitive-font-weight-regular);
279
+ }
280
+
281
+ /* O foco do combo é o anel do próprio gatilho, por dentro (o contêiner pode cortar o de fora). */
282
+ .umds-select--filter-combo .umds-select__trigger:focus-visible,
283
+ .umds-select--filter-combo.umds-select--open .umds-select__trigger {
284
+ border-color: transparent;
285
+ box-shadow: inset 0 0 0 var(--umds-primitive-border-width-thin) var(--umds-semantic-color-primary-pure);
286
+ }
287
+
288
+ /* ── Ícone e amostra de cor no gatilho (triggerIcon, triggerSwatch) ── */
289
+ .umds-select__trigger-icon {
290
+ display: inline-flex;
291
+ align-items: center;
292
+ flex-shrink: 0;
293
+ color: var(--umds-semantic-color-neutral-dark-medium);
294
+ }
295
+
296
+ .umds-select--filter .umds-select__trigger-icon {
297
+ color: inherit;
298
+ }
299
+
300
+ .umds-select__swatch {
301
+ flex-shrink: 0;
302
+ box-sizing: border-box;
303
+ width: var(--umds-primitive-spacing-mini);
304
+ height: var(--umds-primitive-spacing-mini);
305
+ border-radius: var(--umds-primitive-border-radius-xs);
306
+ /* Anel de 1px: amostra clara não some no fundo branco, nem escura no escuro. */
307
+ border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-down);
308
+ }
309
+
310
+ /* ── Lista flutuante (dentro de diálogo) ──
311
+ O estilo inline (fixed, translate, largura e altura medidas) vem do componente. */
312
+ .umds-select--floating .umds-select__dropdown {
313
+ box-sizing: border-box;
314
+ }
315
+
160
316
  /* ── Busca no dropdown ── */
161
317
  .umds-select__search-container {
162
318
  display: flex;
@@ -382,6 +538,14 @@
382
538
  border-color: var(--umds-semantic-field-border-default);
383
539
  }
384
540
 
541
+ /* Somente leitura não é desabilitado: o texto segue lido e a WCAG 1.4.3 vale
542
+ sem isenção. O placeholder padrão foi calibrado para fundo branco e cai para
543
+ ~4,2:1 sobre o fundo de somente leitura; neutral-dark-down passa 4,5:1 em
544
+ todos os temas (1doc 6,78:1 · 1doc-dark 10,83:1 · alto contraste 16,48:1). */
545
+ .umds-select--readonly .umds-select__placeholder {
546
+ color: var(--umds-semantic-color-neutral-dark-down);
547
+ }
548
+
385
549
  /* O campo de busca precisa de indicador de foco — o painel foca ele ao abrir.
386
550
  Um outline no <input> desenhava um retângulo azul solto no meio do painel,
387
551
  porque o input não tem borda própria para o anel acompanhar. O indicador vai
@@ -3,10 +3,13 @@ import './Select.css';
3
3
  * Opção exibida na lista do Select.
4
4
  * @property {string} label - Texto visível da opção.
5
5
  * @property {any} value - Valor associado à opção.
6
+ * @property {string} color - Cor da opção, um token (`var(--umds-semantic-color-...)` ou `var(--umds-primitive-...)`): uma amostra de 12px antes do texto na lista e, com a opção escolhida (seleção única), no gatilho. Decorativa: o texto diz a opção. Sem a prop, nada muda.
6
7
  */
7
8
  export interface SelectOption {
8
9
  label: string;
9
10
  value: string | number;
11
+ /** Cor da opção (token): amostra antes do texto, e no gatilho quando escolhida. */
12
+ color?: string;
10
13
  [key: string]: any;
11
14
  }
12
15
  /**
@@ -40,6 +43,16 @@ export interface SelectOption {
40
43
  * @property {string} ariaLabel - Nome acessível quando não há label visível.
41
44
  * @property {string} id - ID base dos elementos internos. Gerado automaticamente se omitido.
42
45
  * @property {function} onChange - Callback com o(s) valor(es) selecionado(s).
46
+ * @property {string} placement - Onde a lista abre: 'bottom' (padrão) | 'top' | 'auto'. O `auto` mede o espaço da janela E do ancestral que rola ou corta (um corpo de modal, um painel com overflow): abre para cima quando falta espaço embaixo e há mais em cima, e limita a altura da lista ao espaço que sobra.
47
+ *
48
+ * Dentro de um diálogo (`role="dialog"` ou `aria-modal`), a lista abre por cima dele: ela passa a `position: fixed`, ancorada no gatilho pelo `@floating-ui/dom`, e não é cortada pelo `overflow` do corpo do modal.
49
+ * @property {string} variant - 'default' | 'filter' | 'search' | 'combo'. O `filter` é o botão de filtro de barra de ferramentas: 32px (`size="sm"` é o padrão das variantes de filtro) e fonte de 12px, fundo branco com contorno azul (azul-claro só depois de escolhido um valor), largura do conteúdo, lista mais larga que o botão, busca focada ao abrir. `search` é o mesmo filtro dentro de uma barra de busca (altura de campo, contorno neutro). `combo` é o filtro colado a outro controle (sem contorno nem raio próprios: quem desenha a borda é o contêiner). Combine com `searchable`, `emptyOptionLabel` e o slot `footer`.
50
+ * @property {boolean} open - Abre/fecha a lista de fora (modo controlado). Sem ela, o Select controla o próprio estado. Use com `onOpenChange`: o filtro com ação no rodapé fecha a lista antes de abrir um modal.
51
+ * @property {function} onOpenChange - Chamado quando a lista pede para abrir ou fechar (clique, teclado, clique fora, Esc, escolha de opção). No modo controlado, é quem decide o novo `open`.
52
+ * @property {IconProp} triggerIcon - Ícone à esquerda do texto do gatilho (objeto Font Awesome importado). Decorativo.
53
+ * @property {string} triggerSwatch - Amostra de cor à esquerda do texto do gatilho: um token (`var(--umds-semantic-color-...)`) ou `var(--umds-primitive-...)`. Decorativa; o texto diz a opção.
54
+ * @property {string} emptyOptionLabel - Opção "sem filtro" no topo da lista (seleção única): marcada quando nada está escolhido; ao escolher, `onChange` recebe `""` e o campo volta a mostrar o `placeholder` (o nome do filtro).
55
+ * @property {any} footer - Rodapé fixo da lista, com ações ("Gerenciar marcadores"). Passe o elemento correspondente (React node ou Vue slot `footer`).
43
56
  * @quandoUsar Escolher UM valor de uma lista fechada. O valor selecionado fica visível no campo.
44
57
  * @quandoNaoUsar Para escolher VÁRIOS valores — use `MultiSelect`. Para um menu de AÇÕES (editar, excluir, duplicar) em vez de valores, use `Dropdown`. Para 2 a 4 opções mutuamente exclusivas sempre visíveis, use `Radio`.
45
58
  */
@@ -77,6 +90,26 @@ export interface SelectProps {
77
90
  errorMessage?: string;
78
91
  fullWidth?: boolean;
79
92
  size?: "sm" | "md" | "lg";
93
+ /** Onde a lista abre. @default 'bottom' */
94
+ placement?: "bottom" | "top" | "auto";
95
+ /** Variante visual. `filter`, `search` e `combo` são o filtro de barra. @default 'default' */
96
+ variant?: "default" | "filter" | "search" | "combo";
97
+ /**
98
+ * Abre/fecha a lista de fora (modo controlado). `any` de propósito: no Vue uma
99
+ * prop `boolean` sem valor chega como `false`, e `props.open !== undefined`
100
+ * ficaria sempre verdadeiro (o Select se acharia controlado e nunca abriria).
101
+ */
102
+ open?: any;
103
+ /** Pede para abrir ou fechar a lista. No modo controlado, o pai decide o novo `open`. */
104
+ onOpenChange?: (open: boolean) => void;
105
+ /** Ícone à esquerda do texto do gatilho. */
106
+ triggerIcon?: IconProp;
107
+ /** Amostra de cor à esquerda do texto do gatilho (token de cor). */
108
+ triggerSwatch?: string;
109
+ /** Opção "sem filtro" no topo da lista (seleção única). Escolhê-la chama `onChange("")`. */
110
+ emptyOptionLabel?: string;
111
+ /** Rodapé fixo da lista (ações). React node ou slot `footer` no Vue. */
112
+ footer?: any;
80
113
  pagination?: boolean;
81
114
  hasMore?: boolean;
82
115
  onLoadMore?: () => void;
@@ -93,5 +126,6 @@ export interface SelectProps {
93
126
  ariaLabel?: string;
94
127
  className?: string;
95
128
  }
129
+ import { IconProp } from "../Icon/Icon";
96
130
  declare function Select(props: SelectProps): import("react/jsx-runtime").JSX.Element;
97
131
  export default Select;