@aurea-uds/core 0.35.0 → 0.37.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.
package/dist/aurea.css CHANGED
@@ -4,6 +4,8 @@
4
4
  --brand-yellow:oklch(0.795 0.184 86.047);
5
5
  --brand-yellow-foreground:oklch(0.421 0.095 57.708);
6
6
  --brand-yellow-text:oklch(0.516 0.105 86.047);
7
+ --brand-yellow-ink:#242424;
8
+ --brand-blue:#0246f1;
7
9
  --white:oklch(1 0 0);
8
10
  --black:oklch(0 0 0);
9
11
  --font-ui:"Atkinson Hyperlegible Next","Segoe UI",sans-serif;
@@ -20,6 +22,8 @@
20
22
  --text-3xl:1.875rem;
21
23
  --text-4xl:2.25rem;
22
24
  --text-5xl:3rem;
25
+ --text-6xl:3.75rem;
26
+ --text-7xl:4.5rem;
23
27
  --leading-tight:1.2;
24
28
  --leading-normal:1.5;
25
29
  --leading-relaxed:1.7;
@@ -152,7 +156,7 @@
152
156
  --popover:#292929;
153
157
  --popover-foreground:#ffffff;
154
158
  --primary:var(--brand-yellow);
155
- --primary-foreground:var(--brand-yellow-foreground);
159
+ --primary-foreground:var(--brand-yellow-ink);
156
160
  --link:var(--brand-yellow);
157
161
  --link-hover:var(--brand-yellow);
158
162
  --secondary:#333333;
@@ -174,7 +178,7 @@
174
178
  --sidebar:#292929;
175
179
  --sidebar-foreground:#ffffff;
176
180
  --sidebar-primary:var(--brand-yellow);
177
- --sidebar-primary-foreground:var(--brand-yellow-foreground);
181
+ --sidebar-primary-foreground:var(--brand-yellow-ink);
178
182
  --sidebar-accent:#333333;
179
183
  --sidebar-accent-foreground:#ffffff;
180
184
  --sidebar-border:#525252;
@@ -198,7 +202,9 @@
198
202
  --primary-emphasis:var(--primary);
199
203
  --primary-outline:var(--primary);
200
204
  --control-selected:var(--primary);
201
- --control-selected-foreground:var(--primary-foreground);
205
+ --control-selected-foreground:var(--brand-yellow-ink);
206
+ --control-selected-dot:oklch(0.985 0 0);
207
+ --primary-mark:var(--brand-yellow-foreground);
202
208
  --selection:oklch(0.795 0.184 86.047 / 0.22);
203
209
  --success-bg:#052505;
204
210
  --warning-bg:#4a1e04;
@@ -242,9 +248,9 @@
242
248
  --popover:#ffffff;
243
249
  --popover-foreground:#242424;
244
250
  --primary:var(--brand-yellow);
245
- --primary-foreground:var(--brand-yellow-foreground);
246
- --link:oklch(0.52 0.106 86.047);
247
- --link-hover:oklch(0.44 0.106 86.047);
251
+ --primary-foreground:var(--brand-yellow-ink);
252
+ --link:var(--brand-blue);
253
+ --link-hover:var(--brand-blue);
248
254
  --secondary:#ebebeb;
249
255
  --secondary-foreground:#242424;
250
256
  --muted:var(--secondary);
@@ -264,7 +270,7 @@
264
270
  --sidebar:var(--card);
265
271
  --sidebar-foreground:#242424;
266
272
  --sidebar-primary:var(--primary-emphasis);
267
- --sidebar-primary-foreground:var(--brand-yellow-foreground);
273
+ --sidebar-primary-foreground:var(--brand-yellow-ink);
268
274
  --sidebar-accent:var(--secondary);
269
275
  --sidebar-accent-foreground:#242424;
270
276
  --sidebar-border:#e0e0e0;
@@ -284,11 +290,13 @@
284
290
  --secondary-hover:var(--surface-hover);
285
291
  --segment:oklch(1 0 0);
286
292
  --focus:var(--primary);
287
- --focus-strong:var(--brand-yellow-foreground);
288
- --primary-emphasis:var(--brand-yellow-text);
289
- --primary-outline:var(--brand-yellow-text);
290
- --control-selected:var(--brand-yellow-foreground);
291
- --control-selected-foreground:oklch(0.985 0 0);
293
+ --focus-strong:var(--foreground);
294
+ --primary-emphasis:var(--brand-blue);
295
+ --primary-outline:var(--brand-blue);
296
+ --control-selected:var(--brand-yellow);
297
+ --control-selected-foreground:var(--brand-yellow-ink);
298
+ --control-selected-dot:oklch(0.985 0 0);
299
+ --primary-mark:var(--brand-yellow-foreground);
292
300
  --success-400:#0e700e;
293
301
  --warning-400:#8a3707;
294
302
  --danger-400:#b10e1c;
@@ -366,6 +374,8 @@
366
374
  --selection:oklch(0.32 0.08 50);
367
375
  --control-selected:oklch(0.72 0.19 48);
368
376
  --control-selected-foreground:oklch(0.16 0.02 250);
377
+ --control-selected-dot:oklch(0.16 0.02 250);
378
+ --primary-mark:oklch(0.16 0.02 250);
369
379
  --overlay:oklch(0 0 0 / 0.6);
370
380
  --chart-1:oklch(0.74 0.18 50);
371
381
  --chart-2:oklch(0.84 0.14 88);
@@ -428,6 +438,8 @@
428
438
  --selection:oklch(0.96 0.04 60);
429
439
  --control-selected:oklch(0.682 0.197 44.5);
430
440
  --control-selected-foreground:oklch(1 0 0);
441
+ --control-selected-dot:oklch(1 0 0);
442
+ --primary-mark:oklch(1 0 0);
431
443
  --overlay:oklch(0.16 0.018 250 / 0.45);
432
444
  --chart-1:oklch(0.682 0.197 44.5);
433
445
  --chart-2:oklch(0.82 0.15 88);
@@ -450,6 +462,8 @@
450
462
  --warning-bg:oklch(0.95 0.06 80);
451
463
  --danger-bg:oklch(0.95 0.05 25);
452
464
  --info-bg:oklch(0.95 0.04 235);
465
+ --link:oklch(0.52 0.106 86.047);
466
+ --link-hover:oklch(0.44 0.106 86.047);
453
467
  }
