@aurea-uds/core 0.11.0 → 0.12.2

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 +92 -24
  2. package/package.json +1 -1
package/dist/aurea.css CHANGED
@@ -42,6 +42,8 @@
42
42
  --radius-control:999px;
43
43
  --radius-full:var(--radius-control);
44
44
  --border-width:1px;
45
+ --focus-width:2px;
46
+ --focus-offset:2px;
45
47
  --opacity-disabled:0.5;
46
48
  --shadow-md:0 16px 42px rgba(0,0,0,0.28);
47
49
  --shadow-lg:0 28px 80px rgba(0,0,0,0.42);
@@ -433,7 +435,7 @@ body { margin:0; background:var(--background); color:var(--foreground); font-fam
433
435
  ::selection { background:var(--selection); }
434
436
  button,input,textarea,select { font:inherit; }
435
437
  button,a,[role="button"],input,textarea,select { outline:none; }
436
- :focus-visible { outline:2px solid var(--focus-strong); outline-offset:2px; box-shadow:none; border-color:var(--focus-strong)!important; }
438
+ :focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); box-shadow:none; border-color:var(--focus-strong)!important; }
437
439
  button { color:inherit; }
438
440
  /* O link NÃO é `--primary`. Medido em 22/08/2026 com o axe e depois à mão: o amarelo da
439
441
  marca sobre o fundo do tema CLARO dá 1,73:1, e o AA de texto (WCAG 1.4.3) pede 4,5:1 —
@@ -735,7 +737,7 @@ img,svg { display:block; }
735
737
  .bottom-nav { --bottomnav-ring:2rem; --bottomnav-surface:var(--card); position:sticky; bottom:0; z-index:var(--z-sticky); display:flex; gap:var(--space-1); margin:var(--space-4); margin-bottom:calc(var(--space-4) + env(safe-area-inset-bottom)); padding:var(--space-1); border:1px solid var(--border); border-radius:var(--radius-control); background:var(--card); color:var(--card-foreground); box-shadow:var(--shadow-md); }
736
738
  /* `--control-h-lg` e não `--control-h-md`: alvo de toque. O md dá 36px em comfortable e
737
739
  o alvo confortável de dedo é maior — com o recuo, o item renderiza acima de 44px. */
738
- .bottom-nav-item { flex:1; min-width:0; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--space-1); min-height:var(--control-h-lg); padding:var(--space-1); border:0; border-radius:var(--radius-control); background:transparent; color:var(--muted-foreground); font:inherit; font-size:var(--text-xs); text-align:center; text-decoration:none; cursor:pointer; }
740
+ .bottom-nav-item { flex:1; min-width:0; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--space-05); min-height:var(--control-h-lg); padding:var(--space-1); border:0; border-radius:var(--radius-control); background:transparent; color:var(--muted-foreground); font:inherit; font-size:var(--text-xs); text-align:center; text-decoration:none; cursor:pointer; }
739
741
  .bottom-nav-item .icon { flex:none; opacity:.8; }
