/* ============================================================
   TODOS PROTEGIDOS — App shell + componentes (mockups SGA)
   Depende de ../tokens.css. Estilos sobre os tokens.
   ============================================================ */
*{margin:0;padding:0;box-sizing:border-box;}
body{
  font-family:var(--font-family-body);font-size:var(--font-size-base);
  color:var(--color-text-body);background:var(--color-bg-canvas);
  line-height:var(--line-height-normal);-webkit-font-smoothing:antialiased;
}
a{color:inherit;text-decoration:none;}
.app{display:grid;grid-template-columns:var(--sidebar-width) 1fr;min-height:100vh;}

/* ---------- SIDEBAR ---------- */
.sidebar{
  background:var(--color-sidebar-bg);border-right:1px solid var(--color-sidebar-border);
  padding:var(--space-6) var(--space-4);display:flex;flex-direction:column;gap:var(--space-6);
  position:sticky;top:0;height:100vh;overflow-y:auto;
}
.brand{display:flex;align-items:center;gap:10px;padding:0 var(--space-2);}
.brand .mark{width:34px;height:34px;flex:none;}
.brand .brand-txt{display:flex;flex-direction:column;line-height:1.12;}
.brand .name{font-family:var(--font-family-display);font-weight:var(--font-weight-bold);font-size:var(--font-size-md);color:#fff;letter-spacing:-.01em;}
.brand .tag{background:transparent;padding:0;border-radius:0;font-size:9px;letter-spacing:var(--letter-spacing-wider);text-transform:uppercase;color:rgba(255,255,255,.5);}
.nav-group{display:flex;flex-direction:column;gap:2px;}
.nav-label{font-size:10px;letter-spacing:var(--letter-spacing-wider);text-transform:uppercase;color:var(--color-sidebar-label);padding:0 var(--space-3);margin-bottom:var(--space-2);}
.nav-item{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-radius:var(--border-radius-md);color:var(--color-sidebar-item);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.nav-item:hover{background:var(--color-sidebar-item-hover);color:#fff;}
.nav-item.active{background:var(--color-accent-teal);color:var(--color-text-on-teal);font-weight:var(--font-weight-bold);}
.nav-item .ico{width:18px;height:18px;display:flex;align-items:center;justify-content:center;opacity:.95;flex:none;} /* encaixe da família de ícones (v2) */
.nav-item .count{margin-left:auto;font-size:10px;font-weight:var(--font-weight-bold);background:rgba(255,255,255,.12);color:#fff;padding:1px 7px;border-radius:var(--border-radius-full);}
.nav-item.active .count{background:color-mix(in srgb, var(--color-text-on-teal) 16%, transparent);color:var(--color-text-on-teal);}
.sidebar-user{margin-top:auto;display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3);border-radius:var(--border-radius-md);background:rgba(255,255,255,.04);}
.sidebar-user .av{width:32px;height:32px;border-radius:50%;background:linear-gradient(135deg,var(--tp-blue-500),var(--tp-navy-800));color:#fff;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;flex:none;}
.sidebar-user .nm{font-size:var(--font-size-sm);color:#fff;font-weight:var(--font-weight-semibold);}
.sidebar-user .rl{font-size:10px;color:rgba(255,255,255,.5);}

/* ---------- TOPBAR ---------- */
.main{display:flex;flex-direction:column;min-width:0;}
/* BARRA full-bleed (fundo + régua + sticky atravessam o .main de ponta a ponta),
   mas o CONTEÚDO interno (.tb-left/.tb-right) pousa no mesmo box de --max-width-page
   alinhado à esquerda do .content: o padding direito cresce o excedente além do teto,
   empurrando a régua direita (busca/usuário) até a borda direita do miolo. Espelha o
   teto do .content (ver README · Largura do miolo). Abaixo de ~1704px o max() zera e nada muda. */
.topbar{height:var(--topbar-height);background:var(--color-bg-primary);border-bottom:1px solid var(--color-border-primary);display:flex;align-items:center;justify-content:space-between;padding:0 var(--space-8);padding-right:calc(var(--space-8) + max(0px, 100% - var(--max-width-page)));position:sticky;top:0;z-index:var(--z-sticky);}
.breadcrumb{display:flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-sm);color:var(--color-text-secondary);}
.breadcrumb .sep{color:var(--color-text-tertiary);}
.breadcrumb .cur{color:var(--color-text-primary);font-weight:var(--font-weight-semibold);}
.topbar .right{display:flex;align-items:center;gap:var(--space-3);}
.icon-btn{width:var(--control-height-sm);height:var(--control-height-sm);border-radius:var(--border-radius-md);border:1px solid var(--color-border-primary);background:var(--color-bg-primary);color:var(--color-text-secondary);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.icon-btn:hover{background:var(--color-bg-hover);color:var(--color-text-primary);}

/* ---------- TOPBAR V3 — header canônico do app (ver README · Header do app) ---------- */
.tb-left{display:flex;align-items:center;gap:var(--space-4);min-width:0;}
/* .tb-back: voltar (drill-in) no topbar, à esquerda do breadcrumb — idioma do .icon-btn.
   Substitui a antiga faixa .btn-voltar do corpo (que custava uma faixa vertical). */
.tb-back{width:var(--control-height-sm);height:var(--control-height-sm);flex:none;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);background:var(--color-bg-primary);color:var(--color-text-secondary);text-decoration:none;transition:all var(--duration-fast) var(--easing-default);}
.tb-back:hover{background:var(--color-bg-hover);color:var(--color-text-primary);}
.tb-back:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.tb-right{display:flex;align-items:center;gap:var(--space-3);}
.tb-div{width:var(--border-width-thin);height:var(--space-6);background:var(--color-border-primary);flex:none;}
/* breadcrumb hierarquizado: raiz micro-caps mono · intermediário discreto · atual em display */
.crumb{display:flex;align-items:baseline;gap:var(--space-2);white-space:nowrap;min-width:0;}
.crumb .root{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-tertiary);}
.crumb .mid{font-size:var(--font-size-sm);color:var(--color-text-secondary);}
.crumb .sep{color:var(--color-border-strong);font-size:var(--font-size-sm);}
.crumb .cur{font-family:var(--font-family-display);font-size:var(--font-size-md);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);letter-spacing:var(--letter-spacing-tight);overflow:hidden;text-overflow:ellipsis;}
/* DESCONTINUADO (refinos do header): usar .scope-select; mantido apenas para mockups históricos */
.scope-chip{display:inline-flex;align-items:center;gap:var(--space-2);height:var(--control-height-sm);padding:0 var(--space-3);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-full);background:var(--color-bg-secondary);color:var(--color-text-secondary);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.scope-chip:hover{border-color:var(--color-border-strong);background:var(--color-bg-hover);}
.scope-chip:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.scope-chip .lbl{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-tertiary);}
.scope-chip .val{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);white-space:nowrap;}
/* busca global com hint de atalho (⌘K) */
.tb-search{width:220px;} /* encaixe: régua direita completa cabe em 1280px */
.tb-search .input{height:var(--control-height-sm);padding-right:var(--space-12);font-size:var(--font-size-sm);}
.kbd{position:absolute;right:var(--space-2);top:50%;transform:translateY(-50%);font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-wide);color:var(--color-text-tertiary);background:var(--color-bg-secondary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-xs);padding:2px var(--space-2);pointer-events:none;}
/* contador de notificações (RTs não lidas) — teal com texto índigo escuro */
.icon-btn.has-badge{position:relative;}
.count-badge{position:absolute;top:calc(-1 * var(--space-1));right:calc(-1 * var(--space-1));min-width:var(--space-4);height:var(--space-4);padding:0 var(--space-1);border-radius:var(--border-radius-full);background:var(--color-accent-teal);color:var(--color-text-on-teal);font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-bold);display:flex;align-items:center;justify-content:center;box-shadow:0 0 0 var(--border-width-thick) var(--color-bg-primary);}
/* usuário canônico no topbar (nunca duplicado na sidebar) */
.tb-user{display:inline-flex;align-items:center;gap:var(--space-2);height:var(--control-height-md);padding:0 var(--space-2);border:none;background:transparent;border-radius:var(--border-radius-md);color:var(--color-text-tertiary);cursor:pointer;transition:background var(--duration-fast) var(--easing-default);}
.tb-user:hover{background:var(--color-bg-hover);}
.tb-user:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.tb-user .avatar{width:28px;height:28px;font-size:var(--font-size-2xs);}
.tb-user .who{display:flex;flex-direction:column;align-items:flex-start;line-height:var(--line-height-tight);}
.tb-user .nm{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.tb-user .rl{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-tertiary);}
/* seletor de escopo (rede/filiais) — controle de seleção no idioma do DS */
.scope-select{display:inline-flex;align-items:center;gap:var(--space-2);height:var(--control-height-sm);padding:0 var(--space-2) 0 var(--space-3);background:var(--color-bg-primary);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-md);color:var(--color-text-tertiary);font-size:var(--font-size-sm);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.scope-select:hover{background:var(--color-bg-hover);border-color:var(--color-text-tertiary);}
.scope-select:focus-visible{outline:none;border-color:var(--color-border-focus);box-shadow:var(--shadow-focus);}
.scope-select .val{font-weight:var(--font-weight-semibold);color:var(--color-text-primary);white-space:nowrap;}
/* dropdown do usuário — menu de conta canônico (Meu perfil · Preferências · Sair) */
.tb-menu{position:relative;}
.tb-user .chev{transition:transform var(--duration-fast) var(--easing-default);}
.tb-user[aria-expanded="true"] .chev{transform:rotate(180deg);}
.dropdown{position:absolute;top:calc(100% + var(--space-2));right:0;min-width:240px;background:var(--color-bg-primary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);z-index:var(--z-dropdown);padding:var(--space-2);display:none;}
.dropdown.open{display:block;}
/* Itens de menu não encostam: hover/ativo de um vizinho ganha respiro do outro (o houver não pode colar no active). */
.dd-item + .dd-item, .dd-opt + .dd-opt{margin-top:var(--space-1);}
.dd-head{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3);border-bottom:1px solid var(--color-border-secondary);margin-bottom:var(--space-2);}
.dd-head .nm{display:block;font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.dd-head .em{font-size:var(--font-size-xs);color:var(--color-text-tertiary);}
.dd-item{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-radius:var(--border-radius-sm);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-body);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.dd-item:hover{background:var(--color-bg-hover);color:var(--color-text-primary);}
.dd-item:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.dd-item .ico-svg{width:16px;height:16px;color:var(--color-text-tertiary);}
.dd-item:hover .ico-svg{color:var(--color-text-secondary);}
.dd-item.danger{color:var(--color-status-error);}
.dd-item.danger .ico-svg{color:var(--color-status-error);}
.dd-item.danger:hover{background:var(--color-status-error-subtle);color:var(--color-status-error);}
.dd-div{height:var(--border-width-thin);background:var(--color-border-secondary);margin:var(--space-2) var(--space-1);}
/* painel de opções do seletor de escopo — mesmo idioma do .dropdown */
.dropdown.align-left{right:auto;left:0;min-width:260px;}
.scope-select .chev{transition:transform var(--duration-fast) var(--easing-default);}
.scope-select[aria-expanded="true"] .chev{transform:rotate(180deg);}
.dd-label{padding:var(--space-2) var(--space-3) var(--space-1);font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-tertiary);}
.dd-opt{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-radius:var(--border-radius-sm);cursor:pointer;transition:background var(--duration-fast) var(--easing-default);}
.dd-opt:hover{background:var(--color-bg-hover);}
.dd-opt:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.dd-opt .nm{display:block;font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-body);}
.dd-opt .mt{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-tertiary);}
.dd-opt .chk{color:var(--color-accent-teal-strong);visibility:hidden;flex:none;}
.dd-opt.active{background:var(--color-accent-teal-subtle);}
.dd-opt.active .nm{color:var(--color-text-primary);font-weight:var(--font-weight-semibold);}
.dd-opt.active .chk{visibility:visible;}
/* rodapé da sidebar: linha de ambiente (o usuário NÃO vive aqui) */
.side-foot{margin-top:auto;padding:var(--space-3);text-align:center;}
.side-foot.micro{color:var(--color-sidebar-label);}