454
468
  [data-density="compact"]{
455
469
  --control-h-xs:1.5rem;
@@ -618,6 +632,43 @@ img,svg { display:block; }
618
632
  .section-inset { background:var(--surface-inset); }
619
633
  .section-spacing-sm { padding-block:var(--space-8); }
620
634
  @media (min-width:768px) { .section { padding-block:var(--space-24); } .section-spacing-sm { padding-block:var(--space-12); } }
635
+ /* GAR-21 e GAR-22 (lote U, 19/10/2026): a `Section` variant="hero" — a abertura de página. Os vãos são os do início da
636
+ referência (medidos em 15/10/2026): a sobrelinha a 8 do título (16 a partir de 1024), o texto colado no título, os
637
+ botões a 16, o que vier depois a 8 (16 a partir de 1024); o texto 16/24, e 18/28 a partir de 768, em 672 de largura (o
638
+ 640 da escala mais o --space-8). O título 36, 60 a partir de 768 e 72 a partir de 1024 (os três tamanhos são decisão
639
+ do Victor; as larguras, desta peça). Com imagem e align="start", o texto e a imagem lado a lado a partir de 1024;
640
+ abaixo disso, a imagem desce.
641
+ As larguras são da FAIXA, e não da janela (`@container`, como o `.media-player`): de ponta a ponta, a faixa tem a
642
+ largura da janela e dá o mesmo; numa coluna mais estreita (a prévia do catálogo), o título não passa dela. O 72 entra
643
+ em 1024, e não em 1280: numa janela de 1280 a barra de rolagem deixa a faixa com menos de 1280, e o 72 não apareceria
644
+ na tela larga mais comum. */
645
+ .section-hero { container:aurea-hero / inline-size; }
646
+ .section-hero-content { display:grid; justify-items:start; min-inline-size:0; }
647
+ .section-hero-center .section-hero-content { justify-items:center; text-align:center; }
648
+ .section-hero-text { display:grid; justify-items:inherit; }
649
+ /* A sobrelinha em flex: com um selo ou link dentro de um bloco comum, a linha de texto do bloco somava 2 à altura dele. */
650
+ .section-hero-eyebrow { display:flex; align-items:center; }
651
+ .section-hero-content > * + * { margin-block-start:var(--space-2); }
652
+ .section-hero-content > * + .section-hero-actions { margin-block-start:var(--space-4); }
653
+ .section-hero-title { margin:0; color:var(--foreground); font-family:var(--font-heading); font-size:var(--text-4xl); line-height:var(--text-4xl-leading); font-weight:var(--weight-bold); letter-spacing:var(--tracking-tight); text-wrap:balance; }
654
+ .section-hero-description { max-inline-size:calc(var(--breakpoint-sm) + var(--space-8)); margin:0; color:var(--muted-foreground); font-size:var(--text-base); line-height:var(--leading-normal); text-wrap:pretty; }
655
+ .section-hero-center .section-hero-description { text-wrap:balance; }
656
+ .section-hero-actions { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-3); }
657
+ .section-hero-center .section-hero-actions { justify-content:center; }
658
+ /* O campo de e-mail no lugar dos botões: o formulário cresce até 480 (o --breakpoint-xs), e não fica do tamanho do texto
659
+ de exemplo. */
660
+ .section-hero-actions > form { flex:1 1 auto; max-inline-size:var(--breakpoint-xs); }
661
+ .section-hero-media { min-inline-size:0; margin-block-start:var(--space-12); }
662
+ @container aurea-hero (min-width:768px) {
663
+ .section-hero-title { font-size:var(--text-6xl); line-height:var(--leading-none); }
664
+ .section-hero-description { font-size:var(--text-lg); line-height:var(--text-lg-leading); }
665
+ }
666
+ @container aurea-hero (min-width:1024px) {
667
+ .section-hero-content > * + :not(.section-hero-actions) { margin-block-start:var(--space-4); }
668
+ .section-hero-split .section-hero-inner { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); align-items:center; gap:var(--space-12); }
669
+ .section-hero-split .section-hero-media { margin-block-start:0; }
670
+ .section-hero-title { font-size:var(--text-7xl); }
671
+ }
621
672
  /* GAR-06 (07/10/2026): a `Section` variant="footer" — o rodapé de site, uma faixa como as outras
622
673
  (fundo, respiro e tema vêm dela). No celular tudo empilha numa coluna; a partir de 768 a marca
623
674
  fica à esquerda e as colunas de links se repartem à direita, cada uma com pelo menos 8rem (a
@@ -982,6 +1033,75 @@ img,svg { display:block; }
982
1033
  }
983
1034
  }
984
1035
 
1036
+ /* O ARRANJO DE DOCUMENTAÇÃO NO CELULAR E NO TABLET (`AppShell layout="docs"`, lote U, 19/10/2026 — o Victor: "tudo como
1037
+ ela"), medido na página da documentação da referência a 375, 768 e 1100:
1038
+ - a LATERAL é coluna desde 768 (e não desde 1024): de 768 a 1023 ela fica à esquerda do texto, como lá;
1039
+ - abaixo de 768 ela é a gaveta, e abre pela DIREITA, do lado do botão (que o `AppShell` põe no fim da barra);
1040
+ - o índice ("On this page") é coluna só de 1280 para cima. Abaixo, ele é a GAVETA da BARRA DO ÍNDICE: uma barra de 40
1041
+ presa logo abaixo do topo, na coluna do texto, com o nome da seção em vista e a setinha; tocar desce a lista. A
1042
+ referência desenha um círculo de progresso; aqui é o ícone de lista, e nenhuma linha (ADR-0072).
1043
+ Estas regras vêm DEPOIS das da gaveta de sempre e levam a classe do arranjo — com a mesma força, a ordem decide. */
1044
+ .docs-toc-bar { display:none; }
1045
+ @media (min-width:768px) and (max-width:1023px) {
1046
+ .app-shell.app-shell-docs { grid-template-columns:var(--docs-sidebar-width) minmax(0,1fr); }
1047
+ .app-shell-docs .btn.nav-toggle { display:none; }
1048
+ .app-shell-docs > .sidebar[popover]:not(.app-shell-aside):not(:popover-open) { display:flex; }
1049
+ .app-shell-docs > .sidebar:not(.app-shell-aside):not(.sidebar-flush) { --shell-top:calc(var(--docs-top) + var(--space-4)); grid-column:1; grid-row:2 / span 2;
1050
+ position:sticky; inset-block-start:var(--shell-top); align-self:start; block-size:calc(100vh - var(--shell-top) - var(--space-8));
1051
+ max-block-size:none; margin:var(--space-4) 0 0; border-width:0; padding-block:var(--space-2) var(--space-4); padding-inline:var(--space-4); }
1052
+ .app-shell-docs > .sidebar > .sidebar-nav > .sidebar-list > li:first-child > .sidebar-group-label { margin-block-start:0; }
1053
+ .app-shell-docs > .sidebar .sidebar-item { padding-inline:var(--space-2); }
1054
+ .app-shell-docs > .sidebar .sidebar-group-label { margin-inline:var(--space-2); }
1055
+ .app-shell-docs > .docs-toc-bar { grid-column:2; grid-row:2; }
1056
+ .app-shell-docs > .content.content { grid-column:2; grid-row:3; }
1057
+ }
1058
+ @media (min-width:1024px) and (max-width:1279px) {
1059
+ .app-shell-docs > .sidebar:not(.app-shell-aside):not(.sidebar-flush) { grid-row:2 / span 2; }
1060
+ .app-shell-docs > .docs-toc-bar { grid-column:3; grid-row:2; }
1061
+ .app-shell-docs > .content.content { grid-row:3; }
1062
+ }
1063
+ @media (max-width:1279px) {
1064
+ .app-shell-docs > .docs-toc-bar { display:block; position:sticky; inset-block-start:var(--docs-top); z-index:var(--z-sticky); background:var(--background); }
1065
+ .docs-toc-toggle { display:flex; align-items:center; gap:var(--space-2); inline-size:100%; min-block-size:var(--space-10); padding:0 var(--space-6);
1066
+ border:0; background:transparent; color:var(--muted-foreground); font:inherit; font-size:var(--text-sm); text-align:start; cursor:pointer; }
1067
+ .docs-toc-toggle:hover { color:var(--foreground); }
1068
+ .docs-toc-toggle:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:calc(-1 * var(--focus-width)); }
1069
+ .docs-toc-current { flex:1; min-inline-size:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
1070
+ .app-shell-docs:has(> .app-shell-aside:popover-open) .docs-toc-toggle > .icon:last-child { rotate:180deg; }
1071
+ }
1072
+ @supports selector(:popover-open) {
1073
+ @media (max-width:1279px) {
1074
+ .app-shell-docs > .sidebar.app-shell-aside[popover]:not(:popover-open) { display:none; }
1075
+ /* Aberto, ele desce da barra: preso logo abaixo dela, na largura da coluna do texto, uma superfície que flutua por cima
1076
+ do texto (o fundo opaco do popover, o canto do cartão). Sem véu: a lista é um atalho, não uma janela. */
1077
+ .app-shell-docs > .sidebar.app-shell-aside[popover]:popover-open { position:fixed; inset-block-start:calc(var(--docs-top) + var(--space-10));
1078
+ inset-block-end:auto; inset-inline:var(--space-4); inline-size:auto; block-size:auto;
1079
+ max-block-size:calc(100dvh - var(--docs-top) - var(--space-10) - var(--space-4)); margin:0; padding:var(--space-2) var(--space-4) var(--space-4);
1080
+ overflow:auto; border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
1081
+ .app-shell-docs > .sidebar.app-shell-aside[popover]::backdrop { background:transparent; }
1082
+ }
1083
+ @media (min-width:768px) and (max-width:1279px) {
1084
+ .app-shell-docs > .sidebar.app-shell-aside[popover]:popover-open { inset-inline-start:calc(var(--docs-sidebar-width) + var(--space-4)); }
1085
+ }
1086
+ @media (max-width:767px) {
1087
+ /* A gaveta ABERTA é uma superfície, mesmo com a lateral sem caixa (`sidebarVariant="plain"`) do desktop: sem o fundo,
1088
+ a lista se misturava ao texto da página por baixo (medido a 375). O fundo e o canto do popover, como o do índice. */
1089
+ .app-shell-docs > .sidebar[popover]:not(.app-shell-aside):popover-open { inset-inline-start:auto; inset-inline-end:var(--space-4);
1090
+ padding:var(--space-2) var(--space-4) var(--space-4); border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
1091
+ .app-shell-docs > .sidebar[popover]:not(.app-shell-aside):popover-open .sidebar-item { padding-inline:var(--space-2); }
1092
+ .app-shell-docs > .sidebar[popover]:not(.app-shell-aside):popover-open .sidebar-group-label { margin-inline:var(--space-2); }
1093
+ }
1094
+ }
1095
+ /* De 1280 para cima o índice é a coluna, e o atributo de gaveta não pode encolhê-lo: a regra da gaveta fechada
1096
+ (`.sidebar[popover]:not(:popover-open)`, `width:auto`) vem antes na folha com a mesma força e o deixava com 200 (medido). */
1097
+ @media (min-width:1280px) {
1098
+ .app-shell-docs > .sidebar.app-shell-aside[popover] { inline-size:var(--docs-toc-width); }
1099
+ }
1100
+ /* No celular o título fica a 32 da barra do índice, como o da referência a 375 (de 768 para cima, 16 nas duas). */
1101
+ @media (max-width:767px) {
1102
+ .app-shell-docs > .content.content { padding-block-start:var(--space-8); }
1103
+ }
1104
+
985
1105
  /* ── A LISTA DA LATERAL (PLANO-1.0, item B1) ───────────────────────────────────────
986
1106
  Até 06/08/2026 a Sidebar era só a caixa: item, grupo, aninhamento e marca de item atual
987
1107
  existiam neste arquivo como `.doc-nav`, que é CHROME do catálogo (achado A6) e nunca foi
@@ -1279,7 +1399,7 @@ img,svg { display:block; }
1279
1399
  altura da barra não muda. O mesmo no `navigation.tsx`. */
1280
1400
  .bottom-nav.bottom-nav-ind-circle-bold .bottom-nav-item { padding:0; }
1281
1401
  .bottom-nav-disc { display:flex; flex-direction:column; align-items:center; justify-content:center; inline-size:var(--bottomnav-bold,3.5rem); max-inline-size:100%; min-height:var(--control-h-lg); padding:var(--space-1); border-radius:var(--radius-full); }
1282
- .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] { color:var(--primary-foreground); }
1402
+ .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] { color:var(--primary-mark); }
1283
1403
  .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .bottom-nav-disc { background:var(--primary); }