740
742
  .bottom-nav-label { max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
741
743
  /* O CONTADOR PENDURA NO ÍCONE — canto superior da ponta, encostando na borda dele.
@@ -769,6 +771,17 @@ img,svg { display:block; }
769
771
  entrega 42px em comfortable e 48 em spacious, contra os 44pt mínimos da HIG da Apple e os
770
772
  48dp do Material. A moldura é a caixa do DESENHO; o alvo é o item inteiro. */
771
773
  .bottom-nav-mark { position:relative; flex:none; display:inline-flex; align-items:center; justify-content:center; width:var(--bottomnav-ring); height:var(--bottomnav-ring); border-radius:var(--radius-control); }
774
+ /* A BARRA MAIS BAIXA — pedido do Victor, 30/09/2026, aprovado pela imagem: *"ele é muito largo, e
775
+ é assim por conta da distância entre o ícone em cima e o texto embaixo"*. A moldura de 32 só
776
+ serve aos quatro indicadores REDONDOS, em que ela vira o círculo. Nos outros três ela era folga
777
+ vazia: 4 em cima e 4 embaixo do ícone de 24, mais o vão de 4 até o rótulo — 9 medidos entre o
778
+ ícone e o texto. Fora dos redondos (e na barra sem classe de indicador, a do HTML puro) a
779
+ moldura fica da altura do ícone, e o vão do item cai para
780
+ `--space-05`. A largura continua 32: é ela que dá o canto ao contador. O mesmo conserto está no
781
+ nativo (`navigation.tsx`). ~~A folga de 4dp do M3 entre o indicador e o rótulo~~ vale só para
782
+ os redondos agora. */
783
+ .bottom-nav-mark { height:var(--icon-lg); }
784
+ .bottom-nav-ind-circle .bottom-nav-mark, .bottom-nav-ind-circle-raised .bottom-nav-mark, .bottom-nav-ind-circle-outline .bottom-nav-mark, .bottom-nav-ind-circle-bold .bottom-nav-mark { height:var(--bottomnav-ring); }
772
785
  /* `inline-flex` no envoltório: como `<span>` solto ele é caixa de LINHA, e mede a entrelinha do
773
786
  item (18px) em vez do contador que carrega (16px). A diferença não aparece na tela — aparece
774
787
  na medição, e medição errada é o que faz a razão parecer 0,75 quando é 0,67. */
@@ -989,7 +1002,7 @@ img,svg { display:block; }
989
1002
  rolar a página lateralmente ao focar. Aparece no foco, que é o único momento em que precisa
990
1003
  aparecer. */
991
1004
  .skip-link { position:fixed; inset-block-start:var(--space-2); inset-inline-start:var(--space-2); z-index:calc(var(--z-toast) + 1); display:inline-flex; align-items:center; height:var(--control-h-md); padding:0 var(--space-4); border-radius:var(--radius-control); background:var(--primary); color:var(--primary-foreground); font-size:var(--text-sm); font-weight:var(--weight-semibold); line-height:var(--leading-none); text-decoration:none; transform:translateY(-160%); transition:transform var(--duration-fast) var(--ease-standard); }
992
- .skip-link:focus-visible { transform:translateY(0); outline:2px solid var(--focus-strong); outline-offset:2px; }
1005
+ .skip-link:focus-visible { transform:translateY(0); outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
993
1006
  .btn-primary { --btn-bg:var(--primary); --btn-fg:var(--primary-foreground); --btn-border:transparent; }
994
1007
  .btn-primary:hover:not(:disabled):not([aria-disabled="true"]) { --btn-bg:var(--primary-hover); --btn-border:transparent; }
995
1008
  .btn-secondary { --btn-bg:var(--secondary); --btn-fg:var(--secondary-foreground); --btn-border:transparent; }
@@ -1100,12 +1113,21 @@ img,svg { display:block; }
1100
1113
  .btn-outline.btn-tone-warning { --btn-border:var(--warning); }
1101
1114
  .btn-tone-warning:not(.btn-link):not(.btn-solid):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--warning) 14%, transparent); }
1102
1115
  .btn-nav:hover:not(:disabled):not([aria-disabled="true"]) { --btn-fg:var(--foreground); }
1103
- .btn-icon { width:var(--control-h-md); padding:0; border-radius:var(--radius-md); }
1104
- .btn-icon.btn-xs { width:var(--control-h-xs); border-radius:var(--radius-sm); }
1105
- .btn-icon.btn-sm { width:var(--control-h-sm); border-radius:var(--radius-sm); } .btn-icon.btn-lg { width:var(--control-h-lg); border-radius:var(--radius-md); }
1116
+ /* O botão só de ícone é REDONDO, em todos os tamanhos — decisão do Victor, 25/09/2026
1117
+ (ADR-0052). Era um quadrado de canto 10px (6px nos dois menores). O HeroUI 3.2.6 faz o botão só
1118
+ de ícone redondo, e os botões de texto da Aurea já são cápsula: o de ícone era o único quadrado. */
1119
+ .btn-icon { width:var(--control-h-md); padding:0; border-radius:var(--radius-full); }
1120
+ .btn-icon.btn-xs { width:var(--control-h-xs); }
1121
+ .btn-icon.btn-sm { width:var(--control-h-sm); } .btn-icon.btn-lg { width:var(--control-h-lg); }
1106
1122
  /* xs e xl também precisam de largura: sem isto a altura mudava e a largura ficava na do
1107
1123
  md, e o alvo só-ícone deixava de ser quadrado (achado na onda Actions, 24/07). */
