@aurea-uds/core 0.35.0 → 0.36.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,7 @@
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;
7
8
  --white:oklch(1 0 0);
8
9
  --black:oklch(0 0 0);
9
10
  --font-ui:"Atkinson Hyperlegible Next","Segoe UI",sans-serif;
@@ -20,6 +21,8 @@
20
21
  --text-3xl:1.875rem;
21
22
  --text-4xl:2.25rem;
22
23
  --text-5xl:3rem;
24
+ --text-6xl:3.75rem;
25
+ --text-7xl:4.5rem;
23
26
  --leading-tight:1.2;
24
27
  --leading-normal:1.5;
25
28
  --leading-relaxed:1.7;
@@ -152,7 +155,7 @@
152
155
  --popover:#292929;
153
156
  --popover-foreground:#ffffff;
154
157
  --primary:var(--brand-yellow);
155
- --primary-foreground:var(--brand-yellow-foreground);
158
+ --primary-foreground:var(--brand-yellow-ink);
156
159
  --link:var(--brand-yellow);
157
160
  --link-hover:var(--brand-yellow);
158
161
  --secondary:#333333;
@@ -174,7 +177,7 @@
174
177
  --sidebar:#292929;
175
178
  --sidebar-foreground:#ffffff;
176
179
  --sidebar-primary:var(--brand-yellow);
177
- --sidebar-primary-foreground:var(--brand-yellow-foreground);
180
+ --sidebar-primary-foreground:var(--brand-yellow-ink);
178
181
  --sidebar-accent:#333333;
179
182
  --sidebar-accent-foreground:#ffffff;
180
183
  --sidebar-border:#525252;
@@ -198,7 +201,9 @@
198
201
  --primary-emphasis:var(--primary);
199
202
  --primary-outline:var(--primary);
200
203
  --control-selected:var(--primary);
201
- --control-selected-foreground:var(--primary-foreground);
204
+ --control-selected-foreground:var(--brand-yellow-ink);
205
+ --control-selected-dot:oklch(0.985 0 0);
206
+ --primary-mark:var(--brand-yellow-foreground);
202
207
  --selection:oklch(0.795 0.184 86.047 / 0.22);
203
208
  --success-bg:#052505;
204
209
  --warning-bg:#4a1e04;
@@ -242,9 +247,9 @@
242
247
  --popover:#ffffff;
243
248
  --popover-foreground:#242424;
244
249
  --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);
250
+ --primary-foreground:var(--brand-yellow-ink);
251
+ --link:var(--brand-yellow);
252
+ --link-hover:var(--brand-yellow);
248
253
  --secondary:#ebebeb;
249
254
  --secondary-foreground:#242424;
250
255
  --muted:var(--secondary);
@@ -264,7 +269,7 @@
264
269
  --sidebar:var(--card);
265
270
  --sidebar-foreground:#242424;
266
271
  --sidebar-primary:var(--primary-emphasis);
267
- --sidebar-primary-foreground:var(--brand-yellow-foreground);
272
+ --sidebar-primary-foreground:var(--brand-yellow-ink);
268
273
  --sidebar-accent:var(--secondary);
269
274
  --sidebar-accent-foreground:#242424;
270
275
  --sidebar-border:#e0e0e0;
@@ -284,11 +289,13 @@
284
289
  --secondary-hover:var(--surface-hover);
285
290
  --segment:oklch(1 0 0);
286
291
  --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);
292
+ --focus-strong:var(--foreground);
293
+ --primary-emphasis:var(--brand-yellow);
294
+ --primary-outline:var(--brand-yellow);
295
+ --control-selected:var(--brand-yellow);
296
+ --control-selected-foreground:var(--brand-yellow-ink);
297
+ --control-selected-dot:oklch(0.985 0 0);
298
+ --primary-mark:var(--brand-yellow-foreground);
292
299
  --success-400:#0e700e;
293
300
  --warning-400:#8a3707;
294
301
  --danger-400:#b10e1c;
