/*
 * shared/components.css — componentes compartilhados do design system (Sprint 13)
 * ------------------------------------------------------------------
 * Começa com a TAB BAR canônica: a mesma altura, fonte, peso, padding e
 * sublinhado ativo em todos os módulos. Antes cada módulo replicava
 * .tabs__tab/.tabs__bar com valores divergentes (13 vs 13.5px, 400 vs 500 vs
 * 600, 0.5 vs 1 vs 2px de borda, padding diferente) — por isso pareciam de
 * alturas/tamanhos diferentes.
 *
 * Consome as variáveis do shared/tokens.css. INCLUIR DEPOIS do tokens.css:
 *     <link rel="stylesheet" href="/shared/tokens.css">
 *     <link rel="stylesheet" href="/shared/components.css">
 * O módulo NÃO deve redefinir .tabs__bar/.tabs__tab/.tabs__pane localmente (senão a regra
 * de página vence e volta a divergir). S45: o apelido .tabs foi aposentado e os
 * três consumidores (Alertas, Sincronia, Sugestões) migraram para a barra canônica.
 * ------------------------------------------------------------------
 */

/* S45: o apelido .tabs saiu como CLASSE — ele e o .tab-bar eram seletores da
   MESMA regra, e o DS absorvia a divergência em vez de resolvê-la.
   S46 · BEM: .tabs VOLTA, agora como nome do BLOCO, não como apelido da faixa.
   A faixa, o botão e o painel são três peças de UM componente, e nenhuma delas
   existe sozinha — em BEM isso as torna elementos, e elemento precisa de bloco.
   NENHUMA <div> nova no HTML: o bloco nomeia a família, não a ancestralidade,
   então .tabs__pane segue irmão de .tabs__bar como sempre foi. */
.tabs__bar{
  display:flex;
  align-items:center;
  gap:2px;
  background:transparent; /* S38: tab-bar transparente — acompanha o container (page-bg direto ou card --surface); nao conflita em nenhum contexto */
  border-bottom:1px solid var(--border);
  padding:0 12px;
  overflow-x:auto;
  overflow-y:hidden;
}

/* S49: a aba nao declarava DISPLAY nenhum. Como a .tabs__bar e flex, a aba ja
   era blockificada — mas sem ser ela propria um contexto flex, nao havia gap, e
   o icone alinhava por BASELINE (o .icon traz vertical-align:-0.125em). Sem
   espacamento no componente, cada consumidor improvisou o seu, e viraram quatro
   dialetos: margin-right .35em inline (16 pontos), .4em no helper icL() dos
   E-mails, um span.ti + espaco literal no Alertas (e a .ti nao existe em CSS
   nenhum) e nada nas abas sem icone. Agora o vao vem daqui, 6px, o mesmo do
   .chip e do .button — e o icone passa a alinhar pelo CENTRO.
   ATENCAO: esta regra e a remocao dos margin-right inline sao UM commit so.
   Com os dois vivendo juntos o vao vira 10,55px em toda aba com icone. */
.tabs__tab{
  display:inline-flex;
  align-items:center;
  gap:6px;
  /* S49: 13px, 500 e 1.3 eram numeros crus, e os tres ja existiam no tokens.css
     com EXATAMENTE estes valores — --fs-sm, --fw-medium e --lh-tight. Zero
     pixel, e por isso este pedaco viaja num commit separado: um passo cuja
     conferencia e "nada mudou" nao pode andar junto de um que muda medida. */
  font-family:var(--font,inherit);
  font-size:var(--fs-sm);
  font-weight:var(--fw-medium);
  line-height:var(--lh-tight);
  padding:11px 16px;
  border:none;
  background:none;
  color:var(--text2);
  border-bottom:2px solid transparent;
  margin-bottom:-1px;
  white-space:nowrap;
  cursor:pointer;
  transition:color .15s,border-color .15s;
}
.tabs__tab:hover{ color:var(--text); }
.tabs__tab.tabs__tab--active{
  color:var(--blue);
  border-bottom-color:var(--blue);
  font-weight:600;
}
[data-theme="dark"] .tabs__tab.tabs__tab--active{
  color:var(--accent);
  border-bottom-color:var(--accent);
}

/* A terceira peça da família (S45): .tabs__bar é a faixa, .tabs__tab é o botão,
   .tabs__pane é o conteúdo. Faltava no DS, e por isso a área de conteúdo de uma
   aba tinha QUATRO nomes: .tab-content (Metas, Roadmap), .tab-pane (Sugestões)
   e .pane (Sincronia — que ainda acumulava layout junto do estado).
   Só ESTADO: o painel não declara largura, respiro nem fundo. */
.tabs__pane{ display:none; }
.tabs__pane--active{ display:block; }

/* -- Modal de confirmacao/aviso estilizado (uiConfirm/uiAlert) — compartilhado
   (S20 · fatoracao; antes duplicado em roadmap/sincronia/metas/index).
   S46 · BEM: o bloco era .ui-modal, com .ui-btn dentro. O prefixo "ui-" não
   era abreviação — era DESVIO DE COLISÃO: esta família nasceu depois do
   .modal canônico e precisava de um nome livre. E "ui-" não descreve nada,
   porque o arquivo inteiro é UI. Agora o nome diz o papel: isto é o DIÁLOGO
   DE CONFIRMAÇÃO, e o .modal é o modal de formulário. São coisas diferentes,
   com valores diferentes — .confirm__button é 13px/600/9-16 e o .btn é
   14px/500/6-12 —, e por isso não foram fundidos aqui: fundir muda pixel.
   A fusão vira item de backlog, agora com nome próprio em vez de escondida
   atrás de um prefixo defensivo. -- */
.confirm__overlay{position:fixed;inset:0;background:var(--overlay);z-index:100000;display:flex;align-items:center;justify-content:center;padding:16px;animation:uiFade .15s ease}
@keyframes uiFade{from{opacity:0}to{opacity:1}}
.confirm{width:100%;max-width:380px;background:var(--surface);border-radius:var(--r-lg);box-shadow:var(--shadow-xl);overflow:hidden;animation:uiPop .18s ease}
@keyframes uiPop{from{transform:translateY(8px) scale(.98);opacity:0}to{transform:none;opacity:1}}
.confirm__head{display:flex;align-items:center;gap:10px;padding:17px 19px 10px}
.confirm__icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:16px;flex-shrink:0}
/* ⚠ Emitidas por TERNÁRIO em scripts/core/modal.js:26 e :43 —
   ${o.danger ? "confirm__icon--danger" : "confirm__icon--info"}
   NENHUMA das duas aparece como class="…" no markup: grep de atributo não as
   acha, e a --info é o ramo PADRÃO de todo uiConfirm/uiAlert não-destrutivo.
   Os nomes antigos eram .q e .d, e a auditoria da S46 chegou a dar a .q como
   morta antes de ler o modal.js. Nome pela SEVERIDADE e não pelo desenho:
   o ícone é sobrescrevível (o.icon), e o fechamento.js:715 já manda um
   triângulo de aviso pelo ramo azul — "question" descreveria o conteúdo, que
   não é garantido. Os tokens são os mesmos de .alert--info e .badge--info. */
.confirm__icon--info{background:var(--blue2s);color:var(--blue2)}
.confirm__icon--danger{background:var(--red2);color:var(--red)}
/* S38: glifo centrado no circulo — bloco + tamanho explicito, sem o vertical-align
   inline (que era so p/ alinhar com texto) atrapalhar a centralizacao do flex. */
.confirm__icon .icon{display:block;width:18px;height:18px;vertical-align:0}
.confirm__title{font-size:15px;font-weight:700;color:var(--text);line-height:1.25}
.confirm__body{padding:0 19px 4px;font-size:13px;color:var(--text2);line-height:1.55}
/* S48 — o corpo do confirm aceita `bodyHtml` com mais de um parágrafo, e não
   dizia nada sobre o espaço entre eles: quem passava dois dependia da margem
   nativa do navegador. Nas 7 páginas que já zeravam o espaço nativo, dois
   parágrafos sairiam COLADOS — só não aconteceu porque o único consumidor com
   dois (o desativar do Links) estava numa página sem reset. Com o reset agora
   canônico, a regra tem de ser do componente. */