1284
1404
  .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .icon { opacity:1; }
1285
1405
  /* O contador do `circle-bold` INVERTE, como o do `.btn-primary`, e a volta atrás está medida.
@@ -1287,8 +1407,8 @@ img,svg { display:block; }
1287
1407
  do Victor mostram. O gate de contraste reprovou no tema CLARO: sobre o amarelo sólido, nem o
1288
1408
  fundo do contador nem o anel branco chegam a 3:1. No escuro passava, e é assim que este defeito
1289
1409
  se esconde. Fio fino não substitui contraste quando as duas cores são claras. */
1290
- .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .badge { background:var(--primary-foreground); color:var(--primary); border-color:transparent; }
1291
- .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .bottom-nav-badge { color:var(--primary-foreground); }
1410
+ .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .badge { background:var(--primary-mark); color:var(--primary); border-color:transparent; }
1411
+ .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .bottom-nav-badge { color:var(--primary-mark); }
1292
1412
  /* ── CÁPSULA (`capsule`) — a "A" da bancada do Victor, 03/10/2026: o modelo de uma das referências ─
1293
1413
  A moldura do ícone vira a cápsula de 56 × 32 do indicador ativo dessa referência
1294
1414
  (`--bottomnav-bold` × `--bottomnav-ring`), em TODOS os itens; só a do escolhido é pintada, de
@@ -1299,9 +1419,9 @@ img,svg { display:block; }
1299
1419
  mesma razão medida do `circle-bold`, logo acima. */
1300
1420
  .bottom-nav-ind-capsule .bottom-nav-mark { width:var(--bottomnav-bold,3.5rem); height:var(--bottomnav-ring); border-radius:var(--radius-full); }
1301
1421
  .bottom-nav-ind-capsule .bottom-nav-badge { inset-inline-end:calc((var(--bottomnav-bold,3.5rem) - var(--bottomnav-ring)) / 2 - var(--space-05)); }
1302
- .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .bottom-nav-mark { background:var(--primary); color:var(--primary-foreground); }
1422
+ .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .bottom-nav-mark { background:var(--primary); color:var(--primary-mark); }
1303
1423
  .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .icon { opacity:1; }
1304
- .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .badge { background:var(--primary-foreground); color:var(--primary); border-color:transparent; }
1424
+ .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .badge { background:var(--primary-mark); color:var(--primary); border-color:transparent; }
1305
1425
  /* No `content`, o recheio de sempre (`--space-1`) e não o `--space-3`: com ele cada item teria 80. */
1306
1426
  .bottom-nav-content:not(.bottom-nav-edge).bottom-nav-ind-capsule .bottom-nav-item { padding-inline:var(--space-1); }