@@ -366,6 +373,8 @@
366
373
  --selection:oklch(0.32 0.08 50);
367
374
  --control-selected:oklch(0.72 0.19 48);
368
375
  --control-selected-foreground:oklch(0.16 0.02 250);
376
+ --control-selected-dot:oklch(0.16 0.02 250);
377
+ --primary-mark:oklch(0.16 0.02 250);
369
378
  --overlay:oklch(0 0 0 / 0.6);
370
379
  --chart-1:oklch(0.74 0.18 50);
371
380
  --chart-2:oklch(0.84 0.14 88);
@@ -428,6 +437,8 @@
428
437
  --selection:oklch(0.96 0.04 60);
429
438
  --control-selected:oklch(0.682 0.197 44.5);
430
439
  --control-selected-foreground:oklch(1 0 0);
440
+ --control-selected-dot:oklch(1 0 0);
441
+ --primary-mark:oklch(1 0 0);
431
442
  --overlay:oklch(0.16 0.018 250 / 0.45);
432
443
  --chart-1:oklch(0.682 0.197 44.5);
433
444
  --chart-2:oklch(0.82 0.15 88);
@@ -450,6 +461,8 @@
450
461
  --warning-bg:oklch(0.95 0.06 80);
451
462
  --danger-bg:oklch(0.95 0.05 25);
452
463
  --info-bg:oklch(0.95 0.04 235);
464
+ --link:oklch(0.52 0.106 86.047);
465
+ --link-hover:oklch(0.44 0.106 86.047);
453
466
  }