/* ---------- CONTENT ---------- */
/* miolo com teto de largura, alinhado à esquerda (ancorado à sidebar) — calha só à direita; ver README · Convenções */
.content{padding:var(--space-8);display:flex;flex-direction:column;gap:var(--space-6);max-width:var(--max-width-page);width:100%;}
.content.enxuto{padding-top:var(--space-5);}          /* header enxuto de drill-in: título encostado no topo */
.page-head{display:flex;align-items:flex-end;justify-content:space-between;gap:var(--space-4);flex-wrap:wrap;}
.page-head .eyebrow{font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);letter-spacing:var(--letter-spacing-wider);text-transform:uppercase;color:var(--color-accent-teal);margin-bottom:var(--space-2);}
.page-head h1{font-family:var(--font-family-display);font-size:var(--font-size-3xl);font-weight:var(--font-weight-bold);color:var(--color-text-primary);letter-spacing:var(--letter-spacing-tight);}
.page-head p{color:var(--color-text-secondary);font-size:var(--font-size-base);margin-top:var(--space-1);}

/* ---------- BOTÕES ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);height:var(--control-height-md);padding:0 var(--space-5);border-radius:var(--border-radius-md);border:1px solid transparent;font-family:var(--font-family-body);font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);white-space:nowrap;}
.btn:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.btn-primary{background:var(--color-accent-primary);color:var(--color-text-on-accent);}
.btn-primary:hover{background:var(--color-accent-primary-active);}
.btn-secondary{background:var(--color-bg-primary);color:var(--color-text-primary);border-color:var(--color-border-strong);}
.btn-secondary:hover{background:var(--color-bg-hover);border-color:var(--color-text-tertiary);}
.btn-ghost{background:transparent;color:var(--color-text-secondary);}
.btn-ghost:hover{background:var(--color-bg-hover);color:var(--color-text-primary);}
.btn-sm{height:var(--control-height-sm);padding:0 var(--space-4);font-size:var(--font-size-sm);}
/* AÇÃO teal — assinatura da marca: texto índigo escuro + glow (--shadow-glow-teal); ver README */
.btn-teal{background:var(--color-accent-teal);color:var(--color-text-on-teal);font-weight:var(--font-weight-bold);box-shadow:var(--shadow-glow-teal);}
.btn-teal:hover{background:var(--color-accent-teal-hover);transform:translateY(-1px);}
/* RISCO — botão com rótulo para ação destrutiva (ex.: revogar versão). Idioma do
   .btn-secondary tingido de erro; hover preenche o error-subtle e firma a borda —
   mesma lógica do .row-act.danger. Completa a família de risco (ícone: .row-act.danger
   · item de menu: .dd-item.danger · botão com rótulo: .btn-danger). Ver README. */
.btn-danger{background:var(--color-bg-primary);color:var(--color-status-error);border-color:color-mix(in srgb, var(--color-status-error) 35%, transparent);}
.btn-danger:hover{background:var(--color-status-error-subtle);border-color:var(--color-status-error);color:var(--color-status-error);}
.btn-danger:focus-visible{box-shadow:var(--shadow-focus-error);}
.btn:disabled{background:var(--color-bg-tertiary);color:var(--color-text-tertiary);border-color:transparent;box-shadow:none;cursor:not-allowed;transform:none;}

/* ---------- INPUTS ---------- */
.input,.select{height:var(--control-height-md);width:100%;padding:0 var(--space-4);background:var(--color-bg-primary);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-md);color:var(--color-text-primary);font-family:var(--font-family-body);font-size:var(--font-size-base);transition:all var(--duration-fast) var(--easing-default);}
.input::placeholder{color:var(--color-text-tertiary);}
.input:focus,.select:focus{outline:none;border-color:var(--color-border-focus);box-shadow:var(--shadow-focus);}
.search{position:relative;}
.search .input{padding-left:36px;}
.search .ico{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:var(--color-text-tertiary);font-size:14px;display:flex;align-items:center;} /* encaixe da família de ícones (v2) */
.field label{display:block;font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-secondary);margin-bottom:var(--space-2);}

/* ---------- ÍCONES — família única (fonte canônica: ../assets/icones.svg; ver README) ---------- */
/* consumo: sprite inline por página + <svg class="ico-svg"><use href="#i-nome"/></svg> */
.ico-svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round;flex:none;display:block;}
.ico-svg.sz16{width:16px;height:16px;}
.ico-svg.sz24{width:24px;height:24px;}
.icon-btn .ico-svg{margin:auto;}
.tl .marker .ico-svg{width:14px;height:14px;}

/* ---------- BADGES ---------- */
.badge{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:var(--border-radius-full);font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-wide);white-space:nowrap;}
.badge .dot{width:6px;height:6px;border-radius:50%;}
.badge-success{background:var(--color-status-success-subtle);color:var(--color-status-success);} .badge-success .dot{background:var(--color-status-success);}
.badge-warning{background:var(--color-status-warning-subtle);color:var(--color-status-warning);} .badge-warning .dot{background:var(--color-status-warning);}
.badge-error{background:var(--color-status-error-subtle);color:var(--color-status-error);} .badge-error .dot{background:var(--color-status-error);}
.badge-info{background:var(--color-status-info-subtle);color:var(--color-status-info);} .badge-info .dot{background:var(--color-status-info);}
.badge-neutral{background:var(--color-bg-tertiary);color:var(--color-text-secondary);} .badge-neutral .dot{background:var(--color-text-tertiary);}
/* teal — destaque de marca (campanhas, "novo"); mapeamento categoria→badge das RTs: ver README */
.badge-teal{background:var(--color-accent-teal-subtle);color:var(--color-accent-teal-strong);} .badge-teal .dot{background:var(--color-accent-teal);}
.tag{display:inline-flex;align-items:center;padding:2px 9px;border-radius:var(--border-radius-sm);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);background:var(--color-bg-tertiary);color:var(--color-text-secondary);}

/* ---------- LINKS ---------- */
/* link de UI (ações, navegação): feedback POR COR, sem sublinhado */
.link{color:var(--color-text-link);font-weight:var(--font-weight-medium);cursor:pointer;border-radius:var(--border-radius-xs);transition:color var(--duration-fast) var(--easing-default);}
.link:hover{color:var(--color-text-link-hover);}
.link:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
/* link em texto corrido: mantém sublinhado (affordance de texto) + cor no hover */
.link-inline{color:var(--color-text-link);font-weight:var(--font-weight-medium);cursor:pointer;border-radius:var(--border-radius-xs);text-decoration:underline;text-underline-offset:2px;text-decoration-thickness:1px;text-decoration-color:color-mix(in srgb, var(--color-text-link) 45%, transparent);transition:color var(--duration-fast) var(--easing-default), text-decoration-color var(--duration-fast) var(--easing-default);}
.link-inline:hover{color:var(--color-text-link-hover);text-decoration-color:currentColor;}
.link-inline:focus-visible{outline:none;box-shadow:var(--shadow-focus);}