1108
- .btn-icon.btn-xl { width:var(--control-h-xl); border-radius:var(--radius-md); }
1124
+ .btn-icon.btn-xl { width:var(--control-h-xl); }
1125
+ /* ThemeToggle (25/09/2026): a cor no ícone mostra o tema para onde se vai. No claro a LUA, na tinta
1126
+ do texto; no escuro o SOL, no amarelo da marca — as duas combinações se enxergam, e é por isso
1127
+ que o botão nunca mostra a lua no escuro nem o sol no claro. Mais específico que o `.btn:hover`,
1128
+ então a cor fica também com o mouse em cima. */
1129
+ .theme-toggle-moon .icon { color:var(--foreground); }
1130
+ .theme-toggle-sun .icon { color:var(--primary); }
1109
1131
  /* wrap, não estoura: os botões do grupo são pills com gap (não segmentos colados), então
1110
1132
  quebrar linha em tela estreita preserva o visual. Único gap de eixo horizontal que a
1111
1133
  auditoria da Etapa 3 achou sem proteção — o resto já rola (tabela) ou já quebra (toolbar). */
@@ -1222,7 +1244,7 @@ img,svg { display:block; }
1222
1244
  contorno do input de dentro ficaria escondido atrás da borda do grupo. */
1223
1245
  .input-group { display:flex; flex-wrap:wrap; align-items:center; inline-size:100%; min-inline-size:0; min-block-size:var(--control-h-md); background:var(--field-bg); border:1px solid var(--border-strong); border-radius:var(--radius-control); transition:border-color var(--duration-fast),box-shadow var(--duration-fast); }
1224
1246
  .input-group:hover { border-color:var(--border); }
1225
- .input-group:focus-within { outline:2px solid var(--focus-strong); outline-offset:2px; }
1247
+ .input-group:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
1226
1248
  .input-group:has(.input-sm) { min-block-size:var(--control-h-sm); }
1227
1249
  .input-group:has(.input-lg) { min-block-size:var(--control-h-lg); }
1228
1250
  /* O controle dentro do grupo abre mão da própria moldura: quem desenha a caixa é o grupo. */
@@ -1357,7 +1379,7 @@ img,svg { display:block; }
1357
1379
  .control-mark-lg { --step-h:var(--control-h-lg); }
1358
1380
  .checkbox .control-mark { border-radius:5px; } .radio .control-mark { border-radius:50%; }
1359
1381
  .checkbox input:checked + .control-mark { background:var(--control-selected); border-color:var(--control-selected); color:var(--control-selected-foreground); }
