/* ============================================================================
   css/base.css: SISTEMA DE DESIGN do Prospector ("painel de campo"). Área: base.
   Primeiro arquivo da cascata (base, casca, leads, meus, modais, peca3d, abas).
   O login usa só este arquivo.

   MANUAL DAS ÁREAS (leia antes de redesenhar a sua tela)
   ---------------------------------------------------------------------------
   Regra de ouro: nenhuma cor em hex fora do :root. Use os tokens abaixo.
   Uma cor de SINAL só (--primary, verde) pra ação que dá dinheiro: Ligar, Pegar lead,
   Fechei, sucesso. Seleção/foco/links/"Registrar toque" = --accent. IA = --coach.

   TOKENS
     Fundo:   --bg  --bg-2 (sidebar/topbar)  --surface  --surface-2  --surface-3
     Linhas:  --line  --line-2          Texto: --text  --text-2  --text-3
     Sinal:   --primary --primary-ink --primary-soft   Acento: --accent --accent-ink --accent-soft
     IA:      --coach --coach-soft      Estado: --warn --warn-soft --danger --danger-soft --info --info-soft
     Fonte:   --f-display (Bricolage Grotesque: títulos, números, marca)  --f-text (Onest)
     Escala:  --t-12 --t-13 --t-14 --t-16 --t-18 --t-22 --t-28 --t-36
     Raio:    --r-sm 10  --r 14  --r-card 16  --r-lg 20  --r-pill
     Espaço:  --sp-1..--sp-8 = 4 8 12 16 20 24 32 40
     Tempo:   --dur-1 120ms (press)  --dur-2 200ms (hover, toast)  --dur-3 320ms (folha, aba)  --dur-4 480ms (festa)
     Curva:   --ease-saida (desacelera: o que ENTRA)  --ease-entrada (acelera: o que SAI)  --ease-mola (mola
              com ~4% de overshoot, linear())  --ease = --ease-saida (legado)
     Camada:  --fio (fio de luz no topo das superfícies)  --sombra-flutua (só no que flutua: folha, toast,
              card arrastado)  --brilho-acao (SÓ no foco da ação principal)
     Toque:   --alvo 44  --alvo-lg 52
   V2 (movimento, pilha de toast, desfazer, busca, atalhos, sem internet, gestos): MANUAL_V2.md.
   Movimento reduzido: prefers-reduced-motion OU <html data-movimento="reduzido"> = tudo instantâneo.

   CLASSES
     Texto:   .display (fonte display)  .num (tabular-nums)  .muted  .eyebrow (rótulo pequeno)
     Botões:  .btn (neutro surface-2, 44 px)  .btn-primary (verde)  .btn-accent (azul)
              .btn-coach (violeta)  .btn-ghost  .btn-danger (fantasma vermelho)
              .btn-lg (52 px, ação principal)  .btn-sm (44 px, texto menor)  .btn-block (largura total)
              .btn-icon (44x44, SÓ ícone; exige aria-label)
              Carregando: botão com .is-loading (spinner + texto; use setBotaoCarregando de core/util.js)
              Legado mantido: .btn-secondary = .btn · .btn-danger-ghost = .btn-danger · .btn-copiar
              .btn-coach-card · .btn-danger-solid · .btn-danger-confirm
     Chips:   .chip (pílula clicável; selecionado = .on / .active / [aria-pressed=true])
              .chip-dot + <i class="dot"></i> dentro, cor por .dot-primary|accent|warn|danger|coach|info|mute
              .tag (etiqueta pequena do lead; .tag-primary|accent|warn|danger|coach|info)
              .badge-pri (número de prioridade em display; .alta | .media | .baixa)
              .badge (contador redondo pequeno, ex. nº de filtros)
     Campos:  .campo > label + input/select/textarea + .campo-erro (erro inline) / .campo-dica
              Todo input de texto, select e textarea já nasce com 48 px e os tokens (seletor :where,
              especificidade zero: qualquer regra da área vence). .input força o visual num elemento.
              Inválido: aria-invalid="true" no campo.
     Card:    .card (surface, 1 px --line, raio 16, padding 16/20)  .card-titulo  .card-meta
     Estados: .estado (.estado-vazio | .estado-erro) > .estado-ico .estado-titulo .estado-txt .estado-acoes
              .esq (esqueleto) > .esq-card, .esq-linha (.curta/.media), .esq-bloco
              Use js/ui/estados.js em vez de montar na mão. Legado: .loading, .empty
     Folha:   #modal-overlay (.modal-box, .modal-head, #modal-body, .modal-actions). Use js/ui/folha.js.
              Tamanhos: padrão (celular: altura do conteúdo até 92dvh; desktop 560 px),
              .folha-largo (desktop 640), .folha-cheia (tela cheia no celular), .sem-acoes.
              Legado: .folha (Peça 3D, tela cheia), .folha-chat, .coach-wide.
     Confirmação: js/ui/confirmar.js (.confirma-*). Toast: js/ui/toast.js (#toast).
     A11y:    foco visível 2 px --accent + offset 2; .sr-only; alvo mínimo 44 px em tudo.
   ============================================================================ */

@import url('/assets/fonts/fonts.css');