/* ---------- CARDS ---------- */
.card{background:var(--color-bg-primary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-lg);box-shadow:var(--shadow-sm);}
.card-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-4);padding:var(--space-5);border-bottom:1px solid var(--color-border-primary);}
.card-head h3{font-family:var(--font-family-display);font-size:var(--font-size-md);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.card-body{padding:var(--space-5);}

/* ---------- STATS ---------- */
/* Convenção: título e valor de stat NUNCA quebram linha (ver README).
   Card com largura mínima do próprio conteúdo (min-content) e strip rolando na
   horizontal quando falta espaço (mesma válvula do kanban) — nunca ellipsis/corte.
   O delta pode quebrar palavra a palavra (descrição, não é indivisível).
   .stats = 4 cards fixos · .stats-fluid = nº de cards varia por cargo/permissão. */
.stats,.stats-fluid{display:flex;gap:var(--space-5);overflow-x:auto;}
.stats-fluid{gap:var(--space-4);}
.stats .stat,.stats-fluid .stat{flex:1 1 0;min-width:min-content;}
.stat{padding:var(--space-5);position:relative;overflow:hidden;}
.stats-fluid .stat{padding:var(--space-5) var(--space-4);}
/* rótulo na camada micro-caps mono — 1 linha sempre */
.stat .lbl{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-secondary);font-weight:var(--font-weight-semibold);white-space:nowrap;}
/* card com spark: rótulo reserva a zona do glifo à direita */
.stat .spark~.lbl{padding-right:var(--space-12);}
.stat .val{font-family:var(--font-family-display);font-size:var(--font-size-3xl);font-weight:var(--font-weight-bold);color:var(--color-text-primary);margin-top:var(--space-2);letter-spacing:var(--letter-spacing-tight);white-space:nowrap;}
.stat .val.mono{font-family:var(--font-family-mono);font-size:var(--font-size-2xl);}
.stat .delta{display:inline-flex;align-items:center;gap:4px;margin-top:var(--space-3);font-size:var(--font-size-xs);font-weight:var(--font-weight-semibold);}
.stat .delta.up{color:var(--color-finance-positive);} .stat .delta.down{color:var(--color-finance-negative);} .stat .delta.flat{color:var(--color-text-tertiary);}
.stat .spark{position:absolute;right:var(--space-4);top:var(--space-4);width:34px;height:34px;border-radius:var(--border-radius-md);background:var(--color-accent-primary-subtle);display:flex;align-items:center;justify-content:center;}

/* ---------- TOOLBAR / FILTROS ---------- */
.toolbar{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;}
.toolbar .search{flex:1;min-width:240px;max-width:360px;}
.toolbar .spacer{flex:1;}
.chip-filter{display:inline-flex;align-items:center;gap:6px;height:var(--control-height-sm);padding:0 var(--space-3);border-radius:var(--border-radius-full);border:1px solid var(--color-border-strong);background:var(--color-bg-primary);color:var(--color-text-secondary);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.chip-filter:hover{background:var(--color-bg-hover);}
.chip-filter.active{background:var(--color-accent-teal-subtle);color:var(--color-accent-teal);border-color:var(--color-accent-teal);}

/* ---------- TABELA ---------- */
.table-wrap{overflow:visible;}
.table-wrap.rolavel{overflow-x:auto;}
table.data{width:100%;border-collapse:collapse;}
/* header de tabela = camada micro-caps mono, SEM faixa (aprovado em 15/07/2026):
   o header recua como metadado — os dados são o herói; separação por régua strong. */
table.data thead th{text-align:left;padding:var(--space-4) var(--space-5);font-family:var(--font-family-mono);font-size:var(--font-size-2xs);letter-spacing:var(--letter-spacing-wider);text-transform:uppercase;color:var(--color-text-tertiary);font-weight:var(--font-weight-semibold);border-bottom:var(--border-width-thin) solid var(--color-border-strong);background:transparent;white-space:nowrap;}
table.data tbody td{padding:var(--space-4) var(--space-5);border-bottom:1px solid var(--color-border-secondary);font-size:var(--font-size-sm);color:var(--color-text-body);vertical-align:middle;}
table.data tbody tr{transition:background var(--duration-fast) var(--easing-default);cursor:pointer;}
table.data tbody tr:hover{background:var(--color-bg-hover);}
table.data tbody tr:last-child td{border-bottom:none;}
table.data td .nm{font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.assoc{display:flex;align-items:center;gap:var(--space-3);}
.avatar{width:34px;height:34px;border-radius:50%;background:linear-gradient(135deg,var(--tp-blue-500),var(--tp-navy-800));color:#fff;display:flex;align-items:center;justify-content:center;font-weight:var(--font-weight-semibold);font-size:var(--font-size-xs);flex:none;}
.avatar.lg{width:56px;height:56px;font-size:var(--font-size-lg);}
.assoc .nm{font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.assoc .sub{font-size:var(--font-size-xs);color:var(--color-text-tertiary);}
.mono{font-family:var(--font-family-mono);}
.val-pos{color:var(--color-finance-positive);font-weight:var(--font-weight-semibold);}
.val-neg{color:var(--color-finance-negative);font-weight:var(--font-weight-semibold);}
.row-actions{display:flex;gap:var(--space-1);justify-content:flex-end;}

/* ---------- PAGINAÇÃO ---------- */
.pagination{display:flex;align-items:center;justify-content:space-between;padding:var(--space-4) var(--space-5);border-top:1px solid var(--color-border-primary);}
.pagination .info{font-size:var(--font-size-sm);color:var(--color-text-secondary);}
.pagination .pages{display:flex;gap:var(--space-1);}
.pg{min-width:32px;height:32px;border-radius:var(--border-radius-sm);border:1px solid var(--color-border-primary);background:var(--color-bg-primary);color:var(--color-text-secondary);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);display:flex;align-items:center;justify-content:center;cursor:pointer;}
.pg:hover{background:var(--color-bg-hover);}
.pg.active{background:var(--color-accent-primary);color:var(--color-text-on-accent);border-color:transparent;}

/* ---------- TABS ---------- */
.tabs{display:flex;gap:var(--space-1);border-bottom:1px solid var(--color-border-primary);}
.tab{padding:var(--space-3) var(--space-4);font-size:var(--font-size-base);font-weight:var(--font-weight-medium);color:var(--color-text-secondary);cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:all var(--duration-fast) var(--easing-default);}
.tab:hover{color:var(--color-text-primary);}
.tab.active{color:var(--color-accent-teal);border-bottom-color:var(--color-accent-teal);font-weight:var(--font-weight-semibold);}
/* contador de aba em badge (.tab .qtd) — nunca número solto (ver README): pílula na
   mecânica do .qtd dos Filtros; INATIVA neutra + filete (abas vivem sobre canvas E
   card — no claro bg-tertiary = canvas); ATIVA na receita única de "pílula que conta"
   (teal pleno + índigo on-teal, como .count-badge e .btn-filtros .qtd). */
.tab{display:inline-flex;align-items:center;gap:var(--space-2);}
.tab .qtd{min-width:18px;height:18px;padding:0 5px;border-radius:var(--border-radius-full);background:var(--color-bg-tertiary);border:var(--border-width-thin) solid var(--color-border-primary);color:var(--color-text-secondary);font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-bold);display:inline-flex;align-items:center;justify-content:center;transition:all var(--duration-fast) var(--easing-default);}
.tab.active .qtd{background:var(--color-accent-teal);border-color:transparent;color:var(--color-text-on-teal);}

/* ---------- LISTAS DE DADOS (ficha) ---------- */
.datalist{display:flex;flex-direction:column;gap:var(--space-3);}
.datalist .item{display:flex;justify-content:space-between;gap:var(--space-4);padding-bottom:var(--space-3);border-bottom:1px solid var(--color-border-secondary);}
.datalist .item:last-child{border-bottom:none;padding-bottom:0;}
.datalist .k{color:var(--color-text-secondary);font-size:var(--font-size-sm);}
.datalist .v{color:var(--color-text-primary);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);text-align:right;}

/* ---------- TIMELINE ---------- */
.timeline{display:flex;flex-direction:column;}
.tl{display:flex;gap:var(--space-4);padding-bottom:var(--space-5);position:relative;}
.tl::before{content:"";position:absolute;left:11px;top:24px;bottom:0;width:2px;background:var(--color-border-primary);}
.tl:last-child::before{display:none;}
.tl .marker{width:24px;height:24px;border-radius:50%;background:var(--color-accent-primary-subtle);color:var(--color-accent-primary);display:flex;align-items:center;justify-content:center;font-size:11px;flex:none;z-index:1;}
.tl .body h5{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.tl .body p{font-size:var(--font-size-sm);color:var(--color-text-secondary);}
.tl .body .when{font-size:var(--font-size-xs);color:var(--color-text-tertiary);margin-top:2px;}

/* ---------- KANBAN (CRM) ---------- */
.kanban{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(260px,1fr);gap:var(--space-4);overflow-x:auto;padding-bottom:var(--space-3);}
.kcol{background:var(--color-bg-secondary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-lg);display:flex;flex-direction:column;min-height:200px;}
.kcol-head{display:flex;align-items:center;justify-content:space-between;padding:var(--space-4) var(--space-4) var(--space-3);}
.kcol-head .t{display:flex;align-items:center;gap:var(--space-2);font-family:var(--font-family-display);font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.kcol-head .cnt{font-size:var(--font-size-xs);font-weight:var(--font-weight-bold);color:var(--color-text-secondary);background:var(--color-bg-primary);border:1px solid var(--color-border-primary);padding:1px 8px;border-radius:var(--border-radius-full);}
.kcol-head .rail{width:8px;height:8px;border-radius:50%;}
.kcol-body{display:flex;flex-direction:column;gap:var(--space-3);padding:0 var(--space-3) var(--space-3);}
.kcol-total{padding:var(--space-3) var(--space-4);border-top:1px solid var(--color-border-primary);font-size:var(--font-size-xs);color:var(--color-text-secondary);display:flex;justify-content:space-between;}
.kcard{background:var(--color-bg-primary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);padding:var(--space-4);box-shadow:var(--shadow-xs);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.kcard:hover{box-shadow:var(--shadow-md);transform:translateY(-1px);border-color:var(--color-border-strong);}
.kcard .top{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-3);}
.kcard .nm{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.kcard .veh{font-size:var(--font-size-xs);color:var(--color-text-secondary);margin-bottom:var(--space-3);}
.kcard .foot{display:flex;align-items:center;justify-content:space-between;}
.kcard .val{font-family:var(--font-family-mono);font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.kcard .when{font-size:11px;color:var(--color-text-tertiary);}
.avatar.xs{width:22px;height:22px;font-size:9px;}

/* ---------- RT — RECOMENDAÇÕES TÉCNICAS (lista de avisos) ---------- */
.rt-toolbar{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;padding:var(--space-3) var(--space-5);border-bottom:1px solid var(--color-border-primary);background:var(--color-bg-secondary);}
.rt-list{display:flex;flex-direction:column;}
.rt-item{display:flex;gap:var(--space-3);padding:var(--space-4) var(--space-5);border-bottom:1px solid var(--color-border-secondary);cursor:pointer;transition:background var(--duration-fast) var(--easing-default);}
.rt-item:hover{background:var(--color-bg-hover);}
.rt-item:last-child{border-bottom:none;}
.rt-item .unread{width:8px;height:8px;border-radius:var(--border-radius-full);background:var(--color-accent-teal);box-shadow:0 0 0 3px var(--color-accent-teal-subtle);flex:none;margin-top:var(--space-2);}
.rt-item.lida .unread{background:transparent;box-shadow:none;}
.rt-item .bd{flex:1;min-width:0;display:flex;flex-direction:column;gap:var(--space-1);}
.rt-item .meta{display:flex;align-items:center;gap:var(--space-3);}
.rt-item .cod{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-secondary);}
.rt-item.destaque .cod{color:var(--color-accent-teal-strong);}
.rt-item .when{margin-left:auto;font-family:var(--font-family-mono);font-size:var(--font-size-xs);color:var(--color-text-tertiary);white-space:nowrap;}
.rt-item .tt{font-family:var(--font-family-display);font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);letter-spacing:var(--letter-spacing-tight);}
.rt-item.lida .tt{font-weight:var(--font-weight-medium);color:var(--color-text-body);}
.rt-item .sum{font-size:var(--font-size-sm);color:var(--color-text-secondary);line-height:var(--line-height-snug);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.rt-item .foot{display:flex;align-items:center;gap:var(--space-3);margin-top:var(--space-1);}
.rt-item .who{font-size:var(--font-size-xs);color:var(--color-text-tertiary);}
.rt-item .foot .link{margin-left:auto;font-size:var(--font-size-sm);white-space:nowrap;}
/* destaque (nova/urgente): fundo teal-subtle + filete teal no rail esquerdo */
.rt-item.destaque{background:var(--color-accent-teal-subtle);box-shadow:inset var(--border-width-thick) 0 0 var(--color-accent-teal);}
.rt-item.destaque:hover{background:var(--color-accent-teal-subtle);}
/* estado vazio */
.rt-empty{padding:var(--space-12) var(--space-6);text-align:center;display:flex;flex-direction:column;align-items:center;gap:var(--space-2);}
.rt-empty .glyph{width:44px;height:44px;border-radius:var(--border-radius-md);background:var(--color-accent-teal-subtle);color:var(--color-accent-teal-strong);display:flex;align-items:center;justify-content:center;font-size:var(--font-size-xl);margin-bottom:var(--space-2);}
.rt-empty .t{font-family:var(--font-family-display);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);font-size:var(--font-size-md);}
.rt-empty .s{font-size:var(--font-size-sm);color:var(--color-text-secondary);max-width:36ch;}
/* arquivo compacto (lista lateral) */
.rt-arch{display:flex;flex-direction:column;}
.rt-arch a{display:flex;flex-direction:column;gap:2px;padding:var(--space-3) 0;border-bottom:1px solid var(--color-border-secondary);cursor:pointer;}
.rt-arch a:first-child{padding-top:0;}
.rt-arch a:last-child{border-bottom:none;padding-bottom:0;}
.rt-arch .t{font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);color:var(--color-text-body);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color var(--duration-fast) var(--easing-default);}
.rt-arch a:hover .t{color:var(--color-text-link);}
.rt-arch .m{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-tertiary);}

/* ---------- QUICK — ATALHOS RÁPIDOS ---------- */
.quick{display:flex;flex-direction:column;gap:var(--space-2);}
.quick a{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.quick a:hover{background:var(--color-bg-hover);border-color:var(--color-border-strong);transform:translateY(-1px);box-shadow:var(--shadow-xs);}
.quick a:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.quick .tile{width:32px;height:32px;border-radius:var(--border-radius-sm);background:var(--color-accent-primary-subtle);color:var(--color-accent-primary);display:flex;align-items:center;justify-content:center;flex:none;}
.quick .tile.teal{background:var(--color-accent-teal-subtle);color:var(--color-accent-teal-strong);}
.quick .t{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.quick .s{font-size:var(--font-size-xs);color:var(--color-text-tertiary);}
.quick .go{margin-left:auto;color:var(--color-text-tertiary);display:flex;align-items:center;} /* encaixe da família de ícones (v2) */

.grid-2{display:grid;grid-template-columns:2fr 1fr;gap:var(--space-6);align-items:start;}
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-5);}
.stack{display:flex;flex-direction:column;gap:var(--space-5);}
.muted{color:var(--color-text-secondary);}
.nowrap{white-space:nowrap;}

/* ---------- MICRO — micro-caps mono (menor camada tipográfica; ver README) ---------- */
.micro{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-tertiary);}
/* modificador de .badge — contagem em micro-caps mono (ex.: "3 não lidas") */
.count-pill{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;}

