@aurea-uds/core 0.33.0 → 0.35.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.
Files changed (2) hide show
  1. package/dist/aurea.css +340 -171
  2. package/package.json +1 -1
package/dist/aurea.css CHANGED
@@ -72,6 +72,11 @@
72
72
  --z-toast:100;
73
73
  --sidebar-width:16.5rem;
74
74
  --sidebar-rail:4.25rem;
75
+ --docs-width:87.5rem;
76
+ --docs-sidebar-width:13.75rem;
77
+ --docs-aside-width:16.75rem;
78
+ --docs-toc-width:15rem;
79
+ --docs-text-width:56.25rem;
75
80
  --topbar-height:4rem;
76
81
  --content-max:102.5rem;
77
82
  --breakpoint-2xs:360px;
@@ -505,11 +510,11 @@ button,a,[role="button"],input,textarea,select { outline:none; }
505
510
  o vão: colado, o anel amarelo sumiria no botão amarelo.
506
511
  Quem cobra que nenhuma peça ficou de fora é o catálogo inteiro, no navegador:
507
512
  `tests/visual/foco-uma-linha.spec.ts`. */
508
- :is(.input,.textarea,.select,.btn-outline,.btn-primary-outline,.btn-danger-outline,.media-control,.card,.code-block,.graph-node-body,.pagination-link):focus-visible { outline-offset:0; border-color:var(--focus-strong); }
513
+ :is(.input,.textarea,.select,.btn-outline,.btn-primary-outline,.btn-danger-outline,.media-control,.card,.code-block,.graph-node-body,.pagination-link):focus-visible { outline-offset:0; border-color:transparent; }
509
514
  /* A amostra ESCOLHIDA do `ColorSwatch options` (0.32.0) tem borda — a da cor dela — e o foco mora no botão de
510
515
  opção invisível de dentro, por isso o `:has`. A referência mostra a borda da cor + vão + anel; a ADR-0059 é a
511
516
  escolha A do Victor, nenhuma peça com duas linhas (a varredura do catálogo pegou, 14/10/2026). */
512
- .color-swatch-option:has(:checked:focus-visible) { outline-offset:0; border-color:var(--focus-strong); }
517
+ .color-swatch-option:has(:checked:focus-visible) { outline-offset:0; border-color:transparent; }
513
518
  button { color:inherit; }
514
519
  /* O link NÃO é `--primary`. Medido em 22/08/2026 com o axe e depois à mão: o amarelo da
515
520
  marca sobre o fundo do tema CLARO dá 1,73:1, e o AA de texto (WCAG 1.4.3) pede 4,5:1 —
@@ -595,7 +600,13 @@ img,svg { display:block; }
595
600
  .container-sm { max-inline-size:var(--breakpoint-sm); } .container-md { max-inline-size:var(--breakpoint-md); }
596
601
  .container-lg { max-inline-size:var(--breakpoint-lg); } .container-2xl { max-inline-size:var(--breakpoint-2xl); }
597
602
  .container-full { max-inline-size:none; }
603
+ /* `docs` (lote T, 17/10/2026): o bloco da documentação, `--docs-width` (1400) — o da referência; a escala de pontos não
604
+ tem esse número. */
605
+ .container-docs { max-inline-size:var(--docs-width); }
598
606
  @media (min-width:768px) { .container { padding-inline:var(--space-8); } }
607
+ /* E o recheio dela é o da barra da referência: 16 no celular (o de todo `Container`) e 24 de 768 para cima, e não 32 — a
608
+ 768, com 32, a busca e as ações não cabiam na linha da marca e desciam (a bancada do lote T pegou). */
609
+ @media (min-width:768px) { .container-docs { padding-inline:var(--space-6); } }
599
610
  /* GAR-04 e GAR-05 (06/10/2026): `Section` — a faixa de ponta a ponta de uma página de site, com
600
611
  fundo próprio e respiro vertical de site. Nenhuma referência aberta tem a peça (as seções de uma
601
612
  delas são pagas, não lidas), então o respiro é escolha da Aurea, com tokens que já existem: `--space-16`
@@ -618,7 +629,7 @@ img,svg { display:block; }
618
629
  .section-footer-links { display:grid; gap:var(--space-2); margin:0; padding:0; list-style:none; }
619
630
  .section-footer-link { color:var(--muted-foreground); font-size:var(--text-sm); text-decoration:none; }
620
631
  .section-footer-link:hover { color:var(--foreground); }
621
- .section-footer-legal { display:flex; flex-wrap:wrap; justify-content:space-between; gap:var(--space-2) var(--space-6); margin-block-start:var(--space-8); padding-block-start:var(--space-6); border-block-start:var(--border-width) solid var(--border); color:var(--muted-foreground); font-size:var(--text-sm); }
632
+ .section-footer-legal { display:flex; flex-wrap:wrap; justify-content:space-between; gap:var(--space-2) var(--space-6); margin-block-start:var(--space-8); padding-block-start:var(--space-6); border-block-start:var(--border-width) solid transparent; color:var(--muted-foreground); font-size:var(--text-sm); }
622
633
  /* layout="inline" (15/10/2026): o rodapé da página inicial da referência — UMA linha centrada, 12 de respiro em cima e
623
634
  embaixo, 8 entre as partes, letra 14 apagada; os links acendem com o ponteiro. Quebra linha se não couber. */
624
635
  .section.section-footer-inline { padding-block:var(--space-3); }
@@ -664,14 +675,14 @@ img,svg { display:block; }
664
675
  de site. Só floating e flush entram no grid do AppShell; a pill é peça avulsa (numa
665
676
  pílula não cabem busca + densidade + tema + comando). */
666
677
  .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); }
667
- .topbar-floating { top:var(--space-4); margin:var(--space-4) var(--space-4) 0; padding:var(--space-2) var(--space-4); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); }
678
+ .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); }
668
679
  /* flush: encostada nas bordas. SEM fio embaixo (pedido do Victor — a referência não tem)
669
680
  e sem superfície própria: ela se funde ao fundo e cola no conteúdo, que começa logo
670
681
  abaixo. É o topo do nosso catálogo. */
671
682
  .topbar-flush { top:0; padding:var(--space-2) var(--space-5); background:var(--background); }
672
683
  /* divider (B-07): a linha que separa a barra grudada do conteúdo que passa por baixo. */
673
- .topbar-divider { border-block-end:var(--border-width) solid var(--border); }
674
- .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 var(--border); border-radius:var(--radius-control); background:var(--card); color:var(--card-foreground); }
684
+ .topbar-divider { border-block-end:var(--border-width) solid transparent; }
685
+ .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); }
675
686
  /* .brand nasceu como cabeçalho VERTICAL da lateral (borda embaixo + respiro); no topo
676
687
  ele deita, então some com a borda e a margem — o lockup em si continua o mesmo. */
677
688
  .topbar .brand { min-height:auto; margin:0; padding:0; border:0; }
@@ -709,6 +720,40 @@ img,svg { display:block; }
709
720
  64, o nosso padrão), com 6 entre as ações (o gap-1.5 dela). O painel do celular segue a altura, pela mesma variável. */
710
721
  .topbar-sm { --topbar-height:calc(var(--space-12) + var(--space-2)); }
711
722
  .topbar-sm .topbar-actions { gap:calc(var(--space-1) + var(--space-05)); }
723
+ /* A SEGUNDA LINHA DO CABEÇALHO (`Header tabs`, lote T, 17/10/2026 — os pedidos SITE-04 e SITE-05 do Victor): as áreas do
724
+ site, cada uma com o ícone, como a linha das áreas da documentação da referência (medida no código dela): 40 de altura,
725
+ 4 abaixo da linha de cima, as áreas a 12 uma da outra, letra 14 em peso médio, o ícone a 8 do nome, com a altura da
726
+ letra. A área atual tem a cor do texto e o traço de 2 embaixo, na cor de destaque, encostado na linha de baixo. A linha
727
+ fica por último na ordem do Tab: as áreas vêm depois das ações. */
728
+ .topbar-with-tabs, .topbar-with-tabs > .topbar-inner { flex-wrap:wrap; row-gap:var(--space-1); }
729
+ .topbar-with-tabs { padding-block:0; border-block-end-width:0; }
730
+ /* Com as áreas, a barra tem 100 cravados e a linha de baixo fica PENDURADA logo abaixo dela, sobre o começo da página,
731
+ como a da referência (a dela é um `::after` com `bottom:-1px`): a borda invisível de 1 do sem linha somava 1 à barra
732
+ e empurrava tudo o que vem embaixo (medido: a lateral a 117 e não 116). */
733
+ .topbar-with-tabs.topbar-divider::after { inset-block-end:calc(-1 * var(--border-width)); }
734
+ /* A linha de cima tem a altura da barra (56 na `sm`, como a da referência): é a marca que a segura — sem isso a linha
735
+ ficava da altura da busca (36) e a barra inteira com 89, e não 100. */
736
+ .topbar-with-tabs .brand { min-block-size:var(--topbar-height); }
737
+ /* As áreas ficam EMBAIXO da linha (como lá: a área tem 30 — a letra, 8 e o traço de 2 — numa linha de 40) e numa linha só,
738
+ que ROLA DE LADO quando não cabe (medido na página da referência a 375: ela não quebra nem some; a página não rola).
739
+ No celular, 4 entre as áreas; de 768 para cima, 12. Como a linha recorta o que passa dela, o anel do foco fica POR
740
+ DENTRO da área, como o do item de menu — por fora, ele seria cortado embaixo. */
741
+ .topbar-tabs { flex-basis:100%; display:flex; align-items:flex-end; gap:var(--space-1); min-block-size:var(--space-10);
742
+ overflow-x:auto; overflow-y:hidden; }
743
+ @media (min-width:768px) { .topbar-tabs { gap:var(--space-3); } }
744
+ .topbar-tab { position:relative; flex-shrink:0; display:inline-flex; align-items:center; gap:var(--space-2);
745
+ padding:0 var(--space-1) calc(var(--space-2) + var(--focus-width)); color:var(--muted-foreground); font-size:var(--text-sm);
746
+ font-weight:var(--weight-medium); white-space:nowrap; text-decoration:none; }
747
+ .topbar-tab:focus-visible { outline-offset:calc(-1 * var(--focus-width)); }
748
+ .topbar-tab:hover, .topbar-tab[aria-current] { color:var(--foreground); }
749
+ .topbar-tab[aria-current]::after { content:""; position:absolute; z-index:1; inset-inline:0; inset-block-end:0; block-size:var(--focus-width);
750
+ background:var(--primary); }
751
+ .topbar-tab-icon { display:inline-flex; font-size:var(--text-sm); }
752
+ .topbar-tab-icon > .icon { inline-size:1em; block-size:1em; }
753
+ /* A LINHA DE BAIXO (`divider`) volta como LINHA (lote T, SITE-05, o Victor: "a linha que vai de uma ponta a outra"): a
754
+ segunda exceção ao sem linha (ADR-0072), desenhada, de uma ponta à outra da barra, na cor da linha. */
755
+ .topbar-divider::after { content:""; position:absolute; inset-inline:0; inset-block-end:0; block-size:var(--border-width);
756
+ background:var(--border); pointer-events:none; }
712
757
  /* blurred (15/10/2026), só na `flush`: o fundo transparente que embaça o que passa por baixo — o desfoque de 16 da
713
758
  referência. Quem pede menos transparência ao sistema, e o navegador sem desfoque, ficam com o fundo cheio. */
714
759
  .topbar-flush.topbar-blurred { background:transparent; -webkit-backdrop-filter:blur(var(--space-4)); backdrop-filter:blur(var(--space-4)); }
@@ -716,7 +761,7 @@ img,svg { display:block; }
716
761
  @media (prefers-reduced-transparency:reduce) { .topbar-flush.topbar-blurred { background:var(--background); -webkit-backdrop-filter:none; backdrop-filter:none; } }
717
762
  /* menuActions (15/10/2026): o que só o menu do celular leva (o GitHub, na referência), embaixo dos links, depois de uma
718
763
  linha. */
719
- .topbar-menu-actions { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2); margin-block-start:var(--space-4); padding-block-start:var(--space-4); border-block-start:var(--border-width) solid var(--border); }
764
+ .topbar-menu-actions { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2); margin-block-start:var(--space-4); padding-block-start:var(--space-4); border-block-start:var(--border-width) solid transparent; }
720
765
  /* O botão e o painel só existem no celular, e só onde há popover. O @supports lá embaixo é a rede,
721
766
  como na gaveta do `AppShell`: navegador sem popover não esconde o `<nav popover>` sozinho, e o
722
767
  painel apareceria solto na barra. Ali os links ficam na barra, que já quebra linha por conteúdo, e
@@ -731,7 +776,7 @@ img,svg { display:block; }
731
776
  e toma a largura dela — na `floating`, a da caixa. O `- border-width` põe o fio de cima do painel
732
777
  EM CIMA do fio da barra (o `divider`, a borda da `floating`), e não um fio duplo. A altura tem teto
733
778
  e rola por dentro; a folga de --space-8 cobre a margem de cima da `floating`. */
734
- .topbar-menu-panel:popover-open { position:fixed; inset:auto; inset-block-start:var(--topbar-height); inset-inline:0; inline-size:auto; block-size:auto; max-block-size:calc(100dvh - var(--topbar-height) - var(--space-8)); overflow:auto; margin:0; padding:var(--space-4); border:0; border-block:var(--border-width) solid var(--border); background:var(--background); color:var(--foreground); }
779
+ .topbar-menu-panel:popover-open { position:fixed; inset:auto; inset-block-start:var(--topbar-height); inset-inline:0; inline-size:auto; block-size:auto; max-block-size:calc(100dvh - var(--topbar-height) - var(--space-8)); overflow:auto; margin:0; padding:var(--space-4); border:0; border-block:var(--border-width) solid transparent; background:var(--background); color:var(--foreground); }
735
780
  .topbar-menu-panel .topbar-links { flex-direction:column; align-items:stretch; gap:var(--space-2); }
736
781
  /* `anchor-scope` prende o nome da âncora a cada cabeçalho: com dois na página (cada um com o seu
737
782
  `menuId`), o painel de um não cola no outro. Onde não houver `anchor-scope`, vale o último. */
@@ -768,7 +813,7 @@ img,svg { display:block; }
768
813
  de pixel foram regravadas para aceitar. Ver ADR-0034.
769
814
  Esta regra é a de `b0599be`, íntegra: estado conhecido bom, provado pelo portão de pixel em vez
770
815
  de reafinado à mão. */
771
- .sidebar { --shell-top:calc(var(--topbar-height) + var(--space-4)*2); position:sticky; top:var(--shell-top); align-self:start; height:calc(100vh - var(--shell-top) - var(--space-4)); max-height:calc(100% - var(--space-4)*2); margin:var(--space-4); display:flex; flex-direction:column; gap:var(--space-1); padding:var(--space-1); overflow:auto; border:1px solid var(--sidebar-border); border-radius:var(--radius-card); background:var(--sidebar); color:var(--sidebar-foreground); }
816
+ .sidebar { --shell-top:calc(var(--topbar-height) + var(--space-4)*2); position:sticky; top:var(--shell-top); align-self:start; height:calc(100vh - var(--shell-top) - var(--space-4)); max-height:calc(100% - var(--space-4)*2); margin:var(--space-4); display:flex; flex-direction:column; gap:var(--space-1); padding:var(--space-1); overflow:auto; border:1px solid transparent; border-radius:var(--radius-card); background:var(--sidebar); color:var(--sidebar-foreground); }
772
817
  /* RENTE É A VARIANTE, e ela existe porque o Victor mediu quatro aplicativos que rodam na mão,
773
818
  um deles o painel da própria referência de desenho. Nenhum flutua a lateral — ela
774
819
  encosta nas bordas, ocupa a altura toda e se separa do conteúdo por UM TRAÇO, não por um vão.
@@ -778,10 +823,10 @@ img,svg { display:block; }
778
823
  que lados vem a borda —, e é por isso que a trava de pele exige que as duas MEÇAM diferente:
779
824
  variante que desenha igual é enfeite. `--shell-top` volta a ser só a altura do topo, porque sem
780
825
  margem não há as duas folgas a descontar. */
781
- .sidebar-flush { --shell-top:var(--topbar-height); height:calc(100vh - var(--shell-top)); max-height:100%; margin:0; border:0; border-inline-end:1px solid var(--sidebar-border); border-radius:0; }
826
+ .sidebar-flush { --shell-top:var(--topbar-height); height:calc(100vh - var(--shell-top)); max-height:100%; margin:0; border:0; border-inline-end:1px solid transparent; border-radius:0; }
782
827
  /* `placement="right"` (0.32.0, DOC-01): a lateral do outro lado. A flutuante já tem margem nos quatro
783
828
  lados; a encostada leva o fio para o lado de dentro, que agora é o começo da linha. */
784
- .sidebar-flush.sidebar-right { border-inline-end:0; border-inline-start:1px solid var(--sidebar-border); }
829
+ .sidebar-flush.sidebar-right { border-inline-end:0; border-inline-start:1px solid transparent; }
785
830
  /* SEM CAIXA é outra variante (0.32.0): `plain`, o nome que a Aurea já dá ao "sem caixa" (`contentVariant`,
786
831
  o painel do `Tabs`, o `KPI`). É a coluna "On this page" de uma documentação, como a da referência: os
787
832
  itens soltos na página. Tira só a PINTURA — fundo, cor da borda, sombra — e guarda a geometria da
@@ -818,10 +863,64 @@ img,svg { display:block; }
818
863
  encostado, não sobre a lateral — a rente já encosta sozinha. */
819
864
  .app-shell-flush .sidebar:not(.sidebar-flush) { --shell-top:calc(var(--topbar-height) + var(--space-05)); margin-block-start:var(--space-05); }
820
865
  .app-shell-flush .content { margin-block-start:var(--space-05); }
866
+ /* O ARRANJO DE DOCUMENTAÇÃO (`AppShell layout="docs"`, lote T, 17/10/2026 — os pedidos SITE-01 e SITE-02 do Victor): o
867
+ da documentação da referência, medido no código dela. Um bloco CENTRALIZADO de `--docs-width` (1400) em cinco trilhas —
868
+ a sobra dos dois lados, iguais, centralizam —: a lateral (`--docs-sidebar-width`, 220), o texto, o índice
869
+ (`--docs-aside-width`, 268, de 1280 para cima). Sem vão: o espaço vem do recheio de cada coluna. A lateral NÃO flutua
870
+ (sem caixa; 16 abaixo da linha, 32 acima da borda da tela, 12 no começo); o texto tem 48 dos lados de 1280 para cima e 24
871
+ abaixo, e cada bloco dele vai até `--docs-text-width` (900). Entre 1024 e 1279 o índice desce para depois do texto,
872
+ como no `AppShell` de sempre; abaixo de 1024 a lateral é a gaveta. A barra de cima tem 56 + 4 + 40 (a linha das
873
+ áreas): a lateral e o índice grudam logo abaixo dela. */
874
+ /* O bloco mora DEPOIS da regra do topo rente (`.app-shell-flush .sidebar:not(.sidebar-flush)`) e tem a MESMA força (o
875
+ `:not`): mais fraca, ou antes dela, a lateral grudava a 66 do topo, por baixo da barra (medido). A linha de baixo
876
+ fica pendurada fora da barra, como a da referência, e não entra na conta. */
877
+ .app-shell-docs { --docs-top:calc(var(--space-12) + var(--space-2) + var(--space-1) + var(--space-10)); }
878
+ .app-shell-docs > .content > * { max-inline-size:var(--docs-text-width); }
879
+ /* 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
880
+ `AppShell`, ele encostava a 16 — a bancada do lote T pegou). */
881
+ .app-shell-docs > .content.content { margin:0; padding:var(--space-4) var(--space-6); }
882
+ @media (min-width:1024px) {
883
+ .app-shell-docs { grid-template-columns:minmax(0,1fr) var(--docs-sidebar-width) minmax(0,calc(var(--docs-width) - var(--docs-sidebar-width))) minmax(0,1fr); }
884
+ /* As duas colunas COMEÇAM 16 abaixo da linha e PARAM 32 acima da borda de baixo da tela, como as da referência
885
+ medidas na página dela (17/10/2026, o Victor: "a distância do sidebar em relação aos itens de cima está muito
886
+ próxima" e "a distância no final da página"): a caixa que rola — e a barra dela — não encosta mais na linha. Dentro,
887
+ 8 em cima e 16 embaixo, e o primeiro grupo sem a margem de cima: o "Overview" fica a 24 da linha, como lá. A
888
+ referência ainda apaga a lista aos poucos nas duas pontas com um degradê; a Aurea não tem degradê, e a lista corta
889
+ reto. Dos lados, 16 nos dois (12 + 4 lá) e 8 dentro do item e do nome do grupo: a cápsula começa a 16 da borda
890
+ da coluna e o texto a 24, como lá (medido na página dela a 1280, 17/10/2026). */
891
+ .app-shell-docs > .sidebar:not(.sidebar-flush) { --shell-top:calc(var(--docs-top) + var(--space-4)); grid-column:2; grid-row:2;
892
+ block-size:calc(100vh - var(--shell-top) - var(--space-8)); max-block-size:none; margin:var(--space-4) 0 0; border-width:0;
893
+ padding-block:var(--space-2) var(--space-4); padding-inline:var(--space-4); }
894
+ .app-shell-docs > .sidebar > .sidebar-nav > .sidebar-list > li:first-child > .sidebar-group-label { margin-block-start:0; }
895
+ .app-shell-docs > .sidebar .sidebar-item { padding-inline:var(--space-2); }
896
+ .app-shell-docs > .sidebar .sidebar-group-label { margin-inline:var(--space-2); }
897
+ .app-shell-docs > .content.content { grid-column:3; grid-row:2; }
898
+ .app-shell-docs > .sidebar.app-shell-aside { grid-column:3; grid-row:3; block-size:auto; }
899
+ }
900
+ /* O índice ("On this page") SEM a barra de rolagem, como o da referência (o Victor, 17/10/2026: "ocultar a barra de
901
+ rolagem"). Nem a da coluna nem a do PRÓPRIO índice: numa tela baixa ele encolhe para caber na coluna e rola sozinho
902
+ (a barra que o Victor ainda viu, 1280 × 663, era a dele). Ele continua rolando com a roda e o toque, e o Tab leva cada
903
+ link para a vista. É a ÚNICA exceção à regra da barra visível (`engine-batch.test.tsx`): o Victor escolheu "escondida
904
+ sempre" entre esta e a da lateral, que some parada e volta com o ponteiro (17/10/2026). */
905
+ .app-shell-docs > .sidebar.app-shell-aside, .app-shell-docs > .sidebar.app-shell-aside > .toc { scrollbar-width:none; }
906
+ .app-shell-docs > .sidebar.app-shell-aside::-webkit-scrollbar,
907
+ .app-shell-docs > .sidebar.app-shell-aside > .toc::-webkit-scrollbar { display:none; }
908
+ /* Quem gruda aqui é a COLUNA; o índice dentro dela fica no lugar. Grudado também, ele somava os 16 dele aos da coluna e
909
+ o "On this page" descia para 49 da linha (medido); assim, sem o recheio de cima, ele fica a 24, como o da referência. */
910
+ /* E ele ocupa a largura da coluna (o `align-self:start` de sempre o encolhia até o nome mais largo, 168). */
911
+ .app-shell-docs > .sidebar.app-shell-aside > .toc { position:static; align-self:stretch; }
912
+ @media (min-width:1280px) {
913
+ .app-shell-docs { grid-template-columns:minmax(0,1fr) var(--docs-sidebar-width) minmax(0,calc(var(--docs-width) - var(--docs-sidebar-width) - var(--docs-aside-width))) var(--docs-aside-width) minmax(0,1fr); }
914
+ .app-shell-docs > .content.content { padding:var(--space-8) var(--space-12) var(--space-4); }
915
+ /* O índice tem 240 (`--docs-toc-width`) no começo da coluna de 268, com 16 dos dois lados, como o da referência: a
916
+ ponta direita dele fica alinhada com a da barra de cima (o Victor, 17/10/2026: "componentes não alinhados"). */
917
+ .app-shell-docs > .sidebar.app-shell-aside { grid-column:4; grid-row:2; justify-self:start; inline-size:var(--docs-toc-width);
918
+ block-size:calc(100vh - var(--shell-top) - var(--space-8)); padding-block-start:0; padding-inline:var(--space-4); }
919
+ }
821
920
  /* A margem é LÓGICA desde 03/10/2026 (AN-01): era `margin:space-4 space-4 space-4 0`, física, e na
822
921
  escrita da direita para a esquerda o conteúdo encostava na borda da página e deixava 32 de vão na
823
922
  junção com a lateral. Medido no banco da moldura; na esquerda para a direita nada muda. */