454
467
  [data-density="compact"]{
455
468
  --control-h-xs:1.5rem;
@@ -618,6 +631,43 @@ img,svg { display:block; }
618
631
  .section-inset { background:var(--surface-inset); }
619
632
  .section-spacing-sm { padding-block:var(--space-8); }
620
633
  @media (min-width:768px) { .section { padding-block:var(--space-24); } .section-spacing-sm { padding-block:var(--space-12); } }
634
+ /* 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
635
+ 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
636
+ 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
637
+ 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
638
+ do Victor; as larguras, desta peça). Com imagem e align="start", o texto e a imagem lado a lado a partir de 1024;
639
+ abaixo disso, a imagem desce.
640
+ As larguras são da FAIXA, e não da janela (`@container`, como o `.media-player`): de ponta a ponta, a faixa tem a
641
+ 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
642
+ 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
643
+ na tela larga mais comum. */
644
+ .section-hero { container:aurea-hero / inline-size; }
645
+ .section-hero-content { display:grid; justify-items:start; min-inline-size:0; }
646
+ .section-hero-center .section-hero-content { justify-items:center; text-align:center; }
647
+ .section-hero-text { display:grid; justify-items:inherit; }
648
+ /* A sobrelinha em flex: com um selo ou link dentro de um bloco comum, a linha de texto do bloco somava 2 à altura dele. */
649
+ .section-hero-eyebrow { display:flex; align-items:center; }
650
+ .section-hero-content > * + * { margin-block-start:var(--space-2); }
651
+ .section-hero-content > * + .section-hero-actions { margin-block-start:var(--space-4); }
652
+ .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; }
653
+ .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; }
654
+ .section-hero-center .section-hero-description { text-wrap:balance; }
655
+ .section-hero-actions { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-3); }
656
+ .section-hero-center .section-hero-actions { justify-content:center; }
657
+ /* 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
658
+ de exemplo. */
659
+ .section-hero-actions > form { flex:1 1 auto; max-inline-size:var(--breakpoint-xs); }
660
+ .section-hero-media { min-inline-size:0; margin-block-start:var(--space-12); }
661
+ @container aurea-hero (min-width:768px) {
662
+ .section-hero-title { font-size:var(--text-6xl); line-height:var(--leading-none); }
663
+ .section-hero-description { font-size:var(--text-lg); line-height:var(--text-lg-leading); }
664
+ }
665
+ @container aurea-hero (min-width:1024px) {
666
+ .section-hero-content > * + :not(.section-hero-actions) { margin-block-start:var(--space-4); }
667
+ .section-hero-split .section-hero-inner { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); align-items:center; gap:var(--space-12); }
668
+ .section-hero-split .section-hero-media { margin-block-start:0; }
669
+ .section-hero-title { font-size:var(--text-7xl); }
670
+ }
621
671
  /* GAR-06 (07/10/2026): a `Section` variant="footer" — o rodapé de site, uma faixa como as outras
622
672
  (fundo, respiro e tema vêm dela). No celular tudo empilha numa coluna; a partir de 768 a marca
623
673
  fica à esquerda e as colunas de links se repartem à direita, cada uma com pelo menos 8rem (a
@@ -982,6 +1032,75 @@ img,svg { display:block; }
982
1032
  }
983
1033
  }
984
1034
 
1035
+ /* O ARRANJO DE DOCUMENTAÇÃO NO CELULAR E NO TABLET (`AppShell layout="docs"`, lote U, 19/10/2026 — o Victor: "tudo como
1036
+ ela"), medido na página da documentação da referência a 375, 768 e 1100:
1037
+ - a LATERAL é coluna desde 768 (e não desde 1024): de 768 a 1023 ela fica à esquerda do texto, como lá;
1038
+ - abaixo de 768 ela é a gaveta, e abre pela DIREITA, do lado do botão (que o `AppShell` põe no fim da barra);
1039
+ - o índice ("On this page") é coluna só de 1280 para cima. Abaixo, ele é a GAVETA da BARRA DO ÍNDICE: uma barra de 40
1040
+ 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
1041
+ referência desenha um círculo de progresso; aqui é o ícone de lista, e nenhuma linha (ADR-0072).
1042
+ Estas regras vêm DEPOIS das da gaveta de sempre e levam a classe do arranjo — com a mesma força, a ordem decide. */
1043
+ .docs-toc-bar { display:none; }
1044
+ @media (min-width:768px) and (max-width:1023px) {
1045
+ .app-shell.app-shell-docs { grid-template-columns:var(--docs-sidebar-width) minmax(0,1fr); }
1046
+ .app-shell-docs .btn.nav-toggle { display:none; }
1047
+ .app-shell-docs > .sidebar[popover]:not(.app-shell-aside):not(:popover-open) { display:flex; }
1048
+ .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;
1049
+ position:sticky; inset-block-start:var(--shell-top); align-self:start; block-size:calc(100vh - var(--shell-top) - var(--space-8));
1050
+ 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); }
1051
+ .app-shell-docs > .sidebar > .sidebar-nav > .sidebar-list > li:first-child > .sidebar-group-label { margin-block-start:0; }
1052
+ .app-shell-docs > .sidebar .sidebar-item { padding-inline:var(--space-2); }
1053
+ .app-shell-docs > .sidebar .sidebar-group-label { margin-inline:var(--space-2); }
1054
+ .app-shell-docs > .docs-toc-bar { grid-column:2; grid-row:2; }
1055
+ .app-shell-docs > .content.content { grid-column:2; grid-row:3; }
1056
+ }
1057
+ @media (min-width:1024px) and (max-width:1279px) {
1058
+ .app-shell-docs > .sidebar:not(.app-shell-aside):not(.sidebar-flush) { grid-row:2 / span 2; }
1059
+ .app-shell-docs > .docs-toc-bar { grid-column:3; grid-row:2; }
1060
+ .app-shell-docs > .content.content { grid-row:3; }
1061
+ }
1062
+ @media (max-width:1279px) {
1063
+ .app-shell-docs > .docs-toc-bar { display:block; position:sticky; inset-block-start:var(--docs-top); z-index:var(--z-sticky); background:var(--background); }
1064
+ .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);
1065
+ border:0; background:transparent; color:var(--muted-foreground); font:inherit; font-size:var(--text-sm); text-align:start; cursor:pointer; }
1066
+ .docs-toc-toggle:hover { color:var(--foreground); }
1067
+ .docs-toc-toggle:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:calc(-1 * var(--focus-width)); }
1068
+ .docs-toc-current { flex:1; min-inline-size:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
1069
+ .app-shell-docs:has(> .app-shell-aside:popover-open) .docs-toc-toggle > .icon:last-child { rotate:180deg; }
1070
+ }
1071
+ @supports selector(:popover-open) {
1072
+ @media (max-width:1279px) {
1073
+ .app-shell-docs > .sidebar.app-shell-aside[popover]:not(:popover-open) { display:none; }
1074
+ /* Aberto, ele desce da barra: preso logo abaixo dela, na largura da coluna do texto, uma superfície que flutua por cima
1075
+ do texto (o fundo opaco do popover, o canto do cartão). Sem véu: a lista é um atalho, não uma janela. */
1076
+ .app-shell-docs > .sidebar.app-shell-aside[popover]:popover-open { position:fixed; inset-block-start:calc(var(--docs-top) + var(--space-10));
1077
+ inset-block-end:auto; inset-inline:var(--space-4); inline-size:auto; block-size:auto;
1078
+ 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);
1079
+ overflow:auto; border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
1080
+ .app-shell-docs > .sidebar.app-shell-aside[popover]::backdrop { background:transparent; }
1081
+ }
1082
+ @media (min-width:768px) and (max-width:1279px) {
1083
+ .app-shell-docs > .sidebar.app-shell-aside[popover]:popover-open { inset-inline-start:calc(var(--docs-sidebar-width) + var(--space-4)); }
1084
+ }
1085
+ @media (max-width:767px) {
1086
+ /* A gaveta ABERTA é uma superfície, mesmo com a lateral sem caixa (`sidebarVariant="plain"`) do desktop: sem o fundo,
1087
+ 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. */
1088
+ .app-shell-docs > .sidebar[popover]:not(.app-shell-aside):popover-open { inset-inline-start:auto; inset-inline-end:var(--space-4);
1089
+ 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); }
1090
+ .app-shell-docs > .sidebar[popover]:not(.app-shell-aside):popover-open .sidebar-item { padding-inline:var(--space-2); }
1091
+ .app-shell-docs > .sidebar[popover]:not(.app-shell-aside):popover-open .sidebar-group-label { margin-inline:var(--space-2); }
1092
+ }
1093
+ }
1094
+ /* De 1280 para cima o índice é a coluna, e o atributo de gaveta não pode encolhê-lo: a regra da gaveta fechada
1095
+ (`.sidebar[popover]:not(:popover-open)`, `width:auto`) vem antes na folha com a mesma força e o deixava com 200 (medido). */
1096
+ @media (min-width:1280px) {
1097
+ .app-shell-docs > .sidebar.app-shell-aside[popover] { inline-size:var(--docs-toc-width); }
1098
+ }
1099
+ /* 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). */
1100
+ @media (max-width:767px) {
1101
+ .app-shell-docs > .content.content { padding-block-start:var(--space-8); }
1102
+ }
1103
+
985
1104
  /* ── A LISTA DA LATERAL (PLANO-1.0, item B1) ───────────────────────────────────────
986
1105
  Até 06/08/2026 a Sidebar era só a caixa: item, grupo, aninhamento e marca de item atual
987
1106
  existiam neste arquivo como `.doc-nav`, que é CHROME do catálogo (achado A6) e nunca foi
@@ -1279,7 +1398,7 @@ img,svg { display:block; }
1279
1398
  altura da barra não muda. O mesmo no `navigation.tsx`. */