/* ---------- MENSAGENS — alert inline · erro de campo · toast (ver README · Mensagens e feedback) ---------- */
/* Ícones fixos status→símbolo: error = i-alert-circle · warning = i-alert-triangle ·
   success = i-check-circle · info = i-info · dismiss = i-x. */

/* ALERT — banner do contexto (formulário/página): persiste até resolver ou o usuário dispensar */
.alert{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);border-radius:var(--border-radius-md);border:1px solid transparent;}
.alert .aico{margin-top:1px;}
.alert .bd{flex:1;min-width:0;}
.alert .tt{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);}
.alert .tx{font-size:var(--font-size-sm);color:inherit;line-height:var(--line-height-snug);margin-top:2px;}
.alert-error{background:var(--color-status-error-subtle);color:var(--color-status-error);border-color:color-mix(in srgb, var(--color-status-error) 28%, transparent);}
.alert-warning{background:var(--color-status-warning-subtle);color:var(--color-status-warning);border-color:color-mix(in srgb, var(--color-status-warning) 28%, transparent);}
.alert-success{background:var(--color-status-success-subtle);color:var(--color-status-success);border-color:color-mix(in srgb, var(--color-status-success) 28%, transparent);}
.alert-info{background:var(--color-status-info-subtle);color:var(--color-status-info);border-color:color-mix(in srgb, var(--color-status-info) 28%, transparent);}

/* X de dismiss compartilhado (alert e toast) */
.msg-x{flex:none;display:flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;color:inherit;opacity:.55;cursor:pointer;border-radius:var(--border-radius-xs);transition:opacity var(--duration-fast) var(--easing-default);}
.msg-x:hover{opacity:1;}
.msg-x:focus-visible{outline:none;box-shadow:var(--shadow-focus);opacity:1;}

/* ERRO DE CAMPO — validação específica de um input: borda + anel --shadow-focus-error + mensagem curta */
.input.invalid{border-color:var(--color-status-error);}
.input.invalid:focus{border-color:var(--color-status-error);box-shadow:var(--shadow-focus-error);}
.input-wrap.invalid .lead{color:var(--color-status-error);}
.field-msg{display:flex;align-items:center;gap:var(--space-2);margin-top:var(--space-2);font-size:var(--font-size-xs);color:var(--color-status-error);}
.field-msg .ico-svg{width:14px;height:14px;}

/* TOAST — feedback global transitório de AÇÃO ("pop-up" não bloqueante), empilhável.
   Superfície INVERSA (--color-bg-inverse): índigo profundo no claro, clara no escuro —
   o status é comunicado só pelo ícone (tokens --color-status-*-on-inverse), sem filete. */
.toaster{position:fixed;top:var(--space-4);right:var(--space-4);z-index:var(--z-toast);display:flex;flex-direction:column;gap:var(--space-3);width:340px;max-width:calc(100vw - 2 * var(--space-4));}
.toast{display:flex;align-items:flex-start;gap:var(--space-3);padding:var(--space-3) var(--space-4);background:var(--color-bg-inverse);border:1px solid color-mix(in srgb, var(--color-text-inverse) 12%, transparent);border-radius:var(--border-radius-lg);box-shadow:var(--shadow-xl);animation:toast-in var(--duration-normal) var(--easing-out);}
.toast .aico{margin-top:1px;}
.toast .bd{flex:1;min-width:0;}
.toast .tt{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-inverse);}
.toast .tx{font-size:var(--font-size-xs);color:color-mix(in srgb, var(--color-text-inverse) 72%, transparent);margin-top:2px;}
.toast .msg-x{color:var(--color-text-inverse);}
.toast .msg-x:focus-visible{box-shadow:0 0 0 3px color-mix(in srgb, var(--color-text-inverse) 28%, transparent);}
.toast-error .aico{color:var(--color-status-error-on-inverse);}
.toast-warning .aico{color:var(--color-status-warning-on-inverse);}
.toast-success .aico{color:var(--color-status-success-on-inverse);}
.toast-info .aico{color:var(--color-status-info-on-inverse);}
.toast.leaving{animation:toast-out var(--duration-normal) var(--easing-in) forwards;}
@keyframes toast-in{from{opacity:0;transform:translateY(-8px) scale(.98);}to{opacity:1;transform:none;}}
@keyframes toast-out{to{opacity:0;transform:translateY(-8px) scale(.98);}}
@media (prefers-reduced-motion:reduce){.toast,.toast.leaving{animation:none;}}
/* JS leve do toaster (referência canônica — cada tela inclui o seu):
   <div class="toaster" id="toaster" aria-live="polite"></div>
   const ICO={error:'i-alert-circle',warning:'i-alert-triangle',success:'i-check-circle',info:'i-info'};
   function spawnToast(status,tt,tx){
     const t=document.createElement('div');
     t.className='toast toast-'+status; t.setAttribute('role','status');
     t.innerHTML='<svg class="ico-svg aico"><use href="#'+ICO[status]+'"/></svg>'+
       '<div class="bd"><div class="tt">'+tt+'</div>'+(tx?'<div class="tx">'+tx+'</div>':'')+'</div>'+
       '<button type="button" class="msg-x" aria-label="Fechar"><svg class="ico-svg sz16"><use href="#i-x"/></svg></button>';
     t.querySelector('.msg-x').onclick=()=>closeToast(t);
     document.getElementById('toaster').appendChild(t);
     t._timer=setTimeout(()=>closeToast(t),4500);
   }
   function closeToast(t){
     if(!t||t.classList.contains('leaving'))return;
     clearTimeout(t._timer); t.classList.add('leaving');
     t.addEventListener('animationend',()=>t.remove(),{once:true});
     setTimeout(()=>t.remove(),400); // fallback com prefers-reduced-motion
   } */