824
- .content { min-width:0; margin-block:var(--space-4); margin-inline:0 var(--space-4); padding:var(--space-6); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); }
923
+ .content { min-width:0; margin-block:var(--space-4); margin-inline:0 var(--space-4); padding:var(--space-6); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); }
825
924
  /* contentVariant="plain" (B-10): a área de conteúdo sem caixa. Os `Card` da tela passam a ser as
826
925
  únicas superfícies. A margem continua: é ela que afasta o conteúdo da lateral e da barra. */
827
926
  .content-plain { padding:0; border:0; border-radius:0; background:none; color:inherit; }
@@ -1008,7 +1107,7 @@ img,svg { display:block; }
1008
1107
  sistema faziam a pilula crescer para baixo e a barriga dela ficava atras dos botoes. A borda de
1009
1108
  baixo agora fica `--space-4` acima da area do sistema, em qualquer aparelho.
1010
1109
  A variante `edge` reverte isto mais abaixo, e la o recheio e' o certo. */
1011
- .bottom-nav { --bottomnav-ring:2rem; --bottomnav-surface:var(--card); position:sticky; bottom:0; z-index:var(--z-sticky); display:flex; gap:var(--space-1); margin:var(--space-4); margin-bottom:calc(var(--space-4) + env(safe-area-inset-bottom)); padding:var(--space-1); border:1px solid var(--border); border-radius:var(--radius-control); background:var(--card); color:var(--card-foreground); box-shadow:var(--shadow-md); }
1110
+ .bottom-nav { --bottomnav-ring:2rem; --bottomnav-surface:var(--card); position:sticky; bottom:0; z-index:var(--z-sticky); display:flex; gap:var(--space-1); margin:var(--space-4); margin-bottom:calc(var(--space-4) + env(safe-area-inset-bottom)); padding:var(--space-1); border:1px solid transparent; border-radius:var(--radius-control); background:var(--card); color:var(--card-foreground); box-shadow:var(--shadow-md); }
1012
1111
  /* `--control-h-lg` e não `--control-h-md`: alvo de toque. O md dá 36px em comfortable e
1013
1112
  o alvo confortável de dedo é maior — com o recuo, o item renderiza acima de 44px. */
1014
1113
  .bottom-nav-item { flex:1; min-width:0; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--space-05); min-height:var(--control-h-lg); padding:var(--space-1); border:0; border-radius:var(--radius-control); background:transparent; color:var(--muted-foreground); font:inherit; font-size:var(--text-xs); text-align:center; text-decoration:none; cursor:pointer; }
@@ -1161,7 +1260,7 @@ img,svg { display:block; }
1161
1260
  /* ELEVADO: a moldura é uma superfície PRÓPRIA sobre a barra — por isso `--popover` e sombra, e
1162
1261
  não uma cor de fundo. É o único indicador que usa profundidade em vez de cor para separar. */
1163
1262
  .bottom-nav-ind-circle-raised .bottom-nav-item[aria-current] .bottom-nav-mark { background:var(--popover); box-shadow:var(--shadow-md); }
1164
- .bottom-nav-ind-circle-outline .bottom-nav-item[aria-current] .bottom-nav-mark { border:1px solid var(--primary-emphasis); }
1263
+ .bottom-nav-ind-circle-outline .bottom-nav-item[aria-current] .bottom-nav-mark { border:1px solid transparent; background:color-mix(in srgb,var(--primary-emphasis) 10%,transparent); }
1165
1264
  /* CHEIO é o único que preenche com o amarelo sólido, e por isso é o único que troca o primeiro
1166
1265
  plano inteiro para `--primary-foreground` — ícone, rótulo e contador juntos dentro da forma.
1167
1266
  A auditoria recusou a antiga `pill` sólida (achado 5: "o ativo assume presença de CTA"), e a
@@ -1282,7 +1381,7 @@ img,svg { display:block; }
1282
1381
  gate (check 4b) trava os breakpoints. Mobile-first: `below` some acima do ponto. */
1283
1382
  @media (max-width:1023px) { .hide-below-lg { display:none !important; } }
1284
1383
  @media (max-width:767px) { .hide-below-md { display:none !important; } }
1285
- .brand { min-height:var(--topbar-height); display:flex; align-items:center; gap:12px; padding:2px 4px 16px; margin:0 0 16px; border:0; border-bottom:1px solid var(--sidebar-border); border-radius:0; background:transparent; box-shadow:none; }
1384
+ .brand { min-height:var(--topbar-height); display:flex; align-items:center; gap:12px; padding:2px 4px 16px; margin:0 0 16px; border:0; border-bottom:1px solid transparent; border-radius:0; background:transparent; box-shadow:none; }
1286
1385
  .brand strong { display:block; letter-spacing:var(--tracking-tight); } .brand small { display:block; color:var(--muted-foreground); font-size:11px; }
1287
1386
  /* minmax(0,1fr): a trilha `auto` do grid crescia até o nome mais longo e os itens
1288
1387
  VAZAVAM pela direita da caixa (colavam na borda de um lado e sobrava do outro). */
@@ -1293,8 +1392,8 @@ img,svg { display:block; }
1293
1392
  .doc-nav h4,.doc-nav .nav-group-label { margin:16px 8px 8px; color:color-mix(in oklab, var(--sidebar-foreground) 70%, transparent); font-size:11px; letter-spacing:var(--tracking-widest); text-transform:uppercase; }
1294
1393
  .doc-nav .nav-group { display:grid; gap:var(--space-1); }
1295
1394
  .doc-nav a { display:flex; align-items:center; gap:10px; min-height:40px; margin:0; padding:9px 12px; border:1px solid transparent; border-radius:var(--radius-lg); background:transparent; color:color-mix(in oklab, var(--sidebar-foreground) 72%, transparent); text-decoration:none; box-shadow:none; }
1296
- .doc-nav a:hover { color:var(--sidebar-accent-foreground); background:var(--sidebar-accent); border-color:var(--sidebar-border); }
1297
- .doc-nav a.active { border-color:var(--sidebar-border); }
1395
+ .doc-nav a:hover { color:var(--sidebar-accent-foreground); background:var(--sidebar-accent); border-color:transparent; }
1396
+ .doc-nav a.active { border-color:transparent; }
1298
1397
  /* o glifo da família fica na frente do rótulo e nunca encolhe o texto */
1299
1398
  .doc-nav a .icon { flex:none; opacity:.8; }
1300
1399
  .doc-nav a.active .icon { opacity:1; }
@@ -1312,7 +1411,7 @@ img,svg { display:block; }
1312
1411
  `tests/visual/tema-na-secao.spec.ts`, e o `tema-na-secao.test.tsx` reprova regra nova sem a
1313
1412
  guarda. */
1314
1413
  [data-theme="light"] .eyebrow:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { color:color-mix(in oklab, var(--primary) 45%, var(--foreground)); }
1315
- .demo { min-width:0; padding:var(--card-pad); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); box-shadow:none; }
1414
+ .demo { min-width:0; padding:var(--card-pad); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); box-shadow:none; }
1316
1415
 
1317
1416
  /* ========================================================================== */
1318
1417
  /* 04. COMPONENTES PRIMITIVOS */
@@ -1320,7 +1419,7 @@ img,svg { display:block; }
1320
1419
  /* A base do botão carrega as VARIÁVEIS DE PASSO da camada responsiva (`--step-*`), e cada
1321
1420
  fallback é exatamente o valor fixo de antes — então o botão sem valor responsivo desenha o
1322
1421
  mesmo pixel. É o que permite a camada `size-*` repor a grandeza sem tocar no componente. */
1323
- .btn { --btn-bg:transparent; --btn-fg:var(--foreground); --btn-border:transparent; display:inline-flex; align-items:center; justify-content:center; gap:var(--step-gap,8px); block-size:var(--step-h,var(--control-h-md)); border:1px solid var(--btn-border); border-radius:var(--radius-control); background:var(--btn-bg); color:var(--btn-fg); font-size:var(--step-fs,var(--text-sm)); font-weight:var(--weight-medium); line-height:var(--leading-none); text-decoration:none; white-space:nowrap; cursor:pointer; transition:transform var(--duration-fast) var(--ease-standard),background var(--duration-fast),border-color var(--duration-fast),color var(--duration-fast),opacity var(--duration-fast); }
1422
+ .btn { --btn-bg:transparent; --btn-fg:var(--foreground); --btn-border:transparent; display:inline-flex; align-items:center; justify-content:center; gap:var(--step-gap,8px); block-size:var(--step-h,var(--control-h-md)); border:1px solid transparent; border-radius:var(--radius-control); background:var(--btn-bg); color:var(--btn-fg); font-size:var(--step-fs,var(--text-sm)); font-weight:var(--weight-medium); line-height:var(--leading-none); text-decoration:none; white-space:nowrap; cursor:pointer; transition:transform var(--duration-fast) var(--ease-standard),background var(--duration-fast),border-color var(--duration-fast),color var(--duration-fast),opacity var(--duration-fast); }
1324
1423
  /* GAR-14 (0.28.0): o recheio do botão vale também para o aviso preso a ele (`.toast-anchored`),
1325
1424
  que tem a MEDIDA do botão — pedido do Victor na bancada. Uma regra só, para os dois nunca
1326
1425
  divergirem e para o número não se repetir. */
@@ -1446,7 +1545,7 @@ img,svg { display:block; }
1446
1545
  A MEDIDA de dentro do botão (20, para caber no botão pequeno) é declarada pela CLASSE que o `Button` põe no
1447
1546
  atalho (`btn-kbd`), e não pelo contexto: com o botão de busca do site em toda página, o `.kbd` de 24 e o de 20
1448
1547
  dividiam a página, e a trava de geometria (uma altura por classe) reprovou (14/10/2026). */
1449
- .btn .kbd { background:transparent; box-shadow:inset 0 0 0 var(--border-width) color-mix(in oklab, currentColor 35%, transparent); color:inherit; }
1548
+ .btn .kbd { background:transparent; box-shadow:none; color:inherit; }
1450
1549
  .btn-kbd { min-width:var(--space-5); height:var(--space-5); padding:0 var(--space-1); font-size:var(--text-xs); }
1451
1550
  .btn-kbd.kbd-single { width:var(--space-5); padding:0; }
1452
1551
  /* Uma caixinha por tecla (15/10/2026), como a busca da referência: 2 entre elas. */
@@ -1498,13 +1597,13 @@ img,svg { display:block; }
1498
1597
  .btn-tone-danger:not(.btn-link):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--destructive) 14%, transparent); }
1499
1598
  .btn-tone-success,.btn-tone-success:hover:not(:disabled) { --btn-fg:var(--success-400); }
1500
1599
  .btn-outline.btn-tone-success { --btn-border:var(--success-400); }
1501
- .btn-tone-success:not(.btn-link):not(.btn-solid):not(.btn-soft):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--success) 14%, transparent); }
1600
+ .btn-tone-success:not(.btn-link):not(.btn-solid):not(.btn-soft):not(.btn-outline):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--success) 14%, transparent); }
1502
1601
  .btn-tone-info,.btn-tone-info:hover:not(:disabled) { --btn-fg:var(--info-400); }
1503
1602
  .btn-outline.btn-tone-info { --btn-border:var(--info-400); }
1504
- .btn-tone-info:not(.btn-link):not(.btn-solid):not(.btn-soft):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--info) 14%, transparent); }
1603
+ .btn-tone-info:not(.btn-link):not(.btn-solid):not(.btn-soft):not(.btn-outline):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--info) 14%, transparent); }
1505
1604
  .btn-tone-warning,.btn-tone-warning:hover:not(:disabled) { --btn-fg:var(--warning-400); }
1506
1605
  .btn-outline.btn-tone-warning { --btn-border:var(--warning-400); }
1507
- .btn-tone-warning:not(.btn-link):not(.btn-solid):not(.btn-soft):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--warning) 14%, transparent); }
1606
+ .btn-tone-warning:not(.btn-link):not(.btn-solid):not(.btn-soft):not(.btn-outline):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--warning) 14%, transparent); }
1508
1607
  /* appearance="soft" (15/10/2026, o "danger-soft" da referência): o fundo clarinho do tom e a letra do tom (a letra é a
1509
1608
  do tom, das regras acima). Em repouso, a tinta que os botões sem caixa usam no hover (14%); no hover, 22%. O neutro
1510
1609
  é o fundo --muted com a letra normal. */
@@ -1603,7 +1702,7 @@ img,svg { display:block; }
1603
1702
  .btn-group-full,.toggle-group-full { display:flex; inline-size:100%; }
1604
1703
  :is(.btn-group-full,.toggle-group-full) > .btn { flex:1 1 0%; min-inline-size:0; }
1605
1704
  /* Toolbar: contêiner de controles; o roving tabindex vem do Base UI. */
1606
- .toolbar { display:flex; align-items:center; flex-wrap:wrap; gap:6px; padding:6px; border:1px solid var(--border); border-radius:var(--radius-control); background:var(--secondary); }
1705
+ .toolbar { display:flex; align-items:center; flex-wrap:wrap; gap:6px; padding:6px; border:1px solid transparent; border-radius:var(--radius-control); background:var(--secondary); }
1607
1706
  /* Vertical sai da pílula: --radius-control (999px) clampa em 50% da menor
1608
1707
  dimensão e vira um oval num container alto. */
1609
1708
  .toolbar[data-orientation="vertical"] { flex-direction:column; align-items:stretch; border-radius:var(--radius-lg); }
@@ -1629,7 +1728,7 @@ img,svg { display:block; }
1629
1728
  quando ele é a única coisa na tela. */
1630
1729
  /* O spinner lê a MESMA escala de glifo, mas o degrau base dele é `sm` e não `md` — presumir
1631
1730
  `md` como base de toda família é o erro que esta atividade já cometeu duas vezes. */
1632
- .spinner { width:var(--step-icon,var(--icon-sm)); height:var(--step-icon,var(--icon-sm)); border:2px solid currentColor; border-right-color:transparent; border-radius:50%; animation:spin .7s linear infinite; }
1731
+ .spinner { width:var(--step-icon,var(--icon-sm)); height:var(--step-icon,var(--icon-sm)); background:currentColor; -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='7' fill='none' stroke='%23000' stroke-width='2' stroke-dasharray='33 11'/%3E%3C/svg%3E") center/contain no-repeat; mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='7' fill='none' stroke='%23000' stroke-width='2' stroke-dasharray='33 11'/%3E%3C/svg%3E") center/contain no-repeat; animation:spin .7s linear infinite; }
1633
1732
  /* 0.32.0: a escala da referência — 16 · 24 · 32 · 40. O componente nasce no `md` (24); o glifo cru
1634
1733
  continua no `sm` (16), dentro do botão e do aviso. */
1635
1734
  .spinner-md { --step-icon:var(--space-6); }
@@ -1654,8 +1753,8 @@ img,svg { display:block; }
1654
1753
  .label { display:flex; justify-content:space-between; gap:12px; color:var(--foreground); font-size:var(--text-sm); font-weight:var(--weight-medium); }
1655
1754
  .hint { color:var(--muted-foreground); font-size:var(--text-xs); font-weight:var(--weight-regular); line-height:var(--space-4); }
1656
1755
  .label-required { margin-inline-start:var(--space-05); color:var(--danger-400); }
1657
- .input,.textarea,.select { width:100%; min-width:0; block-size:var(--step-h,var(--control-h-md)); padding-block:0; padding-inline:var(--step-field-px,var(--space-3)); color:var(--foreground); background:var(--field-bg); border:1px solid var(--border-strong); border-radius:var(--radius-control); transition:border-color var(--duration-fast),background-color var(--duration-fast),box-shadow var(--duration-fast); }
1658
- .input:hover,.textarea:hover,.select:hover { border-color:var(--border); }
1756
+ .input,.textarea,.select { width:100%; min-width:0; block-size:var(--step-h,var(--control-h-md)); padding-block:0; padding-inline:var(--step-field-px,var(--space-3)); color:var(--foreground); background:var(--field-bg); border:1px solid transparent; border-radius:var(--radius-control); transition:border-color var(--duration-fast),background-color var(--duration-fast),box-shadow var(--duration-fast); }
1757
+ .input:hover,.textarea:hover,.select:hover { border-color:transparent; }
1659
1758
  /* `variant="secondary"` (0.32.0), o da referência: o campo de fundo NEUTRO e sem borda à vista, para
1660
1759
  dentro de um cartão, onde o fundo de campo some contra o do cartão. A borda fica (transparente),
1661
1760
  para o foco continuar sendo a borda que muda de cor (ADR-0059). */
@@ -1688,9 +1787,9 @@ img,svg { display:block; }
1688
1787
  grupo inteiro, que é a peça que a pessoa vê. No toque o grupo sobe para o alvo de 44, como os
1689
1788
  botões soltos subiam. */
1690
1789
  .number-field { display:inline-flex; }
1691
- .number-field-group { display:inline-flex; align-items:stretch; block-size:var(--control-h-md); border:var(--border-width) solid var(--border-strong); border-radius:var(--radius-full); background:var(--field-bg); overflow:hidden; transition:border-color var(--duration-fast),box-shadow var(--duration-fast); }
1692
- .number-field-group:hover { border-color:var(--border); }
1693
- .number-field-group:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:var(--focus-strong); }
1790
+ .number-field-group { display:inline-flex; align-items:stretch; block-size:var(--control-h-md); border:var(--border-width) solid transparent; border-radius:var(--radius-full); background:var(--field-bg); overflow:hidden; transition:border-color var(--duration-fast),box-shadow var(--duration-fast); }
1791
+ .number-field-group:hover { border-color:transparent; }
1792
+ .number-field-group:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
1694
1793
  .number-field-input { width:var(--space-16); text-align:center; font-variant-numeric:tabular-nums; }
1695
1794
  .number-field-group > .number-field-input { block-size:auto; border:0; border-radius:0; background:transparent; }
1696
1795
  .number-field-group > .number-field-input:focus-visible { outline:none; }
@@ -1701,8 +1800,8 @@ img,svg { display:block; }
1701
1800
  .number-field-button:disabled { opacity:var(--opacity-disabled); cursor:not-allowed; }
1702
1801
  /* o anel do botão fica DENTRO dele: o grupo corta o que passa da borda */
1703
1802
  .number-field-button:focus-visible { outline-offset:calc(-1 * var(--focus-width)); }
1704
- .number-field-decrement { border-inline-end:var(--border-width) solid color-mix(in oklab, var(--muted-foreground) 15%, transparent); }
1705
- .number-field-increment { border-inline-start:var(--border-width) solid color-mix(in oklab, var(--muted-foreground) 15%, transparent); }
1803
+ .number-field-decrement { border-inline-end:var(--border-width) solid transparent; }
1804
+ .number-field-increment { border-inline-start:var(--border-width) solid transparent; }
1706
1805
  @media (pointer:coarse) { .number-field-group { block-size:var(--target-min); } }
1707
1806
  /* A ALÇA DE ARRASTO (G-API-02), e só quando `scrubbable` está ligada.
1708
1807
  O motor já põe por ESTILO EM LINHA tudo o que é mecânica — `touch-action:none` e
@@ -1742,14 +1841,14 @@ img,svg { display:block; }
1742
1841
  soltos na mesma linha medem igual.
1743
1842
  O foco é do CONTROLE e aparece na MOLDURA: `:focus-within` põe o anel no grupo, porque o
1744
1843
  contorno do input de dentro ficaria escondido atrás da borda do grupo. */
1745
- .input-group { display:flex; flex-wrap:wrap; align-items:center; inline-size:100%; min-inline-size:0; min-block-size:var(--control-h-md); background:var(--field-bg); border:1px solid var(--border-strong); border-radius:var(--radius-control); transition:border-color var(--duration-fast),box-shadow var(--duration-fast); }
1746
- .input-group:hover { border-color:var(--border); }
1844
+ .input-group { display:flex; flex-wrap:wrap; align-items:center; inline-size:100%; min-inline-size:0; min-block-size:var(--control-h-md); background:var(--field-bg); border:1px solid transparent; border-radius:var(--radius-control); transition:border-color var(--duration-fast),box-shadow var(--duration-fast); }
1845
+ .input-group:hover { border-color:transparent; }
1747
1846
  /* A pele `secondary` do campo vale para o GRUPO, como o tamanho (abaixo): quem desenha a caixa é o grupo, e o
1748
1847
  `ColorField variant="secondary"` (e todo `InputGroup` com um `Input variant="secondary"` dentro) saía igual ao
1749
1848
  `primary` (medido na bancada em 14/10/2026). Antes do foco, para a borda do foco valer. */