:root {
  color-scheme: dark;

  /* cores */
  --bg: #0A0D12;
  --bg-2: #0E1219;
  --surface: #141A23;
  --surface-2: #1A2230;
  --surface-3: #222C3C;
  --line: #232C3B;
  --line-2: #2F3A51;
  --text: #EDF1F7;
  --text-2: #A7B1C2;
  --text-3: #7E899C;
  --primary: #36D399;
  --primary-ink: #05130C;
  --primary-soft: rgba(54,211,153,.12);
  --accent: #7C9CFF;
  --accent-ink: #0B1330;
  --accent-soft: rgba(124,156,255,.14);
  --coach: #A48BFF;
  --coach-soft: rgba(164,139,255,.14);
  --warn: #FFB84D;
  --danger: #FF6B7D;
  --danger-soft: rgba(255,107,125,.12);
  --info: #5CC8FF;
  /* derivados (mesmas cores, outra opacidade) */
  --warn-soft: rgba(255,184,77,.12);
  --info-soft: rgba(92,200,255,.12);
  --primary-line: rgba(54,211,153,.38);
  --accent-line: rgba(124,156,255,.42);
  --coach-line: rgba(164,139,255,.40);
  --danger-line: rgba(255,107,125,.40);
  --warn-line: rgba(255,184,77,.40);
  --veu: rgba(4,6,10,.72);
  --primary-hover: #4BE0A8;
  --accent-hover: #93AEFF;
  --coach-hover: #B6A1FF;
  --danger-hover: #FF8394;

  /* tipografia */
  --f-display: 'Bricolage Grotesque', 'Onest', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  --f-text: 'Onest', system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
  --t-12: 12px; --t-13: 13px; --t-14: 14px; --t-16: 16px; --t-18: 18px; --t-22: 22px; --t-28: 28px; --t-36: 36px;
  --t-base: 15px;

  /* raio */
  --r-sm: 10px;
  --r: 14px;
  --r-card: 16px;
  --r-lg: 20px;
  --r-pill: 999px;
  --r-xs: 8px;

  /* espaço */
  --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; --sp-5: 20px; --sp-6: 24px; --sp-7: 32px; --sp-8: 40px;

  /* movimento (ui/movimento.js usa as mesmas curvas) e toque */
  --dur-1: 120ms;
  --dur-2: 200ms;
  --dur-3: 320ms;
  --dur-4: 480ms;
  --ease-saida: cubic-bezier(.2,.8,.2,1);
  --ease-entrada: cubic-bezier(.4,0,1,1);
  --ease-mola: cubic-bezier(.34,1.3,.64,1);
  --ease: var(--ease-saida);
  --alvo: 44px;
  --alvo-lg: 52px;

  /* profundidade */
  --fio: inset 0 1px 0 rgba(255,255,255,.04);
  --brilho-esq: rgba(255,255,255,.06);
  --sombra-flutua: 0 18px 44px -18px rgba(0,0,0,.72), 0 2px 8px rgba(0,0,0,.28);
  --brilho-acao: 0 0 0 4px var(--primary-soft), 0 10px 28px -10px rgba(54,211,153,.6);

  /* casca */
  --sidebar-w: 264px;
  --topbar-h: 56px;
  --nav-h: 56px;
  --safe-b: env(safe-area-inset-bottom, 0px);
  --safe-t: env(safe-area-inset-top, 0px);

  /* sombra: só pra coisa que flutua (folha, menu, toast) */
  --shadow-sm: 0 1px 0 rgba(0,0,0,.25);
  --shadow-md: 0 8px 24px -12px rgba(0,0,0,.6);
  --shadow-lg: 0 24px 60px -20px rgba(0,0,0,.75);
}

/* mola de verdade onde o navegador entende linear() (a mesma curva de MOLA em ui/movimento.js) */
@supports (transition-timing-function: linear(0, 1)) {
  :root {
    --ease-mola: linear(0, .02 2%, .072 4%, .145 6%, .232 8%, .325 10%, .466 13%, .598 16%, .714 19%, .81 22%, .907 26%, .972 30%, 1.018 35%, 1.036 40%, 1.038 45%, 1.031 50%, 1.021 56%, 1.011 62%, 1.003 70%, .999 80%, 1);
  }
}

/* ---------- reset ---------- */
/* o atributo hidden precisa vencer qualquer display:flex/grid declarado depois (contrato 2c) */
[hidden] { display: none !important; }

*, *::before, *::after { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }

/* puxar-pra-atualizar próprio (ui/puxar.js): o nativo do Chrome recarregaria a página */
html.sem-puxar-nativo, html.sem-puxar-nativo body { overscroll-behavior-y: contain; }

html, body { margin: 0; padding: 0; }

body {
  font-family: var(--f-text);
  background: var(--bg);
  color: var(--text);
  font-size: var(--t-base);
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  -webkit-tap-highlight-color: transparent;
}

@media (min-width: 1024px) { body { font-size: var(--t-14); } }

img, video, canvas { max-width: 100%; }

svg { flex-shrink: 0; }

h1, h2, h3, h4 { margin: 0; font-family: var(--f-display); font-weight: 700; letter-spacing: -.01em; line-height: 1.2; color: var(--text); }

p { margin: 0; }

button, input, select, textarea { font: inherit; color: inherit; letter-spacing: inherit; }

button { cursor: pointer; }

a { color: var(--accent); text-underline-offset: 3px; }

code { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: .92em; background: var(--surface-2); padding: 1px 5px; border-radius: 6px; }

kbd {
  display: inline-grid; place-items: center; min-width: 22px; height: 22px; padding: 0 6px;
  border-radius: 6px; border: 1px solid var(--line-2); border-bottom-width: 2px; background: var(--surface-2);
  color: var(--text-2); font: 600 11px/1 var(--f-text); font-variant-numeric: tabular-nums;
}

kbd + kbd { margin-left: 3px; }

mark { background: var(--accent-soft); color: var(--text); border-radius: 3px; padding: 0 1px; }

::selection { background: var(--accent-soft); color: var(--text); }

* { scrollbar-width: thin; scrollbar-color: var(--line-2) transparent; }

::-webkit-scrollbar { width: 10px; height: 10px; }

::-webkit-scrollbar-track { background: transparent; }

::-webkit-scrollbar-thumb { background: var(--line-2); border-radius: 20px; border: 2px solid transparent; background-clip: content-box; }

/* foco visível e igual em toda a UI */
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

:focus:not(:focus-visible) { outline: none; }

.sr-only {
  position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

/* ---------- tipografia utilitária ---------- */
.display { font-family: var(--f-display); letter-spacing: -.01em; }

.num { font-variant-numeric: tabular-nums; }

.muted { color: var(--text-3); }

.eyebrow { font-size: var(--t-12); font-weight: 600; color: var(--text-3); text-transform: uppercase; letter-spacing: .06em; }

.ico { width: 20px; height: 20px; }

/* marca */
.brand {
  font-family: var(--f-display); font-weight: 800; font-size: var(--t-18); letter-spacing: -.02em;
  color: var(--text); white-space: nowrap; display: inline-flex; align-items: center; gap: 8px; line-height: 1;
}

.brand::before {
  content: ''; width: 10px; height: 10px; border-radius: 3px; background: var(--primary); flex: none;
  box-shadow: 0 0 0 3px var(--primary-soft);
}

/* ---------- botões ---------- */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  min-height: var(--alvo); padding: 10px 16px; border-radius: var(--r-sm);
  border: 1px solid var(--line); background: var(--surface-2); color: var(--text);
  font-family: var(--f-text); font-size: var(--t-14); font-weight: 600; line-height: 1.2;
  text-decoration: none; cursor: pointer; user-select: none; position: relative;
  transition: background-color var(--dur-2) var(--ease-saida), border-color var(--dur-2) var(--ease-saida),
    color var(--dur-2) var(--ease-saida), transform var(--dur-2) var(--ease-mola), opacity var(--dur-1), box-shadow var(--dur-2);
}

.btn svg { width: 18px; height: 18px; }

.btn:hover { border-color: var(--line-2); background: var(--surface-3); }

/* pressionar = escala .97 (volta com mola) */
.btn:active:not(:disabled), .btn-icon:active:not(:disabled), .chip:active, .tab-btn:active, .menu-item:active {
  transform: scale(.97); transition-duration: 60ms;
}

.btn:disabled, .btn[aria-disabled="true"] { cursor: not-allowed; opacity: .5; transform: none; }

/* deu certo: vira check por 900 ms (marcaOk em ui/movimento.js) */
.btn.ok:has(> .ok-marca), .btn-icon.ok:has(> .ok-marca) { color: transparent !important; background: var(--primary-soft); border-color: var(--primary-line); }