/* ============================================================
   CONTROLES PRÓPRIOS — radio e checkbox tokenizados (substituem
   o accent nativo; aprovados em 15/07/2026). Estados: repouso,
   hover, marcado (teal), focus-visible.
   ============================================================ */
.radio{appearance:none;-webkit-appearance:none;width:18px;height:18px;border:var(--border-width-medium) solid var(--color-border-strong);border-radius:var(--border-radius-full);background:var(--color-bg-primary);cursor:pointer;position:relative;flex:none;transition:all var(--duration-fast) var(--easing-default);}
.radio:hover{border-color:var(--color-text-tertiary);}
.radio:checked{border-color:var(--color-accent-teal);}
.radio:checked::after{content:"";position:absolute;inset:3px;border-radius:var(--border-radius-full);background:var(--color-accent-teal);}
.radio:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.checkbox{appearance:none;-webkit-appearance:none;width:18px;height:18px;border:var(--border-width-medium) solid var(--color-border-strong);border-radius:var(--border-radius-xs);background:var(--color-bg-primary);cursor:pointer;position:relative;flex:none;transition:all var(--duration-fast) var(--easing-default);}
.checkbox:hover{border-color:var(--color-text-tertiary);}
.checkbox:checked{border-color:var(--color-accent-teal);background:var(--color-accent-teal);}
.checkbox:checked::after{content:"";position:absolute;left:50%;top:50%;width:5px;height:9px;border:solid var(--color-text-on-teal);border-width:0 2px 2px 0;transform:translate(-50%,-60%) rotate(45deg);}
.checkbox:focus-visible{outline:none;box-shadow:var(--shadow-focus);}

/* ============================================================
   SELECT DO DESIGN SYSTEM (.select-ds) — substitui o <select>
   nativo em todo o painel: gatilho no idioma do seletor do header
   + painel .dropdown com .dd-label/.dd-opt (check teal na ativa).
   Opção com origem discreta: .nm (nome) + .mt (micro-caps).
   ============================================================ */
.select-ds{position:relative;}
.select-ds .sd-btn{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);height:var(--control-height-md);width:100%;padding:0 var(--space-3) 0 var(--space-4);background:var(--color-bg-primary);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-md);color:var(--color-text-primary);font-family:var(--font-family-body);font-size:var(--font-size-base);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);text-align:left;}
.select-ds .sd-btn:hover{background:var(--color-bg-hover);border-color:var(--color-text-tertiary);}
.select-ds .sd-btn:focus-visible{outline:none;border-color:var(--color-border-focus);box-shadow:var(--shadow-focus);}
.select-ds .sd-btn .ph{color:var(--color-text-tertiary);}
.select-ds .sd-btn .chev{transition:transform var(--duration-fast) var(--easing-default);color:var(--color-text-tertiary);}
.select-ds .sd-btn[aria-expanded="true"] .chev{transform:rotate(180deg);}
.select-ds .dropdown{left:0;right:0;min-width:100%;max-height:280px;overflow-y:auto;}
.select-ds.sm .sd-btn{height:var(--control-height-sm);font-size:var(--font-size-sm);}
/* INVÁLIDO — espelho de .input.invalid (ver MENSAGENS): borda de erro em repouso
   e anel --shadow-focus-error no foco. Usa :focus (não :focus-visible) de
   propósito: o foco é dado por JS ao submeter, e foco programático em <button>
   depois de um clique de mouse não casa :focus-visible — o anel de erro sumiria
   justamente no campo focado. Marcado/limpo por tpnValidacao/.invalido() (ds.js). */
.select-ds.invalid .sd-btn{border-color:var(--color-status-error);}
.select-ds.invalid .sd-btn:hover{border-color:var(--color-status-error);}
.select-ds.invalid .sd-btn:focus{outline:none;border-color:var(--color-status-error);box-shadow:var(--shadow-focus-error);}
/* opção com ESTADO (ex.: seletor de versão da grade): .esq empilha a linha
   .top (nome mono + badge de status — mesmo mapa da timeline de Versões) sobre
   o .mt (data). A seleção segue a canônica (.dd-opt.active: wash + check). */
.dd-opt .esq{display:flex;flex-direction:column;gap:2px;min-width:0;}
.dd-opt .top{display:flex;align-items:center;gap:var(--space-2);min-width:0;flex-wrap:wrap;}
.dd-opt .top .nm{font-family:var(--font-family-mono);font-weight:var(--font-weight-semibold);white-space:nowrap;}
.dd-opt .top .badge{flex:none;}
/* gatilho com dot de estado (.st-dot) — a cor da versão vista no rótulo fechado */
.sd-btn .lbl{display:inline-flex;align-items:center;gap:var(--space-2);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sd-btn .st-dot{width:8px;height:8px;border-radius:var(--border-radius-full);flex:none;margin-right:2px;}
.st-dot.vigente{background:var(--color-status-success);}
.st-dot.agendada{background:var(--color-status-info);}
.st-dot.revogada{background:var(--color-status-error);}
.st-dot.encerrada{background:var(--color-text-tertiary);}

/* ============================================================
   FILTROS DE LISTAGEM — padrão reutilizável em duas camadas:
   linha simples (busca + botão Filtros com contador + LUPA que
   submete) e painel avançado expansível. Nada dispara sozinho
   (sem onkeyup): a lupa/Enter executa a consulta; o funil-x
   limpa e recarrega. Paginação no servidor.
   ============================================================ */
.filtros{display:flex;flex-direction:column;gap:var(--space-3);}
.filtros-linha{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;}
.filtros-linha .search{flex:1;min-width:240px;max-width:360px;}
.btn-filtros{display:inline-flex;align-items:center;gap:var(--space-2);height:var(--control-height-md);padding:0 var(--space-4);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-md);background:var(--color-bg-primary);color:var(--color-text-secondary);font-size:var(--font-size-sm);font-weight:var(--font-weight-medium);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.btn-filtros:hover{background:var(--color-bg-hover);color:var(--color-text-primary);}
.btn-filtros:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.btn-filtros .chev{transition:transform var(--duration-fast) var(--easing-default);}
.btn-filtros[aria-expanded="true"] .chev{transform:rotate(180deg);}
.btn-filtros .qtd{min-width:18px;height:18px;padding:0 5px;border-radius:var(--border-radius-full);background:var(--color-accent-teal);color:var(--color-text-on-teal);font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-bold);display:flex;align-items:center;justify-content:center;}
/* aberto, o botão EMENDA no painel (aprovado em 15/07/2026): cantos de baixo retos,
   fundo do painel e uma "ponte" que desce cobrindo o respiro da linha + a borda do
   painel — botão e painel viram uma peça só; a linha (busca/lupa) mantém o respiro. */
.btn-filtros[aria-expanded="true"]{background:var(--color-bg-secondary);border-color:var(--color-border-primary);border-bottom-color:var(--color-bg-secondary);border-bottom-left-radius:0;border-bottom-right-radius:0;position:relative;z-index:1;color:var(--color-text-primary);}
.btn-filtros[aria-expanded="true"]::after{content:"";position:absolute;left:calc(-1 * var(--border-width-thin));right:calc(-1 * var(--border-width-thin));top:100%;height:calc(var(--space-3) + var(--border-width-thin) * 2);background:var(--color-bg-secondary);border-left:var(--border-width-thin) solid var(--color-border-primary);border-right:var(--border-width-thin) solid var(--color-border-primary);}
.btn-buscar{width:var(--control-height-md);height:var(--control-height-md);flex:none;border:none;border-radius:var(--border-radius-md);background:var(--color-accent-primary);color:var(--color-text-on-accent);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.btn-buscar:hover{background:var(--color-accent-primary-active);}
.btn-buscar:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.filtros-avancados{display:none;grid-template-columns:repeat(3,minmax(180px,1fr)) auto;gap:var(--space-3);align-items:end;padding:var(--space-4);background:var(--color-bg-secondary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);}
.filtros-avancados.open{display:grid;}
.filtros-avancados .limpar{width:var(--control-height-md);height:var(--control-height-md);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-md);background:var(--color-bg-primary);color:var(--color-text-secondary);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.filtros-avancados .limpar:hover{background:var(--color-status-error-subtle);color:var(--color-status-error);border-color:transparent;}
.filtros-avancados .limpar:focus-visible{outline:none;box-shadow:var(--shadow-focus);}

/* ============================================================
   COPY-FIELD — link de uso único (convite) com botão copiar.
   Estado .copiado no botão após a cópia (volta sozinho via JS).
   ============================================================ */
.copy-field{display:flex;gap:var(--space-2);align-items:center;}
.copy-field .input{flex:1;font-family:var(--font-family-mono);font-size:var(--font-size-sm);color:var(--color-text-secondary);background:var(--color-bg-secondary);}
.copy-field .btn .ico-svg{width:16px;height:16px;}
.copy-field .btn.copiado{background:var(--color-accent-teal-subtle);color:var(--color-accent-teal-strong);border-color:transparent;}

/* ============================================================
   FORMULÁRIOS — andaime padrão das telas de cadastro/edição.
   O card do formulário ocupa a LARGURA DO MIOLO (teto
   --max-width-page), pousando na mesma borda direita das
   tabelas — nunca max-width avulso por tela (README · Convenções).

   RITMO VERTICAL AUTOMÁTICO: o corpo do <form> (e sub-blocos
   .form-bloco) é um fluxo que se espaça sozinho (gap --space-5) —
   NENHUMA tela usa margem inline. Placeholders vazios
   (#erroGeral/#campoPai) saem do fluxo, sem respiro fantasma.
   Obrigatório = * no label (.req). Voltar (drill-in) = .tb-back,
   seta no topbar à esquerda do breadcrumb (README · Formulários).
   ============================================================ */
/* .card-body.fluxo = o MESMO ritmo para card que NÃO é formulário (card de
   resultado/confirmação — ex.: o convite gerado). Sem ele, esses cards ficavam
   fora do fluxo e a tela "consertava" com margem inline, justamente o que o
   README proíbe. Ver README · Formulários — padrão único. */
.card-body form,
.card-body form .form-bloco,
.card-body.fluxo{display:flex;flex-direction:column;gap:var(--space-5);}
.card-body form > :empty,
.card-body.fluxo > :empty{display:none;}                /* placeholder vazio não gera respiro */
.card-body form .sec-label,
.card-body.fluxo .sec-label{margin:var(--space-2) 0 0;} /* seção respira um pouco mais que o gap */
.card-body form .btn-solto{align-self:flex-start;}      /* botão solto no fluxo não estica */
.card-body form > .form-actions,
.card-body.fluxo > .form-actions{margin-top:var(--space-3);}  /* gap(5)+3 = --space-8 acima da ação */
/* bloco desligado por regra do próprio form (ex.: superadministrador não usa
   vínculos): esmaece e neutraliza o mouse. Substitui o style.opacity/
   pointer-events inline que vivia solto na tela. Bloco .off não é validado e
   tem as marcas de erro limpas ao desligar (README · Formulários — validação). */
.form-bloco.off{opacity:.45;pointer-events:none;}

.form-actions{display:flex;align-items:center;gap:var(--space-3);}
.form-actions>.acao-fim{margin-left:auto;}              /* Inativar empurrado à direita na edição */

.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-4);}
.form-grid.compacta{grid-template-columns:120px 1fr;}   /* par assimétrico: UF+Cidade */