1280
1399
  .bottom-nav.bottom-nav-ind-circle-bold .bottom-nav-item { padding:0; }
1281
1400
  .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); }
1401
+ .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] { color:var(--primary-mark); }
1283
1402
  .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .bottom-nav-disc { background:var(--primary); }
1284
1403
  .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .icon { opacity:1; }
1285
1404
  /* O contador do `circle-bold` INVERTE, como o do `.btn-primary`, e a volta atrás está medida.
@@ -1287,8 +1406,8 @@ img,svg { display:block; }
1287
1406
  do Victor mostram. O gate de contraste reprovou no tema CLARO: sobre o amarelo sólido, nem o
1288
1407
  fundo do contador nem o anel branco chegam a 3:1. No escuro passava, e é assim que este defeito
1289
1408
  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); }
1409
+ .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .badge { background:var(--primary-mark); color:var(--primary); border-color:transparent; }
1410
+ .bottom-nav-ind-circle-bold .bottom-nav-item[aria-current] .bottom-nav-badge { color:var(--primary-mark); }
1292
1411
  /* ── CÁPSULA (`capsule`) — a "A" da bancada do Victor, 03/10/2026: o modelo de uma das referências ─
1293
1412
  A moldura do ícone vira a cápsula de 56 × 32 do indicador ativo dessa referência
1294
1413
  (`--bottomnav-bold` × `--bottomnav-ring`), em TODOS os itens; só a do escolhido é pintada, de
@@ -1299,9 +1418,9 @@ img,svg { display:block; }
1299
1418
  mesma razão medida do `circle-bold`, logo acima. */
