@aurea-uds/core 0.51.0 → 0.54.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
@@ -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);
@@ -1318,8 +1320,9 @@ img,svg { display:block; }
1318
1320
  /* A base do topo carrega só o ARRANJO; cada variante traz a própria superfície.
1319
1321
  floating = caixa solta (a que já estava) · flush = faixa encostada nas bordas com fio
1320
1322
  embaixo, para o topo virar moldura da janela · pill = cápsula centrada, de cabeçalho
1321
- de site. Só floating e flush entram no grid do AppShell; a pill é peça avulsa (numa
1322
- pílula não cabem busca + densidade + tema + comando). */
1323
+ de site. ~~Só floating e flush entram no grid do AppShell; a pill é peça avulsa (numa
1324
+ pílula não cabem busca + densidade + tema + comando).~~ Desde o site B (30/10/2026) a pill
1325
+ entra no AppShell: com `maxWidth`, a cápsula é o miolo, da largura do bloco, e cabe tudo. */
1323
1326
  .topbar { grid-column:1/-1; position:sticky; z-index:var(--z-sticky); display:flex; align-items:center; justify-content:space-between; gap:var(--space-4); min-height:var(--topbar-height); }
1324
1327
  .topbar-floating { top:var(--space-4); margin:var(--space-4) var(--space-4) 0; padding:var(--space-2) var(--space-4); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); }
1325
1328
  /* flush: encostada nas bordas. SEM fio embaixo (pedido do Victor — a referência não tem)
@@ -1329,6 +1332,19 @@ img,svg { display:block; }
1329
1332
  /* divider (B-07): a linha que separa a barra grudada do conteúdo que passa por baixo. */
1330
1333
  .topbar-divider { border-block-end:var(--border-width) solid transparent; }
1331
1334
  .topbar-pill { top:var(--space-4); width:max-content; max-width:calc(100% - var(--space-8)); margin:var(--space-4) auto 0; justify-content:flex-start; gap:var(--space-2); padding:var(--space-2); border:1px solid transparent; border-radius:var(--radius-control); background:var(--card); color:var(--card-foreground); }
1335
+ /* A PÍLULA LARGA (`pill` com `maxWidth` — o topo do site B, aprovado em 26/10/2026; no `AppShell`, `topbarVariant="pill"`):
1336
+ a cápsula é o MIOLO, da largura do `Container`, e não do conteúdo. O cabeçalho em volta vira a faixa transparente que
1337
+ gruda no alto, com a cápsula a --space-4 da borda da tela; a cápsula tem a altura da barra (64), o fundo do cartão e a
1338
+ sombra das superfícies que flutuam (`--shadow-md`). A marca fica a --space-5 da ponta da cápsula; os botões redondos
1339
+ da outra ponta, a --space-2 (o canto da cápsula já afasta o círculo). Entre as partes, --space-3 (o desenho tem 14): com 16,
1340
+ a pílula do site não cabia na tela de 1280 (medido, 30/10/2026). */
1341
+ .topbar-pill.topbar-contained { top:0; width:auto; max-width:none; margin:0; padding:calc(var(--space-3) + var(--space-05)) var(--space-4) 0; border-width:0; border-radius:0; background:transparent; }
1342
+ .topbar-pill.topbar-contained > .topbar-inner { flex-wrap:nowrap; gap:var(--space-3); padding-inline:var(--space-5) var(--space-2); border-radius:var(--radius-control); background:var(--card); color:var(--card-foreground); box-shadow:var(--shadow-md); }
1343
+ /* O desfoque na pílula (`blurred`): na solta, a própria cápsula; na larga, o miolo. A mesma mistura da `flush` (o cartão a
1344
+ 72%, ADR-0086), e o fundo cheio para quem pede menos transparência ou não tem o desfoque. */
1345
+ :is(.topbar-pill.topbar-blurred:not(.topbar-contained),.topbar-pill.topbar-blurred > .topbar-inner) { background:color-mix(in oklab, var(--card) 72%, transparent); -webkit-backdrop-filter:blur(var(--space-4)) saturate(160%); backdrop-filter:blur(var(--space-4)) saturate(160%); }
1346
+ @supports not ((backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px))) { :is(.topbar-pill.topbar-blurred:not(.topbar-contained),.topbar-pill.topbar-blurred > .topbar-inner) { background:var(--card); } }
1347
+ @media (prefers-reduced-transparency:reduce) { :is(.topbar-pill.topbar-blurred:not(.topbar-contained),.topbar-pill.topbar-blurred > .topbar-inner) { background:var(--card); -webkit-backdrop-filter:none; backdrop-filter:none; } }
1332
1348
  /* .brand nasceu como cabeçalho VERTICAL da lateral (borda embaixo + respiro); no topo
1333
1349
  ele deita, então some com a borda e a margem — o lockup em si continua o mesmo. */
