@1doc/1ds-react 2.14.0 → 2.15.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 (49) hide show
  1. package/CHANGELOG.md +51 -67
  2. package/dist/components/AILabel/AILabel.css +1 -1
  3. package/dist/components/Alert/Alert.css +1 -1
  4. package/dist/components/AppShell/AppShell.css +4 -0
  5. package/dist/components/AttachmentCard/AttachmentCard.css +2 -2
  6. package/dist/components/Avatar/Avatar.d.ts +8 -3
  7. package/dist/components/Avatar/Avatar.js +28 -4
  8. package/dist/components/BottomNavigation/BottomNavigation.css +2 -2
  9. package/dist/components/BottomSheet/BottomSheet.css +2 -2
  10. package/dist/components/Box/Box.css +3 -3
  11. package/dist/components/Card/Card.css +5 -5
  12. package/dist/components/Chart/Chart.css +1 -1
  13. package/dist/components/Coachmark/Coachmark.css +1 -1
  14. package/dist/components/Combobox/Combobox.css +1 -1
  15. package/dist/components/ConfirmDialog/ConfirmDialog.css +1 -1
  16. package/dist/components/DatePicker/DatePicker.css +1 -1
  17. package/dist/components/Drawer/Drawer.css +2 -2
  18. package/dist/components/Dropdown/Dropdown.css +1 -1
  19. package/dist/components/Dropdown/Dropdown.d.ts +8 -0
  20. package/dist/components/Dropdown/Dropdown.js +2 -0
  21. package/dist/components/EmptyState/EmptyState.css +12 -0
  22. package/dist/components/EmptyState/EmptyState.d.ts +3 -0
  23. package/dist/components/EmptyState/EmptyState.js +1 -0
  24. package/dist/components/Kanban/Kanban.css +2 -2
  25. package/dist/components/Kanban/KanbanCard.css +2 -2
  26. package/dist/components/List/List.css +37 -1
  27. package/dist/components/List/List.d.ts +3 -0
  28. package/dist/components/List/List.js +6 -2
  29. package/dist/components/List/ListItem.d.ts +9 -0
  30. package/dist/components/List/ListItem.js +5 -1
  31. package/dist/components/Modal/Modal.css +3 -4
  32. package/dist/components/MultiSelect/MultiSelect.css +1 -1
  33. package/dist/components/OrgChart/OrgChart.css +2 -2
  34. package/dist/components/PhoneInput/PhoneInput.css +2 -2
  35. package/dist/components/Popover/Popover.css +1 -1
  36. package/dist/components/SegmentedControl/SegmentedControl.css +1 -1
  37. package/dist/components/Select/Select.css +1 -1
  38. package/dist/components/StatCard/StatCard.css +42 -3
  39. package/dist/components/Switch/Switch.css +2 -2
  40. package/dist/components/Text/Text.d.ts +6 -0
  41. package/dist/components/TimePicker/TimePicker.css +1 -1
  42. package/dist/components/Toast/Toast.css +2 -2
  43. package/dist/components/Tooltip/Tooltip.css +20 -3
  44. package/dist/teste/PedidosMatheus2.test.d.ts +1 -0
  45. package/dist/teste/PedidosMatheus2.test.js +82 -0
  46. package/dist/teste/SegmentedControlSuperficie.test.js +1 -1
  47. package/package.json +3 -3
  48. package/src/teste/PedidosMatheus2.test.tsx +102 -0
  49. package/src/teste/SegmentedControlSuperficie.test.tsx +1 -1
package/CHANGELOG.md CHANGED
@@ -1,17 +1,60 @@
1
1
  # @1doc/1ds-react
2
2
 
3
- ## 2.14.0
3
+ ## 2.15.0
4
4
 
5
5
  ### Minor Changes
6
6
 
7
- - aca81ec: Ajustes pedidos na migração de produto para o 1DS, e um componente novo.
7
+ - 7e46f1c: Avatar: volta sozinho para as iniciais quando a foto falha, e a prop `name` gera as iniciais ("Cris Lima" → "CL") e o nome acessível.
8
+ - 7e46f1c: Dropdown: `onSelect` em cada item, e campos próprios no item (`command`, `payload`...) que voltam no `onSelect` sem cast.
9
+ - 7e46f1c: EmptyState: `fill` para ocupar e centralizar no espaço disponível (o vazio de uma coluna que rola); no List, `emptyFill`.
10
+ - 7e46f1c: ListItem: `variant="primary"` (item em destaque, azul-claro com hover próprio) e `liClassName`/`liStyle` para o `li`, para entrada escalonada.
11
+ - 532cc7f: feat(tokens)!: sombras e tipografia espelham a biblioteca "Design tokens — Redesign" do Figma
12
+
13
+ QUEBRA a API dos tokens de sombra e de tipografia semântica. Como os tokens estão em 0.x, sai como minor.
14
+
15
+ **Sombras** — 18 tokens `--umds-semantic-shadow-{bottom,top,center}-{xs,sm,md,lg,xl,2xl}`, um para cada estilo
16
+ `Shadow/<Direção>/<Tamanho>` do Figma.
17
+ - Saem `--umds-semantic-shadow-xs|sm|md|lg`: troque por `--umds-semantic-shadow-bottom-xs|sm|md|lg` (mesmo valor).
18
+ - Saem os primitivos `--umds-primitive-shadow-level-1..4`, que não existem no Figma. Equivalência usada no core:
19
+ `level-1` → `bottom-md`, `level-2` → `bottom-lg`, `level-3` → `bottom-xl`, `level-4` → `bottom-2xl`.
20
+ Muda o visual de `Box` (`shadow="level1|2|3"`, a prop continua igual), `Tooltip`, `Chart` (tooltip) e `Coachmark`.
21
+ - Sombra por componente, decisão de design:
22
+ - `BottomSheet` (painel e rodapé) e `BottomNavigation` (barra `raised`): `shadow-top-sm`, a sombra sobe a partir da borda de baixo.
23
+ - `Modal` e `ConfirmDialog`: `shadow-center-xl`. O rodapé fixo do `Modal` troca o literal `0 -4px 16px rgba(0,0,0,.08)` por `shadow-top-md`.
24
+ - Listas dos campos de formulário (`Select`, `MultiSelect`, `Combobox`, `DatePicker`, `TimePicker`, `PhoneInput`): `shadow-bottom-md`.
25
+
26
+ **Tipografia** — os papéis semânticos passam a ser os do Figma, cada um com cinco pesos:
27
+ `--umds-semantic-typography-<papel>-{font-size,line-height,letter-spacing}` e
28
+ `--umds-semantic-typography-<papel>-font-weight-{light,regular,medium,semibold,bold}`, com `<papel>` em `giant`,
29
+ `display`, `heading-h1..h4`, `title-lg|md|sm`, `paragraph`, `label` e `caption`.
30
+ - Saem `display-giant`, `display-lg`, `heading-h5`, `heading-h6`, `body-*` e `label-lg|md|sm`, e o `font-weight` único
31
+ de cada papel. Equivalências: `display-giant` → `giant`, `display-lg` → `display`, `heading-h5` → `title-lg`,
32
+ `heading-h6` → `title-md`, `body-lg` → `title-md`, `body-md` → `title-sm`, `body-sm` → `paragraph`,
33
+ `label-md` → `label`, `label-sm` → `caption`, `label-lg` → `title-sm`.
34
+ - Valores alinhados ao Figma: `giant` e `display` com entrelinha 120% e espaçamento −0,01em (eram 100% e −0,02em);
35
+ `label` com entrelinha 133% e 0,02em; `caption` em 170%.
36
+ - Nenhum componente usava os tokens semânticos de tipografia; `Text` e os demais seguem nos primitivos, sem mudança.
37
+
38
+ Atualize `@1doc/1ds-tokens` para a 0.8.0 junto com o react ou o vue: o CSS dos componentes usa os nomes novos e, com os tokens antigos, as sombras somem. A faixa do peer segue `>=0.1.0` (o changesets exige que ela inclua a versão atual; ver `.agent/troubleshooting/tokens-peerdep-forca-major.md`).
39
+
40
+ ### Patch Changes
8
41
 