1300
1419
  .bottom-nav-ind-capsule .bottom-nav-mark { width:var(--bottomnav-bold,3.5rem); height:var(--bottomnav-ring); border-radius:var(--radius-full); }
1301
1420
  .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); }
1421
+ .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .bottom-nav-mark { background:var(--primary); color:var(--primary-mark); }
1303
1422
  .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; }
1423
+ .bottom-nav-ind-capsule .bottom-nav-item[aria-current] .badge { background:var(--primary-mark); color:var(--primary); border-color:transparent; }
1305
1424
  /* No `content`, o recheio de sempre (`--space-1`) e não o `--space-3`: com ele cada item teria 80. */
1306
1425
  .bottom-nav-content:not(.bottom-nav-edge).bottom-nav-ind-capsule .bottom-nav-item { padding-inline:var(--space-1); }
1307
1426
  /* ── EXPANDE (`expand`) — a "C" da bancada do Victor, 03/10/2026 ───────────────────────────────
@@ -1315,9 +1434,9 @@ img,svg { display:block; }
1315
1434
  .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
1435
  .bottom-nav-ind-expand .bottom-nav-mark { width:var(--icon-lg); }
1317
1436
  .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); }
1437
+ .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
1438
  .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; }
1439
+ .bottom-nav-ind-expand .bottom-nav-item[aria-current] .badge { background:var(--primary-mark); color:var(--primary); border-color:transparent; }
1321
1440
  .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
1441
 
1323
1442
  /* ── A LINHA DE LISTA TOCÁVEL (§4.3 do CONSUMIDOR-1) ──────────────────────────
@@ -2054,7 +2173,12 @@ img,svg { display:block; }
2054
2173
  /* A opção marcada fica CHEIA, com o ponto no meio, como a da referência (o ponto dela tem 8 numa
2055
2174
  marca de 16: a metade). Era vazia, com o ponto amarelo. */
2056
2175
  .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); }
2176
+ /* 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
2177
+ partir do miolo inteiro, e não desenhada pequena (17/10/2026 — o Victor: "a bolinha do rádio não está centralizada, é
2178
+ torta"). Medido na imagem: a de antes, 7 dentro de 14, ficava meio ponto acima e à esquerda do centro em todo zoom —
2179
+ a folga de 3,5 virava 3 de um lado e 4 do outro. A escala gira em torno do centro exato da caixa. */
2180
+ .radio input:checked + .control-mark:after { content:""; inline-size:100%; block-size:100%; border-radius:50%;
2181
+ background:var(--control-selected-dot); scale:calc(3 / 7); }
2058
2182
  .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