1750
1849
  .input-group:has(>.input-secondary) { background:var(--secondary); border-color:transparent; }
1751
1850
  .input-group:has(>.input-secondary):hover { background:var(--secondary-hover); }
1752
- .input-group:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:var(--focus-strong); }
1851
+ .input-group:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
1753
1852
  .input-group:has(.input-sm) { min-block-size:var(--control-h-sm); }
1754
1853
  .input-group:has(.input-lg) { min-block-size:var(--control-h-lg); }
1755
1854
  /* O controle dentro do grupo abre mão da própria moldura: quem desenha a caixa é o grupo. */
@@ -1901,7 +2000,7 @@ img,svg { display:block; }
1901
2000
  lista; aqui a lista vem por dados, então ela é automática. 1 de altura, 8 para dentro de cada lado, e o vão da lista
1902
2001
  (4) em cima e o da seção (4) embaixo. Desenho, não item: o leitor de tela já conta os grupos. É BORDA, e não fundo,
1903
2002
  para continuar no alto contraste do Windows (ele apaga fundo de enfeite). */
1904
- .list-box-section + .list-box-section::before { content:""; border-block-start:var(--border-width) solid var(--border); margin-inline:var(--space-2); }
2003
+ .list-box-section + .list-box-section::before { content:""; border-block-start:var(--border-width) solid transparent; margin-inline:var(--space-2); }
1905
2004
  .list-box-item { position:relative; display:flex; align-items:center; gap:var(--space-3); inline-size:100%; min-block-size:var(--control-h-md); padding:calc(var(--space-1) + var(--space-05)) var(--space-2); border-radius:var(--radius-full); color:var(--foreground); font-size:var(--text-sm); cursor:pointer; transition:background var(--duration-fast),transform var(--duration-fast) var(--ease-standard); }
1906
2005
  /* O atalho do item (15/10/2026), como o da referência: o `Kbd` na ponta da linha. */
1907
2006
  .list-box-item-kbd { flex:none; margin-inline-start:auto; }
@@ -1940,28 +2039,28 @@ img,svg { display:block; }
1940
2039
  /* 0.32.0: a marca da referência tem 16. A conta passa a "metade menos 2" — 14 · 16 · 18 no sm · md ·
1941
2040
  lg, e continua andando com a densidade, sem número quebrado. Centrada na primeira linha do texto
1942
2041
  (`1lh`), qualquer que seja a entrelinha. O canto da caixa é o 6 dela (`--radius-xs`; era 5 cru). */
1943
- .control-mark { --mark:calc(var(--step-h,var(--control-h-md)) / 2 - var(--space-05)); flex:none; inline-size:var(--mark); block-size:var(--mark); margin-top:calc((1lh - var(--mark)) / 2); display:grid; place-items:center; border:1px solid var(--border-strong); background:var(--field-bg); }
2042
+ .control-mark { --mark:calc(var(--step-h,var(--control-h-md)) / 2 - var(--space-05)); flex:none; inline-size:var(--mark); block-size:var(--mark); margin-top:calc((1lh - var(--mark)) / 2); display:grid; place-items:center; border:1px solid transparent; background:var(--field-bg); }
1944
2043
  .control-mark-sm { --step-h:var(--control-h-sm); }
1945
2044
  .control-mark-lg { --step-h:var(--control-h-lg); }
1946
2045
  .checkbox .control-mark { border-radius:var(--radius-xs); } .radio .control-mark { border-radius:50%; }
1947
- .checkbox input:checked + .control-mark { background:var(--control-selected); border-color:var(--control-selected); color:var(--control-selected-foreground); }
1948
- .checkbox input:focus-visible + .control-mark,.radio input:focus-visible + .control-mark,.switch input:focus-visible + .switch-track { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:var(--focus-strong); }
2046
+ .checkbox input:checked + .control-mark { background:var(--control-selected); border-color:transparent; color:var(--control-selected-foreground); }
2047
+ .checkbox input:focus-visible + .control-mark,.radio input:focus-visible + .control-mark,.switch input:focus-visible + .switch-track { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
1949
2048
  /* Cheia com a cor do foco (marcada, ligada), a peça volta ao VÃO (ADR-0059): colado, o anel sumiria
1950
2049
  no recheio, como no botão amarelo. A borda dela já é da cor do recheio, então continua uma linha
1951
2050
  só — é o que a referência principal faz no checkbox e no switch. Inválida, a borda é vermelha e o
1952
2051
  anel volta a colar (vermelho, pela regra do inválido). */
1953
2052
  .checkbox input:focus-visible:checked:not([aria-invalid="true"],:user-invalid) + .control-mark,.switch input:focus-visible:checked:not([aria-invalid="true"],:user-invalid) + .switch-track { outline-offset:var(--focus-offset); }
1954
- .checkbox input:checked + .control-mark:after { content:""; width:8px; height:4px; border-left:2px solid currentColor; border-bottom:2px solid currentColor; transform:rotate(-45deg) translateY(-1px); }
2053
+ .checkbox input:checked + .control-mark:after { content:""; inline-size:100%; block-size:100%; background:currentColor; -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat; mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M3.5 8.5l3 3 6-7' fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat; }
1955
2054
  /* A opção marcada fica CHEIA, com o ponto no meio, como a da referência (o ponto dela tem 8 numa
1956
2055
  marca de 16: a metade). Era vazia, com o ponto amarelo. */
1957
- .radio input:checked + .control-mark { background:var(--control-selected); border-color:var(--control-selected); }
2056
+ .radio input:checked + .control-mark { background:var(--control-selected); border-color:transparent; }
1958
2057
  .radio input:checked + .control-mark:after { content:""; width:50%; height:50%; border-radius:50%; background:var(--control-selected-foreground); }
1959
2058
  .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; }
1960
2059
  /* O TRILHO DO SWITCH (0.32.0): o da referência, 40 × 20 (sm 32 × 16, lg 48 × 24) — a largura é o
1961
2060
  dobro da altura. Era 42 × 24. A altura é a de controle MENOS 16: dá exatamente os três dela
1962
2061
  (32 · 36 · 40 → 16 · 20 · 24), continua andando com a densidade e passa pela `--step-h`, que é o
1963
2062
  caminho do tamanho responsivo (`size-*`). */
1964
- .switch-track { --switch-h:calc(var(--step-h,var(--control-h-md)) - var(--space-4)); position:relative; flex:none; inline-size:calc(var(--switch-h) * 2); block-size:var(--switch-h); border-radius:999px; background:var(--muted); border:1px solid var(--border); transition:background var(--duration-base) var(--ease-standard),border-color var(--duration-base) var(--ease-standard); }
2063
+ .switch-track { --switch-h:calc(var(--step-h,var(--control-h-md)) - var(--space-4)); position:relative; flex:none; inline-size:calc(var(--switch-h) * 2); block-size:var(--switch-h); border-radius:999px; background:var(--muted); border:1px solid transparent; transition:background var(--duration-base) var(--ease-standard),border-color var(--duration-base) var(--ease-standard); }
1965
2064
  .switch-track-sm { --step-h:var(--control-h-sm); }
1966
2065
  .switch-track-lg { --step-h:var(--control-h-lg); }
1967
2066
  /* O botão TEM de encolher com o trilho: preso em 16px, num trilho `compact` de 20px de altura
@@ -1979,7 +2078,7 @@ img,svg { display:block; }
1979
2078
  mesma distância nos dois sentidos de escrita. */
1980
2079
  .switch-track:after { --thumb-h:calc(var(--switch-h) - 2 * var(--space-05)); --thumb-w:calc(var(--thumb-h) * 11 / 8); content:""; position:absolute; inset-inline-start:calc(var(--space-05) - var(--border-width)); top:calc(var(--space-05) - var(--border-width)); block-size:var(--thumb-h); inline-size:var(--thumb-w); border-radius:var(--radius-full); background:var(--muted-foreground); transition:transform var(--duration-base) var(--ease-standard),background var(--duration-base) var(--ease-standard); }
1981
2080
  .switch-track { --switch-x:calc(var(--switch-h) * 2 - (var(--switch-h) - 2 * var(--space-05)) * 11 / 8 - 2 * var(--space-05)); }
1982
- .switch input:checked + .switch-track { background:var(--control-selected); border-color:var(--control-selected); } .switch input:checked + .switch-track:after { transform:translateX(var(--switch-x)); background:var(--control-selected-foreground); }
2081
+ .switch input:checked + .switch-track { background:var(--control-selected); border-color:transparent; } .switch input:checked + .switch-track:after { transform:translateX(var(--switch-x)); background:var(--control-selected-foreground); }
1983
2082
  .range { width:100%; accent-color:var(--primary); }
1984
2083
  /* Slider VERTICAL, no `<input type=range>` NATIVO — sem trocar de motor.
1985
2084
 
@@ -2047,7 +2146,7 @@ img,svg { display:block; }
2047
2146
  .slider-color { --slider-cap:var(--space-3); }
2048
2147
  .slider-color .slider-track { background:var(--slider-track-fill,var(--secondary)); background-origin:border-box; forced-color-adjust:none; }
2049
2148
  .slider-alpha .slider-track { background-image:var(--slider-track-fill,none),var(--color-checker); background-size:auto,var(--space-2) var(--space-2); }
2050
- .slider-color .slider-thumb { box-sizing:border-box; inline-size:var(--space-4); block-size:var(--space-4); align-self:center; border:calc(3 * var(--border-width)) solid #fff; background:var(--color-checker) center/var(--space-2) var(--space-2); box-shadow:inset 0 0 0 var(--space-4) var(--slider-thumb-color,var(--primary)), 0 0 0 var(--border-width) rgba(0,0,0,.1), var(--shadow-sm); forced-color-adjust:none; }
2149
+ .slider-color .slider-thumb { box-sizing:border-box; inline-size:var(--space-4); block-size:var(--space-4); align-self:center; border:0; background:var(--color-checker) center/var(--space-2) var(--space-2); box-shadow:inset 0 0 0 var(--space-4) var(--slider-thumb-color,var(--primary)), var(--shadow-md); forced-color-adjust:none; }
2051
2150
  .slider-color .slider-thumb::after { content:none; }
2052
2151
  .slider-color[data-orientation="vertical"] .slider-thumb { inline-size:var(--space-4); block-size:var(--space-4); }
2053
2152
  /* COLORAREA (0.32.0, ADR-0069) — a área de cor. A pintura (o gradiente, a ÚNICA exceção à ADR-0007) chega pela
@@ -2057,13 +2156,13 @@ img,svg { display:block; }
2057
2156
  O anel é BRANCO nos dois temas, e não um token de tema: ele fica sobre a cor escolhida, e não sobre a página.
2058
2157
  Os dois `range` escondidos (o motor da área) cobrem o pino com opacidade quase zero, como na referência: o
2059
2158
  leitor de tela por toque os acha no lugar do pino. */
2060
- .color-area { position:relative; inline-size:100%; max-inline-size:calc(2 * var(--space-24) + var(--space-8)); aspect-ratio:1; border-radius:var(--radius-lg); background:var(--color-area-fill,var(--secondary)); background-blend-mode:var(--color-area-blend,normal); box-shadow:inset 0 0 0 var(--border-width) rgba(0,0,0,.1); touch-action:none; cursor:crosshair; user-select:none; forced-color-adjust:none; }
2159
+ .color-area { position:relative; inline-size:100%; max-inline-size:calc(2 * var(--space-24) + var(--space-8)); aspect-ratio:1; border-radius:var(--radius-lg); background:var(--color-area-fill,var(--secondary)); background-blend-mode:var(--color-area-blend,normal); box-shadow:none; touch-action:none; cursor:crosshair; user-select:none; forced-color-adjust:none; }
2061
2160
  /* Os pontinhos (`showDots`, o da referência: um ponto branco a 20% a cada 8) são desenho de SVG por cima da área,
2062
2161
  e não gradiente. O pino fica acima deles. */
2063
2162
  .color-area-dots::after { content:""; position:absolute; inset:0; border-radius:inherit; pointer-events:none; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Ccircle cx='4' cy='4' r='1' fill='%23fff' fill-opacity='.2'/%3E%3C/svg%3E"); background-size:var(--space-2) var(--space-2); }
2064
2163
  .color-area-dots .color-area-thumb { z-index:1; }
2065
2164
  .color-area[data-disabled] { opacity:var(--opacity-disabled); cursor:not-allowed; }
2066
- .color-area-thumb { position:absolute; box-sizing:border-box; inline-size:var(--space-4); block-size:var(--space-4); margin-inline-start:calc(var(--space-4) / -2); margin-block-start:calc(var(--space-4) / -2); border:calc(3 * var(--border-width)) solid #fff; border-radius:var(--radius-full); background:var(--color-area-thumb,transparent); box-shadow:0 0 0 var(--border-width) rgba(0,0,0,.1), inset 0 0 0 var(--border-width) rgba(0,0,0,.1); pointer-events:none; forced-color-adjust:none; transition:inline-size var(--duration-base) var(--ease-standard), block-size var(--duration-base) var(--ease-standard), margin var(--duration-base) var(--ease-standard); }
2165
+ .color-area-thumb { position:absolute; box-sizing:border-box; inline-size:var(--space-4); block-size:var(--space-4); margin-inline-start:calc(var(--space-4) / -2); margin-block-start:calc(var(--space-4) / -2); border:0; border-radius:var(--radius-full); background:var(--color-area-thumb,transparent); box-shadow:var(--shadow-md); pointer-events:none; forced-color-adjust:none; transition:inline-size var(--duration-base) var(--ease-standard), block-size var(--duration-base) var(--ease-standard), margin var(--duration-base) var(--ease-standard); }
2067
2166
  .color-area[data-dragging] .color-area-thumb { inline-size:var(--space-5); block-size:var(--space-5); margin-inline-start:calc(var(--space-5) / -2); margin-block-start:calc(var(--space-5) / -2); }
2068
2167
  .color-area-thumb[data-focus-visible] { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
2069
2168
  .color-area-input { position:absolute; inset:0; inline-size:100%; block-size:100%; margin:0; opacity:.0001; pointer-events:none; }
@@ -2164,7 +2263,7 @@ img,svg { display:block; }
2164
2263
  24 de altura, 10 até o texto (8 da caixa + 2 do rótulo — aqui, com a borda de 1 que é nossa, 9), 4
2165
2264
  entre o glifo e o texto (era 6); `sm` 20 com 6 até o texto, `lg` 28 com 14 e letra de 14. A cápsula e a
2166
2265
  borda continuam da Aurea, como no nativo (0.11.0). */
2167
- .badge { --badge-accent:var(--secondary-foreground); display:inline-flex; align-items:center; justify-content:center; gap:var(--space-1); min-height:var(--space-6); padding:0 calc(var(--space-2) + var(--space-05) - var(--border-width)); border:1px solid var(--border); border-radius:var(--radius-control); background:var(--secondary); color:var(--secondary-foreground); font-size:var(--text-xs); font-weight:var(--weight-medium); line-height:var(--space-4); white-space:nowrap; }
2266
+ .badge { --badge-accent:var(--secondary-foreground); display:inline-flex; align-items:center; justify-content:center; gap:var(--space-1); min-height:var(--space-6); padding:0 calc(var(--space-2) + var(--space-05) - var(--border-width)); border:1px solid transparent; border-radius:var(--radius-control); background:var(--secondary); color:var(--secondary-foreground); font-size:var(--text-xs); font-weight:var(--weight-medium); line-height:var(--space-4); white-space:nowrap; }
2168
2267
  /* O glifo do badge tem tamanho PRÓPRIO, senão o `.icon` padrão (20px) estoura os 24px e o
2169
2268
  badge com ícone fica mais alto que o badge de texto na mesma fila. 16px + 3+3 de padding
2170
2269
  + 1+1 de borda = 24px exatos: com ícone ou sem, mede o mesmo. */
@@ -2173,7 +2272,7 @@ img,svg { display:block; }
2173
2272
  numa fila, `align-self:flex-start` tiraria o selo do meio; o tamanho definido só desliga o
2174
2273
  esticar, que é o que a coluna faz com um item sem tamanho. */
2175
2274
  .badge-fit { inline-size:fit-content; }
2176
- .badge-primary { --badge-accent:var(--primary-emphasis); color:var(--primary-emphasis); border-color:var(--primary-outline); background:color-mix(in srgb,var(--primary) 10%,transparent); }
2275
+ .badge-primary { --badge-accent:var(--primary-emphasis); color:var(--primary-emphasis); border-color:transparent; background:color-mix(in srgb,var(--primary) 10%,transparent); }
2177
2276
  /* TAMANHOS. O md é a base (24px), que não muda — é o que as 103 fichas já usam. */
2178
2277
  .badge-xs { min-height:var(--space-4); padding:0 var(--space-1); border-width:0; }
2179
2278
  .badge-sm { min-height:var(--space-5); padding:0 calc(var(--space-1) + var(--space-05) - var(--border-width)); }
@@ -2202,7 +2301,7 @@ img,svg { display:block; }
2202
2301
  A superfície de trás NÃO é adivinhável em CSS — dentro de um card ela é `--card`, não
2203
2302
  `--background`. Por isso ela é uma propriedade: sobrescreva `--badge-ring` no contêiner. */
2204
2303
  .badge-anchor { position:relative; display:inline-flex; vertical-align:middle; flex-shrink:0; }
2205
- .badge-overlay { --badge-ring:var(--background); --badge-inset:0%; position:absolute; z-index:1; min-height:var(--space-4); padding:0 var(--space-1); box-shadow:0 0 0 var(--space-05) var(--badge-ring); }
2304
+ .badge-overlay { --badge-ring:var(--background); --badge-inset:0%; position:absolute; z-index:1; min-height:var(--space-4); padding:0 var(--space-1); box-shadow:none; }
2206
2305
  .badge-on-circle { --badge-inset:14%; }
2207
2306
  /* O ponto sozinho não tem conteúdo, então ele precisa de medida própria. */
2208
2307
  .badge-overlay.badge-is-dot { width:var(--space-2); min-width:var(--space-2); height:var(--space-2); min-height:var(--space-2); padding:0; }
@@ -2232,22 +2331,22 @@ img,svg { display:block; }
2232
2331
  o contador cai sobre a cor da marca e precisa da mesma inversão do botão primário. Os outros
2233
2332
  seis deixam o contador sobre a superfície da barra, onde ele já se lê. */
2234
2333
 
2235
- .badge-success { --badge-accent:var(--success-400); --badge-fill:var(--success); --badge-on:var(--success-foreground); color:var(--success-400); background:var(--success-bg); border-color:color-mix(in srgb,var(--success-400) 35%,var(--border)); }
2236
- .badge-warning { --badge-accent:var(--warning-400); --badge-fill:var(--warning); --badge-on:var(--warning-foreground); color:var(--warning-400); background:var(--warning-bg); border-color:color-mix(in srgb,var(--warning-400) 35%,var(--border)); }
2237
- .badge-danger { --badge-accent:var(--danger-400); --badge-fill:var(--destructive); --badge-on:var(--destructive-foreground); color:var(--danger-400); background:var(--danger-bg); border-color:color-mix(in srgb,var(--danger-400) 35%,var(--border)); }
2238
- .badge-info,.badge-running { --badge-accent:var(--info-400); --badge-fill:var(--info); --badge-on:var(--info-foreground); color:var(--info-400); background:var(--info-bg); border-color:color-mix(in srgb,var(--info-400) 35%,var(--border)); }
2334
+ .badge-success { --badge-accent:var(--success-400); --badge-fill:var(--success); --badge-on:var(--success-foreground); color:var(--success-400); background:var(--success-bg); border-color:transparent; }
2335
+ .badge-warning { --badge-accent:var(--warning-400); --badge-fill:var(--warning); --badge-on:var(--warning-foreground); color:var(--warning-400); background:var(--warning-bg); border-color:transparent; }
2336
+ .badge-danger { --badge-accent:var(--danger-400); --badge-fill:var(--destructive); --badge-on:var(--destructive-foreground); color:var(--danger-400); background:var(--danger-bg); border-color:transparent; }
2337
+ .badge-info,.badge-running { --badge-accent:var(--info-400); --badge-fill:var(--info); --badge-on:var(--info-foreground); color:var(--info-400); background:var(--info-bg); border-color:transparent; }
2239
2338
  /* AS OITO CORES DE CATEGORIA (GAR-07, ADR-0060, 09/10/2026): marcam GRUPO, não estado — "Motos" e
2240
2339
  "Carros" num site de notícias. Mesma receita dos quatro propósitos acima (acento, fundo suave e
2241
2340
  o fio misturado com a borda), e por isso as três ênfases valem para elas sem regra nova. O
2242
2341
  amarelo fica de fora: é da marca. Quem cobra o AA nos dois temas é o `badge-categoria.spec.ts`. */
2243
- .badge-red { --badge-accent:var(--category-red); color:var(--category-red); background:var(--category-red-bg); border-color:color-mix(in srgb,var(--category-red) 35%,var(--border)); }
2244
- .badge-orange { --badge-accent:var(--category-orange); color:var(--category-orange); background:var(--category-orange-bg); border-color:color-mix(in srgb,var(--category-orange) 35%,var(--border)); }
2245
- .badge-green { --badge-accent:var(--category-green); color:var(--category-green); background:var(--category-green-bg); border-color:color-mix(in srgb,var(--category-green) 35%,var(--border)); }
2246
- .badge-teal { --badge-accent:var(--category-teal); color:var(--category-teal); background:var(--category-teal-bg); border-color:color-mix(in srgb,var(--category-teal) 35%,var(--border)); }
2247
- .badge-cyan { --badge-accent:var(--category-cyan); color:var(--category-cyan); background:var(--category-cyan-bg); border-color:color-mix(in srgb,var(--category-cyan) 35%,var(--border)); }
2248
- .badge-blue { --badge-accent:var(--category-blue); color:var(--category-blue); background:var(--category-blue-bg); border-color:color-mix(in srgb,var(--category-blue) 35%,var(--border)); }
2249
- .badge-violet { --badge-accent:var(--category-violet); color:var(--category-violet); background:var(--category-violet-bg); border-color:color-mix(in srgb,var(--category-violet) 35%,var(--border)); }
2250
- .badge-pink { --badge-accent:var(--category-pink); color:var(--category-pink); background:var(--category-pink-bg); border-color:color-mix(in srgb,var(--category-pink) 35%,var(--border)); }
2342
+ .badge-red { --badge-accent:var(--category-red); color:var(--category-red); background:var(--category-red-bg); border-color:transparent; }
2343
+ .badge-orange { --badge-accent:var(--category-orange); color:var(--category-orange); background:var(--category-orange-bg); border-color:transparent; }
2344
+ .badge-green { --badge-accent:var(--category-green); color:var(--category-green); background:var(--category-green-bg); border-color:transparent; }
2345
+ .badge-teal { --badge-accent:var(--category-teal); color:var(--category-teal); background:var(--category-teal-bg); border-color:transparent; }
2346
+ .badge-cyan { --badge-accent:var(--category-cyan); color:var(--category-cyan); background:var(--category-cyan-bg); border-color:transparent; }
2347
+ .badge-blue { --badge-accent:var(--category-blue); color:var(--category-blue); background:var(--category-blue-bg); border-color:transparent; }
2348
+ .badge-violet { --badge-accent:var(--category-violet); color:var(--category-violet); background:var(--category-violet-bg); border-color:transparent; }
2349
+ .badge-pink { --badge-accent:var(--category-pink); color:var(--category-pink); background:var(--category-pink-bg); border-color:transparent; }
2251
2350
  /* ── AS TRÊS ÊNFASES — e elas vêm DEPOIS das variantes de propósito ─────────────────
2252
2351
  Cada variante declara só o ACENTO; as ênfases saem dele. Antes cada variante escrevia
2253
2352
  cor + fundo + borda na mão, e uma ênfase nova custaria seis regras novas.
@@ -2261,7 +2360,7 @@ img,svg { display:block; }
2261
2360
  (`--badge-fill`/`--badge-on`). Quem não declara o par (as categorias, a marca, o neutro) segue
2262
2361
  enchendo com o acento, como antes. */
2263
2362
  .badge-solid { background:var(--badge-fill, var(--badge-accent)); color:var(--badge-on, var(--background)); border-color:transparent; }
2264
- .badge-outline { background:transparent; color:var(--badge-accent); border-color:var(--badge-accent); }
2363
+ .badge-outline { background:transparent; color:var(--badge-accent); border-color:transparent; }
2265
2364
  /* flat (15/10/2026): o tom de sempre sem a linha em volta — o selo da referência não tem borda em forma nenhuma. A
2266
2365
  borda fica, transparente: a medida do selo não muda. */
2267
2366
  .badge.badge-flat { border-color:transparent; }
@@ -2281,9 +2380,9 @@ img,svg { display:block; }
2281
2380
  VAZADO resolve nos dois temas e ainda diz a coisa certa (ausência, não outro estado).
2282
2381
  Escopado em .status-offline: o .status-dot dentro do Badge (Chat) segue preenchido. */
2283
2382
  .status-offline { color:var(--subtle-foreground); }
2284
- .status-offline .status-dot { background:transparent; box-shadow:inset 0 0 0 2px currentColor,0 0 0 3px color-mix(in srgb,currentColor 14%,transparent); }
2383
+ .status-offline .status-dot { background:color-mix(in srgb,currentColor 40%,transparent); box-shadow:0 0 0 3px color-mix(in srgb,currentColor 14%,transparent); }
2285
2384
 
2286
- .card { min-width:0; padding:var(--card-pad); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); box-shadow:none; }
2385
+ .card { min-width:0; padding:var(--card-pad); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); box-shadow:none; }
2287
2386
  /* padding="none" (C-05): sem respiro, e a mídia recortada no raio 22 do próprio cartão. */
2288
2387
  .card-flush { padding:0; overflow:hidden; }
2289
2388
  /* Card.Media e orientation (A-14). Vertical: a mídia primeira sangra até a borda de cima e dos
@@ -2326,22 +2425,22 @@ img,svg { display:block; }
2326
2425
  viram link (`.btn`, `.sidebar-item`, `.nav-list-row`…) já tiravam; o cartão e o item de menu
2327
2426
  não. Quem cobra é o `link-sem-sublinhado.spec.ts`. */
2328
2427
  .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); }