1334
1350
  .topbar .brand { min-height:auto; margin:0; padding:0; border:0; }
@@ -1531,6 +1547,22 @@ img,svg { display:block; }
1531
1547
  `:not`): mais fraca, ou antes dela, a lateral grudava a 66 do topo, por baixo da barra (medido). A linha de baixo
1532
1548
  fica pendurada fora da barra, como a da referência, e não entra na conta. */
1533
1549
  .app-shell-docs { --docs-top:calc(var(--space-12) + var(--space-2) + var(--space-1) + var(--space-10)); }
1550
+ /* Com a PÍLULA (`topbarVariant="pill"`, o site B — 30/10/2026), a cápsula (64) fica a 14 do alto e a página começa 18
1551
+ abaixo dela, a 96, como no desenho aprovado (medido em 31/10/2026). A lateral e o índice grudam a 96: esta conta é a
1552
+ altura em que eles grudam menos o --space-4 que o arranjo soma, e não a altura da barra. */
1553
+ .app-shell-docs.app-shell-pill { --docs-top:calc(var(--space-4) + var(--topbar-height)); }
1554
+ /* E sem a barra do índice abaixo de 1280: no desenho aprovado o índice só existe na coluna da direita (protótipo). */
1555
+ .app-shell-docs.app-shell-pill > .docs-toc-bar { display:none; }
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
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; }
1560
+ /* A lateral com caixa vai até 16 do pé da tela, e não mais (o desenho, medido em 31/10/2026). */
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)); } }
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); } }
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; } }
1534
1566
  .app-shell-docs > .content > * { max-inline-size:var(--docs-text-width); }
1535
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
1536
1568
  `AppShell`, ele encostava a 16 — a bancada do lote T pegou). */
@@ -1572,6 +1604,16 @@ img,svg { display:block; }
1572
1604
  ponta direita dele fica alinhada com a da barra de cima (o Victor, 17/10/2026: "componentes não alinhados"). */
1573
1605
  .app-shell-docs > .sidebar.app-shell-aside { grid-column:4; grid-row:2; justify-self:start; inline-size:var(--docs-toc-width);
1574
1606
  block-size:calc(100vh - var(--shell-top) - var(--space-8)); padding-block-start:0; padding-inline:var(--space-4); }
1607
+ /* O índice COM CAIXA (o site B, 30/10/2026, protótipo): a caixa tem a altura do que ela mostra — até a da tela, e aí
1608
+ rola —, e um respiro em cima; sem caixa, a coluna inteira, como na referência. */
1609
+ .app-shell-docs > .sidebar.app-shell-aside:not(.sidebar-plain) { block-size:auto; max-block-size:calc(100vh - var(--shell-top) - var(--space-8));
1610
+ padding-block:var(--space-4) var(--space-3); padding-inline:var(--space-3); }
1611
+ /* E O ARRANJO COM A PÍLULA (o site B, protótipo): as colunas encostam no bloco com 28 de vão, como no desenho — o texto
1612
+ começa a 28 da lateral e vai até 28 do índice, que tem 236 e fica na ponta do bloco. */
1613
+ .app-shell-docs.app-shell-pill { --docs-aside-width:calc(var(--docs-toc-width) + var(--space-6)); }
1614
+ .app-shell-docs.app-shell-pill > .content.content { padding:calc(var(--space-4) + var(--space-05)) 0 0 var(--space-7); }
1615
+ /* Também o índice que abre por cima (`[popover]`): a regra dele, mais adiante, devolvia os 240. */
1616
+ .app-shell-docs.app-shell-pill > .sidebar.app-shell-aside, .app-shell-docs.app-shell-pill > .sidebar.app-shell-aside[popover] { justify-self:end; inline-size:calc(var(--docs-toc-width) - var(--space-1)); }
1575
1617
  }