2183
  /* O TRILHO DO SWITCH (0.32.0): o da referência, 40 × 20 (sm 32 × 16, lg 48 × 24) — a largura é o
2060
2184
  dobro da altura. Era 42 × 24. A altura é a de controle MENOS 16: dá exatamente os três dela
@@ -2078,7 +2202,7 @@ img,svg { display:block; }
2078
2202
  mesma distância nos dois sentidos de escrita. */
2079
2203
  .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
2204
  .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); }
2205
+ .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); }
2082
2206
  .range { width:100%; accent-color:var(--primary); }
2083
2207
  /* Slider VERTICAL, no `<input type=range>` NATIVO — sem trocar de motor.
2084
2208
 
@@ -2118,7 +2242,7 @@ img,svg { display:block; }
2118
2242
  .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
2243
  .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
2244
  .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); }
2245
+ .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
2246
  .slider-thumb[data-dragging] { cursor:grabbing; }
2123
2247
  .slider-thumb[data-dragging]::after { scale:.9; }
2124
2248
  .slider-thumb:has(input:focus-visible) { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
@@ -2258,7 +2382,8 @@ img,svg { display:block; }
2258
2382
  /* `line-height:1` não é enfeite: sem ele o .badge herdava a entrelinha do pai e a MESMA
2259
2383
  classe media 26px dentro do .brand (lh 18px) e 22px dentro de um .btn-nav (lh 12px) — na
2260
2384
  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. */
2385
+ A etiqueta de código do SITE (a classe `.chip` do `scripts/build-catalog.mjs`, que não é peça da Aurea) já tinha
2386
+ aprendido isso; o .badge não. Desde 19/10/2026 (GAR-20), o componente `Chip` existe: é outro nome do `Badge`. */
2262
2387
  /* 0.32.0: as medidas do Chip da referência (o `Badge` da Aurea é o Chip dela), lidas no CSS publicado:
2263
2388
  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
2389
  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 +2397,9 @@ img,svg { display:block; }
2272
2397
  numa fila, `align-self:flex-start` tiraria o selo do meio; o tamanho definido só desliga o
2273
2398
  esticar, que é o que a coluna faz com um item sem tamanho. */
2274
2399
  .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); }
2400
+ /* O cheio da marca enche com o acento e escreve com a letra do botão amarelo (`--primary-foreground`): desde a ADR-0073
2401
+ o acento do claro é o próprio amarelo, e a letra de antes (`--background`, clara) media 1,75:1 em cima dele. */
2402
+ .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); }
2276
2403
  /* TAMANHOS. O md é a base (24px), que não muda — é o que as 103 fichas já usam. */
2277
2404
  .badge-xs { min-height:var(--space-4); padding:0 var(--space-1); border-width:0; }
2278
2405
  .badge-sm { min-height:var(--space-5); padding:0 calc(var(--space-1) + var(--space-05) - var(--border-width)); }
@@ -2357,8 +2484,8 @@ img,svg { display:block; }
2357
2484
  `--background` como texto do sólido serve aos DOIS temas porque o acento já vira com o
2358
2485
  tema: `--success-400` é verde CLARO no escuro e verde ESCURO no claro. */
2359
2486
  /* 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. */
2487
+ (`--badge-fill`/`--badge-on`). Quem não declara o par (as categorias, o neutro) segue enchendo com o
2488
+ acento, como antes; a marca enche com o acento e declara só a letra (ADR-0073). */
2362
2489
  .badge-solid { background:var(--badge-fill, var(--badge-accent)); color:var(--badge-on, var(--background)); border-color:transparent; }
2363
2490
  .badge-outline { background:transparent; color:var(--badge-accent); border-color:transparent; }
2364
2491
  /* 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 +2605,23 @@ img,svg { display:block; }
2478
2605
  Só o ícone DIRETO do alerta: um ícone dentro do corpo (num botão, num link) é do corpo. */
2479
2606
  .alert>.icon { --step-icon:var(--icon-sm); margin:var(--space-1); color:var(--alert-tone); }
