@aurea-uds/core 0.33.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aurea.css +231 -167
- package/package.json +1 -1
package/dist/aurea.css
CHANGED
|
@@ -505,11 +505,11 @@ button,a,[role="button"],input,textarea,select { outline:none; }
|
|
|
505
505
|
o vão: colado, o anel amarelo sumiria no botão amarelo.
|
|
506
506
|
Quem cobra que nenhuma peça ficou de fora é o catálogo inteiro, no navegador:
|
|
507
507
|
`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:
|
|
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:transparent; }
|
|
509
509
|
/* A amostra ESCOLHIDA do `ColorSwatch options` (0.32.0) tem borda — a da cor dela — e o foco mora no botão de
|
|
510
510
|
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
511
|
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:
|
|
512
|
+
.color-swatch-option:has(:checked:focus-visible) { outline-offset:0; border-color:transparent; }
|
|
513
513
|
button { color:inherit; }
|
|
514
514
|
/* O link NÃO é `--primary`. Medido em 22/08/2026 com o axe e depois à mão: o amarelo da
|
|
515
515
|
marca sobre o fundo do tema CLARO dá 1,73:1, e o AA de texto (WCAG 1.4.3) pede 4,5:1 —
|
|
@@ -618,7 +618,7 @@ img,svg { display:block; }
|
|
|
618
618
|
.section-footer-links { display:grid; gap:var(--space-2); margin:0; padding:0; list-style:none; }
|
|
619
619
|
.section-footer-link { color:var(--muted-foreground); font-size:var(--text-sm); text-decoration:none; }
|
|
620
620
|
.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
|
|
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 transparent; color:var(--muted-foreground); font-size:var(--text-sm); }
|
|
622
622
|
/* layout="inline" (15/10/2026): o rodapé da página inicial da referência — UMA linha centrada, 12 de respiro em cima e
|
|
623
623
|
embaixo, 8 entre as partes, letra 14 apagada; os links acendem com o ponteiro. Quebra linha se não couber. */
|
|
624
624
|
.section.section-footer-inline { padding-block:var(--space-3); }
|
|
@@ -664,14 +664,14 @@ img,svg { display:block; }
|
|
|
664
664
|
de site. Só floating e flush entram no grid do AppShell; a pill é peça avulsa (numa
|
|
665
665
|
pílula não cabem busca + densidade + tema + comando). */
|
|
666
666
|
.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
|
|
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 transparent; border-radius:var(--radius-card); background:var(--card); color:var(--card-foreground); }
|
|
668
668
|
/* flush: encostada nas bordas. SEM fio embaixo (pedido do Victor — a referência não tem)
|
|
669
669
|
e sem superfície própria: ela se funde ao fundo e cola no conteúdo, que começa logo
|
|
670
670
|
abaixo. É o topo do nosso catálogo. */
|
|
671
671
|
.topbar-flush { top:0; padding:var(--space-2) var(--space-5); background:var(--background); }
|
|
672
672
|
/* 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
|
|
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
|
|
673
|
+
.topbar-divider { border-block-end:var(--border-width) solid transparent; }
|
|
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 transparent; border-radius:var(--radius-control); background:var(--card); color:var(--card-foreground); }
|
|
675
675
|
/* .brand nasceu como cabeçalho VERTICAL da lateral (borda embaixo + respiro); no topo
|
|
676
676
|
ele deita, então some com a borda e a margem — o lockup em si continua o mesmo. */
|
|
677
677
|
.topbar .brand { min-height:auto; margin:0; padding:0; border:0; }
|
|
@@ -716,7 +716,7 @@ img,svg { display:block; }
|
|
|
716
716
|
@media (prefers-reduced-transparency:reduce) { .topbar-flush.topbar-blurred { background:var(--background); -webkit-backdrop-filter:none; backdrop-filter:none; } }
|
|
717
717
|
/* menuActions (15/10/2026): o que só o menu do celular leva (o GitHub, na referência), embaixo dos links, depois de uma
|
|
718
718
|
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
|
|
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 transparent; }
|
|
720
720
|
/* O botão e o painel só existem no celular, e só onde há popover. O @supports lá embaixo é a rede,
|
|
721
721
|
como na gaveta do `AppShell`: navegador sem popover não esconde o `<nav popover>` sozinho, e o
|
|
722
722
|
painel apareceria solto na barra. Ali os links ficam na barra, que já quebra linha por conteúdo, e
|
|
@@ -731,7 +731,7 @@ img,svg { display:block; }
|
|
|
731
731
|
e toma a largura dela — na `floating`, a da caixa. O `- border-width` põe o fio de cima do painel
|
|
732
732
|
EM CIMA do fio da barra (o `divider`, a borda da `floating`), e não um fio duplo. A altura tem teto
|
|
733
733
|
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
|
|
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 transparent; background:var(--background); color:var(--foreground); }
|
|
735
735
|
.topbar-menu-panel .topbar-links { flex-direction:column; align-items:stretch; gap:var(--space-2); }
|
|
736
736
|
/* `anchor-scope` prende o nome da âncora a cada cabeçalho: com dois na página (cada um com o seu
|
|
737
737
|
`menuId`), o painel de um não cola no outro. Onde não houver `anchor-scope`, vale o último. */
|
|
@@ -768,7 +768,7 @@ img,svg { display:block; }
|
|
|
768
768
|
de pixel foram regravadas para aceitar. Ver ADR-0034.
|
|
769
769
|
Esta regra é a de `b0599be`, íntegra: estado conhecido bom, provado pelo portão de pixel em vez
|
|
770
770
|
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
|
|
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 transparent; border-radius:var(--radius-card); background:var(--sidebar); color:var(--sidebar-foreground); }
|
|
772
772
|
/* RENTE É A VARIANTE, e ela existe porque o Victor mediu quatro aplicativos que rodam na mão,
|
|
773
773
|
um deles o painel da própria referência de desenho. Nenhum flutua a lateral — ela
|
|
774
774
|
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 +778,10 @@ img,svg { display:block; }
|
|
|
778
778
|
que lados vem a borda —, e é por isso que a trava de pele exige que as duas MEÇAM diferente:
|
|
779
779
|
variante que desenha igual é enfeite. `--shell-top` volta a ser só a altura do topo, porque sem
|
|
780
780
|
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
|
|
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 transparent; border-radius:0; }
|
|
782
782
|
/* `placement="right"` (0.32.0, DOC-01): a lateral do outro lado. A flutuante já tem margem nos quatro
|
|
783
783
|
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
|
|
784
|
+
.sidebar-flush.sidebar-right { border-inline-end:0; border-inline-start:1px solid transparent; }
|
|
785
785
|
/* SEM CAIXA é outra variante (0.32.0): `plain`, o nome que a Aurea já dá ao "sem caixa" (`contentVariant`,
|
|
786
786
|
o painel do `Tabs`, o `KPI`). É a coluna "On this page" de uma documentação, como a da referência: os
|
|
787
787
|
itens soltos na página. Tira só a PINTURA — fundo, cor da borda, sombra — e guarda a geometria da
|
|
@@ -821,7 +821,7 @@ img,svg { display:block; }
|
|
|
821
821
|
/* A margem é LÓGICA desde 03/10/2026 (AN-01): era `margin:space-4 space-4 space-4 0`, física, e na
|
|
822
822
|
escrita da direita para a esquerda o conteúdo encostava na borda da página e deixava 32 de vão na
|
|
823
823
|
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
|
|
824
|
+
.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
825
|
/* contentVariant="plain" (B-10): a área de conteúdo sem caixa. Os `Card` da tela passam a ser as
|
|
826
826
|
únicas superfícies. A margem continua: é ela que afasta o conteúdo da lateral e da barra. */
|
|
827
827
|
.content-plain { padding:0; border:0; border-radius:0; background:none; color:inherit; }
|
|
@@ -1008,7 +1008,7 @@ img,svg { display:block; }
|
|
|
1008
1008
|
sistema faziam a pilula crescer para baixo e a barriga dela ficava atras dos botoes. A borda de
|
|
1009
1009
|
baixo agora fica `--space-4` acima da area do sistema, em qualquer aparelho.
|
|
1010
1010
|
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
|
|
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 transparent; border-radius:var(--radius-control); background:var(--card); color:var(--card-foreground); box-shadow:var(--shadow-md); }
|
|
1012
1012
|
/* `--control-h-lg` e não `--control-h-md`: alvo de toque. O md dá 36px em comfortable e
|
|
1013
1013
|
o alvo confortável de dedo é maior — com o recuo, o item renderiza acima de 44px. */
|
|
1014
1014
|
.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 +1161,7 @@ img,svg { display:block; }
|
|
|
1161
1161
|
/* ELEVADO: a moldura é uma superfície PRÓPRIA sobre a barra — por isso `--popover` e sombra, e
|
|
1162
1162
|
não uma cor de fundo. É o único indicador que usa profundidade em vez de cor para separar. */
|
|
1163
1163
|
.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); }
|
|
1164
|
+
.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
1165
|
/* CHEIO é o único que preenche com o amarelo sólido, e por isso é o único que troca o primeiro
|
|
1166
1166
|
plano inteiro para `--primary-foreground` — ícone, rótulo e contador juntos dentro da forma.
|
|
1167
1167
|
A auditoria recusou a antiga `pill` sólida (achado 5: "o ativo assume presença de CTA"), e a
|
|
@@ -1282,7 +1282,7 @@ img,svg { display:block; }
|
|
|
1282
1282
|
gate (check 4b) trava os breakpoints. Mobile-first: `below` some acima do ponto. */
|
|
1283
1283
|
@media (max-width:1023px) { .hide-below-lg { display:none !important; } }
|
|
1284
1284
|
@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
|
|
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 transparent; border-radius:0; background:transparent; box-shadow:none; }
|
|
1286
1286
|
.brand strong { display:block; letter-spacing:var(--tracking-tight); } .brand small { display:block; color:var(--muted-foreground); font-size:11px; }
|
|
1287
1287
|
/* minmax(0,1fr): a trilha `auto` do grid crescia até o nome mais longo e os itens
|
|
1288
1288
|
VAZAVAM pela direita da caixa (colavam na borda de um lado e sobrava do outro). */
|
|
@@ -1293,8 +1293,8 @@ img,svg { display:block; }
|
|
|
1293
1293
|
.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
1294
|
.doc-nav .nav-group { display:grid; gap:var(--space-1); }
|
|
1295
1295
|
.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:
|
|
1297
|
-
.doc-nav a.active { border-color:
|
|
1296
|
+
.doc-nav a:hover { color:var(--sidebar-accent-foreground); background:var(--sidebar-accent); border-color:transparent; }
|
|
1297
|
+
.doc-nav a.active { border-color:transparent; }
|
|
1298
1298
|
/* o glifo da família fica na frente do rótulo e nunca encolhe o texto */
|
|
1299
1299
|
.doc-nav a .icon { flex:none; opacity:.8; }
|
|
1300
1300
|
.doc-nav a.active .icon { opacity:1; }
|
|
@@ -1312,7 +1312,7 @@ img,svg { display:block; }
|
|
|
1312
1312
|
`tests/visual/tema-na-secao.spec.ts`, e o `tema-na-secao.test.tsx` reprova regra nova sem a
|
|
1313
1313
|
guarda. */
|
|
1314
1314
|
[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
|
|
1315
|
+
.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
1316
|
|
|
1317
1317
|
/* ========================================================================== */
|
|
1318
1318
|
/* 04. COMPONENTES PRIMITIVOS */
|
|
@@ -1320,7 +1320,7 @@ img,svg { display:block; }
|
|
|
1320
1320
|
/* A base do botão carrega as VARIÁVEIS DE PASSO da camada responsiva (`--step-*`), e cada
|
|
1321
1321
|
fallback é exatamente o valor fixo de antes — então o botão sem valor responsivo desenha o
|
|
1322
1322
|
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
|
|
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 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
1324
|
/* GAR-14 (0.28.0): o recheio do botão vale também para o aviso preso a ele (`.toast-anchored`),
|
|
1325
1325
|
que tem a MEDIDA do botão — pedido do Victor na bancada. Uma regra só, para os dois nunca
|
|
1326
1326
|
divergirem e para o número não se repetir. */
|
|
@@ -1446,7 +1446,7 @@ img,svg { display:block; }
|
|
|
1446
1446
|
A MEDIDA de dentro do botão (20, para caber no botão pequeno) é declarada pela CLASSE que o `Button` põe no
|
|
1447
1447
|
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
1448
|
dividiam a página, e a trava de geometria (uma altura por classe) reprovou (14/10/2026). */
|
|
1449
|
-
.btn .kbd { background:transparent; box-shadow:
|
|
1449
|
+
.btn .kbd { background:transparent; box-shadow:none; color:inherit; }
|
|
1450
1450
|
.btn-kbd { min-width:var(--space-5); height:var(--space-5); padding:0 var(--space-1); font-size:var(--text-xs); }
|
|
1451
1451
|
.btn-kbd.kbd-single { width:var(--space-5); padding:0; }
|
|
1452
1452
|
/* Uma caixinha por tecla (15/10/2026), como a busca da referência: 2 entre elas. */
|
|
@@ -1498,13 +1498,13 @@ img,svg { display:block; }
|
|
|
1498
1498
|
.btn-tone-danger:not(.btn-link):hover:not(:disabled) { --btn-bg:color-mix(in oklab, var(--destructive) 14%, transparent); }
|
|
1499
1499
|
.btn-tone-success,.btn-tone-success:hover:not(:disabled) { --btn-fg:var(--success-400); }
|
|
1500
1500
|
.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); }
|
|
1501
|
+
.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
1502
|
.btn-tone-info,.btn-tone-info:hover:not(:disabled) { --btn-fg:var(--info-400); }
|
|
1503
1503
|
.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); }
|
|
1504
|
+
.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
1505
|
.btn-tone-warning,.btn-tone-warning:hover:not(:disabled) { --btn-fg:var(--warning-400); }
|
|
1506
1506
|
.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); }
|
|
1507
|
+
.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
1508
|
/* 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
1509
|
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
1510
|
é o fundo --muted com a letra normal. */
|
|
@@ -1603,7 +1603,7 @@ img,svg { display:block; }
|
|
|
1603
1603
|
.btn-group-full,.toggle-group-full { display:flex; inline-size:100%; }
|
|
1604
1604
|
:is(.btn-group-full,.toggle-group-full) > .btn { flex:1 1 0%; min-inline-size:0; }
|
|
1605
1605
|
/* 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
|
|
1606
|
+
.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
1607
|
/* Vertical sai da pílula: --radius-control (999px) clampa em 50% da menor
|
|
1608
1608
|
dimensão e vira um oval num container alto. */
|
|
1609
1609
|
.toolbar[data-orientation="vertical"] { flex-direction:column; align-items:stretch; border-radius:var(--radius-lg); }
|
|
@@ -1629,7 +1629,7 @@ img,svg { display:block; }
|
|
|
1629
1629
|
quando ele é a única coisa na tela. */
|
|
1630
1630
|
/* O spinner lê a MESMA escala de glifo, mas o degrau base dele é `sm` e não `md` — presumir
|
|
1631
1631
|
`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));
|
|
1632
|
+
.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
1633
|
/* 0.32.0: a escala da referência — 16 · 24 · 32 · 40. O componente nasce no `md` (24); o glifo cru
|
|
1634
1634
|
continua no `sm` (16), dentro do botão e do aviso. */
|
|
1635
1635
|
.spinner-md { --step-icon:var(--space-6); }
|
|
@@ -1654,8 +1654,8 @@ img,svg { display:block; }
|
|
|
1654
1654
|
.label { display:flex; justify-content:space-between; gap:12px; color:var(--foreground); font-size:var(--text-sm); font-weight:var(--weight-medium); }
|
|
1655
1655
|
.hint { color:var(--muted-foreground); font-size:var(--text-xs); font-weight:var(--weight-regular); line-height:var(--space-4); }
|
|
1656
1656
|
.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
|
|
1658
|
-
.input:hover,.textarea:hover,.select:hover { border-color:
|
|
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 transparent; 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:transparent; }
|
|
1659
1659
|
/* `variant="secondary"` (0.32.0), o da referência: o campo de fundo NEUTRO e sem borda à vista, para
|
|
1660
1660
|
dentro de um cartão, onde o fundo de campo some contra o do cartão. A borda fica (transparente),
|
|
1661
1661
|
para o foco continuar sendo a borda que muda de cor (ADR-0059). */
|
|
@@ -1688,9 +1688,9 @@ img,svg { display:block; }
|
|
|
1688
1688
|
grupo inteiro, que é a peça que a pessoa vê. No toque o grupo sobe para o alvo de 44, como os
|
|
1689
1689
|
botões soltos subiam. */
|
|
1690
1690
|
.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
|
|
1692
|
-
.number-field-group:hover { border-color:
|
|
1693
|
-
.number-field-group:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:
|
|
1691
|
+
.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); }
|
|
1692
|
+
.number-field-group:hover { border-color:transparent; }
|
|
1693
|
+
.number-field-group:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
|
|
1694
1694
|
.number-field-input { width:var(--space-16); text-align:center; font-variant-numeric:tabular-nums; }
|
|
1695
1695
|
.number-field-group > .number-field-input { block-size:auto; border:0; border-radius:0; background:transparent; }
|
|
1696
1696
|
.number-field-group > .number-field-input:focus-visible { outline:none; }
|
|
@@ -1701,8 +1701,8 @@ img,svg { display:block; }
|
|
|
1701
1701
|
.number-field-button:disabled { opacity:var(--opacity-disabled); cursor:not-allowed; }
|
|
1702
1702
|
/* o anel do botão fica DENTRO dele: o grupo corta o que passa da borda */
|
|
1703
1703
|
.number-field-button:focus-visible { outline-offset:calc(-1 * var(--focus-width)); }
|
|
1704
|
-
.number-field-decrement { border-inline-end:var(--border-width) solid
|
|
1705
|
-
.number-field-increment { border-inline-start:var(--border-width) solid
|
|
1704
|
+
.number-field-decrement { border-inline-end:var(--border-width) solid transparent; }
|
|
1705
|
+
.number-field-increment { border-inline-start:var(--border-width) solid transparent; }
|
|
1706
1706
|
@media (pointer:coarse) { .number-field-group { block-size:var(--target-min); } }
|
|
1707
1707
|
/* A ALÇA DE ARRASTO (G-API-02), e só quando `scrubbable` está ligada.
|
|
1708
1708
|
O motor já põe por ESTILO EM LINHA tudo o que é mecânica — `touch-action:none` e
|
|
@@ -1742,14 +1742,14 @@ img,svg { display:block; }
|
|
|
1742
1742
|
soltos na mesma linha medem igual.
|
|
1743
1743
|
O foco é do CONTROLE e aparece na MOLDURA: `:focus-within` põe o anel no grupo, porque o
|
|
1744
1744
|
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
|
|
1746
|
-
.input-group:hover { border-color:
|
|
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 transparent; border-radius:var(--radius-control); transition:border-color var(--duration-fast),box-shadow var(--duration-fast); }
|
|
1746
|
+
.input-group:hover { border-color:transparent; }
|
|
1747
1747
|
/* A pele `secondary` do campo vale para o GRUPO, como o tamanho (abaixo): quem desenha a caixa é o grupo, e o
|
|
1748
1748
|
`ColorField variant="secondary"` (e todo `InputGroup` com um `Input variant="secondary"` dentro) saía igual ao
|
|
1749
1749
|
`primary` (medido na bancada em 14/10/2026). Antes do foco, para a borda do foco valer. */
|
|
1750
1750
|
.input-group:has(>.input-secondary) { background:var(--secondary); border-color:transparent; }
|
|
1751
1751
|
.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:
|
|
1752
|
+
.input-group:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
|
|
1753
1753
|
.input-group:has(.input-sm) { min-block-size:var(--control-h-sm); }
|
|
1754
1754
|
.input-group:has(.input-lg) { min-block-size:var(--control-h-lg); }
|
|
1755
1755
|
/* O controle dentro do grupo abre mão da própria moldura: quem desenha a caixa é o grupo. */
|
|
@@ -1901,7 +1901,7 @@ img,svg { display:block; }
|
|
|
1901
1901
|
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
1902
|
(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
1903
|
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
|
|
1904
|
+
.list-box-section + .list-box-section::before { content:""; border-block-start:var(--border-width) solid transparent; margin-inline:var(--space-2); }
|
|
1905
1905
|
.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
1906
|
/* O atalho do item (15/10/2026), como o da referência: o `Kbd` na ponta da linha. */
|
|
1907
1907
|
.list-box-item-kbd { flex:none; margin-inline-start:auto; }
|
|
@@ -1940,28 +1940,28 @@ img,svg { display:block; }
|
|
|
1940
1940
|
/* 0.32.0: a marca da referência tem 16. A conta passa a "metade menos 2" — 14 · 16 · 18 no sm · md ·
|
|
1941
1941
|
lg, e continua andando com a densidade, sem número quebrado. Centrada na primeira linha do texto
|
|
1942
1942
|
(`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
|
|
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 transparent; background:var(--field-bg); }
|
|
1944
1944
|
.control-mark-sm { --step-h:var(--control-h-sm); }
|
|
1945
1945
|
.control-mark-lg { --step-h:var(--control-h-lg); }
|
|
1946
1946
|
.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:
|
|
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:
|
|
1947
|
+
.checkbox input:checked + .control-mark { background:var(--control-selected); border-color:transparent; 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:transparent; }
|
|
1949
1949
|
/* Cheia com a cor do foco (marcada, ligada), a peça volta ao VÃO (ADR-0059): colado, o anel sumiria
|
|
1950
1950
|
no recheio, como no botão amarelo. A borda dela já é da cor do recheio, então continua uma linha
|
|
1951
1951
|
só — é o que a referência principal faz no checkbox e no switch. Inválida, a borda é vermelha e o
|
|
1952
1952
|
anel volta a colar (vermelho, pela regra do inválido). */
|
|
1953
1953
|
.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:"";
|
|
1954
|
+
.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
1955
|
/* A opção marcada fica CHEIA, com o ponto no meio, como a da referência (o ponto dela tem 8 numa
|
|
1956
1956
|
marca de 16: a metade). Era vazia, com o ponto amarelo. */
|
|
1957
|
-
.radio input:checked + .control-mark { background:var(--control-selected); border-color:
|
|
1957
|
+
.radio input:checked + .control-mark { background:var(--control-selected); border-color:transparent; }
|
|
1958
1958
|
.radio input:checked + .control-mark:after { content:""; width:50%; height:50%; border-radius:50%; background:var(--control-selected-foreground); }
|
|
1959
1959
|
.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
1960
|
/* O TRILHO DO SWITCH (0.32.0): o da referência, 40 × 20 (sm 32 × 16, lg 48 × 24) — a largura é o
|
|
1961
1961
|
dobro da altura. Era 42 × 24. A altura é a de controle MENOS 16: dá exatamente os três dela
|
|
1962
1962
|
(32 · 36 · 40 → 16 · 20 · 24), continua andando com a densidade e passa pela `--step-h`, que é o
|
|
1963
1963
|
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
|
|
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 transparent; transition:background var(--duration-base) var(--ease-standard),border-color var(--duration-base) var(--ease-standard); }
|
|
1965
1965
|
.switch-track-sm { --step-h:var(--control-h-sm); }
|
|
1966
1966
|
.switch-track-lg { --step-h:var(--control-h-lg); }
|
|
1967
1967
|
/* O botão TEM de encolher com o trilho: preso em 16px, num trilho `compact` de 20px de altura
|
|
@@ -1979,7 +1979,7 @@ img,svg { display:block; }
|
|
|
1979
1979
|
mesma distância nos dois sentidos de escrita. */
|
|
1980
1980
|
.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
1981
|
.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:
|
|
1982
|
+
.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
1983
|
.range { width:100%; accent-color:var(--primary); }
|
|
1984
1984
|
/* Slider VERTICAL, no `<input type=range>` NATIVO — sem trocar de motor.
|
|
1985
1985
|
|
|
@@ -2047,7 +2047,7 @@ img,svg { display:block; }
|
|
|
2047
2047
|
.slider-color { --slider-cap:var(--space-3); }
|
|
2048
2048
|
.slider-color .slider-track { background:var(--slider-track-fill,var(--secondary)); background-origin:border-box; forced-color-adjust:none; }
|
|
2049
2049
|
.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:
|
|
2050
|
+
.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
2051
|
.slider-color .slider-thumb::after { content:none; }
|
|
2052
2052
|
.slider-color[data-orientation="vertical"] .slider-thumb { inline-size:var(--space-4); block-size:var(--space-4); }
|
|
2053
2053
|
/* COLORAREA (0.32.0, ADR-0069) — a área de cor. A pintura (o gradiente, a ÚNICA exceção à ADR-0007) chega pela
|
|
@@ -2057,13 +2057,13 @@ img,svg { display:block; }
|
|
|
2057
2057
|
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
2058
|
Os dois `range` escondidos (o motor da área) cobrem o pino com opacidade quase zero, como na referência: o
|
|
2059
2059
|
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:
|
|
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:none; touch-action:none; cursor:crosshair; user-select:none; forced-color-adjust:none; }
|
|
2061
2061
|
/* 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
2062
|
e não gradiente. O pino fica acima deles. */
|
|
2063
2063
|
.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
2064
|
.color-area-dots .color-area-thumb { z-index:1; }
|
|
2065
2065
|
.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:
|
|
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: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
2067
|
.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
2068
|
.color-area-thumb[data-focus-visible] { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); }
|
|
2069
2069
|
.color-area-input { position:absolute; inset:0; inline-size:100%; block-size:100%; margin:0; opacity:.0001; pointer-events:none; }
|
|
@@ -2164,7 +2164,7 @@ img,svg { display:block; }
|
|
|
2164
2164
|
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
2165
|
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
2166
|
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
|
|
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 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
2168
|
/* O glifo do badge tem tamanho PRÓPRIO, senão o `.icon` padrão (20px) estoura os 24px e o
|
|
2169
2169
|
badge com ícone fica mais alto que o badge de texto na mesma fila. 16px + 3+3 de padding
|
|
2170
2170
|
+ 1+1 de borda = 24px exatos: com ícone ou sem, mede o mesmo. */
|
|
@@ -2173,7 +2173,7 @@ img,svg { display:block; }
|
|
|
2173
2173
|
numa fila, `align-self:flex-start` tiraria o selo do meio; o tamanho definido só desliga o
|
|
2174
2174
|
esticar, que é o que a coluna faz com um item sem tamanho. */
|
|
2175
2175
|
.badge-fit { inline-size:fit-content; }
|
|
2176
|
-
.badge-primary { --badge-accent:var(--primary-emphasis); color:var(--primary-emphasis); border-color:
|
|
2176
|
+
.badge-primary { --badge-accent:var(--primary-emphasis); color:var(--primary-emphasis); border-color:transparent; background:color-mix(in srgb,var(--primary) 10%,transparent); }
|
|
2177
2177
|
/* TAMANHOS. O md é a base (24px), que não muda — é o que as 103 fichas já usam. */
|
|
2178
2178
|
.badge-xs { min-height:var(--space-4); padding:0 var(--space-1); border-width:0; }
|
|
2179
2179
|
.badge-sm { min-height:var(--space-5); padding:0 calc(var(--space-1) + var(--space-05) - var(--border-width)); }
|
|
@@ -2202,7 +2202,7 @@ img,svg { display:block; }
|
|
|
2202
2202
|
A superfície de trás NÃO é adivinhável em CSS — dentro de um card ela é `--card`, não
|
|
2203
2203
|
`--background`. Por isso ela é uma propriedade: sobrescreva `--badge-ring` no contêiner. */
|
|
2204
2204
|
.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:
|
|
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:none; }
|
|
2206
2206
|
.badge-on-circle { --badge-inset:14%; }
|
|
2207
2207
|
/* O ponto sozinho não tem conteúdo, então ele precisa de medida própria. */
|
|
2208
2208
|
.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 +2232,22 @@ img,svg { display:block; }
|
|
|
2232
2232
|
o contador cai sobre a cor da marca e precisa da mesma inversão do botão primário. Os outros
|
|
2233
2233
|
seis deixam o contador sobre a superfície da barra, onde ele já se lê. */
|
|
2234
2234
|
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:transparent; }
|
|
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:transparent; }
|
|
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:transparent; }
|
|
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:transparent; }
|
|
2239
2239
|
/* AS OITO CORES DE CATEGORIA (GAR-07, ADR-0060, 09/10/2026): marcam GRUPO, não estado — "Motos" e
|
|
2240
2240
|
"Carros" num site de notícias. Mesma receita dos quatro propósitos acima (acento, fundo suave e
|
|
2241
2241
|
o fio misturado com a borda), e por isso as três ênfases valem para elas sem regra nova. O
|
|
2242
2242
|
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:
|
|
2244
|
-
.badge-orange { --badge-accent:var(--category-orange); color:var(--category-orange); background:var(--category-orange-bg); border-color:
|
|
2245
|
-
.badge-green { --badge-accent:var(--category-green); color:var(--category-green); background:var(--category-green-bg); border-color:
|
|
2246
|
-
.badge-teal { --badge-accent:var(--category-teal); color:var(--category-teal); background:var(--category-teal-bg); border-color:
|
|
2247
|
-
.badge-cyan { --badge-accent:var(--category-cyan); color:var(--category-cyan); background:var(--category-cyan-bg); border-color:
|
|
2248
|
-
.badge-blue { --badge-accent:var(--category-blue); color:var(--category-blue); background:var(--category-blue-bg); border-color:
|
|
2249
|
-
.badge-violet { --badge-accent:var(--category-violet); color:var(--category-violet); background:var(--category-violet-bg); border-color:
|
|
2250
|
-
.badge-pink { --badge-accent:var(--category-pink); color:var(--category-pink); background:var(--category-pink-bg); border-color:
|
|
2243
|
+
.badge-red { --badge-accent:var(--category-red); color:var(--category-red); background:var(--category-red-bg); border-color:transparent; }
|
|
2244
|
+
.badge-orange { --badge-accent:var(--category-orange); color:var(--category-orange); background:var(--category-orange-bg); border-color:transparent; }
|
|
2245
|
+
.badge-green { --badge-accent:var(--category-green); color:var(--category-green); background:var(--category-green-bg); border-color:transparent; }
|
|
2246
|
+
.badge-teal { --badge-accent:var(--category-teal); color:var(--category-teal); background:var(--category-teal-bg); border-color:transparent; }
|
|
2247
|
+
.badge-cyan { --badge-accent:var(--category-cyan); color:var(--category-cyan); background:var(--category-cyan-bg); border-color:transparent; }
|
|
2248
|
+
.badge-blue { --badge-accent:var(--category-blue); color:var(--category-blue); background:var(--category-blue-bg); border-color:transparent; }
|
|
2249
|
+
.badge-violet { --badge-accent:var(--category-violet); color:var(--category-violet); background:var(--category-violet-bg); border-color:transparent; }
|
|
2250
|
+
.badge-pink { --badge-accent:var(--category-pink); color:var(--category-pink); background:var(--category-pink-bg); border-color:transparent; }
|
|
2251
2251
|
/* ── AS TRÊS ÊNFASES — e elas vêm DEPOIS das variantes de propósito ─────────────────
|
|
2252
2252
|
Cada variante declara só o ACENTO; as ênfases saem dele. Antes cada variante escrevia
|
|
2253
2253
|
cor + fundo + borda na mão, e uma ênfase nova custaria seis regras novas.
|
|
@@ -2261,7 +2261,7 @@ img,svg { display:block; }
|
|
|
2261
2261
|
(`--badge-fill`/`--badge-on`). Quem não declara o par (as categorias, a marca, o neutro) segue
|
|
2262
2262
|
enchendo com o acento, como antes. */
|
|
2263
2263
|
.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:
|
|
2264
|
+
.badge-outline { background:transparent; color:var(--badge-accent); border-color:transparent; }
|
|
2265
2265
|
/* 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
2266
|
borda fica, transparente: a medida do selo não muda. */
|
|
2267
2267
|
.badge.badge-flat { border-color:transparent; }
|
|
@@ -2281,9 +2281,9 @@ img,svg { display:block; }
|
|
|
2281
2281
|
VAZADO resolve nos dois temas e ainda diz a coisa certa (ausência, não outro estado).
|
|
2282
2282
|
Escopado em .status-offline: o .status-dot dentro do Badge (Chat) segue preenchido. */
|
|
2283
2283
|
.status-offline { color:var(--subtle-foreground); }
|
|
2284
|
-
.status-offline .status-dot { background:transparent; box-shadow:
|
|
2284
|
+
.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
2285
|
|
|
2286
|
-
.card { min-width:0; padding:var(--card-pad); border:1px solid
|
|
2286
|
+
.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
2287
|
/* padding="none" (C-05): sem respiro, e a mídia recortada no raio 22 do próprio cartão. */
|
|
2288
2288
|
.card-flush { padding:0; overflow:hidden; }
|
|
2289
2289
|
/* Card.Media e orientation (A-14). Vertical: a mídia primeira sangra até a borda de cima e dos
|
|
@@ -2326,22 +2326,22 @@ img,svg { display:block; }
|
|
|
2326
2326
|
viram link (`.btn`, `.sidebar-item`, `.nav-list-row`…) já tiravam; o cartão e o item de menu
|
|
2327
2327
|
não. Quem cobra é o `link-sem-sublinhado.spec.ts`. */
|
|
2328
2328
|
.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:
|
|
2330
|
-
.card-selected { border-color:var(--primary
|
|
2331
|
-
.card-danger { border-color:
|
|
2329
|
+
.card-interactive:hover { transform:translateY(-2px); border-color:transparent; background:var(--surface-2); }
|
|
2330
|
+
.card-selected { border-color:transparent; background:color-mix(in oklab,var(--primary) 12%,var(--card)); }
|
|
2331
|
+
.card-danger { border-color:transparent; background:var(--danger-bg); }
|
|
2332
2332
|
/* MT-01 (10/10/2026, ADR-0063): o cartão `contrast` traz `data-theme="dark"` no próprio elemento —
|
|
2333
2333
|
o fundo, a letra e todo filho já saem do tema escuro. Falta só a linha em volta: no claro, nenhuma
|
|
2334
2334
|
(o cartão escuro já se separa da tela, 13,3:1); no escuro, o amarelo, com a borda de sempre (1).
|
|
2335
2335
|
O "está num pedaço escuro?" é o do ANCESTRAL, com a guarda do GAR-05: o atributo do próprio
|
|
2336
2336
|
cartão não conta, e uma faixa clara dentro da página escura não ganha o contorno. */
|
|
2337
2337
|
.card-contrast { border-color:transparent; }
|
|
2338
|
-
[data-theme="dark"] .card-contrast:where(:not([data-theme="light"] *),[data-theme="light"] [data-theme="dark"] *) { border-color:
|
|
2338
|
+
[data-theme="dark"] .card-contrast:where(:not([data-theme="light"] *),[data-theme="light"] [data-theme="dark"] *) { border-color:transparent; }
|
|
2339
2339
|
/* MT-02 (10/10/2026, ADR-0063): o traço no topo, `--accent-width` (4), na cor CHEIA do tom e igual
|
|
2340
2340
|
nos dois temas — a exceção que a ADR-0063 abriu na ADR-0061 para enfeite. O navegador desenha a
|
|
2341
2341
|
borda grossa do topo afinando na curva do canto, até a de 1 dos lados. `.card.card-accent` tem a
|
|
2342
2342
|
força de duas classes e vem depois: o escolhido, o de perigo e o contorno do `contrast` mudam os
|
|
2343
2343
|
outros lados, e o topo continua o traço. */
|
|
2344
|
-
.card.card-accent { border-
|
|
2344
|
+
.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
2345
|
.card-accent-brand { --card-accent:var(--primary); } .card-accent-success { --card-accent:var(--success); }
|
|
2346
2346
|
.card-accent-info { --card-accent:var(--info); } .card-accent-warning { --card-accent:var(--warning); }
|
|
2347
2347
|
.card-accent-danger { --card-accent:var(--destructive); }
|
|
@@ -2366,11 +2366,11 @@ img,svg { display:block; }
|
|
|
2366
2366
|
@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
2367
|
/* Banner: aviso de largura de página. Base ANTES das variantes — mesma
|
|
2368
2368
|
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
|
|
2370
|
-
.banner-info { border-color:
|
|
2371
|
-
.banner-success { border-color:
|
|
2372
|
-
.banner-warning { border-color:
|
|
2373
|
-
.banner-danger { border-color:
|
|
2369
|
+
.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); }
|
|
2370
|
+
.banner-info { border-color:transparent; background:var(--info-bg); }
|
|
2371
|
+
.banner-success { border-color:transparent; background:var(--success-bg); }
|
|
2372
|
+
.banner-warning { border-color:transparent; background:var(--warning-bg); }
|
|
2373
|
+
.banner-danger { border-color:transparent; background:var(--danger-bg); }
|
|
2374
2374
|
/* O título do alerta é <strong> e não <h4>: alerta cai em qualquer profundidade da página e
|
|
2375
2375
|
um h4 fixo quebraria a ordem de cabeçalhos. `display:block` porque o corpo vem embaixo
|
|
2376
2376
|
dele, não ao lado — as duas linhas são o desenho da referência congelada. */
|
|
@@ -2440,8 +2440,8 @@ img,svg { display:block; }
|
|
|
2440
2440
|
/* `variant="secondary"` (0.32.0): a aba secundária da referência — sem trilho e sem cápsula, um fio
|
|
2441
2441
|
embaixo da lista, a escolhida com a letra normal e o fio da casa (a regra do "selecionado", mais
|
|
2442
2442
|
abaixo). */
|
|
2443
|
-
.tabs-secondary { gap:var(--space-1); padding:0; border-block-end:var(--border-width) solid
|
|
2444
|
-
.tabs-secondary[data-orientation="vertical"] { border-block-end:0; border-inline-start:var(--border-width) solid
|
|
2443
|
+
.tabs-secondary { gap:var(--space-1); padding:0; border-block-end:var(--border-width) solid transparent; border-radius:0; background:transparent; }
|
|
2444
|
+
.tabs-secondary[data-orientation="vertical"] { border-block-end:0; border-inline-start:var(--border-width) solid transparent; }
|
|
2445
2445
|
.tabs-secondary .tab { border-radius:0; }
|
|
2446
2446
|
.tabs-secondary .tab.active,.tabs-secondary .tab[data-active] { background:transparent; box-shadow:none; color:var(--foreground); }
|
|
2447
2447
|
.tabs-secondary .tab[data-active]::after { display:block; }
|
|
@@ -2469,7 +2469,7 @@ img,svg { display:block; }
|
|
|
2469
2469
|
.pagination-link:hover:not(:disabled):not([aria-disabled="true"]) { background:var(--secondary); }
|
|
2470
2470
|
.pagination-link:active:not(:disabled):not([aria-disabled="true"]) { transform:scale(.97); }
|
|
2471
2471
|
.pagination-link:disabled,.pagination-link[aria-disabled="true"] { opacity:var(--opacity-disabled); cursor:not-allowed; }
|
|
2472
|
-
.pagination-link.active { border-color:
|
|
2472
|
+
.pagination-link.active { border-color:transparent; background:color-mix(in srgb, var(--primary) 10%, transparent); color:var(--primary-emphasis); }
|
|
2473
2473
|
.pagination-link-nav { padding-inline:calc(var(--space-2) + var(--space-05)); }
|
|
2474
2474
|
.pagination-nav-icon { --step-icon:var(--icon-sm); }
|
|
2475
2475
|
.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 +2481,10 @@ img,svg { display:block; }
|
|
|
2481
2481
|
.step { position:relative; text-align:center; color:var(--subtle-foreground); }
|
|
2482
2482
|
/* O ponto também morava só no docs.css, como o container. Os estados dele (`.step.done`,
|
|
2483
2483
|
`.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
|
|
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 transparent; background:var(--surface-1); }
|
|
2485
2485
|
/* Erro é o estado que faltava: uma etapa que reprovou na validação não tinha como se mostrar.
|
|
2486
2486
|
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-
|
|
2487
|
+
.step-error { color:var(--danger-400); } .step-error .step-dot { color:var(--danger-400); border-color:transparent; background:var(--danger-bg); }
|
|
2488
2488
|
.step-optional { display:block; color:var(--muted-foreground); font-size:var(--text-xs); }
|
|
2489
2489
|
/* Etapa clicável (fluxo não-linear): o alvo é um botão de verdade, com o foco do sistema.
|
|
2490
2490
|
E ele PRECISA GERAR CAIXA. `display:contents` era o que estava aqui, e um <button> sem caixa
|
|
@@ -2497,7 +2497,9 @@ img,svg { display:block; }
|
|
|
2497
2497
|
"quem mais tem esse problema?" foi feita e a resposta é ninguém. */
|
|
2498
2498
|
.step-trigger { display:block; width:100%; border:0; padding:0; background:none; color:inherit; font:inherit; text-align:inherit; cursor:pointer; }
|
|
2499
2499
|
.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
|
-
|
|
2500
|
+
/* 16/10/2026: o `Stepper` do React escreve `step-done` e `step-active`, e estas regras só liam `.step.done` e
|
|
2501
|
+
`.step.active` (a marcação à mão) — o passo concluído nunca ficava amarelo na web. As duas formas valem. */
|
|
2502
|
+
: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
2503
|
|
|
2502
2504
|
/* TABELA DE DADOS — e só ela. Estas cinco regras eram de ELEMENTO (`table`, `th,td`, `th`,
|
|
2503
2505
|
`tr:last-child td`, `tbody tr:hover`) e valiam para toda <table> do documento, inclusive a de
|
|
@@ -2530,7 +2532,7 @@ img,svg { display:block; }
|
|
|
2530
2532
|
.table,.table-wrap table { width:100%; border-collapse:separate; border-spacing:0; min-width:720px; font-size:var(--text-sm); }
|
|
2531
2533
|
/* GAR-16 (0.28.0): a tabela inteira com algarismos da mesma largura — a coluna de preço e de ano
|
|
2532
2534
|
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
|
|
2535
|
+
.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
2536
|
/* O título da tabela (`caption`) mora na moldura, em cima do cabeçalho, alinhado ao texto das colunas
|
|
2535
2537
|
(sem regra, o navegador o centralizava). */
|
|
2536
2538
|
.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 +2598,7 @@ img,svg { display:block; }
|
|
|
2596
2598
|
/* 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
2599
|
altura do botão, 32 · 36 · 40, e negrito). `--step-avatar` é a variável de passo própria do avatar
|
|
2598
2600
|
(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
|
|
2601
|
+
.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
2602
|
.avatar-sm { --step-avatar:var(--space-8); --step-avatar-fs:var(--text-xs); }
|
|
2601
2603
|
.avatar-lg { --step-avatar:var(--space-12); --step-avatar-fs:var(--text-base); }
|
|
2602
2604
|
/* 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 +2626,14 @@ img,svg { display:block; }
|
|
|
2624
2626
|
/* COLORSWATCH (0.32.0): a amostra de cor da referência — xs 16, sm 24, md 32, lg 36, xl 40 —, só redonda
|
|
2625
2627
|
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
2628
|
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:
|
|
2629
|
+
.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
2630
|
.color-swatch-xs { --color-swatch-size:var(--space-4); }
|
|
2629
2631
|
.color-swatch-sm { --color-swatch-size:var(--space-6); }
|
|
2630
2632
|
.color-swatch-lg { --color-swatch-size:calc(var(--space-8) + var(--space-1)); }
|
|
2631
2633
|
.color-swatch-xl { --color-swatch-size:var(--space-10); }
|
|
2632
2634
|
/* A amostra TRANSPARENTE (14/10/2026): o xadrez embaixo, e a cor por uma sombra por dentro (a sombra pinta POR CIMA
|
|
2633
2635
|
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(--
|
|
2636
|
+
.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
2637
|
/* AS AMOSTRAS PARA ESCOLHER (0.32.0, ADR-0069): a variação `options` do ColorSwatch. Cada cor é um rótulo com um
|
|
2636
2638
|
botão de opção nativo por cima, invisível (o navegador cuida da escolha e das setas). O desenho é o da
|
|
2637
2639
|
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 +2644,7 @@ img,svg { display:block; }
|
|
|
2642
2644
|
.color-swatch-option > .color-swatch { inline-size:100%; block-size:100%; transition:scale var(--duration-fast) var(--ease-standard); }
|
|
2643
2645
|
.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
2646
|
.color-swatch-option-dark::after { background:#000; }
|
|
2645
|
-
.color-swatch-option:has(:checked) { border-color:
|
|
2647
|
+
.color-swatch-option:has(:checked) { border-color:transparent; }
|
|
2646
2648
|
.color-swatch-option:has(:checked) > .color-swatch { scale:.77; }
|
|
2647
2649
|
.color-swatch-option:has(:checked)::after { scale:1; }
|
|
2648
2650
|
@media (hover:hover) { .color-swatch-option:not(:has(:checked,:disabled)):hover > .color-swatch { scale:1.1; } }
|
|
@@ -2713,7 +2715,7 @@ button.tag-main { cursor:pointer; }
|
|
|
2713
2715
|
/* O container do grupo NUNCA teve regra: a sobreposição abaixo existia e os avatares empilhavam
|
|
2714
2716
|
na vertical porque o pai saía `display:block`. Mesma falha do `.stepper` e do `.command`. */
|
|
2715
2717
|
.avatar-group { display:inline-flex; align-items:center; }
|
|
2716
|
-
.avatar-group .avatar { margin-inline-start:-9px; border:2px solid
|
|
2718
|
+
.avatar-group .avatar { margin-inline-start:-9px; border:2px solid transparent; } .avatar-group .avatar:first-child { margin-inline-start:0; }
|
|
2717
2719
|
/* O "+N" é um avatar como os outros — mesma caixa, mesma borda —, só que menor por dentro e sem
|
|
2718
2720
|
peso de nome próprio: ele conta, não identifica. */
|
|
2719
2721
|
.avatar-count { background:var(--secondary); color:var(--muted-foreground); font-size:var(--text-xs); font-weight:var(--weight-medium); }
|
|
@@ -2775,7 +2777,7 @@ button.tag-main { cursor:pointer; }
|
|
|
2775
2777
|
"Shipped14:20". Geometria de componente não depende do conteúdo (achados A2/A3). */
|
|
2776
2778
|
.timeline > li > div { display:flex; flex-direction:column; gap:var(--space-05); min-width:0; }
|
|
2777
2779
|
.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:
|
|
2780
|
+
.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
2781
|
/* ACCORDION (0.32.0) — o da referência, com o realce em CÁPSULA (decisão do Victor, 11/10/2026). Sem
|
|
2780
2782
|
caixa em volta: um fio de 1 entre os itens, nenhum depois do último. A pergunta: 16 de todos os
|
|
2781
2783
|
lados, 14 peso médio, a seta de 16 no FIM (esmaecida), que vira −180° ao abrir — o marcador do
|
|
@@ -2814,7 +2816,7 @@ button.tag-main { cursor:pointer; }
|
|
|
2814
2816
|
Três degraus e não um número livre: o número livre era o que obrigava pixel cru no
|
|
2815
2817
|
consumidor. Quem precisar de um QR de cartaz sobrescreve --qr-size, que é o mesmo caminho
|
|
2816
2818
|
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
|
|
2819
|
+
.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
2820
|
.qrcode-sm { --step-qr:7.5rem; }
|
|
2819
2821
|
.qrcode-lg { --step-qr:15rem; }
|
|
2820
2822
|
.qrcode .qr-mod { fill:var(--qr-module); }
|
|
@@ -2823,7 +2825,7 @@ button.tag-main { cursor:pointer; }
|
|
|
2823
2825
|
/* `overflow:auto` faz do <pre> uma REGIÃO ROLÁVEL, e região rolável sem nada focável dentro
|
|
2824
2826
|
é inalcançável por teclado (axe scrollable-region-focusable). Quem escreve esta marcação à
|
|
2825
2827
|
mão precisa de `tabindex="0"` no <pre> — o componente React já o emite. */
|
|
2826
|
-
.code-block { overflow:auto; padding:16px; border:1px solid
|
|
2828
|
+
.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
2829
|
/* Bloco de código COM copiar: a moldura não rola, o <pre> rola por dentro e o gatilho fica
|
|
2828
2830
|
parado no canto. O comportamento é do core (aurea.js, [data-aurea-copy]); aqui só a pele.
|
|
2829
2831
|
O check em amarelo é confirmação instantânea — dura 1,5s e volta ao ícone de copiar. */
|
|
@@ -2838,7 +2840,7 @@ button.tag-main { cursor:pointer; }
|
|
|
2838
2840
|
no fundo afundado, centrada, e o código sem moldura (o cartão já é a moldura). A altura é do conteúdo;
|
|
2839
2841
|
o site fixa a dele (`--demo-height`). */
|
|
2840
2842
|
.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
|
|
2843
|
+
.demo-tabs { display:flex; padding:var(--space-2); border-bottom:var(--border-width) solid transparent; }
|
|
2842
2844
|
.demo-tabs .segmented { flex:1; display:flex; }
|
|
2843
2845
|
.demo-tabs .segmented button { flex:1; }
|
|
2844
2846
|
.demo-panel { flex:1; min-height:0; overflow:auto; padding:var(--space-6); }
|
|
@@ -2860,16 +2862,21 @@ button.tag-main { cursor:pointer; }
|
|
|
2860
2862
|
não passar a depender do arquivo de ícones. Era 11, em maiúsculas espaçadas. */
|
|
2861
2863
|
.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
2864
|
.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
|
|
2865
|
+
.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
2866
|
.toc a:hover { color:var(--foreground); }
|
|
2865
|
-
.toc a[aria-current] { border-inline-start-color:
|
|
2867
|
+
.toc a[aria-current] { border-inline-start-color:transparent; color:var(--foreground); }
|
|
2868
|
+
/* O marcador do item ATUAL não é contorno: é o indicador, como o das abas (ADR-0072, item 5). Era a borda de um lado,
|
|
2869
|
+
que saiu junto com as linhas, e o item atual ficou só com a cor do texto. Volta como desenho cheio, no lugar da
|
|
2870
|
+
borda (que continua, transparente) e com a medida dela (2). Quem cobra: `tests/visual/indicador-atual.spec.ts`. */
|
|
2871
|
+
.toc a { position:relative; }
|
|
2872
|
+
.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
2873
|
.toc a.toc-sub { padding-inline-start:var(--space-6); }
|
|
2867
2874
|
/* `--log-h` é a QUINTA válvula de altura do core, no idioma de `--chart-h` (I4), `--qr-size` (B6),
|
|
2868
2875
|
`--datagrid-max-h` (F6) e `--media-h` (I7). Default 240px — o de antes —, então nada muda para
|
|
2869
2876
|
quem não passa nada. A causa é medida em 11/08/2026: a altura era FIXA, e por isso três prévias
|
|
2870
2877
|
do catálogo gastavam 240px para mostrar três linhas de log e rolavam dentro da caixa de
|
|
2871
2878
|
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
|
|
2879
|
+
.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
2880
|
/* UM MECANISMO SÓ para o nível, e o merge de 28/08/2026 é o que permitiu escolher.
|
|
2874
2881
|
Havia dois: o valor como MODIFICADOR do `.log-level`, e três regras DESCENDENTES pintadas a
|
|
2875
2882
|
partir de uma classe no container (`.log-warn .log-level`). O comentário que justificava as
|
|
@@ -2921,7 +2928,7 @@ button.tag-main { cursor:pointer; }
|
|
|
2921
2928
|
atributo não é classe. Estado medido em 01/08/2026: data-selected, data-today, data-outside,
|
|
2922
2929
|
data-disabled e data-hidden — este último é obrigatório, senão o dia escondido das pontas
|
|
2923
2930
|
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
|
|
2931
|
+
.calendar { display:inline-block; padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--surface-1); }
|
|
2925
2932
|
.calendar-months { position:relative; }
|
|
2926
2933
|
/* 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
2934
|
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 +2973,7 @@ button.tag-main { cursor:pointer; }
|
|
|
2966
2973
|
.message-composer:has(.message-composer-context) { align-items:flex-end; }
|
|
2967
2974
|
.message-composer-context { flex-direction:column; align-items:stretch; gap:var(--space-2); color:var(--foreground); }
|
|
2968
2975
|
.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
|
|
2976
|
+
.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
2977
|
.message-quote > .icon { flex:none; }
|
|
2971
2978
|
.message-quote-text { display:grid; flex:1; min-inline-size:0; }
|
|
2972
2979
|
.message-quote-title { color:var(--foreground); font-weight:var(--weight-medium); }
|
|
@@ -3008,7 +3015,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3008
3015
|
player é quase preto nos DOIS temas (`--media-canvas`), e o `--focus-strong` do tema claro é
|
|
3009
3016
|
escuro: o foco dos controles sumia no tema claro. Redefinir o token aqui conserta todos os
|
|
3010
3017
|
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
|
|
3018
|
+
.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
3019
|
.media-viewport { position:absolute; inset:0; display:grid; place-items:center; background:var(--media-canvas); }
|
|
3013
3020
|
.media-fill { width:100%; height:100%; object-fit:contain; } /* vídeo React preenche o viewport (auditoria 18/07, M14) */
|
|
3014
3021
|
.media-placeholder { display:grid; place-items:center; gap:10px; color:var(--media-muted); text-align:center; }
|
|
@@ -3016,7 +3023,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3016
3023
|
.media-placeholder strong { color:var(--media-foreground); }
|
|
3017
3024
|
.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
3025
|
.media-overlay-title>div>span { display:block; color:var(--media-muted); font-size:var(--text-xs); }
|
|
3019
|
-
.media-player .badge { border-color:
|
|
3026
|
+
.media-player .badge { border-color:transparent; background:var(--media-track); color:var(--media-foreground); }
|
|
3020
3027
|
.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
3028
|
.media-seek { --media-played:34%; position:relative; height:20px; display:flex; align-items:center; }
|
|
3022
3029
|
.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 +3032,9 @@ button.tag-main { cursor:pointer; }
|
|
|
3025
3032
|
.media-seek-played { width:var(--media-played); background:var(--primary); }
|
|
3026
3033
|
.media-seek input { position:relative; z-index:1; width:100%; height:20px; margin:0; appearance:none; background:transparent; cursor:pointer; }
|
|
3027
3034
|
.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
|
|
3035
|
+
.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
3036
|
.media-seek input::-moz-range-track { height:4px; background:transparent; }
|
|
3030
|
-
.media-seek input::-moz-range-thumb { width:12px; height:12px; border:2px solid
|
|
3037
|
+
.media-seek input::-moz-range-thumb { width:12px; height:12px; border:2px solid transparent; border-radius:50%; background:var(--primary); }
|
|
3031
3038
|
.media-seek input:focus-visible { outline:var(--focus-width) solid var(--focus-strong); outline-offset:var(--focus-offset); box-shadow:none; }
|
|
3032
3039
|
.media-control-row,.media-control-group { display:flex; align-items:center; gap:4px; }
|
|
3033
3040
|
.media-control-row { min-width:0; justify-content:space-between; }
|
|
@@ -3057,7 +3064,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3057
3064
|
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
3065
|
sombra de sempre) e o canto é o da folha de baixo, o maior que a Aurea tem; o de dentro acompanha. */
|
|
3059
3066
|
.image-frame { display:block; }
|
|
3060
|
-
.image-frame-phone { padding:var(--space-2); border:var(--border-width) solid
|
|
3067
|
+
.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
3068
|
.image-frame-phone > .image { aspect-ratio:9 / 19.5; object-position:top; border-radius:calc(var(--radius-sheet) - var(--space-2)); }
|
|
3062
3069
|
/* A captura de cada tema (`srcDark`). Sem `data-theme` na página, vale a clara. A guarda é a do
|
|
3063
3070
|
GAR-05 espelhada: uma faixa CLARA dentro da página escura volta a mostrar a captura clara. */
|
|
@@ -3075,7 +3082,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3075
3082
|
`--media-scrim` em volta dela não é enfeite: a capa é do consumidor, e numa capa amarela a
|
|
3076
3083
|
pastilha sumia — medido na primeira imagem mostrada ao Victor, em 24/09/2026. */
|
|
3077
3084
|
.media-embed { display:grid; gap:var(--space-2); min-inline-size:0; }
|
|
3078
|
-
.media-embed-frame { position:relative; overflow:hidden; border:1px solid
|
|
3085
|
+
.media-embed-frame { position:relative; overflow:hidden; border:1px solid transparent; border-radius:var(--radius-card); background:var(--media-canvas); }
|
|
3079
3086
|
.media-embed-frame>iframe { position:absolute; inset:0; inline-size:100%; block-size:100%; border:0; }
|
|
3080
3087
|
.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
3088
|
.media-embed-facade>img { position:absolute; inset:0; inline-size:100%; block-size:100%; object-fit:cover; }
|
|
@@ -3116,7 +3123,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3116
3123
|
ela que o observador vigia, então existe também parada, sem a rodinha. A do `MessageList` (AN-02),
|
|
3117
3124
|
nas duas pontas da conversa, é a mesma linha. */
|
|
3118
3125
|
.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:
|
|
3126
|
+
.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
3127
|
.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
3128
|
|
|
3122
3129
|
/* TIPOGRAFIA (B-02, 25/09/2026) — `Text`, `Heading`, `Paragraph` e `Code`, no molde da
|
|
@@ -3190,23 +3197,23 @@ button.tag-main { cursor:pointer; }
|
|
|
3190
3197
|
.prose h2 { font-size:var(--text-2xl); line-height:var(--text-2xl-leading); }
|
|
3191
3198
|
.prose h3 { font-size:var(--text-xl); line-height:var(--text-xl-leading); }
|
|
3192
3199
|
.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
|
|
3200
|
+
.prose blockquote { margin-inline:0; padding-inline-start:var(--space-4); border-inline-start:2px solid transparent; color:var(--muted-foreground); }
|
|
3194
3201
|
.prose ul,.prose ol { padding-inline-start:var(--space-6); }
|
|
3195
3202
|
.prose li + li { margin-block-start:var(--space-2); }
|
|
3196
3203
|
/* `0.9em` e não um token: código dentro do texto se mede em relação à LINHA em que está, e um
|
|
3197
3204
|
valor absoluto o deixaria maior que o parágrafo dentro de um h2. É o mesmo motivo pelo qual o
|
|
3198
3205
|
`.badge` tem `line-height:1` — geometria que depende do contexto se escreve relativa. */
|
|
3199
3206
|
.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
|
|
3207
|
+
.prose pre { overflow-x:auto; padding:var(--space-4); border:1px solid transparent; border-radius:var(--radius-card); background:var(--surface-2); }
|
|
3201
3208
|
.prose pre code { padding:0; border-radius:0; background:transparent; font-size:var(--text-sm); }
|
|
3202
3209
|
.prose img { max-width:100%; height:auto; border-radius:var(--radius-lg); }
|
|
3203
|
-
.prose hr { border:0; border-block-start:1px solid
|
|
3210
|
+
.prose hr { border:0; border-block-start:1px solid transparent; }
|
|
3204
3211
|
.prose figcaption { color:var(--muted-foreground); font-size:var(--text-sm); }
|
|
3205
3212
|
/* A tabela da prosa NÃO é a tabela de dados: sem `min-width:720px`, sem faixa de cabeçalho em
|
|
3206
3213
|
caixa alta e sem hover de linha. Uma tabela de três colunas no meio de um artigo não é uma
|
|
3207
3214
|
grade — forçá-la a 720px é exatamente o defeito que o calendário sofreu. */
|
|
3208
3215
|
.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
|
|
3216
|
+
.prose th,.prose td { padding:var(--space-2) var(--space-3); text-align:start; border-block-end:1px solid transparent; }
|
|
3210
3217
|
.prose th { color:var(--subtle-foreground); font-weight:var(--weight-semibold); }
|
|
3211
3218
|
|
|
3212
3219
|
/* LISTA ORDENÁVEL (PLANO-1.0, item L3). Duas regras aqui não são decoração e quebram
|
|
@@ -3218,8 +3225,8 @@ button.tag-main { cursor:pointer; }
|
|
|
3218
3225
|
(WCAG 1.4.1), e não a cápsula de `.is-selected`: pego e escolhido são coisas diferentes e não
|
|
3219
3226
|
podem falar a mesma língua. */
|
|
3220
3227
|
.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
|
|
3222
|
-
.sortable-item[data-grabbed] { border-color:
|
|
3228
|
+
.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); }
|
|
3229
|
+
.sortable-item[data-grabbed] { border-color:transparent; box-shadow:var(--shadow-lg); }
|
|
3223
3230
|
.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
3231
|
.sortable-handle[aria-pressed="true"] { cursor:grabbing; color:var(--primary); }
|
|
3225
3232
|
.sortable-label { min-width:0; }
|
|
@@ -3239,8 +3246,8 @@ button.tag-main { cursor:pointer; }
|
|
|
3239
3246
|
aparência nova. O bloco PEGO se marca com `data-grabbed`, e o sinal é ELEVAÇÃO e borda — não
|
|
3240
3247
|
cor sozinha (WCAG 1.4.1). */
|
|
3241
3248
|
.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
|
|
3243
|
-
.block-item[data-grabbed] { border-color:
|
|
3249
|
+
.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); }
|
|
3250
|
+
.block-item[data-grabbed] { border-color:transparent; box-shadow:var(--shadow-lg); }
|
|
3244
3251
|
.block-rail { display:grid; grid-auto-rows:min-content; gap:var(--space-1); }
|
|
3245
3252
|
.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
3253
|
.block-handle { cursor:grab; touch-action:none; }
|
|
@@ -3277,8 +3284,8 @@ button.tag-main { cursor:pointer; }
|
|
|
3277
3284
|
.icon-search { max-width:420px; }
|
|
3278
3285
|
.icon-category { margin-top:26px; } .icon-category h3 { margin:0 0 12px; font-size:var(--text-base); }
|
|
3279
3286
|
.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
|
|
3281
|
-
@media (hover:hover) and (pointer:fine) { .icon-tile:hover { color:var(--foreground); border-color:
|
|
3287
|
+
.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); }
|
|
3288
|
+
@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
3289
|
/* JANELAS (0.32.0): o Dialog, o ConfirmDialog e o Drawer com a anatomia da referência, lida no CSS
|
|
3283
3290
|
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
3291
|
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 +3296,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3289
3296
|
.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
3297
|
.dialog-backdrop[data-starting-style],.dialog-backdrop[data-ending-style] { opacity:0; }
|
|
3291
3298
|
.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
|
|
3299
|
+
.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
3300
|
.dialog[data-starting-style] { opacity:0; scale:1.05; }
|
|
3294
3301
|
.dialog[data-ending-style] { opacity:0; scale:.95; transition-duration:var(--duration-fast); }
|
|
3295
3302
|
@media (min-width:640px) { .dialog { --dialog-margin:var(--space-10); } }
|
|
@@ -3341,7 +3348,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3341
3348
|
.drawer-backdrop[data-starting-style],.drawer-backdrop[data-ending-style] { opacity:0; }
|
|
3342
3349
|
.drawer-backdrop[data-swiping] { transition-duration:0ms; }
|
|
3343
3350
|
.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
|
|
3351
|
+
.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
3352
|
.drawer[data-swiping] { transition-duration:0ms; }
|
|
3346
3353
|
.drawer[data-ending-style] { transition-duration:calc(var(--drawer-swipe-strength,1) * var(--duration-slow)); }
|
|
3347
3354
|
.drawer-left,.drawer-right { top:0; bottom:0; inline-size:min(20rem,85vw); transform:translateX(var(--drawer-swipe-movement-x,0px)); }
|
|
@@ -3368,7 +3375,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3368
3375
|
.toast-stack:is(.toast-stack-top,.toast-stack-top-start,.toast-stack-top-end) { --toast-dir:1; inset-block:var(--space-4) auto; }
|
|
3369
3376
|
.toast-stack:is(.toast-stack-bottom-start,.toast-stack-top-start) { inset-inline:var(--space-4) auto; margin-inline:0; }
|
|
3370
3377
|
.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
|
|
3378
|
+
.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
3379
|
.toast-stack:is(.toast-stack-top,.toast-stack-top-start,.toast-stack-top-end) .toast { top:0; bottom:auto; transform-origin:50% 0; }
|
|
3373
3380
|
.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
3381
|
.toast[data-starting-style],.toast[data-ending-style] { transform:translateY(calc(-1 * var(--toast-dir) * 150%)); }
|
|
@@ -3399,7 +3406,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3399
3406
|
.toast-danger :is(.toast-indicator,.toast-title) { color:var(--danger-400); }
|
|
3400
3407
|
/* O X do aviso: o `CloseButton` de 20 com o X de 12, na quina, com borda. Aparece com o mouse ou o
|
|
3401
3408
|
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
|
|
3409
|
+
.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
3410
|
.toast-close.close-button .icon { --step-icon:var(--space-3); }
|
|
3404
3411
|
:is(.toast[data-expanded],.toast:has(> .toast-content:not([data-behind]))):is(:hover,:focus-within) > .toast-close { opacity:1; pointer-events:auto; }
|
|
3405
3412
|
@media (hover:none) { :is(.toast[data-expanded],.toast:has(> .toast-content:not([data-behind]))) > .toast-close { opacity:1; pointer-events:auto; } }
|
|
@@ -3408,10 +3415,10 @@ button.tag-main { cursor:pointer; }
|
|
|
3408
3415
|
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
3416
|
do aviso de sempre. O ícone é desenho de máscara, como a seta do `KPI`: a mesma marcação serve ao
|
|
3410
3417
|
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
|
|
3418
|
+
.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
3419
|
.toast-anchored[data-starting-style],.toast-anchored[data-ending-style] { opacity:0; }
|
|
3413
3420
|
.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:
|
|
3421
|
+
.toast-anchored-danger { border-color:transparent; background:var(--danger-bg); }
|
|
3415
3422
|
.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
3423
|
/* O erro leva o link logo abaixo do aviso, já selecionado, para a pessoa copiar com o teclado. */
|
|
3417
3424
|
.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 +3439,17 @@ button.tag-main { cursor:pointer; }
|
|
|
3432
3439
|
emite de verdade. Não-modal de propósito, como a gaveta do AppShell (ADR-0003): o foco não
|
|
3433
3440
|
fica preso, então não declaramos modalidade que não entregamos. */
|
|
3434
3441
|
.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
|
|
3442
|
+
.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
3443
|
/* Camadas flutuantes (Base UI): tooltip, popover, menu. z-modal para funcionarem sobre diálogos; empilhamento mútuo pela ordem do portal no DOM. */
|
|
3437
3444
|
/* 0.32.0, a dica da referência: recheio de 8, letra de 12/16, até 320 de largura, o fundo das janelas
|
|
3438
3445
|
(era o fundo afundado), e a palavra longa quebra onde precisar. O canto continua o 10 da Aurea (o
|
|
3439
3446
|
dela é 12, que a nossa escala não tem). Entra crescendo de 0,9 e sai encolhendo; pelo teclado, e
|
|
3440
3447
|
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
|
|
3448
|
+
.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
3449
|
.tooltip[data-starting-style],.tooltip[data-ending-style],.popover[data-starting-style],.popover[data-ending-style] { opacity:0; scale:.9; }
|
|
3443
3450
|
.tooltip[data-ending-style],.popover[data-ending-style] { transition-duration:var(--duration-fast); }
|
|
3444
3451
|
.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
|
|
3452
|
+
.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
3453
|
.popover-title { font-weight:var(--weight-medium); }
|
|
3447
3454
|
/* A SETA (0.32.0): o desenho é nosso — uma curva de 12 × 6 —, com o fundo da janela e a linha da borda,
|
|
3448
3455
|
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 +3472,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3465
3472
|
continuar sendo CONTA e não número, o painel passa a ter as medidas da lateral: raio de cartão
|
|
3466
3473
|
e `--space-1` de respiro. Vale para toda lista que usa `.menu`: Combobox, MultiCombobox,
|
|
3467
3474
|
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
|
|
3475
|
+
.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
3476
|
.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
3477
|
.menu-item[data-highlighted],.menu-item:hover:not([data-disabled]) { background:var(--surface-3); }
|
|
3471
3478
|
/* Foco de TECLADO no item: a linha de foco, por dentro, porque a lista recorta o que passa da borda
|
|
@@ -3494,7 +3501,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3494
3501
|
.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
3502
|
/* A linha de atalhos (DOC-07): a tecla da referência (o `Kbd`) com o que ela faz, 12 esmaecido,
|
|
3496
3503
|
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
|
|
3504
|
+
.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
3505
|
.command-shortcuts > span { display:inline-flex; align-items:center; gap:var(--space-1); }
|
|
3499
3506
|
.command-item { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:var(--space-3); align-items:center; }
|
|
3500
3507
|
.command-item-label { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
@@ -3572,9 +3579,9 @@ button.tag-main { cursor:pointer; }
|
|
|
3572
3579
|
check — é quem monta a lista sem o React que ficaria de novo com o rótulo na coluna de 16px. */
|
|
3573
3580
|
.combobox-item > :last-child { grid-column:2; }
|
|
3574
3581
|
/* 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
|
|
3576
|
-
.combobox-multi:hover { border-color:
|
|
3577
|
-
.combobox-multi:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:
|
|
3582
|
+
.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); }
|
|
3583
|
+
.combobox-multi:hover { border-color:transparent; }
|
|
3584
|
+
.combobox-multi:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
|
|
3578
3585
|
.combobox-multi>.combobox-actions { position:static; inset-inline-end:auto; }
|
|
3579
3586
|
/* o campo de chips não é `.input`, então a regra de :disabled dos campos não o alcança. Quem
|
|
3580
3587
|
marca aqui é o `data-disabled` que o Base UI põe no InputGroup a partir do estado da Root. */
|
|
@@ -3596,19 +3603,19 @@ button.tag-main { cursor:pointer; }
|
|
|
3596
3603
|
só existe ENTRE seções — margem no bloco deixaria sobra solta no fim da lista. */
|
|
3597
3604
|
/* 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
3605
|
.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
|
|
3606
|
+
.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
3607
|
/* FileInput / DropZone (Fase 4) — só a UI de entrada; upload real é a Fase 5.
|
|
3601
3608
|
A zona é um <label> em volta do <input> nativo: clique/foco/teclado de graça,
|
|
3602
3609
|
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
|
|
3604
|
-
.dropzone:hover { border-color:
|
|
3605
|
-
.dropzone:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:
|
|
3606
|
-
.dropzone[data-dragging="true"] { border-style:solid; border-color:
|
|
3610
|
+
.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); }
|
|
3611
|
+
.dropzone:hover { border-color:transparent; }
|
|
3612
|
+
.dropzone:focus-within { outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; border-color:transparent; }
|
|
3613
|
+
.dropzone[data-dragging="true"] { border-style:solid; border-color:transparent; background:var(--surface-2); }
|
|
3607
3614
|
.dropzone strong { color:var(--foreground); }
|
|
3608
3615
|
.dropzone-icon { color:var(--primary); }
|
|
3609
3616
|
.dropzone-hint { font-size:var(--text-xs); }
|
|
3610
3617
|
.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
|
|
3618
|
+
.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
3619
|
.file-progress { flex-basis:var(--space-20); flex-shrink:0; } /* largura fixa da barra de upload (auditoria 18/07, M14) */
|
|
3613
3620
|
.file-name { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
3614
3621
|
.file-size { flex:none; color:var(--muted-foreground); font-size:var(--text-xs); font-variant-numeric:tabular-nums; }
|
|
@@ -3670,8 +3677,10 @@ button.tag-main { cursor:pointer; }
|
|
|
3670
3677
|
.combobox-multi:has([aria-invalid="true"]),
|
|
3671
3678
|
.combobox-multi:has(:user-invalid),
|
|
3672
3679
|
.dropzone:has([aria-invalid="true"]),
|
|
3673
|
-
.dropzone:has(:user-invalid) { border-color:var(--danger-
|
|
3674
|
-
/* ↑
|
|
3680
|
+
.dropzone:has(:user-invalid) { border-color:transparent; background-color:var(--danger-bg); --focus-strong:var(--danger-400); }
|
|
3681
|
+
/* ↑ Sem linha (16/10/2026, o Victor: "quero tudo sem borda sem exceções"): o inválido era a borda vermelha; sem
|
|
3682
|
+
borda, ele é o FUNDO de perigo (`--danger-bg`), o mesmo dos avisos. A frase de erro do `Field` continua embaixo.
|
|
3683
|
+
`--focus-strong` (ADR-0059, 08/10/2026): o anel de foco agora COLA na borda e a pinta — com o
|
|
3675
3684
|
amarelo, o campo inválido perdia o vermelho justo enquanto a pessoa corrige. No inválido o anel é
|
|
3676
3685
|
da cor do perigo, como o campo inválido da referência principal. Cor por contexto se faz assim,
|
|
3677
3686
|
redefinindo `--focus-strong` (check 44). */
|
|
@@ -3718,7 +3727,7 @@ button.tag-main { cursor:pointer; }
|
|
|
3718
3727
|
.notification-trigger { position:relative; display:inline-flex; }
|
|
3719
3728
|
.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
3729
|
.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
|
|
3730
|
+
.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
3731
|
.notification-head strong { font-size:var(--text-sm); }
|
|
3723
3732
|
.notification-list { margin:0; padding:var(--space-1); overflow-y:auto; max-height:min(60vh,440px); }
|
|
3724
3733
|
.notification-sublist { margin:0; padding:0; list-style:none; }
|
|
@@ -3820,7 +3829,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
|
|
|
3820
3829
|
@media (min-width:768px) {
|
|
3821
3830
|
.datagrid-split { grid-template-columns:1fr var(--datagrid-detail-w,20rem); }
|
|
3822
3831
|
}
|
|
3823
|
-
.datagrid-detail { border:1px solid
|
|
3832
|
+
.datagrid-detail { border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); padding:var(--space-4); }
|
|
3824
3833
|
.datagrid-detail-head { display:flex; justify-content:flex-end; }
|
|
3825
3834
|
|
|
3826
3835
|
/* G2: a ação de conjunto fica à direita, acima da fila — perto do que ela comanda e
|
|
@@ -3835,8 +3844,8 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
|
|
|
3835
3844
|
|
|
3836
3845
|
/* G5/G6: a escolha do conflito e o recibo. Os dois são superfície de card porque são
|
|
3837
3846
|
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
|
|
3839
|
-
.file-receipt { padding:var(--space-3); border:1px solid
|
|
3847
|
+
.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); }
|
|
3848
|
+
.file-receipt { padding:var(--space-3); border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); }
|
|
3840
3849
|
.file-receipt-head { display:flex; align-items:center; justify-content:space-between; gap:var(--space-2); }
|
|
3841
3850
|
.file-receipt ul { margin:0; padding-inline-start:var(--space-5); color:var(--muted-foreground); font-size:var(--text-sm); }
|
|
3842
3851
|
|
|
@@ -3848,7 +3857,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
|
|
|
3848
3857
|
.agent-card-id { display:grid; flex:1; min-inline-size:0; }
|
|
3849
3858
|
.agent-card-desc { margin:0; color:var(--muted-foreground); }
|
|
3850
3859
|
.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
|
|
3860
|
+
.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
3861
|
.agent-card-actions { display:flex; justify-content:flex-end; gap:var(--space-2); }
|
|
3853
3862
|
.agent-inspector { display:grid; gap:var(--space-4); }
|
|
3854
3863
|
.agent-inspector-head { display:flex; align-items:center; justify-content:space-between; }
|
|
@@ -3864,13 +3873,13 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
|
|
|
3864
3873
|
.invocation-steps { display:grid; gap:var(--space-2); margin:0; padding:0; list-style:none; }
|
|
3865
3874
|
/* O estado do passo entra por BORDA lateral, não por cor de fundo: fundo colorido
|
|
3866
3875
|
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
|
|
3868
|
-
.invocation-step[data-state="running"] { border-inline-start-color:var(--primary); }
|
|
3869
|
-
.invocation-step[data-state="error"] { border-inline-start-color:var(--danger-
|
|
3876
|
+
.invocation-step { padding-inline-start:var(--space-3); border-inline-start:2px solid transparent; }
|
|
3877
|
+
.invocation-step[data-state="running"] { border-inline-start-color:transparent; background:color-mix(in oklab,var(--primary) 8%,transparent); }
|
|
3878
|
+
.invocation-step[data-state="error"] { border-inline-start-color:transparent; background:var(--danger-bg); }
|
|
3870
3879
|
.invocation-step-body { padding-block-start:var(--space-2); }
|
|
3871
3880
|
|
|
3872
3881
|
.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
|
|
3882
|
+
.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
3883
|
.task-line { display:flex; align-items:center; gap:var(--space-2); }
|
|
3875
3884
|
.task-title { flex:1; min-inline-size:0; font-weight:var(--weight-medium); }
|
|
3876
3885
|
.task-desc { margin:0; color:var(--muted-foreground); font-size:var(--text-sm); }
|
|
@@ -3922,7 +3931,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
|
|
|
3922
3931
|
.trace-span[data-error] .trace-bar { background:var(--danger-400); }
|
|
3923
3932
|
|
|
3924
3933
|
.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
|
|
3934
|
+
.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
3935
|
.health-name { font-weight:var(--weight-medium); }
|
|
3927
3936
|
|
|
3928
3937
|
/* H.e — custo e memória.
|
|
@@ -3960,7 +3969,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
|
|
|
3960
3969
|
.cost-meter[data-state="over"] .cost-meter-bar { background:var(--danger-400); }
|
|
3961
3970
|
|
|
3962
3971
|
.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
|
|
3972
|
+
.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
3973
|
.memory-line { display:flex; flex-wrap:wrap; align-items:baseline; gap:var(--space-2); }
|
|
3965
3974
|
.memory-content { flex:1; min-inline-size:0; }
|
|
3966
3975
|
.memory-time { flex:none; color:var(--muted-foreground); font-family:var(--font-code); font-size:var(--text-xs); }
|
|
@@ -3974,10 +3983,10 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
|
|
|
3974
3983
|
|
|
3975
3984
|
/* H.f — a relação. */
|
|
3976
3985
|
.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
|
|
3986
|
+
.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
3987
|
/* O recado que FALHOU muda a borda, não o fundo: é o mesmo tratamento do passo do
|
|
3979
3988
|
`InvocationPanel`, e pelo mesmo motivo — fundo colorido disputa leitura com o texto. */
|
|
3980
|
-
.agent-message[data-kind="error"] { border-color:var(--danger-
|
|
3989
|
+
.agent-message[data-kind="error"] { border-color:transparent; background:var(--danger-bg); }
|
|
3981
3990
|
.agent-message-line { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2); }
|
|
3982
3991
|
.agent-message-route { display:inline-flex; align-items:center; gap:var(--space-1); flex:1; min-inline-size:0; }
|
|
3983
3992
|
.agent-message-arrow { flex:none; color:var(--muted-foreground); }
|
|
@@ -4005,7 +4014,7 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
|
|
|
4005
4014
|
/* `inline-size:100%` não é enfeite, é a mesma lição do Chart: painel de demo é flex, e uma
|
|
4006
4015
|
caixa de largura automática entra como item que encolhe — medido no catálogo, a tela do grafo
|
|
4007
4016
|
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
|
|
4017
|
+
.dependency-graph { inline-size:100%; block-size:28rem; border:1px solid transparent; border-radius:var(--radius-card); background:var(--card); overflow:hidden;
|
|
4009
4018
|
--xy-background-color:transparent;
|
|
4010
4019
|
--xy-background-pattern-color:var(--border);
|
|
4011
4020
|
--xy-edge-stroke:var(--muted-foreground);
|
|
@@ -4040,14 +4049,14 @@ th[aria-sort] .datagrid-sort-icon { color:var(--primary); }
|
|
|
4040
4049
|
/* O nó é uma superfície flutuante como qualquer outra da Aurea — mesmo raio de cartão, mesma
|
|
4041
4050
|
borda, mesmo fundo. É aqui que ele deixa de parecer React Flow. */
|
|
4042
4051
|
.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
|
|
4052
|
+
.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
4053
|
button.graph-node-body { cursor:pointer; }
|
|
4045
|
-
.graph-node[data-selected] .graph-node-body { border-color:var(--primary); }
|
|
4054
|
+
.graph-node[data-selected] .graph-node-body { border-color:transparent; background:color-mix(in oklab,var(--primary) 14%,var(--card)); }
|
|
4046
4055
|
.graph-node-label { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:var(--weight-medium); }
|
|
4047
4056
|
/* `kind` é TEXTO, e não cor: a referência pinta dez tipos de nó em dez cores, e é a quarta vez
|
|
4048
4057
|
que esta parte recusa a mesma coisa. */
|
|
4049
4058
|
.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
|
|
4059
|
+
.graph-handle { inline-size:var(--space-2); block-size:var(--space-2); border:1px solid transparent; background:var(--surface-2); }
|
|
4051
4060
|
/* ── RODADA 1 DA REDE (ADR-0064, 10/10/2026) ───────────────────────────────────────────────
|
|
4052
4061
|
O ÍCONE vai ao lado do texto, e o texto continua inteiro (o tipo é PALAVRA — a recusa das cores
|
|
4053
4062
|
continua de pé). Os SELOS sentam na borda, nos cantos: a quantidade em cima, à direita; o estado
|
|
@@ -4062,7 +4071,7 @@ button.graph-node-body { cursor:pointer; }
|
|
|
4062
4071
|
.graph-node-status .badge { max-inline-size:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
4063
4072
|
/* "Ir até" (focusId): a marca de achado é a borda da marca com uma linha por dentro, como o
|
|
4064
4073
|
cartão escolhido — e não o anel de foco, que é do teclado. */
|
|
4065
|
-
.graph-node[data-focused] .graph-node-body { border-color:
|
|
4074
|
+
.graph-node[data-focused] .graph-node-body { border-color:transparent; outline:var(--focus-width) solid var(--focus-strong); outline-offset:0; }
|
|
4066
4075
|
/* O resto apaga quando há caminho ou vizinhos acesos (MNT-18.3 e 18.6). */
|
|
4067
4076
|
.graph-node[data-dimmed] { opacity:.3; }
|
|
4068
4077
|
.dependency-graph .is-dimmed { opacity:.25; }
|
|
@@ -4104,15 +4113,15 @@ button.graph-node-body { cursor:pointer; }
|
|
|
4104
4113
|
nem rolar a tela por ela (o botão do grupo precisa do clique). Fora do botão, o cursor é o comum. */
|
|
4105
4114
|
.graph-edge-chip.nodrag.nopan { cursor:default; }
|
|
4106
4115
|
.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
|
|
4108
|
-
.graph-edge-group[aria-expanded="true"] { border-color:
|
|
4116
|
+
.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; }
|
|
4117
|
+
.graph-edge-group[aria-expanded="true"] { border-color:transparent; }
|
|
4109
4118
|
.graph-edge-mark { display:inline-grid; place-items:center; color:var(--foreground); }
|
|
4110
4119
|
.graph-edge-mark-cross:before { content:"\2715"; font-weight:var(--weight-bold); }
|
|
4111
4120
|
.graph-edge-mark-dot { inline-size:var(--space-2); block-size:var(--space-2); border-radius:var(--radius-full); background:currentColor; }
|
|
4112
4121
|
/* 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
|
|
4114
|
-
.graph-minimap { border:var(--border-width) solid
|
|
4115
|
-
.graph-legend { display:grid; gap:var(--space-1); margin:0; padding:var(--space-2) var(--space-3); border:var(--border-width) solid
|
|
4122
|
+
.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); }
|
|
4123
|
+
.graph-minimap { border:var(--border-width) solid transparent; border-radius:var(--radius-md); overflow:hidden; }
|
|
4124
|
+
.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
4125
|
/* 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
4126
|
a lista sozinha, como era. */
|
|
4118
4127
|
.graph-legend ul { display:grid; gap:var(--space-1); margin:0; padding:0; list-style:none; }
|
|
@@ -4130,7 +4139,7 @@ button.graph-node-body { cursor:pointer; }
|
|
|
4130
4139
|
/* ALTO CONTRASTE (MNT-19.3): linha e letra no tom da letra, a base da linha dobra, e a borda do nó
|
|
4131
4140
|
também. Tudo o mais (pesos, pontilhado, duplo) é múltiplo da base e acompanha sozinho. */
|
|
4132
4141
|
.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:
|
|
4142
|
+
.dependency-graph[data-contrast="high"] .graph-node-body { border-color:transparent; border-width:calc(var(--border-width) * 2); }
|
|
4134
4143
|
.dependency-graph[data-contrast="high"] .graph-node-kind,.dependency-graph[data-contrast="high"] .graph-node-icon { color:var(--foreground); }
|
|
4135
4144
|
/* ── RODADA 2 DA REDE (ADR-0065, 10/10/2026) ───────────────────────────────────────────────
|
|
4136
4145
|
O LAÇO do modo de arrumar e a caixa em volta dos escolhidos se vestem pelas variáveis do motor. */
|
|
@@ -4140,14 +4149,14 @@ button.graph-node-body { cursor:pointer; }
|
|
|
4140
4149
|
(ADR-0059). A caixa do motor, quadrada, não desenha anel nenhum. */
|
|
4141
4150
|
.dependency-graph :focus-visible:has(> .graph-node) { outline:none; }
|
|
4142
4151
|
.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:
|
|
4152
|
+
.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
4153
|
/* O CONTÊINER aberto (site, andar, rack): a região em volta dos filhos, com a cabeça. A cabeça tem
|
|
4145
4154
|
`--space-10` e o recheio `--space-4` — os mesmos números com que o graph.tsx monta a caixa. */
|
|
4146
4155
|
/* 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
4156
|
região continua aparecendo (o contêiner é um nó, e o motor o desenha acima das linhas comuns). E o
|
|
4148
4157
|
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
|
|
4150
|
-
.graph-group[data-selected] { border-color:var(--primary); }
|
|
4158
|
+
.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); }
|
|
4159
|
+
.graph-group[data-selected] { border-color:transparent; background:color-mix(in oklab,var(--primary) 10%,transparent); }
|
|
4151
4160
|
.graph-group[data-dimmed] { opacity:.3; }
|
|
4152
4161
|
.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
4162
|
.graph-group-label { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:var(--weight-medium); }
|
|
@@ -4157,11 +4166,11 @@ button.graph-node-body { cursor:pointer; }
|
|
|
4157
4166
|
/* O de NÓ senta no CANTO de baixo, à direita, como a quantidade no de cima: fechado, mostra QUANTOS
|
|
4158
4167
|
guarda ("+12"). No canto, e não na borda: na borda ele cobria a alça da última porta (medido na
|
|
4159
4168
|
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
|
|
4161
|
-
.graph-node-toggle[aria-expanded="false"] { border-color:
|
|
4169
|
+
.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; }
|
|
4170
|
+
.graph-node-toggle[aria-expanded="false"] { border-color:transparent; }
|
|
4162
4171
|
.graph-node:has(.graph-node-toggle) .graph-node-status { max-inline-size:calc(100% - var(--space-16)); }
|
|
4163
4172
|
/* 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
|
|
4173
|
+
.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
4174
|
/* A NUVEM é desenho de FUNDO: a caixa do nó fica sem borda e sem fundo, e o texto vai ao centro. */
|
|
4166
4175
|
.graph-node-cloud { position:absolute; inset:0; inline-size:100%; block-size:100%; overflow:visible; pointer-events:none; }
|
|
4167
4176
|
.graph-node-cloud path { fill:var(--card); stroke:var(--border); stroke-width:var(--border-width); }
|
|
@@ -4197,14 +4206,14 @@ button.graph-node-body { cursor:pointer; }
|
|
|
4197
4206
|
.operational-grid .demo{min-height:0}@media(max-width:640px){.operational-grid .demo{grid-column:span 12}}
|
|
4198
4207
|
.universal-grid .demo { min-height:0; }
|
|
4199
4208
|
.pattern-toolbar .input-group { flex:1 1 180px; }
|
|
4200
|
-
.media-library-row.active { border-color:var(--primary); }
|
|
4209
|
+
.media-library-row.active { border-color:transparent; background:color-mix(in oklab,var(--primary) 10%,transparent); }
|
|
4201
4210
|
/* Alvo de toque. `.tabs`/`.segmented` no lugar de `.tab`/`.segmented button`: agora a altura
|
|
4202
4211
|
mora na cápsula, então é ela que precisa crescer — o filho estica atrás. O `CloseButton` fica de
|
|
4203
4212
|
fora (0.32.0): o alvo dele é o `::before` de 44, e o círculo continua de 24, como o da referência. */
|
|
4204
4213
|
@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
4214
|
@media (forced-colors:active) {
|
|
4206
4215
|
: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
|
|
4216
|
+
.badge,.pattern-gallery button[aria-pressed="true"],.device-grid button[aria-pressed="true"] { border:1px solid transparent; }
|
|
4208
4217
|
/* O glifo por máscara é FUNDO recortado, e aqui o navegador troca todo fundo pela cor da tela: o
|
|
4209
4218
|
glifo sumia (medido em 12/10/2026: zero ponto de tinta nos cinco). Ele sai da troca e pinta com a
|
|
4210
4219
|
cor do SISTEMA que o texto ao lado recebe — pelo nome, porque `inherit` aqui devolve a cor de
|
|
@@ -4222,11 +4231,14 @@ button.graph-node-body { cursor:pointer; }
|
|
|
4222
4231
|
sistema. Quem cobra: `tests/visual/mascara-alto-contraste.spec.ts`. */
|
|
4223
4232
|
:is(.color-swatch,.color-swatch-option) { forced-color-adjust:none; }
|
|
4224
4233
|
.color-swatch-option:has(:focus-visible) { outline-color:CanvasText; }
|
|
4234
|
+
/* Sem linha (ADR-0072, 16/10/2026): a rodinha do `Spinner` e o visto do `Checkbox` deixaram de ser linha (que o alto
|
|
4235
|
+
contraste pinta) e viraram desenho por máscara — fundo, que a troca apaga. Saem da troca, na cor do texto. */
|
|
4236
|
+
.spinner,.checkbox input:checked + .control-mark::after { forced-color-adjust:none; background:CanvasText; }
|
|
4225
4237
|
}
|
|
4226
4238
|
|
|
4227
4239
|
|
|
4228
4240
|
/* Aurea v1.7 stabilization patch — visual design unchanged. */
|
|
4229
|
-
.badge-running{background:var(--success-bg);color:var(--success-400);border-color:
|
|
4241
|
+
.badge-running{background:var(--success-bg);color:var(--success-400);border-color:transparent}
|
|
4230
4242
|
/* superfície (overflow, borda, fundo, raio) mora junto com a do `.table-wrap` lá em cima — aqui
|
|
4231
4243
|
fica só o que é DESTA região: ela é focável, e o foco dela é a linha de dentro, abaixo. Era um
|
|
4232
4244
|
halo de `--focus` a 38% (B-09, 24/09/2026): claro demais para se ver, e fora do contrato de foco.
|
|
@@ -4337,6 +4349,58 @@ button.graph-node-body { cursor:pointer; }
|
|
|
4337
4349
|
`@media`/`@container` não leem `var()`, então os valores aqui são literais da escala — o
|
|
4338
4350
|
check 4b do validate.py cobra que eles pertençam a `--breakpoint-*`, nos dois. */
|
|
4339
4351
|
|
|
4352
|
+
/* ── SEM LINHA, OS FUNDOS (ADR-0072, 16/10/2026) ───────────────────────────────────────────────────────────────────
|
|
4353
|
+
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
|
|
4354
|
+
viu cada uma ao lado da sugestão e escolheu: "caixa B, o resto tudo B".
|
|
4355
|
+
· Três fundos TRANSLÚCIDOS da cor do texto — como o trilho desligado do switch da referência (o texto a 20%): se
|
|
4356
|
+
separam de QUALQUER fundo atrás. Uma cor fixa acaba igual a alguma superfície; foi assim que as peças sumiram.
|
|
4357
|
+
`--fill-1` 6% · `--fill-2` 10% (campo, botão de contorno, barra, código) · `--fill-3` 20% (marca do checkbox e do
|
|
4358
|
+
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
|
|
4359
|
+
mapa), a mesma mistura OPACA, sobre a cor da página (`-solid`): translúcido, o que está atrás aparecia.
|
|
4360
|
+
· Declarados onde o tema se declara, para seguir a faixa de outro tema (GAR-05); as cores de cada marca também moram
|
|
4361
|
+
nos elementos com `[data-theme]` (os tokens da marca), então a marca vem junto.
|
|
4362
|
+
· A ÚNICA linha que fica é a do cartão de contorno (a caixa da vitrine): clara, o texto a 10% — a "B" da caixa. */
|
|
4363
|
+
: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)); }
|
|
4364
|
+
/* O `secondary` do campo tem fundo próprio (`--secondary`, sem linha desde antes) e fica como era — sem o `:where`, esta
|
|
4365
|
+
regra (vinda depois) pintava por cima dele e o `secondary` ficava igual ao comum. O `:where` mantém a força de uma
|
|
4366
|
+
classe, e o inválido (que vem antes, com mais força) continua vencendo. */
|
|
4367
|
+
.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); }
|
|
4368
|
+
.input-group > :is(.input,.select,.textarea),.number-field-group .input,.combobox-multi .input { background-color:transparent; }
|
|
4369
|
+
.control-mark,.switch-track { background-color:var(--fill-3); }
|
|
4370
|
+
.btn-outline { --btn-bg:var(--fill-2); }
|
|
4371
|
+
.btn-outline.btn-tone-brand,.btn-primary-outline { --btn-bg:color-mix(in oklab,var(--primary) 16%,transparent); }
|
|
4372
|
+
/* 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
|
|
4373
|
+
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
|
|
4374
|
+
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"
|
|
4375
|
+
da bancada, escolhida pelo Victor. */
|
|
4376
|
+
.btn-outline.btn-tone-danger,.btn-danger-outline { --btn-bg:color-mix(in oklab,var(--destructive) 16%,transparent); }
|
|
4377
|
+
.btn-outline.btn-tone-success { --btn-bg:color-mix(in oklab,var(--success) 16%,transparent); }
|
|
4378
|
+
.btn-outline.btn-tone-info { --btn-bg:color-mix(in oklab,var(--info) 16%,transparent); }
|
|
4379
|
+
.btn-outline.btn-tone-warning { --btn-bg:color-mix(in oklab,var(--warning) 16%,transparent); }
|
|
4380
|
+
.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); }
|
|
4381
|
+
.btn-outline.btn-tone-success:hover:not(:disabled) { --btn-bg:color-mix(in oklab,var(--success) 22%,transparent); }
|
|
4382
|
+
.btn-outline.btn-tone-info:hover:not(:disabled) { --btn-bg:color-mix(in oklab,var(--info) 22%,transparent); }
|
|
4383
|
+
.btn-outline.btn-tone-warning:hover:not(:disabled) { --btn-bg:color-mix(in oklab,var(--warning) 22%,transparent); }
|
|
4384
|
+
[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)); }
|
|
4385
|
+
[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)); }
|
|
4386
|
+
[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)); }
|
|
4387
|
+
[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)); }
|
|
4388
|
+
.code-block,.log-stream,.dropzone,.toolbar,.file-item,.agent-cap { background-color:var(--fill-2); }
|
|
4389
|
+
/* 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
|
|
4390
|
+
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
|
|
4391
|
+
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. */
|
|
4392
|
+
.badge-outline { background-color:color-mix(in oklab,var(--badge-accent) 16%,transparent); color:color-mix(in oklab,var(--badge-accent) 80%,var(--foreground)); }
|
|
4393
|
+
/* 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. */
|
|
4394
|
+
.log-stream .log-level.info { color:color-mix(in oklab,var(--info-400) 80%,var(--foreground)); }
|
|
4395
|
+
.step:not(.step-done,.step-active,.step-error,.done,.active) .step-dot { background-color:var(--fill-3-solid); }
|
|
4396
|
+
.avatar:not([class*="avatar-tone"],.avatar-count) { background-color:var(--fill-3-solid); }
|
|
4397
|
+
.graph-node-body { background-color:var(--fill-2-solid); }
|
|
4398
|
+
.card-outline { border-color:color-mix(in oklab,var(--foreground) 10%,transparent); }
|
|
4399
|
+
/* O pino que se arrasta sobre a cor: branco por baixo e a cor numa bolinha por cima, 3 para dentro — o branco é
|
|
4400
|
+
DESENHO CHEIO, não aro; e a sombra o solta da trilha. */
|
|
4401
|
+
.slider-color .slider-thumb,.color-area-thumb { background:var(--white); box-shadow:var(--shadow-md); }
|
|
4402
|
+
.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))); }
|
|
4403
|
+
|
|
4340
4404
|
/* >>> camada responsiva — GERADA por scripts/build-responsive-layer.mjs <<< */
|
|
4341
4405
|
/* As variáveis de passo NÃO HERDAM. Ver o comentário de VARIAVEIS no gerador: um ícone dentro
|
|
4342
4406
|
de um botão responsivo herdaria o passo do botão e mudaria de tamanho sozinho. */
|