/* obrigatório: * no label — teal-strong (destaque de atenção; não é erro nem ação) */
.field label .req{margin-left:2px;color:var(--color-accent-teal-strong);font-weight:var(--font-weight-bold);}

/* dica de campo — texto de ajuda curto sob o rótulo (opcional, minúsculas) */
.field .dica{display:block;margin:calc(-1 * var(--space-1)) 0 var(--space-2);font-size:var(--font-size-xs);color:var(--color-text-tertiary);line-height:var(--line-height-snug);}
/* nota do campo — legenda micro-caps que pertence ao controle logo acima (ex.:
   "válido por 7 dias" sob o link de convite). Colada por --space-2, na mesma
   família do .field-msg: dentro de um container de ritmo herdaria o gap e
   descolaria do controle. */
.field > .micro{margin-top:var(--space-2);}

.sec-label{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-secondary);margin:var(--space-6) 0 var(--space-3);}
.bloco-off{padding:var(--space-4);border:1px dashed var(--color-border-strong);border-radius:var(--border-radius-md);color:var(--color-text-tertiary);font-size:var(--font-size-sm);background:var(--color-bg-secondary);}
/* INVÁLIDO — erro SEM campo culpado (lista obrigatória vazia): o próprio estado
   vazio da lista assume o tom de erro, no lugar onde a lista estaria — nada se
   desloca. O foco vai para o botão que resolve ("+ Adicionar…"). */
.bloco-off.invalid{border-color:var(--color-status-error);background:var(--color-status-error-subtle);color:var(--color-status-error);}

/* ============================================================
   PAINEL DE ESTADO (.painel-estado) — estado atual + meta + ações,
   PERSISTENTE, dentro de formulário/detalhe (ex.: convite pendente
   na edição de usuário). NÃO é .alert (mensagem efêmera do topo,
   dispensável), NÃO é .bloco-off (lista vazia tracejada), NÃO é .rc
   (hero de cotação). Container na MESMA família dos cartões do form
   (o .form-bloco / o cartão de Acesso): superfície neutra + UMA borda
   hairline neutra + raio do DS — SEM fundo tingido de status, SEM
   borda colorida, SEM barra lateral (esse combo "cartão-aviso" é do
   .alert efêmero, nunca deste painel). A cor de status vive SÓ no
   ícone + no badge + na copy. Ver README · Painel de estado.
   ============================================================ */
.painel-estado{display:flex;flex-direction:column;gap:var(--space-4);padding:var(--space-4);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);background:var(--color-bg-secondary);}
.painel-estado .pe-head{display:flex;align-items:flex-start;gap:var(--space-3);}
.painel-estado .pe-head .aico{flex:none;margin-top:1px;color:var(--color-text-tertiary);}
.painel-estado .pe-head .badge{flex:none;}
.painel-estado .pe-bd{flex:1;min-width:0;}
.painel-estado .pe-tt{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.painel-estado .pe-meta{margin-top:2px;font-size:var(--font-size-sm);color:var(--color-text-secondary);line-height:var(--line-height-snug);}
.painel-estado .pe-meta .mono{color:var(--color-text-body);}   /* data/estado em mono, no espírito do DS */
.painel-estado .pe-actions{display:flex;gap:var(--space-3);flex-wrap:wrap;}
/* status só na COR DO ÍCONE (badge e copy carregam o resto); container inalterado */
.painel-estado.aviso .pe-head .aico{color:var(--color-status-warning);}   /* pendente (VÁLIDO/EXPIRADO) — mesma cor do badge PENDENTE */
.painel-estado.neutro .pe-head .aico{color:var(--color-text-tertiary);}   /* cancelado/inativo (NENHUM) */

/* ============================================================
   VÍNCULOS (usuário × unidade × cargo) — repetidor .vinc-row:
   unidade + cargo daquela unidade + radio de principal + remover.
   ============================================================ */
.vincs{display:flex;flex-direction:column;gap:var(--space-3);}
.vinc-row{display:grid;grid-template-columns:1fr 1fr auto auto;gap:var(--space-3);align-items:end;padding:var(--space-3);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);background:var(--color-bg-secondary);}
.vinc-row .principal{display:inline-flex;align-items:center;gap:var(--space-2);font-size:var(--font-size-sm);color:var(--color-text-secondary);white-space:nowrap;cursor:pointer;height:var(--control-height-md);}
.vinc-row .row-act{margin-bottom:calc((var(--control-height-md) - var(--control-height-sm)) / 2);}
/* INVÁLIDA — numa linha de repetidor a mensagem NÃO fica sob cada campo: o grid é
   1fr 1fr auto auto com align-items:end, e pendurar a mensagem num dos selects
   empurraria o "Principal" e o × para baixo, desalinhando a linha de controles.
   Então: tinta na linha + borda no controle culpado (.select-ds.invalid) + UMA
   mensagem ocupando a linha inteira. Ver README · Formulários — validação. */
.vinc-row.invalid{border-color:color-mix(in srgb, var(--color-status-error) 45%, transparent);background:var(--color-status-error-subtle);}
.vinc-row .field-msg{grid-column:1 / -1;margin-top:0;}

/* ============================================================
   RADIO-CARD — opção com título + descrição (ex.: alcance do
   cargo). CHECK-LINE — opção destacada com descrição (ex.:
   superadministrador).
   ============================================================ */