1576
1618
  /* A margem é LÓGICA desde 03/10/2026 (AN-01): era `margin:space-4 space-4 space-4 0`, física, e na
1577
1619
  escrita da direita para a esquerda o conteúdo encostava na borda da página e deixava 32 de vão na
@@ -1827,6 +1869,10 @@ img,svg { display:block; }
1827
1869
  .sidebar-group-toggle { display:flex; align-items:center; gap:var(--space-1); min-block-size:var(--control-h-xs); padding:0; border:0; border-radius:var(--radius-control); background:transparent; font:inherit; font-size:var(--text-sm); font-weight:var(--weight-medium); text-align:start; cursor:pointer; }
1828
1870
  .sidebar-group-toggle > span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
1829
1871
  .sidebar-group-caret { flex:none; opacity:.8; }
1872
+ /* O SITE B (30/10/2026, protótipo): no grupo que dobra, a seta vai para a PONTA da linha e os itens ficam um passo para
1873
+ dentro do nome do grupo, como no desenho aprovado. */
1874
+ .sidebar-group-toggle > span { flex:1; min-inline-size:0; }
1875
+ .sidebar-group-list > .sidebar-list { padding-inline-start:var(--space-7); }
1830
1876
  .sidebar-group-action { display:flex; align-items:center; gap:var(--space-1); flex:none; }
1831
1877
  /* 4-A — A LATERAL SOLTA vai do topo da janela até embaixo, como a da referência: fora do `AppShell` não há barra de cima
1832
1878
  para reservar (o item 106 mediu: solta, a lateral ficava 56 mais baixa e mais curta, e o app tinha de zerar o
@@ -2239,6 +2285,25 @@ img,svg { display:block; }
2239
2285
  /* `aria-disabled` e NÃO `:disabled` — a razão está escrita ao lado de `.btn:disabled`, medida em
2240
2286
  13/08/2026: `:disabled` tira da ordem de foco e quem usa teclado nunca acha a linha. */
2241
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; }
2242
2307
  /* O PAINEL DÁ QUASE NADA, A LINHA DÁ O RESTO. Medido em 18/08/2026, depois de o Victor circular a
2243
2308
  folga no print: com o `--card-pad` de 20px o realce da linha começava a 21px da borda e o texto
2244
2309
  a 65px, e a linha ocupava só 88% da largura — realce flutuando no meio de uma caixa grande em
@@ -2578,6 +2643,14 @@ img,svg { display:block; }
2578
2643
  /* Vertical sai da pílula: --radius-control (999px) clampa em 50% da menor
2579
2644
  dimensão e vira um oval num container alto. */
2580
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)); }
2581
2654
  .toolbar-group { display:flex; align-items:center; gap:var(--space-1); }
2582
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; }
2583
2656
  /* SEPARADOR — a linha de divisão do sistema, num lugar só.
@@ -2910,6 +2983,24 @@ img,svg { display:block; }
2910
2983
  .radio-group > .field-error { margin-block-start:var(--space-2); }
2911
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. */
2912
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; } }
2913
3004
  .checkbox > span > .muted { font-size:var(--text-xs); font-weight:var(--weight-regular); line-height:var(--space-4); }
2914
3005
  .checkbox input,.radio input { position:absolute; opacity:0; pointer-events:none; }