1360
- .checkbox input:focus-visible + .control-mark,.radio input:focus-visible + .control-mark,.switch input:focus-visible + .switch-track { outline:2px solid var(--focus-strong); outline-offset:2px; }
1382
+ .checkbox input:focus-visible + .control-mark,.radio input:focus-visible + .control-mark,.switch input:focus-visible + .switch-track { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
1361
1383
  .checkbox input:checked + .control-mark:after { content:""; width:8px; height:4px; border-left:2px solid currentColor; border-bottom:2px solid currentColor; transform:rotate(-45deg) translateY(-1px); }
1362
1384
  .radio input:checked + .control-mark:after { content:""; width:8px; height:8px; border-radius:50%; background:var(--control-selected); }
1363
1385
  .switch { display:inline-flex; align-items:center; gap:10px; cursor:pointer; } .switch input { position:absolute; opacity:0; }
@@ -1890,7 +1912,11 @@ img,svg { display:block; }
1890
1912
  estética: é CLS. O exemplo de playlist do `media-chrome` declara o mesmo com o motivo escrito —
1891
1913
  sem proporção fixa, um player com `preload=none` mede zero até a mídia chegar e a página SALTA.
1892
1914
  Tirar a proporção sem fixar a altura devolve o salto. */
1893
- .media-player { position:relative; isolation:isolate; overflow:hidden; min-height:var(--media-h,360px); aspect-ratio:var(--media-ar,16/9); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--media-canvas); color:var(--media-foreground); }
1915
+ /* A cor do foco no player é a do contexto, não uma regra à parte (B-09, 24/09/2026). O fundo do
1916
+ player é quase preto nos DOIS temas (`--media-canvas`), e o `--focus-strong` do tema claro é
1917
+ escuro: o foco dos controles sumia no tema claro. Redefinir o token aqui conserta todos os
1918
+ controles de uma vez e deixa a linha de foco (espessura, afastamento) com a regra global. */
1919
+ .media-player { --focus-strong:var(--primary); position:relative; isolation:isolate; overflow:hidden; min-height:var(--media-h,360px); aspect-ratio:var(--media-ar,16/9); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--media-canvas); color:var(--media-foreground); }
1894
1920
  .media-viewport { position:absolute; inset:0; display:grid; place-items:center; background:var(--media-canvas); }
1895
1921
  .media-fill { width:100%; height:100%; object-fit:contain; } /* vídeo React preenche o viewport (auditoria 18/07, M14) */
1896
1922
  .media-placeholder { display:grid; place-items:center; gap:10px; color:var(--media-muted); text-align:center; }
@@ -1910,10 +1936,10 @@ img,svg { display:block; }
1910
1936
  .media-seek input::-webkit-slider-thumb { width:14px; height:14px; margin-top:-5px; appearance:none; border:2px solid var(--media-foreground); border-radius:50%; background:var(--primary); }
1911
1937
  .media-seek input::-moz-range-track { height:4px; background:transparent; }
1912
1938
  .media-seek input::-moz-range-thumb { width:12px; height:12px; border:2px solid var(--media-foreground); border-radius:50%; background:var(--primary); }
1913
- .media-seek input:focus-visible { outline:2px solid var(--primary); outline-offset:3px; box-shadow:none; }
1939
+ .media-seek input:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); box-shadow:none; }
1914
1940
  .media-control-row,.media-control-group { display:flex; align-items:center; gap:4px; }
1915
1941
  .media-control-row { min-width:0; justify-content:space-between; }
1916
- .media-control { min-width:36px; height:36px; display:inline-grid; place-items:center; padding:0 8px; border:1px solid transparent; border-radius:var(--radius-md); background:transparent; color:var(--media-foreground); cursor:pointer; }
1942
+ .media-control { min-width:36px; height:36px; display:inline-grid; place-items:center; padding:0; border:1px solid transparent; border-radius:var(--radius-full); background:transparent; color:var(--media-foreground); cursor:pointer; }
1917
1943
  .media-control:hover,.media-control.active { background:var(--media-track); color:var(--primary); }
1918
1944
  .media-time { padding:0 7px; color:var(--media-muted); font:var(--text-xs) var(--font-code); white-space:nowrap; }
1919
1945
  .media-volume { width:82px; accent-color:var(--primary); }
@@ -1978,6 +2004,37 @@ img,svg { display:block; }
1978
2004
  .gallery-tile:not(.is-selected) { background:transparent; color:var(--muted-foreground); }
1979
2005
  .gallery-caption { font-size:var(--text-sm); }
1980
2006
 
