@aurea-uds/core 0.54.1 → 0.59.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 (2) hide show
  1. package/dist/aurea.css +113 -16
  2. package/package.json +1 -1
package/dist/aurea.css CHANGED
@@ -381,7 +381,9 @@
381
381
  --field-bg:oklch(0.19 0.02 250);
382
382
  --ring:oklch(0.72 0.19 48);
383
383
  --focus:oklch(0.72 0.19 48);
384
- --focus-strong:oklch(0.85 0.14 60);
384
+ --focus-strong:oklch(0.72 0.19 48);
385
+ --link:oklch(0.72 0.19 48);
386
+ --link-hover:oklch(0.78 0.17 50);
385
387
  --selection:oklch(0.32 0.08 50);
386
388
  --control-selected:oklch(0.72 0.19 48);
387
389
  --control-selected-foreground:oklch(1 0 0);
@@ -452,7 +454,7 @@
452
454
  --field-bg:oklch(1 0 0);
453
455
  --ring:oklch(0.682 0.197 44.5);
454
456
  --focus:oklch(0.682 0.197 44.5);
455
- --focus-strong:oklch(0.52 0.17 45);
457
+ --focus-strong:#ff6600;
456
458
  --selection:oklch(0.96 0.04 60);
457
459
  --control-selected:oklch(0.682 0.197 44.5);
458
460
  --control-selected-foreground:oklch(1 0 0);
@@ -484,8 +486,8 @@
484
486
  --warning-bg:oklch(0.95 0.06 80);
485
487
  --danger-bg:oklch(0.95 0.05 25);
486
488
  --info-bg:oklch(0.95 0.04 235);
487
- --link:oklch(0.52 0.106 86.047);
488
- --link-hover:oklch(0.44 0.106 86.047);
489
+ --link:oklch(0.682 0.197 44.5);
490
+ --link-hover:oklch(0.63 0.197 44.5);
489
491
  --brand-yellow-ink:#242424;
490
492
  --warning-foreground:#242424;
491
493
  --control-thumb:var(--primary-mark);
@@ -1096,6 +1098,15 @@
1096
1098
  --card-pad:1.25rem;
1097
1099
  --section-gap:2rem;
1098
1100
  }
1101
+ [data-text="lg"]{
1102
+ --text-xs:0.875rem;
1103
+ --text-sm:1rem;
1104
+ --text-base:1.125rem;
1105
+ --text-lg:1.25rem;
1106
+ --text-xl:1.375rem;
1107
+ --text-2xl:1.625rem;
1108
+ --control-h-md:var(--target-min);
1109
+ }
1099
1110
  /* Aurea core — component styles. Built with @aurea-uds/tokens into dist/aurea.css. Load @aurea-uds/fonts/css for Inter, Sora and IBM Plex Mono (ADR-0077). */
1100
1111
  /* ========================================================================== */
1101
1112
  /* 02. RESET, ACESSIBILIDADE E BASE */
@@ -2623,13 +2634,16 @@ img,svg { display:block; }
2623
2634
  que um grupo vertical tem de não ter. */
2624
2635
  .btn-group-vertical { flex-direction:column; align-items:stretch; --btn-group-h:0; --btn-group-v:var(--radius-full); --btn-group-sep-i:25%; --btn-group-sep-b:0; --btn-group-sep-w:50%; --btn-group-sep-h:var(--border-width); --btn-group-bi:var(--border-width); --btn-group-bb:0; }
2625
2636
  :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn { position:relative; border-radius:0; }