2915
3006
  /* A MARCA DE SELEÇÃO acompanha a densidade, e antes não acompanhava. Era `18px` cru: em
@@ -2942,6 +3033,22 @@ img,svg { display:block; }
2942
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. */
2943
3034
  .radio input:checked + .control-mark:after { content:""; inline-size:100%; block-size:100%; border-radius:50%;
2944
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); }
2945
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; }
2946
3053
  /* O TRILHO DO SWITCH (0.32.0): o da referência, 40 × 20 (sm 32 × 16, lg 48 × 24) — a largura é o
2947
3054
  dobro da altura. Era 42 × 24. A altura é a de controle MENOS 16: dá exatamente os três dela
@@ -3092,11 +3199,44 @@ img,svg { display:block; }
3092
3199
  .segmented a { display:inline-flex; align-items:center; justify-content:center; gap:var(--space-1); text-decoration:none; }
3093
3200
  /* `size="sm"`: a da referência (abas de 24 numa cápsula de 32, letra 14) — a altura do controle `xs` da densidade. */
3094
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; }
3095
3219
  /* Toggle (Lote 1): pressionado usa o MESMO par de tokens do segmento aceso, logo acima. Um
3096
3220
  toggle solto e um segmento selecionado dizem a mesma coisa — se parecessem diferentes, o
3097
3221
  sistema teria dois idiomas para "isto está ligado". O estado vem do motor (`data-pressed`),
3098
3222
  não de uma classe que alguém precisa lembrar de pôr. */
3099
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); }
3100
3240
  /* ── SELECIONADO: uma linguagem só ────────────────────────────────────────────────────
3101
3241
  Item de nav ativo, aba ativa, item de lista lateral e botão alternado ligado mostram o
3102
3242
  MESMO sinal: cápsula elevada + rótulo na cor da marca + fio amarelo encostado na borda de
@@ -3350,6 +3490,12 @@ img,svg { display:block; }
3350
3490
  não. Quem cobra é o `link-sem-sublinhado.spec.ts`. */
3351
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); }
3352
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; } }
3353
3499
  .card-selected { border-color:transparent; background:color-mix(in oklab,var(--primary) 12%,var(--card)); }
3354
3500
  .card-danger { border-color:transparent; background:var(--danger-bg); }
3355
3501
  /* MT-01 (10/10/2026, ADR-0063): o cartão `contrast` traz `data-theme="dark"` no próprio elemento —
@@ -3368,6 +3514,14 @@ img,svg { display:block; }
3368
3514
  .card-accent-brand { --card-accent:var(--primary); } .card-accent-success { --card-accent:var(--success); }
3369
3515
  .card-accent-info { --card-accent:var(--info); } .card-accent-warning { --card-accent:var(--warning); }
3370
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; }
3371
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
3372
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
3373
3527
  partes do cartão eles separavam o título da descrição do `Card.Header` em 16 — na referência, colados. */
@@ -3401,6 +3555,16 @@ img,svg { display:block; }
3401
3555
  /* A cor do glifo é a da variante, senão o ícone vira enfeite cinza e não repete o sinal.
3402
3556
  Só o ícone DIRETO do alerta: um ícone dentro do corpo (num botão, num link) é do corpo. */
3403
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); }
3404
3568
  .banner strong { font-size:var(--text-sm); } .banner p { margin:0; color:var(--muted-foreground); font-size:var(--text-sm); }
3405
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
3406
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
@@ -3525,6 +3689,45 @@ img,svg { display:block; }
3525
3689
  Cor semântica, não a primária — reprovar não é progredir. */
3526
3690
  .step-error { color:var(--danger-400); } .step-error .step-dot { color:var(--danger-400); border-color:transparent; background:var(--danger-bg); }