2007
+ /* TIPOGRAFIA (B-02, 25/09/2026) — `Text`, `Heading`, `Paragraph` e `Code`, no molde do HeroUI
2008
+ 3.2.6 (`typography.css`), por ordem do Victor: HeroUI sempre primeiro. O que vem dele é a FORMA:
2009
+ uma LISTA FECHADA de papéis em vez de tamanhos soltos (título 1–6, texto, texto pequeno, texto
2010
+ mínimo, código), cor só normal ou apagada, quatro pesos. O que é nosso são os números, todos de
2011
+ token: a escala de letras é a dele desde a ADR-0050, a entrelinha do texto é `--leading-relaxed`
2012
+ (27, 24 e 20px, contra os 28, 24 e 20 dele) e o código reusa a pele do `code` do `.prose`.
2013
+ A margem vai a zero porque `h1`…`h6` e `p` trazem a do navegador; o espaço entre blocos é de
2014
+ quem os empilha (`Stack`), não do texto. */
2015
+ .typography { margin:0; color:var(--foreground); }
2016
+ .typography-h1,.typography-h2,.typography-h3,.typography-h4,.typography-h5,.typography-h6 { font-weight:var(--weight-semibold); line-height:var(--leading-tight); letter-spacing:var(--tracking-tight); }
2017
+ .typography-h1 { font-size:var(--text-4xl); }
2018
+ .typography-h2 { font-size:var(--text-3xl); }
2019
+ .typography-h3 { font-size:var(--text-2xl); }
2020
+ .typography-h4 { font-size:var(--text-xl); }
2021
+ .typography-h5 { font-size:var(--text-lg); }
2022
+ .typography-h6 { font-size:var(--text-base); }
2023
+ .typography-body { font-size:var(--text-base); line-height:var(--leading-relaxed); }
2024
+ .typography-body-sm { font-size:var(--text-sm); line-height:var(--leading-relaxed); }
2025
+ .typography-body-xs { font-size:var(--text-xs); line-height:var(--leading-relaxed); }
2026
+ .typography-code { padding:var(--space-05) var(--space-1); border-radius:var(--radius-xs); background:var(--surface-2); font-family:var(--font-code); font-size:var(--text-sm); }
2027
+ .typography-muted { color:var(--muted-foreground); }
2028
+ .typography-weight-normal { font-weight:var(--weight-regular); }
2029
+ .typography-weight-medium { font-weight:var(--weight-medium); }
2030
+ .typography-weight-semibold { font-weight:var(--weight-semibold); }
2031
+ .typography-weight-bold { font-weight:var(--weight-bold); }
2032
+ .typography-align-start { text-align:start; }
2033
+ .typography-align-center { text-align:center; }
2034
+ .typography-align-end { text-align:end; }
2035
+ .typography-align-justify { text-align:justify; }
2036
+ .typography-truncate { display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
2037
+
1981
2038
  /* PROSA (PLANO-1.0, item L5). É a PELE do texto longo, não o parser — quem transforma Markdown em
1982
2039
  elementos é o consumidor. Aqui só se decide como esses elementos se leem.
1983
2040
 
@@ -2149,7 +2206,15 @@ img,svg { display:block; }
2149
2206
  DropdownMenu, ContextMenu, Menubar e a lista da CommandPalette. */
2150
2207
  .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 var(--border); border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
2151
2208
  .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; cursor:pointer; }
2152
- .menu-item[data-highlighted],.menu-item:hover:not([data-disabled]) { background:var(--surface-3); outline:none; }
2209
+ .menu-item[data-highlighted],.menu-item:hover:not([data-disabled]) { background:var(--surface-3); }
2210
+ /* Foco de TECLADO no item: a linha de foco, por dentro, porque a lista recorta o que passa da borda
2211
+ (B-09 e a ordem de 25/09/2026, "HeroUI sempre primeiro": o `menu-item` do HeroUI 3.2.6 leva o
2212
+ `status-focused` no foco de teclado). Até aqui a regra de cima apagava a linha com
2213
+ `outline:none` e vencia a global: com o teclado, o item em foco era só o fundo cinza — igual ao
2214
+ do mouse em cima. O mouse continua só com o fundo: `:focus-visible` não acende por ponteiro.
2215
+ ⚠ Onde o foco fica no CAMPO (`Combobox`, `CommandPalette`: o item é destacado por
2216
+ `aria-activedescendant`), o item nunca tem `:focus-visible`, e o destaque continua sendo o fundo. */
2217
+ .menu-item:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:calc(-1 * var(--focus-width)); }
2153
2218
  .menu-item[data-disabled] { opacity:var(--opacity-disabled); cursor:not-allowed; }