.confirm__body p + p{margin-top:var(--sp-2)}
.confirm__warn{margin:12px 19px 2px;background:var(--orange2);border:1px solid color-mix(in srgb,var(--orange) 30%,transparent);border-radius:8px;padding:9px 11px;font-size:12px;color:var(--gold-fg);line-height:1.45;display:flex;gap:7px}
.confirm__foot{display:flex;justify-content:flex-end;gap:9px;padding:17px 19px}
.confirm__button{font-family:inherit;font-size:13px;font-weight:600;border-radius:8px;padding:9px 16px;cursor:pointer;border:1px solid transparent}
.confirm__button--ghost{background:none;border-color:var(--border);color:var(--text2)}
.confirm__button--primary{background:var(--accent);color:#fff}
.confirm__button--danger{background:var(--red,#A32D2D);color:#fff}

/* ==== BOTAO canonico (S29 . CSS-A) — GXON re-expresso nos tokens ====
   S46 · BEM: .btn virou .button. Foi a unica abreviacao MANTIDA na decisao
   inicial de 24/08 — "btn" e lingua franca de design system, reconhece-se em
   vez de decifrar-se — e o Pablo reverteu a decisao no mesmo dia: se .tbl,
   .crumb e .dlist sairam, o .btn sai junto, e o arquivo fica sem excecao.
   CUIDADO REGISTRADO: o Shell tem .btn-primary, .btn-sm e .btn-cancel LOCAIS
   (styles/pages/index.css:165,197,234), com valores proprios e usadas SOZINHAS,
   nunca com .btn. Colidiam de nome com estes modificadores; a colisao morre com
   este rename, e as tres seguem intactas ate a sprint das 36 locais.
   Familia "acao": sincronia/sugestoes/e-mails/diagramacao usam isto.
   Chips de barra (metas/roadmap), controles de tabela (index) e SSO (login)
   seguem LOCAIS por ora (papeis distintos; migram depois). */
.button{font-family:inherit;display:inline-flex;align-items:center;justify-content:center;gap:6px;font-size:var(--fs-base);font-weight:var(--fw-medium);line-height:1.5;padding:6px 12px;border:1px solid transparent;border-radius:var(--r-md);cursor:pointer;white-space:nowrap;transition:color .15s,background-color .15s,border-color .15s,transform .12s}
.button:active{transform:scale(.982)}
.button:disabled,.button.button--disabled{opacity:.65;pointer-events:none}
.button--sm{padding:4px 8px;font-size:var(--fs-sm);border-radius:var(--r-sm)}
.button--lg{padding:8px 16px;font-size:var(--fs-lg);border-radius:var(--r-lg)}
/* .btn-icon REDEFINIDO na S45. Ele fixava 36x36 e tinha ZERO consumidores
   desde que nasceu (S29) — CSS morto, mesma categoria do .toggle* verde que a
   S38 removeu. O 36 fixo tornava a composição impossível: .btn-sm só mexe em
   padding, então .btn-icon.btn-sm continuava 36. A saída seria um .btn-icon-sm
   fundindo forma e tamanho, contra a gramatica da familia (papel + aparencia +
   tamanho). Agora a FORMA é quadrada e o TAMANHO vem da classe de tamanho.
   O ícone também é declarado: sem isso a caixa volta a ser consequência do
   conteúdo — foi assim que a matriz do Fechamento virou 22px com padding:3px. */
.button--icon{width:32px;height:32px;padding:0}
.button--icon.button--sm{width:24px;height:24px}
.button--icon.button--lg{width:40px;height:40px}
.button--icon .icon{width:16px;height:16px}
/* Botão sem caixa: só o ícone/rótulo, sem fundo nem borda até o hover.
   É o papel que o .fc-icbtn (Fechamento) implementava local. */
.button--bare{background:none;border-color:transparent;color:var(--text2)}
.button--bare:hover{background:var(--surface2);color:var(--accent)}
.button--primary{background:var(--accent);color:#fff;border-color:var(--accent)}
.button--primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}
.button--primary:disabled{background:var(--border2);border-color:var(--border2)}
.button--secondary{background:var(--surface2);color:var(--text);border-color:var(--border)}
.button--secondary:hover{background:var(--surface3)}
.button--danger{background:var(--red);color:#fff;border-color:var(--red)}
.button--success{background:var(--green);color:#fff;border-color:var(--green)}
.button--ghost{background:none;color:var(--text2);border-color:var(--border)}
.button--ghost:hover{background:var(--surface2)}
.button--outline{background:transparent;color:var(--accent);border-color:var(--accent)}
.button--outline:hover{background:var(--accent);color:#fff}
.button--outline:disabled{color:var(--text3);border-color:var(--border);background:transparent;cursor:not-allowed}
.button--subtle-danger{background:var(--red2);color:var(--red);border-color:var(--red2)}
.button--subtle-success{background:var(--green2);color:var(--green);border-color:var(--green2)}
/* S49: --subtle-warning FECHA a familia. Ela tinha danger e success e nao tinha
   aviso — e o buraco doia: o "Completar config." do Metas usava --orange SOLIDO
   com branco, o tratamento mais pesado que existe, para uma pendencia que
   aparece tres vezes na mesma tela. O par (--yellow2 + --gold-fg) e exatamente o
   do .badge--warning, entao aviso passa a ter a mesma voz seja ele estatico ou
   clicavel. Precedente registrado neste arquivo: as variantes de .alert sem
   consumidor ficaram porque "familia de severidade incompleta e pior que
   variante sem uso". */
.button--subtle-warning{background:var(--yellow2);color:var(--gold-fg);border-color:var(--yellow2)}

/* ==== TOAST canonico (S29 . CSS-B) — pill central, tokens GXON ==== */
.toast{position:fixed;bottom:20px;left:50%;transform:translateX(-50%) translateY(8px);max-width:min(400px,calc(100vw - 40px));background:var(--navy);color:#fff;font-size:var(--fs-sm);font-weight:var(--fw-semibold);line-height:1.5;padding:10px 18px;border-radius:var(--r-md);box-shadow:var(--shadow-lg);opacity:0;transition:opacity .25s,transform .25s;pointer-events:none;z-index:9999;text-align:center}
/* S46 · BEM: os estados eram .show e .warn — palavras comuns SEM prefixo num
   arquivo global, a armadilha que a regra da S45 descreve. E .show era pior
   que ambígua: o MESMO nome serve o toast, o .modal-ov, o overlay local do
   Metas e — congelado — o Bootstrap, que põe e tira .show no dropdown e no
   tooltip. Trocar "show" em massa quebraria os quatro; só os do toast mudam
   aqui, um a um, e os do overlay do modal viraram .modal-overlay--open.
   ORDEM IMPORTA: .toast--visible e .toast--warn têm a mesma especificidade da
   .toast (antes era 0,2,0 contra 0,1,0) e só vencem por virem DEPOIS no
   arquivo. Não mover para cima. */
.toast--visible{opacity:1;transform:translateX(-50%) translateY(0)}
.toast--warn{background:var(--red);color:#fff}

/* ==== SPINNER canonico (S29 . CSS-B) — anel branco p/ contextos escuros ==== */
.spinner{display:inline-block;width:32px;height:32px;border:3px solid rgba(255,255,255,.2);border-top-color:#fff;border-radius:50%;animation:spin .7s linear infinite}
.spinner--sm{width:16px;height:16px;border-width:2px}
@keyframes spin{to{transform:rotate(360deg)}}

/* ==== BADGE canonico (S29 . CSS-B) — GXON 6px, status subtle, tokens ==== */
.badge{display:inline-flex;align-items:center;gap:4px;padding:2px 9px;font-size:var(--fs-xs);font-weight:var(--fw-semibold);line-height:1.4;border-radius:var(--r-sm);white-space:nowrap;vertical-align:baseline}
.badge--success{background:var(--green2);color:var(--green)}
.badge--warning{background:var(--yellow2);color:var(--gold-fg)}
.badge--danger{background:var(--red2);color:var(--red)}
.badge--info{background:var(--blue2s);color:var(--blue2)}
.badge--neutral{background:var(--surface2);color:var(--text2);border:1px solid var(--border)}
/* S46: .badge-purple REMOVIDA. Nasceu na S29 e nunca teve consumidor — conferido
   contra markup, interpolação e className. Além de morta, nomeava a COR e não o
   papel, contra a regra da S45: as irmãs dizem severidade (success/warning/
   danger/info/neutral) e ela dizia "roxo". Se um dia voltar, volta pelo papel. */
.badge--solid{background:var(--accent);color:#fff}

/* ==== CHIP canonico (S29 . CSS-B) — INTERATIVO (par do badge) ====
   Regra de ouro: se CLICA, e chip; se so INFORMA, e badge — e os dois
   NUNCA se parecem. Badge = estatico (sem borda de acao, sem cursor).
   Chip = borda + cursor + hover + estado .chip--active + "x" removivel.
   Filtros/selecoes/remocao viram chip; status/contagem viram badge. */
/* S49: font-family:inherit ENTROU, e nao e cosmetica. O .chip nasceu na S29 sem
   declarar fonte, e enquanto todo consumidor era <span> isso passou — span herda
   do body. Botao NAO herda: <button> cai na fonte padrao do navegador. Os chips
   de setor do Fechamento ja sao <button> desde a S41 e renderizam em Arial ate
   hoje, no meio de uma tela em Plus Jakarta Sans — ninguem notou porque o unico
   consumidor <button> era um modal. Trocar os <span> do Disponibilidades por
   <button> (a11y) espalharia o defeito em vez de corrigi-lo.
   O .button, o .dropdown-item, o .grid-edit e o .link-button ja declaravam; o
   .chip era o unico da familia que faltava. */
.chip{font-family:inherit;display:inline-flex;align-items:center;gap:6px;padding:5px 12px;font-size:var(--fs-sm);font-weight:var(--fw-medium);line-height:1.2;border-radius:var(--r-pill);border:1px solid var(--border);background:var(--surface);color:var(--text);cursor:pointer;white-space:nowrap;transition:background-color .15s,border-color .15s,color .15s}
.chip:hover{background:var(--surface2);border-color:var(--border2)}
/* S46 · BEM. ESPECIFICIDADE: o modificador vai escrito .chip.chip--active, e
   não .chip--active sozinho. Motivo medido: .chip.active valia 0,2,0 e empatava
   com o .chip:hover acima, vencendo por vir depois no arquivo — por isso passar
   o mouse num chip selecionado mantinha o azul. Um .chip--active isolado valeria
   0,1,0 e PERDERIA para o :hover, e o chip ativo ficaria cinza sob o cursor. A
   forma encadeada preserva o peso exato que a antiga tinha. Regra geral: quando
   o modificador disputa com um :hover/:focus do bloco, escreva .bloco.bloco--mod.
   .chip .lead SAIU: zero consumidores (as ocorrências de "lead" no projeto são
   a .tb-lead da topbar e o parâmetro lead de ic(name, lead) — outra coisa). */
/* S49: o selecionado passa de --accent-soft + texto accent para --accent SOLIDO
   + branco. Motivo: o sistema tinha TRES aparencias para "chip selecionado" —
   accent-soft (Disponibilidades, Fechamento), accent solido (Metas, via .button)
   e --blue navy (Roadmap, via .sprint-pick-btn). Tres formas para o mesmo estado
   e o usuario nao reconhece o mesmo controle de uma tela para outra. Venceu a do
   Metas, que e a mesma do .button--primary — o sistema ja diz "selecionado" desse
   jeito em toda acao primaria.
   O :hover encadeado vale 0,3,0 e vence o .chip:hover (0,2,0) sem depender de
   ordem no arquivo — o ativo escurece em vez de virar cinza sob o cursor. */
.chip.chip--active{background:var(--accent);border-color:var(--accent);color:#fff}
.chip.chip--active:hover{background:var(--accent-hover);border-color:var(--accent-hover)}
.chip:disabled,.chip.chip--disabled{opacity:.55;pointer-events:none}
.chip--sm{padding:3px 9px;font-size:var(--fs-xs);gap:4px}
/* Sem consumidor hoje: os três "x" de remoção do projeto vivem em chips LOCAIS
   (.mchip dos E-mails, .pixchip do Empresas, .dp-anexo do Disponibilidades) e
   cada um traz a própria regra. Fica como afordância declarada do componente —
   está no contrato escrito no comentário do bloco ("x removivel") —, ao
   contrário da .lead, que não estava em contrato nenhum. */
.chip__remove{display:inline-flex;width:16px;height:16px;border-radius:50%;align-items:center;justify-content:center;font-size:11px;background:rgba(0,0,0,.06);margin-right:-4px;cursor:pointer}
.chip__remove:hover{background:rgba(0,0,0,.12)}
[data-theme="dark"] .chip__remove{background:rgba(255,255,255,.1)}
[data-theme="dark"] .chip__remove:hover{background:rgba(255,255,255,.18)}

/* ==== FAIXA DO TOPO canonica (S49) — .toolbar e .chipbar ====
   O DS tinha o ELEMENTO (.chip, S29) e nunca teve o CONTEINER. Sem componente,
   cada pagina improvisou: quatro barras de filtro por chips com tres aparencias
   de "selecionado", e cinco dialetos de "linha de botoes no topo" em oito usos.

   SAO DOIS BLOCOS, e a medicao e que obriga. No Roadmap a barra de chips vive
   DENTRO de uma faixa; no Disponibilidades a faixa tem DUAS barras de chips
   (Empresas a esquerda, Periodo a direita). O empurrao a direita e comportamento
   da FAIXA, nao do grupo — dar esse papel a .chipbar a transformaria na faixa, e
   o nome estaria tomado quando a .toolbar chegasse.

   .toolbar         = a linha do topo da tela. SEM PELE: ela emoldura, nao e
                      cartao. Das 8 faixas do sistema, 7 ja eram sem fundo; a
                      caixa da .dp-bar (surface2 + borda + raio) sai. Uma
                      variante --boxed com um unico consumidor nao resolveria a
                      divergencia que este item existe para acabar: carimbaria
                      ela. E o chip ja tem borda e pilula proprias, entao o
                      cartao e caixa dentro de caixa — e imita um .card numa
                      tela cuja area util e feita de .card de verdade.
   .toolbar__group  = um grupo rotulado dentro da faixa.
   .toolbar__label  = o rotulo maiusculo do grupo.

   O GRUPO NAO SE CHAMA .chipbar, e a medicao e que decidiu. O item 14 nasceu
   falando de "barra de chips", e a S49 chegou a entregar .chipbar/.chipbar__label
   — mas ao abrir o Roadmap, das QUATRO faixas dele so UMA tem chip: as outras
   sao rotulo + texto, rotulo + <select> (isso e item 8) e rotulo + botao.
   Contando o sistema todo, grupos rotulados que NAO sao barra de chips sao
   CINCO: tres no Roadmap, o #barra-de-admin do Metas e o grupo do export em Excel
   Disponibilidades. Chip e uma das coisas que cabem no grupo, nao o que o grupo
   e — nomear pelo conteudo e o erro que o .num cometeu antes de virar .marker.

   SEM --right e SEM classe de posicao: com space-between na faixa e dois grupos
   dentro, o segundo cai a direita sozinho. O margin-left:auto do .dp-bar-right
   existia so porque a .dp-bar usava gap sem justify-content. Classe que a
   geometria dispensa nao nasce.

   GAP 6, e nao 8 como o .toolbar-left do Roadmap: e o valor que os dois grupos
   ja em producao usam, e mexer nele reabriria a largura da barra do
   Disponibilidades, que acabou de ser validada em uma linha. Numero validado
   nao se troca sem motivo funcional.

   RESPIRO: as quatro faixas declaravam 10, 12, 12 e 16px de margin-bottom —
   nenhum e escolha, e o 10 e o 12 nem existem na escala --sp-*. Converge em
   var(--sp-3)=16px, mesmo criterio do respiro do .wrap na S48. */
.toolbar{box-sizing:border-box;display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:var(--sp-3)}
.toolbar--end{justify-content:flex-end}
.toolbar__group{box-sizing:border-box;display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}
.toolbar__label{font-size:var(--fs-xs);font-weight:var(--fw-bold);color:var(--text2);text-transform:uppercase;letter-spacing:.05em}
/* O <select> do grupo: a faixa e rotulo + CHIPS, rotulo + TEXTO, rotulo + BOTAO
   ou rotulo + SELECT — este ultimo ja existia no Roadmap (tres faixas) como
   regra local, e o Calendario virou o terceiro consumidor: a agenda de dias que
   a grade mostra e ESCOLHA de uma por vez, e chip nao diz isso. Regra promovida
   byte a byte da roadmap.css, que passa a consumir esta. O foco segue o mesmo
   anel do .field (borda de acento + --accent-soft), para o campo da barra e o
   do formulario nao terem dois focos diferentes. */
.toolbar__group select{box-sizing:border-box;font-family:var(--font);font-size:13px;padding:7px 10px;
  border-radius:var(--r-md);border:0.5px solid var(--border);background:var(--surface);color:var(--text)}
.toolbar__group select:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.toolbar__group select:disabled{opacity:.6;cursor:not-allowed}

/* ==== ALERT canonico (S29 . CSS-B) — tint + borda, tokens GXON ====
   S46 · BEM: as partes eram .a-ic/.a-title/.a-text, abreviações da casa que a
   regra de nomenclatura reprova — e um "a-" solto colide de leitura com o <a>.
   Viraram .alert__icon/.alert__text. A .a-title SAIU: zero consumidores,
   conferido também contra classe montada por interpolação no JS.
   As quatro variantes passam a --info/--success/--warning/--danger; só a
   --warning tem consumidor hoje (diagramacao.html), e as outras três ficam
   porque família de severidade incompleta é pior que variante sem uso. */
.alert{display:flex;gap:10px;align-items:flex-start;padding:12px 14px;margin-bottom:12px;border:1px solid transparent;border-radius:var(--r-sm);font-size:var(--fs-sm);line-height:var(--lh-base)}
.alert__icon{font-size:18px;line-height:1;flex-shrink:0}
.alert__text{font-size:var(--fs-xs);line-height:1.45}
.alert--info{background:var(--blue2s);color:var(--blue2);border-color:color-mix(in srgb,var(--blue2) 25%,transparent)}
.alert--success{background:var(--green2);color:var(--green);border-color:color-mix(in srgb,var(--green) 25%,transparent)}
.alert--warning{background:var(--yellow2);color:var(--gold-fg);border-color:color-mix(in srgb,var(--orange) 30%,transparent)}
.alert--danger{background:var(--red2);color:var(--red);border-color:color-mix(in srgb,var(--red) 25%,transparent)}

/* ==== DROPDOWN canonico (S30 . comportamental) — Bootstrap JS + tokens GXON ====
   Piloto S30: seletor de unidade/ciclo do Shell. Abordagem JS-only — o
   COMPORTAMENTO (abrir/fechar, clique-fora, ESC, teclado, ARIA) vem do Bootstrap
   Dropdown (data-bs-toggle="dropdown"); a APARENCIA e 100% nossa (tokens GXON,
   SEM o CSS do Bootstrap). O Popper posiciona o menu (inline style); nos so
   escondemos/mostramos via .show (classe que o Bootstrap poe/tira). Markup:
     <div class="dropdown">
       <button data-bs-toggle="dropdown" aria-expanded="false">...</button>
       <ul class="dropdown-menu"><li><button class="dropdown-item">...</button></li></ul>
     </div>
   Par com badge/chip: o item ativo usa --active-bg/--active-color (mesmo que a nav). */
.dropdown{position:relative}
.dropdown-menu{display:none;position:absolute;z-index:1000;min-width:200px;margin:0;padding:6px;list-style:none;background:var(--surface);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--shadow-lg);font-size:var(--fs-sm);color:var(--text)}
.dropdown-menu.show{display:block}
.dropdown-item{display:flex;align-items:center;gap:10px;width:100%;padding:7px 9px;border:0;background:none;border-radius:var(--r-sm);font:inherit;font-size:var(--fs-sm);color:var(--text);text-align:left;cursor:pointer;white-space:nowrap;transition:background-color .12s}
.dropdown-item:hover,.dropdown-item:focus-visible{background:var(--surface2);outline:none}
/* S46 · BEM PARCIAL, e o motivo esta no codigo da lib. O Bootstrap PROCURA
   quatro nomes deste bloco e eles NAO podem mudar:
     .dropdown-menu   dropdown.js:68  SELECTOR_MENU        — acha o menu
     .dropdown-item   dropdown.js:71  SELECTOR_VISIBLE_ITEMS — navegacao por seta
     .disabled        dropdown.js:71  pula item desabilitado
     .show            dropdown.js:150 posta/tira no menu e no botao
   Renomear .dropdown-item quebraria o ↑/↓ dos seletores de unidade e de ciclo
   em silencio — sem erro no console, e so quem usa teclado percebe.
   Entao a familia fica com o nome da biblioteca, e so o que e NOSSO virou BEM.
   Como o bloco continua .dropdown-item, as partes sao elementos DELE
   (.dropdown-item__name), nao do .dropdown — o "name" pertence ao item.
   .dropdown-divider e .dropdown-header ficam com o nome do Bootstrap por
   coerencia com a familia congelada (e nao tem consumidor hoje).
   E O .active TAMBEM FICA — por outro motivo, achado ao conferir o preview:
   os itens do menu Sistema sao acesos por ID, em SEIS pontos do index.js
   (:689 :708 :716 :724 :732 :743), e os mesmos pontos acendem tambem os
   .nav-item da barra lateral, que e classe LOCAL do Shell. Um classList.add
   serve as duas familias; separar exigiria detectar o tipo do elemento em
   cada ponto, ou renomear o .nav-item junto — e esse e local, da S47.
   Registrado no backlog: o .active do dropdown so sai junto do .nav-item. */
.dropdown-item.active{background:var(--active-bg);color:var(--active-color)}
.dropdown-item:disabled,.dropdown-item.disabled{opacity:.5;pointer-events:none}
.dropdown-item__name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dropdown-item__check{width:15px;height:15px;flex-shrink:0;color:var(--active-color);opacity:0}
.dropdown-item.active .dropdown-item__check{opacity:1}
.dropdown-divider{height:1px;margin:6px 4px;background:var(--border)}
.dropdown-header{padding:6px 9px;font-size:var(--fs-xs);font-weight:var(--fw-semibold);color:var(--text2);text-transform:uppercase;letter-spacing:.06em}

/* ==== TOOLTIP canonico (S30 . comportamental) — Bootstrap Tooltip JS + tokens ====
   JS-only: o Bootstrap gera .tooltip > .tooltip-arrow + .tooltip-inner e posiciona
   pelo Popper; a aparencia e 100% nossa (tokens --tooltip-bg/--tooltip-fg, mesma
   familia "chip escuro" do toast). Instanciado DELEGADO no behaviors.js (cobre
   markup dinamico). Arrow-less por escolha (dispensa CSS por placement).
   Uso: no elemento que ja tem title="" adicionar data-bs-toggle="tooltip". */
.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--font);font-size:var(--fs-xs);font-weight:var(--fw-medium);line-height:1.4;opacity:0;transition:opacity .12s}
.tooltip.show{opacity:1}
.tooltip .tooltip-arrow{display:none}
.tooltip-inner{max-width:240px;padding:5px 9px;background:var(--tooltip-bg);color:var(--tooltip-fg);border-radius:var(--r-sm);text-align:center;box-shadow:var(--shadow-lg)}

/* ==== CARD canonico (S33 . CSS-B) — conteiner GXON, raio unico --r-lg ====
   Fecha o CSS-B que a S29 deixou em aberto. Antes cada modulo redefinia
   --r/--rl no :root local e o card divergia em raio (8/12/14px), borda
   (nenhuma/0.5/1px) e sombra (ausente / #0001 fixo / --shadow local). Base
   unica: surface + borda 1px + --r-lg (10px, o card do GXON) + --shadow +
   padding. O DOMINIO fica LOCAL sobre a base (border-left de status no
   Sincronia, .card.unread no Alertas, hero/cores semanticas) — sem duplicar a
   geometria. Variantes: .card--sm (item de lista/backlog, padding menor),
   .card--flush (padding 0, p/ tabela/lista recortada dentro). */
.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow);padding:14px 16px}
.card--sm{padding:9px 11px}
.card--flush{padding:0}
/* Cabeçalho e corpo do card (S45). Não é invasão de nome: é o DS estando
   incompleto — o .modal tem head/body/foot desde a S33 e o .card não tinha.
   Par para usar DENTRO de .card--flush: a faixa do topo se recorta por
   border-bottom e o corpo carrega o respiro. Valores vindos do .card-header/
   .card-body do Sugestões, o dialeto que já tinha os dois lados do par.
   S46 · BEM: .card-sm/.card-flush viraram MODIFICADORES (--) e .card-head/
   .card-body viraram PARTES (__). O bloco .card nao muda de nome.
   Medido em 25/08: a .card__head tem ZERO consumidores de markup — foi
   promovida na S45 e nenhum modulo adotou ainda. Fica como afordancia
   declarada do par (o .modal tem head/body/foot desde a S33), nao como
   CSS morto por acidente. A .card__body tem um: o Sugestoes. */
.card__head{display:flex;align-items:center;gap:8px;padding:16px 20px;border-bottom:1px solid var(--border2)}
.card__head h2{font-size:var(--fs-base);font-weight:var(--fw-semibold)}
.card__body{padding:20px}

/* ==== DATA-TABLE canonica .table (S33 . CSS-B) — tabela real unificada ====
   Para as <table border-collapse> reais: Shell (.u-table), Metas (table e
   .pw-table) e Roadmap (.backlog-table), cada uma com seu proprio th/td, hover
   e densidade. Base unica: cabecalho em --surface2 (uppercase, peso 700,
   --text2), divisoria por linha (border-bottom 1px --border), hover --surface2,
   CONTINUA (sem zebra). Densidade .table (normal) / .table--dense (compacta). Fica
   dentro de .card--flush quando precisar de conteiner recortado. NAO cobre
   grid/divs — isso e o Data-list (.data-list), logo abaixo (S34), exclusivo da
   Diagramacao (consumidor unico). */
/* S46 · BEM: .tbl -> .table e .tbl-dense -> .table--dense. Abreviação da casa,
   sem convenção que a sustente — nenhum design system chama a tabela de .tbl.
   As partes seguem por seletor de ELEMENTO (th, td, tr) e não ganham classe:
   aqui a tag é o contrato, porque uma <table> real só pode ser feita delas.
   É a diferença para o breadcrumb, cujo <a> sem href pode virar <button>. */
.table{width:100%;border-collapse:collapse;font-size:var(--fs-sm)}
.table th{background:var(--surface2);text-transform:uppercase;font-weight:var(--fw-bold);font-size:10px;letter-spacing:.05em;color:var(--text2);text-align:left;padding:9px 12px;border-bottom:1px solid var(--border);white-space:nowrap}
.table td{padding:9px 12px;border-bottom:1px solid var(--border);color:var(--text);vertical-align:middle}
.table tr:last-child td{border-bottom:none}
.table tbody tr:hover td{background:var(--surface2)}
.table--dense th,.table--dense td{padding:6px 10px;font-size:var(--fs-xs)}

/* ==== DATA-LIST canonica .data-list (S34 . Frente B) — o par grid/divs do .table ====
   Para as "tabelas" feitas de GRID/divs (nao <table>): quando as celulas
   precisam de layout livre (botoes, selos, colunas de largura fracionaria) que
   uma <table> real engessaria. Base unica, espelhando o .table: cabecalho
   .data-list__head em --surface2 (uppercase, peso 700, --text2); linhas .data-list__row
   com divisoria por linha (border-top 1px --border) e hover --surface2. O
   RECORTE (borda + raio + overflow) vem do proprio .data-list — dispensa um
   .card--flush externo (resultado identico, markup mais simples). As COLUNAS/gap
   ficam LOCAIS (grid-template-columns por lista, no modulo) — sao de dominio; so
   a casca vem daqui. Consumidor unico: Diagramacao (series/versoes/arquivos/
   historico). Nao criar variante sem uso. */
.data-list{border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;background:var(--surface);font-size:var(--fs-sm)}
.data-list__head{background:var(--surface2);text-transform:uppercase;font-weight:var(--fw-bold);font-size:10px;letter-spacing:.05em;color:var(--text2);padding:9px 13px}
.data-list__row{padding:10px 13px;border-top:1px solid var(--border);color:var(--text);transition:background-color .12s}
.data-list__row:hover{background:var(--surface2)}
/* Lista sem cabeçalho (S45): sem o .data-list__head, a primeira linha não deve
   carregar a divisória de cima. Já era o padrão documentado, morando local. */
.data-list--flat .data-list__row:first-child{border-top:none}

/* ==== MARCA DE ETAPA canônica (S45) — .marker ====
   O mesmo desenho nasceu QUATRO vezes: o número da tarefa (.fc-tnum) e o do
   modal de prazos (.fc-pz-n) no Fechamento, o selo de seção da Diagramação
   (.step, 24px) e o círculo do stepper (.fc-st-circle, 30px). Todos: círculo
   pequeno com número OU ícone centralizado.

   Chamou-se .num por um dia e o nome estava errado: descrevia o CONTEÚDO, e
   metade dos consumidores não mostra número — o stepper mostra só ícone, e a
   tarefa troca o número por um ✓ ao concluir. .marker descreve o PAPEL: a
   marca de um item numa sequência, seja ele número, ícone ou letra.

   É ORDINAL, não contador — e a diferença importa. "3" e "8" ocupam a mesma
   caixa, então o tamanho pode ser fixo e a forma, círculo perfeito. Contador é
   quantitativo ("3" e "128" não cabem no mesmo espaço), precisa de min-width e
   vira pílula: é OUTRA família, a do .badge-alertas e do .cnt do Alertas.

   Tamanho único 24px (S45) — o degrau que o .btn-icon instituiu. Os quatro
   estavam em 22, 24, 26 e 30 DECLARADOS; renderizados eram 24, 28 e 33, porque
   o fechamento.css não tem reset de box-sizing e a borda soma por fora.
   Por isso o box-sizing vem AQUI e não se herda: sem ele, "24px" significa 24
   numa página e 26 na outra, conforme o reset de quem carregar o componente. */
.marker{box-sizing:border-box;width:24px;height:24px;flex:0 0 auto;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:var(--fs-xs);font-weight:var(--fw-bold);background:var(--surface2);color:var(--text2);border:1px solid var(--border2)}
.marker .icon{width:14px;height:14px}
.marker--done{background:var(--green);color:#fff;border-color:var(--green)}
.marker--doing{background:var(--accent);color:#fff;border-color:var(--accent)}
/* S59: variante de atenção, par do .progress__fill--warn e do .badge--warning
   (mesmo par --yellow2 + --gold-fg). Primeiro consumidor: a reunião da
   Sincronia cuja data passou sem fechamento. */
.marker--warn{background:var(--yellow2);color:var(--gold-fg);border-color:color-mix(in srgb,var(--orange) 45%,var(--border2))}

/* ==== STEPPER canônico (S45) — o andamento de um fluxo de N etapas ====
   Nasceu no Fechamento como 14 regras .fc-st*. Família: .stepper (a régua) >
   .step (cada etapa) > .marker (o círculo, acima) + .step-label + .step-line.
   O estado aparece em DOIS lugares e não é redundância: o .marker é autônomo
   (existe fora de stepper) e carrega o próprio; o .step pinta o RÓTULO.
   .stepper__step--final é a última etapa: quando ela é a atual, "em curso" e "concluído"
   são a mesma notícia, então o rótulo vai a verde e não a azul.
   O ANEL do passo atual (box-shadow) fica LOCAL no módulo: é a marca de "você
   está aqui" numa régua de progresso — um número numa lista não tem isso. */
.stepper{display:flex;align-items:center}
.stepper__step{display:flex;flex-direction:column;align-items:center;gap:6px;flex:none}
.stepper__label{font-size:var(--fs-xs);color:var(--text2);white-space:nowrap}
.stepper__step--doing .stepper__label{font-weight:var(--fw-bold);color:var(--accent)}
.stepper__step--doing.stepper__step--final .stepper__label{color:var(--green)}
.stepper__step--pending .stepper__label{color:var(--text3)}
/* margin-bottom 22px alinha o traço ao CENTRO do círculo — o rótulo ocupa a
   altura de baixo. Se a altura do rótulo mudar, este número muda junto. */
.stepper__line{flex:1;height:2px;background:var(--border);margin:0 4px 22px;min-width:24px;border-radius:2px}
.stepper__line--done{background:var(--green)}

/* ==== PROGRESSO canônico (S45) — trilho + fatias ====
   Nasceu duas vezes no Fechamento (.fc-bar* e .fc-grp-bar*) com vocabulários
   de cor que não conversavam: "faltante" era âmbar numa e "atrasado" era
   vermelho na outra, sem nada dizendo qual usar quando.

   O módulo escolhe o SIGNIFICADO, nunca o tom. Como não existe cor solta no
   markup, módulo novo não consegue inventar um: ou usa um dos quatro, ou não
   usa a barra.
     --done  concluído        --green
     --doing em andamento     --accent
     --warn  atenção          --yellow
     --late  prazo estourado  --red
   O TRILHO também aceita estado, e isso não é redundância: no Fechamento a
   barra tem duas camadas — o preenchimento conta o progresso e o trilho
   carrega o prazo (cinza dentro, vermelho vencido). Colorir o trilho pela
   classe da fatia taparia o que ainda falta.

   flex:none nas fatias: com arredondamento as larguras podem somar 101%, e
   sem isto o flex encolheria as duas e a proporção mentiria por 1px. */
.progress{display:flex;height:7px;background:var(--surface3);border-radius:var(--r-pill);overflow:hidden;min-width:0}
.progress--sm{height:5px;border-radius:3px}
.progress--late{background:var(--red)}
.progress__fill{flex:none}
.progress__fill--done{background:var(--green)}
.progress__fill--doing{background:var(--accent)}
.progress__fill--warn{background:var(--yellow)}
.progress__fill--late{background:var(--red)}

/* ==== GRADE EDITÁVEL canônica (S45) — célula que salva sozinha ====
   Do Disponibilidades (.dp-cin + .saved). A LARGURA fica local: é decisão de
   conteúdo (célula de dinheiro tem uma, campo de correção tem outra).
   O verde do .grid-edit--saved é o flash de confirmação — quem reverte em caso de
   falha é o módulo, com aviso; a classe só mostra que deu certo. */
.grid-edit{box-sizing:border-box;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--surface);color:var(--text);text-align:right;font:inherit;padding:3px 8px;transition:border-color .15s,box-shadow .15s,background .3s}
.grid-edit::placeholder{color:var(--text3)}
.grid-edit:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-soft)}
.grid-edit.grid-edit--saved{border-color:var(--green);background:color-mix(in srgb,var(--green) 14%,var(--surface))}

/* ==== LINK-BOTÃO canônico (S45) — parece link, é <button> ====
   Do Disponibilidades (.dp-link). Existe porque a ação não navega: quem não
   leva a lugar nenhum não pode ser <a href>, mas o usuário lê "link". */
.link-button{background:none;border:0;padding:0;font:inherit;font-size:var(--fs-xs);color:var(--accent);cursor:pointer;text-decoration:underline;text-underline-offset:2px}
.link-button:hover{opacity:.75}

/* ==== MARCA DE PROCEDÊNCIA canônica (S45) — de onde veio este número ====
   Do Disponibilidades (.dp-org). O ponto de 5px no canto da célula dizendo se
   o valor veio do extrato, da conciliação ou da mão humana. Canoniza-se a
   MARCA e a regra de que a FORMA é a segunda pista além da cor (.origin--square
   para o caso que precisa se distinguir sem depender de enxergar tom) — os
   SIGNIFICADOS ficam locais, porque são do domínio de cada módulo.
   Entra agora porque virão outros módulos financeiros: o Orçamento vai
   precisar responder à mesma pergunta. Exige position:relative no pai.
   S46/BEM: era .origin-square (um traço só) e escapou dos 19 blocos da sprint —
   o bloco nasceu na S45 com o nome curto e a auditoria o leu como bloco próprio,
   não como variante de forma. É modificador do .origin, entao leva dois tracos.
   O unico consumidor emite a classe DENTRO DE UM TERNARIO, em
   disponibilidades.js:314 — grep por class="..." nao acha. */
.origin{position:absolute;top:3px;right:2px;width:5px;height:5px;border-radius:50%}
.origin--square{border-radius:1px}

/* ==== MODAL canonico (S33 . CSS-B · Frente C) — overlay + caixa + estrutura ====
   Fecha o ultimo padrao de forma solto. Antes 5 modais divergiam em overlay (5
   valores fixos, incl. #0006), z-index (50..100000), sombra (fixa ou ausente),
   raio (14/16/10) e naming das partes. Base unica:
   - .modal-overlay = overlay (var(--overlay), flex-center, z base); --top
     eleva o z quando um confirm aparece SOBRE um modal de formulario.
   - .modal = caixa flush (surface + --r-lg + --shadow-xl), tamanhos
     .modal-sm/.modal/.modal-lg; estrutura .modal-head/.modal-body/.modal-foot
     (+ .modal-title/.modal-close/.modal-err).
   Consumidores: Shell, Roadmap, Sincronia, Diagramacao (uiModal/uiPrompt/lote —
   migra .ui-modal/.ui-card p/ ca, resolvendo a colisao de nome) e o dialogo de
   confirmacao compartilhado (.confirm — era .ui-modal ate a S46). */
.modal-overlay{position:fixed;inset:0;z-index:9990;display:none;align-items:center;justify-content:center;padding:16px;background:var(--overlay);overflow-y:auto}
.modal-overlay--open{display:flex}
.modal-overlay--top{z-index:100000}
.modal{width:100%;max-width:460px;background:var(--surface);border-radius:var(--r-lg);box-shadow:var(--shadow-xl);max-height:90vh;overflow-y:auto;padding:0 18px 16px}
.modal--sm{max-width:380px}
.modal--lg{max-width:560px}
/* padding horizontal vem da .modal (a caixa) — as partes so cuidam do vertical.
   Assim um modal simples (conteudo direto na caixa) ja fica com respiro lateral,
   sem exigir um .modal__body explicito; o .modal__body e opcional (form longo).
   S46 · BEM: .modal-ov virou .modal-overlay como BLOCO PROPRIO, nao
   .modal__overlay. O overlay CONTEM o modal — chama-lo de elemento do
   .modal criaria um elemento que abriga o proprio bloco, o antipadrao que
   a literatura de BEM chama de "blocks in blocks". Sao dois blocos irmaos,
   e o estado de abertura pertence ao overlay (.modal-overlay--open). */
.modal__head{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:16px 0 12px}
.modal__body{padding:0 0 4px}
.modal__foot{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 0 0}
.modal__title{margin:0;font-size:var(--fs-md);font-weight:var(--fw-bold);color:var(--text);line-height:1.25}
.modal__close{background:none;border:0;color:var(--text2);font-size:18px;line-height:1;cursor:pointer;font-family:inherit}
.modal__close:hover{color:var(--text)}
.modal__error{display:none;background:var(--red2);color:var(--red);font-size:var(--fs-xs);padding:8px 12px;border-radius:var(--r-md);margin:0 0 8px}

/* ==== CABECALHO DE PAGINA canonico (S38 . shell de pagina) — a casca do topo
   de tela: breadcrumb (acima) + titulo + subtitulo + slot de acoes a direita.
   Reconcilia os cabecalhos locais (.emp-head/.ctx-head/.toprow/.intro). Hero/
   banners e badges de dominio ficam LOCAIS sobre a casca. ==== */
/* S46 · BEM: .page-title e .page-sub não carregavam o nome do bloco a que
   pertencem — liam-se como se houvesse um bloco ".page", que não existe.
   Todas as partes passam a __, e o bloco fica .page-head.
   DÍVIDA QUE O NOME NOVO TORNA VISÍVEL: o Fechamento usa .page-head__sub
   DENTRO do .fechamento-cabecalho, um cabeçalho local que reimplementa o papel do
   .page-head. Ler "page-head__sub" fora de um .page-head denuncia o
   empréstimo — que antes passava despercebido. Migrar o .fechamento-cabecalho para o
   canônico mexe em geometria (muda pixel) e por isso fica no backlog. */
.page-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin:0 0 16px}
.page-head__main{min-width:0}
.page-head__title{margin:0;font-size:var(--fs-lg);font-weight:var(--fw-bold);color:var(--text);letter-spacing:-.01em}
.page-head__sub{margin-top:3px;font-size:var(--fs-xs);color:var(--text2)}
/* Sem consumidor hoje: o único .page-head (Empresas) põe o botão direto no
   bloco. Fica como afordância declarada da família — ver a decisão da S46 de
   remover só o que nasceu sem papel (.a-title, .badge-purple, .chip .lead). */
.page-head__actions{display:flex;align-items:center;gap:8px;flex:0 0 auto}

/* ==== BREADCRUMB canonico (S38 . shell de pagina) — navegacao lista->detalhe
   em pagina inteira (link de volta com seta + separador + item atual). Saiu do
   diagramacao.css. So em tela cheia lista->detalhe; abas/modal nao usam.
   S46 · BEM: a classe era .crumb enquanto este mesmo cabeçalho já dizia
   "BREADCRUMB" — o autor sabia o nome e digitou o curto. Abreviação da casa,
   sem ganho de leitura, agora escrita por extenso.
   As partes saíram do seletor de ELEMENTO (.crumb a / .crumb b) e ganharam
   classe. O motivo é concreto: aquele <a> NÃO tem href — é link falso, movido
   por data-action e delegação, e o cursor:pointer abaixo existe só para suprir
   a mãozinha que um <a> sem href não ganha. Estilo preso à tag quebraria em
   silêncio no dia em que ele virar <button>, que é o que ele deveria ser. O
   separador "/" segue sem classe porque não tem regra — não se cria nome sem uso. */
.breadcrumb{display:flex;align-items:center;gap:7px;font-size:var(--fs-sm);color:var(--text2);margin-bottom:14px}
.breadcrumb__link{color:var(--accent);text-decoration:none;font-weight:var(--fw-semibold);cursor:pointer}
.breadcrumb__link:hover{text-decoration:underline}
.breadcrumb__current{color:var(--text);font-weight:var(--fw-semibold)}

/* ==== FORMULARIO canonico (S38 . shell de pagina) — o campo que faltava (o DS
   tinha btn/card/table/modal, nao form). Reconcilia os 7 .field locais
   (diagramacao/emails/empresas/index/roadmap/sincronia/sugestoes). Sub-tabelas
   com inputs embutidos e mascaras ficam de DOMINIO. Suporta a classe
   .field__label E o elemento <label> filho (retrofit sem mexer no markup). ==== */
.form-row{display:flex;gap:14px;flex-wrap:wrap;margin:0 0 12px}
.field{flex:1 1 180px;min-width:150px;display:flex;flex-direction:column;margin-bottom:12px}
.form-row .field{margin-bottom:0} /* em row o espacamento vem do .form-row; standalone o .field se espaca sozinho */
.field--grow{flex:3 1 320px}
.field--sm{flex:0 0 120px}
.field__label,.field label{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text2);font-weight:var(--fw-bold);margin-bottom:5px}
/* S46 · BEM: o estado era .field.req. ATENCAO — .req existe DUAS VEZES no
   projeto, com sentidos diferentes: aqui e o ESTADO do campo (gera o " *"
   por ::after no rotulo), e nos modulos e um <span class="req">*</span>
   literal, colorido por regra local (index.css, sugestoes.css, emails.css).
   So o ESTADO migrou; os spans locais vao com as 36 classes de modulo.
   Encadeado (.field.field--required) para manter o peso 0,3,0 da forma antiga. */
.field.field--required .field__label::after,.field.field--required label::after{content:" *";color:var(--red)}
.field input,.field select,.field textarea,
.form-row input,.form-row select,.form-row textarea{
  width:100%;font-family:inherit;font-size:var(--fs-sm);color:var(--text);
  background:var(--surface);border:1px solid var(--border2);border-radius:var(--r-md);
  padding:8px 10px;transition:border-color .15s,box-shadow .15s}
.field textarea{min-height:82px;resize:vertical}
.field input:focus,.field select:focus,.field textarea:focus,
.form-row input:focus,.form-row select:focus,.form-row textarea:focus{
  outline:none;border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}
.field input:disabled,.field select:disabled,.field textarea:disabled{opacity:.6;cursor:not-allowed}
.field__hint{font-size:var(--fs-xs);color:var(--text3);margin-top:5px}
/* Grupo de opcoes DENTRO de um campo (S49). Nao e chipbar: chipbar filtra a
   TELA, isto preenche um CAMPO e vai para o banco. Tratar os dois como a mesma
   coisa seria o erro de categoria que o Metas comete ao usar .button para
   filtrar — forma igual, papel diferente.
   Nasce canonico porque ja existia DUAS vezes, local, com dois nomes e o mesmo
   gap:6px: .sprint-picker no modal de item do Roadmap (roadmap.js:615) e
   .fc-chips no modal do catalogo do Fechamento (fechamento.js:973), os dois
   dentro de um .field. E a saida 1 da regra de nome estrutural: o componente
   canonico estava incompleto — o .field nunca teve onde por um grupo de opcoes.
   Mesma divida do .card__head na S45. */
.field__options{display:flex;align-items:center;gap:6px;flex-wrap:wrap}

/* ==== SWITCH canonico (S38 . shell de pagina) — liga/desliga deslizante.
   Markup: <label class="switch"><input type="checkbox"><span class="switch__track">
   </span><span class="switch__label">rotulo</span></label>. Checkbox oculto
   (acessivel), ligado = --accent. Base = a de Empresas (S37). Reconcilia o
   .switch/.switch.off da Diagramacao e o wrapper .switch dos E-mails (-> .field--inline).
   O .toggle* verde do Metas era CSS morto (removido); o segmentado Nao/Sim do
   Metas e dominio (fica local). Conjunto de 3+ opcoes = <select>. ==== */
.switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer}
.switch input{position:absolute;opacity:0;width:0;height:0}
.switch__track{position:relative;width:38px;height:22px;border-radius:var(--r-pill);background:var(--surface3);border:1px solid var(--border2);transition:background .15s,border-color .15s;flex:none}
.switch__track::after{content:"";position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background:var(--surface);box-shadow:var(--shadow-sm);transition:transform .15s}
.switch input:checked+.switch__track{background:var(--accent);border-color:var(--accent)}
.switch input:checked+.switch__track::after{transform:translateX(16px)}
.switch input:focus-visible+.switch__track{box-shadow:0 0 0 3px var(--accent-soft)}
.switch input:disabled+.switch__track{opacity:.55;cursor:not-allowed}
.switch__label{font-size:var(--fs-sm);color:var(--text)}
/* rotulo + controle na horizontal — substitui o wrapper .switch dos E-mails
   (que colidia de nome com o switch da Diagramacao). */
.field--inline{display:flex;align-items:center;gap:8px;font-size:var(--fs-sm);color:var(--text);cursor:pointer}

/* ==== ESTADO VAZIO canônico (S56) — "não há nada aqui", e POR QUÊ ====
   Conferido antes de escrever: o DS tinha .alert (aviso), .card (caixa) e
   .data-list (lista com linhas), e NENHUM componente para a lista que veio
   vazia. Cada tela resolvia com um <td colspan> e uma frase cinza — o Empresas
   faz isso em empresas.js:96 —, o que funciona e não escala: a frase fica presa
   dentro da tabela, some no modo lista, e não tem onde pôr a ação que resolve o
   vazio ("cadastrar a primeira").

   O gatilho foi a PRE: ela é curso livre e tem ZERO mantidas por definição, não
   por falta de cadastro. Vazio que é RESPOSTA, não pendência — e dizer isso é a
   diferença entre a tela parecer quebrada e a tela parecer certa. Por isso o
   __texto existe e não é decorativo: o título diz o que não há, o texto diz por
   quê, e a ação (opcional) só aparece quando cadastrar é mesmo o próximo passo.

   Markup:
     <div class="empty">
       <div class="empty__icone"><svg class="icon">…</svg></div>
       <div class="empty__titulo">Nenhuma escola nesta unidade</div>
       <p class="empty__texto">A PRE é pré-vestibular…</p>
       <div class="empty__acao"><button class="button button--primary">…</button></div>
     </div>

   --inline para o vazio DENTRO de um card ou aba, onde 40px de respiro empurram
   demais o que vem depois. ==== */
.empty{display:flex;flex-direction:column;align-items:center;text-align:center;gap:4px;padding:44px 24px}
.empty__icone{margin-bottom:6px;line-height:0;color:var(--text3)}
.empty__icone .icon{width:30px;height:30px}
.empty__titulo{font-size:var(--fs-base);font-weight:var(--fw-semibold);color:var(--text)}
/* max-width em ch, não px: a medida que importa é quantos caracteres cabem na
   linha, e ela não muda quando o container muda. */
.empty__texto{margin:0;font-size:var(--fs-sm);color:var(--text2);line-height:1.55;max-width:54ch}
.empty__acao{margin-top:14px}
.empty--inline{padding:26px 16px}

/* ==== EDITOR DE COR canônico (S57 · item 26) — presets + R/G/B + seletor nativo ====
   Veio do Shell (index.css:296-307, `.cor-*`, S7), onde era da tela de unidades.
   Sobe porque ganhou o segundo consumidor: o Calendário configura a cor de N
   tipos de dia na mesma tela. O JS mora em `scripts/core/editor-cor.js`, com a
   paleta e as medições de contraste.

   Nome em português, pela §6 do glossário (S55): `.editor-cor`, não `.color-*`.

   Os `!important` do original (.cor-fld input, .cor-pick) SAÍRAM. Existiam para
   vencer o `.field input{width:100%;padding:8px 10px}` (0,1,1). Aqui o seletor é
   `.editor-cor .editor-cor__canal input` (0,2,1) e `.editor-cor .editor-cor__nativo`
   (0,2,0): vencem por especificidade, sem martelo.

   Markup (gerado pelo JS; não escreva à mão):
     <div class="editor-cor" data-cor="rgb(…)">
       <div class="editor-cor__paleta"><button class="editor-cor__amostra editor-cor__amostra--selecionada" style="--cor:…"></button>…</div>
       <div class="editor-cor__linha">
         <div class="editor-cor__canais"><div class="editor-cor__canal"><span>R</span><input type="number"></div>…</div>
         <span class="editor-cor__previa" style="--cor:…"></span>
         <input type="color" class="editor-cor__nativo">
         <button class="button button--sm button--outline">Usar automática</button>
       </div>
       <div class="editor-cor__nota">…</div>
     </div>
   ==== */
.editor-cor{box-sizing:border-box}
.editor-cor__paleta{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
/* 24px: escala de caixa 24/32/40 (padrão de componentes). */
.editor-cor__amostra{box-sizing:border-box;width:24px;height:24px;padding:0;border-radius:var(--r-sm);
  background:var(--cor);border:2px solid transparent;cursor:pointer;transition:transform .1s}
.editor-cor__amostra:hover{transform:scale(1.1)}
.editor-cor__amostra:focus-visible{outline:none;box-shadow:0 0 0 3px var(--accent-soft)}
/* Anel duplo: a borda do tema por fora e a superfície por dentro, para o
   selecionado aparecer igual numa cor clara e numa escura. */
.editor-cor__amostra.editor-cor__amostra--selecionada{border-color:var(--text);box-shadow:inset 0 0 0 2px var(--surface)}
.editor-cor__linha{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.editor-cor__canais{display:flex;align-items:flex-end;gap:6px}
.editor-cor__canal{display:flex;flex-direction:column;align-items:center;gap:2px}
.editor-cor__canal span{font-size:10px;font-weight:var(--fw-bold);color:var(--text3)}
.editor-cor .editor-cor__canal input{box-sizing:border-box;width:52px;padding:5px 4px;text-align:center;
  font-family:ui-monospace,monospace;font-size:var(--fs-xs)}
.editor-cor__previa{box-sizing:border-box;width:32px;height:32px;border-radius:var(--r-sm);
  background:var(--cor);border:1px solid var(--border);flex-shrink:0}
.editor-cor .editor-cor__nativo{box-sizing:border-box;width:32px;height:32px;padding:2px;cursor:pointer}
.editor-cor__nota{font-size:var(--fs-xs);color:var(--text3);margin-top:6px}

/* ==== CÉLULA COLORIDA canônica (S57) — a cor como identidade, com texto por cima ====
   O problema que ela resolve é estrutural, não de escolha de cor: COR FIXA NÃO
   CONTRASTA AO MESMO TEMPO COM TEXTO ESCURO E CLARO. Dos 10 presets antigos,
   como fundo sólido com o número do dia: 2 de 10 passavam 4,5:1 no claro, 3 de
   10 no escuro, 0 de 10 nos dois.

   A saída é a que o projeto já usa em dezenas de lugares: LAVAGEM — 22% da cor
   sobre a superfície do tema. Com a paleta canônica, o pior caso do texto fica
   em 11,87:1 no claro e 9,15:1 no escuro. A cor CHEIA continua onde não há
   texto: a barra de 4px à esquerda (e o `.ponto-cor` da legenda).

   Markup:  <div class="celula-cor" style="--cor:rgb(12, 132, 250)">9</div>

   ── `--hachurada` — "não conta" ──────────────────────────────────────────
   Hachura diagonal POR CIMA da lavagem. No Calendário é "não conta como letivo",
   e ali ela é o canal PRIMÁRIO da informação: dois tipos podem ter a mesma cor e
   só um contar. Não depende de enxergar cor (daltonismo, impressão em P&B).
   Traço em `--text` a 14%: segue o tema sozinho, sem cor própria para errar.
   Primeiro `repeating-linear-gradient` do DS — conferido: 0 ocorrências antes.

   A hachura entra por variável (`--hachura`), e não reescrevendo o `background`,
   para que um consumidor que troque a lavagem não a perca sem perceber.
   ==== */
.celula-cor{--hachura:linear-gradient(transparent,transparent);position:relative;box-sizing:border-box;
  background:var(--hachura),color-mix(in srgb,var(--cor,var(--border2)) 22%,var(--surface));
  color:var(--text);overflow:hidden}
.celula-cor::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--cor,var(--border2))}
.celula-cor--hachurada{--hachura:repeating-linear-gradient(135deg,color-mix(in srgb,var(--text) 14%,transparent) 0 1.5px,transparent 1.5px 6px)}

/* Ponto de legenda: a cor CHEIA, sem texto em cima. Com a paleta canônica passa
   3:1 contra a superfície nos dois temas. */
.ponto-cor{display:inline-block;box-sizing:border-box;width:10px;height:10px;border-radius:50%;
  background:var(--cor,var(--border2));flex-shrink:0;vertical-align:middle}

/* ==== MATRIZ DE ACESSO canônica (S61) — quem pode o quê, por função ====
   Nasceu no Fechamento (S58, a tela Acesso no molde do Zeev) e subiu quando
   Turmas e Professores pediram a mesma tabela. Linhas = o que se pode fazer,
   agrupado em faixas; colunas = as funções da unidade; célula = uma caixa.
     .matriz-de-acesso ............ o quadro: rola de lado DENTRO dele, nunca a
                                    página (no celular a tabela é mais larga)
     __tabela ..................... a tabela
     __rotulo ..................... a primeira coluna, presa ao rolar de lado,
                                    com o <small> de ajuda embaixo
     __faixa / __item ............. a linha de grupo (fundo frio) e a linha
                                    subordinada (recuada)
     __aviso ...................... cabeçalho de coluna em aviso (ex.: função
                                    sem o módulo), na cor de aviso
     __caixa (+ --leitura) ........ o checkbox desenhado; --leitura mostra a
                                    marca sem esmaecer quando ninguém pode mudar
     __fixo ....................... célula que não se marca (um traço)
     __acoes / __tirar ............ o grupo de ações da coluna (as setas e a
                                    lixeira, em edição) e a lixeira
   Os modificadores escritos em .matriz-de-acesso__tabela .x têm a
   especificidade de propósito: o fundo da coluna presa precisa vencer o do th
   e o da faixa. ==== */
.matriz-de-acesso{background:var(--surface);border:1px solid var(--border);border-radius:var(--r-lg);overflow-x:auto}
.matriz-de-acesso__tabela{border-collapse:separate;border-spacing:0;width:100%;font-size:var(--fs-sm)}
.matriz-de-acesso__tabela th,.matriz-de-acesso__tabela td{border-bottom:1px solid var(--border);padding:8px 10px;text-align:center;vertical-align:middle}
.matriz-de-acesso__tabela thead th{font-size:var(--fs-xs);font-weight:var(--fw-bold);color:var(--text);line-height:1.3;
  vertical-align:bottom;min-width:96px;max-width:130px}
.matriz-de-acesso__tabela thead th small{display:block;font-weight:var(--fw-medium);color:var(--text3);margin-top:2px}
.matriz-de-acesso__tabela thead th .badge{margin-top:4px}
.matriz-de-acesso__tabela thead th.matriz-de-acesso__aviso{color:var(--gold-fg)}
.matriz-de-acesso__tabela .matriz-de-acesso__rotulo{text-align:left;position:sticky;left:0;z-index:1;background:var(--surface);
  min-width:220px;max-width:280px;border-right:1px solid var(--border)}
.matriz-de-acesso__tabela thead th.matriz-de-acesso__rotulo{font-size:var(--fs-xs);font-weight:var(--fw-semibold);color:var(--text3);
  text-transform:uppercase;letter-spacing:.05em}
.matriz-de-acesso__rotulo small{display:block;font-size:var(--fs-xs);font-weight:400;color:var(--text3)}
/* Faixa no cinza frio do DS: o amarelo é a cor de aviso, e aviso aqui é a
   coluna em __aviso. */
.matriz-de-acesso__tabela .matriz-de-acesso__faixa td{background:var(--surface2)}
.matriz-de-acesso__tabela .matriz-de-acesso__faixa .matriz-de-acesso__rotulo{background:var(--surface2);font-weight:var(--fw-bold);color:var(--text)}
.matriz-de-acesso__tabela .matriz-de-acesso__item .matriz-de-acesso__rotulo{padding-left:26px}
.matriz-de-acesso__tabela tbody tr:last-child td{border-bottom:0}
.matriz-de-acesso__fixo{font-size:var(--fs-xs);color:var(--text3)}
.matriz-de-acesso__caixa{appearance:none;width:18px;height:18px;margin:0;border:1.5px solid var(--border2);border-radius:4px;
  background:var(--surface);cursor:pointer;display:inline-grid;place-content:center;vertical-align:middle}
.matriz-de-acesso__caixa:hover{border-color:var(--accent)}
.matriz-de-acesso__caixa:checked{background:var(--accent);border-color:var(--accent)}
.matriz-de-acesso__caixa:checked::after{content:"";width:9px;height:5px;border:2px solid #fff;border-top:0;border-right:0;
  transform:rotate(-45deg) translate(1px,-1px)}
.matriz-de-acesso__caixa:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.matriz-de-acesso__caixa:disabled{cursor:not-allowed;opacity:.45}
/* Só leitura (fora da edição, ou linha que só o admin muda): mostra sem esmaecer. */
.matriz-de-acesso__caixa.matriz-de-acesso__caixa--leitura:disabled{cursor:default;opacity:1}
.matriz-de-acesso__acoes{display:flex;justify-content:center;gap:2px;margin-top:4px}
.matriz-de-acesso__acoes .button:disabled{visibility:hidden}
.matriz-de-acesso__acoes .matriz-de-acesso__tirar{color:var(--text3)}
.matriz-de-acesso__acoes .matriz-de-acesso__tirar:hover{color:var(--red)}
@media (max-width:640px){
  .matriz-de-acesso__tabela .matriz-de-acesso__rotulo{min-width:160px}
}