3527
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; }
3528
3731
  /* Etapa clicável (fluxo não-linear): o alvo é um botão de verdade, com o foco do sistema.
3529
3732
  E ele PRECISA GERAR CAIXA. `display:contents` era o que estava aqui, e um <button> sem caixa
3530
3733
  não recebe foco — o Chromium recusa `.focus()`, e a etapa clicável só funcionava com o mouse.
@@ -3584,6 +3787,36 @@ img,svg { display:block; }
3584
3787
  .table tbody tr:last-child > :last-child,.table-wrap tbody tr:last-child > :last-child { border-end-end-radius:var(--table-cell-r); }
3585
3788
  .table tr:last-child td,.table-wrap tr:last-child td { border-bottom:0; }
3586
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
+ }
3587
3820
  /* GAR-12 e GAR-13 (08/10/2026): a tabela de COMPARAÇÃO — as chaves da `Table` e a pele do HTML de
3588
3821
  comparação. A referência principal só tem o cabeçalho preso, à mão, numa caixa de altura fixa; o
3589
3822
  resto veio do mercado, por escolha do Victor (o detalhe está no comentário da `Table`).
@@ -3787,6 +4020,32 @@ button.tag-main { cursor:pointer; }
3787
4020
  .kpi-tone-success { color:var(--success-400); }
3788
4021
  .kpi-tone-danger { color:var(--danger-400); }
3789
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); }
3790
4049
  /* DataList: chave/valor em duas colunas. O termo é secundário — mesmo idioma do cabeçalho de
3791
4050
  tabela. Sem a regra (achado A13) o <dl> saía cru: dt e dd empilhados, com o recuo de 40px
3792
4051
  que o navegador dá ao <dd>. */
@@ -3801,8 +4060,10 @@ button.tag-main { cursor:pointer; }
3801
4060
  179px para 90px em vez de zerar. `minmax(0,max-content)` é o que encolhe: com espaço mede
3802
4061
  igual ao que media antes (nenhuma baseline mudou), sem espaço o termo quebra. */
3803
4062
  .data-list { display:grid; grid-template-columns:minmax(0,max-content) minmax(0,1fr); gap:var(--space-2) var(--space-6); margin:0; }
3804
- .data-list dt { min-width:0; color:var(--muted-foreground); }
3805
- .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; }
3806
4067
  /* E no ESTREITO ele empilha — a outra metade da correção. Medido a 320px com termos de frase
3807
4068
  inteira: duas colunas não cabem, o termo resolvia em 164px, a calha comia o resto e a coluna do
3808
4069
  valor ficava com `0px`, jogando o texto para fora da PÁGINA. Mesmo remédio que `.message` e
@@ -3856,7 +4117,45 @@ button.tag-main { cursor:pointer; }
3856
4117
  .accordion-item[open] > summary .accordion-chevron { transform:rotate(-180deg); }
3857
4118
  .accordion-content { padding-block:0 var(--space-4); padding-inline:var(--space-4); color:var(--muted-foreground); font-size:var(--text-sm); }
3858
4119
  .accordion-surface { border-radius:var(--radius-card); background:var(--card); }
4120
+ /* O SITE B (30/10/2026, protótipo): o "+" numa bolinha (`indicator="plus"`), que gira 45 e vira o "×" no amarelo da
4121
+ marca quando abre; e a linha de 60 com a letra do texto (`size="lg"`) — as perguntas do desenho aprovado. */
4122
+ .accordion-plus { --accordion-mais:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M224,128a8,8,0,0,1-8,8H136v80a8,8,0,0,1-16,0V136H40a8,8,0,0,1,0-16h80V40a8,8,0,0,1,16,0v80h80A8,8,0,0,1,224,128Z'/%3E%3C/svg%3E"); }
4123
+ .accordion-plus .accordion-chevron { display:grid; place-items:center; flex:none; inline-size:var(--space-8); block-size:var(--space-8); border-radius:var(--radius-full);
4124
+ background:var(--fill-2); color:var(--foreground); -webkit-mask:none; mask:none; transition:transform var(--duration-base) var(--ease-standard), background-color var(--duration-base); }
4125
+ .accordion-plus .accordion-chevron::before { content:""; inline-size:var(--icon-sm); block-size:var(--icon-sm); background:currentColor;
4126
+ -webkit-mask:var(--accordion-mais) center/contain no-repeat; mask:var(--accordion-mais) center/contain no-repeat; }
4127
+ .accordion-plus .accordion-item[open] > summary .accordion-chevron { transform:rotate(45deg); background:var(--primary); color:var(--primary-foreground); }
4128
+ .accordion-lg .accordion-item > summary { min-block-size:calc(var(--space-12) + var(--space-3)); gap:calc(var(--space-3) + var(--space-05)); padding-block:0;
4129
+ padding-inline:calc(var(--space-5) + var(--space-05)) var(--space-4); font-size:var(--text-base); font-weight:var(--weight-semibold); line-height:normal; }
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); }
4131
+ .accordion-lg .accordion-content > p { margin:0; }
3859
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; } }
3860
4159
  .accordion-surface > .accordion-item:not([open]) > summary:hover:not([aria-disabled="true"]) { background:var(--secondary); }