2329
- .card-interactive:hover { transform:translateY(-2px); border-color:var(--border-strong); background:var(--surface-2); }
2330
- .card-selected { border-color:var(--primary-outline); box-shadow:inset 0 0 0 1px var(--primary-outline); }
2331
- .card-danger { border-color:color-mix(in srgb,var(--danger-400) 50%,var(--border)); background:var(--danger-bg); }
2428
+ .card-interactive:hover { transform:translateY(-2px); border-color:transparent; background:var(--surface-2); }
2429
+ .card-selected { border-color:transparent; background:color-mix(in oklab,var(--primary) 12%,var(--card)); }
2430
+ .card-danger { border-color:transparent; background:var(--danger-bg); }
2332
2431
  /* MT-01 (10/10/2026, ADR-0063): o cartão `contrast` traz `data-theme="dark"` no próprio elemento —
2333
2432
  o fundo, a letra e todo filho já saem do tema escuro. Falta só a linha em volta: no claro, nenhuma
2334
2433
  (o cartão escuro já se separa da tela, 13,3:1); no escuro, o amarelo, com a borda de sempre (1).
2335
2434
  O "está num pedaço escuro?" é o do ANCESTRAL, com a guarda do GAR-05: o atributo do próprio
2336
2435
  cartão não conta, e uma faixa clara dentro da página escura não ganha o contorno. */
2337
2436
  .card-contrast { border-color:transparent; }
2338
- [data-theme="dark"] .card-contrast:where(:not([data-theme="light"] *),[data-theme="light"] [data-theme="dark"] *) { border-color:var(--primary); }
2437
+ [data-theme="dark"] .card-contrast:where(:not([data-theme="light"] *),[data-theme="light"] [data-theme="dark"] *) { border-color:transparent; }
2339
2438
  /* MT-02 (10/10/2026, ADR-0063): o traço no topo, `--accent-width` (4), na cor CHEIA do tom e igual
2340
2439
  nos dois temas — a exceção que a ADR-0063 abriu na ADR-0061 para enfeite. O navegador desenha a
2341
2440
  borda grossa do topo afinando na curva do canto, até a de 1 dos lados. `.card.card-accent` tem a
2342
2441
  força de duas classes e vem depois: o escolhido, o de perigo e o contorno do `contrast` mudam os
2343
2442
  outros lados, e o topo continua o traço. */
2344
- .card.card-accent { border-top:var(--accent-width) solid var(--card-accent); }
2443
+ .card.card-accent { border-block-start-width:0; padding-block-start:calc(var(--card-pad) + var(--accent-width)); box-shadow:inset 0 var(--accent-width) 0 0 var(--card-accent); }
2345
2444
  .card-accent-brand { --card-accent:var(--primary); } .card-accent-success { --card-accent:var(--success); }
2346
2445
  .card-accent-info { --card-accent:var(--info); } .card-accent-warning { --card-accent:var(--warning); }
2347
2446
  .card-accent-danger { --card-accent:var(--destructive); }
@@ -2366,11 +2465,11 @@ img,svg { display:block; }
2366
2465
  @media (max-width:639px) { .alert-has-action { grid-template-columns:auto minmax(0,1fr) auto; } .alert-has-action > .alert-action { grid-column:2; grid-row:2; justify-self:start; align-self:start; } }
2367
2466
  /* Banner: aviso de largura de página. Base ANTES das variantes — mesma
2368
2467
  especificidade, então a última regra vence e a base apagaria as cores. */
2369
- .banner { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:12px; padding:14px 18px; border:1px solid var(--border); border-radius:var(--radius-card); background:var(--secondary); }
2370
- .banner-info { border-color:color-mix(in srgb,var(--info) 38%,var(--border)); background:var(--info-bg); }
2371
- .banner-success { border-color:color-mix(in srgb,var(--success) 38%,var(--border)); background:var(--success-bg); }
2372
- .banner-warning { border-color:color-mix(in srgb,var(--warning) 38%,var(--border)); background:var(--warning-bg); }
2373
- .banner-danger { border-color:color-mix(in srgb,var(--danger-400) 38%,var(--border)); background:var(--danger-bg); }
2468
+ .banner { display:grid; grid-template-columns:auto minmax(0,1fr) auto; align-items:center; gap:12px; padding:14px 18px; border:1px solid transparent; border-radius:var(--radius-card); background:var(--secondary); }
2469
+ .banner-info { border-color:transparent; background:var(--info-bg); }
2470
+ .banner-success { border-color:transparent; background:var(--success-bg); }
2471
+ .banner-warning { border-color:transparent; background:var(--warning-bg); }
2472
+ .banner-danger { border-color:transparent; background:var(--danger-bg); }
2374
2473
  /* O título do alerta é <strong> e não <h4>: alerta cai em qualquer profundidade da página e
2375
2474
  um h4 fixo quebraria a ordem de cabeçalhos. `display:block` porque o corpo vem embaixo
2376
2475
  dele, não ao lado — as duas linhas são o desenho da referência congelada. */
@@ -2440,8 +2539,8 @@ img,svg { display:block; }
2440
2539
  /* `variant="secondary"` (0.32.0): a aba secundária da referência — sem trilho e sem cápsula, um fio
2441
2540
  embaixo da lista, a escolhida com a letra normal e o fio da casa (a regra do "selecionado", mais
2442
2541
  abaixo). */
2443
- .tabs-secondary { gap:var(--space-1); padding:0; border-block-end:var(--border-width) solid var(--border); border-radius:0; background:transparent; }
2444
- .tabs-secondary[data-orientation="vertical"] { border-block-end:0; border-inline-start:var(--border-width) solid var(--border); }
2542
+ .tabs-secondary { gap:var(--space-1); padding:0; border-block-end:var(--border-width) solid transparent; border-radius:0; background:transparent; }
2543
+ .tabs-secondary[data-orientation="vertical"] { border-block-end:0; border-inline-start:var(--border-width) solid transparent; }
2445
2544
  .tabs-secondary .tab { border-radius:0; }
2446
2545
  .tabs-secondary .tab.active,.tabs-secondary .tab[data-active] { background:transparent; box-shadow:none; color:var(--foreground); }
2447
2546
  .tabs-secondary .tab[data-active]::after { display:block; }
@@ -2469,7 +2568,7 @@ img,svg { display:block; }
2469
2568
  .pagination-link:hover:not(:disabled):not([aria-disabled="true"]) { background:var(--secondary); }
2470
2569
  .pagination-link:active:not(:disabled):not([aria-disabled="true"]) { transform:scale(.97); }
2471
2570
  .pagination-link:disabled,.pagination-link[aria-disabled="true"] { opacity:var(--opacity-disabled); cursor:not-allowed; }
2472
- .pagination-link.active { border-color:var(--primary-outline); background:color-mix(in srgb, var(--primary) 10%, transparent); color:var(--primary-emphasis); }
2571
+ .pagination-link.active { border-color:transparent; background:color-mix(in srgb, var(--primary) 10%, transparent); color:var(--primary-emphasis); }
2473
2572
  .pagination-link-nav { padding-inline:calc(var(--space-2) + var(--space-05)); }
2474
2573
  .pagination-nav-icon { --step-icon:var(--icon-sm); }
2475
2574
  .pagination-ellipsis { display:inline-grid; place-items:center; inline-size:var(--control-h-sm); color:var(--muted-foreground); font-size:var(--text-sm); }
@@ -2481,10 +2580,10 @@ img,svg { display:block; }
2481
2580
  .step { position:relative; text-align:center; color:var(--subtle-foreground); }
2482
2581
  /* O ponto também morava só no docs.css, como o container. Os estados dele (`.step.done`,
2483
2582
  `.step.active`) estavam no core e miravam uma regra que não existia aqui — meia peça. */
2484
- .step-dot { position:relative; z-index:1; width:32px; height:32px; margin:0 auto var(--space-2); display:grid; place-items:center; border-radius:50%; border:1px solid var(--border-strong); background:var(--surface-1); }
2583
+ .step-dot { position:relative; z-index:1; width:32px; height:32px; margin:0 auto var(--space-2); display:grid; place-items:center; border-radius:50%; border:1px solid transparent; background:var(--surface-1); }
2485
2584
  /* Erro é o estado que faltava: uma etapa que reprovou na validação não tinha como se mostrar.
2486
2585
  Cor semântica, não a primária — reprovar não é progredir. */
2487
- .step-error { color:var(--danger-400); } .step-error .step-dot { color:var(--danger-400); border-color:var(--danger-400); }
2586
+ .step-error { color:var(--danger-400); } .step-error .step-dot { color:var(--danger-400); border-color:transparent; background:var(--danger-bg); }
2488
2587
  .step-optional { display:block; color:var(--muted-foreground); font-size:var(--text-xs); }
2489
2588
  /* Etapa clicável (fluxo não-linear): o alvo é um botão de verdade, com o foco do sistema.
2490
2589
  E ele PRECISA GERAR CAIXA. `display:contents` era o que estava aqui, e um <button> sem caixa
@@ -2497,7 +2596,9 @@ img,svg { display:block; }
2497
2596
  "quem mais tem esse problema?" foi feita e a resposta é ninguém. */
2498
2597
  .step-trigger { display:block; width:100%; border:0; padding:0; background:none; color:inherit; font:inherit; text-align:inherit; cursor:pointer; }
2499
2598
  .step:before { content:""; position:absolute; top:15px; inset-inline-start:-50%; width:100%; height:2px; background:var(--border); } .step:first-child:before { display:none; }
2500
- .step.done,.step.active { color:var(--foreground); } .step.done:before,.step.active:before { background:var(--primary); } .step.done .step-dot { color:var(--primary-foreground); background:var(--primary); border-color:var(--primary); } .step.active .step-dot { border-color:var(--primary); box-shadow:0 0 0 4px color-mix(in srgb,var(--primary) 14%,transparent); }
2599
+ /* 16/10/2026: o `Stepper` do React escreve `step-done` e `step-active`, e estas regras só liam `.step.done` e
2600
+ `.step.active` (a marcação à mão) — o passo concluído nunca ficava amarelo na web. As duas formas valem. */
2601
+ :is(.step.done,.step-done),:is(.step.active,.step-active) { color:var(--foreground); } :is(.step.done,.step-done):before,:is(.step.active,.step-active):before { background:var(--primary); } :is(.step.done,.step-done) .step-dot { color:var(--primary-foreground); background:var(--primary); border-color:transparent; } :is(.step.active,.step-active) .step-dot { border-color:transparent; box-shadow:0 0 0 4px color-mix(in srgb,var(--primary) 14%,transparent); }
2501
2602
 
2502
2603
  /* TABELA DE DADOS — e só ela. Estas cinco regras eram de ELEMENTO (`table`, `th,td`, `th`,
2503
2604
  `tr:last-child td`, `tbody tr:hover`) e valiam para toda <table> do documento, inclusive a de
@@ -2530,7 +2631,7 @@ img,svg { display:block; }
2530
2631
  .table,.table-wrap table { width:100%; border-collapse:separate; border-spacing:0; min-width:720px; font-size:var(--text-sm); }
2531
2632
  /* GAR-16 (0.28.0): a tabela inteira com algarismos da mesma largura — a coluna de preço e de ano
2532
2633
  alinha. Só os algarismos mudam; o texto das outras colunas fica igual. */
2533
- .table th,.table td,.table-wrap th,.table-wrap td { padding:calc((var(--row-h) - var(--space-5)) / 2 - var(--space-05)) var(--space-4); text-align:start; line-height:var(--space-5); border-bottom:var(--border-width) solid color-mix(in oklab,var(--border) 50%,transparent); font-variant-numeric:tabular-nums; }
2634
+ .table th,.table td,.table-wrap th,.table-wrap td { padding:calc((var(--row-h) - var(--space-5)) / 2 - var(--space-05)) var(--space-4); text-align:start; line-height:var(--space-5); border-bottom:var(--border-width) solid transparent; font-variant-numeric:tabular-nums; }
2534
2635
  /* O título da tabela (`caption`) mora na moldura, em cima do cabeçalho, alinhado ao texto das colunas
2535
2636
  (sem regra, o navegador o centralizava). */
2536
2637
  .table > caption,.table-wrap table > caption { padding:var(--space-3) var(--space-4) var(--space-1); color:var(--foreground); font-size:var(--text-sm); font-weight:var(--weight-medium); line-height:var(--space-5); text-align:start; }
@@ -2596,7 +2697,7 @@ img,svg { display:block; }
2596
2697
  /* 0.32.0: a escala da referência, 32 · 40 · 48, com a letra de 12 · 14 · 16 em peso médio (era a
2597
2698
  altura do botão, 32 · 36 · 40, e negrito). `--step-avatar` é a variável de passo própria do avatar
2598
2699
  (a camada responsiva a emite junto das outras). */
2599
- .avatar { width:var(--step-avatar,var(--space-10)); height:var(--step-avatar,var(--space-10)); font-size:var(--step-avatar-fs,var(--text-sm)); display:grid; place-items:center; overflow:hidden; border-radius:50%; background:var(--surface-3); color:var(--foreground); border:1px solid var(--border-strong); font-weight:var(--weight-medium); }
2700
+ .avatar { width:var(--step-avatar,var(--space-10)); height:var(--step-avatar,var(--space-10)); font-size:var(--step-avatar-fs,var(--text-sm)); display:grid; place-items:center; overflow:hidden; border-radius:50%; background:var(--surface-3); color:var(--foreground); border:1px solid transparent; font-weight:var(--weight-medium); }
2600
2701
  .avatar-sm { --step-avatar:var(--space-8); --step-avatar-fs:var(--text-xs); }
2601
2702
  .avatar-lg { --step-avatar:var(--space-12); --step-avatar-fs:var(--text-base); }
2602
2703
  /* tone e emphasis="soft" (15/10/2026), o `color` e o `soft` do avatar da referência: o tom pinta a letra ou o ícone (o par
@@ -2624,14 +2725,14 @@ img,svg { display:block; }
2624
2725
  /* COLORSWATCH (0.32.0): a amostra de cor da referência — xs 16, sm 24, md 32, lg 36, xl 40 —, só redonda
2625
2726
  e sem o xadrez (decisão do Victor). O anel de 1 por dentro, a 10% da cor do texto, segura a amostra da
2626
2727
  cor do fundo no fundo. */
2627
- .color-swatch { --color-swatch-size:var(--space-8); display:inline-block; flex:none; inline-size:var(--color-swatch-size); block-size:var(--color-swatch-size); border-radius:var(--radius-full); background:var(--color-swatch-current,transparent); box-shadow:inset 0 0 0 var(--border-width) color-mix(in oklab,var(--foreground) 10%,transparent); }
2728
+ .color-swatch { --color-swatch-size:var(--space-8); display:inline-block; flex:none; inline-size:var(--color-swatch-size); block-size:var(--color-swatch-size); border-radius:var(--radius-full); background:var(--color-swatch-current,transparent); box-shadow:var(--shadow-sm); }
2628
2729
  .color-swatch-xs { --color-swatch-size:var(--space-4); }
2629
2730
  .color-swatch-sm { --color-swatch-size:var(--space-6); }
2630
2731
  .color-swatch-lg { --color-swatch-size:calc(var(--space-8) + var(--space-1)); }
2631
2732
  .color-swatch-xl { --color-swatch-size:var(--space-10); }
2632
2733
  /* A amostra TRANSPARENTE (14/10/2026): o xadrez embaixo, e a cor por uma sombra por dentro (a sombra pinta POR CIMA
2633
2734
  do fundo; a cor de fundo pintaria por baixo do xadrez). O anel de 1 continua por cima de tudo. */
2634
- .color-swatch-alpha { background:var(--color-checker) center/var(--space-2) var(--space-2); box-shadow:inset 0 0 0 var(--border-width) color-mix(in oklab,var(--foreground) 10%,transparent), inset 0 0 0 var(--color-swatch-size) var(--color-swatch-current,transparent); }
2735
+ .color-swatch-alpha { background:var(--color-checker) center/var(--space-2) var(--space-2); box-shadow:inset 0 0 0 var(--color-swatch-size) var(--color-swatch-current,transparent); }
2635
2736
  /* AS AMOSTRAS PARA ESCOLHER (0.32.0, ADR-0069): a variação `options` do ColorSwatch. Cada cor é um rótulo com um
2636
2737
  botão de opção nativo por cima, invisível (o navegador cuida da escolha e das setas). O desenho é o da
2637
2738
  referência (3.2.6): opção de 32 (os mesmos tamanhos da amostra), borda de 2 transparente, vão de 8; a escolhida
@@ -2642,7 +2743,7 @@ img,svg { display:block; }
2642
2743
  .color-swatch-option > .color-swatch { inline-size:100%; block-size:100%; transition:scale var(--duration-fast) var(--ease-standard); }
2643
2744
  .color-swatch-option::after { content:""; position:absolute; inset:0; margin:auto; inline-size:calc(var(--color-swatch-size) / 3); block-size:calc(var(--color-swatch-size) / 3); background:#fff; -webkit-mask:var(--swatch-glifo) center/contain no-repeat; mask:var(--swatch-glifo) center/contain no-repeat; scale:0; pointer-events:none; transition:scale var(--duration-fast) var(--ease-standard); }
2644
2745
  .color-swatch-option-dark::after { background:#000; }
2645
- .color-swatch-option:has(:checked) { border-color:var(--color-swatch-current,transparent); }
2746
+ .color-swatch-option:has(:checked) { border-color:transparent; }
2646
2747
  .color-swatch-option:has(:checked) > .color-swatch { scale:.77; }
2647
2748
  .color-swatch-option:has(:checked)::after { scale:1; }
2648
2749
  @media (hover:hover) { .color-swatch-option:not(:has(:checked,:disabled)):hover > .color-swatch { scale:1.1; } }
@@ -2713,7 +2814,7 @@ button.tag-main { cursor:pointer; }
2713
2814
  /* O container do grupo NUNCA teve regra: a sobreposição abaixo existia e os avatares empilhavam
2714
2815
  na vertical porque o pai saía `display:block`. Mesma falha do `.stepper` e do `.command`. */
2715
2816
  .avatar-group { display:inline-flex; align-items:center; }