2154
2219
  /* CommandPalette (M6): a lista dentro da paleta. Reusa `.menu` e `.menu-item` — a paleta nao
2155
2220
  inventa uma segunda pele de lista, que e o defeito que a `.table-region` cobrou caro. O que se
@@ -2199,7 +2264,7 @@ img,svg { display:block; }
2199
2264
  .menubar-trigger { display:inline-flex; align-items:center; min-block-size:var(--control-h-sm); padding-inline:var(--space-3); border:0; border-radius:var(--radius-control); background:transparent; color:var(--foreground); font:inherit; font-size:var(--text-sm); font-weight:var(--weight-medium); white-space:nowrap; cursor:pointer; }
2200
2265
  .menubar-trigger:hover { background:var(--surface-hover); }
2201
2266
  .menubar-trigger[data-popup-open] { background:var(--secondary); color:var(--primary); }
2202
- .menubar-trigger:focus-visible { outline:2px solid var(--focus-strong); outline-offset:2px; }
2267
+ .menubar-trigger:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
2203
2268
  /* Combobox: reaproveita .menu/.menu-item; só dimensionamento e a coluna do check são próprios.
2204
2269
  --anchor-width e --available-height vêm do positioner do Base UI. */
2205
2270
  .combobox-group { position:relative; display:flex; align-items:center; }
@@ -2225,7 +2290,7 @@ img,svg { display:block; }
2225
2290
  /* MultiCombobox (Fase 4) — chips de multi-seleção + grupos. Espaçamento novo tokenizado. */
2226
2291
  .combobox-multi { display:flex; align-items:center; gap:var(--space-2); width:100%; min-width:0; min-height:var(--control-h-md); padding:var(--space-1) var(--space-2); background:var(--field-bg); border:1px solid var(--border-strong); border-radius:var(--radius-control); transition:border-color var(--duration-fast); }
2227
2292
  .combobox-multi:hover { border-color:var(--border); }
2228
- .combobox-multi:focus-within { outline:2px solid var(--focus-strong); outline-offset:2px; border-color:var(--focus-strong); }
2293
+ .combobox-multi:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); border-color:var(--focus-strong); }
2229
2294
  .combobox-multi>.combobox-actions { position:static; inset-inline-end:auto; }
2230
2295
  /* o campo de chips não é `.input`, então a regra de :disabled dos campos não o alcança. Quem
2231
2296
  marca aqui é o `data-disabled` que o Base UI põe no InputGroup a partir do estado da Root. */
@@ -2251,7 +2316,7 @@ img,svg { display:block; }
2251
2316
  o arrastar-soltar é reforço. Espaçamento novo tokenizado; superfície = card. */
2252
2317
  .dropzone { display:flex; flex-direction:column; align-items:center; gap:var(--space-2); padding:var(--space-8) var(--space-6); text-align:center; color:var(--muted-foreground); background:var(--surface-inset); border:1px dashed var(--border-strong); border-radius:var(--radius-card); cursor:pointer; transition:border-color var(--duration-fast),background-color var(--duration-fast); }
2253
2318
  .dropzone:hover { border-color:var(--border); }
2254
- .dropzone:focus-within { outline:2px solid var(--focus-strong); outline-offset:2px; border-color:var(--focus-strong); }
2319
+ .dropzone:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); border-color:var(--focus-strong); }
2255
2320
  .dropzone[data-dragging="true"] { border-style:solid; border-color:var(--primary); background:var(--surface-2); }