2626
- :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn:first-child { border-start-start-radius:var(--radius-full); border-end-start-radius:var(--btn-group-h); border-start-end-radius:var(--btn-group-v); }
2627
- :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn:last-child { border-end-end-radius:var(--radius-full); border-start-end-radius:var(--btn-group-h); border-end-start-radius:var(--btn-group-v); }
2628
- :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn:only-child { border-radius:var(--radius-full); }
2629
- :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn + .btn::before { content:""; position:absolute; inset-inline-start:var(--btn-group-sep-i); inset-block-start:var(--btn-group-sep-b); inline-size:var(--btn-group-sep-w); block-size:var(--btn-group-sep-h); border-radius:var(--radius-full); background:currentColor; opacity:.15; pointer-events:none; }
2637
+ /* O PRIMEIRO e o ÚLTIMO BOTÃO, e não o primeiro e o último filho (o Victor, 04/11/2026: "quando clico botão fica quadrado"): com
2638
+ um menu aberto, o motor dele põe marcadores de foco invisíveis ao lado do gatilho, e a setinha de um botão dividido deixava
2639
+ de ser o último filho — perdia a ponta redonda e a linha do meio. `:where()` mantém a força de antes. */
2640
+ :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn:where(:not(.btn ~ .btn)) { border-start-start-radius:var(--radius-full); border-end-start-radius:var(--btn-group-h); border-start-end-radius:var(--btn-group-v); }
2641
+ :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn:where(:not(:has(~ .btn))) { border-end-end-radius:var(--radius-full); border-start-end-radius:var(--btn-group-h); border-end-start-radius:var(--btn-group-v); }
2642
+ :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn:where(:not(.btn ~ .btn):not(:has(~ .btn))) { border-radius:var(--radius-full); }
2643
+ :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn ~ .btn::before { content:""; position:absolute; inset-inline-start:var(--btn-group-sep-i); inset-block-start:var(--btn-group-sep-b); inline-size:var(--btn-group-sep-w); block-size:var(--btn-group-sep-h); border-radius:var(--radius-full); background:currentColor; opacity:.15; pointer-events:none; }
2630
2644
  :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn:active:not(:disabled) { transform:none; }
2631
- :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn-outline:not(:last-child) { border-inline-end-width:var(--btn-group-bi); border-block-end-width:var(--btn-group-bb); }
2632
- :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn-outline:not(:first-child) { border-inline-start-width:var(--btn-group-bi); border-block-start-width:var(--btn-group-bb); }
2645
+ :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn-outline:where(:has(~ .btn)) { border-inline-end-width:var(--btn-group-bi); border-block-end-width:var(--btn-group-bb); }
2646
+ :is(.btn-group:not(.btn-group-detached),.toggle-group:not(.toggle-group-detached)) > .btn-outline:where(.btn ~ .btn) { border-inline-start-width:var(--btn-group-bi); border-block-start-width:var(--btn-group-bb); }
2633
2647
  /* o anel de foco de um botão do meio fica por cima dos vizinhos, e não por baixo */
2634
2648
  :is(.btn-group,.toggle-group) > .btn:focus-visible { z-index:1; }
2635
2649
  .btn-group-detached,.toggle-group-detached { flex-wrap:wrap; gap:var(--space-1); }
@@ -3147,8 +3161,8 @@ img,svg { display:block; }
3147
3161
  .slider-color .slider-thumb { box-sizing:border-box; inline-size:var(--space-4); block-size:var(--space-4); align-self:center; border:0; background:var(--color-checker) center/var(--space-2) var(--space-2); box-shadow:inset 0 0 0 var(--space-4) var(--slider-thumb-color,var(--primary)), var(--shadow-md); forced-color-adjust:none; }
3148
3162
  .slider-color .slider-thumb::after { content:none; }
3149
3163
  .slider-color[data-orientation="vertical"] .slider-thumb { inline-size:var(--space-4); block-size:var(--space-4); }
