@1doc/1ds-react 2.8.0 → 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 (213) hide show
  1. package/CHANGELOG.md +1106 -0
  2. package/dist/components/AILabel/AILabel.js +1 -1
  3. package/dist/components/Accordion/Accordion.d.ts +6 -2
  4. package/dist/components/AttachmentCard/AttachmentCard.css +16 -0
  5. package/dist/components/AttachmentCard/AttachmentCard.d.ts +19 -2
  6. package/dist/components/AttachmentCard/AttachmentCard.js +40 -3
  7. package/dist/components/Avatar/Avatar.css +7 -2
  8. package/dist/components/Avatar/AvatarGroup.d.ts +17 -0
  9. package/dist/components/Avatar/AvatarGroup.js +22 -8
  10. package/dist/components/Badge/Badge.css +54 -2
  11. package/dist/components/Badge/Badge.d.ts +14 -4
  12. package/dist/components/Badge/Badge.js +1 -0
  13. package/dist/components/Box/Box.css +83 -0
  14. package/dist/components/Box/Box.d.ts +82 -2
  15. package/dist/components/Box/Box.js +42 -2
  16. package/dist/components/Button/Button.css +29 -0
  17. package/dist/components/Button/Button.d.ts +4 -4
  18. package/dist/components/Button/Button.js +4 -1
  19. package/dist/components/Calendar/Calendar.css +245 -0
  20. package/dist/components/Calendar/Calendar.d.ts +125 -0
  21. package/dist/components/Calendar/Calendar.js +320 -0
  22. package/dist/components/Chips/Chips.css +38 -0
  23. package/dist/components/Chips/Chips.d.ts +5 -2
  24. package/dist/components/Chips/Chips.js +2 -1
  25. package/dist/components/Coachmark/Coachmark.css +118 -0
  26. package/dist/components/Coachmark/Coachmark.d.ts +75 -0
  27. package/dist/components/Coachmark/Coachmark.js +321 -0
  28. package/dist/components/CodeBlock/CodeBlock.css +96 -0
  29. package/dist/components/CodeBlock/CodeBlock.d.ts +47 -0
  30. package/dist/components/CodeBlock/CodeBlock.js +103 -0
  31. package/dist/components/ColorPicker/ColorPicker.css +133 -0
  32. package/dist/components/ColorPicker/ColorPicker.d.ts +73 -0
  33. package/dist/components/ColorPicker/ColorPicker.js +219 -0
  34. package/dist/components/Combobox/Combobox.css +8 -0
  35. package/dist/components/DataTable/DataTable.css +80 -0
  36. package/dist/components/DataTable/DataTable.d.ts +19 -4
  37. package/dist/components/DataTable/DataTable.js +59 -15
  38. package/dist/components/DatePicker/DatePicker.css +8 -0
  39. package/dist/components/DatePicker/DatePicker.js +10 -1
  40. package/dist/components/DescriptionList/DescriptionList.css +113 -0
  41. package/dist/components/DescriptionList/DescriptionList.d.ts +59 -0
  42. package/dist/components/DescriptionList/DescriptionList.js +51 -0
  43. package/dist/components/FileInput/FileInput.css +16 -0
  44. package/dist/components/FileInput/FileInput.d.ts +4 -2
  45. package/dist/components/FileInput/FileInput.js +8 -2
  46. package/dist/components/Grid/Grid.js +5 -5
  47. package/dist/components/IconPicker/IconPicker.css +107 -0
  48. package/dist/components/IconPicker/IconPicker.d.ts +74 -0
  49. package/dist/components/IconPicker/IconPicker.js +194 -0
  50. package/dist/components/Input/Input.css +38 -0
  51. package/dist/components/Input/Input.d.ts +10 -1
  52. package/dist/components/Input/Input.js +66 -5
  53. package/dist/components/Kanban/Kanban.css +4 -0
  54. package/dist/components/Kbd/Kbd.css +66 -0
  55. package/dist/components/Kbd/Kbd.d.ts +32 -0
  56. package/dist/components/Kbd/Kbd.js +40 -0
  57. package/dist/components/List/List.css +136 -0
  58. package/dist/components/List/List.d.ts +82 -0
  59. package/dist/components/List/List.js +53 -0
  60. package/dist/components/List/ListItem.d.ts +85 -0
  61. package/dist/components/List/ListItem.js +81 -0
  62. package/dist/components/Modal/Modal.css +80 -0
  63. package/dist/components/Modal/Modal.d.ts +33 -6
  64. package/dist/components/Modal/Modal.js +101 -6
  65. package/dist/components/MultiSelect/MultiSelect.css +8 -0
  66. package/dist/components/MultiSelect/MultiSelect.js +10 -1
  67. package/dist/components/OrgChart/OrgChart.css +149 -0
  68. package/dist/components/OrgChart/OrgChart.d.ts +83 -0
  69. package/dist/components/OrgChart/OrgChart.js +297 -0
  70. package/dist/components/OtpInput/OtpInput.css +93 -0
  71. package/dist/components/OtpInput/OtpInput.d.ts +60 -0
  72. package/dist/components/OtpInput/OtpInput.js +215 -0
  73. package/dist/components/PhoneInput/PhoneInput.css +8 -0
  74. package/dist/components/Popover/Popover.d.ts +7 -0
  75. package/dist/components/Popover/Popover.js +11 -1
  76. package/dist/components/RichTextEditor/RichTextEditor.css +203 -0
  77. package/dist/components/RichTextEditor/RichTextEditor.d.ts +83 -0
  78. package/dist/components/RichTextEditor/RichTextEditor.js +494 -0
  79. package/dist/components/SegmentedControl/SegmentedControl.js +7 -2
  80. package/dist/components/Select/Select.css +70 -0
  81. package/dist/components/Select/Select.d.ts +12 -0
  82. package/dist/components/Select/Select.js +59 -4
  83. package/dist/components/Stack/Stack.css +49 -0
  84. package/dist/components/Stack/Stack.d.ts +65 -7
  85. package/dist/components/Stack/Stack.js +30 -2
  86. package/dist/components/StatCard/StatCard.css +73 -0
  87. package/dist/components/StatCard/StatCard.d.ts +17 -0
  88. package/dist/components/StatCard/StatCard.js +4 -1
  89. package/dist/components/Tabs/Tab.d.ts +15 -0
  90. package/dist/components/Tabs/Tab.js +30 -1
  91. package/dist/components/Tabs/Tabs.css +132 -0
  92. package/dist/components/Tabs/Tabs.d.ts +7 -0
  93. package/dist/components/Tabs/Tabs.js +13 -2
  94. package/dist/components/Tag/Tag.css +85 -2
  95. package/dist/components/Tag/Tag.d.ts +13 -6
  96. package/dist/components/Tag/Tag.js +1 -0
  97. package/dist/components/Text/Text.js +2 -2
  98. package/dist/components/Textarea/Textarea.css +8 -0
  99. package/dist/components/TimePicker/TimePicker.css +8 -0
  100. package/dist/components/Tooltip/Tooltip.css +25 -0
  101. package/dist/components/Tooltip/Tooltip.d.ts +11 -0
  102. package/dist/components/Tooltip/Tooltip.js +18 -3
  103. package/dist/index.d.ts +25 -0
  104. package/dist/index.js +14 -0
  105. package/dist/teste/AILabel.test.d.ts +1 -0
  106. package/dist/teste/AILabel.test.js +33 -0
  107. package/dist/teste/AccordionConteudoLivre.test.d.ts +1 -0
  108. package/dist/teste/AccordionConteudoLivre.test.js +29 -0
  109. package/dist/teste/AtributosRepassados.test.d.ts +1 -0
  110. package/dist/teste/AtributosRepassados.test.js +52 -0
  111. package/dist/teste/AttachmentCardIA.test.d.ts +1 -0
  112. package/dist/teste/AttachmentCardIA.test.js +89 -0
  113. package/dist/teste/AvatarGroupOverlap.test.d.ts +1 -0
  114. package/dist/teste/AvatarGroupOverlap.test.js +56 -0
  115. package/dist/teste/BadgeTag.test.d.ts +1 -0
  116. package/dist/teste/BadgeTag.test.js +42 -0
  117. package/dist/teste/BoxItemFlex.test.d.ts +1 -0
  118. package/dist/teste/BoxItemFlex.test.js +54 -0
  119. package/dist/teste/BoxLayout.test.d.ts +1 -0
  120. package/dist/teste/BoxLayout.test.js +35 -0
  121. package/dist/teste/Button.test.d.ts +1 -0
  122. package/dist/teste/Button.test.js +27 -0
  123. package/dist/teste/Calendar.test.d.ts +1 -0
  124. package/dist/teste/Calendar.test.js +221 -0
  125. package/dist/teste/ChipsXs.test.d.ts +1 -0
  126. package/dist/teste/ChipsXs.test.js +31 -0
  127. package/dist/teste/Coachmark.test.d.ts +1 -0
  128. package/dist/teste/Coachmark.test.js +149 -0
  129. package/dist/teste/ColorPicker.test.d.ts +1 -0
  130. package/dist/teste/ColorPicker.test.js +132 -0
  131. package/dist/teste/DataTableCelulaLivre.test.d.ts +1 -0
  132. package/dist/teste/DataTableCelulaLivre.test.js +76 -0
  133. package/dist/teste/DataTableDocumento.test.d.ts +1 -0
  134. package/dist/teste/DataTableDocumento.test.js +92 -0
  135. package/dist/teste/DatePicker.test.js +23 -0
  136. package/dist/teste/FileInputTrigger.test.d.ts +1 -0
  137. package/dist/teste/FileInputTrigger.test.js +53 -0
  138. package/dist/teste/IconPicker.test.d.ts +1 -0
  139. package/dist/teste/IconPicker.test.js +130 -0
  140. package/dist/teste/InputMascaraEAfins.test.d.ts +1 -0
  141. package/dist/teste/InputMascaraEAfins.test.js +99 -0
  142. package/dist/teste/KbdCodeBlock.test.d.ts +1 -0
  143. package/dist/teste/KbdCodeBlock.test.js +95 -0
  144. package/dist/teste/List.test.d.ts +1 -0
  145. package/dist/teste/List.test.js +153 -0
  146. package/dist/teste/ModalVariantes.test.d.ts +1 -0
  147. package/dist/teste/ModalVariantes.test.js +151 -0
  148. package/dist/teste/NomeAcessivelSsr.test.d.ts +1 -0
  149. package/dist/teste/NomeAcessivelSsr.test.js +88 -0
  150. package/dist/teste/OrgChart.test.d.ts +1 -0
  151. package/dist/teste/OrgChart.test.js +162 -0
  152. package/dist/teste/OtpInput.test.d.ts +1 -0
  153. package/dist/teste/OtpInput.test.js +143 -0
  154. package/dist/teste/PopoverMaxHeight.test.d.ts +1 -0
  155. package/dist/teste/PopoverMaxHeight.test.js +38 -0
  156. package/dist/teste/RichTextEditor.test.d.ts +1 -0
  157. package/dist/teste/RichTextEditor.test.js +287 -0
  158. package/dist/teste/SelectPlacementFiltro.test.d.ts +1 -0
  159. package/dist/teste/SelectPlacementFiltro.test.js +88 -0
  160. package/dist/teste/Stack.test.d.ts +1 -0
  161. package/dist/teste/Stack.test.js +57 -0
  162. package/dist/teste/StatCardRotuloTopo.test.d.ts +1 -0
  163. package/dist/teste/StatCardRotuloTopo.test.js +34 -0
  164. package/dist/teste/TabsContadorFechavel.test.d.ts +1 -0
  165. package/dist/teste/TabsContadorFechavel.test.js +79 -0
  166. package/dist/teste/TooltipDark.test.d.ts +1 -0
  167. package/dist/teste/TooltipDark.test.js +31 -0
  168. package/dist/utils/calendario.d.ts +28 -0
  169. package/dist/utils/calendario.js +73 -0
  170. package/dist/utils/html-seguro.d.ts +27 -0
  171. package/dist/utils/html-seguro.js +97 -0
  172. package/dist/utils/paleta-de-cores.d.ts +26 -0
  173. package/dist/utils/paleta-de-cores.js +10 -0
  174. package/dist/utils/texto.d.ts +5 -0
  175. package/dist/utils/texto.js +5 -0
  176. package/package.json +3 -3
  177. package/src/index.ts +26 -0
  178. package/src/teste/AILabel.test.tsx +41 -0
  179. package/src/teste/AccordionConteudoLivre.test.tsx +39 -0
  180. package/src/teste/AtributosRepassados.test.tsx +73 -0
  181. package/src/teste/AttachmentCardIA.test.tsx +126 -0
  182. package/src/teste/AvatarGroupOverlap.test.tsx +74 -0
  183. package/src/teste/BadgeTag.test.tsx +64 -0
  184. package/src/teste/BoxItemFlex.test.tsx +81 -0
  185. package/src/teste/BoxLayout.test.tsx +50 -0
  186. package/src/teste/Button.test.tsx +39 -0
  187. package/src/teste/Calendar.test.tsx +282 -0
  188. package/src/teste/ChipsXs.test.tsx +41 -0
  189. package/src/teste/Coachmark.test.tsx +198 -0
  190. package/src/teste/ColorPicker.test.tsx +153 -0
  191. package/src/teste/DataTableCelulaLivre.test.tsx +103 -0
  192. package/src/teste/DataTableDocumento.test.tsx +102 -0
  193. package/src/teste/DatePicker.test.tsx +38 -0
  194. package/src/teste/FileInputTrigger.test.tsx +89 -0
  195. package/src/teste/IconPicker.test.tsx +145 -0
  196. package/src/teste/InputMascaraEAfins.test.tsx +124 -0
  197. package/src/teste/KbdCodeBlock.test.tsx +106 -0
  198. package/src/teste/List.test.tsx +269 -0
  199. package/src/teste/ModalVariantes.test.tsx +173 -0
  200. package/src/teste/NomeAcessivelSsr.test.tsx +110 -0
  201. package/src/teste/OrgChart.test.tsx +183 -0
  202. package/src/teste/OtpInput.test.tsx +163 -0
  203. package/src/teste/PopoverMaxHeight.test.tsx +47 -0
  204. package/src/teste/RichTextEditor.test.tsx +329 -0
  205. package/src/teste/SelectPlacementFiltro.test.tsx +110 -0
  206. package/src/teste/Stack.test.tsx +80 -0
  207. package/src/teste/StatCardRotuloTopo.test.tsx +44 -0
  208. package/src/teste/TabsContadorFechavel.test.tsx +144 -0
  209. package/src/teste/TooltipDark.test.tsx +51 -0
  210. package/src/utils/calendario.ts +78 -0
  211. package/src/utils/html-seguro.ts +94 -0
  212. package/src/utils/paleta-de-cores.ts +34 -0
  213. package/src/utils/texto.ts +5 -0