.btn.ok > .ok-marca, .btn-icon.ok > .ok-marca {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; gap: 6px;
  color: var(--primary); font-weight: 700; pointer-events: none;
}

.btn-primary.ok:has(> .ok-marca) { background: var(--primary); }

.btn-primary.ok > .ok-marca { color: var(--primary-ink); }

.ok-marca svg { width: 20px; height: 20px; stroke-width: 2.4; }

/* brilho SÓ no foco da ação principal */
.btn-primary:focus-visible, .btn-lg.btn-primary:focus-visible { outline-color: var(--primary); box-shadow: var(--brilho-acao); }

.btn.is-loading { cursor: progress; opacity: .85; }

.btn.is-loading::before {
  content: ''; width: 16px; height: 16px; border-radius: 50%; flex: none;
  border: 2px solid currentColor; border-right-color: transparent;
  animation: girar .7s linear infinite;
}

@keyframes girar { to { transform: rotate(360deg); } }

.btn-block { width: 100%; }

.btn-lg { min-height: var(--alvo-lg); font-size: var(--t-16); border-radius: var(--r); padding: 12px 20px; }

.btn-sm { min-height: var(--alvo); padding: 8px 12px; font-size: var(--t-13); }

.btn-primary { background: var(--primary); border-color: var(--primary); color: var(--primary-ink); }

.btn-primary:hover { background: var(--primary-hover); border-color: var(--primary-hover); }

.btn-accent { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }

.btn-accent:hover { background: var(--accent-hover); border-color: var(--accent-hover); }

.btn-coach { background: var(--coach); border-color: var(--coach); color: var(--accent-ink); text-decoration: none; }

.btn-coach:hover { background: var(--coach-hover); border-color: var(--coach-hover); }

.btn-ghost { background: transparent; border-color: var(--line); color: var(--text-2); }

.btn-ghost:hover { background: var(--surface-2); color: var(--text); border-color: var(--line-2); }

.btn-danger { background: transparent; border-color: var(--danger-line); color: var(--danger); }

.btn-danger:hover { background: var(--danger-soft); border-color: var(--danger); }

.btn-icon {
  display: inline-flex; align-items: center; justify-content: center; flex: none;
  width: var(--alvo); height: var(--alvo); min-height: var(--alvo); padding: 0; border-radius: var(--r-sm);
  background: transparent; border: 1px solid var(--line); color: var(--text-2); cursor: pointer; position: relative;
  transition: background-color var(--dur-2), color var(--dur-2), border-color var(--dur-2), transform var(--dur-2) var(--ease-mola);
}

.btn-icon svg { width: 20px; height: 20px; }

.btn-icon:hover { background: var(--surface-2); color: var(--text); border-color: var(--line-2); }

.btn-icon:disabled { opacity: .45; cursor: not-allowed; }

/* legados ainda usados pelas áreas (a área troca pelo nome novo quando redesenhar) */
.btn-secondary { background: var(--surface-2); color: var(--text); border-color: var(--line); }

.btn-danger-ghost { background: transparent; color: var(--danger); border-color: var(--danger-line); }

.btn-danger-ghost:hover { background: var(--danger-soft); }

.btn-copiar {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px; flex-shrink: 0;
  min-height: var(--alvo); min-width: var(--alvo); padding: 6px 12px; border-radius: var(--r-sm);
  background: var(--surface-2); color: var(--text-2); border: 1px solid var(--line);
  font-size: var(--t-13); font-weight: 600; cursor: pointer;
}

.btn-copiar:hover { color: var(--text); border-color: var(--line-2); }

.btn-coach-card { background: var(--coach-soft); border-color: var(--coach-line); color: var(--coach); }

.btn-coach-card:hover { background: var(--coach-soft); border-color: var(--coach); color: var(--text); }

.btn-coach-card .coach-spark { width: 16px; height: 16px; color: var(--coach); }

.btn-danger-solid { background: var(--danger); border-color: var(--danger); color: var(--primary-ink); margin-top: var(--sp-4); }

.btn-danger-solid:hover { background: var(--danger-hover); border-color: var(--danger-hover); }

.btn-danger-confirm { background: var(--danger) !important; border-color: var(--danger) !important; color: var(--primary-ink) !important; }

/* ---------- chips, tags, badges ---------- */
.chip {
  display: inline-flex; align-items: center; gap: 8px; min-height: var(--alvo);
  padding: 8px 14px; border-radius: var(--r-pill); border: 1px solid var(--line);
  background: var(--surface-2); color: var(--text-2); font-size: var(--t-13); font-weight: 600;
  cursor: pointer; user-select: none; white-space: nowrap;
  transition: background-color var(--dur-2), border-color var(--dur-2), color var(--dur-2), transform var(--dur-2) var(--ease-mola);
}

.chip:hover { color: var(--text); border-color: var(--line-2); }

.chip.on, .chip.active, .chip[aria-pressed="true"] { background: var(--accent-soft); border-color: var(--accent); color: var(--text); }

.chip-dot { cursor: default; background: var(--surface-2); }

.chip .dot, .dot { width: 8px; height: 8px; border-radius: 50%; flex: none; background: var(--text-3); display: inline-block; }

.dot-primary { background: var(--primary) !important; }

.dot-accent { background: var(--accent) !important; }

.dot-warn { background: var(--warn) !important; }

.dot-danger { background: var(--danger) !important; }

.dot-coach { background: var(--coach) !important; }

.dot-info { background: var(--info) !important; }

.dot-mute { background: var(--text-3) !important; }

.tag {
  display: inline-flex; align-items: center; gap: 4px; min-height: 22px; padding: 2px 8px;
  border-radius: var(--r-pill); font-size: var(--t-12); font-weight: 600; line-height: 1.3;
  background: var(--surface-3); color: var(--text-2); white-space: nowrap;
}

.tag-primary { background: var(--primary-soft); color: var(--primary); }

.tag-accent { background: var(--accent-soft); color: var(--accent); }

.tag-warn { background: var(--warn-soft); color: var(--warn); }

.tag-danger { background: var(--danger-soft); color: var(--danger); }

/* texto 12 px sobre o coach-soft: tom mais claro + 700 pra passar de 4,5:1 (AA) */
.tag-coach { background: var(--coach-soft); color: var(--coach-hover); font-weight: 700; }

.tag-info { background: var(--info-soft); color: var(--info); }

.badge-pri {
  display: inline-grid; place-items: center; min-width: 36px; height: 36px; padding: 0 8px;
  border-radius: var(--r-sm); font-family: var(--f-display); font-weight: 800; font-size: var(--t-16);
  font-variant-numeric: tabular-nums; background: var(--surface-3); color: var(--text-2); flex: none;
}

.badge-pri.alta { background: var(--primary-soft); color: var(--primary); }

.badge-pri.media { background: var(--warn-soft); color: var(--warn); }