2256
2321
  .dropzone strong { color:var(--foreground); }
2257
2322
  .dropzone-icon { color:var(--primary); }
@@ -2330,7 +2395,7 @@ img,svg { display:block; }
2330
2395
  .tree-item { outline:none; }
2331
2396
  .tree-node { display:flex; align-items:center; gap:var(--space-2); min-height:var(--control-h-md); padding-block:var(--space-1); padding-inline-end:var(--space-3); border-radius:var(--radius-sm); color:var(--foreground); cursor:pointer; user-select:none; }
2332
2397
  .tree-node:hover { background:var(--surface-3); }
2333
- .tree-item:focus-visible > .tree-node { outline:2px solid var(--focus-strong); outline-offset:-2px; }
2398
+ .tree-item:focus-visible > .tree-node { outline:var(--focus-width) solid var(--focus-strong); outline-offset:calc(-1 * var(--focus-width)); }
2334
2399
  .tree-node[data-selected] { background:color-mix(in srgb,var(--primary) 14%,transparent); }
2335
2400
  .tree-twist { flex:none; color:var(--muted-foreground); transition:transform var(--duration-fast); }
2336
2401
  .tree-item[aria-expanded="true"] > .tree-node > .tree-twist { transform:rotate(90deg); }
@@ -2353,7 +2418,7 @@ img,svg { display:block; }
2353
2418
  .notification-item { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:baseline; column-gap:var(--space-3); row-gap:var(--space-1); width:100%; padding:var(--space-3); border:0; border-radius:var(--radius-sm); background:none; color:var(--foreground); font:inherit; text-align:start; }
2354
2419
  button.notification-item { cursor:pointer; }
2355
2420
  button.notification-item:hover { background:var(--surface-3); }
2356
- .notification-item:focus-visible { outline:2px solid var(--focus-strong); outline-offset:-2px; }
2421
+ .notification-item:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:calc(-1 * var(--focus-width)); }
2357
2422
  .notification-dot { grid-row:1/-1; align-self:center; width:8px; height:8px; border-radius:50%; background:var(--primary); }
2358
2423
  .notification-item[data-read] .notification-dot { visibility:hidden; }
2359
2424
  .notification-item-title { grid-column:2; display:flex; align-items:center; gap:var(--space-2); min-width:0; font-size:var(--text-sm); font-weight:var(--weight-medium); }
@@ -2376,14 +2441,14 @@ button.notification-item:hover { background:var(--surface-3); }
2376
2441
  selecionada usa data-selected (o estado acessível é o checkbox da linha).
2377
2442
  Espaço novo tokenizado. */
2378
2443
  .datagrid { display:grid; gap:var(--space-3); }
2379
- .datagrid > .table-wrap:focus-visible { outline:none; box-shadow:0 0 0 3px color-mix(in oklab,var(--focus) 38%,transparent); }
2444
+ .datagrid > .table-wrap:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:calc(-1 * var(--focus-width)); box-shadow:none; }
2380
2445
  .datagrid > .pagination { justify-self:end; }
2381
2446
  /* Fix aditivo: os 34px dos botões numéricos do .pagination esmagavam os botões
2382
2447
  de TEXTO (Anterior/Próxima) do Pagination React. Não muda os numéricos. */
2383
2448
  /* text-transform/letter-spacing: o UA reseta nos <button>; herdar explícito
2384
2449
  para o cabeçalho ordenável ficar idêntico ao th estático. */
2385
2450
  .datagrid-sort { display:inline-flex; align-items:center; gap:var(--space-1); padding:0; border:0; background:none; color:inherit; font:inherit; text-transform:inherit; letter-spacing:inherit; cursor:pointer; }
2386
- .datagrid-sort:focus-visible { outline:2px solid var(--focus-strong); outline-offset:2px; border-radius:var(--radius-sm); }
2451
+ .datagrid-sort:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); border-radius:var(--radius-sm); }
2387
2452
  .datagrid-sort-icon { flex:none; color:var(--subtle-foreground); }