3150
- /* COLORAREA (0.32.0, ADR-0069) — a área de cor. A pintura (o gradiente, a ÚNICA exceção à ADR-0007) chega pela
3151
- variável que o componente põe (`--color-area-fill`): esta folha não escreve gradiente nenhum (check 4).
3164
+ /* COLORAREA (0.32.0, ADR-0069) — a área de cor. A pintura (o gradiente) chega pela
3165
+ variável que o componente põe (`--color-area-fill`).
3152
3166
  Medidas da referência, lidas no CSS publicado dela (3.2.6): quadrada, até 224 de largura, canto 16; o pino de
3153
3167
  16 que cresce para 20 ao arrastar, com o anel de 3. 224 não tem token: sai de dois `--space-24` e um `--space-8`.
3154
3168
  O anel é BRANCO nos dois temas, e não um token de tema: ele fica sobre a cor escolhida, e não sobre a página.
@@ -3648,6 +3662,17 @@ img,svg { display:block; }
3648
3662
  .tabs-secondary .tab { border-radius:0; }
3649
3663
  .tabs-secondary .tab.active,.tabs-secondary .tab[data-active] { background:transparent; box-shadow:none; color:var(--foreground); }
3650
3664
  .tabs-secondary .tab[data-active]::after { display:block; }
3665
+ /* O ESCOLHIDO DESLIZA (S-04, 05/11/2026): no `SegmentedControl` e no `Tabs` ele PULAVA, porque o fundo do escolhido é
3666
+ pintado no próprio item. A referência tem uma peça separada atrás dos itens, que anda. Aqui o desenho do escolhido NÃO
3667
+ muda (as sete cores do segmento, as treze marcas e os dois temas continuam nas regras de sempre): quando a escolha
3668
+ troca, o gancho `useDeslize` copia a pintura do NOVO escolhido para uma peça de passagem (`.selection-indicator`, atrás
3669
+ dos itens), esconde a do item e a leva da posição de antes até a nova — a cápsula, a sombra, o aro e o fio de baixo,
3670
+ que na aba secundária é o próprio indicador. No fim, a peça sai e o item volta a se pintar. Quem pede "reduzir
3671
+ movimento" vê a troca de uma vez, como antes. A letra troca de cor no mesmo passo, em vez de saltar. */
3672
+ .segmented :is(button,a),.tab { transition:color var(--duration-base) var(--ease-standard); }
3673
+ .selection-indicator { position:absolute; z-index:-1; pointer-events:none; }
3674
+ .selection-indicator > span { position:absolute; }
3675
+ :is(.segmented :is(button,a),.tab)[data-sliding]::after { visibility:hidden; }
3651
3676
  /* `panel="plain"` (MNT-05 e C9, 06/10/2026): o painel sem caixa, como o painel de abas da
3652
3677
  referência. Sem recheio dos lados — o conteúdo começa na linha do que está fora do `Tabs` —, e o
3653
3678
  espaço de cima é o mesmo `space-3` do painel do nativo. Na vertical, quem separa é o `gap` da
@@ -3787,6 +3812,13 @@ img,svg { display:block; }
3787
3812
  .table tbody tr:last-child > :last-child,.table-wrap tbody tr:last-child > :last-child { border-end-end-radius:var(--table-cell-r); }
3788
3813
  .table tr:last-child td,.table-wrap tr:last-child td { border-bottom:0; }
3789
3814
  @media (hover:hover) { .table tbody tr:hover > :is(td,th),.table-wrap tbody tr:hover > :is(td,th) { background:color-mix(in oklab,var(--card) 40%,var(--surface-2)); } }
3815
+ /* A LINHA ENTRE AS FILEIRAS (MNT-38, `dividers` na `Table` e na `DataGrid` — a forma "A", aprovada pela bancada em 05/11/2026,
3816
+ *"Pode, sem a Ember"*): a moldura de sempre e uma linha clara entre as fileiras do corpo, menos depois da última, como a
3817
+ referência (a linha de baixo da célula, a 50% do separador). A borda de baixo da célula já existe, transparente (ADR-0072);
3818
+ a variação só lhe dá cor — o texto a 10%, a mesma linha clara do cartão de contorno —, e nenhuma medida muda. É uma exceção
3819
+ NOMEADA ao sem linha: só com a escolha do app, e só esta regra (`tests/unit/sem-linha.test.tsx`). A Ember fica sem ela. Sem
3820
+ efeito no arranjo `rows`, onde cada fileira já é uma cápsula solta. */
3821
+ :is(.table.table-dividers:not(.table-rows),.datagrid-dividers .table-wrap table) tbody tr:not(:last-child) > :is(td,th):where(:not([data-brand="ember"] *)) { border-bottom-color:color-mix(in oklab,var(--foreground) 10%,transparent); }
3790
3822
  /* AS LINHAS EM CÁPSULA (`Table variant="rows"`, o site B — a lista de membros da página inicial, aprovada pela bancada em
3791
3823
  01/11/2026, o D-7.6): sem a caixa em volta; cada linha é uma cápsula de 54 (`--target-min` + 10), 4 entre elas; com o
3792
3824
  mouse o `--fill-1`; a linha com `data-selected` (a que o app marcou), o amarelo a 14% (18% com o mouse). O cabeçalho em
@@ -3834,6 +3866,9 @@ img,svg { display:block; }
3834
3866
  .table td[data-best],.table-wrap td[data-best] { font-weight:var(--weight-semibold); }
3835
3867
  /* `fit`: sem o mínimo de 720 — a comparação de dois itens cabe num celular de 360. */