.badge {
  display: inline-grid; place-items: center; min-width: 20px; height: 20px; padding: 0 6px;
  border-radius: var(--r-pill); background: var(--accent); color: var(--accent-ink);
  font-size: 11px; font-weight: 800; font-variant-numeric: tabular-nums; line-height: 1;
}

/* ---------- campos ---------- */
:where(input:not([type]), input[type=text], input[type=search], input[type=tel], input[type=email],
  input[type=password], input[type=number], input[type=url], input[type=date], input[type=time],
  input[type=datetime-local], select, textarea) {
  min-height: 48px; padding: 11px 14px; border-radius: var(--r-sm);
  background: var(--bg); border: 1px solid var(--line-2); color: var(--text);
  font-size: var(--t-16); line-height: 1.35; outline: none;
  transition: border-color var(--dur-1), box-shadow var(--dur-1);
}

:where(textarea) { min-height: 96px; resize: vertical; }

:where(select) { cursor: pointer; }

:where(input, select, textarea)::placeholder { color: var(--text-3); opacity: 1; }

:where(input:not([type=checkbox]):not([type=radio]):not([type=range]):not([type=color]):not([type=file]), select, textarea):focus {
  border-color: var(--accent);
}

:where(input, select, textarea)[aria-invalid="true"] { border-color: var(--danger); }

:where(input[type=checkbox], input[type=radio]) { accent-color: var(--accent); width: 18px; height: 18px; }

.input { min-height: 48px; padding: 11px 14px; border-radius: var(--r-sm); background: var(--bg); border: 1px solid var(--line-2); color: var(--text); font-size: var(--t-16); outline: none; width: 100%; }

.campo { display: flex; flex-direction: column; gap: 6px; margin-bottom: var(--sp-4); }

.campo > label, .campo-rotulo { font-size: var(--t-13); font-weight: 600; color: var(--text-2); }

.campo :where(input, select, textarea) { width: 100%; }

.campo-dica { font-size: var(--t-12); color: var(--text-3); }

.campo-erro, .form-error { color: var(--danger); font-size: var(--t-13); font-weight: 500; }

.form-hint { color: var(--text-2); font-size: var(--t-13); margin-bottom: 4px; }

/* ---------- grade + card ---------- */
.grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-3); }

@media (min-width: 720px) {
  .grid { grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: var(--sp-4); }
}

.card {
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-card);
  padding: var(--sp-4); display: flex; flex-direction: column; gap: 10px; min-width: 0;
  box-shadow: var(--fio);
  transition: border-color var(--dur-2);
}

.card:hover { border-color: var(--line-2); }

/* Listas longas (Leads, Meus): o navegador só monta os cards que estão perto da tela. Sem isso,
   cada troca de aba recalculava as ~50 cards da lista (0,3 s parado num Android médio).
   Os 6 primeiros ficam sempre montados (a 1ª tela, em qualquer largura): card fora da tela e ainda
   não montado devolve innerText vazio, então nada de innerText em card (use textContent).
   'auto' lembra a altura real depois da 1ª vez; o overflow-clip-margin deixa o anel do card marcado
   (::after com sombra de 7 px pra fora) aparecer inteiro apesar do contain:paint implícito. */
#leads-grid > .card:nth-child(n+7), #meus-grid > .card:nth-child(n+7) {
  content-visibility: auto; contain-intrinsic-size: auto 640px; overflow-clip-margin: 8px;
}

.card.is-due { border-left: 3px solid var(--warn); }

.card.is-win { border-left: 3px solid var(--primary); }

.card.is-lost { opacity: .6; }

@media (min-width: 1024px) { .card { padding: var(--sp-5); gap: var(--sp-3); } }

.card-titulo { font-family: var(--f-display); font-size: var(--t-18); font-weight: 700; line-height: 1.25; }

.card-meta { font-size: var(--t-13); color: var(--text-3); }

.list-meta { color: var(--text-3); font-size: var(--t-13); margin-bottom: 10px; min-height: 15px; }

/* ---------- paginação ---------- */
.pagination { display: flex; align-items: center; justify-content: center; gap: var(--sp-3); margin-top: var(--sp-5); }

.pagination:empty { display: none; }

.pag-info { color: var(--text-2); font-size: var(--t-13); font-variant-numeric: tabular-nums; }

/* ---------- estados de tela (js/ui/estados.js) ---------- */
.estado, .empty {
  grid-column: 1 / -1; display: flex; flex-direction: column; align-items: center; text-align: center; gap: var(--sp-3);
  padding: var(--sp-8) var(--sp-5); border: 1px dashed var(--line-2); border-radius: var(--r-card);
  background: var(--surface); color: var(--text-2); font-size: var(--t-14);
}

.estado-ico {
  width: 48px; height: 48px; border-radius: var(--r); display: grid; place-items: center;
  background: var(--surface-2); color: var(--text-2);
}

.estado-ico svg { width: 24px; height: 24px; }

.estado-erro { border-style: solid; border-color: var(--danger-line); }

.estado-erro .estado-ico { background: var(--danger-soft); color: var(--danger); }

.estado-titulo { font-family: var(--f-display); font-size: var(--t-18); font-weight: 700; color: var(--text); }

.estado-txt { max-width: 42ch; color: var(--text-2); }

.estado-acoes { display: flex; flex-wrap: wrap; gap: var(--sp-2); justify-content: center; margin-top: var(--sp-1); }

/* ilustração (ui/estados.js ILUSTRACOES): traço 2, cores dos tokens, o detalhe flutua de leve */
.estado.com-ilustra { border-style: solid; border-color: var(--line); box-shadow: var(--fio); padding-top: var(--sp-7); }

.estado-ilustra { display: block; width: 120px; height: 90px; margin-bottom: var(--sp-1); }

.estado-ilustra svg { width: 120px; height: 90px; fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; overflow: visible; }

.estado-ilustra .il-l { stroke: var(--line-2); }

.estado-ilustra .il-f { fill: var(--surface-2); }

.estado-ilustra .il-s { fill: var(--surface-2); stroke: none; opacity: .7; }

.estado-ilustra .il-a { stroke: var(--accent); }

.estado-ilustra .il-a.il-f { fill: var(--accent-soft); }

.estado-ilustra .il-p { stroke: var(--primary); }

.estado-ilustra .il-p.il-f { fill: var(--primary-soft); }

.estado-ilustra .il-w { stroke: var(--warn); }

.estado-ilustra .il-d { stroke: var(--danger); }

.estado-ilustra .il-flutua { animation: il-flutua 3.2s var(--ease-saida) infinite alternate; }

@keyframes il-flutua { from { transform: translateY(0); } to { transform: translateY(-4px); } }

.loading {
  grid-column: 1 / -1; padding: var(--sp-8) var(--sp-3); text-align: center; color: var(--text-2); font-size: var(--t-14);
  display: flex; align-items: center; justify-content: center; gap: 10px;
}

.loading::before {
  content: ''; width: 16px; height: 16px; border-radius: 50%; flex: none;
  border: 2px solid var(--line-2); border-top-color: var(--accent); animation: girar .8s linear infinite;
}