3861
4160
  @media (prefers-reduced-motion:reduce) { .accordion-chevron { transition:none; } }
3862
4161
  /* Mockup do kit de origem (apps/docs) — não é o Accordion do sistema, que é <details> nativo. */
@@ -3939,6 +4238,27 @@ button.tag-main { cursor:pointer; }
3939
4238
  .demo-code { display:flex; padding:0; overflow:hidden; }
3940
4239
  .demo-code .code-block-wrap { flex:1; }
3941
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); }
3942
4262
  .copy-code { position:absolute; top:var(--space-3); inset-inline-end:var(--space-3); z-index:1; }
3943
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
3944
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
@@ -3947,6 +4267,20 @@ button.tag-main { cursor:pointer; }
3947
4267
  .code-block-wrap > .code-block { padding-inline-end:calc(var(--space-3) + var(--control-h-md) + var(--space-2)); }
3948
4268
  .copy-code .c-done { display:none; }
3949
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; }
3950
4284
  /* "On this page": índice da própria página, fixo na lateral. Navegação, não decoração —
3951
4285
  por isso é <nav> com rótulo, e o item atual se marca com aria-current. */
3952
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; }
@@ -3965,6 +4299,16 @@ button.tag-main { cursor:pointer; }
3965
4299
  .toc a { position:relative; }
3966
4300
  .toc a[aria-current]::before { content:""; position:absolute; inset-block:0; inset-inline-start:calc(-1 * var(--space-05)); inline-size:var(--space-05); background:var(--primary); }
3967
4301
  .toc a.toc-sub { padding-inline-start:var(--space-6); }
4302
+ /* O SITE B (30/10/2026, protótipo): o ANEL DE LEITURA (`progress`) no lugar do ícone do nome, com o número na ponta; e o
4303
+ item atual na CÁPSULA LEVANTADA (`indicator="segment"`), o mesmo desenho do `segment` da `Sidebar` (ADR-0082). */
4304
+ .toc-label-progress { color:var(--foreground); font-weight:var(--weight-semibold); }
4305
+ .toc-progress { display:inline-flex; flex:none; }
4306
+ .toc-progress .progress-circle-track { stroke:var(--fill-3); }
4307
+ .toc-progress-value { margin-inline-start:auto; font-family:var(--font-code); font-size:var(--text-xs); font-weight:var(--weight-medium); color:var(--muted-foreground); }
4308
+ .toc-segment a { display:flex; align-items:center; min-block-size:var(--space-10); padding-inline:var(--space-3); border-radius:var(--radius-control); }
4309
+ .toc-segment a:hover { background:var(--fill-1); }
4310
+ .toc-segment a[aria-current] { background:var(--segment); box-shadow:var(--shadow-sm); font-weight:var(--weight-semibold); }
4311
+ .toc-segment a[aria-current]::before { content:none; }
3968
4312
  /* `--log-h` é a QUINTA válvula de altura do core, no idioma de `--chart-h` (I4), `--qr-size` (B6),
3969
4313
  `--datagrid-max-h` (F6) e `--media-h` (I7). Default 240px — o de antes —, então nada muda para
3970
4314
  quem não passa nada. A causa é medida em 11/08/2026: a altura era FIXA, e por isso três prévias
@@ -4405,6 +4749,15 @@ button.tag-main { cursor:pointer; }
4405
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); }
4406
4750
  .dialog-backdrop[data-starting-style],.dialog-backdrop[data-ending-style] { opacity:0; }
4407
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); }
4408
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); }
4409
4762
  .dialog[data-starting-style] { opacity:0; scale:1.05; }
4410
4763
  .dialog[data-ending-style] { opacity:0; scale:.95; transition-duration:var(--duration-fast); }
@@ -4614,6 +4967,49 @@ button.tag-main { cursor:pointer; }
4614
4967
  .command-shortcuts > span { display:inline-flex; align-items:center; gap:var(--space-1); }
4615
4968
  .command-item { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:var(--space-3); align-items:center; }
4616
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:var(--space-16); 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; } }
4617
5013
 
4618
5014
  .menu-sep { height:1px; margin:6px 4px; background:var(--border); border:0; }
4619
5015
  /* G-API-02 — a anatomia que o menu ganhou quando o dado deixou de ter uma forma só.
@@ -4787,7 +5183,14 @@ button.tag-main { cursor:pointer; }
4787
5183
  .combobox-multi:has([aria-invalid="true"]),
4788
5184
  .combobox-multi:has(:user-invalid),
4789
5185
  .dropzone:has([aria-invalid="true"]),
4790
- .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. */
4791
5194
  /* ↑ Sem linha (16/10/2026, o Victor: "quero tudo sem borda sem exceções"): o inválido era a borda vermelha; sem
4792
5195
  borda, ele é o FUNDO de perigo (`--danger-bg`), o mesmo dos avisos. A frase de erro do `Field` continua embaixo.
4793
5196
  `--focus-strong` (ADR-0059, 08/10/2026): o anel de foco agora COLA na borda e a pinta — com o
@@ -4860,6 +5263,9 @@ button.notification-item:hover { background:var(--surface-3); }
4860
5263
  REFERENCES.md; a pele é Aurea. O título vinha com o h3 do NAVEGADOR (16,38px). */