2716
- .avatar-group .avatar { margin-inline-start:-9px; border:2px solid var(--surface-1); } .avatar-group .avatar:first-child { margin-inline-start:0; }
2817
+ .avatar-group .avatar { margin-inline-start:-9px; border:2px solid transparent; } .avatar-group .avatar:first-child { margin-inline-start:0; }
2717
2818
  /* O "+N" é um avatar como os outros — mesma caixa, mesma borda —, só que menor por dentro e sem
2718
2819
  peso de nome próprio: ele conta, não identifica. */
2719
2820
  .avatar-count { background:var(--secondary); color:var(--muted-foreground); font-size:var(--text-xs); font-weight:var(--weight-medium); }
@@ -2775,7 +2876,7 @@ button.tag-main { cursor:pointer; }
2775
2876
  "Shipped14:20". Geometria de componente não depende do conteúdo (achados A2/A3). */
2776
2877
  .timeline > li > div { display:flex; flex-direction:column; gap:var(--space-05); min-width:0; }
2777
2878
  .timeline > li > div > p { margin:0; }
2778
- .timeline-dot { flex:none; width:var(--space-3); height:var(--space-3); border-radius:var(--radius-full); margin-block-start:var(--space-1); background:var(--primary); box-shadow:0 0 0 var(--space-05) var(--surface-1); }
2879
+ .timeline-dot { flex:none; width:var(--space-3); height:var(--space-3); border-radius:var(--radius-full); margin-block-start:var(--space-1); background:var(--primary); box-shadow:none; }
2779
2880
  /* ACCORDION (0.32.0) — o da referência, com o realce em CÁPSULA (decisão do Victor, 11/10/2026). Sem
2780
2881
  caixa em volta: um fio de 1 entre os itens, nenhum depois do último. A pergunta: 16 de todos os
2781
2882
  lados, 14 peso médio, a seta de 16 no FIM (esmaecida), que vira −180° ao abrir — o marcador do
@@ -2814,7 +2915,7 @@ button.tag-main { cursor:pointer; }
2814
2915
  Três degraus e não um número livre: o número livre era o que obrigava pixel cru no
2815
2916
  consumidor. Quem precisar de um QR de cartaz sobrescreve --qr-size, que é o mesmo caminho
2816
2917
  já documentado para trocar a cor dos módulos. */
2817
- .qrcode { --qr-module:#0b0b0c; --qr-quiet:#fff; --qr-size:var(--step-qr,10rem); box-sizing:border-box; width:var(--qr-size); height:var(--qr-size); padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--qr-quiet); }
2918
+ .qrcode { --qr-module:#0b0b0c; --qr-quiet:#fff; --qr-size:var(--step-qr,10rem); box-sizing:border-box; width:var(--qr-size); height:var(--qr-size); padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--qr-quiet); }
2818
2919
  .qrcode-sm { --step-qr:7.5rem; }
2819
2920
  .qrcode-lg { --step-qr:15rem; }
2820
2921
  .qrcode .qr-mod { fill:var(--qr-module); }
@@ -2823,7 +2924,7 @@ button.tag-main { cursor:pointer; }
2823
2924
  /* `overflow:auto` faz do <pre> uma REGIÃO ROLÁVEL, e região rolável sem nada focável dentro
2824
2925
  é inalcançável por teclado (axe scrollable-region-focusable). Quem escreve esta marcação à
2825
2926
  mão precisa de `tabindex="0"` no <pre> — o componente React já o emite. */
2826
- .code-block { overflow:auto; padding:16px; border:1px solid var(--border); border-radius:var(--radius-lg); background:var(--surface-inset); color:var(--muted-foreground); font:12px/1.7 var(--font-code); }
2927
+ .code-block { overflow:auto; padding:16px; border:1px solid transparent; border-radius:var(--radius-lg); background:var(--surface-inset); color:var(--muted-foreground); font:12px/1.7 var(--font-code); }
2827
2928
  /* Bloco de código COM copiar: a moldura não rola, o <pre> rola por dentro e o gatilho fica
2828
2929
  parado no canto. O comportamento é do core (aurea.js, [data-aurea-copy]); aqui só a pele.
2829
2930
  O check em amarelo é confirmação instantânea — dura 1,5s e volta ao ícone de copiar. */
@@ -2838,7 +2939,7 @@ button.tag-main { cursor:pointer; }
2838
2939
  no fundo afundado, centrada, e o código sem moldura (o cartão já é a moldura). A altura é do conteúdo;
2839
2940
  o site fixa a dele (`--demo-height`). */
2840
2941
  .code-preview { display:flex; flex-direction:column; block-size:var(--demo-height,auto); padding:0; overflow:hidden; }
2841
- .demo-tabs { display:flex; padding:var(--space-2); border-bottom:var(--border-width) solid var(--border); }
2942
+ .demo-tabs { display:flex; padding:var(--space-2); border-bottom:var(--border-width) solid transparent; }
2842
2943
  .demo-tabs .segmented { flex:1; display:flex; }
2843
2944
  .demo-tabs .segmented button { flex:1; }
2844
2945
  .demo-panel { flex:1; min-height:0; overflow:auto; padding:var(--space-6); }
@@ -2860,16 +2961,21 @@ button.tag-main { cursor:pointer; }
2860
2961
  não passar a depender do arquivo de ícones. Era 11, em maiúsculas espaçadas. */
2861
2962
  .toc-label { display:flex; align-items:center; gap:var(--space-2); margin:0 0 var(--space-1); padding-inline:var(--space-3); color:var(--muted-foreground); font-size:var(--text-sm); }
2862
2963
  .toc-label-icon { --toc-glifo:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M32,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H40A8,8,0,0,1,32,64Zm8,48H168a8,8,0,0,0,0-16H40a8,8,0,0,0,0,16Zm176,24H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm-48,40H40a8,8,0,0,0,0,16H168a8,8,0,0,0,0-16Z'/%3E%3C/svg%3E"); flex:none; inline-size:var(--icon-sm); block-size:var(--icon-sm); background:currentColor; -webkit-mask:var(--toc-glifo) center/contain no-repeat; mask:var(--toc-glifo) center/contain no-repeat; }
2863
- .toc a { padding:var(--space-1) var(--space-3); border-inline-start:2px solid var(--border); color:var(--muted-foreground); font-size:var(--text-sm); text-decoration:none; }
2964
+ .toc a { padding:var(--space-1) var(--space-3); border-inline-start:2px solid transparent; color:var(--muted-foreground); font-size:var(--text-sm); text-decoration:none; }
2864
2965
  .toc a:hover { color:var(--foreground); }
2865
- .toc a[aria-current] { border-inline-start-color:var(--primary); color:var(--foreground); }
2966
+ .toc a[aria-current] { border-inline-start-color:transparent; color:var(--foreground); }
2967
+ /* O marcador do item ATUAL não é contorno: é o indicador, como o das abas (ADR-0072, item 5). Era a borda de um lado,
2968
+ que saiu junto com as linhas, e o item atual ficou só com a cor do texto. Volta como desenho cheio, no lugar da
2969
+ borda (que continua, transparente) e com a medida dela (2). Quem cobra: `tests/visual/indicador-atual.spec.ts`. */
2970
+ .toc a { position:relative; }
2971
+ .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); }
2866
2972
  .toc a.toc-sub { padding-inline-start:var(--space-6); }
2867
2973
  /* `--log-h` é a QUINTA válvula de altura do core, no idioma de `--chart-h` (I4), `--qr-size` (B6),
2868
2974
  `--datagrid-max-h` (F6) e `--media-h` (I7). Default 240px — o de antes —, então nada muda para
2869
2975
  quem não passa nada. A causa é medida em 11/08/2026: a altura era FIXA, e por isso três prévias
2870
2976
  do catálogo gastavam 240px para mostrar três linhas de log e rolavam dentro da caixa de
2871
2977
  demonstração, contra a ADR-0002. Altura é decisão da página, e não vira prop (check 23). */
2872
- .log-stream { height:var(--log-h,240px); overflow:auto; padding:14px; border:1px solid var(--border); border-radius:var(--radius-md); background:var(--surface-inset); font:12px/1.65 var(--font-code); }
2978
+ .log-stream { height:var(--log-h,240px); overflow:auto; padding:14px; border:1px solid transparent; border-radius:var(--radius-md); background:var(--surface-inset); font:12px/1.65 var(--font-code); }
2873
2979
  /* UM MECANISMO SÓ para o nível, e o merge de 28/08/2026 é o que permitiu escolher.
2874
2980
  Havia dois: o valor como MODIFICADOR do `.log-level`, e três regras DESCENDENTES pintadas a
2875
2981
  partir de uma classe no container (`.log-warn .log-level`). O comentário que justificava as
@@ -2921,7 +3027,7 @@ button.tag-main { cursor:pointer; }
2921
3027
  atributo não é classe. Estado medido em 01/08/2026: data-selected, data-today, data-outside,
2922
3028
  data-disabled e data-hidden — este último é obrigatório, senão o dia escondido das pontas
2923
3029
  APARECE (o motor conta com o CSS dele para escondê-lo, e nós não importamos o CSS dele). */
2924
- .calendar { display:inline-block; padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--surface-1); }
3030
+ .calendar { display:inline-block; padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--surface-1); }
2925
3031
  .calendar-months { position:relative; }
2926
3032
  /* 0.32.0, o calendário da referência, lido no CSS publicado dela: o mês no COMEÇO, em 14 peso médio, e as
2927
3033
  duas setas juntas no FIM, botões de 24 na cor de letra da marca; 16 até a grade; o nome do dia em 12
@@ -2966,7 +3072,7 @@ button.tag-main { cursor:pointer; }
2966
3072
  .message-composer:has(.message-composer-context) { align-items:flex-end; }
2967
3073
  .message-composer-context { flex-direction:column; align-items:stretch; gap:var(--space-2); color:var(--foreground); }
2968
3074
  .message-composer-context > .file-list { margin:0; }
2969
- .message-quote { display:flex; align-items:center; gap:var(--space-2); padding-inline-start:var(--space-3); border-inline-start:calc(var(--border-width) * 2) solid var(--border-strong); color:var(--muted-foreground); font-size:var(--text-sm); }
3075
+ .message-quote { display:flex; align-items:center; gap:var(--space-2); padding-inline-start:var(--space-3); border-inline-start:calc(var(--border-width) * 2) solid transparent; color:var(--muted-foreground); font-size:var(--text-sm); }
2970
3076
  .message-quote > .icon { flex:none; }
2971
3077
  .message-quote-text { display:grid; flex:1; min-inline-size:0; }
2972
3078
  .message-quote-title { color:var(--foreground); font-weight:var(--weight-medium); }
@@ -3008,7 +3114,7 @@ button.tag-main { cursor:pointer; }
3008
3114
  player é quase preto nos DOIS temas (`--media-canvas`), e o `--focus-strong` do tema claro é
3009
3115
  escuro: o foco dos controles sumia no tema claro. Redefinir o token aqui conserta todos os
3010
3116
  controles de uma vez e deixa a linha de foco (espessura, afastamento) com a regra global. */
3011
- .media-player { --focus-strong:var(--primary); position:relative; isolation:isolate; overflow:hidden; min-height:var(--media-h,360px); aspect-ratio:var(--media-ar,16/9); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--media-canvas); color:var(--media-foreground); }
3117
+ .media-player { --focus-strong:var(--primary); position:relative; isolation:isolate; overflow:hidden; min-height:var(--media-h,360px); aspect-ratio:var(--media-ar,16/9); border:1px solid transparent; border-radius:var(--radius-card); background:var(--media-canvas); color:var(--media-foreground); }
3012
3118
  .media-viewport { position:absolute; inset:0; display:grid; place-items:center; background:var(--media-canvas); }
3013
3119
  .media-fill { width:100%; height:100%; object-fit:contain; } /* vídeo React preenche o viewport (auditoria 18/07, M14) */
3014
3120
  .media-placeholder { display:grid; place-items:center; gap:10px; color:var(--media-muted); text-align:center; }
@@ -3016,7 +3122,7 @@ button.tag-main { cursor:pointer; }
3016
3122
  .media-placeholder strong { color:var(--media-foreground); }
3017
3123
  .media-overlay-title { position:absolute; top:16px; inset-inline:16px; z-index:2; display:flex; align-items:flex-start; justify-content:space-between; gap:16px; color:var(--media-foreground); }
3018
3124
  .media-overlay-title>div>span { display:block; color:var(--media-muted); font-size:var(--text-xs); }
3019
- .media-player .badge { border-color:var(--media-track); background:var(--media-track); color:var(--media-foreground); }
3125
+ .media-player .badge { border-color:transparent; background:var(--media-track); color:var(--media-foreground); }
3020
3126
  .media-controls { position:absolute; inset:auto 0 0; z-index:3; display:grid; gap:8px; padding:12px; background:var(--media-scrim); color:var(--media-foreground); }
3021
3127
  .media-seek { --media-played:34%; position:relative; height:20px; display:flex; align-items:center; }
3022
3128
  .media-seek-track { position:absolute; inset-inline:0; height:4px; overflow:hidden; border-radius:var(--radius-full); background:var(--media-track); pointer-events:none; }
@@ -3025,9 +3131,9 @@ button.tag-main { cursor:pointer; }
3025
3131
  .media-seek-played { width:var(--media-played); background:var(--primary); }
3026
3132
  .media-seek input { position:relative; z-index:1; width:100%; height:20px; margin:0; appearance:none; background:transparent; cursor:pointer; }
3027
3133
  .media-seek input::-webkit-slider-runnable-track { height:4px; background:transparent; }
3028
- .media-seek input::-webkit-slider-thumb { width:14px; height:14px; margin-top:-5px; appearance:none; border:2px solid var(--media-foreground); border-radius:50%; background:var(--primary); }
3134
+ .media-seek input::-webkit-slider-thumb { width:14px; height:14px; margin-top:-5px; appearance:none; border:2px solid transparent; border-radius:50%; background:var(--primary); }
3029
3135
  .media-seek input::-moz-range-track { height:4px; background:transparent; }
3030
- .media-seek input::-moz-range-thumb { width:12px; height:12px; border:2px solid var(--media-foreground); border-radius:50%; background:var(--primary); }
3136
+ .media-seek input::-moz-range-thumb { width:12px; height:12px; border:2px solid transparent; border-radius:50%; background:var(--primary); }
3031
3137
  .media-seek input:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); box-shadow:none; }
3032
3138
  .media-control-row,.media-control-group { display:flex; align-items:center; gap:4px; }
3033
3139
  .media-control-row { min-width:0; justify-content:space-between; }
@@ -3057,7 +3163,7 @@ button.tag-main { cursor:pointer; }
3057
3163
  e a Aurea não leva marca de terceiro. A moldura segue o tema (a superfície do cartão, a borda e a
3058
3164
  sombra de sempre) e o canto é o da folha de baixo, o maior que a Aurea tem; o de dentro acompanha. */
3059
3165
  .image-frame { display:block; }
3060
- .image-frame-phone { padding:var(--space-2); border:var(--border-width) solid var(--border); border-radius:var(--radius-sheet); background:var(--card); box-shadow:var(--shadow-md); }
3166
+ .image-frame-phone { padding:var(--space-2); border:var(--border-width) solid transparent; border-radius:var(--radius-sheet); background:var(--card); box-shadow:var(--shadow-md); }
3061
3167
  .image-frame-phone > .image { aspect-ratio:9 / 19.5; object-position:top; border-radius:calc(var(--radius-sheet) - var(--space-2)); }
3062
3168
  /* A captura de cada tema (`srcDark`). Sem `data-theme` na página, vale a clara. A guarda é a do
3063
3169
  GAR-05 espelhada: uma faixa CLARA dentro da página escura volta a mostrar a captura clara. */
@@ -3075,7 +3181,7 @@ button.tag-main { cursor:pointer; }
3075
3181
  `--media-scrim` em volta dela não é enfeite: a capa é do consumidor, e numa capa amarela a
3076
3182
  pastilha sumia — medido na primeira imagem mostrada ao Victor, em 24/09/2026. */
3077
3183
  .media-embed { display:grid; gap:var(--space-2); min-inline-size:0; }
3078
- .media-embed-frame { position:relative; overflow:hidden; border:1px solid var(--border); border-radius:var(--radius-card); background:var(--media-canvas); }
3184
+ .media-embed-frame { position:relative; overflow:hidden; border:1px solid transparent; border-radius:var(--radius-card); background:var(--media-canvas); }
3079
3185
  .media-embed-frame>iframe { position:absolute; inset:0; inline-size:100%; block-size:100%; border:0; }
3080
3186
  .media-embed-facade { position:absolute; inset:0; display:grid; place-items:center; padding:0; border:0; border-radius:inherit; background:var(--media-canvas); color:var(--media-foreground); cursor:pointer; }
3081
3187
  .media-embed-facade>img { position:absolute; inset:0; inline-size:100%; block-size:100%; object-fit:cover; }
@@ -3116,7 +3222,7 @@ button.tag-main { cursor:pointer; }
3116
3222
  ela que o observador vigia, então existe também parada, sem a rodinha. A do `MessageList` (AN-02),
3117
3223
  nas duas pontas da conversa, é a mesma linha. */
3118
3224
  .gallery-media { position:relative; display:block; }
3119
- .gallery-media > .gallery-duration { position:absolute; inset-block-end:var(--space-2); inset-inline-end:var(--space-2); border-color:var(--media-scrim); background:var(--media-scrim); color:var(--media-foreground); }
3225
+ .gallery-media > .gallery-duration { position:absolute; inset-block-end:var(--space-2); inset-inline-end:var(--space-2); border-color:transparent; background:var(--media-scrim); color:var(--media-foreground); }
3120
3226
  .gallery-more,.message-more { display:flex; align-items:center; justify-content:center; min-block-size:var(--icon-sm); padding-block:var(--space-3); color:var(--muted-foreground); }
3121
3227
 
3122
3228
  /* TIPOGRAFIA (B-02, 25/09/2026) — `Text`, `Heading`, `Paragraph` e `Code`, no molde da
@@ -3190,23 +3296,23 @@ button.tag-main { cursor:pointer; }
3190
3296
  .prose h2 { font-size:var(--text-2xl); line-height:var(--text-2xl-leading); }
3191
3297
  .prose h3 { font-size:var(--text-xl); line-height:var(--text-xl-leading); }
3192
3298
  .prose h4 { font-size:var(--text-lg); line-height:var(--text-lg-leading); }
3193
- .prose blockquote { margin-inline:0; padding-inline-start:var(--space-4); border-inline-start:2px solid var(--border-strong); color:var(--muted-foreground); }
3299
+ .prose blockquote { margin-inline:0; padding-inline-start:var(--space-4); border-inline-start:2px solid transparent; color:var(--muted-foreground); }
3194
3300
  .prose ul,.prose ol { padding-inline-start:var(--space-6); }
3195
3301
  .prose li + li { margin-block-start:var(--space-2); }
3196
3302
  /* `0.9em` e não um token: código dentro do texto se mede em relação à LINHA em que está, e um
3197
3303
  valor absoluto o deixaria maior que o parágrafo dentro de um h2. É o mesmo motivo pelo qual o
3198
3304
  `.badge` tem `line-height:1` — geometria que depende do contexto se escreve relativa. */
3199
3305
  .prose code { padding:var(--space-05) var(--space-1); border-radius:var(--radius-xs); background:var(--surface-2); font-family:var(--font-code); font-size:0.9em; }
3200
- .prose pre { overflow-x:auto; padding:var(--space-4); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--surface-2); }
3306
+ .prose pre { overflow-x:auto; padding:var(--space-4); border:1px solid transparent; border-radius:var(--radius-card); background:var(--surface-2); }
3201
3307
  .prose pre code { padding:0; border-radius:0; background:transparent; font-size:var(--text-sm); }
3202
3308
  .prose img { max-width:100%; height:auto; border-radius:var(--radius-lg); }
3203
- .prose hr { border:0; border-block-start:1px solid var(--border); }
3309
+ .prose hr { border:0; border-block-start:1px solid transparent; }
3204
3310
  .prose figcaption { color:var(--muted-foreground); font-size:var(--text-sm); }
3205
3311
  /* A tabela da prosa NÃO é a tabela de dados: sem `min-width:720px`, sem faixa de cabeçalho em
3206
3312
  caixa alta e sem hover de linha. Uma tabela de três colunas no meio de um artigo não é uma
3207
3313
  grade — forçá-la a 720px é exatamente o defeito que o calendário sofreu. */
3208
3314
  .prose table { width:100%; border-collapse:collapse; font-size:var(--text-sm); }
3209
- .prose th,.prose td { padding:var(--space-2) var(--space-3); text-align:start; border-block-end:1px solid var(--border); }
3315
+ .prose th,.prose td { padding:var(--space-2) var(--space-3); text-align:start; border-block-end:1px solid transparent; }
3210
3316
  .prose th { color:var(--subtle-foreground); font-weight:var(--weight-semibold); }
3211
3317
 
3212
3318
  /* LISTA ORDENÁVEL (PLANO-1.0, item L3). Duas regras aqui não são decoração e quebram
@@ -3218,8 +3324,8 @@ button.tag-main { cursor:pointer; }
3218
3324
  (WCAG 1.4.1), e não a cápsula de `.is-selected`: pego e escolhido são coisas diferentes e não
3219
3325
  podem falar a mesma língua. */
3220
3326
  .sortable-list { display:grid; gap:var(--space-2); margin:0; padding:0; list-style:none; }
3221
- .sortable-item { display:flex; align-items:center; gap:var(--space-2); padding:var(--space-2) var(--space-3); border:1px solid var(--border); border-radius:var(--radius-lg); background:var(--card); }
3222
- .sortable-item[data-grabbed] { border-color:var(--border-strong); box-shadow:var(--shadow-lg); }
3327
+ .sortable-item { display:flex; align-items:center; gap:var(--space-2); padding:var(--space-2) var(--space-3); border:1px solid transparent; border-radius:var(--radius-lg); background:var(--card); }
3328
+ .sortable-item[data-grabbed] { border-color:transparent; box-shadow:var(--shadow-lg); }
3223
3329
  .sortable-handle { display:grid; place-items:center; min-width:var(--space-6); min-height:var(--space-6); padding:0; border:0; border-radius:var(--radius-sm); background:transparent; color:var(--muted-foreground); cursor:grab; touch-action:none; }
3224
3330
  .sortable-handle[aria-pressed="true"] { cursor:grabbing; color:var(--primary); }
3225
3331
  .sortable-label { min-width:0; }
@@ -3239,8 +3345,8 @@ button.tag-main { cursor:pointer; }
3239
3345
  aparência nova. O bloco PEGO se marca com `data-grabbed`, e o sinal é ELEVAÇÃO e borda — não