.esq { grid-column: 1 / -1; display: grid; gap: var(--sp-3); grid-template-columns: minmax(0, 1fr); }

@media (min-width: 720px) { .esq { grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: var(--sp-4); } }

.esq-card { background: var(--surface); border: 1px solid var(--line); border-radius: var(--r-card); padding: var(--sp-4); display: grid; gap: 12px; box-shadow: var(--fio); }

/* o brilho que passa é uma faixa que DESLIZA (transform), sem repintar o fundo a cada quadro */
.esq-linha, .esq-bloco { height: 12px; border-radius: 6px; background: var(--surface-2); position: relative; overflow: hidden; }

.esq-linha::after, .esq-bloco::after {
  content: ''; position: absolute; inset: 0; transform: translateX(-100%);
  background: linear-gradient(90deg, transparent, var(--brilho-esq) 50%, transparent);
  animation: brilho-esq 1.6s var(--ease-saida) infinite;
}

.esq-linha.titulo { height: 18px; width: 62%; }

.esq-linha.curta { width: 38%; }

.esq-linha.media { width: 70%; }

.esq-bloco { height: 52px; border-radius: var(--r); }

@keyframes brilho-esq { 70%, 100% { transform: translateX(100%); } }

/* ---------- toast (js/ui/toast.js): #toast é a PILHA (até 3), cada aviso é um .toast-item ---------- */
.toast {
  position: fixed; left: 0; right: 0; bottom: calc(16px + var(--safe-b)); z-index: 300;
  display: flex; flex-direction: column; align-items: center; gap: var(--sp-2);
  padding: 0 var(--sp-3); pointer-events: none;
}

.toast-item {
  position: relative; overflow: hidden; pointer-events: auto;
  display: flex; align-items: center; gap: 2px; width: max-content; max-width: min(100%, 460px);
  padding: 4px 4px 4px 16px; min-height: 52px; border-radius: var(--r);
  background: var(--surface-3); color: var(--text); border: 1px solid var(--line-2);
  box-shadow: var(--fio), var(--sombra-flutua); font-size: var(--t-14); font-weight: 500;
}

.toast-item::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--accent); flex: none; margin-right: 10px; }

.toast-success::before { background: var(--primary); box-shadow: 0 0 0 3px var(--primary-soft); }

.toast-error { border-color: var(--danger-line); }

.toast-error::before { background: var(--danger); box-shadow: 0 0 0 3px var(--danger-soft); }

.toast-msg { flex: 1; min-width: 0; padding: 8px 4px 8px 0; line-height: 1.35; }

.toast-acao {
  flex: none; min-height: var(--alvo); padding: 0 12px; border: 0; border-radius: var(--r-sm);
  background: transparent; color: var(--accent); font-weight: 700; font-size: var(--t-14); cursor: pointer;
}

.toast-acao:hover { background: var(--accent-soft); }

.toast-x { width: var(--alvo); height: var(--alvo); min-height: var(--alvo); border: 0; background: transparent; color: var(--text-2); border-radius: var(--r-sm); display: grid; place-items: center; flex: none; cursor: pointer; }

.toast-x:hover { background: var(--surface-2); color: var(--text); }

.toast-x svg { width: 18px; height: 18px; }

/* prazo do "Desfazer": a barra encolhe até o commit */
.toast-prazo { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: var(--accent); opacity: .7; transform-origin: 0 50%; pointer-events: none; }

/* celular: todos com a mesma largura (pilha alinhada); com a folha aberta a pilha vai pro topo
   (nunca cobre o rodapé da folha). Folha alta: --toast-topo (toast.js) põe a pilha logo abaixo do
   cabeçalho, sem cobrir o título nem o X. */
@media (max-width: 767.98px) {
  .toast-item { width: 100%; }
  body:has(#modal-overlay:not([hidden]):not(.saindo)) .toast { top: var(--toast-topo, calc(12px + var(--safe-t))); bottom: auto !important; flex-direction: column-reverse; }
}

/* ==========================================================================
   FOLHA (modal único do app: #modal-overlay). JS: js/ui/folha.js
   Celular: sobe do rodapé, altura do conteúdo até 92dvh. >= 768: diálogo centrado.
   ========================================================================== */
/* a entrada e a saída são do ui/folha.js (Web Animations): o véu (::before) faz fade, a folha
   sobe com mola; na saída o overlay já não recebe clique (.saindo) e some em 180 ms */
.modal-overlay {
  position: fixed; inset: 0; z-index: 100;
  display: flex; align-items: flex-end; justify-content: center; padding: 0;
}

.modal-overlay::before { content: ''; position: absolute; inset: 0; background: var(--veu); opacity: var(--veu-o, 1); }

.modal-overlay.saindo { pointer-events: none; }

@keyframes veu-entra { from { opacity: 0; } to { opacity: 1; } }

.modal-box {
  position: relative; width: 100%; max-width: none; max-height: 92vh; max-height: 92dvh;
  display: flex; flex-direction: column; overflow: hidden;
  background: var(--surface); border: 1px solid var(--line-2); border-bottom: 0;
  border-radius: var(--r-lg) var(--r-lg) 0 0;
  /* a sombra sólida embaixo cobre o respiro quando a mola passa um pouco do lugar */
  box-shadow: var(--fio), var(--sombra-flutua), 0 72px 0 0 var(--surface);
}

/* alça da folha no celular: arraste o cabeçalho pra baixo pra fechar */
.modal-box::before {
  content: ''; position: absolute; top: 7px; left: 50%; width: 40px; height: 4px; margin-left: -20px;
  border-radius: 4px; background: var(--line-2); pointer-events: none; z-index: 1;
}

@keyframes folha-sobe { from { transform: translateY(48px); opacity: 0; } to { transform: none; opacity: 1; } }

.modal-head {
  flex-shrink: 0; display: flex; align-items: flex-start; gap: var(--sp-3);
  padding: 18px var(--sp-4) var(--sp-3); border-bottom: 1px solid var(--line); background: var(--surface);
}

@media (max-width: 767.98px) { .modal-head { touch-action: none; cursor: grab; } }

.modal-head-tx { flex: 1; min-width: 0; padding-top: 8px; }

.modal-box h3, #modal-title {
  margin: 0; font-family: var(--f-display); font-size: var(--t-18); font-weight: 700; line-height: 1.3;
  overflow-wrap: anywhere;
}

.modal-sub { font-size: var(--t-13); color: var(--text-2); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 4px 0 0; }

.modal-sub-link { color: var(--text-2); text-decoration: none; font-size: var(--t-13); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }

.modal-sub-link:hover { text-decoration: underline; }

.modal-x {
  display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
  width: var(--alvo); height: var(--alvo); padding: 0; border-radius: var(--r-sm);
  background: transparent; border: 1px solid var(--line); color: var(--text-2); cursor: pointer;
  transition: background-color var(--dur-1), color var(--dur-1);
}