1307
1427
  /* ── EXPANDE (`expand`) — a "C" da bancada do Victor, 03/10/2026 ───────────────────────────────
@@ -1315,9 +1435,9 @@ img,svg { display:block; }
1315
1435
  .bottom-nav-ind-expand .bottom-nav-item { flex-direction:row; gap:var(--space-2); min-width:var(--target-min); min-height:var(--target-min); padding:0; }
1316
1436
  .bottom-nav-ind-expand .bottom-nav-mark { width:var(--icon-lg); }
1317
1437
  .bottom-nav-ind-expand .bottom-nav-label { font-size:var(--text-sm); }
1318
- .bottom-nav-ind-expand .bottom-nav-item[aria-current] { flex:none; inline-size:calc(var(--icon-lg) + var(--space-2) + var(--space-20) + 2 * var(--space-3)); padding-inline:var(--space-3); background:var(--primary); color:var(--primary-foreground); }
1438
+ .bottom-nav-ind-expand .bottom-nav-item[aria-current] { flex:none; inline-size:calc(var(--icon-lg) + var(--space-2) + var(--space-20) + 2 * var(--space-3)); padding-inline:var(--space-3); background:var(--primary); color:var(--primary-mark); }
1319
1439
  .bottom-nav-ind-expand .bottom-nav-item[aria-current] .icon { opacity:1; }
1320
- .bottom-nav-ind-expand .bottom-nav-item[aria-current] .badge { background:var(--primary-foreground); color:var(--primary); border-color:transparent; }
1440
+ .bottom-nav-ind-expand .bottom-nav-item[aria-current] .badge { background:var(--primary-mark); color:var(--primary); border-color:transparent; }
1321
1441
  .bottom-nav-content:not(.bottom-nav-edge).bottom-nav-ind-expand .bottom-nav-item:not([aria-current]) { flex:none; inline-size:var(--target-min); padding-inline:0; }
1322
1442
 
1323
1443
  /* ── A LINHA DE LISTA TOCÁVEL (§4.3 do CONSUMIDOR-1) ──────────────────────────
@@ -1858,6 +1978,11 @@ img,svg { display:block; }
1858
1978
  linha passa a ser só o adorno de 100%, que é o que se quer. */
1859
1979
  .input-group>.input,.input-group>.select,.input-group>.textarea { flex:1 1 0; min-inline-size:0; background:transparent; border:0; border-radius:0; }
1860
1980
  .input-group>.input:focus-visible,.input-group>.select:focus-visible,.input-group>.textarea:focus-visible { outline:none; }
1981
+ /* Desativado (lote 1, 20/10/2026): no grupo, quem pinta o estado é a moldura, como no inválido — só o texto recuava, e o
1982
+ fundo e o ícone ficavam iguais. O campo de dentro não recua de novo (seriam 0,25). Só o CAMPO conta: um botão
1983
+ desativado no adorno (o de limpar, sem texto) não desativa o grupo. */
1984
+ .input-group:has(> :is(.input,.select,.textarea):disabled) { opacity:var(--opacity-disabled); cursor:not-allowed; }
1985
+ .input-group>.input:disabled,.input-group>.select:disabled,.input-group>.textarea:disabled { opacity:1; }
1861
1986
  /* O adorno não estica nem encolhe, e nunca rouba o clique do campo — a menos que ele PRÓPRIO
1862
1987
  seja clicável, e aí quem devolve o ponteiro é o botão de dentro. */
1863
1988
  .input-group-addon { display:inline-flex; flex:none; align-items:center; gap:var(--space-1); color:var(--subtle-foreground); }
@@ -1963,7 +2088,9 @@ img,svg { display:block; }
1963
2088
  de virar a seta seriam dois idiomas para "isto está aberto". */
1964
2089
  .collapsible { display:grid; }
1965
2090
  .collapsible-trigger { display:flex; align-items:center; gap:var(--space-2); inline-size:100%; min-block-size:var(--control-h-sm); padding:0; border:0; background:transparent; color:var(--foreground); font:inherit; font-weight:var(--weight-medium); text-align:start; cursor:pointer; }
1966
- .collapsible-trigger:hover { color:var(--primary); }
2091
+ .collapsible-trigger:hover:not([data-disabled]) { color:var(--primary); }
2092
+ /* Desativado (lote 1, 20/10/2026): o motor marca o gatilho com `data-disabled`; ele recua e não acende no hover. */
2093
+ .collapsible-trigger[data-disabled] { opacity:var(--opacity-disabled); cursor:not-allowed; }
1967
2094
  .collapsible-chevron { flex:none; transition:transform var(--duration-fast) var(--ease-standard); }
1968
2095
  .collapsible-trigger[data-panel-open] .collapsible-chevron { transform:rotate(180deg); }
1969
2096
  .collapsible-panel { overflow:hidden; }
@@ -2054,7 +2181,12 @@ img,svg { display:block; }
2054
2181
  /* A opção marcada fica CHEIA, com o ponto no meio, como a da referência (o ponto dela tem 8 numa
2055
2182
  marca de 16: a metade). Era vazia, com o ponto amarelo. */
2056
2183
  .radio input:checked + .control-mark { background:var(--control-selected); border-color:transparent; }
2057
- .radio input:checked + .control-mark:after { content:""; width:50%; height:50%; border-radius:50%; background:var(--control-selected-foreground); }
2184
+ /* A BOLINHA tem 6 de 14, a da referência (`scale: 0.4286` no CSS publicado dela, 3.2.6), e é ENCOLHIDA POR ESCALA a
2185
+ partir do miolo inteiro, e não desenhada pequena (17/10/2026 — o Victor: "a bolinha do rádio não está centralizada, é
2186
+ torta"). Medido na imagem: a de antes, 7 dentro de 14, ficava meio ponto acima e à esquerda do centro em todo zoom —
2187
+ a folga de 3,5 virava 3 de um lado e 4 do outro. A escala gira em torno do centro exato da caixa. */
2188
+ .radio input:checked + .control-mark:after { content:""; inline-size:100%; block-size:100%; border-radius:50%;
2189
+ background:var(--control-selected-dot); scale:calc(3 / 7); }
2058
2190
  .switch { display:inline-flex; align-items:center; gap:var(--space-3); font-size:var(--text-sm); font-weight:var(--weight-medium); cursor:pointer; } .switch input { position:absolute; opacity:0; }
2059
2191
  /* O TRILHO DO SWITCH (0.32.0): o da referência, 40 × 20 (sm 32 × 16, lg 48 × 24) — a largura é o
2060
2192
  dobro da altura. Era 42 × 24. A altura é a de controle MENOS 16: dá exatamente os três dela
@@ -2078,7 +2210,11 @@ img,svg { display:block; }
2078
2210
  mesma distância nos dois sentidos de escrita. */
2079
2211
  .switch-track:after { --thumb-h:calc(var(--switch-h) - 2 * var(--space-05)); --thumb-w:calc(var(--thumb-h) * 11 / 8); content:""; position:absolute; inset-inline-start:calc(var(--space-05) - var(--border-width)); top:calc(var(--space-05) - var(--border-width)); block-size:var(--thumb-h); inline-size:var(--thumb-w); border-radius:var(--radius-full); background:var(--muted-foreground); transition:transform var(--duration-base) var(--ease-standard),background var(--duration-base) var(--ease-standard); }