@@ -0,0 +1,133 @@
1
+ /* ─────────────────────────────────────────────
2
+ COLOR PICKER
3
+ Grade de amostras da paleta do 1DS (primitivos de cor). Valor = nome do token.
4
+
5
+ Na paleta do DS a grade tem 7 colunas (os cinzas são 7) e a PRIMEIRA amostra
6
+ de cada família abre linha nova: uma linha por família, sem aninhar nada no
7
+ DOM — a ordem de Tab e das setas continua a da lista.
8
+
9
+ A amostra escolhida tem dois sinais além da cor: anel duplo e ícone de
10
+ marcação. O ícone usa primitivos (branco ou cinza escuro), porque a cor da
11
+ amostra é primitiva e não muda com o tema: o contraste fica o mesmo no escuro.
12
+
13
+ Cores: semânticos (e primitivos, na marcação) · Medidas: primitivos
14
+ ───────────────────────────────────────────── */
15
+
16
+ .umds-color-picker {
17
+ display: inline-flex;
18
+ flex-direction: column;
19
+ gap: var(--umds-primitive-spacing-nano); /* 8px */
20
+ font-family: var(--umds-semantic-font-family-base);
21
+ }
22
+
23
+ .umds-color-picker__label {
24
+ font-size: var(--umds-semantic-field-label-size);
25
+ font-weight: var(--umds-semantic-field-label-weight);
26
+ color: var(--umds-semantic-field-label-color);
27
+ }
28
+
29
+ /* ── Grade ── */
30
+ .umds-color-picker__swatches {
31
+ display: flex;
32
+ flex-wrap: wrap;
33
+ gap: var(--umds-primitive-spacing-nano); /* 8px */
34
+ /* Folga para o anel de seleção (4px) não ser cortado por um overflow do pai. */
35
+ padding: var(--umds-primitive-spacing-quarck);
36
+ }
37
+
38
+ .umds-color-picker--sm .umds-color-picker__swatches {
39
+ gap: var(--umds-primitive-spacing-quarck); /* 4px */
40
+ }
41
+
42
+ .umds-color-picker__swatches--familias {
43
+ display: grid;
44
+ grid-template-columns: repeat(7, max-content);
45
+ }
46
+
47
+ .umds-color-picker__swatch--nova-linha {
48
+ grid-column-start: 1;
49
+ }
50
+
51
+ /* ── Amostra ── */
52
+ .umds-color-picker__swatch {
53
+ display: inline-flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ box-sizing: border-box;
57
+ margin: 0;
58
+ padding: 0;
59
+ cursor: pointer;
60
+ /* Anel de 1px: amostra clara não some no fundo branco. */
61
+ border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-down);
62
+ border-radius: var(--umds-primitive-border-radius-sm);
63
+ /* A cor da amostra vem do `style` (background-color); o ícone herda o branco. */
64
+ /* stylelint-disable-next-line 1ds/cor-por-token -- a amostra é primitivo (não muda com o tema); a marcação precisa do par fixo, senão o semântico inverte no escuro e perde o contraste */
65
+ color: var(--umds-primitive-white);
66
+ transition: box-shadow var(--umds-semantic-motion-duration-fast) var(--umds-semantic-motion-easing-standard);
67
+ }
68
+
69
+ .umds-color-picker--md .umds-color-picker__swatch {
70
+ width: var(--umds-primitive-spacing-xs); /* 32px */
71
+ height: var(--umds-primitive-spacing-xs);
72
+ }
73
+
74
+ .umds-color-picker--sm .umds-color-picker__swatch {
75
+ width: var(--umds-primitive-spacing-xxs); /* 24px */
76
+ height: var(--umds-primitive-spacing-xxs);
77
+ }
78
+
79
+ .umds-color-picker__swatch--on-light {
80
+ /* stylelint-disable-next-line 1ds/cor-por-token -- par fixo da marcação sobre amostra clara (ver acima) */
81
+ color: var(--umds-primitive-gray-darkest);
82
+ }
83
+
84
+ .umds-color-picker__swatch:hover:not(:disabled) {
85
+ box-shadow: 0 0 0 var(--umds-primitive-border-width-thin) var(--umds-semantic-color-neutral-light-down);
86
+ }
87
+
88
+ .umds-color-picker__swatch--selected,
89
+ .umds-color-picker__swatch--selected:hover:not(:disabled) {
90
+ /* Anel duplo: a cor do fundo da página por dentro e o primário por fora. */
91
+ box-shadow:
92
+ 0 0 0 var(--umds-primitive-border-width-thin) var(--umds-semantic-color-background-white),
93
+ 0 0 0 calc(var(--umds-primitive-border-width-thin) * 2) var(--umds-semantic-color-primary-pure);
94
+ }
95
+
96
+ .umds-color-picker__swatch:focus-visible {
97
+ outline: var(--umds-primitive-border-width-thin) solid var(--umds-semantic-color-primary-pure);
98
+ outline-offset: var(--umds-primitive-spacing-quarck);
99
+ }
100
+
101
+ .umds-color-picker__swatch:disabled {
102
+ cursor: not-allowed;
103
+ opacity: var(--umds-semantic-field-disabled-opacity);
104
+ }
105
+
106
+ /* ── Cor livre ── */
107
+ .umds-color-picker__custom {
108
+ display: flex;
109
+ align-items: flex-end;
110
+ gap: var(--umds-primitive-spacing-nano); /* 8px */
111
+ }
112
+
113
+ .umds-color-picker__custom-preview {
114
+ flex: none;
115
+ box-sizing: border-box;
116
+ width: var(--umds-primitive-spacing-xs); /* 32px, a altura do Input sm */
117
+ height: var(--umds-primitive-spacing-xs);
118
+ border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-down);
119
+ border-radius: var(--umds-primitive-border-radius-sm);
120
+ }
121
+
122
+ /* ── Alto contraste: a marcação e a borda ficam, a cor é do usuário ── */
123
+ @media (forced-colors: active) {
124
+ .umds-color-picker__swatch {
125
+ forced-color-adjust: none;
126
+ border-color: CanvasText;
127
+ }
128
+
129
+ .umds-color-picker__swatch--selected {
130
+ outline: var(--umds-primitive-border-width-thin) solid Highlight;
131
+ outline-offset: var(--umds-primitive-border-width-thin);
132
+ }
133
+ }
@@ -0,0 +1,73 @@
1
+ import './ColorPicker.css';
2
+ /**
3
+ * Amostra do ColorPicker.
4
+ * @property {string} value - Nome da variável CSS (`--umds-primitive-blue-pure`) ou uma cor hexadecimal (`#0058DB`).
5
+ * @property {string} label - Nome da cor, para leitor de tela e tooltip.
6
+ * @property {boolean} onLight - Cor clara: o ícone de marcação sai escuro.
7
+ * @property {boolean} disabled - Desabilita só esta amostra.
8
+ */
9
+ export interface ColorPickerSwatch {
10
+ value: string;
11
+ label: string;
12
+ onLight?: boolean;
13
+ disabled?: boolean;
14
+ [key: string]: any;
15
+ }
16
+ /**
17
+ * ColorPicker — escolha de UMA cor numa grade de amostras da paleta do 1DS.
18
+ *
19
+ * O valor é o NOME DO TOKEN (`--umds-primitive-blue-pure`), não o hexadecimal:
20
+ * guarde o nome e escreva `var(${valor})` onde pintar, e a cor acompanha a
21
+ * paleta do DS. As amostras são os primitivos de cor (6 famílias de 4 tons e
22
+ * os 7 cinzas), por isso a cor escolhida é a mesma no tema claro e no escuro,
23
+ * o que é o certo para cor de dado (marcador, tipo de documento, setor).
24
+ *
25
+ * É um `radiogroup`: um Tab entra na grade (na amostra escolhida, ou na
26
+ * primeira) e as setas movem a escolha, com Home e End nas pontas. Cada amostra
27
+ * tem nome acessível ("Azul escuro") e a escolhida ganha um ícone de marcação,
28
+ * então a seleção nunca depende só da cor.
29
+ *
30
+ * `allowCustom` liga o campo de cor livre (hexadecimal `#RRGGBB`). Vem
31
+ * DESLIGADO: cor fora da paleta foge do DS, e quem liga assume o desvio. O
32
+ * valor livre sai em maiúsculas (`#0058DB`) e se distingue do token por começar
33
+ * com `#`.
34
+ *
35
+ * Para um recorte da paleta (só azul e cinza) ou para traduzir os nomes, passe
36
+ * `swatches`; `COLOR_PALETTE` é a lista padrão, exportada para filtrar.
37
+ * @property {string} value - Valor escolhido (controlado): nome do token ou `#RRGGBB`
38
+ * @property {string} defaultValue - Valor inicial (não controlado)
39
+ * @property {string} label - Rótulo visível do grupo
40
+ * @property {string} ariaLabel - Nome acessível quando não há `label` visível
41
+ * @property {string} ariaLabelledby - Id do texto que nomeia o grupo
42
+ * @property {ColorPickerSwatch[]} swatches - Amostras no lugar da paleta do DS (ex.: nomes traduzidos)
43
+ * @property {string[]} families - Mostra só estas famílias da paleta do DS: 'blue' | 'red' | 'green' | 'orange' | 'yellow' | 'purple' | 'gray'
44
+ * @property {boolean} allowCustom - Liga o campo de cor livre (hexadecimal)
45
+ * @property {string} customLabel - Rótulo do campo de cor livre (padrão: "Cor livre (hexadecimal)")
46
+ * @property {string} customErrorMessage - Mensagem do hexadecimal inválido (padrão: "Use o formato #RRGGBB")
47
+ * @property {string} size - Tamanho da amostra: 'sm' (24px) | 'md' (32px)
48
+ * @property {boolean} disabled - Desabilita o grupo inteiro
49
+ * @property {string} id - Base dos ids internos; passe em SSR para os ids já saírem no HTML do servidor
50
+ * @property {string} className - Classes CSS adicionais
51
+ * @property {function} onChange - Callback com o valor escolhido (nome do token ou `#RRGGBB`)
52
+ * @quandoUsar Escolher a cor de um marcador, de um tipo de documento, de um setor ou de uma série de dados, sempre dentro da paleta do DS.
53
+ * @quandoNaoUsar Para cor com PAPEL na interface (primária, erro, sucesso), use os tokens semânticos direto: não é escolha do usuário. Para escolher entre poucas opções que não são cor, use `SegmentedControl` ou `RadioGroup`. Para uma cor qualquer da web, ligue `allowCustom` sabendo que ela sai do DS.
54
+ */
55
+ export interface ColorPickerProps {
56
+ value?: string;
57
+ defaultValue?: string;
58
+ label?: string;
59
+ ariaLabel?: string;
60
+ ariaLabelledby?: string;
61
+ swatches?: ColorPickerSwatch[];
62
+ families?: string[];
63
+ allowCustom?: boolean;
64
+ customLabel?: string;
65
+ customErrorMessage?: string;
66
+ size?: "sm" | "md";
67
+ disabled?: boolean;
68
+ id?: string;
69
+ className?: string;
70
+ onChange?: (value: string) => void;
71
+ }
72
+ declare function ColorPicker(props: ColorPickerProps): import("react/jsx-runtime").JSX.Element;
73
+ export default ColorPicker;
@@ -0,0 +1,219 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import './ColorPicker.css';
4
+ import { useState, useRef, useEffect } from "react";
5
+ import { faCheck } from "@fortawesome/free-solid-svg-icons";
6
+ import Icon from "../Icon/Icon";
7
+ import Input from "../Input/Input";
8
+ import { gerarId } from "../../utils/id";
9
+ import { COLOR_PALETTE, isHexColor } from "../../utils/paleta-de-cores";
10
+ function ColorPicker(props) {
11
+ const groupRef = useRef(null);
12
+ const [internalValue, setInternalValue] = useState(() => props.defaultValue !== undefined ? props.defaultValue : "");
13
+ const [uid, setUid] = useState(() => "");
14
+ const [hexDraft, setHexDraft] = useState(() => "");
15
+ const [hexEditing, setHexEditing] = useState(() => false);
16
+ const [hexTouched, setHexTouched] = useState(() => false);
17
+ function baseId() {
18
+ return props.id || uid;
19
+ }
20
+ function labelId() {
21
+ return baseId() && props.label ? baseId() + "-label" : undefined;
22
+ }
23
+ function currentValue() {
24
+ return props.value !== undefined ? props.value : internalValue;
25
+ }
26
+ function swatchList() {
27
+ if (props.swatches && props.swatches.length)
28
+ return props.swatches;
29
+ const familias = props.families;
30
+ if (!familias || !familias.length)
31
+ return COLOR_PALETTE;
32
+ return COLOR_PALETTE.filter((cor) => familias.indexOf(cor.family) !== -1);
33
+ }
34
+ function usaPaletaDoDs() {
35
+ return !(props.swatches && props.swatches.length);
36
+ }
37
+ function groupClasses() {
38
+ return [
39
+ "umds-color-picker",
40
+ `umds-color-picker--${props.size || "md"}`,
41
+ props.disabled ? "umds-color-picker--disabled" : "",
42
+ props.className,
43
+ ]
44
+ .filter(Boolean)
45
+ .join(" ");
46
+ }
47
+ function swatchesClasses() {
48
+ return [
49
+ "umds-color-picker__swatches",
50
+ usaPaletaDoDs() ? "umds-color-picker__swatches--familias" : "",
51
+ ]
52
+ .filter(Boolean)
53
+ .join(" ");
54
+ }
55
+ function groupAriaLabel() {
56
+ if (props.ariaLabel)
57
+ return props.ariaLabel;
58
+ // Antes do onMount o label ainda não tem id para o aria-labelledby apontar.
59
+ return props.label && !labelId() ? props.label : undefined;
60
+ }
61
+ function groupLabelledBy() {
62
+ return props.ariaLabelledby || labelId();
63
+ }
64
+ function corCss(valor) {
65
+ if (!valor)
66
+ return "";
67
+ return valor.indexOf("--") === 0 ? "var(" + valor + ")" : valor;
68
+ }
69
+ function swatchStyle(swatch) {
70
+ return {
71
+ backgroundColor: corCss(swatch.value),
72
+ };
73
+ }
74
+ function swatchClasses(swatch) {
75
+ return [
76
+ "umds-color-picker__swatch",
77
+ swatch.onLight ? "umds-color-picker__swatch--on-light" : "",
78
+ estaEscolhida(swatch) ? "umds-color-picker__swatch--selected" : "",
79
+ ]
80
+ .filter(Boolean)
81
+ .join(" ");
82
+ }
83
+ function novaLinha(swatch, index) {
84
+ if (!usaPaletaDoDs())
85
+ return false;
86
+ if (index === 0)
87
+ return true;
88
+ const anterior = swatchList()[index - 1];
89
+ return !!anterior && !!swatch.family && anterior.family !== swatch.family;
90
+ }
91
+ function swatchItemClasses(swatch, index) {
92
+ return [
93
+ swatchClasses(swatch),
94
+ novaLinha(swatch, index) ? "umds-color-picker__swatch--nova-linha" : "",
95
+ ]
96
+ .filter(Boolean)
97
+ .join(" ");
98
+ }
99
+ function estaEscolhida(swatch) {
100
+ return (!!currentValue() &&
101
+ swatch.value.toLowerCase() === currentValue().toLowerCase());
102
+ }
103
+ function estaDesabilitada(swatch) {
104
+ return !!props.disabled || !!swatch.disabled;
105
+ }
106
+ function indiceDoTab() {
107
+ const lista = swatchList();
108
+ for (let i = 0; i < lista.length; i++) {
109
+ if (estaEscolhida(lista[i]) && !estaDesabilitada(lista[i]))
110
+ return i;
111
+ }
112
+ for (let i = 0; i < lista.length; i++) {
113
+ if (!estaDesabilitada(lista[i]))
114
+ return i;
115
+ }
116
+ return 0;
117
+ }
118
+ function tabIndexDa(index) {
119
+ return index === indiceDoTab() ? 0 : -1;
120
+ }
121
+ function emitir(valor) {
122
+ setInternalValue(valor);
123
+ if (props.onChange)
124
+ props.onChange(valor);
125
+ }
126
+ function escolher(swatch) {
127
+ if (estaDesabilitada(swatch))
128
+ return;
129
+ setHexEditing(false);
130
+ setHexDraft("");
131
+ setHexTouched(false);
132
+ emitir(swatch.value);
133
+ }
134
+ function handleKeyDown(event, index) {
135
+ if (!event || event.altKey || event.ctrlKey || event.metaKey)
136
+ return;
137
+ const lista = swatchList();
138
+ const total = lista.length;
139
+ if (!total)
140
+ return;
141
+ let passo = 0;
142
+ let alvo = index;
143
+ if (event.key === "ArrowRight" || event.key === "ArrowDown")
144
+ passo = 1;
145
+ else if (event.key === "ArrowLeft" || event.key === "ArrowUp")
146
+ passo = -1;
147
+ else if (event.key === "Home") {
148
+ passo = 1;
149
+ alvo = -1;
150
+ }
151
+ else if (event.key === "End") {
152
+ passo = -1;
153
+ alvo = total;
154
+ }
155
+ else
156
+ return;
157
+ event.preventDefault();
158
+ for (let tentativa = 0; tentativa < total; tentativa++) {
159
+ alvo = (alvo + passo + total) % total;
160
+ if (!estaDesabilitada(lista[alvo]))
161
+ break;
162
+ }
163
+ if (estaDesabilitada(lista[alvo]))
164
+ return;
165
+ escolher(lista[alvo]);
166
+ if (groupRef.current) {
167
+ const botoes = groupRef.current.querySelectorAll('[role="radio"]');
168
+ const botao = botoes[alvo];
169
+ if (botao)
170
+ botao.focus();
171
+ }
172
+ }
173
+ function hexText() {
174
+ if (hexEditing)
175
+ return hexDraft;
176
+ const atual = currentValue();
177
+ return atual && atual.indexOf("#") === 0 ? atual : "";
178
+ }
179
+ function hexInvalid() {
180
+ return hexTouched && !!hexText() && !isHexColor(hexText());
181
+ }
182
+ function customPreview() {
183
+ const texto = hexText();
184
+ return isHexColor(texto) ? corCss(normalizarHex(texto)) : "";
185
+ }
186
+ function customLabelText() {
187
+ return props.customLabel || "Cor livre (hexadecimal)";
188
+ }
189
+ function customErrorText() {
190
+ return hexInvalid()
191
+ ? props.customErrorMessage || "Use o formato #RRGGBB"
192
+ : undefined;
193
+ }
194
+ function normalizarHex(texto) {
195
+ const limpo = texto.trim();
196
+ return (limpo.indexOf("#") === 0 ? limpo : "#" + limpo).toUpperCase();
197
+ }
198
+ function handleHexInput(texto) {
199
+ setHexEditing(true);
200
+ setHexDraft(texto);
201
+ if (isHexColor(texto))
202
+ emitir(normalizarHex(texto));
203
+ }
204
+ function handleHexBlur() {
205
+ setHexTouched(true);
206
+ if (isHexColor(hexDraft)) {
207
+ setHexEditing(false);
208
+ setHexDraft("");
209
+ }
210
+ }
211
+ useEffect(() => {
212
+ if (!props.id)
213
+ setUid(gerarId("umds-color-picker"));
214
+ }, []);
215
+ return (_jsxs("div", { className: groupClasses(), children: [props.label ? (_jsx("span", { className: "umds-color-picker__label", id: labelId(), children: props.label })) : null, _jsx("div", { role: "radiogroup", ref: groupRef, "aria-label": groupAriaLabel(), "aria-labelledby": groupLabelledBy(), className: swatchesClasses(), children: swatchList()?.map((swatch, index) => (_jsx("button", { type: "button", role: "radio", style: swatchStyle(swatch), "aria-checked": estaEscolhida(swatch) ? "true" : "false", "aria-label": swatch.label, title: swatch.label, disabled: estaDesabilitada(swatch), tabIndex: tabIndexDa(index), onClick: (event) => escolher(swatch), onKeyDown: (event) => handleKeyDown(event, index), className: swatchItemClasses(swatch, index), children: estaEscolhida(swatch) ? (_jsx(Icon, { size: "sm", variant: "inherit", icon: faCheck })) : null }, swatch.value))) }), props.allowCustom ? (_jsxs("div", { className: "umds-color-picker__custom", children: [_jsx("span", { "aria-hidden": "true", className: "umds-color-picker__custom-preview", style: {
216
+ backgroundColor: customPreview(),
217
+ } }), _jsx(Input, { size: "sm", placeholder: "#0058DB", label: customLabelText(), value: hexText(), disabled: props.disabled, errorMessage: customErrorText(), onChange: (texto) => handleHexInput(texto), onBlur: (event) => handleHexBlur() })] })) : null] }));
218
+ }
219
+ export default ColorPicker;
@@ -214,6 +214,14 @@
214
214
  cursor: default;