.radio-cards{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-3);}
.radio-card{display:flex;gap:var(--space-3);padding:var(--space-4);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-md);background:var(--color-bg-primary);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.radio-card:hover{background:var(--color-bg-hover);}
.radio-card .radio{margin-top:2px;}
.radio-card .t{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.radio-card .s{display:block;font-size:var(--font-size-xs);color:var(--color-text-secondary);margin-top:2px;line-height:var(--line-height-snug);}
.radio-card.active{border-color:var(--color-accent-teal);background:var(--color-accent-teal-subtle);}
.radio-card:focus-within{box-shadow:var(--shadow-focus);}
.check-line{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-4);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);cursor:pointer;}
.check-line .t{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.check-line .s{display:block;font-size:var(--font-size-xs);color:var(--color-text-secondary);margin-top:2px;}

/* ============================================================
   SIDEBAR COLAPSÁVEL — .side-collapse (chevrons no rodapé do
   menu) alterna .app.nav-min: 72px só ícones, itens com tooltip
   (title), ativo preservado. Persistir em localStorage.
   ============================================================ */
.side-collapse{margin-top:auto;align-self:flex-end;width:32px;height:32px;border:none;border-radius:var(--border-radius-md);background:transparent;color:var(--color-sidebar-item);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all var(--duration-fast) var(--easing-default);}
.side-collapse:hover{background:var(--color-sidebar-item-hover);color:#fff;}
.side-collapse:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.side-collapse .ico-svg{transition:transform var(--duration-normal) var(--easing-default);}
.sidebar .side-collapse~.side-foot{margin-top:0;}
.app.nav-min{grid-template-columns:72px 1fr;}
.app.nav-min .sidebar{padding:var(--space-6) var(--space-2);align-items:center;gap:var(--space-4);}
.app.nav-min .brand{padding:0;justify-content:center;}
.app.nav-min .brand .mark{width:40px;height:40px;}
.app.nav-min .brand-txt,.app.nav-min .nav-label,.app.nav-min .nav-item .txt,.app.nav-min .side-foot{display:none;}
.app.nav-min .nav-group{width:100%;align-items:center;}
/* divisor discreto entre categorias (Rede · Acesso) no lugar do espaço */
.app.nav-min .nav-group+.nav-group{border-top:var(--border-width-thin) solid var(--color-sidebar-border);padding-top:var(--space-4);}
.app.nav-min .nav-item{justify-content:center;width:48px;padding:var(--space-3) var(--space-2);}
.app.nav-min .nav-item .ico,.app.nav-min .nav-item .ico-svg{width:22px;height:22px;}
.app.nav-min .side-collapse{align-self:center;}
.app.nav-min .side-collapse .ico-svg{transform:rotate(180deg);}

/* ============================================================
   AÇÕES DE LINHA (listagens) — lápis=editar · lixeira=inativar ·
   seta circular=reativar. Sempre com title/aria-label.
   ============================================================ */
td.row-actions,th.row-actions{text-align:right;white-space:nowrap;}
/* idioma do .icon-btn do topbar (aprovado em 15/07/2026): borda + raio md + fundo —
   vocabulário único de botão de ícone; no hover a borda sai e entra o preenchimento semântico. */
.row-act{display:inline-flex;align-items:center;justify-content:center;width:var(--control-height-sm);height:var(--control-height-sm);border:var(--border-width-thin) solid var(--color-border-primary);border-radius:var(--border-radius-md);background:var(--color-bg-primary);color:var(--color-text-secondary);cursor:pointer;transition:all var(--duration-fast) var(--easing-default);vertical-align:middle;}
.row-act+.row-act{margin-left:var(--space-2);}
/* hover estável: a borda FICA (tingida na cor semântica), sem lift/sombra */
.row-act:hover{background:var(--color-accent-primary-subtle);border-color:color-mix(in srgb, var(--color-accent-primary) 35%, transparent);color:var(--color-accent-primary);}
.row-act.danger:hover{background:var(--color-status-error-subtle);border-color:color-mix(in srgb, var(--color-status-error) 35%, transparent);color:var(--color-status-error);}
.row-act:active{background:var(--color-bg-selected);}
.row-act:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
/* desabilitado: a ação existe, o contexto não permite (ex.: Arquivar com
   franqueadas em uso) — o motivo vai no tooltip do DS (.tip) que envolve o botão. */
.row-act:disabled{background:var(--color-bg-tertiary);color:var(--color-text-tertiary);border-color:var(--color-border-primary);cursor:not-allowed;}
.row-act:disabled:hover{background:var(--color-bg-tertiary);color:var(--color-text-tertiary);border-color:var(--color-border-primary);}

/* ============================================================
   PREÇOS E COTAÇÃO — aprovado em 16/07/2026
   (mockup 2026-07-16-tabelas-de-precos-v3; ver README · Convenções)
   ============================================================ */

/* INPUT-MOEDA — valor financeiro editável: "R$" fixo à esquerda, dígitos
   em mono à direita (formato R$ 1.234,56 — a API fala centavos int). */
.input-moeda{position:relative;}
.input-moeda .lead{position:absolute;left:var(--space-3);top:50%;transform:translateY(-50%);font-family:var(--font-family-mono);font-size:var(--font-size-xs);color:var(--color-text-tertiary);pointer-events:none;}
.input-moeda .input{font-family:var(--font-family-mono);text-align:right;padding-left:var(--space-10);}
.input-moeda.invalid .lead{color:var(--color-status-error);}
.input-moeda .input[readonly]{background:var(--color-bg-secondary);color:var(--color-text-secondary);}
.input-moeda.sm .input{height:var(--control-height-sm);font-size:var(--font-size-sm);}

/* INPUT-DATA — data em mono (DD/MM/AAAA); a regra do campo (ex.: "mínimo
   amanhã") vai em micro-caps junto ao campo, nunca em placeholder solto. */
.input.input-data{font-family:var(--font-family-mono);letter-spacing:var(--letter-spacing-wide);}

/* GRADE DE FAIXAS — table.data.grade: leitura (mono) e edição (inputs de
   moeda por linha, rascunho). Contiguidade validada no cliente E no servidor
   (carro: max = min da próxima · moto: min = max anterior + 1): linha fora
   da partição = tr.invalida + linha de mensagem tr.msg-erro (family .field-msg). */
table.data.grade td.num,table.data.grade th.num{text-align:right;}
table.data.grade .input-moeda{width:150px;display:inline-block;}
table.data.grade td .faixa-sep{color:var(--color-text-tertiary);padding:0 var(--space-2);}
table.data.grade tbody tr{cursor:default;}
table.data.grade tr.invalida td{background:var(--color-status-error-subtle);border-bottom-color:color-mix(in srgb, var(--color-status-error) 30%, transparent);}
table.data.grade tr.msg-erro td{padding-top:0;border-bottom-color:color-mix(in srgb, var(--color-status-error) 30%, transparent);background:var(--color-status-error-subtle);}
table.data.grade tr.msg-erro .field-msg{margin-top:0;}
/* inserir faixa acima/abaixo (i-row-above/i-row-below) — .row-act.insert revela no
   hover/foco da linha; o × destrutivo segue sempre visível. Ver README · Ações de linha. */
table.data.grade tr .row-act.insert{opacity:0;transition:opacity var(--duration-fast) var(--easing-default);}
table.data.grade tr:hover .row-act.insert,
table.data.grade tr:focus-within .row-act.insert{opacity:1;}
.grade-foot{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-4) var(--space-5);border-top:1px solid var(--color-border-primary);flex-wrap:wrap;}
.grade-foot .spacer{flex:1;}

/* CONFIRMA-INLINE — confirmação EM FLUXO (decisão do DS: sem modal): painel
   que abre empurrando o conteúdo, com consequência dita em uma frase, campos
   e ações. Usos: publicar versão, atribuir franqueada, nova tabela, linha de
   aceitação. Fundo accent-primary-subtle (decisão, não erro). */
.confirma-inline{display:none;gap:var(--space-4);align-items:end;flex-wrap:wrap;padding:var(--space-4);background:var(--color-accent-primary-subtle);border:1px solid color-mix(in srgb, var(--color-accent-primary) 30%, transparent);border-radius:var(--border-radius-md);}
.confirma-inline.open{display:flex;}
.confirma-inline .bd{flex:1 1 100%;}
.confirma-inline .tt{font-family:var(--font-family-display);font-size:var(--font-size-base);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.confirma-inline .tx{font-size:var(--font-size-sm);color:var(--color-text-secondary);margin-top:2px;}
.confirma-inline .field{min-width:200px;}
.confirma-inline .hint{flex-basis:100%;}

/* Diálogo de confirmação (tpnConfirm, ds.js) — substitui o confirm() nativo.
   Botões sempre Não (.btn-ghost) + Sim (.btn-danger no perigo, .btn-primary neutro). Ver README/showcase. */
.dialog-overlay{position:fixed;inset:0;z-index:var(--z-modal);display:flex;align-items:center;justify-content:center;padding:var(--space-6);background:var(--color-surface-overlay);}
.dialog{width:100%;max-width:440px;background:var(--color-bg-primary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);padding:var(--space-6);}
.dialog-tt{font-family:var(--font-family-display);font-size:var(--font-size-lg);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);letter-spacing:var(--letter-spacing-tight);}
.dialog-tx{margin-top:var(--space-2);color:var(--color-text-secondary);font-size:var(--font-size-sm);line-height:var(--line-height-normal);}
.dialog-actions{display:flex;justify-content:flex-end;gap:var(--space-3);margin-top:var(--space-6);}

/* CASCADE — selects dependentes (ex.: FIPE marca → modelo → ano): habilitam
   em cadeia; estados desabilitado (.select-ds.disabled) e carregando (.spin). */
.cascade{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-3);}
.select-ds.disabled .sd-btn{background:var(--color-bg-tertiary);color:var(--color-text-tertiary);border-color:var(--color-border-primary);cursor:not-allowed;pointer-events:none;}
.select-ds.disabled .sd-btn .ph{color:var(--color-text-tertiary);}
.spin{width:14px;height:14px;flex:none;border:2px solid var(--color-border-strong);border-top-color:var(--color-accent-primary);border-radius:var(--border-radius-full);animation:spin .7s linear infinite;}
@keyframes spin{to{transform:rotate(360deg);}}
@media (prefers-reduced-motion:reduce){.spin{animation:none;}}

/* REF-VALOR — valor de referência resolvido automaticamente (ex.: FIPE):
   rótulo micro-caps + valor mono em destaque; .aguarda antes de resolver. */
.ref-valor{display:flex;flex-direction:column;gap:var(--space-1);padding:var(--space-4);background:var(--color-bg-secondary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);}
.ref-valor .k{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-secondary);font-weight:var(--font-weight-semibold);}
.ref-valor .v{font-family:var(--font-family-mono);font-size:var(--font-size-xl);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.ref-valor.aguarda .v{color:var(--color-text-tertiary);font-size:var(--font-size-base);font-weight:var(--font-weight-normal);}

/* RC — RESULTADO DE COTAÇÃO — mensalidade hero em mono sobre teal-subtle
   (destaque de marca) + composição em .datalist. Recusa/fora-de-tabela/
   confirmação manual usam a família de mensagens (.alert), sem cor nova. */
.rc{background:var(--color-bg-primary);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-lg);box-shadow:var(--shadow-md);overflow:hidden;}
.rc-hero{display:flex;flex-direction:column;align-items:center;gap:var(--space-3);padding:var(--space-8) var(--space-5) var(--space-6);background:var(--color-accent-teal-subtle);border-bottom:1px solid var(--color-border-primary);text-align:center;}
.rc-hero .k{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);letter-spacing:var(--letter-spacing-wider);text-transform:uppercase;color:var(--color-text-secondary);font-weight:var(--font-weight-semibold);}
.rc-hero .v{font-family:var(--font-family-mono);font-size:var(--font-size-4xl);font-weight:var(--font-weight-bold);color:var(--color-text-primary);letter-spacing:var(--letter-spacing-tight);line-height:var(--line-height-tight);}
.rc-hero .v small{font-size:var(--font-size-md);font-weight:var(--font-weight-medium);color:var(--color-text-secondary);}
.rc-body{padding:var(--space-5);display:flex;flex-direction:column;gap:var(--space-4);}

/* FALLBACK de marca na aceitação — linha "todos os outros" (o resto da
   marca): fundo secundário + nome em itálico, para não se passar por modelo. */
table.data tr.resto td{background:var(--color-bg-secondary);}
table.data tr.resto .nm{font-style:italic;font-weight:var(--font-weight-medium);color:var(--color-text-secondary);}

/* TIP — TOOLTIP DO DS: informação de hover/focus acessível. Superfície
   INVERSA (como o toast) + seta; abre para BAIXO por padrão (variante .cima
   abre para cima; .multi quebra até 280px). Gatilho recebe tabindex="0" +
   aria-describedby; o corpo é role="tooltip". Substitui o title= nativo. */