9
- - **Counter** (novo): número que conta até o valor, para KPI de painel e total de páginas. Formato do `Intl.NumberFormat` (pt-BR por padrão), `prefix`/`suffix`/`decimals`, largura do valor final reservada, leitor de tela ouvindo só o valor final e respeito a `prefers-reduced-motion`.
10
- - **ListItem**: slot `actions`, renderizado no `li` ao lado do elemento clicável (o ⋮ de menu deixa de ficar dentro do link). No Vue, o ListItem com `li` passa a ter raiz única, então funciona dentro de `TransitionGroup`.
11
- - **Tooltip**: a cópia escondida do texto não escapa mais de área com rolagem (o wrapper ganhou `position: relative`), e a seta acompanha o gatilho quando o balão é empurrado para caber perto da borda.
12
- - **Dropdown**: `href`, `target` e `rel` no `DropdownItem`. Com `href`, o item é um `<a role="menuitem">` (Ctrl+clique e nova aba funcionam), e o `onSelect` continua sendo chamado.
13
- - **Button**: `href`, `target` e `rel`. Com `href`, o Button é um `<a>` com a mesma aparência; desabilitado, volta a ser `<button disabled>`. O hover do `variant="icon"` virou uma camada translúcida da cor do ícone: no fundo claro o cinza é o mesmo de antes, e sobre fundo colorido não vira mais um quadrado branco.
14
- - **StatCard**: `secondaryTone` (cor da segunda medida), `loading` (os números viram Skeleton e o cartão ganha `aria-busy`) e `value` aceitando um nó, como um `Counter` (slot `value` no Vue).
42
+ - 7e46f1c: AppShell: o conteúdo herda a cor de texto do tema. No tema escuro, um título sem `color` não fica mais preto.
43
+ - 7e46f1c: StatCard: borda e superfície do Card (`neutral-light-medium` e `background-elevated`). Lado a lado com um Card, o contorno é o mesmo, e no tema escuro o fundo é o elevado.
44
+ - 7e46f1c: StatCard: abaixo de 240px de largura a segunda medida desce para a linha de baixo, em vez de se sobrepor à principal. O cartão com segunda medida ocupa a largura do pai.
45
+ - 7e46f1c: Tooltip: no tema escuro o balão padrão usa a superfície elevada e ganha o traço do Card, e não some mais no fundo. Nos temas claros e no alto contraste nada muda.
46
+ - 7e46f1c: Vue: o `index.d.ts` não declara mais `GlobalComponents`, que colidia com o PrimeVue e quebrava o `vue-tsc` em telas que nem usam o 1DS. Quem registra o 1DS com `app.component` liga a declaração com `"types": ["@1doc/1ds-vue/global"]`.
47
+
48
+ ## 2.14.0
49
+
50
+ ### Minor Changes
51
+
52
+ - aca81ec: Counter (novo): número que conta até o valor, para KPI de painel e total de páginas. Formato do `Intl.NumberFormat` (pt-BR por padrão), `prefix`/`suffix`/`decimals`, largura do valor final reservada, leitor de tela ouvindo só o valor final e respeito a `prefers-reduced-motion`.
53
+ - aca81ec: ListItem: slot `actions`, renderizado no `li` ao lado do elemento clicável (o ⋮ de menu deixa de ficar dentro do link). No Vue, o ListItem com `li` passa a ter raiz única, então funciona dentro de `TransitionGroup`.
54
+ - aca81ec: Tooltip: a cópia escondida do texto não escapa mais de área com rolagem (o wrapper ganhou `position: relative`), e a seta acompanha o gatilho quando o balão é empurrado para caber perto da borda.
55
+ - aca81ec: Dropdown: `href`, `target` e `rel` no `DropdownItem`. Com `href`, o item é um `<a role="menuitem">` (Ctrl+clique e nova aba funcionam), e o `onSelect` continua sendo chamado.
56
+ - aca81ec: Button: `href`, `target` e `rel`. Com `href`, o Button é um `<a>` com a mesma aparência; desabilitado, volta a ser `<button disabled>`. O hover do `variant="icon"` virou uma camada translúcida da cor do ícone: no fundo claro o cinza é o mesmo de antes, e sobre fundo colorido não vira mais um quadrado branco.
57
+ - aca81ec: StatCard: `secondaryTone` (cor da segunda medida), `loading` (os números viram Skeleton e o cartão ganha `aria-busy`) e `value` aceitando um nó, como um `Counter` (slot `value` no Vue).
15
58
 
16
59
  ## 2.13.1
17
60
 
@@ -69,7 +112,6 @@
69
112
 
70
113
  REMOÇÃO de token, não acréscimo. O DS não cria token novo: a família monoespaçada (introduzida no 0.6.0) volta a não
71
114
  existir. Como estamos em 0.x, a remoção sai como minor nos tokens.
72
-
73
115
  - `Kbd` e `CodeBlock` passam a usar `--umds-semantic-font-family-base`: o texto da tecla e do código sai na fonte do DS,
74
116
  não mais monoespaçada (muda a largura dos caracteres; o espaço e as quebras de linha do `CodeBlock` seguem mantidos).
75
117
  - `RichTextEditor`: a opção "Monoespaçada" da ferramenta `fontFamily` sai (o label `fontFamilyMono` também). Fica só a