215
215
  }
216
216
 
217
+ /* Somente leitura não é desabilitado: o texto segue lido e a WCAG 1.4.3 vale
218
+ sem isenção. O placeholder padrão foi calibrado para fundo branco e cai para
219
+ ~4,2:1 sobre o fundo de somente leitura; neutral-dark-down passa 4,5:1 em
220
+ todos os temas (1doc 6,78:1 · 1doc-dark 10,83:1 · alto contraste 16,48:1). */
221
+ .umds-combobox--readonly .umds-combobox__control::placeholder {
222
+ color: var(--umds-semantic-color-neutral-dark-down);
223
+ }
224
+
217
225
  /* ── Dropdown (espelha .umds-select__dropdown) ── */
218
226
  .umds-combobox__dropdown {
219
227
  position: absolute;
@@ -154,6 +154,26 @@
154
154
  outline-offset: -2px;
155
155
  }
156
156
 
157
+ /* ── Linha de grupo (prop rowGroup) ──
158
+ Um <th scope="rowgroup"> que atravessa a tabela. Não é clicável nem
159
+ selecionável, então o hover da linha comum não se aplica. */
160
+ .umds-datatable__row--group,
161
+ .umds-datatable__row--group:hover {
162
+ background: var(--umds-semantic-color-background-light); /* #F4F6F9 */
163
+ }
164
+
165
+ .umds-datatable__group {
166
+ padding: var(--umds-primitive-spacing-nano) var(--umds-primitive-spacing-xxxs); /* 8px 16px */
167
+ font-size: var(--umds-primitive-font-size-xxxs); /* 12px */
168
+ font-weight: 700;
169
+ text-align: left;
170
+ color: var(--umds-semantic-color-neutral-dark-down); /* #565656 */
171
+ }
172
+
173
+ .umds-datatable--compact .umds-datatable__group {
174
+ padding: var(--umds-primitive-spacing-quarck) var(--umds-primitive-spacing-nano); /* 4px 8px */
175
+ }
176
+
157
177
  /* ── Células ── */