.tip{position:relative;display:inline-flex;align-items:center;border-radius:var(--border-radius-xs);}
.tip:focus-visible{outline:none;box-shadow:var(--shadow-focus);}
.tip .tip-body{position:absolute;top:calc(100% + var(--space-2));left:50%;transform:translateX(-50%) translateY(-2px);background:var(--color-bg-inverse);color:var(--color-text-inverse);font-size:var(--font-size-xs);font-weight:var(--font-weight-medium);line-height:var(--line-height-snug);padding:var(--space-2) var(--space-3);border-radius:var(--border-radius-sm);box-shadow:var(--shadow-lg);white-space:nowrap;opacity:0;visibility:hidden;pointer-events:none;transition:opacity var(--duration-fast) var(--easing-default),transform var(--duration-fast) var(--easing-default);z-index:var(--z-dropdown);}
.tip .tip-body::after{content:"";position:absolute;bottom:100%;left:50%;transform:translateX(-50%);border:5px solid transparent;border-bottom-color:var(--color-bg-inverse);}
.tip:hover .tip-body,.tip:focus-visible .tip-body,.tip:focus-within .tip-body{opacity:1;visibility:visible;transform:translateX(-50%) translateY(0);}
.tip.cima .tip-body{top:auto;bottom:calc(100% + var(--space-2));transform:translateX(-50%) translateY(2px);}
.tip.cima .tip-body::after{bottom:auto;top:100%;border-bottom-color:transparent;border-top-color:var(--color-bg-inverse);}
.tip.cima:hover .tip-body,.tip.cima:focus-visible .tip-body,.tip.cima:focus-within .tip-body{transform:translateX(-50%) translateY(0);}
.tip .tip-body.multi{white-space:normal;width:max-content;max-width:280px;text-align:center;}
.row-actions .tip{margin-left:var(--space-2);vertical-align:middle;}
.row-actions .tip .tip-body{left:auto;right:0;transform:translateY(-2px);}
.row-actions .tip:hover .tip-body,.row-actions .tip:focus-visible .tip-body,.row-actions .tip:focus-within .tip-body{transform:translateY(0);}
.row-actions .tip .tip-body::after{left:auto;right:12px;transform:none;}

/* TIMELINE — estados sobre o .tl: concluído / atual / futuro
   (proposta compartilhada com o mockup do app do associado, 16/07/2026). */
.tl.done .marker{background:var(--color-status-success-subtle);color:var(--color-status-success);}
.tl.now .marker{background:var(--color-accent-teal);color:var(--color-text-on-teal);box-shadow:0 0 0 4px var(--color-accent-teal-subtle);}
.tl.next .marker{background:var(--color-bg-tertiary);color:var(--color-text-tertiary);}
.tl.next .body h5{color:var(--color-text-tertiary);font-weight:var(--font-weight-medium);}

/* NAVEGAÇÃO POR VÍNCULO — grupos restritos nascem com [hidden] no HTML e o
   JS (ds.js · tpnAplicarNav) revela conforme o /v1/auth/eu; a regra abaixo
   garante o display:none mesmo com a classe .nav-group (que é flex). */
.nav-group[hidden]{display:none;}

/* ============================================================
   CONFIGURAÇÕES — engrenagem no topbar (i-gear) abrindo o menu
   canônico de configuração do sistema (grupos: Precificação,
   Acesso). Montado pelo ds.js (tpnMenuConfig) conforme o perfil.
   ============================================================ */
.dd-config{min-width:260px;padding:var(--space-2);}
.dd-config .dd-label{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);font-weight:var(--font-weight-semibold);letter-spacing:var(--letter-spacing-wide);text-transform:uppercase;color:var(--color-text-tertiary);padding:var(--space-2) var(--space-3);}
.dd-config .dd-item{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);border-radius:var(--border-radius-md);font-size:var(--font-size-sm);color:var(--color-text-primary);cursor:pointer;text-decoration:none;}
.dd-config .dd-item .ico-svg{width:18px;height:18px;color:var(--color-text-secondary);}
.dd-config .dd-item:hover{background:var(--color-bg-hover);}
.dd-config .dd-item.ativo{background:var(--color-accent-teal-subtle);color:var(--color-accent-teal-strong);font-weight:var(--font-weight-semibold);}
.dd-config .dd-item.ativo .ico-svg{color:var(--color-accent-teal-strong);}
.dd-config .dd-item .chk{margin-left:auto;}
.dd-config .dd-div{height:1px;background:var(--color-border-primary);margin:var(--space-2) var(--space-1);}

/* ============================================================
   PRECIFICAÇÃO — componentes das telas do módulo 03 v2:
   seleção de marcas (com ano mínimo), aceite de veículos por
   grupo/modelo e cards de plano no resultado da cotação.
   ============================================================ */
.marcas-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:var(--space-2);}
.marca-item{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-3);border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);background:var(--color-bg-primary);}
.marca-item .nm{flex:1;font-size:var(--font-size-sm);color:var(--color-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.marca-item .ano{font-family:var(--font-family-mono);font-size:var(--font-size-xs);color:var(--color-text-secondary);border:1px solid var(--color-border-strong);border-radius:var(--border-radius-sm);padding:2px var(--space-2);background:var(--color-bg-primary);width:84px;text-align:center;}
.marca-item.off{opacity:.55;}
.marca-item.off .ano{visibility:hidden;}
.veic-marca{border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);background:var(--color-bg-primary);margin-bottom:var(--space-2);}
.veic-marca > .head{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-3) var(--space-4);cursor:pointer;}
.veic-marca > .head .nm{font-weight:var(--font-weight-semibold);font-size:var(--font-size-sm);color:var(--color-text-primary);}
.veic-marca > .head .qtd{font-family:var(--font-family-mono);font-size:var(--font-size-xs);color:var(--color-text-secondary);}
.veic-marca > .head .ano{margin-left:auto;font-family:var(--font-family-mono);font-size:var(--font-size-xs);color:var(--color-text-tertiary);}
.veic-grupos{padding:0 var(--space-4) var(--space-3);display:flex;flex-direction:column;gap:var(--space-2);}
.veic-grupo{border:1px solid var(--color-border-primary);border-radius:var(--border-radius-md);}
.veic-grupo > .g{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-3);}
.veic-grupo > .g .nm{font-size:var(--font-size-sm);font-weight:var(--font-weight-semibold);color:var(--color-text-primary);}
.veic-grupo > .g .qtd{font-family:var(--font-family-mono);font-size:var(--font-size-xs);color:var(--color-text-secondary);}
.veic-grupo > .g .abrir{margin-left:auto;}
.veic-modelos{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:var(--space-1) var(--space-4);padding:var(--space-2) var(--space-3) var(--space-3);border-top:1px dashed var(--color-border-primary);}
.veic-modelo{display:flex;align-items:flex-start;gap:var(--space-2);padding:var(--space-1) 0;cursor:pointer;}
.veic-modelo .nm{font-size:var(--font-size-sm);color:var(--color-text-primary);line-height:1.3;}
.veic-modelo .cod{display:block;font-family:var(--font-family-mono);font-size:var(--font-size-2xs);color:var(--color-text-tertiary);}
.plano-total{font-family:var(--font-family-mono);font-size:var(--font-size-2xs);color:var(--color-text-tertiary);display:block;margin-top:2px;}
.planos-resultado{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:var(--space-4);}
.plano-card{border:1px solid var(--color-border-primary);border-radius:var(--border-radius-lg);background:var(--color-bg-primary);padding:var(--space-5);}
.plano-card .pn{font-family:var(--font-family-display);font-weight:var(--font-weight-semibold);font-size:var(--font-size-sm);color:var(--color-text-primary);}
.plano-card .preco{font-family:var(--font-family-mono);font-weight:var(--font-weight-semibold);font-size:var(--font-size-2xl);color:var(--color-text-primary);margin:var(--space-2) 0 0;}
.plano-card .preco small{font-size:var(--font-size-xs);color:var(--color-text-tertiary);font-weight:var(--font-weight-regular);}
.plano-card ul{list-style:none;margin:var(--space-3) 0 0;padding:var(--space-3) 0 0;border-top:1px dashed var(--color-border-primary);display:flex;flex-direction:column;gap:var(--space-1);}
.plano-card li{font-size:var(--font-size-xs);color:var(--color-text-secondary);display:flex;gap:var(--space-2);align-items:center;}
.plano-card li .ico-svg{width:14px;height:14px;color:var(--color-accent-teal-strong);}
.plano-card.destaque{border-color:var(--color-accent-teal);box-shadow:var(--shadow-glow-teal);}

/* ============================================================
   MARCA — variante por superfície, nunca por tema
   ------------------------------------------------------------
   A marca tem DOIS assets, com as cores literais DENTRO do arquivo
   (SVG carregado por <img> é documento separado: não enxerga as CSS
   variables da página):
     assets/logo-mark.svg        tinta contra BRANCA  → superfície ESCURA
     assets/logo-mark-claro.svg  tinta contra ÍNDIGO  → superfície CLARA
   Quem decide é a SUPERFÍCIE onde a marca pousa, não o tema da página:
   sidebar e painel de marca são índigo fixo nos dois temas → sempre o
   asset escuro, com UM <img> só (estas classes nem entram).
   As classes abaixo servem só à superfície que ACOMPANHA o tema
   (--color-bg-primary/--color-bg-secondary, ex.: card público): a tela
   põe OS DOIS <img> e o CSS mostra um por vez. Só um deles carrega o
   texto alternativo — o outro vai alt="" + aria-hidden="true", para o
   leitor de tela não anunciar a marca duas vezes.
   O @media espelha a estrutura do tokens.css; sem ele, página sem
   data-theme explícito ficaria escura exibindo a marca clara.
   CASCATA: este bloco fica no FIM do arquivo de propósito — precisa vir
   depois de qualquer regra de display da marca (ex.: .brand .mark), e a
   tela não pode redefinir `display` no seletor dela (.pub-card .mark tem
   especificidade maior e venceria). Nada de !important.
   ============================================================ */
.so-claro{display:block;}
.so-escuro{display:none;}
[data-theme="dark"] .so-claro{display:none;}
[data-theme="dark"] .so-escuro{display:block;}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]) .so-claro{display:none;}
  :root:not([data-theme="light"]) .so-escuro{display:block;}
}