3836
3868
  .table.table-fit { min-width:0; }
3869
+ /* E na `DataGrid` (S-02, *"Pode, com fit"*, 05/11/2026): o mesmo `fit` — as tabelas do site, numa coluna de texto de ~680,
3870
+ passavam do mínimo de 720 e saíam cortadas, rolando de lado. */
3871
+ .datagrid-fit .table-wrap table { min-width:0; }
3837
3872
  /* `differencesOnly`: o "Só diferenças" esconde as linhas que o site marcou como iguais. */
3838
3873
  .table-differences-only tr[data-same] { display:none; }
3839
3874
  /* `stickyHeader`: o mesmo mecanismo do `DataGrid` (F6, mais abaixo). A caixa é o contêiner de
@@ -4241,8 +4276,7 @@ button.tag-main { cursor:pointer; }
4241
4276
  /* A CAIXA EMPILHADA (`CodeBlock previewLayout="stacked"`, o site B, 02/11/2026 — o Victor: "preciso que seja fiel a
4242
4277
  referencia", e "Com degradê"; ADR-0089): a peça em cima e o código embaixo, sem a chave Prévia | Código, nas medidas da
4243
4278
  referência — a peça em 350 (3 x 96 + 48 + 12 + 2) com recheio de 40, no fundo da página; o código no cartão, 16 em cima,
4244
- 12 dos lados e 14 embaixo. Mais de 5 linhas: recolhido em 150 (96 + 48 + 4 + 2), sumindo num DEGRADÊ (a 3ª exceção à
4245
- regra sem gradiente, só nesta regra — o check 4 cobra), com o "Expand code" (32, letra 12) a 8 do fundo; aberto, o código
4279
+ 12 dos lados e 14 embaixo. Mais de 5 linhas: recolhido em 150 (96 + 48 + 4 + 2), sumindo num DEGRADÊ, com o "Expand code" (32, letra 12) a 8 do fundo; aberto, o código
4246
4280
  inteiro e o "Collapse code" embaixo dele. Sem linha: a peça e o código se separam pelo fundo. */
4247
4281
  .demo.demo-stacked { display:flex; flex-direction:column; min-block-size:0; padding:0; overflow:hidden; }
4248
4282
  .demo.demo-stacked > .demo-panel { flex:none; }
@@ -4682,6 +4716,14 @@ button.tag-main { cursor:pointer; }
4682
4716
  .sortable-item[data-grabbed] { border-color:transparent; box-shadow:var(--shadow-lg); }
4683
4717
  .sortable-handle { display:grid; place-items:center; min-width:var(--space-6); min-height:var(--space-6); padding:0; border:0; border-radius:var(--radius-sm); background:transparent; color:var(--muted-foreground); cursor:grab; touch-action:none; }
4684
4718
  .sortable-handle[aria-pressed="true"] { cursor:grabbing; color:var(--primary); }
4719
+ /* O ARRASTO QUE ANDA (S-05, 05/11/2026): era "meio estático" — a linha pulava de casa em casa e os vizinhos pulavam junto.
4720
+ Agora a linha pega SEGUE o ponteiro (o `useReorder` a desloca com `translate`, sem transição: é a mão que move) e os
4721
+ vizinhos deslizam para abrir o lugar (o mesmo gancho, pela animação do navegador). A linha pega fica POR CIMA das outras
4722
+ (`z-index`) — e o fundo dela é o do cartão, opaco, então o texto de baixo não aparece através. A sombra de erguer entra
4723
+ e sai em vez de aparecer de uma vez. Quem pede "reduzir movimento": a linha continua seguindo o ponteiro (é
4724
+ manipulação direta, não animação), e os vizinhos trocam de lugar sem deslizar. */
4725
+ :is(.sortable-item,.block-item) { transition:box-shadow var(--duration-base) var(--ease-standard); }
4726
+ :is(.sortable-item,.block-item)[data-dragging] { position:relative; z-index:1; cursor:grabbing; }
4685
4727
  .sortable-label { min-width:0; }
