@aurea-uds/core 0.52.0 → 0.54.1

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
@@ -243,6 +243,7 @@
243
243
  --control-thumb:#ffffff;
244
244
  --link-mark:rgba(0,0,0,0);
245
245
  --link-underline:var(--primary);
246
+ --shadow-sm:0 1px 3px rgba(0,0,0,0.45);
246
247
  }
247
248
  [data-theme="light"]{
248
249
  --background:#f5f5f5;
@@ -342,6 +343,7 @@
342
343
  --link-underline:var(--primary);
343
344
  --control-thumb:#ffffff;
344
345
  --warning-500:#d07612;
346
+ --shadow-sm:0 2px 4px rgba(0,0,0,0.04), 0 1px 2px rgba(0,0,0,0.06), 0 0 1px rgba(0,0,0,0.06);
345
347
  }
346
348
  [data-brand="ember"][data-theme="dark"],[data-brand="ember"] [data-theme="dark"]{
347
349
  --background:oklch(0.16 0.018 250);
@@ -1552,13 +1554,14 @@ img,svg { display:block; }
1552
1554
  /* E sem a barra do índice abaixo de 1280: no desenho aprovado o índice só existe na coluna da direita (protótipo). */
1553
1555
  .app-shell-docs.app-shell-pill > .docs-toc-bar { display:none; }
1554
1556
  /* As colunas ficam a --space-4 das bordas da tela, alinhadas com a pílula (sem isto, abaixo de 1432 a lateral e o índice
1555
- encostavam na borda — medido a 1280). */
1556
- @media (min-width:1024px) { .app-shell-docs.app-shell-pill { padding-inline:var(--space-4); } .app-shell-docs.app-shell-pill > .topbar { padding-inline:0; }
1557
+ encostavam na borda — medido a 1280). De 768 para cima, e não de 1024 (0.52.1, aprovado pela imagem em 01/11/2026): de
1558
+ 768 a 1023 a lateral é coluna, e encostava na borda com a cápsula a 16. */
1559
+ @media (min-width:768px) { .app-shell-docs.app-shell-pill { padding-inline:var(--space-4); } .app-shell-docs.app-shell-pill > .topbar { padding-inline:0; }
1557
1560
  /* A lateral com caixa vai até 16 do pé da tela, e não mais (o desenho, medido em 31/10/2026). */
1558
1561
  .app-shell-docs.app-shell-pill > .sidebar:not(.app-shell-aside, .sidebar-plain) { block-size:auto; max-block-size:calc(100vh - var(--shell-top) - var(--space-4)); } }
1559
- /* O conteúdo começa a 18 da pílula, como a lateral (78 + 18 = 96); de 1024 a 1279, sem o índice, ele vai até a borda do
1560
- bloco; no celular, o bloco fica a 16 das bordas. */
1561
- @media (min-width:1024px) and (max-width:1279px) { .app-shell-docs.app-shell-pill > .content.content { padding:calc(var(--space-4) + var(--space-05)) 0 0 var(--space-7); } }
1562
+ /* O conteúdo começa a 18 da pílula, como a lateral (78 + 18 = 96); de 768 a 1279, sem o índice, ele vai até a borda do
1563
+ bloco, a 28 da lateral; no celular, o bloco fica a 16 das bordas. */
1564
+ @media (min-width:768px) and (max-width:1279px) { .app-shell-docs.app-shell-pill > .content.content { padding:calc(var(--space-4) + var(--space-05)) 0 0 var(--space-7); } }
1562
1565
  @media (max-width:767px) { .app-shell-docs.app-shell-pill > .content.content { padding:calc(var(--space-4) + var(--space-05)) var(--space-4) 0; } }
1563
1566
  .app-shell-docs > .content > * { max-inline-size:var(--docs-text-width); }
1564
1567
  /* O texto a 24 da borda também no celular (o da página da referência a 375 e a 768; com o recheio de sempre do
@@ -2282,6 +2285,25 @@ img,svg { display:block; }
2282
2285
  /* `aria-disabled` e NÃO `:disabled` — a razão está escrita ao lado de `.btn:disabled`, medida em
2283
2286
  13/08/2026: `:disabled` tira da ordem de foco e quem usa teclado nunca acha a linha. */
2284
2287
  .nav-list-row[aria-disabled="true"] { opacity:.45; cursor:not-allowed; }
2288
+ /* A LISTA GRANDE (`NavList size="lg"`, o site B — o menu do celular, aprovado pela bancada em 01/11/2026, o item 10): a linha
2289
+ em cápsula de 56 (o círculo de 40 + 8 em cima e embaixo), 16 entre o círculo e o nome, a letra 18 seminegrito; o ícone de
2290
+ 20 num círculo de 40 tingido pela cor de categoria (sem ela, o neutro). A linha ATUAL (`aria-current="page"`, nos dois
2291
+ tamanhos) ganha o fundo `--fill-2`, e o selo dela fica no lugar da seta. Sem `lg`, a lista de sempre. */
2292
+ .nav-list-lg { gap:var(--space-1); }
2293
+ .nav-list-lg .nav-list-row { min-block-size:calc(var(--space-10) + 2 * var(--space-2)); padding:var(--space-2); gap:var(--space-4); border-radius:var(--radius-control);
2294
+ font-size:var(--text-lg); font-weight:var(--weight-semibold); }
2295
+ .nav-list-tile { display:grid; place-items:center; flex:none; inline-size:var(--space-10); block-size:var(--space-10); border-radius:var(--radius-full); background:var(--fill-2); color:var(--foreground); }
2296
+ .nav-list-row .nav-list-tile .icon { inline-size:var(--icon-md); block-size:var(--icon-md); opacity:1; }
2297
+ .nav-list-tile[data-tone="red"] { background:var(--category-red-bg); color:var(--category-red); }
2298
+ .nav-list-tile[data-tone="orange"] { background:var(--category-orange-bg); color:var(--category-orange); }
2299
+ .nav-list-tile[data-tone="green"] { background:var(--category-green-bg); color:var(--category-green); }
2300
+ .nav-list-tile[data-tone="teal"] { background:var(--category-teal-bg); color:var(--category-teal); }
2301
+ .nav-list-tile[data-tone="cyan"] { background:var(--category-cyan-bg); color:var(--category-cyan); }
2302
+ .nav-list-tile[data-tone="blue"] { background:var(--category-blue-bg); color:var(--category-blue); }
2303
+ .nav-list-tile[data-tone="violet"] { background:var(--category-violet-bg); color:var(--category-violet); }
2304
+ .nav-list-tile[data-tone="pink"] { background:var(--category-pink-bg); color:var(--category-pink); }
2305
+ .nav-list-row[aria-current="page"] { background:var(--fill-2); }
2306
+ .nav-list-here { flex:none; }
2285
2307
  /* O PAINEL DÁ QUASE NADA, A LINHA DÁ O RESTO. Medido em 18/08/2026, depois de o Victor circular a
2286
2308
  folga no print: com o `--card-pad` de 20px o realce da linha começava a 21px da borda e o texto
2287
2309
  a 65px, e a linha ocupava só 88% da largura — realce flutuando no meio de uma caixa grande em
@@ -2621,6 +2643,14 @@ img,svg { display:block; }
2621
2643
  /* Vertical sai da pílula: --radius-control (999px) clampa em 50% da menor
2622
2644
  dimensão e vira um oval num container alto. */
2623
2645
  .toolbar[data-orientation="vertical"] { flex-direction:column; align-items:stretch; border-radius:var(--radius-lg); }
2646
+ /* A BARRA AMARELA (`Toolbar tone="brand"`, o site B — a seleção em lote da página inicial, aprovada pela bancada em
2647
+ 01/11/2026, o D-7.7, a forma B): o amarelo da marca, 52 de altura (`--control-h-xl` + 2), 16 antes e 4 depois, o texto
2648
+ na tinta, 600, o que vem antes e o que vem depois nas pontas; os botões de dentro BRANCOS (as marcas dos controles) com a
2649
+ tinta. Sem `brand`, a barra de sempre. */
2650
+ .toolbar.toolbar-brand { justify-content:space-between; min-block-size:calc(var(--control-h-xl) + var(--space-05)); padding:0 var(--space-1) 0 var(--space-4);
2651
+ background:var(--primary); color:var(--primary-foreground); font-weight:var(--weight-semibold); }
2652
+ .toolbar-brand .btn { --btn-bg:var(--control-thumb); --btn-fg:var(--primary-foreground); background:var(--btn-bg); color:var(--btn-fg); }
2653
+ .toolbar-brand .btn:hover:not(:disabled) { --btn-bg:color-mix(in oklab,var(--control-thumb) 88%,var(--primary-foreground)); }
2624
2654
  .toolbar-group { display:flex; align-items:center; gap:var(--space-1); }
2625
2655
  .toolbar-sep { flex:none; align-self:stretch; inline-size:1px; min-block-size:20px; margin-inline:4px; margin-block:0; background:var(--border); border:0; }
2626
2656
  /* SEPARADOR — a linha de divisão do sistema, num lugar só.
@@ -2953,6 +2983,24 @@ img,svg { display:block; }
2953
2983
  .radio-group > .field-error { margin-block-start:var(--space-2); }
2954
2984
  /* `labelHidden` (15/10/2026): sem o nome na tela, as opções começam no alto — nada do vão de 16 que o separava delas. */
2955
2985
  .radio-group-bare > .label + :is(.radio,.radio-group-items) { margin-block-start:0; }
2986
+ /* O CARTÃO DE ESCOLHA (`variant="card"`, o site B — aprovado pela bancada em 01/11/2026, a opção B): o CHK-01 do nativo
2987
+ levado à web. Cada opção é um cartão inteiro (a pele do `Card`: canto 22, recheio do cartão, a cor do cartão), 12 entre
2988
+ eles; o escolhido SOBE 4 com a `--shadow-lg` e a cor da aba escolhida (`--segment`) — parado para quem pede menos
2989
+ movimento. O foco é o do cartão inteiro, uma linha só (ADR-0059): o da marca sai. `indicatorPlacement="none"` tira a
2990
+ bolinha (o Theming do site); o cartão continua o rádio nativo por dentro. Variação: sem `card`, o grupo é o de sempre. */
2991
+ .radio-group-cards { display:grid; gap:var(--space-3); align-self:stretch; margin-block-start:var(--space-4); }
2992
+ .radio-group-horizontal > .radio-group-cards { grid-auto-flow:column; grid-auto-columns:minmax(0,1fr); }
2993
+ .radio-group-bare > .label + .radio-group-cards { margin-block-start:0; }
2994
+ .radio-group-cards > .radio { margin:0; align-items:flex-start; gap:var(--space-3); min-inline-size:0; padding:var(--card-pad); border-radius:var(--radius-card); background:var(--card); cursor:pointer;
2995
+ transition:background-color var(--duration-fast),box-shadow var(--duration-fast),translate var(--duration-fast); }
2996
+ .radio-group-cards > .radio:has(input:checked) { background:var(--segment); box-shadow:var(--shadow-lg); translate:0 calc(-1 * var(--space-1)); }
2997
+ /* No escuro, o texto de apoio do cartão marcado lia 4,07:1 no --segment (o axe da varredura, 02/11/2026): ali dentro ele é o
2998
+ texto a 80% sobre o --segment, como a letra apagada de uma peça erguida. */
2999
+ [data-theme="dark"] .radio-group-cards > .radio:has(input:checked):where(:not([data-theme="light"] *),[data-theme="light"] [data-theme="dark"] *) { --muted-foreground:color-mix(in oklab, var(--foreground) 80%, var(--segment)); }
3000
+ .radio-group-cards > .radio:has(input:focus-visible) { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
3001
+ .radio-group-cards > .radio input:focus-visible + .control-mark { outline:none; }
3002
+ .radio-group-indicator-none > .radio-group-cards > .radio > .control-mark { display:none; }
3003
+ @media (prefers-reduced-motion:reduce) { .radio-group-cards > .radio:has(input:checked) { translate:none; } }
2956
3004
  .checkbox > span > .muted { font-size:var(--text-xs); font-weight:var(--weight-regular); line-height:var(--space-4); }
2957
3005
  .checkbox input,.radio input { position:absolute; opacity:0; pointer-events:none; }
2958
3006
  /* A MARCA DE SELEÇÃO acompanha a densidade, e antes não acompanhava. Era `18px` cru: em
@@ -2985,6 +3033,22 @@ img,svg { display:block; }
2985
3033
  a folga de 3,5 virava 3 de um lado e 4 do outro. A escala gira em torno do centro exato da caixa. */
2986
3034
  .radio input:checked + .control-mark:after { content:""; inline-size:100%; block-size:100%; border-radius:50%;
2987
3035
  background:var(--control-selected-dot); scale:calc(3 / 7); }
3036
+ /* A CÁPSULA (`Checkbox variant="pill"`, o site B — o "Mark as done", aprovado pela bancada em 01/11/2026, o item 4): a
3037
+ cápsula em volta é o alvo inteiro — 44 (`--target-min`) com a caixa de 24, ou 36 (`--control-h-md`) com a caixa de 20; o
3038
+ recheio e o vão saem da conta (altura − caixa) / 2. Fundo `--fill-2` (sem linha, ADR-0072), letra 600. O foco é o da
3039
+ cápsula, uma linha só (ADR-0059). `data-tone="success"`: a marcada é "feito" — a cápsula no verde a 18%, a letra e a caixa
3040
+ no `--success-400`. Variação: sem `pill`, a caixa de sempre. */
3041
+ .checkbox.checkbox-pill { --pill-h:var(--target-min); --box:var(--space-6); --pill-in:calc((var(--pill-h) - var(--box)) / 2);
3042
+ align-items:center; gap:var(--pill-in); min-block-size:var(--pill-h); padding-inline:var(--pill-in) var(--space-4);
3043
+ border-radius:var(--radius-control); background:var(--fill-2); font-weight:var(--weight-semibold); white-space:nowrap;
3044
+ transition:background-color var(--duration-fast),color var(--duration-fast); }
3045
+ .checkbox.checkbox-pill-md { --pill-h:var(--control-h-md); --box:var(--space-5); padding-inline-end:var(--space-3); }
3046
+ .checkbox-pill > .control-mark { --mark:var(--box); margin:0; }
3047
+ .checkbox-pill > .control-mark:after { inline-size:70%; block-size:70%; }
3048
+ .checkbox-pill:has(input:focus-visible) { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
3049
+ .checkbox.checkbox-pill input:focus-visible + .control-mark,.checkbox.checkbox-pill input:focus-visible:checked + .control-mark { outline:none; }
3050
+ .checkbox-pill[data-tone="success"]:has(input:checked) { background:color-mix(in oklab,var(--success-400) 18%,transparent); color:var(--success-400); }
3051
+ .checkbox-pill[data-tone="success"] input:checked + .control-mark { background:var(--success-400); color:var(--background); }
2988
3052
  .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; }
2989
3053
  /* O TRILHO DO SWITCH (0.32.0): o da referência, 40 × 20 (sm 32 × 16, lg 48 × 24) — a largura é o
2990
3054
  dobro da altura. Era 42 × 24. A altura é a de controle MENOS 16: dá exatamente os três dela
@@ -3135,11 +3199,44 @@ img,svg { display:block; }
3135
3199
  .segmented a { display:inline-flex; align-items:center; justify-content:center; gap:var(--space-1); text-decoration:none; }
3136
3200
  /* `size="sm"`: a da referência (abas de 24 numa cápsula de 32, letra 14) — a altura do controle `xs` da densidade. */
3137
3201
  .segmented-sm :is(button,a) { min-block-size:var(--control-h-xs); padding:0 var(--space-4); font-size:var(--text-sm); }
3202
+ /* `size="lg"` e `size="xl"` (0.52.1, variação nova aprovada pela imagem em 01/11/2026): os segmentos na altura do controle
3203
+ `md` (36; a cápsula de 44, a chave Web | Native do site B) e na do `lg` (40; a cápsula de 48, as áreas no topo). O `sm` e
3204
+ o `md` não mudam. A referência não tem tamanho nessa peça. */
3205
+ .segmented-lg :is(button,a) { min-block-size:var(--control-h-md); }
3206
+ .segmented-xl :is(button,a) { min-block-size:var(--control-h-lg); }
3207
+ /* O SITE B (aprovado pela bancada em 01/11/2026, os itens 3 e 8), quatro variações; sem elas, a chave de sempre.
3208
+ O ÍCONE no item (`items[].icon`): 16 (`--icon-sm`), 8 do nome; o escolhido troca para a forma cheia (o `-fill`, como a
3209
+ lateral e a barra de baixo). `size="2xl"`: um tamanho a mais — segmento de 48 (`--space-12`), ícone 20, letra 16.
3210
+ `wrap`: a chave QUEBRA linha, e o trilho ganha o canto do cartão (22). `orientation="vertical"`: em pé, cada segmento
3211
+ na largura toda, com o mesmo canto. */
3212
+ .segmented :is(button,a):has(> .icon) { display:inline-flex; align-items:center; justify-content:center; gap:var(--space-2); }
3213
+ .segmented :is(button,a) > .icon { inline-size:var(--icon-sm); block-size:var(--icon-sm); flex:none; }
3214
+ .segmented-2xl :is(button,a) { min-block-size:var(--space-12); padding-inline:var(--space-4); font-size:var(--text-base); }
3215
+ .segmented-2xl :is(button,a) > .icon { inline-size:var(--icon-md); block-size:var(--icon-md); }
3216
+ .segmented-wrap { flex-wrap:wrap; border-radius:var(--radius-card); }
3217
+ .segmented-vertical { display:flex; flex-direction:column; border-radius:var(--radius-card); }
3218
+ .segmented-vertical :is(button,a) { inline-size:100%; padding-block:var(--space-2); text-align:center; }
3138
3219
  /* Toggle (Lote 1): pressionado usa o MESMO par de tokens do segmento aceso, logo acima. Um
3139
3220
  toggle solto e um segmento selecionado dizem a mesma coisa — se parecessem diferentes, o
3140
3221
  sistema teria dois idiomas para "isto está ligado". O estado vem do motor (`data-pressed`),
3141
3222
  não de uma classe que alguém precisa lembrar de pôr. */
3142
3223
  .toggle[data-pressed] { --btn-bg:var(--secondary); --btn-fg:var(--primary); }
3224
+ /* A ÁREA (`Toggle area`, o site B — aprovada pela bancada em 01/11/2026, o D-3, o D-5 e o D-6): o toggle que é uma ÁREA
3225
+ clicável em volta de um bloco (a miniatura de uma página, um ícone com o nome). Recheio de 4, o canto concêntrico do
3226
+ cartão (22 − 2), o conteúdo como ele é (alinhado ao início, sem a altura do botão). Com `variant="ghost"`, transparente:
3227
+ com o mouse o amarelo a 18%, ligada a 42% (D-3). Com o fundo (`variant="default"`), o `--fill-2`; com o mouse o
3228
+ `--fill-3`; ligada, o amarelo cheio com a letra do botão primário (D-5, D-6). Sem o fio de baixo do ligado.
3229
+ `area="pill"`: a área do tamanho do conteúdo, em cápsula. Variação: sem `area`, o toggle de sempre. */
3230
+ .btn.toggle.toggle-area { --area-bg:transparent; --area-hover:color-mix(in oklab,var(--primary) 18%,transparent);
3231
+ --area-on:color-mix(in oklab,var(--primary) 42%,transparent); --area-on-fg:var(--foreground);
3232
+ display:block; inline-size:100%; min-inline-size:0; block-size:auto; min-block-size:0; padding:var(--space-1);
3233
+ border-radius:calc(var(--radius-card) - var(--space-05)); background:var(--area-bg); color:inherit; text-align:start; font:inherit; white-space:normal;
3234
+ transition:background-color var(--duration-fast); }
3235
+ .btn.toggle.toggle-area.btn-tertiary { --area-bg:var(--fill-2); --area-hover:var(--fill-3); --area-on:var(--primary); --area-on-fg:var(--primary-foreground); }
3236
+ .btn.toggle.toggle-area:hover:not(:disabled) { background:var(--area-hover); }
3237
+ .btn.toggle.toggle-area[aria-pressed="true"],.btn.toggle.toggle-area[aria-pressed="true"]:hover:not(:disabled) { --btn-bg:var(--area-on); background:var(--area-on); color:var(--area-on-fg); }
3238
+ .btn.toggle.toggle-area[aria-pressed="true"]::after { content:none; }
3239
+ .btn.toggle.toggle-area-pill { inline-size:auto; align-self:flex-start; border-radius:var(--radius-full); }
3143
3240
  /* ── SELECIONADO: uma linguagem só ────────────────────────────────────────────────────
3144
3241
  Item de nav ativo, aba ativa, item de lista lateral e botão alternado ligado mostram o
3145
3242
  MESMO sinal: cápsula elevada + rótulo na cor da marca + fio amarelo encostado na borda de
@@ -3393,6 +3490,12 @@ img,svg { display:block; }
3393
3490
  não. Quem cobra é o `link-sem-sublinhado.spec.ts`. */
3394
3491
  .card-interactive { cursor:pointer; inline-size:100%; text-decoration:none; font:inherit; text-align:inherit; color:inherit; transition:transform var(--duration-fast),border-color var(--duration-fast),background var(--duration-fast); }
3395
3492
  .card-interactive:hover { transform:translateY(-2px); border-color:transparent; background:var(--surface-2); }
3493
+ /* O LEVANTAR (`lift`, o site B — aprovado pela bancada em 01/11/2026): o cartão clicável que SOBE com sombra, em vez de
3494
+ trocar o fundo. Sobe 4 (`--space-1`), fica na cor do cartão e ganha a `--shadow-md`; parado para quem pede menos
3495
+ movimento. Variação: sem `lift`, o cartão clicável continua o de sempre (sobe 2 e troca o fundo). */
3496
+ .card-interactive.card-lift { transition:transform var(--duration-base),box-shadow var(--duration-base),background var(--duration-fast); }
3497
+ .card-interactive.card-lift:hover { transform:translateY(calc(-1 * var(--space-1))); background:var(--card); box-shadow:var(--shadow-md); }
3498
+ @media (prefers-reduced-motion:reduce) { .card-interactive.card-lift:hover { transform:none; } }
3396
3499
  .card-selected { border-color:transparent; background:color-mix(in oklab,var(--primary) 12%,var(--card)); }
3397
3500
  .card-danger { border-color:transparent; background:var(--danger-bg); }
3398
3501
  /* MT-01 (10/10/2026, ADR-0063): o cartão `contrast` traz `data-theme="dark"` no próprio elemento —
@@ -3411,6 +3514,14 @@ img,svg { display:block; }
3411
3514
  .card-accent-brand { --card-accent:var(--primary); } .card-accent-success { --card-accent:var(--success); }
3412
3515
  .card-accent-info { --card-accent:var(--info); } .card-accent-warning { --card-accent:var(--warning); }
3413
3516
  .card-accent-danger { --card-accent:var(--destructive); }
3517
+ /* `fill="brand"` (o site B, 02/11/2026 — o Victor escolheu a "B" na imagem): o cartão pintado no amarelo da marca, com a
3518
+ tinta por cima (`--primary-foreground`, 9,28:1 na Aurea Gold) — o título, o texto de apoio e o que lê a cor do cartão
3519
+ passam a ser a tinta e o amarelo. O traço do `accent` some (amarelo sobre amarelo); no clicável, o amarelo fica ao
3520
+ passar o mouse. NA EMBER, o cartão comum (o Victor, 02/11/2026: "Ember no cartão comum" — no claro, o branco no laranja
3521
+ media 3,08:1). Quem cobra: `tests/unit/site-b-pecas-0-54.test.tsx`. */
3522
+ .card.card-fill-brand:where(:not([data-brand="ember"],[data-brand="ember"] *)) { --card:var(--primary); --surface-2:var(--primary-hover); --card-foreground:var(--primary-foreground);
3523
+ --foreground:var(--primary-foreground); --muted-foreground:var(--primary-foreground); background:var(--primary); color:var(--primary-foreground); }
3524
+ .card.card-fill-brand.card-accent:where(:not([data-brand="ember"],[data-brand="ember"] *)) { box-shadow:none; }
3414
3525
  /* 0.32.0: a descrição 14/20 colada no título. O `.card-header` e o `.card-title` desta linha (o cabeçalho em LINHA, com
3415
3526
  16 de vão e 16 embaixo, da primeira versão pública) saíram em 15/10/2026: nenhuma peça os usava, e vindo DEPOIS das
3416
3527
  partes do cartão eles separavam o título da descrição do `Card.Header` em 16 — na referência, colados. */
@@ -3444,6 +3555,16 @@ img,svg { display:block; }
3444
3555
  /* A cor do glifo é a da variante, senão o ícone vira enfeite cinza e não repete o sinal.
3445
3556
  Só o ícone DIRETO do alerta: um ícone dentro do corpo (num botão, num link) é do corpo. */
3446
3557
  .alert>.icon { --step-icon:var(--icon-sm); margin:var(--space-1); color:var(--alert-tone); }
3558
+ /* `appearance="soft"` (o site B, 02/11/2026 — o Victor escolheu a "B" na imagem): o fundo é a cor do estado a 14%, sem a
3559
+ sombra do cartão; o corpo vai na cor do texto, a 16 com a linha de 1,5 (a do desenho, 1,6, no degrau mais perto — ADR-0088), e o título em negrito na cor do estado. O
3560
+ padrão continua o de cartão. O título é o tom com 25% da cor do texto: puro, o azul (info) no claro media 4,07:1 no
3561
+ fundo do tom (o axe, 02/11/2026). NA EMBER, o cartão de sempre (o Victor, 02/11/2026: "Ember no cartão" — no claro, o título
3562
+ de atenção dela no fundo do tom media 4,23:1).
3563
+ Quem cobra: `tests/unit/site-b-pecas-0-54.test.tsx`. */
3564
+ .alert.alert-soft:where(:not([data-brand="ember"],[data-brand="ember"] *)) { background:color-mix(in oklab, var(--alert-tone) 14%, transparent); box-shadow:none; color:var(--foreground);
3565
+ font-size:var(--text-base); line-height:var(--leading-normal); }
3566
+ .alert.alert-soft:where(:not([data-brand="ember"],[data-brand="ember"] *)) strong { color:color-mix(in oklab, var(--alert-tone) 75%, var(--foreground)); font-size:var(--text-base); font-weight:var(--weight-bold); line-height:var(--leading-normal); }
3567
+ .alert.alert-soft:where(:not([data-brand="ember"],[data-brand="ember"] *)) p { color:var(--foreground); font-size:var(--text-base); }
3447
3568
  .banner strong { font-size:var(--text-sm); } .banner p { margin:0; color:var(--muted-foreground); font-size:var(--text-sm); }
3448
3569
  /* GAR-19 (lote U, 19/10/2026): o aviso de cookies, Banner variant="consent". Uma coluna: o título (h2), o texto e os
3449
3570
  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
@@ -3568,6 +3689,45 @@ img,svg { display:block; }
3568
3689
  Cor semântica, não a primária — reprovar não é progredir. */
3569
3690
  .step-error { color:var(--danger-400); } .step-error .step-dot { color:var(--danger-400); border-color:transparent; background:var(--danger-bg); }
3570
3691
  .step-optional { display:block; color:var(--muted-foreground); font-size:var(--text-xs); }
3692
+ /* O CAMINHO QUE ESCOLHE (`Stepper variant="path"`, o site B — o Roadmap, aprovado pela bancada em 01/11/2026, o item 5): a
3693
+ mesma lista; a bolinha de 50 (`--control-h-xl`) no cartão, com a `--shadow-sm` e o número na `--font-code`; o rótulo fica
3694
+ para o leitor de tela; UM trilho de 8 (`--space-2`, `--fill-2`) de ponta a ponta; a escolhida invertida (fundo na cor do
3695
+ texto) e maior, 56 (50 + 4 + 2); as pontas (`startContent`, `endContent`) não clicam — a do início no amarelo. Estreito
3696
+ (o contêiner até 30rem): 4 por linha, sem trilho. `--stepper-cols` é o número de colunas (as etapas e as pontas). */
3697
+ .stepper-path { container-type:inline-size; }
3698
+ .stepper-path > .stepper { --dot:var(--control-h-xl); --dot-on:calc(var(--control-h-xl) + var(--space-1) + var(--space-05));
3699
+ position:relative; grid-auto-flow:row; grid-template-columns:repeat(var(--stepper-cols,4),minmax(0,1fr)); align-items:center; gap:var(--space-2) var(--space-1); }
3700
+ .stepper-path > .stepper:before { content:""; position:absolute; inset-inline:calc(100% / (2 * var(--stepper-cols,4))); inset-block-start:50%;
3701
+ block-size:var(--space-2); translate:0 -50%; border-radius:var(--radius-full); background:var(--fill-2); }
3702
+ .stepper-path > .stepper > .step { z-index:1; display:grid; place-items:center; block-size:var(--dot-on); }
3703
+ .stepper-path > .stepper > .step:before { content:none; }
3704
+ .stepper-path > .stepper > .step .step-trigger { inline-size:auto; border-radius:var(--radius-full); }
3705
+ .stepper-path > .stepper > .step :is(strong,.step-optional) { position:absolute; inline-size:1px; block-size:1px; overflow:hidden; clip-path:inset(50%); white-space:nowrap; }
3706
+ .stepper-path > .stepper > .step .step-dot { inline-size:var(--dot); block-size:var(--dot); margin:0; background:var(--card); color:var(--foreground); box-shadow:var(--shadow-sm);
3707
+ font-family:var(--font-code); font-weight:var(--weight-semibold); font-size:var(--text-base);
3708
+ transition:inline-size var(--duration-fast),block-size var(--duration-fast),background-color var(--duration-fast),color var(--duration-fast),box-shadow var(--duration-fast); }
3709
+ .stepper-path > .stepper > .step .step-trigger:hover .step-dot { box-shadow:var(--shadow-md); }
3710
+ .stepper-path > .stepper > .step-active .step-dot { inline-size:var(--dot-on); block-size:var(--dot-on); background:var(--foreground); color:var(--background); box-shadow:var(--shadow-sm); }
3711
+ .stepper-path > .stepper > .step-end { position:relative; z-index:1; justify-self:center; display:grid; place-items:center; block-size:var(--dot); min-inline-size:var(--dot);
3712
+ padding-inline:var(--space-3); border-radius:var(--radius-full); background:var(--fill-3-solid); color:var(--foreground); font-family:var(--font-code); font-size:var(--text-sm); }
3713
+ .stepper-path > .stepper > .step-end-start { background:var(--primary); color:var(--primary-foreground); }
3714
+ @container (max-width:30rem) {
3715
+ .stepper-path > .stepper { grid-template-columns:repeat(4,minmax(0,1fr)); }
3716
+ .stepper-path > .stepper:before { content:none; }
3717
+ }
3718
+ /* A BARRA EM PARTES (`Stepper variant="bar"`, o site B — o "Your setup" do Quick Start, aprovado pela bancada em 01/11/2026,
3719
+ o D-1): cada etapa é uma parte da barra, de 12 (`--space-3`), 6 entre elas, e é o LINK (ou o botão) da etapa — o nome
3720
+ fica para o leitor de tela; a feita fica verde (`--success-400`). `startContent` vem antes (o nome, 600) e `endContent`
3721
+ depois (a contagem, mono, anunciada ao mudar). Variação: sem `path` nem `bar`, o `Stepper` de sempre. */
3722
+ .stepper-bar { display:flex; align-items:center; gap:var(--space-4); }
3723
+ .stepper-bar-label { flex:none; font-weight:var(--weight-semibold); font-size:var(--text-base); white-space:nowrap; }
3724
+ .stepper-bar > .stepper { flex:1; display:flex; gap:calc(var(--space-1) + var(--space-05)); }
3725
+ .stepper-bar > .stepper > .step { flex:1; display:flex; }
3726
+ .stepper-bar > .stepper > .step:before { content:none; }
3727
+ .stepper-bar > .stepper > .step > .step-trigger { inline-size:100%; block-size:var(--space-3); border-radius:var(--radius-full); background:var(--fill-2); transition:background-color var(--duration-base); }
3728
+ .stepper-bar > .stepper > .step > .step-trigger:hover { background:var(--fill-3); }
3729
+ .stepper-bar > .stepper > .step-done > .step-trigger { background:var(--success-400); }
3730
+ .stepper-bar-count { flex:none; font-family:var(--font-code); font-weight:var(--weight-semibold); font-size:var(--text-sm); white-space:nowrap; }
3571
3731
  /* Etapa clicável (fluxo não-linear): o alvo é um botão de verdade, com o foco do sistema.
3572
3732
  E ele PRECISA GERAR CAIXA. `display:contents` era o que estava aqui, e um <button> sem caixa
3573
3733
  não recebe foco — o Chromium recusa `.focus()`, e a etapa clicável só funcionava com o mouse.
@@ -3627,6 +3787,36 @@ img,svg { display:block; }
3627
3787
  .table tbody tr:last-child > :last-child,.table-wrap tbody tr:last-child > :last-child { border-end-end-radius:var(--table-cell-r); }
3628
3788
  .table tr:last-child td,.table-wrap tr:last-child td { border-bottom:0; }
3629
3789
  @media (hover:hover) { .table tbody tr:hover > :is(td,th),.table-wrap tbody tr:hover > :is(td,th) { background:color-mix(in oklab,var(--card) 40%,var(--surface-2)); } }
3790
+ /* AS LINHAS EM CÁPSULA (`Table variant="rows"`, o site B — a lista de membros da página inicial, aprovada pela bancada em
3791
+ 01/11/2026, o D-7.6): sem a caixa em volta; cada linha é uma cápsula de 54 (`--target-min` + 10), 4 entre elas; com o
3792
+ mouse o `--fill-1`; a linha com `data-selected` (a que o app marcou), o amarelo a 14% (18% com o mouse). O cabeçalho em
3793
+ mono maiúsculo, apagado, sem fundo e sem os fios entre as colunas. Cabe na largura. Sem `rows`, a tabela de sempre. */
3794
+ .table-region.table-region-rows { padding:0; border-radius:0; background:transparent; }
3795
+ .table.table-rows { min-width:0; border-spacing:0 var(--space-1); }
3796
+ .table.table-rows thead th { background:transparent; font-family:var(--font-code); letter-spacing:.06em; text-transform:uppercase; }
3797
+ .table.table-rows thead th::after { content:none; }
3798
+ .table.table-rows tbody :is(td,th) { block-size:calc(var(--target-min) + var(--space-2) + var(--space-05)); padding-block:0; border-bottom:0; background:transparent;
3799
+ transition:background-color var(--duration-fast); }
3800
+ .table.table-rows tbody tr > :first-child { border-radius:var(--radius-full) 0 0 var(--radius-full); padding-inline-start:var(--space-1); }
3801
+ .table.table-rows tbody tr > :last-child { border-radius:0 var(--radius-full) var(--radius-full) 0; padding-inline-end:var(--space-3); }
3802
+ .table.table-rows tbody tr > :only-child { border-radius:var(--radius-full); }
3803
+ :dir(rtl) .table.table-rows tbody tr > :first-child,[dir="rtl"] .table.table-rows tbody tr > :first-child { border-radius:0 var(--radius-full) var(--radius-full) 0; }
3804
+ :dir(rtl) .table.table-rows tbody tr > :last-child,[dir="rtl"] .table.table-rows tbody tr > :last-child { border-radius:var(--radius-full) 0 0 var(--radius-full); }
3805
+ @media (hover:hover) { .table.table-rows tbody tr:hover > :is(td,th) { background:var(--fill-1); } }
3806
+ .table.table-rows tbody tr[data-selected] > :is(td,th) { background:color-mix(in oklab,var(--primary) 14%,transparent); }
3807
+ @media (hover:hover) { .table.table-rows tbody tr[data-selected]:hover > :is(td,th) { background:color-mix(in oklab,var(--primary) 18%,transparent); } }
3808
+ /* `striped` (o site B, 02/11/2026 — o Victor escolheu a "B" na imagem): as linhas ímpares do corpo com um fundo, a 1ª, a 3ª,
3809
+ a 5ª…, como o desenho. Na tabela de sempre, o cartão com o texto a 6% (opaco: a célula pinta a cor do cartão); nas
3810
+ linhas em cápsula (`rows`), o `--fill-1` e o canto de 16 (`--radius-lg`), e o mouse escurece para o `--fill-2`. É fundo,
3811
+ não linha (ADR-0072). Quem cobra: `tests/unit/site-b-pecas-0-54.test.tsx`. */
3812
+ .table.table-striped:not(.table-rows) tbody tr:nth-child(odd) > :is(td,th) { background:color-mix(in oklab, var(--foreground) 6%, var(--card)); }
3813
+ .table.table-striped.table-rows tbody tr:nth-child(odd) > :is(td,th) { background:var(--fill-1); }
3814
+ .table.table-striped.table-rows tbody tr > :first-child { border-start-start-radius:var(--radius-lg); border-end-start-radius:var(--radius-lg); }
3815
+ .table.table-striped.table-rows tbody tr > :last-child { border-start-end-radius:var(--radius-lg); border-end-end-radius:var(--radius-lg); }
3816
+ @media (hover:hover) {
3817
+ .table.table-striped:not(.table-rows) tbody tr:hover > :is(td,th) { background:color-mix(in oklab,var(--card) 40%,var(--surface-2)); }
3818
+ .table.table-striped.table-rows tbody tr:hover > :is(td,th) { background:var(--fill-2); }
3819
+ }
3630
3820
  /* GAR-12 e GAR-13 (08/10/2026): a tabela de COMPARAÇÃO — as chaves da `Table` e a pele do HTML de
3631
3821
  comparação. A referência principal só tem o cabeçalho preso, à mão, numa caixa de altura fixa; o
3632
3822
  resto veio do mercado, por escolha do Victor (o detalhe está no comentário da `Table`).
@@ -3830,6 +4020,32 @@ button.tag-main { cursor:pointer; }
3830
4020
  .kpi-tone-success { color:var(--success-400); }
3831
4021
  .kpi-tone-danger { color:var(--danger-400); }
3832
4022
  .kpi-tone-neutral { color:var(--muted-foreground); }
4023
+ /* O CARTÃO AMARELO E AS BARRAS (o site B — a página inicial, aprovado pela bancada em 01/11/2026, o D-7.3, a forma B "sem
4024
+ marrom"). `variant="brand"`: o cartão no amarelo da marca, com a tinta e a `--shadow-md`; o rótulo na tinta, 600; a
4025
+ tendência na tinta. `bars`: as barras embaixo, 128 de altura (2 × `--space-16`), 8 entre elas, cada uma até 32 de
4026
+ largura, a cápsula em cima. Cada barra é um BOTÃO DE OPÇÃO nativo (o KPI é marcação pura, roda no servidor): o clique e as
4027
+ setas escolhem; a leitura acima diz o nome e o valor da escolhida — e, com o mouse, da que está sob ele. No amarelo, as
4028
+ barras na tinta cheia e a escolhida BRANCA (as marcas dos controles); fora dele, o `--fill-3` e a cor do texto. */
4029
+ .kpi.kpi-brand { background:var(--primary); color:var(--primary-foreground); box-shadow:var(--shadow-md); padding:var(--space-5) var(--space-5) var(--space-4); }
4030
+ .kpi-brand > .muted { color:inherit; font-weight:var(--weight-semibold); font-size:var(--text-sm); }
4031
+ .kpi-brand :is(.kpi-tone-success,.kpi-tone-danger,.kpi-tone-neutral) { color:inherit; }
4032
+ .kpi-bars-wrap { position:relative; display:grid; gap:var(--space-1); margin:var(--space-3) 0 0; padding:var(--space-6) 0 0; border:0; min-inline-size:0; }
4033
+ .kpi-bars { display:grid; grid-template-columns:repeat(var(--kpi-bars,6),minmax(0,1fr)); gap:var(--space-2); align-items:end; block-size:calc(2 * var(--space-16)); }
4034
+ .kpi-bar { display:flex; flex-direction:column; justify-content:flex-end; align-items:center; block-size:100%; color:inherit; cursor:pointer; border-radius:var(--radius-xs); }
4035
+ .kpi-bar > .kpi-bar-input { position:absolute; opacity:0; pointer-events:none; }
4036
+ .kpi-bar:has(> input:focus-visible) { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
4037
+ .kpi-bar-fill { inline-size:100%; max-inline-size:var(--space-8); block-size:var(--kpi-bar-h,0%); border-radius:var(--radius-full) var(--radius-full) var(--radius-xs) var(--radius-xs);
4038
+ background:var(--fill-3); transition:background-color var(--duration-base); }
4039
+ .kpi-bar-reading { position:absolute; inset-block-start:0; inset-inline-start:0; visibility:hidden; white-space:nowrap;
4040
+ font-family:var(--font-code); font-size:var(--text-sm); font-weight:var(--weight-semibold); }
4041
+ .kpi-bar:has(> input:checked) .kpi-bar-fill,.kpi-bar:hover .kpi-bar-fill { background:var(--foreground); }
4042
+ .kpi-bar:has(> input:checked) .kpi-bar-reading,.kpi-bar:hover .kpi-bar-reading { visibility:visible; }
4043
+ .kpi-bars:has(.kpi-bar:hover) .kpi-bar:has(> input:checked):not(:hover) .kpi-bar-reading { visibility:hidden; }
4044
+ .kpi-bars:has(.kpi-bar:hover) .kpi-bar:has(> input:checked):not(:hover) .kpi-bar-fill { background:var(--fill-3); }
4045
+ .kpi-brand .kpi-bar-fill,.kpi-brand .kpi-bars:has(.kpi-bar:hover) .kpi-bar:has(> input:checked):not(:hover) .kpi-bar-fill { background:var(--primary-foreground); }
4046
+ .kpi-brand .kpi-bar:has(> input:checked) .kpi-bar-fill,.kpi-brand .kpi-bar:hover .kpi-bar-fill { background:var(--control-thumb); }
4047
+ .kpi-brand { --focus-strong:var(--primary-foreground); }
4048
+ .kpi-bars-x { display:grid; grid-template-columns:repeat(var(--kpi-bars,6),minmax(0,1fr)); gap:var(--space-2); text-align:center; font-family:var(--font-code); font-size:var(--text-xs); }
3833
4049
  /* DataList: chave/valor em duas colunas. O termo é secundário — mesmo idioma do cabeçalho de
3834
4050
  tabela. Sem a regra (achado A13) o <dl> saía cru: dt e dd empilhados, com o recuo de 40px
3835
4051
  que o navegador dá ao <dd>. */
@@ -3844,8 +4060,10 @@ button.tag-main { cursor:pointer; }
3844
4060
  179px para 90px em vez de zerar. `minmax(0,max-content)` é o que encolhe: com espaço mede
3845
4061
  igual ao que media antes (nenhuma baseline mudou), sem espaço o termo quebra. */
3846
4062
  .data-list { display:grid; grid-template-columns:minmax(0,max-content) minmax(0,1fr); gap:var(--space-2) var(--space-6); margin:0; }
3847
- .data-list dt { min-width:0; color:var(--muted-foreground); }
3848
- .data-list dd { min-width:0; margin:0; }
4063
+ /* A palavra que não cabe QUEBRA dentro da célula (0.52.1, aprovado pela imagem em 01/11/2026): um nome de código longo
4064
+ (`window.Aurea.setTheme`) saía da célula, e numa coluna estreita a página rolava de lado. */
4065
+ .data-list dt { min-width:0; color:var(--muted-foreground); overflow-wrap:anywhere; }
4066
+ .data-list dd { min-width:0; margin:0; overflow-wrap:anywhere; }
3849
4067
  /* E no ESTREITO ele empilha — a outra metade da correção. Medido a 320px com termos de frase
3850
4068
  inteira: duas colunas não cabem, o termo resolvia em 164px, a calha comia o resto e a coluna do
3851
4069
  valor ficava com `0px`, jogando o texto para fora da PÁGINA. Mesmo remédio que `.message` e
@@ -3912,6 +4130,32 @@ button.tag-main { cursor:pointer; }
3912
4130
  .accordion-lg .accordion-content { padding-inline:calc(var(--space-5) + var(--space-05)); padding-block-end:var(--space-5); font-size:var(--text-base); line-height:var(--leading-relaxed); }
3913
4131
  .accordion-lg .accordion-content > p { margin:0; }
3914
4132
  .accordion-surface > .accordion-item::after { inset-inline-start:3%; inline-size:94%; }
4133
+ /* O ACORDEÃO DE LADO (`orientation="horizontal"`, o site B — a página inicial, aprovado pela bancada em 01/11/2026, o
4134
+ D-7.1): os itens em pé, lado a lado, 12 entre eles; cada um é um cartão (canto 22, a cor do cartão, sem o fio de baixo),
4135
+ fechado com 104 (`--space-24` + `--space-2`) e o aberto toma o resto, numa curva de duas vezes o tempo lento. A pergunta
4136
+ fechada é uma coluna (o que vem antes em cima, o resto embaixo); aberta, uma linha. O fechado sobe a sombra média com o
4137
+ mouse. A seta sai. A altura é a do pai. Num contêiner estreito (até 47.5rem), vira o acordeão de pé. */
4138
+ .accordion-horizontal-frame { container-type:inline-size; block-size:100%; }
4139
+ .accordion.accordion-horizontal { flex-direction:row; gap:var(--space-3); block-size:100%; }
4140
+ .accordion-horizontal > .accordion-item { display:flex; flex-direction:column; flex:0 0 calc(var(--space-24) + var(--space-2)); min-inline-size:0; overflow:hidden;
4141
+ border-radius:var(--radius-card); background:var(--card);
4142
+ transition:flex-grow calc(2 * var(--duration-slow)) var(--ease-emphasized),flex-basis calc(2 * var(--duration-slow)) var(--ease-emphasized),box-shadow var(--duration-base); }
4143
+ .accordion-horizontal > .accordion-item::after { content:none; }
4144
+ .accordion-horizontal > .accordion-item[open] { flex:1 1 0; }
4145
+ .accordion-horizontal > .accordion-item:not([open]):hover { box-shadow:var(--shadow-md); }
4146
+ .accordion-horizontal > .accordion-item > summary { flex:1; flex-direction:column; align-items:flex-start; justify-content:space-between; gap:var(--space-3);
4147
+ padding:var(--space-5); border-radius:var(--radius-card); font-size:var(--text-base); }
4148
+ .accordion-horizontal > .accordion-item:not([open]) > summary:hover:not([aria-disabled="true"]) { background:transparent; }
4149
+ .accordion-horizontal > .accordion-item[open] > summary { flex:none; flex-direction:row; align-items:center; gap:var(--space-4); padding-block-end:var(--space-2); cursor:default; }
4150
+ .accordion-horizontal .accordion-chevron { display:none; }
4151
+ .accordion-horizontal > .accordion-item > .accordion-content { flex:1; min-block-size:0; overflow:auto; padding:var(--space-3) var(--space-6) var(--space-6); color:var(--foreground); font-size:var(--text-base); }
4152
+ @container (max-width:47.5rem) {
4153
+ .accordion.accordion-horizontal { flex-direction:column; block-size:auto; }
4154
+ .accordion-horizontal > .accordion-item,.accordion-horizontal > .accordion-item[open] { flex:none; }
4155
+ .accordion-horizontal > .accordion-item > summary { flex-direction:row; align-items:center; justify-content:flex-start; }
4156
+ .accordion-horizontal > .accordion-item > .accordion-content { padding:var(--space-3); }
4157
+ }
4158
+ @media (prefers-reduced-motion:reduce) { .accordion-horizontal > .accordion-item { transition:none; } }
3915
4159
  .accordion-surface > .accordion-item:not([open]) > summary:hover:not([aria-disabled="true"]) { background:var(--secondary); }
3916
4160
  @media (prefers-reduced-motion:reduce) { .accordion-chevron { transition:none; } }
3917
4161
  /* Mockup do kit de origem (apps/docs) — não é o Accordion do sistema, que é <details> nativo. */
@@ -3994,6 +4238,27 @@ button.tag-main { cursor:pointer; }
3994
4238
  .demo-code { display:flex; padding:0; overflow:hidden; }
3995
4239
  .demo-code .code-block-wrap { flex:1; }
3996
4240
  .demo-code .code-block { padding:var(--space-6); border:0; border-radius:0; }
4241
+ /* A CAIXA EMPILHADA (`CodeBlock previewLayout="stacked"`, o site B, 02/11/2026 — o Victor: "preciso que seja fiel a
4242
+ referencia", e "Com degradê"; ADR-0089): a peça em cima e o código embaixo, sem a chave Prévia | Código, nas medidas da
4243
+ referência — a peça em 350 (3 x 96 + 48 + 12 + 2) com recheio de 40, no fundo da página; o código no cartão, 16 em cima,
4244
+ 12 dos lados e 14 embaixo. Mais de 5 linhas: recolhido em 150 (96 + 48 + 4 + 2), sumindo num DEGRADÊ (a 3ª exceção à
4245
+ regra sem gradiente, só nesta regra — o check 4 cobra), com o "Expand code" (32, letra 12) a 8 do fundo; aberto, o código
4246
+ inteiro e o "Collapse code" embaixo dele. Sem linha: a peça e o código se separam pelo fundo. */
4247
+ .demo.demo-stacked { display:flex; flex-direction:column; min-block-size:0; padding:0; overflow:hidden; }
4248
+ .demo.demo-stacked > .demo-panel { flex:none; }
4249
+ .demo.demo-stacked > .demo-panel[data-panel="preview"] { min-block-size:calc(3 * var(--space-24) + var(--space-12) + var(--space-3) + var(--space-05));
4250
+ padding:var(--space-10); border-radius:var(--radius-card) var(--radius-card) 0 0; background:var(--background); }
4251
+ .demo.demo-stacked > .demo-code { position:relative; display:block; overflow:visible; background:var(--card); }
4252
+ .demo.demo-stacked > .demo-code .code-block-wrap { position:relative; }
4253
+ .demo.demo-stacked > .demo-code .code-block { padding:var(--space-4) var(--space-3) calc(var(--space-3) + var(--space-05)); background:transparent; }
4254
+ .demo.demo-stacked > .demo-code .copy-code { top:var(--space-3); inset-inline-end:var(--space-2); z-index:2; }
4255
+ .demo.demo-stacked[data-collapsed] > .demo-code .code-block-wrap { max-block-size:calc(var(--space-24) + var(--space-12) + var(--space-1) + var(--space-05)); overflow:hidden;
4256
+ -webkit-mask-image:linear-gradient(to bottom, var(--foreground) 40%, transparent); mask-image:linear-gradient(to bottom, var(--foreground) 40%, transparent); }
4257
+ .demo.demo-stacked[data-expanded] > .demo-code .code-block { padding-block-end:calc(var(--space-12) + var(--space-1)); }
4258
+ /* No alto contraste do sistema o degradê sai: o código recolhido aparece inteiro até o corte, sem esmaecer. */
4259
+ @media (forced-colors:active) { .demo.demo-stacked[data-collapsed] > .demo-code .code-block-wrap { -webkit-mask-image:none; mask-image:none; } }
4260
+ .demo-stacked-toggle { --step-fs:var(--text-xs); position:absolute; inset-block-end:var(--space-2); inset-inline-start:50%; translate:-50% 0; z-index:3;
4261
+ font-weight:var(--weight-medium); box-shadow:var(--shadow-sm); }
3997
4262
  .copy-code { position:absolute; top:var(--space-3); inset-inline-end:var(--space-3); z-index:1; }
3998
4263
  /* O fim da linha fica fora do botão de copiar (achado no 3-A, 23/10/2026): no Quick Start, o `pnpm add` de uma linha
3999
4264
  terminava a 915 e o botão começava a 901 — o fim do comando ficava embaixo dele. O código reserva no fim o lugar do
@@ -4002,6 +4267,20 @@ button.tag-main { cursor:pointer; }
4002
4267
  .code-block-wrap > .code-block { padding-inline-end:calc(var(--space-3) + var(--control-h-md) + var(--space-2)); }
4003
4268
  .copy-code .c-done { display:none; }
4004
4269
  .copy-code.is-done .c-copy { display:none; } .copy-code.is-done .c-done { display:block; color:var(--primary); }
4270
+ /* A CABEÇA DO ARQUIVO (`CodeBlock filename`, o site B — aprovada pela bancada em 01/11/2026, o item 6, "Ícone + nome"): o
4271
+ bloco é o cartão (canto 22, a cor do cartão); a cabeça tem 52 (`--control-h-md` + `--space-4`), o nome do arquivo em mono
4272
+ 12, apagado, e o "Copy" escrito — o botão secundário de 36, o ícone antes do nome; copiado, os dois viram o visto e
4273
+ "Copied". O código a 14, na cor do texto, com 6 em cima e 20 dos lados e embaixo, e a linha longa DESCE (sem rolar). */
4274
+ .code-block-wrap.code-block-file { flex-direction:column; border-radius:var(--radius-card); background:var(--card); overflow:hidden; }
4275
+ .code-block-head { display:flex; align-items:center; gap:var(--space-3); min-block-size:calc(var(--control-h-md) + var(--space-4));
4276
+ padding:calc(var(--space-1) + var(--space-05)) var(--space-2) 0 var(--space-5); }
4277
+ .code-block-title { min-inline-size:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
4278
+ font-family:var(--font-code); font-weight:var(--weight-medium); font-size:var(--text-xs); color:var(--muted-foreground); }
4279
+ .code-block-head > .copy-code-text { margin-inline-start:auto; flex:none; }
4280
+ .copy-code-text .c-done { display:none; }
4281
+ .copy-code-text.is-done .c-copy { display:none; } .copy-code-text.is-done .c-done { display:inline-block; }
4282
+ .code-block-wrap.code-block-file > .code-block { padding:calc(var(--space-1) + var(--space-05)) var(--space-5) var(--space-5); border-radius:0; background:transparent;
4283
+ color:var(--foreground); font-size:var(--text-sm); font-weight:var(--weight-medium); overflow:visible; white-space:pre-wrap; overflow-wrap:anywhere; }
4005
4284
  /* "On this page": índice da própria página, fixo na lateral. Navegação, não decoração —
4006
4285
  por isso é <nav> com rótulo, e o item atual se marca com aria-current. */
4007
4286
  .toc { position:sticky; top:var(--space-4); align-self:start; display:grid; gap:var(--space-1); max-height:calc(100vh - var(--space-8)); overflow:auto; padding:var(--space-2) 0; }
@@ -4470,6 +4749,15 @@ button.tag-main { cursor:pointer; }
4470
4749
  .dialog-backdrop { position:fixed; inset:0; z-index:var(--z-modal); background:var(--overlay); backdrop-filter:blur(5px); transition:opacity var(--duration-slow) var(--ease-standard); }
4471
4750
  .dialog-backdrop[data-starting-style],.dialog-backdrop[data-ending-style] { opacity:0; }
4472
4751
  .dialog-backdrop[data-ending-style] { transition-duration:var(--duration-fast); }
4752
+ /* AS JANELAS PRESAS (`data-contained` num contêiner, o site B — aprovado pela bancada em 01/11/2026, o D-4): a janela, a
4753
+ gaveta, o balão e o aviso continuam os de sempre (a pele, as medidas, a entrada e a saída); só a posição muda — em vez da
4754
+ janela inteira do navegador, eles se prendem ao contêiner que os recebe (no React, o `portalContainer` do
4755
+ `AureaProvider` apontando para ele). Para demonstração e para um painel dentro da página. Sem o atributo, nada muda. */
4756
+ [data-contained] { position:relative; overflow:hidden; isolation:isolate; }
4757
+ [data-contained] :is(.dialog-backdrop,.dialog,.drawer,.toast-stack) { position:absolute; z-index:1; }
4758
+ [data-contained] .dialog { inline-size:min(var(--dialog-w),calc(100% - 2 * var(--dialog-margin))); max-block-size:calc(100% - 2 * var(--dialog-margin)); }
4759
+ [data-contained] .drawer-right,[data-contained] .drawer-left { inline-size:min(20rem,85%); }
4760
+ [data-contained] .toast-stack { inline-size:calc(100% - 2 * var(--space-3)); inset-block-end:var(--space-3); }
4473
4761
  .dialog { --dialog-margin:var(--space-4); --dialog-w:28rem; position:fixed; inset-inline:0; top:50%; translate:0 -50%; z-index:var(--z-modal); display:flex; flex-direction:column; inline-size:min(var(--dialog-w),calc(100vw - 2 * var(--dialog-margin))); max-block-size:calc(100dvh - 2 * var(--dialog-margin)); margin-inline:auto; padding:var(--space-6); border:var(--border-width) solid transparent; border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); outline:none; transition:opacity var(--duration-slow) var(--ease-standard),scale var(--duration-slow) var(--ease-standard); }
4474
4762
  .dialog[data-starting-style] { opacity:0; scale:1.05; }
4475
4763
  .dialog[data-ending-style] { opacity:0; scale:.95; transition-duration:var(--duration-fast); }
@@ -4679,6 +4967,49 @@ button.tag-main { cursor:pointer; }
4679
4967
  .command-shortcuts > span { display:inline-flex; align-items:center; gap:var(--space-1); }
4680
4968
  .command-item { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:var(--space-3); align-items:center; }
4681
4969
  .command-item-label { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
4970
+ /* A BUSCA GRANDE (`CommandPalette size="lg"`, o site B — aprovada pela bancada em 01/11/2026, o item 2 e o D-2). Sem o
4971
+ `lg`, os invólucros novos não geram caixa (`display:contents`) e a paleta é a de sempre. A janela tem a largura `lg`
4972
+ (1024); o campo é uma cápsula de 64 (`--space-16`) no `--fill-2`, com a lupa de 20, a letra 18 e o "Esc" dentro — o
4973
+ foco é o do campo inteiro, como o `InputGroup`; os filtros do app vêm embaixo; a lista e a prévia lado a lado (a prévia
4974
+ no `--fill-1`, canto 22, presa ao alto); o título do grupo em mono maiúsculo, com a contagem na ponta; o item de 50
4975
+ (`--control-h-xl`) com o ícone num círculo de 40 tingido pela cor de categoria, o título 16/600 e a descrição cortada;
4976
+ o "↵" amarelo só na linha ativa; o pé com as teclas e o encaixe do app. Até 1280 (o `--breakpoint-xl`; o desenho
4977
+ tem 1240, fora da escala), a prévia some. */
4978
+ .command-body-plain,.command-foot-plain { display:contents; }
4979
+ .command-palette-lg { width:min(var(--breakpoint-lg),100%); gap:var(--space-3); }
4980
+ .command-field { display:flex; align-items:center; gap:var(--space-3); block-size:calc(var(--space-12) + var(--space-1)); padding-inline:var(--space-5) var(--space-3);
4981
+ border-radius:var(--radius-control); background:var(--fill-2); }
4982
+ .command-field:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; }
4983
+ .command-field > .icon { inline-size:var(--icon-md); block-size:var(--icon-md); color:var(--muted-foreground); flex:none; }
4984
+ .command-input { flex:1; min-inline-size:0; border:0; padding:0; background:none; color:inherit; font:inherit; font-size:var(--text-lg); outline:none; }
4985
+ .command-input::placeholder { color:var(--muted-foreground); }
4986
+ .command-filters { display:flex; flex-wrap:wrap; gap:var(--space-2); }
4987
+ .command-group-count { flex:none; font-variant-numeric:tabular-nums; }
4988
+ .command-body { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,25rem); gap:var(--space-4); align-items:start; }
4989
+ .command-palette-lg .command-list { max-height:none; }
4990
+ .command-palette-lg .command-group-label { display:flex; justify-content:space-between; gap:var(--space-2); font-family:var(--font-code); text-transform:uppercase; letter-spacing:.06em; }
4991
+ .command-palette-lg .command-item { grid-template-columns:auto minmax(0,1fr) auto; min-block-size:var(--control-h-xl); padding-block:var(--space-1); border-radius:var(--radius-control); }
4992
+ .command-item-tile { display:inline-grid; place-items:center; inline-size:var(--space-10); block-size:var(--space-10); border-radius:var(--radius-full); flex:none;
4993
+ background:var(--fill-2); color:var(--foreground); }
4994
+ .command-item-tile:empty { visibility:hidden; }
4995
+ .command-item-tile[data-tone="red"] { background:var(--category-red-bg); color:var(--category-red); }
4996
+ .command-item-tile[data-tone="orange"] { background:var(--category-orange-bg); color:var(--category-orange); }
4997
+ .command-item-tile[data-tone="green"] { background:var(--category-green-bg); color:var(--category-green); }
4998
+ .command-item-tile[data-tone="teal"] { background:var(--category-teal-bg); color:var(--category-teal); }
4999
+ .command-item-tile[data-tone="cyan"] { background:var(--category-cyan-bg); color:var(--category-cyan); }
5000
+ .command-item-tile[data-tone="blue"] { background:var(--category-blue-bg); color:var(--category-blue); }
5001
+ .command-item-tile[data-tone="violet"] { background:var(--category-violet-bg); color:var(--category-violet); }
5002
+ .command-item-tile[data-tone="pink"] { background:var(--category-pink-bg); color:var(--category-pink); }
5003
+ .command-item-text { display:grid; min-inline-size:0; }
5004
+ .command-palette-lg .command-item-label { font-size:var(--text-base); font-weight:var(--weight-semibold); }
5005
+ .command-item-description { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:var(--muted-foreground); font-size:var(--text-sm); }
5006
+ .command-item-enter { visibility:hidden; background:var(--primary); color:var(--primary-foreground); }
5007
+ .command-item[data-highlighted] .command-item-enter { visibility:visible; }
5008
+ .command-preview { position:sticky; inset-block-start:0; display:flex; flex-direction:column; align-items:flex-start; gap:var(--space-4); padding:var(--space-5);
5009
+ border-radius:var(--radius-card); background:var(--fill-1); }
5010
+ .command-foot { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:var(--space-4); }
5011
+ .command-foot > .command-shortcuts { padding:0; }
5012
+ @media (max-width:1280px) { .command-body { grid-template-columns:minmax(0,1fr); } .command-preview { display:none; } }
4682
5013
 
4683
5014
  .menu-sep { height:1px; margin:6px 4px; background:var(--border); border:0; }
4684
5015
  /* G-API-02 — a anatomia que o menu ganhou quando o dado deixou de ter uma forma só.
@@ -4852,7 +5183,14 @@ button.tag-main { cursor:pointer; }
4852
5183
  .combobox-multi:has([aria-invalid="true"]),
4853
5184
  .combobox-multi:has(:user-invalid),
4854
5185
  .dropzone:has([aria-invalid="true"]),
4855
- .dropzone:has(:user-invalid) { border-color:transparent; background-color:var(--danger-bg); --focus-strong:var(--danger-400); }
5186
+ .dropzone:has(:user-invalid),
5187
+ .checkbox-pill[data-tone] input[aria-invalid="true"] + .control-mark,
5188
+ .checkbox-pill[data-tone] input:user-invalid + .control-mark,
5189
+ .radio-group-cards > .radio:has(input[aria-invalid="true"]),
5190
+ .radio-group-cards > .radio:has(input:user-invalid) { border-color:transparent; background-color:var(--danger-bg); --focus-strong:var(--danger-400); }
5191
+ /* ↑ A 0.54.0 (02/11/2026, a trava `invalido.spec.ts`): a cápsula com tom (`Checkbox variant="pill" tone`) tem a regra da
5192
+ marcada com a mesma força desta — aqui, depois, o inválido vence; e o cartão de escolha (`RadioGroup variant="card"`)
5193
+ pinta o CARTÃO inteiro, porque com `indicatorPlacement="none"` a marca que pintava está escondida. */
4856
5194
  /* ↑ Sem linha (16/10/2026, o Victor: "quero tudo sem borda sem exceções"): o inválido era a borda vermelha; sem
4857
5195
  borda, ele é o FUNDO de perigo (`--danger-bg`), o mesmo dos avisos. A frase de erro do `Field` continua embaixo.
4858
5196
  `--focus-strong` (ADR-0059, 08/10/2026): o anel de foco agora COLA na borda e a pinta — com o
@@ -4925,6 +5263,9 @@ button.notification-item:hover { background:var(--surface-3); }
4925
5263
  REFERENCES.md; a pele é Aurea. O título vinha com o h3 do NAVEGADOR (16,38px). */
4926
5264
  .empty-state { display:flex; flex-direction:column; align-items:center; gap:var(--space-3); padding:var(--space-10) var(--space-6); color:var(--muted-foreground); text-align:center; }
4927
5265
  .empty-state > .icon { color:var(--subtle-foreground); }
5266
+ /* A MOLDURA (`framed`, o site B — aprovada pela bancada em 01/11/2026): o ícone num círculo de 64 (`--space-16`), a
5267
+ mesma do `EmptyState` do nativo (R-15, `IconeEmMoldura`): o fundo e a cor do ícone são os dele (`muted`). */
5268
+ .empty-state-frame { display:grid; place-items:center; flex:none; inline-size:var(--space-16); block-size:var(--space-16); border-radius:var(--radius-full); background:var(--muted); color:var(--muted-foreground); }
4928
5269
  .empty-state p { max-width:46ch; margin:0; }
4929
5270
  .empty-title { margin:0; color:var(--foreground); font-size:var(--text-base); font-weight:var(--weight-semibold); line-height:var(--leading-tight); }
4930
5271
 
@@ -5698,7 +6039,7 @@ button.graph-node-body { cursor:pointer; }
5698
6039
  /* O FOCO DOS CAMPOS no claro é o amarelo, uma linha só, como no escuro (decisão do Victor, 26/10/2026; a medida — 1,75:1
5699
6040
  na página, 1,91:1 no cartão, abaixo dos 3:1 — vai à bancada do passo A). Os botões e o resto continuam com o grafite. */
5700
6041
  [data-theme="light"] :is(.input,.textarea,.select):focus-visible:where(:not([data-brand="ember"],[data-brand="ember"] *)):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),