2080
2212
  .switch-track { --switch-x:calc(var(--switch-h) * 2 - (var(--switch-h) - 2 * var(--space-05)) * 11 / 8 - 2 * var(--space-05)); }
2081
- .switch input:checked + .switch-track { background:var(--control-selected); border-color:transparent; } .switch input:checked + .switch-track:after { transform:translateX(var(--switch-x)); background:var(--control-selected-foreground); }
2213
+ .switch input:checked + .switch-track { background:var(--control-selected); border-color:transparent; } .switch input:checked + .switch-track:after { transform:translateX(var(--switch-x)); background:var(--primary-mark); }
2214
+ /* DESATIVADO (lote 1, as travas, 20/10/2026 — o check 49 achou): o `<input>` é invisível e quem desenha é a marca,
2215
+ então o `disabled` chegava ao campo e nada mudava na tela. A peça inteira recua, marca e nome, como na referência
2216
+ (o estado de desativado dela vai na raiz do controle, a 0,5). Vale também para as opções de um grupo desativado. */
2217
+ .checkbox:has(> input:disabled),.radio:has(> input:disabled),.switch:has(> input:disabled) { opacity:var(--opacity-disabled); cursor:not-allowed; }
2082
2218
  .range { width:100%; accent-color:var(--primary); }
2083
2219
  /* Slider VERTICAL, no `<input type=range>` NATIVO — sem trocar de motor.
2084
2220
 
@@ -2118,7 +2254,7 @@ img,svg { display:block; }
2118
2254
  .slider-track { position:relative; inline-size:100%; block-size:var(--space-5); border-inline:var(--space-3) solid transparent; border-radius:var(--radius-full); background:var(--secondary); }
2119
2255
  .slider-fill { box-sizing:content-box; block-size:100%; margin-inline-start:calc(-1 * var(--space-3)); padding-inline-start:var(--space-3); border-radius:var(--radius-full); background:var(--primary); }
2120
2256
  .slider-thumb { display:grid; place-items:center; inline-size:calc(var(--space-6) + var(--space-1)); block-size:100%; border-radius:var(--radius-full); background:var(--primary); cursor:grab; }
2121
- .slider-thumb::after { content:""; inline-size:var(--space-6); block-size:var(--space-4); border-radius:var(--radius-full); background:var(--primary-foreground); box-shadow:var(--shadow-sm); transition:scale var(--duration-fast) var(--ease-standard); }
2257
+ .slider-thumb::after { content:""; inline-size:var(--space-6); block-size:var(--space-4); border-radius:var(--radius-full); background:var(--primary-mark); box-shadow:var(--shadow-sm); transition:scale var(--duration-fast) var(--ease-standard); }
2122
2258
  .slider-thumb[data-dragging] { cursor:grabbing; }
2123
2259
  .slider-thumb[data-dragging]::after { scale:.9; }
2124
2260
  .slider-thumb:has(input:focus-visible) { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
@@ -2245,7 +2381,14 @@ img,svg { display:block; }
2245
2381
  .btn[aria-pressed="true"]:not(.btn-icon)::after,.segmented button.active::after,.tabs-secondary .tab[data-active]::after,
2246
2382
  .doc-nav a.active::after,.sidebar-item[aria-current]::after { content:""; position:absolute; inset-inline:15px; bottom:0; height:2px; border-radius:var(--radius-full); background:color-mix(in oklab, var(--primary) 75%, transparent); }
2247
2383
  /* e o fio do ativo da lateral segue a marca DELA, pelo mesmo motivo da regra de cor acima. */
2248
- .doc-nav a.active::after,.sidebar-item[aria-current]::after { background:color-mix(in oklab, var(--sidebar-primary) 75%, transparent); }
2384
+ .doc-nav a.active::after,.sidebar-item[aria-current]::after { background:var(--sidebar-current-line, color-mix(in oklab, var(--sidebar-primary) 75%, transparent)); }
2385
+ /* ADR-0076 (20/10/2026), o Victor olhando a bancada: "não quero ele azul, não pode ser na cor do botão?". No claro da Aurea
2386
+ padrão, o item atual da lateral é o botão primário: o fundo amarelo e a letra cinza-escura dele (8,13:1). O fundo já
2387
+ marca o estado, e o fio de baixo some (`--sidebar-current-line` transparente: regra no `::after` não aceitaria a guarda
2388
+ de tema no fim). Só sem `data-brand` (a `lory` tem a lateral dela) e só no claro (no escuro, a letra amarela continua).
2389
+ Sobre o amarelo, a letra de destaque de DENTRO do item (o selo primário de contagem, um ícone de destaque) é a tinta do
2390
+ botão: o azul sobre o amarelo mede 3,49:1 — o axe da varredura achou, no "12" do exemplo da `Sidebar`. */
2391
+ [data-theme="light"] :is(.sidebar-item[aria-current],.doc-nav a.active):not(:where([data-brand],[data-brand] *)):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --sidebar-current-line:transparent; --primary-emphasis:var(--primary-foreground); --sidebar-primary:var(--primary-foreground); background:var(--primary); color:var(--primary-foreground); }
2249
2392
  [data-theme="light"] .is-selected:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-nav[aria-current]:not([aria-current="false"]):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),
2250
2393
  [data-theme="light"] .btn[aria-pressed="true"]:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .segmented button.active:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *)
2251
2394
  { --btn-fg:color-mix(in oklab, var(--primary) 45%, var(--foreground)); color:color-mix(in oklab, var(--primary) 45%, var(--foreground)); }
@@ -2258,7 +2401,8 @@ img,svg { display:block; }
2258
2401
  /* `line-height:1` não é enfeite: sem ele o .badge herdava a entrelinha do pai e a MESMA
2259
2402
  classe media 26px dentro do .brand (lh 18px) e 22px dentro de um .btn-nav (lh 12px) — na
2260
2403
  mesma barra (achado A2, 26/07/2026). Geometria de componente não se decide pelo contexto.
2261
- O .chip do catálogo já tinha aprendido isso; o .badge não. */
2404
+ A etiqueta de código do SITE (a classe `.chip` do `scripts/build-catalog.mjs`, que não é peça da Aurea) já tinha
2405
+ aprendido isso; o .badge não. Desde 19/10/2026 (GAR-20), o componente `Chip` existe: é outro nome do `Badge`. */
2262
2406
  /* 0.32.0: as medidas do Chip da referência (o `Badge` da Aurea é o Chip dela), lidas no CSS publicado:
2263
2407
  24 de altura, 10 até o texto (8 da caixa + 2 do rótulo — aqui, com a borda de 1 que é nossa, 9), 4
2264
2408
  entre o glifo e o texto (era 6); `sm` 20 com 6 até o texto, `lg` 28 com 14 e letra de 14. A cápsula e a
@@ -2272,7 +2416,14 @@ img,svg { display:block; }
2272
2416
  numa fila, `align-self:flex-start` tiraria o selo do meio; o tamanho definido só desliga o
2273
2417
  esticar, que é o que a coluna faz com um item sem tamanho. */
2274
2418
  .badge-fit { inline-size:fit-content; }