4861
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; }
4862
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); }
4863
5269
  .empty-state p { max-width:46ch; margin:0; }
4864
5270
  .empty-title { margin:0; color:var(--foreground); font-size:var(--text-base); font-weight:var(--weight-semibold); line-height:var(--leading-tight); }
4865
5271
 
@@ -5363,6 +5769,11 @@ button.graph-node-body { cursor:pointer; }
5363
5769
  /* Sem linha (ADR-0072, 16/10/2026): a rodinha do `Spinner` e o visto do `Checkbox` deixaram de ser linha (que o alto
5364
5770
  contraste pinta) e viraram desenho por máscara — fundo, que a troca apaga. Saem da troca, na cor do texto. */
5365
5771
  .spinner,.checkbox input:checked + .control-mark::after { forced-color-adjust:none; background:CanvasText; }
5772
+ /* O "+" das perguntas (`Accordion indicator="plus"`, o site B — 31/10/2026): o glifo é o `::before` por máscara, e a
5773
+ bolinha em volta é fundo. A bolinha sai (aberta ou fechada: o amarelo da aberta, fora da troca, ficaria sob o glifo na
5774
+ cor do texto), e o glifo pinta na cor do texto. */
5775
+ .accordion-plus .accordion-chevron, .accordion-plus .accordion-item[open] > summary .accordion-chevron { background:transparent; }
5776
+ .accordion-plus .accordion-chevron::before { forced-color-adjust:none; background:CanvasText; }
5366
5777
  }
5367
5778
 
5368
5779
 
@@ -5628,7 +6039,7 @@ button.graph-node-body { cursor:pointer; }
5628
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
5629
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. */
5630
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"] *),
5631
- [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"] *) {
5632
6043
  outline-color:var(--primary); }
5633
6044
 