5701
- [data-theme="light"] :is(.input-group,.combobox-multi):focus-within:where(:not([data-brand="ember"],[data-brand="ember"] *)):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) {
6042
+ [data-theme="light"] :is(.input-group,.combobox-multi,.command-field):focus-within:where(:not([data-brand="ember"],[data-brand="ember"] *)):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) {
5702
6043
  outline-color:var(--primary); }
5703
6044
 
5704
6045
  /* "AUMENTAR CONTRASTE" do sistema (`prefers-contrast: more`: o "Aumentar contraste" do macOS, do iOS e do Android, o
@@ -5712,7 +6053,7 @@ button.graph-node-body { cursor:pointer; }
5712
6053
  :root:where(:not([data-brand="ember"])),[data-theme]:where(:not([data-brand="ember"],[data-brand="ember"] *)) {
5713
6054
  --control-thumb:var(--brand-yellow-ink); --control-selected-foreground:var(--brand-yellow-ink); --control-selected-dot:var(--brand-yellow-ink); }
5714
6055
  [data-theme="light"] :is(.input,.textarea,.select):focus-visible:where(:not([data-brand="ember"],[data-brand="ember"] *)):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),
5715
- [data-theme="light"] :is(.input-group,.combobox-multi):focus-within:where(:not([data-brand="ember"],[data-brand="ember"] *)):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) {
6056
+ [data-theme="light"] :is(.input-group,.combobox-multi,.command-field):focus-within:where(:not([data-brand="ember"],[data-brand="ember"] *)):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) {
5716
6057
  outline-color:var(--focus-strong); }
5717
6058
  }
5718
6059
 
@@ -5767,6 +6108,10 @@ button.graph-node-body { cursor:pointer; }
5767
6108
  :is([data-segment-style="brand"] .segmented:not([data-segment-style]),.segmented[data-segment-style="brand"]) :is(button,a).active { --seg-bg:var(--primary); --seg-fg:var(--primary-foreground); --seg-shadow:none; }
5768
6109
  :is([data-segment-style="ring"] .segmented:not([data-segment-style]),.segmented[data-segment-style="ring"]) :is(button,a).active { --seg-bg:var(--segment); --seg-fg:var(--foreground); --seg-shadow:inset 0 0 0 calc(1.5 * var(--border-width)) var(--primary), var(--shadow-sm); }
5769
6110
  :is([data-segment-style="dot"] .segmented:not([data-segment-style]),.segmented[data-segment-style="dot"]) :is(button,a).active { --seg-bg:var(--segment); --seg-fg:var(--foreground); --seg-shadow:var(--shadow-sm); }
6111
+ /* `emphasis` (o site B, 02/11/2026 — o Victor escolheu a "C" na imagem): a cápsula erguida do `neutral` com a letra do
6112
+ DESTAQUE, a mesma do escolhido de sempre (`--primary-emphasis`: o amarelo no escuro, a cor do texto no claro), e sem o
6113
+ fio de baixo. */
6114
+ :is([data-segment-style="emphasis"] .segmented:not([data-segment-style]),.segmented[data-segment-style="emphasis"]) :is(button,a).active { --seg-bg:var(--segment); --seg-fg:var(--primary-emphasis); --seg-shadow:var(--shadow-sm); }
5770
6115
  :is([data-segment-style]:not([data-segment-style="current"]) .segmented:not([data-segment-style]),.segmented[data-segment-style]:not([data-segment-style="current"])) :is(button,a).active {
5771
6116
  --btn-bg:var(--seg-bg); --btn-fg:var(--seg-fg); background:var(--seg-bg); color:var(--seg-fg); box-shadow:var(--seg-shadow); }