3240
3346
  cor sozinha (WCAG 1.4.1). */
3241
3347
  .block-editor { display:grid; gap:var(--space-3); margin:0; padding:0; list-style:none; }
3242
- .block-item { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3); padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-lg); background:var(--card); }
3243
- .block-item[data-grabbed] { border-color:var(--border-strong); box-shadow:var(--shadow-lg); }
3348
+ .block-item { display:grid; grid-template-columns:auto minmax(0,1fr); gap:var(--space-3); padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-lg); background:var(--card); }
3349
+ .block-item[data-grabbed] { border-color:transparent; box-shadow:var(--shadow-lg); }
3244
3350
  .block-rail { display:grid; grid-auto-rows:min-content; gap:var(--space-1); }
3245
3351
  .block-handle,.block-remove { display:grid; place-items:center; min-width:var(--space-6); min-height:var(--space-6); padding:0; border:0; border-radius:var(--radius-sm); background:transparent; color:var(--muted-foreground); }
3246
3352
  .block-handle { cursor:grab; touch-action:none; }
@@ -3277,8 +3383,8 @@ button.tag-main { cursor:pointer; }
3277
3383
  .icon-search { max-width:420px; }
3278
3384
  .icon-category { margin-top:26px; } .icon-category h3 { margin:0 0 12px; font-size:var(--text-base); }
3279
3385
  .icon-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(150px,1fr)); gap:8px; }
3280
- .icon-tile { min-height:86px; display:flex; flex-direction:column; align-items:flex-start; justify-content:space-between; gap:12px; padding:13px; border:1px solid var(--border); border-radius:var(--radius-lg); background:var(--secondary); color:var(--muted-foreground); cursor:pointer; text-align:start; transition:transform var(--duration-fast) var(--ease-standard),border-color var(--duration-fast),color var(--duration-fast); }
3281
- @media (hover:hover) and (pointer:fine) { .icon-tile:hover { color:var(--foreground); border-color:var(--primary); transform:translateY(-1px); } } .icon-tile:focus-visible { color:var(--foreground); border-color:var(--primary); } .icon-tile span { overflow:hidden; max-width:100%; text-overflow:ellipsis; white-space:nowrap; font:11px var(--font-code); }
3386
+ .icon-tile { min-height:86px; display:flex; flex-direction:column; align-items:flex-start; justify-content:space-between; gap:12px; padding:13px; border:1px solid transparent; border-radius:var(--radius-lg); background:var(--secondary); color:var(--muted-foreground); cursor:pointer; text-align:start; transition:transform var(--duration-fast) var(--ease-standard),border-color var(--duration-fast),color var(--duration-fast); }
3387
+ @media (hover:hover) and (pointer:fine) { .icon-tile:hover { color:var(--foreground); border-color:transparent; transform:translateY(-1px); } } .icon-tile:focus-visible { color:var(--foreground); border-color:transparent; } .icon-tile span { overflow:hidden; max-width:100%; text-overflow:ellipsis; white-space:nowrap; font:11px var(--font-code); }
3282
3388
  /* JANELAS (0.32.0): o Dialog, o ConfirmDialog e o Drawer com a anatomia da referência, lida no CSS
3283
3389
  PUBLICADO dela — recheio de 24; o X a 16 do topo e do fim; o cabeçalho em coluna (o ícone num círculo
3284
3390
  de 40 em cima, 12 até o título de 16, peso médio); o corpo de 14/20 esmaecido, que é o que rola; 8
@@ -3289,7 +3395,7 @@ button.tag-main { cursor:pointer; }
3289
3395
  .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); }
3290
3396
  .dialog-backdrop[data-starting-style],.dialog-backdrop[data-ending-style] { opacity:0; }
3291
3397
  .dialog-backdrop[data-ending-style] { transition-duration:var(--duration-fast); }
3292
- .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 var(--border); 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); }
3398
+ .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); }
3293
3399
  .dialog[data-starting-style] { opacity:0; scale:1.05; }
3294
3400
  .dialog[data-ending-style] { opacity:0; scale:.95; transition-duration:var(--duration-fast); }
3295
3401
  @media (min-width:640px) { .dialog { --dialog-margin:var(--space-10); } }
@@ -3341,7 +3447,7 @@ button.tag-main { cursor:pointer; }
3341
3447
  .drawer-backdrop[data-starting-style],.drawer-backdrop[data-ending-style] { opacity:0; }
3342
3448
  .drawer-backdrop[data-swiping] { transition-duration:0ms; }
3343
3449
  .drawer-viewport { position:fixed; inset:0; z-index:var(--z-drawer); }
3344
- .drawer { position:fixed; z-index:var(--z-drawer); display:flex; flex-direction:column; padding:var(--space-6); border:0 solid var(--border); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); outline:none; overscroll-behavior:contain; transition:transform var(--duration-slow) var(--ease-emphasized); }
3450
+ .drawer { position:fixed; z-index:var(--z-drawer); display:flex; flex-direction:column; padding:var(--space-6); border:0 solid transparent; background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); outline:none; overscroll-behavior:contain; transition:transform var(--duration-slow) var(--ease-emphasized); }
3345
3451
  .drawer[data-swiping] { transition-duration:0ms; }
3346
3452
  .drawer[data-ending-style] { transition-duration:calc(var(--drawer-swipe-strength,1) * var(--duration-slow)); }
3347
3453
  .drawer-left,.drawer-right { top:0; bottom:0; inline-size:min(20rem,85vw); transform:translateX(var(--drawer-swipe-movement-x,0px)); }
@@ -3368,7 +3474,7 @@ button.tag-main { cursor:pointer; }
3368
3474
  .toast-stack:is(.toast-stack-top,.toast-stack-top-start,.toast-stack-top-end) { --toast-dir:1; inset-block:var(--space-4) auto; }
3369
3475
  .toast-stack:is(.toast-stack-bottom-start,.toast-stack-top-start) { inset-inline:var(--space-4) auto; margin-inline:0; }
3370
3476
  .toast-stack:is(.toast-stack-bottom-end,.toast-stack-top-end) { inset-inline:auto var(--space-4); margin-inline:0; }
3371
- .toast { position:absolute; inset-inline:0; bottom:0; z-index:calc(1000 - var(--toast-index,0)); box-sizing:border-box; block-size:var(--toast-frontmost-height,var(--toast-height,auto)); padding:var(--space-3) var(--space-4); border:var(--border-width) solid var(--border); border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-md); user-select:none; transform-origin:50% 100%; transform:translateX(var(--toast-swipe-movement-x,0px)) translateY(calc(var(--toast-swipe-movement-y,0px) + var(--toast-dir) * var(--toast-index,0) * var(--toast-gap))) scale(calc(1 - var(--toast-index,0) * .05)); transition:transform var(--duration-slow) var(--ease-emphasized),opacity var(--duration-slow) var(--ease-standard),block-size var(--duration-fast) var(--ease-standard); }
3477
+ .toast { position:absolute; inset-inline:0; bottom:0; z-index:calc(1000 - var(--toast-index,0)); box-sizing:border-box; block-size:var(--toast-frontmost-height,var(--toast-height,auto)); padding:var(--space-3) var(--space-4); border:var(--border-width) solid transparent; border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-md); user-select:none; transform-origin:50% 100%; transform:translateX(var(--toast-swipe-movement-x,0px)) translateY(calc(var(--toast-swipe-movement-y,0px) + var(--toast-dir) * var(--toast-index,0) * var(--toast-gap))) scale(calc(1 - var(--toast-index,0) * .05)); transition:transform var(--duration-slow) var(--ease-emphasized),opacity var(--duration-slow) var(--ease-standard),block-size var(--duration-fast) var(--ease-standard); }
3372
3478
  .toast-stack:is(.toast-stack-top,.toast-stack-top-start,.toast-stack-top-end) .toast { top:0; bottom:auto; transform-origin:50% 0; }
3373
3479
  .toast[data-expanded] { block-size:var(--toast-height,auto); transform:translateX(var(--toast-swipe-movement-x,0px)) translateY(calc(var(--toast-swipe-movement-y,0px) + var(--toast-dir) * (var(--toast-offset-y,0px) + var(--toast-index,0) * var(--toast-gap)))); }
3374
3480
  .toast[data-starting-style],.toast[data-ending-style] { transform:translateY(calc(-1 * var(--toast-dir) * 150%)); }
@@ -3399,7 +3505,7 @@ button.tag-main { cursor:pointer; }
3399
3505
  .toast-danger :is(.toast-indicator,.toast-title) { color:var(--danger-400); }
3400
3506
  /* O X do aviso: o `CloseButton` de 20 com o X de 12, na quina, com borda. Aparece com o mouse ou o
3401
3507
  foco no aviso da frente (ou na pilha aberta); no toque, fica sempre à vista. */
3402
- .toast-close.close-button { position:absolute; inset-block-start:calc(-1 * var(--space-1)); inset-inline-end:calc(-1 * var(--space-1)); inline-size:var(--space-5); block-size:var(--space-5); border:var(--border-width) solid var(--border); background:var(--popover); opacity:0; pointer-events:none; transition:opacity var(--duration-fast) var(--ease-standard); }
3508
+ .toast-close.close-button { position:absolute; inset-block-start:calc(-1 * var(--space-1)); inset-inline-end:calc(-1 * var(--space-1)); inline-size:var(--space-5); block-size:var(--space-5); border:var(--border-width) solid transparent; background:var(--popover); opacity:0; pointer-events:none; transition:opacity var(--duration-fast) var(--ease-standard); }
3403
3509
  .toast-close.close-button .icon { --step-icon:var(--space-3); }
3404
3510
  :is(.toast[data-expanded],.toast:has(> .toast-content:not([data-behind]))):is(:hover,:focus-within) > .toast-close { opacity:1; pointer-events:auto; }
3405
3511
  @media (hover:none) { :is(.toast[data-expanded],.toast:has(> .toast-content:not([data-behind]))) > .toast-close { opacity:1; pointer-events:auto; } }
@@ -3408,10 +3514,10 @@ button.tag-main { cursor:pointer; }
3408
3514
  mostra. Tem a medida do botão (a altura, o recheio da regra de cima, a letra e a cápsula) e a pele
3409
3515
  do aviso de sempre. O ícone é desenho de máscara, como a seta do `KPI`: a mesma marcação serve ao
3410
3516
  React (o motor posiciona) e ao HTML puro (o `aurea.js` posiciona, com `.toast-anchored-fixed`). */
3411
- .toast-anchored { display:inline-flex; align-items:center; gap:var(--space-2); min-block-size:var(--step-h,var(--control-h-md)); max-inline-size:calc(100vw - 2 * var(--space-4)); padding-block:var(--space-1); border:var(--border-width) solid var(--border); border-radius:var(--radius-control); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-md); font-size:var(--step-fs,var(--text-sm)); font-weight:var(--weight-medium); line-height:var(--leading-tight); transition:opacity var(--duration-fast) var(--ease-standard); }
3517
+ .toast-anchored { display:inline-flex; align-items:center; gap:var(--space-2); min-block-size:var(--step-h,var(--control-h-md)); max-inline-size:calc(100vw - 2 * var(--space-4)); padding-block:var(--space-1); border:var(--border-width) solid transparent; border-radius:var(--radius-control); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-md); font-size:var(--step-fs,var(--text-sm)); font-weight:var(--weight-medium); line-height:var(--leading-tight); transition:opacity var(--duration-fast) var(--ease-standard); }
3412
3518
  .toast-anchored[data-starting-style],.toast-anchored[data-ending-style] { opacity:0; }
3413
3519
  .toast-anchored-icon { --toast-glifo:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M229.66,77.66l-128,128a8,8,0,0,1-11.32,0l-56-56a8,8,0,0,1,11.32-11.32L96,188.69,218.34,66.34a8,8,0,0,1,11.32,11.32Z'/%3E%3C/svg%3E"); flex:none; inline-size:var(--icon-sm); block-size:var(--icon-sm); background:currentColor; color:var(--success-400); -webkit-mask:var(--toast-glifo) center/contain no-repeat; mask:var(--toast-glifo) center/contain no-repeat; }
3414
- .toast-anchored-danger { border-color:color-mix(in srgb,var(--danger-400) 38%,var(--border)); background:var(--danger-bg); }
3520
+ .toast-anchored-danger { border-color:transparent; background:var(--danger-bg); }
3415
3521
  .toast-anchored-danger .toast-anchored-icon { --toast-glifo:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm-8-80V80a8,8,0,0,1,16,0v56a8,8,0,0,1-16,0Zm20,36a12,12,0,1,1-12-12A12,12,0,0,1,140,172Z'/%3E%3C/svg%3E"); color:var(--danger-400); }
3416
3522
  /* O erro leva o link logo abaixo do aviso, já selecionado, para a pessoa copiar com o teclado. */
3417
3523
  .toast-anchored-stack { display:flex; flex-direction:column; align-items:flex-start; gap:var(--space-2); inline-size:max-content; max-inline-size:calc(100vw - 2 * var(--space-4)); }
@@ -3432,17 +3538,17 @@ button.tag-main { cursor:pointer; }
3432
3538
  emite de verdade. Não-modal de propósito, como a gaveta do AppShell (ADR-0003): o foco não
3433
3539
  fica preso, então não declaramos modalidade que não entregamos. */
3434
3540
  .command-overlay { position:fixed; inset:0; z-index:var(--z-modal); display:grid; place-items:start center; padding:var(--space-16) var(--space-5) var(--space-5); background:var(--overlay); backdrop-filter:blur(5px); }
3435
- .command-palette { display:grid; gap:var(--space-2); width:min(680px,100%); max-height:100%; overflow:auto; padding:var(--space-4); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
3541
+ .command-palette { display:grid; gap:var(--space-2); width:min(680px,100%); max-height:100%; overflow:auto; padding:var(--space-4); border:1px solid transparent; border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
3436
3542
  /* Camadas flutuantes (Base UI): tooltip, popover, menu. z-modal para funcionarem sobre diálogos; empilhamento mútuo pela ordem do portal no DOM. */
3437
3543
  /* 0.32.0, a dica da referência: recheio de 8, letra de 12/16, até 320 de largura, o fundo das janelas
3438
3544
  (era o fundo afundado), e a palavra longa quebra onde precisar. O canto continua o 10 da Aurea (o
3439
3545
  dela é 12, que a nossa escala não tem). Entra crescendo de 0,9 e sai encolhendo; pelo teclado, e
3440
3546
  quando passa de uma dica para a vizinha, entra sem animação (`data-instant` do motor). */
3441
- .tooltip { z-index:var(--z-modal); max-inline-size:min(20rem,calc(100vw - 2 * var(--space-4))); padding:var(--space-2); border:var(--border-width) solid var(--border); border-radius:var(--radius-md); background:var(--popover); color:var(--popover-foreground); font-size:var(--text-xs); line-height:var(--space-4); overflow-wrap:anywhere; box-shadow:var(--shadow-md); transform-origin:var(--transform-origin,center); transition:opacity var(--duration-base) var(--ease-standard),scale var(--duration-base) var(--ease-standard); }
3547
+ .tooltip { z-index:var(--z-modal); max-inline-size:min(20rem,calc(100vw - 2 * var(--space-4))); padding:var(--space-2); border:var(--border-width) solid transparent; border-radius:var(--radius-md); background:var(--popover); color:var(--popover-foreground); font-size:var(--text-xs); line-height:var(--space-4); overflow-wrap:anywhere; box-shadow:var(--shadow-md); transform-origin:var(--transform-origin,center); transition:opacity var(--duration-base) var(--ease-standard),scale var(--duration-base) var(--ease-standard); }
3442
3548
  .tooltip[data-starting-style],.tooltip[data-ending-style],.popover[data-starting-style],.popover[data-ending-style] { opacity:0; scale:.9; }
3443
3549
  .tooltip[data-ending-style],.popover[data-ending-style] { transition-duration:var(--duration-fast); }
3444
3550
  .tooltip[data-instant] { transition:none; }
3445
- .popover { z-index:var(--z-modal); min-width:220px; max-width:min(360px,calc(100vw - 32px)); padding:16px; border:1px solid var(--border); border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); font-size:var(--text-sm); box-shadow:var(--shadow-lg); display:grid; gap:10px; transform-origin:var(--transform-origin,center); transition:opacity var(--duration-base) var(--ease-standard),scale var(--duration-base) var(--ease-standard); }
3551
+ .popover { z-index:var(--z-modal); min-width:220px; max-width:min(360px,calc(100vw - 32px)); padding:16px; border:1px solid transparent; border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); font-size:var(--text-sm); box-shadow:var(--shadow-lg); display:grid; gap:10px; transform-origin:var(--transform-origin,center); transition:opacity var(--duration-base) var(--ease-standard),scale var(--duration-base) var(--ease-standard); }
3446
3552
  .popover-title { font-weight:var(--weight-medium); }
3447
3553
  /* A SETA (0.32.0): o desenho é nosso — uma curva de 12 × 6 —, com o fundo da janela e a linha da borda,
3448
3554
  e ela entra 1 por cima da borda da janela para a linha dar a volta sem emenda. O motor põe a seta
@@ -3465,7 +3571,7 @@ button.tag-main { cursor:pointer; }
3465
3571
  continuar sendo CONTA e não número, o painel passa a ter as medidas da lateral: raio de cartão
3466
3572
  e `--space-1` de respiro. Vale para toda lista que usa `.menu`: Combobox, MultiCombobox,
3467
3573
  DropdownMenu, ContextMenu, Menubar e a lista da CommandPalette. */
3468
- .menu { --menu-px:10px; z-index:var(--z-modal); min-width:200px; max-width:min(320px,calc(100vw - 32px)); padding:var(--space-1); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
3574
+ .menu { --menu-px:10px; z-index:var(--z-modal); min-width:200px; max-width:min(320px,calc(100vw - 32px)); padding:var(--space-1); border:1px solid transparent; border-radius:var(--radius-card); background:var(--popover); color:var(--popover-foreground); box-shadow:var(--shadow-lg); }
3469
3575
  .menu-item { display:flex; align-items:center; gap:10px; width:100%; min-height:var(--control-h-md); padding:0 var(--menu-px,10px); border:0; border-radius:calc(var(--radius-card) - var(--space-1)); background:transparent; color:var(--foreground); font:inherit; text-align:start; text-decoration:none; cursor:pointer; }
3470
3576
  .menu-item[data-highlighted],.menu-item:hover:not([data-disabled]) { background:var(--surface-3); }
3471
3577
  /* Foco de TECLADO no item: a linha de foco, por dentro, porque a lista recorta o que passa da borda
@@ -3494,7 +3600,7 @@ button.tag-main { cursor:pointer; }
3494
3600
  .command-group-label { padding:calc(var(--space-1) + var(--space-05)) var(--menu-px, var(--space-3)) var(--space-1); color:var(--muted-foreground); font-size:var(--text-xs); font-weight:var(--weight-medium); }
3495
3601
  /* A linha de atalhos (DOC-07): a tecla da referência (o `Kbd`) com o que ela faz, 12 esmaecido,
3496
3602
  separada da lista por um fio. */
3497
- .command-shortcuts { display:flex; flex-wrap:wrap; gap:var(--space-4); margin:0; padding:var(--space-2) var(--space-1) 0; border-top:var(--border-width) solid var(--border); color:var(--muted-foreground); font-size:var(--text-xs); }
3603
+ .command-shortcuts { display:flex; flex-wrap:wrap; gap:var(--space-4); margin:0; padding:var(--space-2) var(--space-1) 0; border-top:var(--border-width) solid transparent; color:var(--muted-foreground); font-size:var(--text-xs); }
3498
3604
  .command-shortcuts > span { display:inline-flex; align-items:center; gap:var(--space-1); }
3499
3605
  .command-item { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:var(--space-3); align-items:center; }
3500
3606
  .command-item-label { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
@@ -3572,9 +3678,9 @@ button.tag-main { cursor:pointer; }
3572
3678
  check — é quem monta a lista sem o React que ficaria de novo com o rótulo na coluna de 16px. */
3573
3679
  .combobox-item > :last-child { grid-column:2; }
3574
3680
  /* MultiCombobox (Fase 4) — chips de multi-seleção + grupos. Espaçamento novo tokenizado. */
3575
- .combobox-multi { display:flex; align-items:center; gap:var(--space-2); width:100%; min-width:0; min-height:var(--control-h-md); padding:var(--space-1) var(--space-2); background:var(--field-bg); border:1px solid var(--border-strong); border-radius:var(--radius-control); transition:border-color var(--duration-fast); }
3576
- .combobox-multi:hover { border-color:var(--border); }
3577
- .combobox-multi:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:var(--focus-strong); }
3681
+ .combobox-multi { display:flex; align-items:center; gap:var(--space-2); width:100%; min-width:0; min-height:var(--control-h-md); padding:var(--space-1) var(--space-2); background:var(--field-bg); border:1px solid transparent; border-radius:var(--radius-control); transition:border-color var(--duration-fast); }
3682
+ .combobox-multi:hover { border-color:transparent; }
3683
+ .combobox-multi:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
3578
3684
  .combobox-multi>.combobox-actions { position:static; inset-inline-end:auto; }
3579
3685
  /* o campo de chips não é `.input`, então a regra de :disabled dos campos não o alcança. Quem
3580
3686
  marca aqui é o `data-disabled` que o Base UI põe no InputGroup a partir do estado da Root. */
@@ -3596,19 +3702,19 @@ button.tag-main { cursor:pointer; }
3596
3702
  só existe ENTRE seções — margem no bloco deixaria sobra solta no fim da lista. */
3597
3703
  /* E a linha entre elas (15/10/2026), a mesma da `ListBox`: 4, a linha, 4 — o `Select` com grupos e os dois `Combobox`. */
3598
3704
  .combobox-section + .combobox-section { margin-block-start:var(--space-1); }
3599
- .combobox-section + .combobox-section::before { content:""; display:block; border-block-start:var(--border-width) solid var(--border); margin:0 var(--space-2) var(--space-1); }
3705
+ .combobox-section + .combobox-section::before { content:""; display:block; border-block-start:var(--border-width) solid transparent; margin:0 var(--space-2) var(--space-1); }
3600
3706
  /* FileInput / DropZone (Fase 4) — só a UI de entrada; upload real é a Fase 5.
3601
3707
  A zona é um <label> em volta do <input> nativo: clique/foco/teclado de graça,
3602
3708
  o arrastar-soltar é reforço. Espaçamento novo tokenizado; superfície = card. */
3603
- .dropzone { display:flex; flex-direction:column; align-items:center; gap:var(--space-2); padding:var(--space-8) var(--space-6); text-align:center; color:var(--muted-foreground); background:var(--surface-inset); border:1px dashed var(--border-strong); border-radius:var(--radius-card); cursor:pointer; transition:border-color var(--duration-fast),background-color var(--duration-fast); }
3604
- .dropzone:hover { border-color:var(--border); }
3605
- .dropzone:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:var(--focus-strong); }
3606
- .dropzone[data-dragging="true"] { border-style:solid; border-color:var(--primary); background:var(--surface-2); }
3709
+ .dropzone { display:flex; flex-direction:column; align-items:center; gap:var(--space-2); padding:var(--space-8) var(--space-6); text-align:center; color:var(--muted-foreground); background:var(--surface-inset); border:1px dashed transparent; border-radius:var(--radius-card); cursor:pointer; transition:border-color var(--duration-fast),background-color var(--duration-fast); }
3710
+ .dropzone:hover { border-color:transparent; }
3711
+ .dropzone:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
3712
+ .dropzone[data-dragging="true"] { border-style:solid; border-color:transparent; background:var(--surface-2); }
3607
3713
  .dropzone strong { color:var(--foreground); }
3608
3714
  .dropzone-icon { color:var(--primary); }
3609
3715
  .dropzone-hint { font-size:var(--text-xs); }
3610
3716
  .file-list { display:flex; flex-direction:column; gap:var(--space-2); margin-top:var(--space-3); padding:0; list-style:none; }
3611
- .file-item { display:flex; align-items:center; gap:var(--space-3); padding:var(--space-2) var(--space-3); background:var(--surface-2); border:1px solid var(--border); border-radius:var(--radius-md); }
3717
+ .file-item { display:flex; align-items:center; gap:var(--space-3); padding:var(--space-2) var(--space-3); background:var(--surface-2); border:1px solid transparent; border-radius:var(--radius-md); }
3612
3718
  .file-progress { flex-basis:var(--space-20); flex-shrink:0; } /* largura fixa da barra de upload (auditoria 18/07, M14) */
3613
3719
  .file-name { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
3614
3720
  .file-size { flex:none; color:var(--muted-foreground); font-size:var(--text-xs); font-variant-numeric:tabular-nums; }
@@ -3670,8 +3776,10 @@ button.tag-main { cursor:pointer; }
3670
3776
  .combobox-multi:has([aria-invalid="true"]),
3671
3777
  .combobox-multi:has(:user-invalid),
3672
3778
  .dropzone:has([aria-invalid="true"]),
3673
- .dropzone:has(:user-invalid) { border-color:var(--danger-400); --focus-strong:var(--danger-400); }
3674
- /* ↑ `--focus-strong` (ADR-0059, 08/10/2026): o anel de foco agora COLA na borda e a pinta — com o
3779
+ .dropzone:has(:user-invalid) { border-color:transparent; background-color:var(--danger-bg); --focus-strong:var(--danger-400); }
3780
+ /* ↑ Sem linha (16/10/2026, o Victor: "quero tudo sem borda sem exceções"): o inválido era a borda vermelha; sem
3781
+ borda, ele é o FUNDO de perigo (`--danger-bg`), o mesmo dos avisos. A frase de erro do `Field` continua embaixo.
3782
+ `--focus-strong` (ADR-0059, 08/10/2026): o anel de foco agora COLA na borda e a pinta — com o
3675
3783
  amarelo, o campo inválido perdia o vermelho justo enquanto a pessoa corrige. No inválido o anel é
3676
3784
  da cor do perigo, como o campo inválido da referência principal. Cor por contexto se faz assim,
3677
3785
  redefinindo `--focus-strong` (check 44). */
@@ -3718,7 +3826,7 @@ button.tag-main { cursor:pointer; }
3718
3826
  .notification-trigger { position:relative; display:inline-flex; }
3719
3827
  .notification-count { position:absolute; inset-block-start:-4px; inset-inline-end:-4px; display:inline-flex; align-items:center; justify-content:center; min-width:18px; height:18px; padding:0 var(--space-1); border-radius:var(--radius-control); background:var(--primary); color:var(--primary-foreground); font-size:var(--text-xs); font-weight:var(--weight-semibold); line-height:var(--leading-none); pointer-events:none; }
3720
3828
  .notification-panel { width:min(360px,calc(100vw - 32px)); max-width:none; padding:0; gap:0; display:flex; flex-direction:column; overflow:hidden; }
3721
- .notification-head { display:flex; align-items:center; justify-content:space-between; gap:var(--space-3); padding:var(--space-3) var(--space-4); border-block-end:1px solid var(--border); }
3829
+ .notification-head { display:flex; align-items:center; justify-content:space-between; gap:var(--space-3); padding:var(--space-3) var(--space-4); border-block-end:1px solid transparent; }
3722
3830
  .notification-head strong { font-size:var(--text-sm); }
3723
3831
  .notification-list { margin:0; padding:var(--space-1); overflow-y:auto; max-height:min(60vh,440px); }
3724
3832
  .notification-sublist { margin:0; padding:0; list-style:none; }
@@ -3820,7 +3928,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
3820
3928
  @media (min-width:768px) {
3821
3929
  .datagrid-split { grid-template-columns:1fr var(--datagrid-detail-w,20rem); }
3822
3930
  }
3823
- .datagrid-detail { border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); padding:var(--space-4); }
3931
+ .datagrid-detail { border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); padding:var(--space-4); }
3824
3932
  .datagrid-detail-head { display:flex; justify-content:flex-end; }
3825
3933
 
3826
3934
  /* G2: a ação de conjunto fica à direita, acima da fila — perto do que ela comanda e
@@ -3835,8 +3943,8 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
3835
3943
 
3836
3944
  /* G5/G6: a escolha do conflito e o recibo. Os dois são superfície de card porque são
3837
3945
  blocos de decisão e de registro, não linhas da fila. */
3838
- .file-conflict { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2); padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--surface-2); }
3839
- .file-receipt { padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); }
3946
+ .file-conflict { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2); padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--surface-2); }
3947
+ .file-receipt { padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); }
3840
3948
  .file-receipt-head { display:flex; align-items:center; justify-content:space-between; gap:var(--space-2); }