5634
6045
  /* "AUMENTAR CONTRASTE" do sistema (`prefers-contrast: more`: o "Aumentar contraste" do macOS, do iOS e do Android, o
@@ -5642,7 +6053,7 @@ button.graph-node-body { cursor:pointer; }
5642
6053
  :root:where(:not([data-brand="ember"])),[data-theme]:where(:not([data-brand="ember"],[data-brand="ember"] *)) {
5643
6054
  --control-thumb:var(--brand-yellow-ink); --control-selected-foreground:var(--brand-yellow-ink); --control-selected-dot:var(--brand-yellow-ink); }
5644
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"] *),
5645
- [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"] *) {
5646
6057
  outline-color:var(--focus-strong); }
5647
6058
  }
5648
6059
 
@@ -5697,6 +6108,10 @@ button.graph-node-body { cursor:pointer; }
5697
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; }
5698
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); }
5699
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); }
5700
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 {
5701
6116
  --btn-bg:var(--seg-bg); --btn-fg:var(--seg-fg); background:var(--seg-bg); color:var(--seg-fg); box-shadow:var(--seg-shadow); }
5702
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
@@ -263,17 +276,54 @@
263
276
  }, {rootMargin: "0px 0px -75% 0px"});
264
277
  for (var k = 0; k < targets.length; k++) observer.observe(targets[k]);
265
278
  }
279
+ // O ANEL DE LEITURA (`TableOfContents progress`, o site B — 30/10/2026, protótipo): quanto da página já rolou, no anel
280
+ // e no número da linha do nome. Na página estática quem escreve é este caminho; no React, o próprio componente.
281
+ function tocProgress(toc) {
282
+ var anel = toc.querySelector(".toc-progress .progress-circle");
283
+ var fio = toc.querySelector(".toc-progress .progress-circle-fill");
284
+ var numero = toc.querySelector(".toc-progress-value");
285
+ if (!anel || !numero) return;
286
+ function ler() {
287
+ var alto = document.documentElement.scrollHeight - window.innerHeight;
288
+ var v = alto > 0 ? Math.round(Math.min(1, Math.max(0, window.scrollY / alto)) * 100) : 100;
289
+ numero.textContent = v + "%";
290
+ anel.setAttribute("aria-valuenow", String(v));
291
+ if (fio) fio.setAttribute("stroke-dashoffset", String(100 - v));
292
+ }
293
+ ler();
294
+ window.addEventListener("scroll", ler, {passive: true});
295
+ window.addEventListener("resize", ler);
296
+ }
266
297
  function initTocs() {
267
298
  // `[data-toc-spy="react"]` fica de fora: o componente React observa por conta própria desde
268
299
  // 21/08/2026, e dois observadores escrevendo o mesmo `aria-current` com faixas diferentes é
269
300
  // pior que nenhum. Numa página estática — o catálogo, os docs — a marca não aparece e este
270
301
  // caminho segue sendo o único.
271
302
  var tocs = document.querySelectorAll('.toc:not([data-toc-spy="react"])');
272
- for (var t = 0; t < tocs.length; t++) tocSpy(tocs[t]);
303
+ for (var t = 0; t < tocs.length; t++) { tocSpy(tocs[t]); tocProgress(tocs[t]); }
273
304
  }
274
305
  if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", initTocs);
275
306
  else initTocs();
276
307
 
308
+ // O GRUPO QUE DOBRA da lateral (4-D), na página sem React (o site B — 30/10/2026, protótipo): o botão abre e fecha a
309
+ // lista dele e vira a seta. No React quem faz é o próprio componente; se os dois rodam, chegam ao mesmo estado, porque
310
+ // os dois partem do mesmo "aberto".
311
+ document.addEventListener("click", function (e) {
312
+ var botao = e.target.closest ? e.target.closest(".sidebar-group-toggle[aria-controls]") : null;
313
+ if (!botao) return;
314
+ var lista = document.getElementById(botao.getAttribute("aria-controls"));
315
+ if (!lista) return;
316
+ var abrir = botao.getAttribute("aria-expanded") !== "true";
317
+ botao.setAttribute("aria-expanded", abrir ? "true" : "false");
318
+ lista.hidden = !abrir;
319
+ var seta = botao.querySelector(".sidebar-group-caret use");
320
+ if (!seta) return;
321
+ var rtl = getComputedStyle(botao).direction === "rtl";
322
+ var nome = abrir ? "caret-down" : rtl ? "caret-left" : "caret-right";
323
+ var href = seta.getAttribute("href") || "";
324
+ seta.setAttribute("href", href.replace(/#i-caret-[a-z]+$/, "#i-" + nome));
325
+ });
326
+
277
327
  // ── Gaveta de navegação do AppShell: o foco ────────────────────────────────────────────
278
328
  // O popover nativo NÃO entrega a mesma gestão de foco nos dois motores, e isto foi MEDIDO no
279
329
  // item K1 (09/08/2026), abrindo a gaveta e dando oito Tabs:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aurea-uds/core",
3
- "version": "0.51.0",
3
+ "version": "0.54.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",