@@ -98,7 +140,6 @@
98
140
  ```
99
141
 
100
142
  - 9c8baa3: feat(badge): `2xs` com 8px de padding lateral; `attached` com 22px e o tom escuro como opção (`attachedTone`)
101
-
102
143
  - `size="2xs"`: o padding lateral passa de 4px a 8px, como o selo do CrisDoc. A altura segue em 16px e a fonte em 10px.
103
144
  - `attached`: o rótulo colado tem altura mínima de 22px (24 - 2) de qualquer tamanho; o `md` (padrão) já media 22 e
104
145
  o `xs` e o `2xs` colados sobem a ele.
@@ -148,7 +189,6 @@
148
189
  continua valendo para os tours com mais passos. O botão do último passo segue sendo "Concluir" (`finishLabel`).
149
190
 
150
191
  - ad47648: feat(datatable): `density="compact"` com cabeçalho e linha de 44px, e tom por linha (`rowTone`)
151
-
152
192
  - `density="compact"`: `th` e `td` ganham `height` igual à altura de campo do DS (44px), no lugar dos 38 e 49 de
153
193
  antes. É mínimo: conteúdo mais alto (avatar, botão) estica a linha. A tabela de documento (`variant="document"`)
154
194
  continua justa.
@@ -219,7 +259,6 @@
219
259
  - bf81dfa: feat(select): a lista do filtro tem a largura do gatilho, com `listMinWidth` e sem passar da janela
220
260
 
221
261
  Regressão do 2.10 no `Select variant="filter"` (a lista do Marcadores da inbox media 556px e passava 17px da borda):
222
-
223
262
  - Causa: o wrapper do filtro tinha `width: auto` e é `display: flex` (bloco), então se esticava até a largura do pai;
224
263
  o `100%` da lista passava a ser a do pai e não a do gatilho. Agora é `fit-content`.
225
264
  - A lista tem a largura do gatilho (nunca menor), cresce até o conteúdo e fica dentro da janela: o campo de busca
@@ -242,7 +281,6 @@
242
281
  - cfe3687: feat(select): `item` com o escopo da opção, na lista e no gatilho
243
282
 
244
283
  O conteúdo de cada opção agora recebe a opção nos dois frameworks:
245
-
246
284
  - Vue: o slot `#item="{ optionData }"` (o Mitosis gerava `<slot name="item">` sem escopo e o `optionData` chegava `undefined`; o
247
285
  `postbuild.js` passa `optionData` e o apelido `option`).
248
286
  - React: `item` pode ser uma função `({ optionData }) => nó` (antes, a função virava filho inválido). O nó solto, sem escopo,
@@ -381,7 +419,6 @@
381
419
  - 82e85c5: feat(datatable): cabeçalho escuro, zebra, destaque de linha, vazio com ícone, `hideHeader` e linhas hierárquicas (`treeData`)
382
420
 
383
421
  Tudo opt-in; sem as props novas a tabela é a mesma.
384
-
385
422
  - `headerVariant="dark"`: cabeçalho navy com texto claro (`background-dark` e
386
423
  `neutral-light-pure`, então o tema acompanha). `headerUppercase`: caixa alta
387
424
  nos rótulos, vale para qualquer cabeçalho.
@@ -469,7 +506,6 @@
469
506
  ```
470
507
 
471
508
  - 76c0087: feat(listitem): `tooltip`, `standalone` e atributos HTML só no elemento interativo
472
-
473
509
  - `tooltip`: vira o atributo HTML `title` do `button`, `a` ou `div` (a dica nativa do
474
510
  navegador). `title` continua sendo o título da linha, não o atributo.
475
511
  - `standalone`: renderiza sem o `li`, só o elemento interativo, para usar fora de um
@@ -495,7 +531,6 @@
495
531
  - 3500910: feat(richtexteditor): alinhamento, imagem e tabela simples na `toolbar`
496
532
 
497
533
  Opt-in: a barra padrão não muda. Entram na `toolbar` por nome:
498
-
499
534
  - `alignLeft`, `alignCenter`, `alignRight`, `alignJustify`: botões de liga/desliga
500
535
  que seguem o cursor (`aria-pressed`). O valor guarda `text-align` nos blocos.
501
536
  - `image`: abre um painel (como o do link) com o endereço da imagem, o arquivo
@@ -541,7 +576,6 @@
541
576
 
542
577
  Opt-in na `toolbar`: `fontFamily`, `fontSize` e `textColor`. Cada um abre um painel abaixo da
543
578
  barra e aplica ao texto selecionado, embrulhando-o num `<span style="...">`:
544
-
545
579
  - `fontFamily`: padrão ou monoespaçada (`var(--umds-semantic-font-family-base|mono)`), num `Select`.
546
580
  - `fontSize`: 12, 14, 16, 20 e 24px, os degraus da escala do DS (`var(--umds-primitive-font-size-*)`).
547
581
  - `textColor`: a paleta do DS, num `ColorPicker` `xs`; o valor guarda o `var()` do token escolhido.
@@ -584,7 +618,6 @@
584
618
  - 22a79d8: feat(select): `open`/`onOpenChange`, gatilho com ícone e amostra de cor, variantes `search` e `combo`, lista por cima de diálogo e `placement="auto"` que mede o ancestral
585
619
 
586
620
  Tudo opt-in; o Select sem as props novas se comporta como antes, fora de diálogo.
587
-
588
621
  - `open` e `onOpenChange(open)`: a lista controlada de fora. O clique, o teclado,
589
622
  o clique fora, o Esc e a escolha de uma opção avisam o pai, que decide o novo
590
623
  `open`. Sem `open`, o Select abre e fecha sozinho e também avisa. É o que deixa o
@@ -624,7 +657,6 @@
624
657
  - f7fa5dd: feat(select): o filtro no tamanho do CrisDoc, com cor por opção (`option.color`)
625
658
 
626
659
  Para substituir o `FiltroSelect` do app:
627
-
628
660
  - As variantes de filtro (`filter`, `search`, `combo`) nascem no tamanho `sm` (32px, fonte de
629
661
  12px) quando `size` não é passado; `size="md"` continua valendo. O `Select` padrão não muda.
630
662
  - O gatilho do `filter` tem fundo branco com contorno azul. O azul-claro só vem depois de
@@ -654,7 +686,6 @@
654
686
  ```
655
687
 
656
688
  - b9f0813: feat(statcard): segunda medida (`secondaryValue`/`secondaryLabel`) e `valueTone`
657
-
658
689
  - `secondaryValue` e `secondaryLabel`: a segunda medida do cartão, menor (20px), à direita da
659
690
  principal, separada por um filete ("22,31% Meu Setor | 14,11% Geral"). No HTML vem depois do
660
691
  resto, então o leitor de tela lê a medida principal inteira antes. `0` aparece; vazio e