.modal-x:hover { background: var(--surface-2); color: var(--text); }

.modal-x:disabled { opacity: .4; cursor: not-allowed; }

.modal-x svg { width: 20px; height: 20px; }

#modal-body {
  flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain;
  padding: var(--sp-4);
}

.modal-box label { display: block; font-size: var(--t-13); font-weight: 600; color: var(--text-2); margin: 12px 0 6px; }

.modal-box input:not([type=checkbox]):not([type=radio]):not([type=color]):not([type=file]),
.modal-box textarea, .modal-box select { width: 100%; }

.modal-error { flex-shrink: 0; color: var(--danger); font-size: var(--t-13); font-weight: 500; margin: 0; padding: 10px var(--sp-4) 0; }

.modal-actions {
  flex-shrink: 0; display: flex; gap: var(--sp-2); margin: 0;
  padding: var(--sp-3) var(--sp-4); padding-bottom: calc(var(--sp-3) + var(--safe-b));
  border-top: 1px solid var(--line); background: var(--surface);
}

.modal-actions .btn { min-height: var(--alvo-lg); font-size: var(--t-16); }

.modal-actions #modal-cancel { flex: 0 0 auto; min-width: 112px; }

.modal-actions #modal-confirm { flex: 1; }

.modal-actions #modal-confirm[hidden] + * { flex: 1; }