4686
4728
 
4687
4729
  /* EDITOR POR BLOCOS (PLANO-1.0, item N1). A Aurea é dona da MOLDURA; o texto rico de dentro é do
@@ -4902,6 +4944,14 @@ button.tag-main { cursor:pointer; }
4902
4944
  fica preso, então não declaramos modalidade que não entregamos. */
4903
4945
  .command-overlay { position:fixed; inset:0; z-index:var(--z-modal); display:grid; place-items:start center; padding:var(--space-16) var(--space-5) var(--space-5); background:var(--overlay); backdrop-filter:blur(5px); }
4904
4946
  .command-palette { display:grid; gap:var(--space-2); width:min(680px,100%); max-height:100%; overflow:auto; padding:var(--space-4); border:1px solid transparent; border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
4947
+ /* A PALETA ENTRA E SAI (S-04, 05/11/2026), como o `Dialog`: o fundo esmaece e a caixa cresce um pouco, pelos estados
4948
+ de abrir e fechar que o motor marca na moldura (`Viewport`) e na caixa (`Popup`). Fechar é mais rápido que abrir. */
4949
+ .command-overlay { transition:opacity var(--duration-slow) var(--ease-standard); }
4950
+ .command-overlay[data-starting-style],.command-overlay[data-ending-style] { opacity:0; }
4951
+ .command-overlay[data-ending-style] { transition-duration:var(--duration-fast); }
4952
+ .command-palette { transition:scale var(--duration-slow) var(--ease-emphasized); }
4953
+ .command-palette[data-starting-style],.command-palette[data-ending-style] { scale:.95; }
4954
+ .command-palette[data-ending-style] { transition-duration:var(--duration-fast); }
4905
4955
  /* Camadas flutuantes (Base UI): tooltip, popover, menu. z-modal para funcionarem sobre diálogos; empilhamento mútuo pela ordem do portal no DOM. */
4906
4956
  /* 0.32.0, a dica da referência: recheio de 8, letra de 12/16, até 320 de largura, o fundo das janelas
4907
4957
  (era o fundo afundado), e a palavra longa quebra onde precisar. O canto continua o 10 da Aurea (o
@@ -4935,7 +4985,25 @@ button.tag-main { cursor:pointer; }
4935
4985
  e `--space-1` de respiro. Vale para toda lista que usa `.menu`: Combobox, MultiCombobox,
4936
4986
  DropdownMenu, ContextMenu, Menubar e a lista da CommandPalette. */
4937
4987
  .menu { --menu-px:10px; z-index:var(--z-modal); min-width:200px; max-width:min(320px,calc(100vw - 32px)); padding:var(--space-1); border:1px solid transparent; border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
4988
+ /* O MENU ENTRA E SAI (S-04, 05/11/2026): aparecia de uma vez. Como o `Popover` e a dica daqui, e como a lista da
4989
+ referência: esmaece e cresce um pouco a partir do lado do gatilho (`--transform-origin`, que o motor publica), pelos
4990
+ estados de abrir e fechar que o motor marca (`data-starting-style`/`data-ending-style`). Vale para toda lista `.menu`
4991
+ que o motor abre: `DropdownMenu`, `ContextMenu`, `Menubar`, o submenu, o `Select`, o `Combobox`. A lista de DENTRO da
4992
+ `CommandPalette` (`.command-list`) não abre sozinha — quem entra é a janela, abaixo. Quem pede "reduzir movimento" não
4993
+ vê movimento: a regra global do fim da folha zera a duração. */
4994
+ .menu { transform-origin:var(--transform-origin,center); transition:opacity var(--duration-base) var(--ease-standard),scale var(--duration-base) var(--ease-standard); }
4995
+ .menu[data-starting-style],.menu[data-ending-style] { opacity:0; scale:.95; }
4996
+ .menu[data-ending-style] { transition-duration:var(--duration-fast); }
4938
4997
  .menu-item { display:flex; align-items:center; gap:10px; width:100%; min-height:var(--control-h-md); padding:0 var(--menu-px,10px); border:0; border-radius:calc(var(--radius-card) - var(--space-1)); background:transparent; color:var(--foreground); font:inherit; text-align:start; text-decoration:none; cursor:pointer; }
4998
+ /* O ITEM COM EXPLICAÇÃO e o ÍCONE NA PONTA (0.55.0, o Victor, 04/11/2026: "pegue o código" da referência): a anatomia do
4999
+ item dela — o nome e, embaixo, a explicação na letra pequena e na cor de apoio; o recheio de 6 em cima e embaixo; o ícone
5000
+ da ponta (o "abre fora" de um link) empurrado para o fim. Só com `description` ou `trailingIcon`: sem eles, o item é o
5001
+ de sempre. */
5002
+ .menu-item:has(> .menu-item-text) { padding-block:calc(var(--space-1) + var(--space-05)); }
5003
+ .menu-item-text { display:grid; gap:var(--space-05); min-inline-size:0; }
5004
+ .menu-item-description { font-size:var(--text-xs); line-height:var(--leading-normal); font-weight:var(--weight-regular); color:var(--muted-foreground);
5005
+ overflow-wrap:break-word; }
5006
+ .menu-item > .menu-item-trailing { margin-inline-start:auto; color:var(--muted-foreground); }
4939
5007
  .menu-item[data-highlighted],.menu-item:hover:not([data-disabled]) { background:var(--surface-3); }
4940
5008
  /* Foco de TECLADO no item: a linha de foco, por dentro, porque a lista recorta o que passa da borda
4941
5009
  (B-09 e a ordem de 25/09/2026, "a referência sempre primeiro": o item de menu dela
@@ -5316,6 +5384,10 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
5316
5384
  provadas. */
5317
5385
  .datagrid-sticky thead th { position:sticky; inset-block-start:0; z-index:1; }
5318
5386
  .datagrid-sticky .datagrid-filters th { inset-block-start:var(--table-head-h); }
5387
+ /* S-10 (o MNT-40), `stickyHeader="page"`: o cabeçalho preso ao topo da PÁGINA, sem caixa de rolagem própria — a caixa
5388
+ continua sem teto (uma rolagem só, a da página) e o `DataGrid` move as células do cabeçalho com `translate` enquanto a
5389
+ página rola. Aqui só a camada: as fileiras passam POR BAIXO do cabeçalho, que já tem o fundo da moldura. */
5390
+ .datagrid-sticky-page thead th { z-index:1; }
5319
5391
 
5320
5392
  /* F7: a alça de redimensionar. Fina, colada no fim da célula e da altura toda —
5321
5393
  alvo estreito de propósito, porque largo demais rouba o clique do cabeçalho
@@ -6074,8 +6146,7 @@ button.graph-node-body { cursor:pointer; }
6074
6146
  variações saíam todas iguais: "Sim, como as outras"). O padrão dela, sem estilo escolhido, continua congelado — as
6075
6147
  regras do passo A continuam sem alcançá-la. Por isso o botão ligado dela, com um estilo escolhido, ganha aqui a
6076
6148
  pintura que o passo A dá às outras marcas (logo abaixo do 2.8).
6077
- As duas exceções desta seção, registradas na ADR-0084: o DEGRADÊ do `brand-gradient` (a segunda exceção à ADR-0007,
6078
- depois da escolha de cor da ADR-0069) e os AROS dos estilos de aro (o desenho que dá nome ao estilo — exceção nomeada à
6149
+ A exceção desta seção, registrada na ADR-0084: os AROS dos estilos de aro (o desenho que dá nome ao estilo — exceção nomeada à
6079
6150
  ADR-0072, só quando o app escolhe o estilo). */
6080
6151
 
6081
6152
  /* 2.8 · O BOTÃO LIGADO (Toggle, ToggleGroup, ToolbarButton): o C, amarelo, é o padrão desde a 0.45.0 (a regra do passo A
@@ -6206,6 +6277,32 @@ button.graph-node-body { cursor:pointer; }
6206
6277
  :is([data-ring="true"] :is(.badge:not(.badge-solid),.btn-soft,.btn-outline,.btn-primary-outline,.btn-danger-outline):not([data-ring]),:is(.badge:not(.badge-solid),.btn-soft,.btn-outline,.btn-primary-outline,.btn-danger-outline)[data-ring="true"]) {
6207
6278
  box-shadow:inset 0 0 0 var(--border-width) color-mix(in oklab, var(--ring-tone, currentColor) 30%, transparent); }
6208
6279
 
6280
+ /* ═══ OS MODOS DE LEITURA (ADR-0090, 04/11/2026) ═══════════════════════════════════════════════════════════════
6281
+ Seção própria, FORA da paleta do passo A: a Ember recebe os dois modos ("Sim, recebe"), e as regras da paleta, não. */
6282
+ /* O ALTO CONTRASTE E O TEXTO GRANDE NO APP INTEIRO (o MNT-30, bloco 3 — ADR-0090, 04/11/2026). O app liga, e não o
6283
+ sistema: `data-contrast="high"` e `data-text="lg"` em qualquer contêiner (a raiz do app inclusive), ou o `highContrast` e
6284
+ o `textSize="lg"` do `AppShell`. As formas que o Victor escolheu no esboço e aprovou na bancada: o contraste "C" e o
6285
+ texto "B". Valem em todas as marcas, a Ember inclusive ("Sim, recebe"); sem o atributo, nada disto existe.
6286
+ O CONTRASTE: o mesmo do "aumentar contraste" do sistema (o contorno de 3:1 nos campos, as marcas na tinta, o foco do
6287
+ campo no `--focus-strong`) e mais: o texto de apoio mais perto do texto, contorno nos cartões, o link sempre sublinhado
6288
+ e o contorno do botão (por dentro, como os aros — nunca borda). São linhas que SÓ este modo acende: exceção nomeada à
6289
+ ADR-0072, como o contorno do `prefers-contrast`. */
6290
+ [data-contrast="high"],[data-contrast="high"] [data-theme] {
6291
+ --muted-foreground:color-mix(in oklab, var(--foreground) 80%, var(--background));
6292
+ --control-thumb:var(--brand-yellow-ink); --control-selected-foreground:var(--brand-yellow-ink); --control-selected-dot:var(--brand-yellow-ink); }
6293
+ [data-contrast="high"] :is(.input,.textarea,.select,.input-group,.combobox-multi,.input-secondary,.textarea-secondary) { border-color:var(--input-strong); }
6294
+ [data-contrast="high"] .input-group > :is(.input,.select,.textarea) { border:0; }
6295
+ [data-contrast="high"] .card { border-color:var(--input-strong); }
6296
+ [data-contrast="high"] :is(a,.link) { text-decoration-line:underline; text-decoration-color:currentColor; text-decoration-thickness:var(--border-width); text-underline-offset:0.2em; }
6297
+ [data-contrast="high"] .btn { box-shadow:inset 0 0 0 var(--border-width) var(--input-strong); }
6298
+ [data-contrast="high"] .btn.btn-primary { box-shadow:inset 0 0 0 var(--border-width) var(--primary-foreground); }
6299
+ [data-contrast="high"] :is(.input,.textarea,.select):focus-visible,
6300
+ [data-contrast="high"] :is(.input-group,.combobox-multi,.command-field):focus-within { outline-color:var(--focus-strong); }
6301
+ /* O TEXTO GRANDE: os tokens do `[data-text="lg"]` (a letra 2 acima, o controle médio a 44) vêm do `aurea.tokens.css`.
6302
+ Aqui só a letra do corpo: o `body` resolve a dele com os tokens de onde ELE está, então um contêiner que liga o modo
6303
+ (o `AppShell`) refaz a conta para o que tem dentro. Na raiz (`<html>`) não: lá o `font-size` mudaria o `rem`. */
6304
+ [data-text="lg"]:not(:root) { font-size:var(--text-sm); }
6305
+
6209
6306
  /* >>> camada responsiva — GERADA por scripts/build-responsive-layer.mjs <<< */
6210
6307
  /* As variáveis de passo NÃO HERDAM. Ver o comentário de VARIAVEIS no gerador: um ícone dentro
6211
6308
  de um botão responsivo herdaria o passo do botão e mudaria de tamanho sozinho. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurea-uds/core",
3
- "version": "0.54.1",
3
+ "version": "0.59.0",
4
4
  "description": "O CSS da Aurea UDS e o comportamento em JavaScript puro. Importe @aurea-uds/fonts/css antes deste.",
5
5
  "keywords": [
6
6
  "aurea",