2275
- .badge-primary { --badge-accent:var(--primary-emphasis); color:var(--primary-emphasis); border-color:transparent; background:color-mix(in srgb,var(--primary) 10%,transparent); }
2419
+ /* O cheio da marca escreve com a letra do botão amarelo (`--primary-foreground`): na ADR-0073 o acento do claro virou o
2420
+ próprio amarelo, e a letra de antes (`--background`, clara) media 1,75:1 em cima dele. O fundo, na Aurea padrão, é o
2421
+ primário desde a ADR-0076 (a regra logo abaixo). */
2422
+ .badge-primary { --badge-accent:var(--primary-emphasis); --badge-on:var(--primary-foreground); color:var(--primary-emphasis); border-color:transparent; background:color-mix(in srgb,var(--primary) 10%,transparent); }
2423
+ /* ADR-0076 (20/10/2026): na Aurea padrão a letra de destaque do claro é o AZUL, e o cheio continua o AMARELO — o fundo do
2424
+ selo cheio é o primário, e não o acento (com o acento, sairia a letra cinza no azul, 1,99:1). Só sem `data-brand`, como o
2425
+ contorno lá embaixo: na `lory` do claro o primário com a letra dela mede 3,08:1, e o acento dela já é o fundo certo. */
2426
+ .badge-primary:not(:where([data-brand],[data-brand] *)) { --badge-fill:var(--primary); }
2276
2427
  /* TAMANHOS. O md é a base (24px), que não muda — é o que as 103 fichas já usam. */
2277
2428
  .badge-xs { min-height:var(--space-4); padding:0 var(--space-1); border-width:0; }
2278
2429
  .badge-sm { min-height:var(--space-5); padding:0 calc(var(--space-1) + var(--space-05) - var(--border-width)); }
@@ -2357,8 +2508,8 @@ img,svg { display:block; }
2357
2508
  `--background` como texto do sólido serve aos DOIS temas porque o acento já vira com o
2358
2509
  tema: `--success-400` é verde CLARO no escuro e verde ESCURO no claro. */
2359
2510
  /* O selo CHEIO de estado é o botão cheio do mesmo tom (ADR-0061): a mesma cor funda e a mesma letra
2360
- (`--badge-fill`/`--badge-on`). Quem não declara o par (as categorias, a marca, o neutro) segue
2361
- enchendo com o acento, como antes. */
2511
+ (`--badge-fill`/`--badge-on`). Quem não declara o par (as categorias, o neutro) segue enchendo com o
2512
+ acento, como antes; a marca declara a letra (ADR-0073) e, na Aurea padrão, o fundo é o primário (ADR-0076). */
2362
2513
  .badge-solid { background:var(--badge-fill, var(--badge-accent)); color:var(--badge-on, var(--background)); border-color:transparent; }
2363
2514
  .badge-outline { background:transparent; color:var(--badge-accent); border-color:transparent; }
2364
2515
  /* flat (15/10/2026): o tom de sempre sem a linha em volta — o selo da referência não tem borda em forma nenhuma. A
@@ -2478,7 +2629,23 @@ img,svg { display:block; }
2478
2629
  Só o ícone DIRETO do alerta: um ícone dentro do corpo (num botão, num link) é do corpo. */
2479
2630
  .alert>.icon { --step-icon:var(--icon-sm); margin:var(--space-1); color:var(--alert-tone); }
2480
2631
  .banner strong { font-size:var(--text-sm); } .banner p { margin:0; color:var(--muted-foreground); font-size:var(--text-sm); }
2481
- @media (max-width:640px) { .banner { grid-template-columns:auto minmax(0,1fr); } .banner>:last-child { grid-column:2; justify-self:start; } }
2632
+ /* GAR-19 (lote U, 19/10/2026): o aviso de cookies, Banner variant="consent". Uma coluna: o título (h2), o texto e os
2633
+ três botões de MESMO peso numa linha que quebra — rejeitar tão fácil de ver quanto aceitar (o guia da ANPD) —; depois
2634
+ da escolha, a confirmação no lugar deles. O aviso mora no alto da página e não fica preso: com position:fixed ele
2635
+ cobriria o que recebe o foco (WCAG 2.4.11). A janela de preferências é o Dialog, e as categorias, o Switch. */
2636
+ /* O fundo e a sombra são os do cartão, como os do Alert: no fundo cinza do Banner comum, os botões cinza sumiam (medido na
2637
+ bancada). */
2638
+ .banner-consent { grid-template-columns:minmax(0,1fr); align-items:start; gap:var(--space-3); background:var(--card); box-shadow:var(--shadow-sm); }
2639
+ .banner-consent-title { margin:0; color:var(--foreground); font-size:var(--text-base); font-weight:var(--weight-semibold); line-height:var(--leading-tight); }
2640
+ .banner-consent-text { min-inline-size:0; color:var(--muted-foreground); font-size:var(--text-sm); }
2641
+ .banner-consent-text > * + * { margin-block-start:var(--space-2); }
2642
+ .banner-consent-actions { display:flex; flex-wrap:wrap; gap:var(--space-2); }
2643
+ .banner-consent-message { color:var(--foreground); font-size:var(--text-sm); }
2644
+ .banner-consent-categories { display:grid; gap:var(--space-5); }
2645
+ .banner-consent-required { display:grid; gap:var(--space-1); }
2646
+ .banner-consent-required-head { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2); }
2647
+ .banner-consent-required p { margin:0; color:var(--muted-foreground); font-size:var(--text-xs); line-height:var(--space-4); }
2648
+ @media (max-width:640px) { .banner:not(.banner-consent) { grid-template-columns:auto minmax(0,1fr); } .banner:not(.banner-consent)>:last-child { grid-column:2; justify-self:start; } }
2482
2649
  .progress { height:8px; overflow:hidden; border-radius:999px; background:var(--surface-3); }
2483
2650
  .progress>span { display:block; height:100%; border-radius:inherit; background:var(--primary); }
2484
2651
  /* AN-07 (03/10/2026): a caixa de fora, o texto de apoio e o tom. A anatomia é a da barra de progresso da
@@ -2925,6 +3092,26 @@ button.tag-main { cursor:pointer; }
2925
3092
  é inalcançável por teclado (axe scrollable-region-focusable). Quem escreve esta marcação à
2926
3093
  mão precisa de `tabindex="0"` no <pre> — o componente React já o emite. */
2927
3094
  .code-block { overflow:auto; padding:16px; border:1px solid transparent; border-radius:var(--radius-lg); background:var(--surface-inset); color:var(--muted-foreground); font:12px/1.7 var(--font-code); }