/* só o Cancelar/Fechar visível: ocupa a largura */
.modal-actions:has(#modal-confirm[hidden]) #modal-cancel { flex: 1; }

.modal-actions .btn-danger-solid { margin-top: 0; }

.modal-overlay.sem-acoes .modal-actions { display: none; }

/* ocupado: nada de fechar */
.modal-overlay.ocupado .modal-x, .modal-overlay.ocupado #modal-cancel { pointer-events: none; }

/* tela cheia no celular (conteúdo longo, chat) */
.modal-overlay.folha-cheia .modal-box,
.modal-overlay.folha .modal-box {
  height: 100vh; height: 100dvh; max-height: none; border-radius: 0; border: 0;
}

.modal-overlay.folha-cheia .modal-box::before, .modal-overlay.folha .modal-box::before { display: none; }

.modal-overlay.folha-cheia .modal-head, .modal-overlay.folha .modal-head { padding-top: calc(12px + var(--safe-t)); align-items: center; }

.modal-overlay.folha-cheia .modal-head-tx, .modal-overlay.folha .modal-head-tx { padding-top: 0; }

.modal-overlay.folha .modal-box h3 { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.modal-overlay.folha input:focus-visible, .modal-overlay.folha textarea:focus-visible { outline: none; }

@media (min-width: 768px) {
  .modal-overlay { align-items: center; padding: var(--sp-6); }
  .modal-box, .modal-overlay.folha-cheia .modal-box, .modal-overlay.folha .modal-box {
    max-width: 560px; height: auto; max-height: min(88vh, 900px); border-radius: var(--r-lg);
    border: 1px solid var(--line-2); box-shadow: var(--fio), var(--sombra-flutua);
  }
  .modal-box::before { display: none; }
  .modal-overlay.folha-largo .modal-box, .modal-overlay.coach-wide .modal-box, .modal-overlay.folha .modal-box { max-width: 640px; }
  .modal-overlay.folha-chat .modal-box { height: 82vh; }
  .modal-head, .modal-overlay.folha .modal-head, .modal-overlay.folha-cheia .modal-head { padding: var(--sp-4) var(--sp-5) var(--sp-3); align-items: flex-start; }
  .modal-head-tx { padding-top: 8px; }
  #modal-body { padding: var(--sp-5); }
  .modal-error { padding: 10px var(--sp-5) 0; }
  .modal-actions { padding: var(--sp-3) var(--sp-5) var(--sp-4); justify-content: flex-end; }
  .modal-actions #modal-confirm { flex: 0 1 auto; min-width: 180px; }
  .modal-actions:has(#modal-confirm[hidden]) #modal-cancel { flex: 0 0 auto; }
}

@keyframes dialogo-entra { from { transform: translateY(8px) scale(.96); opacity: 0; } to { transform: none; opacity: 1; } }

/* ---------- confirmar() / perguntar() (js/ui/confirmar.js): acima de qualquer folha ---------- */
.confirma-overlay {
  position: fixed; inset: 0; z-index: 400; background: var(--veu);
  display: flex; align-items: flex-end; justify-content: center;
  animation: veu-entra var(--dur-2) linear;
}

.confirma-box {
  width: 100%; background: var(--surface); border: 1px solid var(--line-2); border-bottom: 0;
  border-radius: var(--r-lg) var(--r-lg) 0 0; box-shadow: var(--fio), var(--sombra-flutua), 0 72px 0 0 var(--surface);
  padding: var(--sp-6) var(--sp-4) calc(var(--sp-4) + var(--safe-b));
  display: flex; flex-direction: column; gap: var(--sp-3);
  animation: folha-sobe var(--dur-3) var(--ease-mola) both;
}

.confirma-titulo { font-family: var(--f-display); font-size: var(--t-18); font-weight: 700; }

.confirma-txt { color: var(--text-2); font-size: var(--t-14); white-space: pre-line; }

.confirma-campo { display: flex; flex-direction: column; gap: 6px; }

.confirma-campo label { font-size: var(--t-13); font-weight: 600; color: var(--text-2); }

.confirma-campo :where(input, textarea) { width: 100%; }

.confirma-acoes { display: flex; gap: var(--sp-2); margin-top: var(--sp-2); }

.confirma-acoes .btn { min-height: var(--alvo-lg); font-size: var(--t-16); flex: 1; }

.confirma-perigo .confirma-ok { background: var(--danger); border-color: var(--danger); color: var(--primary-ink); }

@media (min-width: 768px) {
  .confirma-overlay { align-items: center; padding: var(--sp-6); }
  .confirma-box { max-width: 440px; border-radius: var(--r-lg); border: 1px solid var(--line-2); padding: var(--sp-6); animation-name: dialogo-entra; box-shadow: var(--fio), var(--sombra-flutua); }
  .confirma-acoes { justify-content: flex-end; }
  .confirma-acoes .btn { flex: 0 1 auto; min-width: 128px; min-height: var(--alvo); font-size: var(--t-14); }
}

@media (prefers-reduced-motion: reduce) { .confirma-overlay, .confirma-box { animation: none !important; } }

/* ---------- lightbox (print da auditoria em tela cheia) ---------- */
.lightbox {
  position: fixed; inset: 0; z-index: 200; background: rgba(4,6,10,.94);
  display: flex; align-items: center; justify-content: center; padding: 64px 16px 24px; cursor: zoom-out;
}

.lightbox img { max-width: 100%; max-height: 100%; border-radius: var(--r-sm); object-fit: contain; }

.lightbox-x {
  position: absolute; top: calc(12px + var(--safe-t)); right: 12px; width: var(--alvo); height: var(--alvo);
  display: grid; place-items: center; border-radius: var(--r-sm); border: 1px solid var(--line-2);
  background: var(--surface); color: var(--text); cursor: pointer;
}

.lightbox-x svg { width: 20px; height: 20px; }

/* ---------- login (login.html) ---------- */
.login-wrap {
  min-height: 100vh; min-height: 100dvh; display: grid; place-items: center;
  padding: var(--sp-6) var(--sp-4) calc(var(--sp-6) + var(--safe-b)); background: var(--bg);
}

.login-card {
  width: 100%; max-width: 400px; background: var(--surface); border: 1px solid var(--line);
  border-radius: var(--r-lg); padding: var(--sp-7) var(--sp-5) var(--sp-6);
}

@media (min-width: 480px) { .login-card { padding: var(--sp-8) var(--sp-7) var(--sp-7); } }

.login-brand { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; margin-bottom: var(--sp-6); }

.login-brand .brand { font-size: var(--t-36); gap: 12px; }

.login-brand .brand::before { width: 14px; height: 14px; border-radius: 4px; box-shadow: 0 0 0 4px var(--primary-soft); }

.login-by { font-size: var(--t-13); color: var(--text-3); font-weight: 500; padding-left: 26px; }

.login-sub { color: var(--text-2); font-size: var(--t-14); margin-bottom: var(--sp-5); }

.login-form { display: flex; flex-direction: column; }

.login-form label { font-size: var(--t-13); font-weight: 600; color: var(--text-2); margin: var(--sp-4) 0 6px; }

.login-form label:first-child, .login-form .form-hint + label { margin-top: 0; }

.login-form input { width: 100%; }

.login-form .form-error { margin-top: var(--sp-3); display: flex; gap: 8px; align-items: flex-start; }

.login-form .btn { margin-top: var(--sp-5); }

.login-form .campo-dica { margin-top: 6px; }

.login-rodape { margin-top: var(--sp-5); font-size: var(--t-12); color: var(--text-3); text-align: center; }

/* entrada coreografada: o cartão sobe, a marca "acende" com mola, os campos entram em cascata.
   Tudo pronto em ~0,6 s; nada fica invisível mais de 300 ms. */
.login-card { box-shadow: var(--fio), var(--sombra-flutua); animation: login-sobe var(--dur-3) var(--ease-saida) both; }

.login-brand .brand::before { animation: login-marca var(--dur-4) var(--ease-mola) 90ms both; }

.login-brand, .login-sub, .login-form > :not(.form-error) { animation: login-item var(--dur-3) var(--ease-saida) both; }

.login-brand { animation-delay: 30ms; }

.login-sub { animation-delay: 70ms; }

.login-form > :nth-child(1) { animation-delay: 110ms; }

.login-form > :nth-child(2) { animation-delay: 134ms; }

.login-form > :nth-child(3) { animation-delay: 158ms; }

.login-form > :nth-child(4) { animation-delay: 182ms; }

.login-form > :nth-child(5) { animation-delay: 206ms; }

.login-form > :nth-child(6) { animation-delay: 230ms; }

.login-form > :nth-child(7) { animation-delay: 254ms; }

.login-form > :nth-child(n+8) { animation-delay: 278ms; }

.login-form .form-error:not([hidden]) { animation: login-erro var(--dur-2) var(--ease-saida) both; }

@keyframes login-sobe { from { opacity: 0; transform: translateY(18px) scale(.985); } }

@keyframes login-marca { from { transform: scale(0) rotate(-60deg); } }

@keyframes login-item { from { opacity: 0; transform: translateY(8px); } }

@keyframes login-erro { from { opacity: 0; transform: translateY(-4px); } }

/* ==========================================================================
   V2: busca, faixa sem internet, puxar, arrastar, festa, voo, atalhos (MANUAL_V2.md)
   ========================================================================== */

/* ---------- busca e comandos (js/ui/paleta.js) ---------- */
.paleta-veu {
  position: fixed; inset: 0; z-index: 250; background: var(--veu);
  display: flex; align-items: flex-start; justify-content: center; padding: calc(8px + var(--safe-t)) 8px 8px;
}

.paleta-veu.saindo { pointer-events: none; }

.paleta {
  width: 100%; max-width: 620px; max-height: min(78dvh, 640px); display: flex; flex-direction: column; overflow: hidden;
  background: var(--surface); border: 1px solid var(--line-2); border-radius: var(--r-lg);
  box-shadow: var(--fio), var(--sombra-flutua);
}

.paleta-campo { display: flex; align-items: center; gap: var(--sp-2); padding: 6px 6px 6px var(--sp-4); border-bottom: 1px solid var(--line); }

.paleta-lupa { display: grid; color: var(--text-3); }

.paleta-lupa svg { width: 20px; height: 20px; }

.paleta-input { flex: 1; min-width: 0; border: 0 !important; background: transparent !important; box-shadow: none !important; padding: 10px 4px; font-size: var(--t-16); }

.paleta-input:focus-visible { outline: none; }

.paleta-x { border-color: transparent; }

.paleta-lista { flex: 1; overflow-y: auto; overscroll-behavior: contain; padding: var(--sp-2); }

.paleta-grupo + .paleta-grupo { margin-top: var(--sp-2); }

.paleta-grupo-t { padding: 6px var(--sp-3) 4px; font-size: var(--t-12); font-weight: 600; color: var(--text-3); text-transform: uppercase; letter-spacing: .06em; }

.paleta-item {
  display: flex; align-items: center; gap: var(--sp-3); min-height: 52px; padding: 6px var(--sp-3);
  border-radius: var(--r-sm); cursor: pointer; color: var(--text-2);
}

.paleta-item.ativo { background: var(--accent-soft); color: var(--text); box-shadow: inset 2px 0 0 var(--accent); }

.paleta-item-ico { width: 34px; height: 34px; flex: none; display: grid; place-items: center; border-radius: var(--r-sm); background: var(--surface-2); color: var(--text-2); }

.paleta-item.ativo .paleta-item-ico { background: var(--surface-3); color: var(--accent); }

.paleta-item-ico svg { width: 18px; height: 18px; }

.paleta-item-tx { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }

.paleta-item-t { font-weight: 600; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.paleta-item-s { font-size: var(--t-12); color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.paleta-item.ativo .paleta-item-s { color: var(--text-2); } /* sobre o accent-soft o --text-3 cai abaixo de 4,5:1 */

.paleta-vazio { padding: var(--sp-6) var(--sp-4); text-align: center; color: var(--text-3); }

.paleta-rodape { display: none; gap: var(--sp-4); padding: 10px var(--sp-4); border-top: 1px solid var(--line); font-size: var(--t-12); color: var(--text-3); }

.paleta-rodape span { display: inline-flex; align-items: center; gap: 6px; }

@media (min-width: 768px) {
  .paleta-veu { padding-top: 12vh; }
  .paleta-rodape { display: flex; }
}

/* ---------- faixa "Sem conexão" (js/core/fila_offline.js) ---------- */
.faixa-rede {
  position: fixed; z-index: 35; left: 0; right: 0; margin: 0 auto; width: max-content; max-width: calc(100vw - 24px);
  top: calc(var(--topbar-h) + var(--safe-t) + 8px); white-space: nowrap;
  display: flex; align-items: center; gap: 8px; min-height: 36px; padding: 6px 14px;
  border-radius: var(--r-pill); background: var(--surface-3); border: 1px solid var(--warn-line);
  box-shadow: var(--fio), var(--sombra-flutua); color: var(--text); font-size: var(--t-13); font-weight: 600;
  pointer-events: none; animation: faixa-entra var(--dur-3) var(--ease-mola) both;
}

.faixa-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--warn); box-shadow: 0 0 0 3px var(--warn-soft); }

.faixa-n { color: var(--text-2); font-weight: 500; font-variant-numeric: tabular-nums; }

.faixa-n::before { content: '· '; }

.faixa-rede[data-tom="envia"] { border-color: var(--accent-line); }

.faixa-rede[data-tom="envia"] .faixa-dot { background: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); animation: faixa-pulso 1s ease-in-out infinite alternate; }

.faixa-rede[data-tom="ok"] { border-color: var(--primary-line); }

.faixa-rede[data-tom="ok"] .faixa-dot { background: var(--primary); box-shadow: 0 0 0 3px var(--primary-soft); }

@keyframes faixa-entra { from { opacity: 0; transform: translateY(-12px) scale(.96); } }

@keyframes faixa-pulso { to { opacity: .35; } }

@media (min-width: 1024px) { .faixa-rede { top: 16px; left: var(--sidebar-w); max-width: calc(100vw - var(--sidebar-w) - 24px); } }

/* celular: com a faixa no ar o cabeçalho da aba abre espaço (a pílula não cruza o título) */
@media (max-width: 1023.98px) { html.com-faixa-rede .content-header { padding-top: calc(var(--sp-5) + 44px); } }

/* ---------- puxar pra atualizar (js/ui/puxar.js) ---------- */
.puxar-ind {
  position: fixed; z-index: 29; left: 50%; top: calc(var(--topbar-h) + var(--safe-t));
  transform: translate(-50%, -48px); opacity: 0; pointer-events: none;
}

.puxar-bola {
  width: 40px; height: 40px; border-radius: 50%; display: grid; place-items: center;
  background: var(--surface-3); border: 1px solid var(--line-2); color: var(--text-2);
  box-shadow: var(--fio), var(--sombra-flutua);
}

.puxar-bola svg { width: 20px; height: 20px; }

.puxar-ind.pronto .puxar-bola { color: var(--accent); border-color: var(--accent-line); }

.puxar-ind.girando .puxar-bola { color: var(--accent); }

.puxar-ind.girando .puxar-bola svg { animation: girar .8s linear infinite; }

/* ---------- arrastar o card pra revelar ações (js/ui/arrastar.js) ---------- */
.arrastavel, .arrastavel > * { touch-action: pan-y; }

.arrastando { position: relative; z-index: 2; transition: none !important; box-shadow: var(--fio), var(--sombra-flutua); }

.arrasto-bandeja {
  position: absolute; z-index: 1; display: flex; align-items: stretch; justify-content: flex-end; gap: 6px;
  padding: 0 0 0 6px; pointer-events: auto;
}

.arrasto-acao {
  flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
  border: 1px solid var(--line); border-radius: var(--r); background: var(--surface-2); color: var(--text);
  font-size: var(--t-12); font-weight: 700; cursor: pointer;
}

.arrasto-acao svg { width: 22px; height: 22px; }

.arrasto-acao.tom-accent { background: var(--accent-soft); border-color: var(--accent-line); color: var(--accent); }

.arrasto-acao.tom-primary { background: var(--primary-soft); border-color: var(--primary-line); color: var(--primary); }

.arrasto-acao.tom-warn { background: var(--warn-soft); border-color: var(--warn-line); color: var(--warn); }

.arrasto-acao.tom-coach { background: var(--coach-soft); border-color: var(--coach-line); color: var(--coach); }

.acoes-rapidas { display: grid; gap: var(--sp-2); }

.acao-rapida { justify-content: flex-start; }

.acao-rapida.tom-accent svg { color: var(--accent); }

.acao-rapida.tom-primary svg { color: var(--primary); }

.acao-rapida.tom-warn svg { color: var(--warn); }

/* ---------- festa e voo (js/ui/movimento.js) ---------- */
.festa { position: fixed; inset: 0; width: 100vw; height: 100vh; z-index: 450; pointer-events: none; }

.voo {
  position: fixed !important; z-index: 450; margin: 0 !important; pointer-events: none; transform-origin: 0 0;
  box-shadow: var(--sombra-flutua); border-radius: var(--r-card); overflow: hidden;
}

/* ---------- ajuda dos atalhos (casca.mostraAjudaAtalhos) ---------- */
.atalhos-grupo { font-size: var(--t-12); font-weight: 600; color: var(--text-3); text-transform: uppercase; letter-spacing: .06em; margin: var(--sp-4) 0 var(--sp-2); }

.atalhos-grupo:first-child { margin-top: 0; }

.atalhos-lista { margin: 0; display: grid; gap: 2px; }

.atalhos-lista > div { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-3); min-height: 40px; padding: 4px 0; border-bottom: 1px solid var(--line); }

.atalhos-lista dt { order: 2; display: flex; align-items: center; gap: 4px; }

.atalhos-lista dd { margin: 0; color: var(--text-2); }

/* ---------- campo de arquivo com a cara do app (o input nativo fica escondido) ---------- */
.campo-arquivo { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; cursor: pointer; }

.campo-arquivo input[type=file] { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }

.campo-arquivo:focus-within .btn { outline: 2px solid var(--accent); outline-offset: 2px; }

.campo-arquivo-nome { font-size: var(--t-13); color: var(--text-3); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ---------- movimento reduzido: sem animação em lugar nenhum (spinner continua girando) ---------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; animation-delay: 0ms !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; }
  .esq-linha::after, .esq-bloco::after { display: none; }
  .il-flutua { animation: none !important; }
  .btn.is-loading::before, .loading::before, .puxar-ind.girando svg { animation-duration: .8s !important; animation-iteration-count: infinite !important; }
}

:root[data-movimento="reduzido"] *, :root[data-movimento="reduzido"] *::before, :root[data-movimento="reduzido"] *::after {
  animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; animation-delay: 0ms !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important;
}

:root[data-movimento="reduzido"] .esq-linha::after, :root[data-movimento="reduzido"] .esq-bloco::after { display: none; }

:root[data-movimento="reduzido"] .il-flutua { animation: none !important; }

:root[data-movimento="reduzido"] .btn.is-loading::before, :root[data-movimento="reduzido"] .loading::before,
:root[data-movimento="reduzido"] .puxar-ind.girando svg { animation-duration: .8s !important; animation-iteration-count: infinite !important; }