2480
2607
  .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; } }
2608
+ /* GAR-19 (lote U, 19/10/2026): o aviso de cookies, Banner variant="consent". Uma coluna: o título (h2), o texto e os
2609
+ 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
2610
+ 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
2611
+ cobriria o que recebe o foco (WCAG 2.4.11). A janela de preferências é o Dialog, e as categorias, o Switch. */
2612
+ /* 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
2613
+ bancada). */
2614
+ .banner-consent { grid-template-columns:minmax(0,1fr); align-items:start; gap:var(--space-3); background:var(--card); box-shadow:var(--shadow-sm); }
2615
+ .banner-consent-title { margin:0; color:var(--foreground); font-size:var(--text-base); font-weight:var(--weight-semibold); line-height:var(--leading-tight); }
2616
+ .banner-consent-text { min-inline-size:0; color:var(--muted-foreground); font-size:var(--text-sm); }
2617
+ .banner-consent-text > * + * { margin-block-start:var(--space-2); }
2618
+ .banner-consent-actions { display:flex; flex-wrap:wrap; gap:var(--space-2); }
2619
+ .banner-consent-message { color:var(--foreground); font-size:var(--text-sm); }
2620
+ .banner-consent-categories { display:grid; gap:var(--space-5); }
2621
+ .banner-consent-required { display:grid; gap:var(--space-1); }
2622
+ .banner-consent-required-head { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2); }
2623
+ .banner-consent-required p { margin:0; color:var(--muted-foreground); font-size:var(--text-xs); line-height:var(--space-4); }
2624
+ @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
2625
  .progress { height:8px; overflow:hidden; border-radius:999px; background:var(--surface-3); }
2483
2626
  .progress>span { display:block; height:100%; border-radius:inherit; background:var(--primary); }
2484
2627
  /* AN-07 (03/10/2026): a caixa de fora, o texto de apoio e o tom. A anatomia é a da barra de progresso da
@@ -3177,15 +3320,17 @@ button.tag-main { cursor:pointer; }
3177
3320
  `.image`; aqui fica só o que não varia. O `<iframe>` é absoluto porque a altura é da caixa, não
3178
3321
  dele. A fachada é um `<button>` que cobre a caixa inteira: o alvo de clique é o vídeo todo, e o
3179
3322
  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. */
3323
+ da tela — o mesmo combinado do `Card variant="brand"`: amarelo só para pedir ação. O ícone dela
3324
+ é o marrom da marca (`--primary-mark`), e ela não tem mais o anel escuro em volta: decisão do
3325
+ Victor, 17/10/2026 (*"não quero preto"*). Numa capa amarela, quem a separa é a sombra. A caixa
3326
+ pinta o fundo só por dentro da borda transparente (`background-clip`): sem isso, o fundo escuro
3327
+ aparecia como um aro de 1 em volta da capa. */
3183
3328
  .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); }
3329
+ .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
3330
  .media-embed-frame>iframe { position:absolute; inset:0; inline-size:100%; block-size:100%; border:0; }
3186
3331
  .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
3332
  .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); }
3333
+ .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
3334
  .media-embed-facade:hover .media-embed-play { transform:scale(1.06); }
3190
3335
  .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
3336
  .media-embed-link:hover { color:var(--foreground); }
@@ -3302,7 +3447,10 @@ button.tag-main { cursor:pointer; }
3302
3447
  /* `0.9em` e não um token: código dentro do texto se mede em relação à LINHA em que está, e um
3303
3448
  valor absoluto o deixaria maior que o parágrafo dentro de um h2. É o mesmo motivo pelo qual o
3304
3449
  `.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; }
3450
+ /* `overflow-wrap:anywhere` (18/10/2026, lote U): código no meio do texto é uma palavra só — `window.Aurea.setDensity("compact")`
3451
+ —, 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
3452
+ nada role para o lado). Dentro do `pre` ela não age: lá o `white-space` não quebra, e a caixa rola. */
3453
+ .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
3454
  .prose pre { overflow-x:auto; padding:var(--space-4); border:1px solid transparent; border-radius:var(--radius-card); background:var(--surface-2); }