3095
+ /* Lote V (20/10/2026): o número da linha e as cores do código (`CodeBlock lineNumbers` e `highlight`). O número é o da
3096
+ referência, medido na página dela: uma coluna de 16 (--space-4), alinhada à direita, a 24 do código (--space-6); ela
3097
+ cresce com os algarismos da última linha (`--code-line-digits`, que o componente escreve), para a coluna não pular
3098
+ na linha 100. A cor é a apagada da Aurea, que se lê (a da referência apaga até ~2:1). O número é DESENHO: não entra
3099
+ no texto copiado (`user-select:none`) nem no leitor de tela (o texto alternativo vazio depois da barra; quem não
3100
+ entende a barra fica com a linha de cima).
3101
+ As cores são as do `CodeEditor` (o `aureaHighlightStyle`), pelos mesmos tokens. Com cor, o texto sem cor é o do
3102
+ tema (`--foreground`), e não o apagado: o apagado fica para o comentário. */
3103
+ .code-block-numbered { counter-reset:aurea-linha; }
3104
+ .code-block-numbered .code-line::before { counter-increment:aurea-linha; content:counter(aurea-linha); content:counter(aurea-linha) / ""; display:inline-block; min-inline-size:max(var(--space-4), calc(var(--code-line-digits, 2) * 1ch)); margin-inline-end:var(--space-6); color:var(--muted-foreground); text-align:end; -webkit-user-select:none; user-select:none; }
3105
+ .code-block-highlighted { color:var(--foreground); }
3106
+ .code-block .tok-comment { color:var(--muted-foreground); font-style:italic; }
3107
+ /* As cores levam 20% do texto, como o nível do registro, que mora no mesmo fundo (`.log-stream`, ADR-0072): puras, o azul
3108
+ caía a 4,08:1 no claro e o verde a 4,44:1 no escuro (medido no site, 20/10/2026). */
3109
+ .code-block .tok-keyword { color:color-mix(in oklab,var(--info-400) 80%,var(--foreground)); }
3110
+ .code-block .tok-string { color:color-mix(in oklab,var(--success-400) 80%,var(--foreground)); }
3111
+ .code-block .tok-number { color:color-mix(in oklab,var(--warning-400) 80%,var(--foreground)); }
3112
+ .code-block .tok-property { color:var(--foreground); }
3113
+ .code-block .tok-function { color:var(--foreground); font-weight:var(--weight-semibold); }
3114
+ .code-block .tok-invalid { color:color-mix(in oklab,var(--danger-400) 80%,var(--foreground)); }
2928
3115
  /* Bloco de código COM copiar: a moldura não rola, o <pre> rola por dentro e o gatilho fica
2929
3116
  parado no canto. O comportamento é do core (aurea.js, [data-aurea-copy]); aqui só a pele.
2930
3117
  O check em amarelo é confirmação instantânea — dura 1,5s e volta ao ícone de copiar. */
@@ -3177,15 +3364,17 @@ button.tag-main { cursor:pointer; }
3177
3364
  `.image`; aqui fica só o que não varia. O `<iframe>` é absoluto porque a altura é da caixa, não
3178
3365
  dele. A fachada é um `<button>` que cobre a caixa inteira: o alvo de clique é o vídeo todo, e o
3179
3366
  anel de foco é o `:focus-visible` global da casa. A pastilha de tocar é amarela porque é a ação
3180
- da tela — o mesmo combinado do `Card variant="brand"`: amarelo só para pedir ação. O anel de
3181
- `--media-scrim` em volta dela não é enfeite: a capa é do consumidor, e numa capa amarela a
3182
- pastilha sumia — medido na primeira imagem mostrada ao Victor, em 24/09/2026. */
3367
+ da tela — o mesmo combinado do `Card variant="brand"`: amarelo só para pedir ação. O ícone dela
3368
+ é o marrom da marca (`--primary-mark`), e ela não tem mais o anel escuro em volta: decisão do
3369
+ Victor, 17/10/2026 (*"não quero preto"*). Numa capa amarela, quem a separa é a sombra. A caixa
3370
+ pinta o fundo só por dentro da borda transparente (`background-clip`): sem isso, o fundo escuro
3371
+ aparecia como um aro de 1 em volta da capa. */
3183
3372
  .media-embed { display:grid; gap:var(--space-2); min-inline-size:0; }
3184
- .media-embed-frame { position:relative; overflow:hidden; border:1px solid transparent; border-radius:var(--radius-card); background:var(--media-canvas); }
3373
+ .media-embed-frame { position:relative; overflow:hidden; border:1px solid transparent; border-radius:var(--radius-card); background:var(--media-canvas); background-clip:padding-box; }
3185
3374
  .media-embed-frame>iframe { position:absolute; inset:0; inline-size:100%; block-size:100%; border:0; }
3186
3375
  .media-embed-facade { position:absolute; inset:0; display:grid; place-items:center; padding:0; border:0; border-radius:inherit; background:var(--media-canvas); color:var(--media-foreground); cursor:pointer; }
3187
3376
  .media-embed-facade>img { position:absolute; inset:0; inline-size:100%; block-size:100%; object-fit:cover; }
3188
- .media-embed-play { position:relative; display:grid; place-items:center; inline-size:var(--control-h-lg); block-size:var(--control-h-lg); border-radius:var(--radius-full); background:var(--primary); color:var(--primary-foreground); box-shadow:0 0 0 var(--space-1) var(--media-scrim),var(--shadow-lg); }
3377
+ .media-embed-play { position:relative; display:grid; place-items:center; inline-size:var(--control-h-lg); block-size:var(--control-h-lg); border-radius:var(--radius-full); background:var(--primary); color:var(--primary-mark); box-shadow:var(--shadow-lg); }
3189
3378
  .media-embed-facade:hover .media-embed-play { transform:scale(1.06); }
3190
3379
  .media-embed-link { display:inline-flex; align-items:center; gap:var(--space-1); justify-self:start; color:var(--muted-foreground); font-size:var(--text-sm); }
3191
3380
  .media-embed-link:hover { color:var(--foreground); }
@@ -3302,7 +3491,10 @@ button.tag-main { cursor:pointer; }
3302
3491
  /* `0.9em` e não um token: código dentro do texto se mede em relação à LINHA em que está, e um
3303
3492
  valor absoluto o deixaria maior que o parágrafo dentro de um h2. É o mesmo motivo pelo qual o
3304
3493
  `.badge` tem `line-height:1` — geometria que depende do contexto se escreve relativa. */
3305
- .prose code { padding:var(--space-05) var(--space-1); border-radius:var(--radius-xs); background:var(--surface-2); font-family:var(--font-code); font-size:0.9em; }
3494
+ /* `overflow-wrap:anywhere` (18/10/2026, lote U): código no meio do texto é uma palavra só — `window.Aurea.setDensity("compact")`
3495
+ —, e sem a quebra ele empurrava a página para o lado a 320 (medido na página Density do site; a WCAG 1.4.10 pede que
3496
+ nada role para o lado). Dentro do `pre` ela não age: lá o `white-space` não quebra, e a caixa rola. */
3497
+ .prose code { padding:var(--space-05) var(--space-1); border-radius:var(--radius-xs); background:var(--surface-2); font-family:var(--font-code); font-size:0.9em; overflow-wrap:anywhere; }
3306
3498
  .prose pre { overflow-x:auto; padding:var(--space-4); border:1px solid transparent; border-radius:var(--radius-card); background:var(--surface-2); }
3307
3499
  .prose pre code { padding:0; border-radius:0; background:transparent; font-size:var(--text-sm); }
3308
3500
  .prose img { max-width:100%; height:auto; border-radius:var(--radius-lg); }
@@ -3616,7 +3808,8 @@ button.tag-main { cursor:pointer; }
3616
3808
  /* A largura é a do GLIFO que mora dentro (`--icon-sm`, o mesmo do `<Icon size="sm">`), e não um
3617
3809
  px cru: assim o slot acompanha a escala de glifo do sistema em vez de fixar um número. */
3618
3810
  .menu-mark { flex:none; display:inline-flex; align-items:center; justify-content:center; inline-size:var(--icon-sm); block-size:var(--icon-sm); color:var(--primary); }