158
178
  .umds-datatable__td {
159
179
  padding: var(--umds-primitive-spacing-mini) var(--umds-primitive-spacing-xxxs); /* protótipo --space-3 (12px): candidato a novo token; 16px */
@@ -237,3 +257,63 @@
237
257
  0% { background-position: 200% 0; }
238
258
  100% { background-position: -200% 0; }
239
259
  }
260
+
261
+ /* ── Variante document (variant="document") ──
262
+ Tabela de CONTEÚDO de documento (itens de nota, cotações): lê-se e imprime-se,
263
+ não se opera. Sem hover, sem cursor, sem cabeçalho grudado; grade de bordas
264
+ finas em todas as células, como no papel. Na impressão o cabeçalho se repete
265
+ a cada página e uma linha nunca é cortada ao meio. */
266
+ .umds-datatable--document {
267
+ border: none;
268
+ border-radius: var(--umds-primitive-border-radius-none);
269
+ background: transparent;
270
+ }
271
+
272
+ .umds-datatable--document .umds-datatable__table {
273
+ border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
274
+ }
275
+
276
+ .umds-datatable--document .umds-datatable__thead {
277
+ position: static;
278
+ border-bottom: none;
279
+ }
280
+
281
+ .umds-datatable--document .umds-datatable__th,
282
+ .umds-datatable--document .umds-datatable__td {
283
+ border: var(--umds-primitive-border-width-hairline) solid var(--umds-semantic-color-neutral-light-medium);
284
+ vertical-align: top;
285
+ user-select: auto;
286
+ }
287
+
288
+ .umds-datatable--document .umds-datatable__th {
289
+ font-size: var(--umds-primitive-font-size-xxs); /* 14px: no papel o cabeçalho é lido, não escaneado */
290
+ white-space: normal;
291
+ color: var(--umds-semantic-color-neutral-dark-pure);
292
+ }
293
+
294
+ .umds-datatable--document .umds-datatable__row,
295
+ .umds-datatable--document .umds-datatable__row:hover {
296
+ background: transparent;
297
+ border-bottom: none;
298
+ }
299
+
300
+ .umds-datatable--document .umds-datatable__td {
301
+ overflow-wrap: anywhere;
302
+ }
303
+
304
+ @media print {
305
+ .umds-datatable--document {
306
+ overflow-x: visible;
307
+ -webkit-print-color-adjust: exact;
308
+ print-color-adjust: exact;
309
+ }
310
+
311
+ .umds-datatable--document .umds-datatable__thead {
312
+ display: table-header-group;
313
+ }
314
+
315
+ .umds-datatable--document .umds-datatable__row {
316
+ break-inside: avoid;
317
+ page-break-inside: avoid;
318
+ }
319
+ }
@@ -7,8 +7,10 @@ import './DataTable.css';
7
7
  * @property {string} width - Largura fixa da coluna (ex.: "120px")