@@ -676,7 +707,6 @@
676
707
  ```
677
708
 
678
709
  - a4b6bb7: feat(toast): ação (`actionLabel`/`onAction`) e lista de detalhes (`details`)
679
-
680
710
  - `actionLabel` + `onAction`: um botão depois do texto ("Desfazer", "Ver processo").
681
711
  Acionar chama `onAction` e depois fecha o toast (`onClose`). O botão só aparece com os
682
712
  dois. O botão de fechar continua ao lado.
@@ -739,7 +769,6 @@
739
769
  No React o `content` do item já aceitava qualquer nó. No Vue ele era interpolado
740
770
  como texto, então o painel só aceitava string. Agora, no Vue, cada item pode ter
741
771
  um slot com o próprio conteúdo.
742
-
743
772
  - `#content-<id>`: slot com escopo por item (`<id>` é o `id` do item), que recebe
744
773
  `{ item }` e vale sobre o `content` de texto daquele item. Itens sem slot
745
774
  continuam mostrando o texto. O `postbuild` liga o slot ao `Accordion.vue`
@@ -760,7 +789,6 @@
760
789
  - 3d9472d: feat(attachmentcard): `status="ai"`, painel livre (`panel`), `panelWidth` e `closePanelOnAction`
761
790
 
762
791
  Opt-in; sem as props novas o cartão é o mesmo.
763
-
764
792
  - `status="ai"`: selo de recurso de IA, no roxo da IA (`ai-light` / `ai-dark`, os
765
793
  mesmos tokens do `AILabel`), com a varinha como ícone padrão (`statusIcon`
766
794
  continua mandando). O ícone do painel também é a varinha.
@@ -797,7 +825,6 @@
797
825
  - 2c0dafb: feat(avatargroup): `overlap`, `ring` e `overflowCount`
798
826
 
799
827
  Opt-in; sem as props novas o grupo é o mesmo.
800
-
801
828
  - `overflowCount`: quantas pessoas existem além das de `avatars`. O "+N" deixa de
802
829
  exigir N itens-fantasma: com 16 responsáveis, passe os 4 primeiros e
803
830
  `overflowCount={12}`. Soma com o que passar de `max` dentro de `avatars`, e os
@@ -827,7 +854,6 @@
827
854
  Tudo opt-in: sem as props novas, o HTML e o visual são os mesmos.
828
855
 
829
856
  **Badge**
830
-
831
857
  - `size="2xs"`: 16px de altura, fonte de 10px, raio 4. A fonte de 10px não está
832
858
  na escala do DS (o menor degrau é 12px), então é um literal comentado no CSS;
833
859
  se o mínimo de 12px for decisão de acessibilidade, o 2xs é o que sai.
@@ -841,7 +867,6 @@
841
867
  precisa de `position: relative`.
842
868
 
843
869
  **Tag**
844
-
845
870
  - `size="xs"`: 18px (`line-height: 1`, padding 2 e 8, fonte 12, ícone 12). Foi
846
871
  criado um tamanho novo em vez de mexer no `sm` (27px), para não encolher quem
847
872
  já usa `sm`. O × e o ícone clicável mantêm o alvo de 24px com margem negativa.
@@ -864,7 +889,6 @@
864
889
 
865
890
  O `Box` ganha as props de item flex do `Stack` e a troca de elemento, com os
866
891
  mesmos nomes e valores. Sem as props novas, o HTML e as classes são os mesmos.
867
-
868
892
  - `as`: `div` (padrão), `span`, `ul`, `ol`, `li`, `section`, `nav`, `header`,
869
893
  `footer`, `form`. `ul` e `ol` saem sem marcador, margem e recuo (o padding do
870
894
  Box continua valendo) e com `role="list"`. Com `as="form"`, `onSubmit` recebe
@@ -893,7 +917,6 @@
893
917
  sem `Stack` por dentro nem flex no CSS do produto. As cinco props têm os mesmos
894
918
  nomes e valores do `Stack`; qualquer uma delas liga o `display: flex`. Sem
895
919
  nenhuma, o `Box` segue sendo um bloco comum (API antiga intacta).
896
-
897
920
  - `direction`: `"vertical"` (padrão quando o flex está ligado) | `"horizontal"`.
898
921
  - `gap`: degraus da escala, mais `"none"`. Diferente do `Stack`, não tem valor
899
922
  padrão: sem `gap` os filhos ficam colados.
@@ -927,7 +950,6 @@
927
950
 
928
951
  Para barra de ações (editor, filtros, linha de card), onde nenhum botão é a
929
952
  ação principal e o azul atrapalha. Sem as props novas, nada muda.
930
-
931
953
  - `variant="neutral-text"`: texto cinza (`neutral-dark-down`), sem borda e sem
932
954
  fundo; hover em `neutral-light-medium`. O `neutral` continua sendo o
933
955
  contornado cinza, então "neutro" cobre os dois: contornado (`neutral`) e
@@ -951,7 +973,6 @@
951
973
 
952
974
  Peça nova: visão de mês e de semana, com eventos por dia, sem biblioteca de
953
975
  datas (o `Intl` escreve os nomes de mês e de dia).
954
-
955
976
  - `events`: lista plana `{ date, title, color?, time?, id? }`. `date` é
956
977
  `YYYY-MM-DD`, data-hora ISO ou `Date`. A grade agrupa por dia e ordena por
957
978
  `time`.
@@ -1006,7 +1027,6 @@ escondidos)`). O corte é por QUANTIDADE, não por altura. Semana: sete colunas
1006
1027
  - 33719b6: feat(chips): `size="xs"` e × com moldura circular (`circularRemove`)
1007
1028
 
1008
1029
  Opt-in; sem as props novas o `Chips` é o mesmo.
1009
-
1010
1030
  - `size="xs"`: 20px de altura, padding lateral 8, fonte de 12px e × de 8px. A
1011
1031
  altura é `calc(spacing-xxxs + spacing-quarck)` (16 + 4), sem token novo. O
1012
1032
  CrisDoc usa fonte de 11px, que não está na escala do DS; fica o degrau de 12px.
@@ -1033,7 +1053,6 @@ escondidos)`). O corte é por QUANTIDADE, não por altura. Semana: sete colunas
1033
1053
  um cartão, enquanto o resto da página escurece e o alvo fica destacado num
1034
1054
  recorte (uma caixa transparente cuja sombra escurece o resto, sem máscara nem
1035
1055
  SVG).
1036
-
1037
1056
  - `steps`: `{ target?, title, content?, placement? }`. `target` é um seletor CSS
1038
1057
  (`"#aba-fluxos"`), um elemento, uma ref do React (`{ current }`), uma ref do Vue