3841
3949
  .file-receipt ul { margin:0; padding-inline-start:var(--space-5); color:var(--muted-foreground); font-size:var(--text-sm); }
3842
3950
 
@@ -3848,7 +3956,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
3848
3956
  .agent-card-id { display:grid; flex:1; min-inline-size:0; }
3849
3957
  .agent-card-desc { margin:0; color:var(--muted-foreground); }
3850
3958
  .agent-caps { display:flex; flex-wrap:wrap; gap:var(--space-2); margin:0; padding:0; list-style:none; }
3851
- .agent-cap { display:inline-flex; align-items:center; gap:var(--space-1); padding:var(--space-1) var(--space-3); border:1px solid var(--border); border-radius:var(--radius-control); font-size:var(--text-sm); }
3959
+ .agent-cap { display:inline-flex; align-items:center; gap:var(--space-1); padding:var(--space-1) var(--space-3); border:1px solid transparent; border-radius:var(--radius-control); font-size:var(--text-sm); }
3852
3960
  .agent-card-actions { display:flex; justify-content:flex-end; gap:var(--space-2); }
3853
3961
  .agent-inspector { display:grid; gap:var(--space-4); }
3854
3962
  .agent-inspector-head { display:flex; align-items:center; justify-content:space-between; }
@@ -3864,13 +3972,13 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
3864
3972
  .invocation-steps { display:grid; gap:var(--space-2); margin:0; padding:0; list-style:none; }
3865
3973
  /* O estado do passo entra por BORDA lateral, não por cor de fundo: fundo colorido
3866
3974
  compete com o texto do passo, e a borda diz o mesmo sem disputar leitura. */
3867
- .invocation-step { padding-inline-start:var(--space-3); border-inline-start:2px solid var(--border); }
3868
- .invocation-step[data-state="running"] { border-inline-start-color:var(--primary); }
3869
- .invocation-step[data-state="error"] { border-inline-start-color:var(--danger-400); }
3975
+ .invocation-step { padding-inline-start:var(--space-3); border-inline-start:2px solid transparent; }
3976
+ .invocation-step[data-state="running"] { border-inline-start-color:transparent; background:color-mix(in oklab,var(--primary) 8%,transparent); }
3977
+ .invocation-step[data-state="error"] { border-inline-start-color:transparent; background:var(--danger-bg); }
3870
3978
  .invocation-step-body { padding-block-start:var(--space-2); }
3871
3979
 
3872
3980
  .task-queue { display:grid; gap:var(--space-3); margin:0; padding:0; list-style:none; }
3873
- .task-item { display:grid; gap:var(--space-2); padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); }
3981
+ .task-item { display:grid; gap:var(--space-2); padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); }
3874
3982
  .task-line { display:flex; align-items:center; gap:var(--space-2); }
3875
3983
  .task-title { flex:1; min-inline-size:0; font-weight:var(--weight-medium); }
3876
3984
  .task-desc { margin:0; color:var(--muted-foreground); font-size:var(--text-sm); }
@@ -3922,7 +4030,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
3922
4030
  .trace-span[data-error] .trace-bar { background:var(--danger-400); }
3923
4031
 
3924
4032
  .health-matrix { display:grid; grid-template-columns:repeat(auto-fill,minmax(12rem,1fr)); gap:var(--space-3); margin:0; padding:0; list-style:none; }
3925
- .health-cell { display:grid; gap:var(--space-1); padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); }
4033
+ .health-cell { display:grid; gap:var(--space-1); padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); }
3926
4034
  .health-name { font-weight:var(--weight-medium); }
3927
4035
 
3928
4036
  /* H.e — custo e memória.
@@ -3960,7 +4068,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
3960
4068
  .cost-meter[data-state="over"] .cost-meter-bar { background:var(--danger-400); }
3961
4069
 
3962
4070
  .memory-ledger { display:grid; gap:var(--space-2); margin:0; padding:0; list-style:none; }
3963
- .memory-entry { display:grid; gap:var(--space-1); padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); }
4071
+ .memory-entry { display:grid; gap:var(--space-1); padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); }
3964
4072
  .memory-line { display:flex; flex-wrap:wrap; align-items:baseline; gap:var(--space-2); }
3965
4073
  .memory-content { flex:1; min-inline-size:0; }
3966
4074
  .memory-time { flex:none; color:var(--muted-foreground); font-family:var(--font-code); font-size:var(--text-xs); }
@@ -3974,10 +4082,10 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
3974
4082
 
3975
4083
  /* H.f — a relação. */
3976
4084
  .agent-messages { display:grid; gap:var(--space-2); margin:0; padding:0; list-style:none; }
3977
- .agent-message { display:grid; gap:var(--space-1); padding:var(--space-3); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); }
4085
+ .agent-message { display:grid; gap:var(--space-1); padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); }
3978
4086
  /* O recado que FALHOU muda a borda, não o fundo: é o mesmo tratamento do passo do
3979
4087
  `InvocationPanel`, e pelo mesmo motivo — fundo colorido disputa leitura com o texto. */
3980
- .agent-message[data-kind="error"] { border-color:var(--danger-400); }
4088
+ .agent-message[data-kind="error"] { border-color:transparent; background:var(--danger-bg); }
3981
4089
  .agent-message-line { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2); }
3982
4090
  .agent-message-route { display:inline-flex; align-items:center; gap:var(--space-1); flex:1; min-inline-size:0; }
3983
4091
  .agent-message-arrow { flex:none; color:var(--muted-foreground); }
@@ -4005,7 +4113,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
4005
4113
  /* `inline-size:100%` não é enfeite, é a mesma lição do Chart: painel de demo é flex, e uma
4006
4114
  caixa de largura automática entra como item que encolhe — medido no catálogo, a tela do grafo
4007
4115
  deu 71px e os nós saíram todos para fora dela. A tela ocupa o que lhe derem. */
4008
- .dependency-graph { inline-size:100%; block-size:28rem; border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); overflow:hidden;
4116
+ .dependency-graph { inline-size:100%; block-size:28rem; border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); overflow:hidden;
4009
4117
  --xy-background-color:transparent;
4010
4118
  --xy-background-pattern-color:var(--border);
4011
4119
  --xy-edge-stroke:var(--muted-foreground);
@@ -4040,14 +4148,14 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
4040
4148
  /* O nó é uma superfície flutuante como qualquer outra da Aurea — mesmo raio de cartão, mesma
4041
4149
  borda, mesmo fundo. É aqui que ele deixa de parecer React Flow. */
4042
4150
  .graph-node { position:relative; inline-size:var(--graph-node-w,180px); }
4043
- .graph-node-body { display:grid; gap:var(--space-05); inline-size:100%; padding:var(--space-2) var(--space-3); border:1px solid var(--border); border-radius:var(--radius-card); background:var(--card); color:var(--foreground); font-family:inherit; font-size:var(--text-sm); text-align:start; }
4151
+ .graph-node-body { display:grid; gap:var(--space-05); inline-size:100%; padding:var(--space-2) var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); color:var(--foreground); font-family:inherit; font-size:var(--text-sm); text-align:start; }
4044
4152
  button.graph-node-body { cursor:pointer; }
4045
- .graph-node[data-selected] .graph-node-body { border-color:var(--primary); }
4153
+ .graph-node[data-selected] .graph-node-body { border-color:transparent; background:color-mix(in oklab,var(--primary) 14%,var(--card)); }
4046
4154
  .graph-node-label { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:var(--weight-medium); }
4047
4155
  /* `kind` é TEXTO, e não cor: a referência pinta dez tipos de nó em dez cores, e é a quarta vez
4048
4156
  que esta parte recusa a mesma coisa. */
4049
4157
  .graph-node-kind { color:var(--subtle-foreground); font-size:var(--text-xs); letter-spacing:var(--tracking-wider); text-transform:uppercase; }
4050
- .graph-handle { inline-size:var(--space-2); block-size:var(--space-2); border:1px solid var(--border); background:var(--surface-2); }
4158
+ .graph-handle { inline-size:var(--space-2); block-size:var(--space-2); border:1px solid transparent; background:var(--surface-2); }
4051
4159
  /* ── RODADA 1 DA REDE (ADR-0064, 10/10/2026) ───────────────────────────────────────────────
4052
4160
  O ÍCONE vai ao lado do texto, e o texto continua inteiro (o tipo é PALAVRA — a recusa das cores
4053
4161
  continua de pé). Os SELOS sentam na borda, nos cantos: a quantidade em cima, à direita; o estado
@@ -4062,7 +4170,7 @@ button.graph-node-body { cursor:pointer; }
4062
4170
  .graph-node-status .badge { max-inline-size:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
4063
4171
  /* "Ir até" (focusId): a marca de achado é a borda da marca com uma linha por dentro, como o
4064
4172
  cartão escolhido — e não o anel de foco, que é do teclado. */
4065
- .graph-node[data-focused] .graph-node-body { border-color:var(--primary); box-shadow:inset 0 0 0 var(--border-width) var(--primary); }
4173
+ .graph-node[data-focused] .graph-node-body { border-color:transparent; outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; }
4066
4174
  /* O resto apaga quando há caminho ou vizinhos acesos (MNT-18.3 e 18.6). */
4067
4175
  .graph-node[data-dimmed] { opacity:.3; }
4068
4176
  .dependency-graph .is-dimmed { opacity:.25; }
@@ -4100,19 +4208,25 @@ button.graph-node-body { cursor:pointer; }
4100
4208
  /* A pastilha do meio (marca, número, grupo) e o nome da porta na ponta são HTML sobre o desenho. */
4101
4209
  .graph-edge-chip { position:absolute; z-index:var(--graph-label-z); display:inline-flex; align-items:center; gap:var(--space-1); padding:var(--space-05) var(--space-2); border-radius:var(--radius-control); background:var(--xy-edge-label-background-color); color:var(--xy-edge-label-color); font-size:var(--graph-edge-label-size,var(--text-xs)); line-height:var(--leading-tight); white-space:nowrap; pointer-events:all; }
4102
4210
  .graph-edge-end { position:absolute; z-index:var(--graph-label-z); padding:0 var(--space-1); border-radius:var(--radius-xs); background:var(--xy-edge-label-background-color); color:var(--xy-edge-label-color); font-size:var(--graph-edge-label-size,var(--text-xs)); line-height:var(--leading-tight); white-space:nowrap; pointer-events:none; }
4211
+ /* As guias do arraste (MNT-28, 17/10/2026): onde o nó encaixa no vizinho, como no draw.io — desenho cheio, na espessura
4212
+ do foco e na cor dele (a que se vê nos dois temas), por cima das linhas e dos nós e sem receber o ponteiro. A posição e
4213
+ o comprimento vêm do mapa, como os da pastilha da linha. */
4214
+ .graph-guide { position:absolute; z-index:var(--graph-label-z); background:var(--focus-strong); pointer-events:none; }
4215
+ .graph-guide-x { inline-size:var(--focus-width); margin-inline-start:calc(var(--focus-width) / -2); }
4216
+ .graph-guide-y { block-size:var(--focus-width); margin-block-start:calc(var(--focus-width) / -2); }
4103
4217
  /* `nodrag`/`nopan`: a pastilha é HTML sobre o mapa, e as duas classes dizem ao motor para não arrastar
4104
4218
  nem rolar a tela por ela (o botão do grupo precisa do clique). Fora do botão, o cursor é o comum. */
4105
4219
  .graph-edge-chip.nodrag.nopan { cursor:default; }
4106
4220
  .graph-edge-count { font-variant-numeric:tabular-nums; font-weight:var(--weight-medium); }
4107
- .graph-edge-group { display:inline-flex; align-items:center; min-block-size:var(--space-5); padding:0 var(--space-2); border:var(--border-width) solid var(--border-strong); border-radius:var(--radius-control); background:var(--secondary); color:var(--foreground); font:inherit; font-variant-numeric:tabular-nums; font-weight:var(--weight-medium); cursor:pointer; }
4108
- .graph-edge-group[aria-expanded="true"] { border-color:var(--primary-outline); }
4221
+ .graph-edge-group { display:inline-flex; align-items:center; min-block-size:var(--space-5); padding:0 var(--space-2); border:var(--border-width) solid transparent; border-radius:var(--radius-control); background:var(--secondary); color:var(--foreground); font:inherit; font-variant-numeric:tabular-nums; font-weight:var(--weight-medium); cursor:pointer; }
4222
+ .graph-edge-group[aria-expanded="true"] { border-color:transparent; }
4109
4223
  .graph-edge-mark { display:inline-grid; place-items:center; color:var(--foreground); }
4110
4224
  .graph-edge-mark-cross:before { content:"\2715"; font-weight:var(--weight-bold); }
4111
4225
  .graph-edge-mark-dot { inline-size:var(--space-2); block-size:var(--space-2); border-radius:var(--radius-full); background:currentColor; }
4112
4226
  /* Os botões de zoom, o minimapa e a legenda flutuam sobre o mapa, com a pele de cartão. */
4113
- .graph-controls { display:flex; gap:var(--space-1); padding:var(--space-1); border:var(--border-width) solid var(--border); border-radius:var(--radius-control); background:var(--card); }
4114
- .graph-minimap { border:var(--border-width) solid var(--border); border-radius:var(--radius-md); overflow:hidden; }
4115
- .graph-legend { display:grid; gap:var(--space-1); margin:0; padding:var(--space-2) var(--space-3); border:var(--border-width) solid var(--border); border-radius:var(--radius-md); background:var(--card); color:var(--foreground); font-size:var(--graph-edge-label-size,var(--text-xs)); }
4227
+ .graph-controls { display:flex; gap:var(--space-1); padding:var(--space-1); border:var(--border-width) solid transparent; border-radius:var(--radius-control); background:var(--card); }
4228
+ .graph-minimap { border:var(--border-width) solid transparent; border-radius:var(--radius-md); overflow:hidden; }
4229
+ .graph-legend { display:grid; gap:var(--space-1); margin:0; padding:var(--space-2) var(--space-3); border:var(--border-width) solid transparent; border-radius:var(--radius-md); background:var(--card); color:var(--foreground); font-size:var(--graph-edge-label-size,var(--text-xs)); }
4116
4230
  /* Duas partes (12/10/2026): o tipo da ligação e o estado, cada uma com o título à vista; com uma parte só,
4117
4231
  a lista sozinha, como era. */
4118
4232
  .graph-legend ul { display:grid; gap:var(--space-1); margin:0; padding:0; list-style:none; }
@@ -4130,7 +4244,7 @@ button.graph-node-body { cursor:pointer; }
4130
4244
  /* ALTO CONTRASTE (MNT-19.3): linha e letra no tom da letra, a base da linha dobra, e a borda do nó
4131
4245
  também. Tudo o mais (pesos, pontilhado, duplo) é múltiplo da base e acompanha sozinho. */
4132
4246
  .dependency-graph[data-contrast="high"] { --xy-edge-stroke:var(--foreground); --xy-edge-label-color:var(--foreground); --graph-edge-base:calc(var(--border-width) * 2); }
4133
- .dependency-graph[data-contrast="high"] .graph-node-body { border-color:var(--foreground); border-width:calc(var(--border-width) * 2); }
4247
+ .dependency-graph[data-contrast="high"] .graph-node-body { border-color:transparent; border-width:calc(var(--border-width) * 2); }
4134
4248
  .dependency-graph[data-contrast="high"] .graph-node-kind,.dependency-graph[data-contrast="high"] .graph-node-icon { color:var(--foreground); }
4135
4249
  /* ── RODADA 2 DA REDE (ADR-0065, 10/10/2026) ───────────────────────────────────────────────
4136
4250
  O LAÇO do modo de arrumar e a caixa em volta dos escolhidos se vestem pelas variáveis do motor. */
@@ -4140,14 +4254,14 @@ button.graph-node-body { cursor:pointer; }
4140
4254
  (ADR-0059). A caixa do motor, quadrada, não desenha anel nenhum. */
4141
4255
  .dependency-graph :focus-visible:has(> .graph-node) { outline:none; }
4142
4256
  .dependency-graph :focus-visible:has(> .graph-group) { outline:none; }