8
8
  * @property {string} align - Alinhamento do conteúdo: 'left' | 'center' | 'right'
9
9
  * @property {function} render - Renderização customizada da célula: recebe a linha e o
10
- * índice e retorna o conteúdo (ReactNode no React; no Vue, prefira retornar string).
11
- * Sem `render`, a célula exibe `row[key]` — que também aceita ReactNode diretamente.
10
+ * índice e retorna o conteúdo. No React devolve qualquer nó (badge, avatar, botão).
11
+ * No Vue o retorno é tratado como TEXTO: para célula com markup use o slot
12
+ * `#cell-<key>` (recebe `{ row, value, rowIndex }`), que vale sobre o `render`.
13
+ * Sem `render` nem slot, a célula exibe `row[key]`.
12
14
  */
13
15
  export interface DataTableColumn {
14
16
  key: string;
@@ -32,6 +34,7 @@ export interface DataTableColumn {
32
34
  * (selectedKeys/onSelectKeys) em vez de índice — sobrevive a paginação e ordenação.
33
35
  * @property {Array<string|number>} selectedKeys - Chaves das linhas selecionadas (controlado;
34
36
  * requer rowKey)
37
+ * @property {string} variant - 'default' (tabela de interface) | 'document' (tabela de CONTEÚDO de documento: sem ordenação, seleção nem clique de linha, bordas finas, cabeçalho repetido e linha inteira por página na impressão)
35
38
  * @property {string} density - Densidade das células: 'default' | 'compact'
36
39
  * @property {string} sortKey - Chave da coluna atualmente ordenada
37
40
  * @property {string} sortDirection - Direção da ordenação: 'asc' | 'desc'
@@ -42,8 +45,16 @@ export interface DataTableColumn {
42
45
  * @property {function} onSelectKeys - Callback ao alterar a seleção por chave (requer rowKey)
43
46
  * @property {function} onRowClick - Callback ao clicar numa linha (recebe índice e a linha);
44
47
  * cliques no checkbox de seleção não disparam
45
- * @quandoUsar Dados TABULARES que se comparam coluna a coluna, com ordenação, seleção e paginação. Semântica de tabela para leitor de tela.
46
- * @quandoNaoUsar Para hierarquia pai-filho — use `Tree`. Para cards em grade sem comparação coluna a coluna, use `Grid` com `Card`.
48
+ * @property {string|function} rowGroup - Agrupa linhas consecutivas: nome do campo ou função
49
+ * (row, rowIndex) => rótulo. Antes da primeira linha de cada grupo entra uma linha de
50
+ * grupo (`<th scope="rowgroup">` ocupando a largura toda). Linha sem rótulo não abre grupo.
51
+ * A tabela não reordena: ordene `data` por grupo antes de passar.
52
+ * @property {function} renderRowGroup - Conteúdo da linha de grupo: (label, row, rowIndex) => nó.
53
+ * Só no React. No Vue use o slot `#row-group` (recebe `{ label, row, rowIndex }`).
54
+ * @slot cell-<key> - Só no Vue. Célula livre da coluna `<key>`: `<template #cell-nome="{ row, value, rowIndex }">`.
55
+ * @slot row-group - Só no Vue. Conteúdo da linha de grupo: `{ label, row, rowIndex }`.
56
+ * @quandoUsar Dados TABULARES que se comparam coluna a coluna, com ordenação, seleção e paginação. Semântica de tabela para leitor de tela. Com `variant="document"`, a tabela que faz parte do TEXTO de um documento que se imprime (itens de nota, cotações): sem interação, com bordas finas e quebra de página que não corta linha.
57
+ * @quandoNaoUsar Para hierarquia pai-filho — use `Tree`. Para cards em grade sem comparação coluna a coluna, use `Grid` com `Card`. Para pares rótulo/valor de um documento (sem cabeçalho de coluna), use `DescriptionList`.
47
58
  */
48
59
  export interface DataTableProps {
49
60
  columns: DataTableColumn[];
@@ -53,7 +64,11 @@ export interface DataTableProps {
53
64
  selectable?: boolean;
54
65
  selectedRows?: number[];
55
66
  rowKey?: string | ((row: Record<string, any>) => string | number);
67
+ rowGroup?: string | ((row: Record<string, any>, rowIndex: number) => string | undefined);
68
+ renderRowGroup?: (label: string, row: Record<string, any>, rowIndex: number) => any;
56
69
  selectedKeys?: Array<string | number>;
70
+ /** `document`: tabela de conteúdo de documento, imprimível e sem interação. @default 'default' */
71
+ variant?: "default" | "document";
57
72
  density?: "default" | "compact";
58
73
  sortKey?: string;
59
74
  sortDirection?: "asc" | "desc";