1039
1058
  (`{ value }`) ou uma função que devolve um deles. Sem alvo (ou alvo que não
@@ -1079,7 +1098,6 @@ escondidos)`). O corte é por QUANTIDADE, não por altura. Semana: sete colunas
1079
1098
  (`--umds-primitive-blue-pure`): guarde o nome e pinte com `var(${valor})`. Como
1080
1099
  primitivo não muda com o tema, a cor escolhida é a mesma no claro e no escuro, o
1081
1100
  que é o certo para cor de dado (marcador, tipo de documento, setor).
1082
-
1083
1101
  - `radiogroup`: Tab entra na amostra escolhida (ou na primeira), setas movem a
1084
1102
  escolha, Home e End vão às pontas, amostra desabilitada é pulada. Cada amostra
1085
1103
  tem nome acessível ("Azul escuro") e a escolhida ganha ícone de marcação e anel
@@ -1110,7 +1128,6 @@ escondidos)`). O corte é por QUANTIDADE, não por altura. Semana: sete colunas
1110
1128
 
1111
1129
  A `DataTable` passa a aceitar markup na célula nos dois frameworks. API antiga
1112
1130
  intacta: sem as props e slots novos, o HTML e as classes são os mesmos.
1113
-
1114
1131
  - Célula livre. No React, `column.render(row, rowIndex)` já devolvia nó e
1115
1132
  continua assim (o docblock agora diz). No Vue, o retorno do `render` continua
1116
1133
  sendo tratado como texto, e a célula com markup vem do slot `#cell-<key>`,
@@ -1156,7 +1173,6 @@ row, rowIndex)` no React, ou o slot `#row-group` (`{ label, row, rowIndex }`)
1156
1173
 
1157
1174
  **`DescriptionList`**, para os pares rótulo/valor (o `DocPares` do CrisDoc não
1158
1175
  cabia na tabela: não tem cabeçalho de coluna). `<dl>` com `<dt>` e `<dd>`:
1159
-
1160
1176
  - `items`: `{ label, value, id? }`. Valor vazio mostra "—" (`emptyValue`).
1161
1177
  - `layout="inline"` (padrão): grade de bordas finas, rótulo pintado e sem quebra
1162
1178
  à esquerda, valor à direita; `fit` encolhe até o conteúdo.
@@ -1181,7 +1197,6 @@ row, rowIndex)` no React, ou o slot `#row-group` (`{ label, row, rowIndex }`)
1181
1197
 
1182
1198
  Para o "Anexar arquivo" de um botão ou o "Alterar foto" de um link, sem a caixa
1183
1199
  de arrastar. Opt-in; `base` e `card` não mudam.
1184
-
1185
1200
  - `variant="trigger"`: o conteúdo que você passa (React: `children`; Vue: slot
1186
1201
  padrão) é o gatilho. O clique nele abre o seletor (o clique sobe até o
1187
1202
  envoltório, então o Enter num `Button` também funciona), e `accept`,
@@ -1207,7 +1222,6 @@ row, rowIndex)` no React, ou o slot `#row-group` (`{ label, row, rowIndex }`)
1207
1222
  - 0e89b88: feat(iconpicker): novo `IconPicker`, a grade de ícones com busca
1208
1223
 
1209
1224
  Peça nova, sem dependência: os ícones vêm por prop.
1210
-
1211
1225
  - `icons`: objetos do Font Awesome importados (`faUser`, `faFolder`...), ou
1212
1226
  `{ icon, label?, keywords? }` quando o nome ou a busca precisam de ajuda. O nome
1213
1227
  de um ícone sem `label` é o `iconName` sem hífen ("file lines"); `iconLabel`
@@ -1241,7 +1255,6 @@ row, rowIndex)` no React, ou o slot `#row-group` (`{ label, row, rowIndex }`)
1241
1255
  ```
1242
1256
 
1243
1257
  - 4d0cb08: feat(input): `onChange` a cada tecla no Vue, `mask`, `iconRight` e `borderless`
1244
-
1245
1258
  - **`onChange` a cada tecla no Vue (paridade com o React).** O campo passa a
1246
1259
  escutar `input` além de `change`. Antes, no Vue, `onChange` só disparava quando
1247
1260
  o campo perdia o foco (o evento `change` nativo). Os dois eventos entram no
@@ -1283,7 +1296,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1283
1296
  semântico; os dois componentes abaixo já o usam.
1284
1297
 
1285
1298
  **`Kbd`**: uma tecla ou uma combinação, em `<kbd>`.
1286
-
1287
1299
  - Uma tecla vai como conteúdo (`<Kbd>Esc</Kbd>`); uma combinação em `keys`
1288
1300
  (`["Ctrl", "Shift", "P"]`), com `separator` entre as teclas (padrão `+`). Cada
1289
1301
  tecla é um `<kbd>` dentro do `<kbd>` do conjunto, que é como o HTML diz
@@ -1292,7 +1304,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1292
1304
  `md`. Raiz única: `title`, `data-*`, `aria-*` e ouvintes chegam ao elemento.
1293
1305
 
1294
1306
  **`CodeBlock`**: trecho de código, JSON ou log, com borda, rolagem e cópia.
1295
-
1296
1307
  - O texto vem por `code` ou como conteúdo, com espaços e quebras mantidos. Linha
1297
1308
  longa rola na horizontal, ou quebra com `wrap`; `maxHeight` (px) limita a
1298
1309
  altura e rola na vertical.
@@ -1317,7 +1328,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1317
1328
  paginação ao redor continuam montados (e o foco no campo de busca não se perde),
1318
1329
  porque só o miolo troca. A lista não conta filhos: `isEmpty` é a decisão de
1319
1330
  quem a usa (`:is-empty="!itens.length"`).
1320
-
1321
1331
  - Texto: `emptyTitle` (padrão "Nenhum item encontrado"), `emptyDescription`,
1322
1332
  `emptyIcon` (objeto do Font Awesome), `emptySize` (`sm` padrão, `md`, `lg`).
1323
1333
  - Ação: `emptyActionLabel` com `onEmptyAction`. Sem o callback o botão não
@@ -1346,7 +1356,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1346
1356
  Peça nova. O `ListItem` é a linha cujo alvo de clique e de foco é a linha
1347
1357
  toda, com conteúdo livre. Renderiza um `<li>` com UM `button`, `a` ou `div`
1348
1358
  dentro, por isso vive num `List` (ou num `ul`/`ol`, como `Stack as="ul"`).
1349
-
1350
1359
  - `as`: `button` | `a` | `div`. Sem `as`, vira `a` quando há `href` e `button`
1351
1360
  nos outros casos. `div` é a linha que só mostra; com `onClick` ganha
1352
1361
  role="button", tabindex 0, Enter e Espaço. `target="_blank"` põe
@@ -1381,7 +1390,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1381
1390
  - eeb6a16: feat(modal): `variant="primary"`, `width`/`maxWidth`, `windowControls` em lista e `responsive`; o Esc respeita quem já o usou
1382
1391
 
1383
1392
  Tudo opt-in; sem as props novas o modal é o mesmo.
1384
-
1385
1393
  - `variant="primary"`: cabeçalho cheio na cor primária (título, subtítulo e
1386
1394
  controles em `neutral-light-pure`, hover em `primary-dark`). É o modal base com
1387
1395
  as três faixas, não o diálogo de feedback.
@@ -1424,7 +1432,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1424
1432
 
1425
1433
  Peça nova: uma árvore desenhada de cima para baixo, com linhas ligando cada pai
1426
1434
  aos filhos, em que os nós com filhos expandem e recolhem. Sem dependência.
1427
-
1428
1435
  - `nodes`: lista de nós raiz `{ id, title, subtitle?, children? }`. Mais de uma
1429
1436
  raiz funciona (floresta).
1430
1437
  - O desenho é calculado, não aninhado (o Mitosis não gera componente recursivo de
@@ -1462,7 +1469,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1462
1469
 
1463
1470
  Peça nova para códigos curtos recebidos por outro canal (autenticação em duas
1464
1471
  etapas, confirmação de e-mail ou telefone).
1465
-
1466
1472
  - `length` caixas (6 por padrão). Digitar avança o foco; Backspace apaga e, em
1467
1473
  caixa vazia, volta e apaga a anterior; setas, Home e End movem.
1468
1474
  - Colar o código inteiro em qualquer caixa distribui os caracteres (um pedaço
@@ -1489,7 +1495,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1489
1495
  ```