5772
6117
  :is([data-segment-style]:not([data-segment-style="current"]) .segmented:not([data-segment-style]),.segmented[data-segment-style]:not([data-segment-style="current"])) :is(button,a).active::after { content:none; }
package/dist/aurea.js CHANGED
@@ -108,6 +108,19 @@
108
108
  if (trigger) copy(trigger);
109
109
  });
110
110
 
111
+ // A CAIXA EMPILHADA (ADR-0089): o [data-aurea-code-expand] abre e recolhe o código da caixa — troca `data-collapsed` por
112
+ // `data-expanded`, o `aria-expanded` e o texto ("Expand code" / "Collapse code", lidos do próprio botão).
113
+ document.addEventListener("click", function (event) {
114
+ var botao = event.target.closest && event.target.closest("[data-aurea-code-expand]");
115
+ var caixa = botao && botao.closest(".demo-stacked");
116
+ if (!caixa) return;
117
+ var abre = caixa.hasAttribute("data-collapsed");
118
+ caixa.toggleAttribute("data-collapsed", !abre);
119
+ caixa.toggleAttribute("data-expanded", abre);
120
+ botao.setAttribute("aria-expanded", abre ? "true" : "false");
121
+ botao.textContent = botao.getAttribute(abre ? "data-label-collapse" : "data-label-expand") || botao.textContent;
122
+ });
123
+
111
124
  // GAR-14 (0.28.0) · COMPARTILHAR. O gatilho marcado com [data-aurea-share] (o `Button share` do
112
125
  // React emite isto) pergunta ao navegador se ele sabe compartilhar ESTE link — detectar o recurso,
113
126
  // e não adivinhar o aparelho, é o padrão da web. Sabe: abre a janela do aparelho; a pessoa
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurea-uds/core",
3
- "version": "0.52.0",
3
+ "version": "0.54.1",
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",