2388
2453
  th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
2389
2454
  .datagrid-selcol { width:1%; white-space:nowrap; }
@@ -2424,7 +2489,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
2424
2489
  .datagrid thead th:has(> .datagrid-resizer) { position:relative; }
2425
2490
  .datagrid-resizer { position:absolute; inset-block:0; inset-inline-end:0; inline-size:var(--space-1); padding:0; border:0; background:none; cursor:col-resize; touch-action:none; }
2426
2491
  .datagrid-resizer:hover, .datagrid-resizer:focus-visible { background:var(--primary); }
2427
- .datagrid-resizer:focus-visible { outline:2px solid var(--focus-strong); outline-offset:1px; }
2492
+ .datagrid-resizer:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:calc(-1 * var(--focus-width)); }
2428
2493
 
2429
2494
  /* F8: o esqueleto dentro da célula. Sem altura própria ele mede zero — a `.skeleton`
2430
2495
  é uma <div> vazia — e a linha de carregamento sairia rasa demais para parecer uma
@@ -2682,7 +2747,7 @@ button.graph-node-body { cursor:pointer; }
2682
2747
  mora na cápsula, então é ela que precisa crescer — o filho estica atrás. */
2683
2748
  @media (pointer:coarse) { .btn:not(.btn-link),.tabs,.segmented,.pagination button,.schedule-grid button,.media-control,.nav-list-row { min-height:var(--target-min); } .btn-icon,.media-control { min-width:var(--target-min); } }
2684
2749
  @media (forced-colors:active) {
2685
- :focus-visible { outline:2px solid CanvasText; outline-offset:2px; box-shadow:none; }
2750
+ :focus-visible { outline:var(--focus-width) solid CanvasText; outline-offset:var(--focus-offset); box-shadow:none; }
2686
2751
  .badge,.pattern-gallery button[aria-pressed="true"],.device-grid button[aria-pressed="true"] { border:1px solid CanvasText; }
2687
2752
  }
2688
2753
 
@@ -2690,9 +2755,12 @@ button.graph-node-body { cursor:pointer; }
2690
2755
  /* Aurea v1.7 stabilization patch — visual design unchanged. */
2691
2756
  .badge-running{background:var(--success-bg);color:var(--success-400);border-color:color-mix(in oklab,var(--success-400) 32%,transparent)}
2692
2757
  /* superfície (overflow, borda, fundo, raio) mora junto com a do `.table-wrap` lá em cima — aqui
2693
- fica só o que é DESTA região: ela é focável, e o anel dela é o box-shadow abaixo. */
2758
+ fica só o que é DESTA região: ela é focável, e o foco dela é a linha de dentro, abaixo. Era um
2759
+ halo de `--focus` a 38% (B-09, 24/09/2026): claro demais para se ver, e fora do contrato de foco.
2760
+ A linha vai para DENTRO porque a região é o próprio contêiner recortado — como no HeroUI 3.2.6,
2761
+ que desenha o foco da tabela com `inset 0 0 0 2px var(--focus)`. */
2694
2762
  .table-region{outline:none}
2695
- .table-region:focus-visible{box-shadow:0 0 0 3px color-mix(in oklab,var(--focus) 38%,transparent)}
2763
+ .table-region:focus-visible{outline:var(--focus-width) solid var(--focus-strong);outline-offset:calc(-1 * var(--focus-width));box-shadow:none}
2696
2764
  /* CONTAINER QUERY, e não breakpoint de viewport — Parte D, item D3 (08/08/2026).
2697
2765
  Era `@media (max-width:400px)`, o último dos seis legados do achado M13. Trocar por um degrau
2698
2766
  da escala (639px) teria resolvido o gate e mantido o defeito: a largura que aperta os
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurea-uds/core",
3
- "version": "0.11.0",
3
+ "version": "0.12.2",
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",