1490
1496
 
1491
1497
  - d89ebe3: feat(popover): `maxHeight` para o corpo do painel
1492
-
1493
1498
  - `maxHeight`: altura máxima do corpo, que rola além dela. Número vira px; texto
1494
1499
  vai como CSS (`"60vh"`). `"none"` deixa o corpo crescer com o conteúdo, como
1495
1500
  no painel "Colunas do card" do CrisDoc.
@@ -1509,7 +1514,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1509
1514
  Peça nova, sobre `contenteditable` e `document.execCommand`. Sem dependência
1510
1515
  nova: o primeiro corte é o que as telas de despacho, resposta e descrição de
1511
1516
  serviço pedem.
1512
-
1513
1517
  - Ferramentas: negrito, itálico, sublinhado, tachado, lista com marcadores, lista
1514
1518
  numerada, link, desfazer, refazer e limpar formatação. A barra se escolhe por
1515
1519
  `toolbar` (a ordem do array é a da tela, `"|"` é um separador): a padrão traz
@@ -1556,7 +1560,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1556
1560
  - b02f4ff: feat(select): `placement` (a lista abre para cima) e variante `filter` com opção "sem filtro" e rodapé
1557
1561
 
1558
1562
  Tudo opt-in; sem as props novas o `Select` é o mesmo.
1559
-
1560
1563
  - `placement`: `bottom` (padrão), `top` ou `auto`. O `auto` mede o espaço na hora
1561
1564
  de abrir e abre para cima só se a lista (altura estimada, no máximo os 300px
1562
1565
  do CSS) não cabe embaixo e há mais espaço em cima, como o campo no rodapé de
@@ -1592,7 +1595,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1592
1595
 
1593
1596
  O `Stack` passa a cobrir o que o produto ainda escrevia em CSS próprio. API
1594
1597
  antiga intacta: sem as props novas, o HTML e as classes são os mesmos.
1595
-
1596
1598
  - `gap="none"` zera o espaço (antes só havia os degraus da escala).
1597
1599
  - `as`: `div` (padrão), `span`, `ul`, `ol`, `li`, `section`, `nav`, `header`,
1598
1600
  `footer`, `form`. `ul` e `ol` saem sem marcador, margem e recuo, com
@@ -1626,7 +1628,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1626
1628
  - 1d59843: feat(statcard): `labelPosition="top"` e `infoTooltip`
1627
1629
 
1628
1630
  Opt-in; sem as props novas o `StatCard` é o mesmo.
1629
-
1630
1631
  - `labelPosition="top"`: o rótulo vai para o topo do cartão, acima do ícone e do
1631
1632
  número, e o número passa a 32/800 (o degrau `font-size-lg` do DS), como no
1632
1633
  painel da 1Doc. Só a posição visual muda: no HTML o número continua antes do
@@ -1655,7 +1656,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1655
1656
  muda o layout, e o `Tabs` ganha uma `div` de barra com o mesmo comportamento).
1656
1657
 
1657
1658
  **Tab**
1658
-
1659
1659
  - `count` (número ou texto): pílula de 18px ao lado do texto, azul na aba ativa
1660
1660
  (`primary-pure`) e cinza nas outras (`neutral-light-medium`). O `0` aparece. O
1661
1661
  número entra no nome acessível da aba ("Todas 31").
@@ -1666,7 +1666,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1666
1666
  - `closeLabel`: prefixo do nome acessível do ×, para traduzir ("Close Doc 1").
1667
1667
 
1668
1668
  **Tabs**
1669
-
1670
1669
  - `onAdd(event)`: mostra o "+" logo depois da última aba, **fora** do
1671
1670
  `role="tablist"` (o tablist só pode ter abas). `addLabel` traduz o nome
1672
1671
  ("Adicionar aba" por padrão).
@@ -1690,7 +1689,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1690
1689
  - 96e752b: feat(tooltip): `variant="dark"` compacto e `maxWidth`
1691
1690
 
1692
1691
  Opt-in; sem as props novas o `Tooltip` é o mesmo.
1693
-
1694
1692
  - `variant="dark"`: balão escuro e compacto (padding 4/8, raio 4, teto de 220px)
1695
1693
  para ícone, sigla e botão de barra de ferramentas. Fundo `background-dark` e
1696
1694
  texto `neutral-light-pure`: o par invertido do tema, então o contraste vale nos
@@ -1781,7 +1779,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1781
1779
  regressão silenciosa das props novas (`as`, `gap="none"`...).
1782
1780
 
1783
1781
  Descartados em silêncio, antes desta correção:
1784
-
1785
1782
  - ouvintes: `@click`, `@keydown`, `@dragstart`, `@drop`, `@paste`, `@mousedown`...
1786
1783
  - atributos fora da lista: `tabindex` (minúsculo), `draggable`...