3619
- /* METADE do slot, pela mesma razão do `.control-mark:after` do rádio: a marca é proporcional. */
3811
+ /* METADE do slot: a marca é proporcional, e PAR (8 em 16), então fica no centro em qualquer zoom — o ponto do `Radio`
3812
+ precisou de escala porque o dele era ímpar (17/10/2026). */
3620
3813
  .menu-ponto { inline-size:calc(var(--icon-sm) / 2); block-size:calc(var(--icon-sm) / 2); border-radius:50%; background:currentColor; }
3621
3814
  /* O rótulo de grupo NÃO é item: não é focável, não é clicável, e a pele não pode sugerir que é. */
3622
3815
  .menu-label { padding:var(--space-2) var(--menu-px) var(--space-1); color:var(--muted-foreground); font-size:var(--text-xs); font-weight:var(--weight-semibold); }
@@ -4150,6 +4343,15 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
4150
4343
  .graph-node { position:relative; inline-size:var(--graph-node-w,180px); }
4151
4344
  .graph-node-body { display:grid; gap:var(--space-05); inline-size:100%; padding:var(--space-2) var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); color:var(--foreground); font-family:inherit; font-size:var(--text-sm); text-align:start; }
4152
4345
  button.graph-node-body { cursor:pointer; }
4346
+ /* O PONTEIRO NOS BOTÕES DO NÓ (lote U, 19/10/2026 — o pedido 16 do app de topologia). Fora do modo de arrumar, o nó vai ao
4347
+ motor como não escolhível (`selectable:false`, pela trava `alvo-clicavel`), e o motor tira o ponteiro do invólucro
4348
+ (`.react-flow__node`) quando o nó não é escolhível nem arrastável e o app não passa `onNodeClick`/`onNodeMouse*` — os
4349
+ botões de dentro herdavam o `none`, e o clique de mouse no corpo não chegava ao `onSelect` (pelo teclado chegava). Os
4350
+ botões pegam o ponteiro de volta: o corpo só é botão quando há `onSelect` (sem ele, segue sem ponteiro, como a trava
4351
+ pede); o de recolher e o de fechar o contêiner são sempre botões. A regra sai presa ao `.dependency-graph`, e não à
4352
+ classe do motor (o check 15 barra classe de terceiro no core): o `pointer-events` herda, e o `auto` no botão vale
4353
+ embaixo de qualquer invólucro. */
4354
+ .dependency-graph :is(button.graph-node-body,.graph-node-toggle,.graph-group-toggle) { pointer-events:auto; }
4153
4355
  .graph-node[data-selected] .graph-node-body { border-color:transparent; background:color-mix(in oklab,var(--primary) 14%,var(--card)); }
4154
4356
  .graph-node-label { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:var(--weight-medium); }
4155
4357
  /* `kind` é TEXTO, e não cor: a referência pinta dez tipos de nó em dez cores, e é a quarta vez
@@ -4495,6 +4697,12 @@ button.graph-node-body { cursor:pointer; }
4495
4697
  da "C" dos botões): com a letra de sempre, o verde caía a 3,79:1 no claro e o `success` a 4,15:1 no escuro, dentro do
4496
4698
  cartão. Medido em 16/10/2026: o pior caso passa a 4,79:1. Os outros selos (suave, plano) têm fundo próprio e não mudam. */
4497
4699
  .badge-outline { background-color:color-mix(in oklab,var(--badge-accent) 16%,transparent); color:color-mix(in oklab,var(--badge-accent) 80%,var(--foreground)); }
4700
+ /* Menos o primário da Aurea (ADR-0073, decisão do Victor de 18/10/2026, "A"): a letra é o próprio acento (o amarelo no
4701
+ escuro; o azul no claro, desde a ADR-0076), a mesma do selo suave e do botão de contorno da marca — misturado ao texto,
4702
+ o amarelo virava mostarda (2,36:1) só nesta peça. A
4703
+ referência principal usa a mesma letra no suave e no contorno. Só sem `data-brand`: na `lory` do claro, sem a
4704
+ mistura, a letra cairia de 5,56 para 4,42:1. */
4705
+ .badge-primary.badge-outline:not(:where([data-brand],[data-brand] *)) { color:var(--badge-accent); }
4498
4706
  /* O registro ganhou o fundo dos campos; o nível `info` (o azul) caía a 4,08:1 sobre ele no claro. A mesma letra 20% para o texto. */
4499
4707
  .log-stream .log-level.info { color:color-mix(in oklab,var(--info-400) 80%,var(--foreground)); }
4500
4708
  .step:not(.step-done,.step-active,.step-error,.done,.active) .step-dot { background-color:var(--fill-3-solid); }
package/dist/aurea.js CHANGED
@@ -240,6 +240,10 @@
240
240
  }
241
241
  if (!targets.length) return;
242
242
  var seen = {};
243
+ // A BARRA DO ÍNDICE do `AppShell layout="docs"` (lote U, 19/10/2026): abaixo de 1280 o índice é a gaveta dela, e ela
244
+ // mostra o nome da seção em vista, como a da referência. É o mesmo cálculo; aqui só se escreve o nome lá.
245
+ var shell = toc.closest ? toc.closest(".app-shell") : null;
246
+ var nomeNaBarra = shell ? shell.querySelector("[data-toc-current]") : null;
243
247
  var observer = new IntersectionObserver(function (entries) {
244
248
  // Se o React assumiu este índice depois de nós, saímos. A ordem importa e não é
245
249
  // controlável: `initTocs` roda no DOMContentLoaded, e a hidratação pode vir depois. Sem
@@ -255,6 +259,7 @@
255
259
  if (id === current) links[id].setAttribute("aria-current", "true");
256
260
  else links[id].removeAttribute("aria-current");
257
261
  }
262
+ if (nomeNaBarra && links[current]) nomeNaBarra.textContent = links[current].textContent;
258
263
  }, {rootMargin: "0px 0px -75% 0px"});
259
264
  for (var k = 0; k < targets.length; k++) observer.observe(targets[k]);
260
265
  }
@@ -350,6 +355,19 @@
350
355
  for (var g = 0; g < abertas.length; g++) if (estaAberta(abertas[g])) abertas[g].hidePopover();
351
356
  };
352
357
  if (desktop.addEventListener) desktop.addEventListener("change", aoSubir);
358
+ // No `layout="docs"` (lote U) a lateral é coluna desde 768 e o índice desde 1280: cada gaveta fecha no corte DELA.
359
+ // 768 e 1280 são o `--breakpoint-md` e o `--breakpoint-xl`, os cortes do arranjo na folha.
360
+ var cortes = [["(min-width: 768px)", ".app-shell-docs > .sidebar[popover]:not(.app-shell-aside)"],
361
+ ["(min-width: 1280px)", ".app-shell-docs > .sidebar.app-shell-aside[popover]"]];
362
+ cortes.forEach(function (par) {
363
+ var mq = window.matchMedia(par[0]);
364
+ if (!mq.addEventListener) return;
365
+ mq.addEventListener("change", function (e) {
366
+ if (!e.matches) return;
367
+ var gavetas = document.querySelectorAll(par[1]);
368
+ for (var g = 0; g < gavetas.length; g++) if (estaAberta(gavetas[g])) gavetas[g].hidePopover();
369
+ });
370
+ });
353
371
  }
354
372
 
355
373
  function toastStack() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurea-uds/core",
3
- "version": "0.35.0",
3
+ "version": "0.37.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",