4143
- .dependency-graph :focus-visible > .graph-node > .graph-node-body,.dependency-graph :focus-visible > .graph-group { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:var(--focus-strong); }
4257
+ .dependency-graph :focus-visible > .graph-node > .graph-node-body,.dependency-graph :focus-visible > .graph-group { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
4144
4258
  /* O CONTÊINER aberto (site, andar, rack): a região em volta dos filhos, com a cabeça. A cabeça tem
4145
4259
  `--space-10` e o recheio `--space-4` — os mesmos números com que o graph.tsx monta a caixa. */
4146
4260
  /* O fundo é um VÉU leve, e não uma cor cheia: a linha entre dois nós de fora que passa por cima da
4147
4261
  região continua aparecendo (o contêiner é um nó, e o motor o desenha acima das linhas comuns). E o
4148
4262
  véu soma: o andar dentro do site fica um tom acima, e o aninhamento se lê sem cor nova. */
4149
- .graph-group { position:relative; inline-size:100%; block-size:100%; border:var(--border-width) solid var(--border); border-radius:var(--radius-card); background:color-mix(in oklab,var(--foreground) 3%,transparent); }
4150
- .graph-group[data-selected] { border-color:var(--primary); }
4263
+ .graph-group { position:relative; inline-size:100%; block-size:100%; border:var(--border-width) solid transparent; border-radius:var(--radius-card); background:color-mix(in oklab,var(--foreground) 3%,transparent); }
4264
+ .graph-group[data-selected] { border-color:transparent; background:color-mix(in oklab,var(--primary) 10%,transparent); }
4151
4265
  .graph-group[data-dimmed] { opacity:.3; }
4152
4266
  .graph-group-head { display:flex; align-items:center; gap:var(--space-2); block-size:var(--space-10); padding-inline:var(--space-2) var(--space-3); color:var(--foreground); font-size:var(--text-sm); }
4153
4267
  .graph-group-label { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:var(--weight-medium); }
@@ -4157,11 +4271,11 @@ button.graph-node-body { cursor:pointer; }
4157
4271
  /* O de NÓ senta no CANTO de baixo, à direita, como a quantidade no de cima: fechado, mostra QUANTOS
4158
4272
  guarda ("+12"). No canto, e não na borda: na borda ele cobria a alça da última porta (medido na
4159
4273
  bancada, a "porta 3" do núcleo saía por baixo dele). O selo de estado, embaixo à esquerda, encolhe. */
4160
- .graph-node-toggle { position:absolute; inset-block-end:0; inset-inline-end:0; display:inline-flex; align-items:center; justify-content:center; min-inline-size:var(--space-6); block-size:var(--space-6); padding:0 var(--space-2); border:var(--border-width) solid var(--border-strong); border-radius:var(--radius-control); background:var(--secondary); color:var(--foreground); font:inherit; font-size:var(--text-xs); font-variant-numeric:tabular-nums; font-weight:var(--weight-medium); transform:translate(25%,50%); cursor:pointer; }
4161
- .graph-node-toggle[aria-expanded="false"] { border-color:var(--primary-outline); }
4274
+ .graph-node-toggle { position:absolute; inset-block-end:0; inset-inline-end:0; display:inline-flex; align-items:center; justify-content:center; min-inline-size:var(--space-6); block-size:var(--space-6); padding:0 var(--space-2); border:var(--border-width) solid transparent; border-radius:var(--radius-control); background:var(--secondary); color:var(--foreground); font:inherit; font-size:var(--text-xs); font-variant-numeric:tabular-nums; font-weight:var(--weight-medium); transform:translate(25%,50%); cursor:pointer; }
4275
+ .graph-node-toggle[aria-expanded="false"] { border-color:transparent; }
4162
4276
  .graph-node:has(.graph-node-toggle) .graph-node-status { max-inline-size:calc(100% - var(--space-16)); }
4163
4277
  /* O ALFINETE (nó fixo), no canto de cima à esquerda — a quantidade fica no da direita. */
4164
- .graph-node-pin { position:absolute; inset-block-start:0; inset-inline-start:0; display:inline-grid; place-items:center; inline-size:var(--space-5); block-size:var(--space-5); border:var(--border-width) solid var(--border); border-radius:var(--radius-full); background:var(--card); color:var(--foreground); transform:translate(-25%,-50%); }
4278
+ .graph-node-pin { position:absolute; inset-block-start:0; inset-inline-start:0; display:inline-grid; place-items:center; inline-size:var(--space-5); block-size:var(--space-5); border:var(--border-width) solid transparent; border-radius:var(--radius-full); background:var(--card); color:var(--foreground); transform:translate(-25%,-50%); }
4165
4279
  /* A NUVEM é desenho de FUNDO: a caixa do nó fica sem borda e sem fundo, e o texto vai ao centro. */
4166
4280
  .graph-node-cloud { position:absolute; inset:0; inline-size:100%; block-size:100%; overflow:visible; pointer-events:none; }
4167
4281
  .graph-node-cloud path { fill:var(--card); stroke:var(--border); stroke-width:var(--border-width); }
@@ -4197,14 +4311,14 @@ button.graph-node-body { cursor:pointer; }
4197
4311
  .operational-grid .demo{min-height:0}@media(max-width:640px){.operational-grid .demo{grid-column:span 12}}
4198
4312
  .universal-grid .demo { min-height:0; }
4199
4313
  .pattern-toolbar .input-group { flex:1 1 180px; }
4200
- .media-library-row.active { border-color:var(--primary); }
4314
+ .media-library-row.active { border-color:transparent; background:color-mix(in oklab,var(--primary) 10%,transparent); }
4201
4315
  /* Alvo de toque. `.tabs`/`.segmented` no lugar de `.tab`/`.segmented button`: agora a altura
4202
4316
  mora na cápsula, então é ela que precisa crescer — o filho estica atrás. O `CloseButton` fica de
4203
4317
  fora (0.32.0): o alvo dele é o `::before` de 44, e o círculo continua de 24, como o da referência. */
4204
4318
  @media (pointer:coarse) { .btn:not(.btn-link):not(.close-button),.tabs,.segmented,.pagination button,.pagination-link,.schedule-grid button,.media-control,.nav-list-row { min-height:var(--target-min); } .btn-icon,.media-control,.pagination-link { min-width:var(--target-min); } }
4205
4319
  @media (forced-colors:active) {
4206
4320
  :focus-visible { outline:var(--focus-width) solid CanvasText; outline-offset:var(--focus-offset); box-shadow:none; }
4207
- .badge,.pattern-gallery button[aria-pressed="true"],.device-grid button[aria-pressed="true"] { border:1px solid CanvasText; }
4321
+ .badge,.pattern-gallery button[aria-pressed="true"],.device-grid button[aria-pressed="true"] { border:1px solid transparent; }
4208
4322
  /* O glifo por máscara é FUNDO recortado, e aqui o navegador troca todo fundo pela cor da tela: o
4209
4323
  glifo sumia (medido em 12/10/2026: zero ponto de tinta nos cinco). Ele sai da troca e pinta com a
4210
4324
  cor do SISTEMA que o texto ao lado recebe — pelo nome, porque `inherit` aqui devolve a cor de
@@ -4222,11 +4336,14 @@ button.graph-node-body { cursor:pointer; }
4222
4336
  sistema. Quem cobra: `tests/visual/mascara-alto-contraste.spec.ts`. */
4223
4337
  :is(.color-swatch,.color-swatch-option) { forced-color-adjust:none; }
4224
4338
  .color-swatch-option:has(:focus-visible) { outline-color:CanvasText; }
4339
+ /* Sem linha (ADR-0072, 16/10/2026): a rodinha do `Spinner` e o visto do `Checkbox` deixaram de ser linha (que o alto
4340
+ contraste pinta) e viraram desenho por máscara — fundo, que a troca apaga. Saem da troca, na cor do texto. */
4341
+ .spinner,.checkbox input:checked + .control-mark::after { forced-color-adjust:none; background:CanvasText; }
4225
4342
  }
4226
4343
 
4227
4344
 
4228
4345
  /* Aurea v1.7 stabilization patch — visual design unchanged. */
4229
- .badge-running{background:var(--success-bg);color:var(--success-400);border-color:color-mix(in oklab,var(--success-400) 32%,transparent)}
4346
+ .badge-running{background:var(--success-bg);color:var(--success-400);border-color:transparent}
4230
4347
  /* superfície (overflow, borda, fundo, raio) mora junto com a do `.table-wrap` lá em cima — aqui
4231
4348
  fica só o que é DESTA região: ela é focável, e o foco dela é a linha de dentro, abaixo. Era um
4232
4349
  halo de `--focus` a 38% (B-09, 24/09/2026): claro demais para se ver, e fora do contrato de foco.
@@ -4277,12 +4394,12 @@ button.graph-node-body { cursor:pointer; }
4277
4394
  Ou seja: o par padrão cobre Firefox e Chrome e ainda não cobre o Safari da maioria; o caminho
4278
4395
  webkit cobre Safari e Chrome. Juntos cobrem os três, e onde os dois valem o padrão ganha por
4279
4396
  vir depois. Só cor e espessura — nada de desenhar seta ou canto. */
4280
- .carousel-track,.code-block,.combobox-popup,.command-palette,.dialog,.dialog-body,.drawer,.log-stream,.notification-list,.sidebar,.table-region,.table-wrap,.toc {
4397
+ .carousel-track,.code-block,.combobox-popup,.command-palette,.dialog,.dialog-body,.drawer,.log-stream,.notification-list,.sidebar,.table-region,.table-wrap,.toc,.topbar-tabs {
4281
4398
  scrollbar-width:thin; scrollbar-color:var(--border-strong) transparent;
4282
4399
  }
4283
- .carousel-track::-webkit-scrollbar,.code-block::-webkit-scrollbar,.combobox-popup::-webkit-scrollbar,.command-palette::-webkit-scrollbar,.dialog::-webkit-scrollbar,.dialog-body::-webkit-scrollbar,.drawer::-webkit-scrollbar,.log-stream::-webkit-scrollbar,.notification-list::-webkit-scrollbar,.sidebar::-webkit-scrollbar,.table-region::-webkit-scrollbar,.table-wrap::-webkit-scrollbar,.toc::-webkit-scrollbar { inline-size:var(--space-2); block-size:var(--space-2); }
4284
- .carousel-track::-webkit-scrollbar-track,.code-block::-webkit-scrollbar-track,.combobox-popup::-webkit-scrollbar-track,.command-palette::-webkit-scrollbar-track,.dialog::-webkit-scrollbar-track,.dialog-body::-webkit-scrollbar-track,.drawer::-webkit-scrollbar-track,.log-stream::-webkit-scrollbar-track,.notification-list::-webkit-scrollbar-track,.sidebar::-webkit-scrollbar-track,.table-region::-webkit-scrollbar-track,.table-wrap::-webkit-scrollbar-track,.toc::-webkit-scrollbar-track { background:transparent; }
4285
- .carousel-track::-webkit-scrollbar-thumb,.code-block::-webkit-scrollbar-thumb,.combobox-popup::-webkit-scrollbar-thumb,.command-palette::-webkit-scrollbar-thumb,.dialog::-webkit-scrollbar-thumb,.dialog-body::-webkit-scrollbar-thumb,.drawer::-webkit-scrollbar-thumb,.log-stream::-webkit-scrollbar-thumb,.notification-list::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb,.table-region::-webkit-scrollbar-thumb,.table-wrap::-webkit-scrollbar-thumb,.toc::-webkit-scrollbar-thumb { background:var(--border-strong); border-radius:var(--radius-control); }
4400
+ .carousel-track::-webkit-scrollbar,.code-block::-webkit-scrollbar,.combobox-popup::-webkit-scrollbar,.command-palette::-webkit-scrollbar,.dialog::-webkit-scrollbar,.dialog-body::-webkit-scrollbar,.drawer::-webkit-scrollbar,.log-stream::-webkit-scrollbar,.notification-list::-webkit-scrollbar,.sidebar::-webkit-scrollbar,.table-region::-webkit-scrollbar,.table-wrap::-webkit-scrollbar,.toc::-webkit-scrollbar,.topbar-tabs::-webkit-scrollbar { inline-size:var(--space-2); block-size:var(--space-2); }
4401
+ .carousel-track::-webkit-scrollbar-track,.code-block::-webkit-scrollbar-track,.combobox-popup::-webkit-scrollbar-track,.command-palette::-webkit-scrollbar-track,.dialog::-webkit-scrollbar-track,.dialog-body::-webkit-scrollbar-track,.drawer::-webkit-scrollbar-track,.log-stream::-webkit-scrollbar-track,.notification-list::-webkit-scrollbar-track,.sidebar::-webkit-scrollbar-track,.table-region::-webkit-scrollbar-track,.table-wrap::-webkit-scrollbar-track,.toc::-webkit-scrollbar-track,.topbar-tabs::-webkit-scrollbar-track { background:transparent; }
4402
+ .carousel-track::-webkit-scrollbar-thumb,.code-block::-webkit-scrollbar-thumb,.combobox-popup::-webkit-scrollbar-thumb,.command-palette::-webkit-scrollbar-thumb,.dialog::-webkit-scrollbar-thumb,.dialog-body::-webkit-scrollbar-thumb,.drawer::-webkit-scrollbar-thumb,.log-stream::-webkit-scrollbar-thumb,.notification-list::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb,.table-region::-webkit-scrollbar-thumb,.table-wrap::-webkit-scrollbar-thumb,.toc::-webkit-scrollbar-thumb,.topbar-tabs::-webkit-scrollbar-thumb { background:var(--border-strong); border-radius:var(--radius-control); }
4286
4403
  /* A LATERAL é a exceção (0.32.0; o Victor, 13/10/2026, olhando a da documentação da referência: a barra
4287
4404
  "só aparece se o mouse fica em cima do sidebar e ela é clarinha" — e, sobre o padrão, "pode alterar o
4288
4405
  atual para ser claro e sumir a rolagem"). A barra continua NATIVA e continua lá — a largura fina não
@@ -4337,6 +4454,58 @@ button.graph-node-body { cursor:pointer; }
4337
4454
  `@media`/`@container` não leem `var()`, então os valores aqui são literais da escala — o
4338
4455
  check 4b do validate.py cobra que eles pertençam a `--breakpoint-*`, nos dois. */
4339
4456
 
4457
+ /* ── SEM LINHA, OS FUNDOS (ADR-0072, 16/10/2026) ───────────────────────────────────────────────────────────────────
4458
+ Sem a linha, as peças que só ela separava do fundo sumiram (medido nas 149 páginas: 81 casos, 1,00 a 1,06:1). O Victor
4459
+ viu cada uma ao lado da sugestão e escolheu: "caixa B, o resto tudo B".
4460
+ · Três fundos TRANSLÚCIDOS da cor do texto — como o trilho desligado do switch da referência (o texto a 20%): se
4461
+ separam de QUALQUER fundo atrás. Uma cor fixa acaba igual a alguma superfície; foi assim que as peças sumiram.
4462
+ `--fill-1` 6% · `--fill-2` 10% (campo, botão de contorno, barra, código) · `--fill-3` 20% (marca do checkbox e do
4463
+ rádio, trilho do switch). Onde algo passa POR TRÁS ou uma peça cobre outra (a bolinha dos passos, as fotos, o nó do
4464
+ mapa), a mesma mistura OPACA, sobre a cor da página (`-solid`): translúcido, o que está atrás aparecia.
4465
+ · Declarados onde o tema se declara, para seguir a faixa de outro tema (GAR-05); as cores de cada marca também moram
4466
+ nos elementos com `[data-theme]` (os tokens da marca), então a marca vem junto.
4467
+ · A ÚNICA linha que fica é a do cartão de contorno (a caixa da vitrine): clara, o texto a 10% — a "B" da caixa. */
4468
+ :root,[data-theme] { --fill-1:color-mix(in oklab,var(--foreground) 6%,transparent); --fill-2:color-mix(in oklab,var(--foreground) 10%,transparent); --fill-3:color-mix(in oklab,var(--foreground) 20%,transparent); --fill-2-solid:color-mix(in oklab,var(--foreground) 10%,var(--background)); --fill-3-solid:color-mix(in oklab,var(--foreground) 20%,var(--background)); }
4469
+ /* O `secondary` do campo tem fundo próprio (`--secondary`, sem linha desde antes) e fica como era — sem o `:where`, esta
4470
+ regra (vinda depois) pintava por cima dele e o `secondary` ficava igual ao comum. O `:where` mantém a força de uma
4471
+ classe, e o inválido (que vem antes, com mais força) continua vencendo. */
4472
+ .input:where(:not(.input-secondary)),.textarea:where(:not(.textarea-secondary)),.select,.input-group:where(:not(:has(>.input-secondary))),.number-field-group,.combobox-multi { background-color:var(--fill-2); }
4473
+ .input-group > :is(.input,.select,.textarea),.number-field-group .input,.combobox-multi .input { background-color:transparent; }
4474
+ .control-mark,.switch-track { background-color:var(--fill-3); }
4475
+ .btn-outline { --btn-bg:var(--fill-2); }
4476
+ .btn-outline.btn-tone-brand,.btn-primary-outline { --btn-bg:color-mix(in oklab,var(--primary) 16%,transparent); }
4477
+ /* Os tons de ESTADO: o tom a 16% (o mouse, 22%), o fundo aprovado na bancada. No CLARO o rótulo vai 20% para a cor
4478
+ do texto, porque o azul do claro já fica a 5,2:1 da página branca e qualquer fundo que se veja o derrubava abaixo de
4479
+ 4,5 (o tom a 16% deixava o "info" a 4,02:1). Medido em 16/10/2026, o pior caso é o azul com o mouse, a 4,64:1. A "C"
4480
+ da bancada, escolhida pelo Victor. */
4481
+ .btn-outline.btn-tone-danger,.btn-danger-outline { --btn-bg:color-mix(in oklab,var(--destructive) 16%,transparent); }
4482
+ .btn-outline.btn-tone-success { --btn-bg:color-mix(in oklab,var(--success) 16%,transparent); }
4483
+ .btn-outline.btn-tone-info { --btn-bg:color-mix(in oklab,var(--info) 16%,transparent); }
4484
+ .btn-outline.btn-tone-warning { --btn-bg:color-mix(in oklab,var(--warning) 16%,transparent); }
4485
+ .btn-outline.btn-tone-danger:hover:not(:disabled):not([aria-disabled="true"]),.btn-danger-outline:hover:not(:disabled):not([aria-disabled="true"]) { --btn-bg:color-mix(in oklab,var(--destructive) 22%,transparent); }
4486
+ .btn-outline.btn-tone-success:hover:not(:disabled) { --btn-bg:color-mix(in oklab,var(--success) 22%,transparent); }
4487
+ .btn-outline.btn-tone-info:hover:not(:disabled) { --btn-bg:color-mix(in oklab,var(--info) 22%,transparent); }
4488
+ .btn-outline.btn-tone-warning:hover:not(:disabled) { --btn-bg:color-mix(in oklab,var(--warning) 22%,transparent); }
4489
+ [data-theme="light"] .btn-outline.btn-tone-danger:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-outline.btn-tone-danger:hover:not(:disabled):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-danger-outline:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-danger-outline:hover:not(:disabled):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:color-mix(in oklab,var(--danger-400) 80%,var(--foreground)); }
4490
+ [data-theme="light"] .btn-outline.btn-tone-success:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-outline.btn-tone-success:hover:not(:disabled):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:color-mix(in oklab,var(--success-400) 80%,var(--foreground)); }
4491
+ [data-theme="light"] .btn-outline.btn-tone-info:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-outline.btn-tone-info:hover:not(:disabled):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:color-mix(in oklab,var(--info-400) 80%,var(--foreground)); }
4492
+ [data-theme="light"] .btn-outline.btn-tone-warning:where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *),[data-theme="light"] .btn-outline.btn-tone-warning:hover:not(:disabled):where(:not([data-theme="dark"] *),[data-theme="dark"] [data-theme="light"] *) { --btn-fg:color-mix(in oklab,var(--warning-400) 80%,var(--foreground)); }
4493
+ .code-block,.log-stream,.dropzone,.toolbar,.file-item,.agent-cap { background-color:var(--fill-2); }
4494
+ /* O selo de CONTORNO, sem a linha, ganha o acento a 16%, e a letra vai 20% para a cor do texto, nos dois temas (a regra
4495
+ da "C" dos botões): com a letra de sempre, o verde caía a 3,79:1 no claro e o `success` a 4,15:1 no escuro, dentro do
4496
+ cartão. Medido em 16/10/2026: o pior caso passa a 4,79:1. Os outros selos (suave, plano) têm fundo próprio e não mudam. */
4497
+ .badge-outline { background-color:color-mix(in oklab,var(--badge-accent) 16%,transparent); color:color-mix(in oklab,var(--badge-accent) 80%,var(--foreground)); }
4498
+ /* O registro ganhou o fundo dos campos; o nível `info` (o azul) caía a 4,08:1 sobre ele no claro. A mesma letra 20% para o texto. */
4499
+ .log-stream .log-level.info { color:color-mix(in oklab,var(--info-400) 80%,var(--foreground)); }
4500
+ .step:not(.step-done,.step-active,.step-error,.done,.active) .step-dot { background-color:var(--fill-3-solid); }
4501
+ .avatar:not([class*="avatar-tone"],.avatar-count) { background-color:var(--fill-3-solid); }
4502
+ .graph-node-body { background-color:var(--fill-2-solid); }
4503
+ .card-outline { border-color:color-mix(in oklab,var(--foreground) 10%,transparent); }
4504
+ /* O pino que se arrasta sobre a cor: branco por baixo e a cor numa bolinha por cima, 3 para dentro — o branco é
4505
+ DESENHO CHEIO, não aro; e a sombra o solta da trilha. */
4506
+ .slider-color .slider-thumb,.color-area-thumb { background:var(--white); box-shadow:var(--shadow-md); }
4507
+ .slider-color .slider-thumb::after,.color-area-thumb::after { content:""; position:absolute; inset:calc(3 * var(--border-width)); inline-size:auto; block-size:auto; border-radius:var(--radius-full); background:var(--color-checker) center/var(--space-2) var(--space-2); box-shadow:inset 0 0 0 var(--space-4) var(--slider-thumb-color,var(--color-area-thumb,var(--primary))); }
4508
+
4340
4509
  /* >>> camada responsiva — GERADA por scripts/build-responsive-layer.mjs <<< */
4341
4510
  /* As variáveis de passo NÃO HERDAM. Ver o comentário de VARIAVEIS no gerador: um ícone dentro
4342
4511
  de um botão responsivo herdaria o passo do botão e mudaria de tamanho sozinho. */