1787
1784
  - `v-show` e o `$el` do `ref` do componente (apontavam para o nó de âncora do
@@ -1816,7 +1813,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1816
1813
  - 0fc7a82: fix(vue): `Text`, `Grid` e `Logo` repassam `title`, `style` e `aria-*`; `Button` e `DataTable` param de sujar o DOM
1817
1814
 
1818
1815
  Quatro defeitos que só existiam no Vue gerado (o React estava certo):
1819
-
1820
1816
  - `Text`, `Grid` e `Logo` descartavam `title`, `style`, `aria-*` e `data-*`. O
1821
1817
  laço `for (k in props)` do `htmlAttrs` compilava para `props.props`, que não
1822
1818
  existe. O passo `postbuild` do core passa a ler `props` e `useAttrs()` (o que
@@ -1846,7 +1842,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
1846
1842
  leitor de tela — ganhou prop. Sem a prop, nada muda: o padrão é o português de
1847
1843
  antes, byte a byte. Com ela, um produto em outro idioma deixa de mostrar ou ler
1848
1844
  português.
1849
-
1850
1845
  - `AILabel`: `sourcesLabel`, `notIncludedLabel`.
1851
1846
  - `AIContent`: `label`, `ariaLabel`, `explanationTitle`, `sourcesLabel`,
1852
1847
  `notIncludedLabel` (repassados ao selo interno, que antes não recebia nenhum).
@@ -2071,7 +2066,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
2071
2066
 
2072
2067
  Família nova de gráficos, sem biblioteca externa: o Mitosis desenha o SVG e o
2073
2068
  resultado é o mesmo no React e no Vue.
2074
-
2075
2069
  - `BarChart` — barras verticais, com séries agrupadas lado a lado e suporte a
2076
2070
  valores negativos (a barra arredonda na ponta do dado, nunca na base).
2077
2071
  - `LineChart` — uma ou mais séries; `null` interrompe a linha em vez de cair a
@@ -2190,7 +2184,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
2190
2184
 
2191
2185
  E no `Dropdown`, dois defeitos de gatilho achados ao escrever o teste — mesma
2192
2186
  raiz, o `<span>` wrapper não é o gatilho real:
2193
-
2194
2187
  - o **Escape fechava o menu e largava o foco no `<body>`**: quem recebia o
2195
2188
  `focus()` era o wrapper, que fica sem `tabindex` quando o slot já traz um
2196
2189
  `Button`, e `focus()` num span sem tabindex é no-op;
@@ -2208,7 +2201,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
2208
2201
  ### Minor Changes
2209
2202
 
2210
2203
  - 3d2977e: fix(app-header): menu do usuário fora do botão, ícones sem registro e barra que não estoura
2211
-
2212
2204
  - O bloco do usuário vira um `<button>` de verdade (Enter/Espaço nativos) e o
2213
2205
  `userMenu` é renderizado ao lado dele, não dentro — clicar no menu não
2214
2206
  dispara mais `onUserClick`. Prop nova `userMenuOpen` liga `aria-haspopup` e
@@ -2307,14 +2299,12 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
2307
2299
 
2308
2300
  Agora, sem `variant`, o `Modal` é o modal base da 1Doc — o "Criar Novo
2309
2301
  Documento", medido em `NovoDocumentoModal.css`:
2310
-
2311
2302
  - **cabeçalho fixo** com título (16/700), subtítulo (12px) e divisor;
2312
2303
  - **corpo**, o único que rola;
2313
2304
  - **rodapé fixo** com divisor, sombra que o levanta, região de apoio à esquerda
2314
2305
  e ações à direita.
2315
2306
 
2316
2307
  Props novas:
2317
-
2318
2308
  - `windowControls` — restaurar · expandir · tela cheia · minimizar, antes do ×.
2319
2309
  É tudo ou nada: ou o modal tem só o ×, ou o conjunto inteiro. Ligado, o modal
2320
2310
  muda de tamanho sozinho (780px · 1120px · tela cheia).
@@ -2466,7 +2456,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
2466
2456
  - fa15735: **App shell: `AppShell`, `AppHeader` e `AppSidebar`.**
2467
2457
 
2468
2458
  Era a maior lacuna apontada pela auditoria interna — o padrão de layout da 1Doc estava escrito e mesmo assim cada produto o reconstruía do zero. Só no protótipo são ~1.000 linhas entre `App.tsx`, `Header.tsx`, `Subheader.tsx` e CSS.
2469
-
2470
2459
  - **`AppShell`** — a moldura. Cabeçalho e barra não rolam; só o conteúdo rola. Traz as duas linhas que faltam em quase toda implementação manual: `min-height: 0` (sem ela a rolagem escapa para o body e o header "fixo" sobe junto) e `min-width: 0` (sem ela uma tabela larga empurra o layout inteiro).
2471
2460
  - **`AppHeader`** — barra de 56px com marca, navegação e ações. O que vai dentro é do produto.
2472
2461
  - **`AppSidebar`** — 48px fechada, 248px aberta. Com a barra fechada o rótulo **continua no HTML**, só sai da vista: trocá-lo por um ícone solto deixaria a navegação muda para leitor de tela.
@@ -2476,7 +2465,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
2476
2465
  **Paridade com o protótipo: 16 de 22 medidas batem exatamente.** As 6 restantes não têm valor exato na escala do DS — nos casos de espaço e tamanho, os dois degraus vizinhos ficam à mesma distância do protótipo, e bater com ele exigiria inventar token. A regra aplicada foi cor e medida sempre 100% do design system, escolhendo o valor mais próximo. A conta é refeita com `node scripts/verifica-paridade-shell.mjs`.
2477
2466
 
2478
2467
  - 2a86d8c: Três componentes novos na trilha **Preview**, para telas onde parte do conteúdo ou parte da decisão vem de um modelo:
2479
-
2480
2468
  - **`AILabel`** — selo de conteúdo gerado, com painel de explicabilidade que responde de onde veio, o que não entrou e o que fazer se estiver errado.
2481
2469
  - **`AIContent`** — envolve conteúdo gerado. Quando o usuário edita, o tratamento de IA **sai**: a partir dali o texto é dele, e manter a marca atribuiria autoria errada. Mantém a ação de reverter para a sugestão.
2482
2470
  - **`ConfirmAIAction`** — conteúdo para o `ConfirmDialog` quando a ação foi sugerida por IA. Escalona a confirmação pelo risco e lista o que será afetado. Cascata conta como risco alto mesmo com cada passo reversível.
@@ -2488,7 +2476,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
2488
2476
  - 7c44c6d: **As peças que faltavam para reproduzir a tela da 1Doc:** `AppSubheader`, `SidePanel`, `AppNavItem` e `StatCard`, somadas ao `AppShell`, `AppHeader` e `AppSidebar`.
2489
2477
 
2490
2478
  Levantadas medindo o protótipo, não por suposição: o `SidePanel` tem 254px porque é o número do protótipo, o mesmo na Emissão e nas Tarefas; o `AppSubheader` tem 42px pelo mesmo motivo. Toda a geometria virou token `--umds-semantic-shell-*`.
2491
-
2492
2479
  - **`AppNavItem`** — o item da navegação horizontal do topo: rótulo, contador e seta. O contador aceita `badgeLabel`, porque "9" sozinho não diz nada a quem usa leitor de tela.
2493
2480
  - **`AppSubheader`** — a barra de contexto: trilha à esquerda, setor e ações à direita.
2494
2481
  - **`SidePanel`** — o painel lateral **da tela** (histórico, filtros), que fecha animando a largura até zero. Não confundir com `AppSidebar`: na 1Doc a navegação do app é horizontal, e o que fica à esquerda é sempre um destes.
@@ -2506,7 +2493,6 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
2506
2493
  O `tabIndex` continua: quem navega por teclado alcança a linha e Enter/Espaço acionam, igual a antes. O que muda é só o anúncio — que, dentro de uma tabela, já estava errado.
2507
2494
 
2508
2495
  - 2bc13c1: Três falhas de comportamento apontadas pela auditoria interna, todas verificadas na tela:
2509
-
2510
2496
  - **`DataTable`** — com `selectable` e `onRowClick` juntos, o Espaço dentro do checkbox era engolido pelo `preventDefault` do handler da linha e acionava a linha inteira: marcar por teclado era impossível. O caminho do mouse já tinha a guarda equivalente; só o teclado ficou de fora.
2511
2497
  - **`DatePicker`** — o foco nunca entrava no painel. `ArrowDown` abria o calendário e o teclado ficava inerte, porque o painel vive num Portal e o Tab a partir do gatilho ia para o resto da página. O alvo do foco passou a ser o dia marcado pelo roving tabindex, que é a verdade do DOM no instante em que o frame roda — o seletor anterior lia um valor de estado da closure do render anterior, que ao abrir ainda era o antigo.
2512
2498
  - **`BottomSheet`** — o listener global de `keydown` era registrado a cada montagem e nunca removido, acumulando ao trocar de tela, em StrictMode e em navegação por rotas. Junto, o id da instância passou a ser gerado no inicializador: um painel que montasse já com `open=true` registrava id vazio na pilha de overlays e o Esc não fechava.
@@ -2653,13 +2639,11 @@ Menlo, Consolas, 'Liberation Mono', monospace`). É a pilha de fontes do sistema
2653
2639
  - 445de52: feat(icon): nova API dinâmica, remoção do Font Awesome Pro e tipagem extensível
2654
2640
 
2655
2641
  **Breaking change** — a prop `name` foi removida do `<Icon>`. Use `icon` no lugar, que aceita três formatos:
2656
-
2657
2642
  - string: `<Icon icon="home" />`
2658
2643
  - tupla `[prefix, iconName]`: `<Icon icon={["fas", "home"]} />`
2659
2644
  - objeto `IconLookup` (ex.: `<Icon icon={faHome} />`)
2660
2645
 
2661
2646
  **Novas props:**
2662
-
2663
2647
  - `transform`: aceita string (parseada via `faParse.transform`) ou objeto `Transform` do FA core.
2664
2648
  - `mask` / `maskId`: ícone de máscara (suporta os mesmos formatos de `icon`).
2665
2649
  - `symbol`: cria `<symbol>` reutilizável (`FaSymbol` do FA core).
@@ -105,7 +105,7 @@
105
105
  border: 1px solid var(--umds-semantic-color-ai-light);
106
106
  border-radius: var(--umds-primitive-border-radius-sm);
107
107
  background-color: var(--umds-semantic-color-neutral-light-pure);
108
- box-shadow: var(--umds-semantic-shadow-sm);
108
+ box-shadow: var(--umds-semantic-shadow-bottom-sm);
109
109
  color: var(--umds-semantic-color-neutral-dark-pure);
110
110
  font-size: var(--umds-primitive-font-size-xxs);
111
111
  line-height: 1.5;
@@ -38,7 +38,7 @@
38
38
  z-index: var(--umds-semantic-layer-toast); /* 1500 - camada de notificação */
39
39
  width: 420px;
40
40
  max-width: calc(100vw - 32px);
41
- box-shadow: var(--umds-semantic-shadow-md); /* protótipo --shadow-md */
41
+ box-shadow: var(--umds-semantic-shadow-bottom-md); /* protótipo --shadow-md */
42
42
  }
43
43
 
44
44
  .umds-alert--top-right {
@@ -31,6 +31,10 @@
31
31
  display: flex;
32
32
  flex-direction: column;
33
33
  background-color: var(--umds-semantic-color-background-light);
34
+ /* Cor de texto do tema para tudo o que herda (um Text sem `color`, um título
35
+ solto num Stack). Sem ela o conteúdo herdava o preto padrão do navegador,
36
+ e no tema escuro o texto sumia no fundo escuro. */
37
+ color: var(--umds-semantic-color-neutral-dark-pure);
34
38
  font-family: var(--umds-semantic-font-family-base);
35
39
  }
36
40
 
@@ -36,7 +36,7 @@
36
36
  /* Mesmo hover do `Card hoverable`: realce de borda + sombra. */
37
37
  .umds-attachment-card--interativo:hover {
38
38
  border-color: var(--umds-semantic-color-primary-medium);
39
- box-shadow: var(--umds-semantic-shadow-md);
39
+ box-shadow: var(--umds-semantic-shadow-bottom-md);
40
40
  }
41
41
 
42
42
  /* ── selo de situação ──────────────────────────────────────────────────── */
@@ -129,7 +129,7 @@
129
129
  border: 1px solid var(--umds-semantic-color-neutral-light-medium);
130
130
  border-radius: var(--umds-primitive-border-radius-sm);
131
131
  background-color: var(--umds-semantic-color-background-elevated);
132
- box-shadow: var(--umds-semantic-shadow-md);
132
+ box-shadow: var(--umds-semantic-shadow-bottom-md);
133
133
  font-family: var(--umds-semantic-font-family-base);
134
134
  color: var(--umds-semantic-color-neutral-dark-pure);
135
135
  }
@@ -7,11 +7,16 @@ import './Avatar.css';
7
7
  export interface AvatarProps {
8
8
  /**
9
9
  * URL da imagem. Se fornecida, o tipo será automaticamente 'Photo' visualmente.
10
- * O componente NÃO faz fallback automático quando a imagem falha ao
11
- * carregar: ele emite `onError` e o consumidor decide (ex.: limpar o
12
- * `src` para exibir as iniciais via `children`).
10
+ * Se a imagem falhar ao carregar, o avatar volta sozinho para as iniciais
11
+ * (`name` ou `children`) e emite `onError`. Um `src` novo tenta de novo.
13
12
  */
14
13
  src?: string;
14
+ /**
15
+ * Nome da pessoa: gera as iniciais (primeira letra do primeiro e do último
16
+ * nome, "Cris Lima" → "CL") e vira o nome acessível quando não há
17
+ * `ariaLabel`. Com `name`, as iniciais vêm dele, no lugar de `children`.
18
+ */
19
+ name?: string;
15
20
  /**
16
21
  * Texto alternativo para a imagem (acessibilidade).
17
22
  */