3307
3455
  .prose pre code { padding:0; border-radius:0; background:transparent; font-size:var(--text-sm); }
3308
3456
  .prose img { max-width:100%; height:auto; border-radius:var(--radius-lg); }
@@ -3616,7 +3764,8 @@ button.tag-main { cursor:pointer; }
3616
3764
  /* A largura é a do GLIFO que mora dentro (`--icon-sm`, o mesmo do `<Icon size="sm">`), e não um
3617
3765
  px cru: assim o slot acompanha a escala de glifo do sistema em vez de fixar um número. */
3618
3766
  .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. */
3767
+ /* METADE do slot: a marca é proporcional, e PAR (8 em 16), então fica no centro em qualquer zoom — o ponto do `Radio`
3768
+ precisou de escala porque o dele era ímpar (17/10/2026). */
3620
3769
  .menu-ponto { inline-size:calc(var(--icon-sm) / 2); block-size:calc(var(--icon-sm) / 2); border-radius:50%; background:currentColor; }
3621
3770
  /* 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
3771
  .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 +4299,15 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
4150
4299
  .graph-node { position:relative; inline-size:var(--graph-node-w,180px); }
4151
4300
  .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
4301
  button.graph-node-body { cursor:pointer; }
4302
+ /* 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
4303
+ motor como não escolhível (`selectable:false`, pela trava `alvo-clicavel`), e o motor tira o ponteiro do invólucro
4304
+ (`.react-flow__node`) quando o nó não é escolhível nem arrastável e o app não passa `onNodeClick`/`onNodeMouse*` — os
4305
+ botões de dentro herdavam o `none`, e o clique de mouse no corpo não chegava ao `onSelect` (pelo teclado chegava). Os
4306
+ botões pegam o ponteiro de volta: o corpo só é botão quando há `onSelect` (sem ele, segue sem ponteiro, como a trava
4307
+ 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 à
4308
+ classe do motor (o check 15 barra classe de terceiro no core): o `pointer-events` herda, e o `auto` no botão vale
4309
+ embaixo de qualquer invólucro. */
4310
+ .dependency-graph :is(button.graph-node-body,.graph-node-toggle,.graph-group-toggle) { pointer-events:auto; }
4153
4311
  .graph-node[data-selected] .graph-node-body { border-color:transparent; background:color-mix(in oklab,var(--primary) 14%,var(--card)); }
4154
4312
  .graph-node-label { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:var(--weight-medium); }
4155
4313
  /* `kind` é TEXTO, e não cor: a referência pinta dez tipos de nó em dez cores, e é a quarta vez
@@ -4495,6 +4653,11 @@ button.graph-node-body { cursor:pointer; }
4495
4653
  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
4654
  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
4655
  .badge-outline { background-color:color-mix(in oklab,var(--badge-accent) 16%,transparent); color:color-mix(in oklab,var(--badge-accent) 80%,var(--foreground)); }
4656
+ /* Menos o primário da Aurea (ADR-0073, decisão do Victor de 18/10/2026, "A"): a letra é o próprio amarelo, a mesma
4657
+ do selo suave e do botão de contorno da marca — misturado ao texto, ele virava mostarda (2,36:1) só nesta peça. A
4658
+ referência principal usa a mesma letra no suave e no contorno. Só sem `data-brand`: na `lory` do claro, sem a
4659
+ mistura, a letra cairia de 5,56 para 4,42:1. */
4660
+ .badge-primary.badge-outline:not(:where([data-brand],[data-brand] *)) { color:var(--badge-accent); }
4498
4661
  /* 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
4662
  .log-stream .log-level.info { color:color-mix(in oklab,var(--info-400) 80%,var(--foreground)); }
4500
4663
  .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.36.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",