/* ==========================================================================
   ALUMOTOS — DESIGN TOKENS (FONTE ÚNICA DE VERDADE)
   ==========================================================================
   Carregado por include_styles.php imediatamente DEPOIS do style.css.
   Regras de uso (ver guia_design.php → "Obrigatórios"):

   1. CORES NASCEM AQUI. Página NÃO redefine token nem usa hex hardcoded em
      CSS próprio — sempre var(--token). Precisa de uma cor nova? Adicione o
      token AQUI (e documente no guia), nunca inline na página.
   2. COMPONENTES CANÔNICOS usam o prefixo .am- (collision-free com o
      style.css legado). Use-os direto no markup, sem copiar CSS.
   3. CSS específico de página deve ser ESCOPADO numa classe no <body>
      (ex.: body.multas-page .minha-coisa { ... }) — nunca estilizar
      .btn/.modal-content/table/input "soltos" (colide com o style.css).
   4. Manual: _MANUAL_DESIGN_SYSTEM_ALUMOTOS.txt (6.3/6.4/7.x).
      PROIBIDO: glow (box-shadow colorido), glass (backdrop-filter),
      gradiente em botões, verde como hover/fundo dominante.
   ========================================================================== */

:root,
html[data-theme="dark"] {
    color-scheme: dark;
    /* ---- Superfícies ---- */
    --bg: #0f0f0f;              /* fundo da página */
    --panel: #181818;           /* painel principal / topbar / modal */
    --panel-2: #141414;         /* wrapper de tabela / sub-painel */
    --code-bg: #141414;         /* inputs, blocos de código */
    --th: #1a1a1a;              /* cabeçalho de tabela (th) */
    --row-hover: #252525;       /* hover de linha — CINZA, nunca verde */
    /* Surface-2 (chrome): cards, chips, badges, botões 2ários, abas */
    --surface-2: #1e1e1e;
    --surface-2-hover: #282828;

    /* ---- Bordas (translúcidas — preservam profundidade entre superfícies) ---- */
    --line: rgba(255, 255, 255, 0.07);
    --line-soft: rgba(255, 255, 255, 0.14);

    /* ---- Texto ---- */
    --text: #f0f0f0;
    /* Legibilidade (revisão 2026-08-22): os dois tons "apagados" subiram para
       passar em AA (>=4.5:1) na PIOR superfície do dark, que é o card legado
       #292929 — antes --muted (#737373) dava só 3.5:1 e sumia. Hierarquia
       preservada: --text > --muted-sub (corpo/2ário) > --muted (labels/meta). */
    --muted: #9b9b9b;           /* labels, meta, th, placeholders — 5.2:1 sobre #292929 */
    --muted-sub: #c8c8c8;       /* corpo secundário / subtítulo — 8.7:1 sobre #292929 */
    --heading: #ffffff;

    /* ---- Aliases legados (nomes usados em várias páginas antigas, nunca
       definidos antes — sempre caíam no fallback hex individual de cada
       var(). Alias puro: resolve nos dois temas automaticamente, sem
       precisar redeclarar no bloco light. ---- */
    --card-background: var(--surface-2);
    --text-color-light: var(--muted-sub);

    /* ---- Marca (verde) ---- */
    --brand: #22c55e;
    --brand-text: #22c55e;      /* verde para TEXTO/ícone sobre Surface-2 */
    --brand-hover: #16a34a;
    --brand-pressed: #15803d;

    /* ---- Semânticas (cor vai no TEXTO; fundo é var(--*-dim)) ---- */
    --success: #22c55e;
    --warning: #f59e0b;
    --error: #ef4444;
    --info: #3b82f6;

    /* ---- Superfícies tintadas (badges, estados, cards de alerta) ---- */
    --green-dim: rgba(34, 197, 94, 0.12);
    --red-dim: rgba(239, 68, 68, 0.10);
    --amber-dim: rgba(245, 158, 11, 0.12);
    --blue-dim: rgba(59, 130, 246, 0.12);

    /* ---- Escala tipográfica ---- */
    --font-xs:   11px;   /* labels uppercase, badges, ícone legenda */
    --font-sm:   12px;   /* texto de tabela, chips, btn--sm */
    --font-base: 13px;   /* UI geral: abas, selects, botões, tooltips */
    --font-md:   15px;   /* nome de logo, títulos de topbar */

    /* ---- Escala de espaçamento ---- */
    --sp-1:  4px;    /* gap mínimo: chips, abas, ícone+label */
    --sp-2:  8px;    /* gap interno de botão */
    --sp-3: 10px;    /* gap entre cards num grid */
    --sp-4: 12px;    /* padding horizontal de card compacto */
    --sp-5: 14px;    /* padding vertical de card / topbar */
    --sp-6: 16px;    /* gap entre seções menores / padding card padrão */
    --sp-7: 18px;    /* padding horizontal de card padrão / coluna de tabela */
    --sp-8: 20px;    /* gap entre seções principais / padding de conteúdo vertical */
    --sp-9: 24px;    /* padding de conteúdo horizontal / modal */

    /* ---- Geometria ---- */
    --radius-card: 10px;
    --radius-btn: 6px;
    --radius-modal: 14px;
    --shadow-modal: 0 24px 60px rgba(0, 0, 0, .6);
}

/* ==========================================================================
   COMPONENTES CANÔNICOS (.am-*) — manual 7.x
   ========================================================================== */

/* ---- Painel (7.5) ---- */
.am-panel {
    background: var(--panel);
    border: 1px solid var(--line);
    border-radius: var(--radius-card);
    padding: var(--sp-6) var(--sp-7);
}

/* ---- Botões (7.1) ---- */
.am-btn {
    display: inline-flex; align-items: center; gap: var(--sp-2);
    padding: var(--sp-3) var(--sp-6);
    border-radius: var(--radius-btn);
    font-weight: 500; font-size: var(--font-base);
    cursor: pointer; text-decoration: none;
    border: 1px solid var(--line);
    background: var(--surface-2);
    color: var(--muted-sub);
    transition: background .15s, color .15s, border-color .15s;
}
.am-btn:hover { background: var(--surface-2-hover); color: var(--text); }
.am-btn--sm {
    padding: 5px var(--sp-3);
    font-size: var(--font-sm);
    gap: 5px;
}
.am-btn--primary { background: var(--brand); border-color: var(--brand); color: #ffffff; font-weight: 600; }
.am-btn--primary:hover { background: var(--brand-hover); border-color: var(--brand-hover); color: #ffffff; }
.am-btn--primary:active { background: var(--brand-pressed); }
.am-btn--danger { color: var(--error); }
.am-btn--danger-solid { background: var(--error); border-color: var(--error); color: #fff; }
.am-btn--danger-solid:hover { background: #dc2626; border-color: #dc2626; }
.am-btn:disabled, .am-btn[aria-disabled="true"] { opacity: .45; cursor: not-allowed; }

/* ---- Badges / status (6.4 / 7.6) ---- */
.am-badge {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 2px var(--sp-2); border-radius: 4px;
    font-size: var(--font-xs); font-weight: 500; white-space: nowrap;
    background: var(--surface-2); border: 1px solid var(--line);
    color: var(--muted);
}
.am-badge--success { background: var(--green-dim); color: var(--success); border-color: transparent; }
.am-badge--warning { background: var(--amber-dim); color: var(--warning); border-color: transparent; }
.am-badge--error   { background: var(--red-dim);   color: var(--error);   border-color: transparent; }
.am-badge--info    { background: var(--blue-dim);  color: var(--info);    border-color: transparent; }
.am-badge--brand   { background: var(--green-dim); color: var(--brand-text); border-color: transparent; }
/* contador/notificação = vermelho sólido */
.am-badge--count { background: var(--error); border-color: var(--error); color: #fff; border-radius: 999px; }

/* ---- Chip (filtro, período, tag) ---- */
.am-chip {
    display: inline-flex; align-items: center; gap: 5px;
    padding: 5px 12px; border-radius: var(--radius-btn);
    font-size: var(--font-sm); font-weight: 400;
    background: transparent; border: 1px solid var(--line); color: var(--muted);
    cursor: pointer; transition: background .15s, color .15s;
}
.am-chip:hover { background: var(--surface-2); color: var(--muted-sub); }
.am-chip.active, .am-chip--active {
    background: var(--brand); border-color: var(--brand);
    color: #0f0f0f; font-weight: 500;
}

/* ---- Pílula de assinatura digital (.sign-pill) ----
   Estado da assinatura de um contrato/vistoria: "Assinado 2/2", "Parcial 1/2",
   "Pendente 0/2". Padrão surface-2: fundo chapado + borda, cor só no texto.
   Base global (card #553) para as telas que passaram a exibir o selo sem ter
   CSS próprio (ver_moto, ver_locatario). As páginas que já declaravam a sua
   versão (contratos.php, listar_vistorias.php, ver_locacao.php) continuam
   vencendo pela ordem de carga — o <style> da página vem depois deste arquivo. */
.sign-pill {
    display: inline-block; padding: 3px var(--sp-2); border-radius: 999px;
    font-size: var(--font-xs); font-weight: 700; white-space: nowrap;
    background: var(--surface-2); border: 1px solid var(--line); color: var(--muted);
}
.sign-pill.signed  { color: var(--success); }
.sign-pill.partial { color: var(--warning); }
.sign-pill.pending { color: var(--muted); }
.sign-pill.none    { color: var(--muted); }

/* ---- Section label (rótulo de seção uppercase) ---- */
.am-section-label {
    font-size: var(--font-xs); font-weight: 500;
    color: var(--muted-sub); text-transform: uppercase; letter-spacing: .06em;
    display: flex; align-items: center; gap: var(--sp-1);
}
.am-section-label i { color: var(--brand-text); font-size: var(--font-base); }

/* ---- Card KPI (7.5) ---- */
.am-kpi {
    background: var(--surface-2); border: 1px solid var(--line);
    border-radius: var(--radius-card); padding: var(--sp-5) var(--sp-6);
    position: relative; overflow: hidden;
    transition: border-color .15s;
}
.am-kpi:hover { border-color: var(--line-soft); }
.am-kpi .k {
    font-size: var(--font-xs); color: var(--muted);
    text-transform: uppercase; letter-spacing: .05em; margin-bottom: var(--sp-2);
}
.am-kpi .v  { font-size: 22px; font-weight: 500; line-height: 1; color: var(--text); }
.am-kpi .sub { font-size: var(--font-xs); color: var(--muted); margin-top: 4px; }
/* ícone fantasma decorativo — posicionar com position:absolute no markup */
.am-kpi .ghost-icon {
    position: absolute; right: 12px; bottom: 10px;
    font-size: 24px; opacity: 0.08; pointer-events: none;
}
.am-kpi--green .v { color: var(--success); }
.am-kpi--red   .v { color: var(--error); }
.am-kpi--amber .v { color: var(--warning); }

/* ---- Tabela (7.4) ---- */
.am-table-wrap {
    border: 1px solid var(--line); border-radius: var(--radius-card);
    overflow: hidden; background: var(--panel-2);
}
.am-table { width: 100%; border-collapse: collapse; font-size: var(--font-sm); }
.am-table th {
    text-align: left; background: rgba(255, 255, 255, 0.02);
    color: var(--muted); text-transform: uppercase;
    letter-spacing: .04em; font-size: var(--font-xs); font-weight: 600;
    padding: var(--sp-2) var(--sp-7); border-bottom: 1px solid var(--line);
}
.am-table td {
    padding: 9px var(--sp-7); border-bottom: 1px solid rgba(255, 255, 255, 0.04);
    color: var(--muted-sub);
}
.am-table td.am-td--primary { color: var(--text); }
.am-table tr:last-child td { border-bottom: none; }
.am-table tbody tr:hover td { background: var(--row-hover); }

/* ---- Abas (7.10) ---- */
.am-tabs { display: flex; gap: var(--sp-1); flex-wrap: wrap; }
.am-tab {
    display: inline-flex; align-items: center; gap: var(--sp-2);
    padding: 6px var(--sp-5); border-radius: var(--radius-btn);
    text-decoration: none; font-weight: 400; font-size: var(--font-base);
    color: var(--muted); border: none; background: transparent;
    cursor: pointer; transition: color .15s, background .15s;
}
.am-tab:hover { color: var(--text); }
.am-tab.active {
    background: var(--green-dim); color: var(--brand-text);
    border: 1px solid rgba(34, 197, 94, 0.20);
}
.am-tabpanel {
    background: var(--panel-2); border: 1px solid var(--line);
    border-radius: 0 var(--radius-card) var(--radius-card) var(--radius-card);
    padding: var(--sp-6); margin-top: 0;
}

/* ---- Inputs / Select (7.3 / 7.9) — foco = borda verde, SEM glow ---- */
.am-input, .am-select, .am-textarea {
    background: var(--code-bg); border: 1px solid var(--line);
    color: var(--text); padding: 6px var(--sp-3); border-radius: var(--radius-btn);
    font-size: var(--font-base); width: 100%; box-sizing: border-box;
    transition: border-color .18s;
}
.am-input:focus, .am-select:focus, .am-textarea:focus { outline: none; border-color: var(--brand); box-shadow: none; }
.am-input::placeholder, .am-textarea::placeholder { color: var(--muted); opacity: .85; }

/* ---- Modal (7.7) ---- */
.am-modal {
    display: none; position: fixed; inset: 0; z-index: 3000;
    background: rgba(0, 0, 0, .55); align-items: center; justify-content: center;
    padding: var(--sp-8);
    padding-bottom: calc(var(--sp-8) + env(safe-area-inset-bottom, 0px));
}
.am-modal.open { display: flex; }
.am-modal-box {
    background: var(--panel); border: 1px solid var(--line);
    border-radius: var(--radius-modal); width: min(560px, 96vw);
    max-height: 92vh; overflow: auto; padding: var(--sp-9); box-shadow: var(--shadow-modal);
    -webkit-overflow-scrolling: touch; overscroll-behavior: contain;
}
/* R7 — altura do modal casa com a área VISÍVEL, não com o viewport.
   O overlay é position:fixed;inset:0, logo 100% = altura real da tela. Já `92vh` no
   iOS Safari resolve pelo viewport GRANDE (como se as barras do navegador estivessem
   escondidas): o box fica mais alto que o visível e, centralizado, vaza por cima
   (topo cortado) e por baixo — sem rolagem alcançável. Escopado em `.am-modal >`
   porque a % só resolve dentro de um pai de altura definida. */
.am-modal > .am-modal-box { max-height: 100%; }
@media (max-width: 768px) {
    .am-modal { padding: 12px; padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px)); }
    .am-modal-box { padding: var(--sp-7); }
}
.am-modal-box h3 { margin: 0 0 12px; font-size: 18px; color: var(--text); }
.am-modal-foot { display: flex; justify-content: flex-end; gap: var(--sp-3); margin-top: var(--sp-7); }

/* ==========================================================================
   LISTA MOBILE (.vl-rec-cards) — PADRÃO OBRIGATÓRIO das telas ver_*.php
   --------------------------------------------------------------------------
   Tabela não cabe em 428px. Toda lista dentro de um ver_*.php (receitas,
   vistorias, despesas, registros, manutenções…) deve ser emitida DUAS vezes
   no mesmo loop PHP: a <table> para o web e os cards para o mobile. O CSS
   abaixo troca uma pela outra no breakpoint — a página NÃO redeclara nada.

     L1:  descrição (trunca com reticências) ......... valor (monospace)
     L2:  meta (#id · Venc. dd/mm/aaaa) .............. badge de status

   Markup mínimo:
     <div class="vl-rec-table-wrap"> <table class="data-table">…</table> </div>
     <div class="vl-rec-cards">
       <a class="vl-rec-card" href="ver_x.php?id=1">
         <div class="vl-rec-l1"><span class="vl-rec-desc">…</span><span class="vl-rec-valor">…</span></div>
         <div class="vl-rec-l2"><span class="vl-rec-meta">…</span><span class="status-badge status-vencido">…</span></div>
       </a>
     </div>

   Referência de implementação: ver_locacao.php (aba Receitas).
   Documentação: guia_design.php → "Listas mobile (ver_*)"; manual 7.12.
   ========================================================================== */
.vl-rec-cards { display: none; }             /* no web quem manda é a tabela */

@media (max-width: 768px) {
    .vl-rec-table-wrap { display: none !important; }   /* a tabela dá lugar aos cards */

    .vl-rec-cards { display: flex; flex-direction: column; gap: var(--sp-2); }
    .vl-rec-card {
        display: block; text-decoration: none;
        background: var(--surface-2); border: 1px solid var(--line);
        border-radius: var(--radius-card); padding: 10px var(--sp-4);
    }
    .vl-rec-card:active { background: var(--surface-2-hover); }

    .vl-rec-l1, .vl-rec-l2 { display: flex; align-items: center; gap: var(--sp-2); }
    .vl-rec-l2 { margin-top: 4px; }

    /* min-width:0 é obrigatório: sem ele o texto nowrap vira o min-content da
       trilha flex e ESTOURA o card para fora da tela em vez de truncar. */
    .vl-rec-desc {
        flex: 1 1 auto; min-width: 0;
        font-size: var(--font-base); font-weight: 600; color: var(--text);
        white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    }
    .vl-rec-valor {
        flex: 0 0 auto; font-family: monospace;
        font-size: var(--font-base); font-weight: 700; color: var(--text);
    }
    .vl-rec-meta {
        flex: 1 1 auto; min-width: 0;
        font-size: var(--font-xs); color: var(--muted);
        white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    }
    /* Qualquer coisa que não seja a meta na L2 é acessório (badge/pílula) e não
       encolhe — cada página usa uma classe diferente (.status-badge, .am-badge,
       .categoria-badge, .badge, .status-chip, .sign-pill). Regra por posição
       cobre todas sem a lista virar um catálogo. */
    .vl-rec-l2 > *:not(.vl-rec-meta) { flex: 0 0 auto; white-space: nowrap; }
    .vl-rec-card .status-badge,
    .vl-rec-card .am-badge,
    .vl-rec-card .categoria-badge,
    .vl-rec-card .badge,
    .vl-rec-card .status-chip {
        font-size: var(--font-xs); padding: 2px var(--sp-2);
    }
}

/* ==========================================================================
   TEMA CLARO (LIGHT) — opt-in via html[data-theme="light"]
   --------------------------------------------------------------------------
   Dark é o DEFAULT (bloco :root acima). Este bloco só entra quando o usuário
   liga o Light no botão da sidebar (persistido em localStorage + servidor).
   Sobrescreve OS DOIS conjuntos de tokens numa fonte única:
     (a) tokens .am-* deste arquivo;
     (b) variáveis legadas do style.css (--background-card, --text-color, …),
         possível porque design_tokens.css carrega DEPOIS do style.css.
   Regra que continua valendo: página NÃO usa hex hardcoded — só var(--token).
   ========================================================================== */
html[data-theme="light"] {
    color-scheme: light;

    /* ---------- (a) Tokens .am-* ---------- */
    /* Superfícies — cinza neutro e crisp (ref.: SaaS claro limpo, cards brancos
       "flutuando" sobre um canvas quase-branco, nunca cinza pesado) */
    --bg: #f7f8fa;
    --panel: #ffffff;
    --panel-2: #fbfbfc;
    --code-bg: #ffffff;
    --th: #f7f8fa;
    --row-hover: #eef1f4;
    --surface-2: #eef1f4;
    --surface-2-hover: #e4e7ec;

    /* Bordas (escuro-sobre-claro, mais sutil que o antigo) */
    --line: rgba(15, 23, 42, 0.08);
    --line-soft: rgba(15, 23, 42, 0.14);

    /* Texto — mesmos papéis do dark, escurecidos para passar em AA sobre a
       pior superfície do claro, que é o Surface-2 #eef1f4 (chips, th, botão
       2ário). O antigo --muted (#6b7280) dava 4.3:1 ali e reprovava. */
    --text: #1a1d21;
    --muted: #5b6472;           /* labels, meta, th, placeholders — 5.3:1 sobre #eef1f4 */
    --muted-sub: #3f4854;       /* corpo secundário / subtítulo — 8.2:1 sobre #eef1f4 */
    --heading: #0b0d10;

    /* Marca — verde escurecido p/ contraste AA sobre superfícies claras.
       O preenchimento (--brand) segue vívido; texto/ícone usa tom mais escuro. */
    --brand: #16a34a;
    --brand-text: #15803d;
    --brand-hover: #15803d;
    --brand-pressed: #166534;

    /* Semânticas (tom mais escuro p/ contraste sobre claro) */
    --success: #15803d;
    --warning: #b45309;
    --error: #dc2626;
    --info: #2563eb;

    /* Superfícies tintadas */
    --green-dim: rgba(22, 163, 74, 0.12);
    --red-dim: rgba(220, 38, 38, 0.10);
    --amber-dim: rgba(180, 83, 9, 0.12);
    --blue-dim: rgba(37, 99, 235, 0.12);

    /* Geometria / sombra — elevação sutil (não é glow: neutra, sem cor),
       dá aos cards o efeito "flutuando" sobre o canvas, comum em SaaS claro */
    --shadow-modal: 0 20px 50px rgba(15, 23, 42, 0.16);
    --shadow-card: 0 1px 2px rgba(15, 23, 42, 0.04), 0 1px 3px rgba(15, 23, 42, 0.07);

    /* ---------- (b) Variáveis legadas do style.css ---------- */
    --brand-bg-soft: #f0fdf4;
    --brand-neutral: #6b7280;

    --background-dark: #eef0f3;      /* fundo profundo/recessado */
    --background-card: #ffffff;      /* cards, tabelas, painéis, forms */
    --background-header: #f7f8fa;    /* cabeçalho de tabela */
    --background-hover: #eef1f4;     /* hover de superfície */
    --sidebar-bg: #ffffff;           /* sidebar clara */

    --surface-2-border: #e1e4e9;

    --text-color: #1a1d21;
    --text-color-secondary: #454e5b;   /* 7.4:1 sobre Surface-2 / 8.4:1 sobre branco */
    --text-color-headings: #0b0d10;

    --border-color: #e1e4e9;
    --border-color-focus: rgba(22, 163, 74, 0.45);

    --input-background: #ffffff;
    --input-group-bg: #f2f3f5;

    /* Feedback (versões claras) */
    --error-color-text: #b91c1c;
    --error-color-bg: #fef2f2;
    --error-color-border: #fecaca;
    --success-color-text: #15803d;
    --success-color-bg: #f0fdf4;
    --success-color-border: #86efac;
    --warning-color-text: #b45309;
    --warning-color-bg: #fffbeb;
    --warning-color-border: #fde68a;

    --button-primary-text: #ffffff;
    --button-secondary-text: #1a1d21;

    --card-shadow: var(--shadow-card);
}

/* Tabela .am-table: o th usa branco translúcido (invisível no claro) → tinta neutra */
html[data-theme="light"] .am-table th { background: var(--th); }
html[data-theme="light"] .am-table td { border-bottom-color: rgba(15, 23, 42, 0.06); }
html[data-theme="light"] .am-chip.active,
html[data-theme="light"] .am-chip--active { color: #ffffff; }

/* ---- Elevação de cards (Light only) — cards "flutuam" sobre o canvas cinza-claro.
   Sombra neutra (sem cor) — não é o glow proibido pelo manual, é elevação padrão
   de SaaS claro. Dark permanece 100% flat (nenhuma regra abaixo o afeta). ---- */
html[data-theme="light"] .am-panel,
html[data-theme="light"] .am-kpi,
html[data-theme="light"] .am-table-wrap,
html[data-theme="light"] .am-modal-box,
html[data-theme="light"] .vl-rec-card {
    box-shadow: var(--shadow-card);
}
html[data-theme="light"] .am-kpi:hover { box-shadow: 0 2px 4px rgba(15, 23, 42, 0.05), 0 4px 10px rgba(15, 23, 42, 0.08); }

/* ---- Badges/status em "pill" saturado (Light only) — preenchimento sólido +
   texto branco, no lugar do tint sutil usado no Dark (manual 6.4). Só no Light,
   por pedido explícito; Dark mantém o padrão Surface-2/tint documentado. ---- */
html[data-theme="light"] .am-badge--success { background: var(--success); color: #fff; border-color: transparent; }
html[data-theme="light"] .am-badge--warning { background: var(--warning); color: #fff; border-color: transparent; }
html[data-theme="light"] .am-badge--error   { background: var(--error);   color: #fff; border-color: transparent; }
html[data-theme="light"] .am-badge--info    { background: var(--info);    color: #fff; border-color: transparent; }
html[data-theme="light"] .am-badge--brand   { background: var(--brand);   color: #fff; border-color: transparent; }

/* ---- Botões secundários em estilo "outline" (Light only) — fundo branco,
   borda e texto assumem a cor semântica, no lugar do preenchimento Surface-2
   cinza. Primário continua sólido (regra do manual 7.1, inalterada). ---- */
html[data-theme="light"] .am-btn:not(.am-btn--primary):not(.am-btn--danger-solid) {
    background: var(--panel);
    border-color: var(--line-soft);
}
html[data-theme="light"] .am-btn:not(.am-btn--primary):not(.am-btn--danger-solid):hover {
    background: var(--surface-2);
}
html[data-theme="light"] .am-btn--danger:not(.am-btn--danger-solid) { border-color: var(--error); }

/* ===========================================================================
   CARDS DE INDICADOR (.ind-*) — Indicadores Operacionais
   ---------------------------------------------------------------------------
   Markup emitido por indicadores_render.php. Usado em DOIS lugares: a grade do
   dashboard (relatorios.php, inclusive no re-render do cross-filter) e a previa
   do gerenciar_indicadores.php — por isso mora aqui, e nao no style-relatorios.css.

   Anatomia unica pra TODO indicador (contagem, moeda ou percentual):
       ROTULO                (?)
       VALOR
       barra fina + "num / den  legenda"

   Nao existe classe de cor por indicador (kpi-locacoes-ativas etc.): cor entra
   somente em ESTADO do semaforo (critico / atencao / ok / neutro), sobre o numero
   e a barra. Fundo permanece Surface-2 em todos, conforme o Guia de Design.
   A linha de base (barra + "num / den") so aparece quando o denominador e de fato
   a base de leitura do indicador — indicador sem fatia que faca sentido nao ganha
   barra nem "total" inventado (ver indicadores_engine.php).
   =========================================================================== */
.ind-grid {
    display: grid;
    grid-template-columns: repeat(6, minmax(0, 1fr));
    gap: var(--sp-3);
}
/* .ind-wrap existe para ancorar o botao de detalhes FORA do <a> do card:
   dentro da ancora o overlay global "Carregando..." do sidebar disparava (ele escuta
   clique em <a> na fase de captura) e botao dentro de ancora e HTML invalido. */
.ind-wrap { position: relative; min-width: 0; display: block; height: 100%; }
.ind-link { text-decoration: none; color: inherit; display: block; min-width: 0; height: 100%; }
.ind-card {
    background: var(--surface-2);
    border: 1px solid var(--line);
    border-radius: var(--radius-card);
    padding: var(--sp-5) var(--sp-6);
    position: relative;
    overflow: hidden;
    transition: border-color .15s;
    display: flex;
    flex-direction: column;
    gap: var(--sp-2);
    height: 100%;
    min-width: 0;
}
.ind-link:hover .ind-card,
.ind-card:hover { border-color: var(--line-soft); }

.ind-head { display: flex; align-items: flex-start; gap: 4px; }
.ind-label {
    flex: 1 1 auto;
    min-width: 0;
    font-size: var(--font-xs);
    color: var(--muted);
    text-transform: uppercase;
    letter-spacing: .05em;
    font-weight: 500;
    line-height: 1.2;
    /* Reserva sempre 2 linhas: rotulo curto e rotulo que quebra ficam com a mesma
       altura, entao o VALOR de todos os cards da linha alinha no mesmo baseline. */
    min-height: 2.4em;
}
.ind-help {
    position: absolute;
    right: 6px; bottom: 6px;
    z-index: 2;
    background: none; border: none; cursor: pointer;
    padding: 6px; line-height: 1;
    color: var(--muted); opacity: .85; font-size: var(--font-sm);
    border-radius: var(--radius-btn);
    transition: opacity .15s, color .15s, background .15s;
}
.ind-help:hover { opacity: 1; color: var(--brand-text); background: var(--surface-2-hover); }
.ind-help:focus-visible { outline: 1px solid var(--line-soft); opacity: 1; }

.ind-value {
    font-size: 22px;
    font-weight: 500;
    line-height: 1;
    color: var(--text);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Linha de comparacao. Sempre presente, pra a grade nao ficar irregular. */
.ind-base { margin-top: auto; display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.ind-bar {
    height: 3px;
    border-radius: 999px;
    background: var(--line);
    overflow: hidden;
}
.ind-bar > span {
    display: block; height: 100%;
    border-radius: 999px;
    background: var(--muted-sub);
    transition: width .25s ease;
}
.ind-ratio {
    padding-right: 20px;   /* respiro para o botao de detalhes no canto inferior direito */
    font-size: var(--font-xs);
    color: var(--muted);
    line-height: 1.3;
    /* Quebra em vez de cortar: a legenda ("do total em aberto") e a parte que
       explica o numero — truncar com reticencias tirava justamente o sentido. */
    white-space: normal;
    overflow-wrap: anywhere;
}
.ind-ratio b { font-weight: 500; color: var(--muted-sub); }
.ind-ratio em { font-style: normal; opacity: .9; }
.ind-ratio--vazio em { opacity: .75; }

.ind-icon {
    position: absolute;
    right: 12px; top: 10px;
    font-size: 22px;
    opacity: .07;
    pointer-events: none;
    color: var(--text);
}

/* Estados — SEMAFORO (indicadores_render.php :: ind_semaforo).
   Cada indicador tem a sua propria faixa; a cor diz o ESTADO, nunca a categoria:
     vermelho = critico, precisa de atencao imediata
     amarelo  = perto do critico
     verde    = saudavel
     branco   = dado neutro (contagem, patrimonio, media: nao existe bom nem ruim)
   Cor entra so no numero e na barra — o fundo segue Surface-2 em todos, conforme o Guia. */
.ind-card--critico .ind-value { color: var(--error); }
.ind-card--critico .ind-bar > span { background: var(--error); opacity: .8; }
.ind-card--atencao .ind-value { color: var(--warning); }
.ind-card--atencao .ind-bar > span { background: var(--warning); opacity: .8; }
.ind-card--ok .ind-value { color: var(--success); }
.ind-card--ok .ind-bar > span { background: var(--success); opacity: .7; }
.ind-card--neutro .ind-value { color: var(--text); }
.ind-card--neutro .ind-bar > span { background: var(--muted-sub); }

/* Indicador que NAO honra algum filtro ativo: esmaece e diz qual dimensao ignora,
   em vez de exibir um numero que o usuario acha que foi filtrado. */
.ind-card--parcial { border-style: dashed; }
.ind-card--parcial .ind-value,
.ind-card--parcial .ind-label { opacity: .55; }
.ind-selo {
    display: inline-flex; align-items: center; gap: 4px;
    font-size: 10px;
    color: var(--warning);
    background: var(--amber-dim);
    border-radius: var(--radius-btn);
    padding: 2px 6px;
    align-self: flex-start;
    max-width: 100%;
    overflow: hidden; white-space: nowrap; text-overflow: ellipsis;
}

.ind-empty {
    grid-column: 1 / -1;
    background: var(--surface-2);
    border: 1px dashed var(--line-soft);
    border-radius: var(--radius-card);
    padding: var(--sp-6);
    text-align: center;
    color: var(--muted);
    font-size: var(--font-sm);
}
.ind-empty a { color: var(--brand-text); }

@media (max-width: 992px) {
    .ind-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--sp-2); }
}
@media (max-width: 600px) {
    .ind-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    .ind-card { padding: var(--sp-4) var(--sp-5); }
    .ind-value { font-size: 19px; }
    .ind-icon { display: none; }
}

/* ============================================================================
   NAVEGAÇÃO DE ETAPAS DOS WIZARDS (.step-navigation) — ORDEM NO MOBILE
   ----------------------------------------------------------------------------
   No desktop os botões continuam lado a lado (Voltar/Cancelar à esquerda,
   Próximo/Salvar à direita). No mobile eles empilham, e a ordem passa a ser
   SEMPRE a mesma em todos os módulos:

       1) Próximo / Salvar   2) Voltar (Anterior)   3) Cancelar

   Prefixo `body` para vencer o CSS inline das páginas (mesma especificidade
   perderia, porque o <style> da página vem depois deste arquivo).
   ========================================================================== */
@media (max-width: 768px) {
    body .step-navigation {
        display: flex;
        flex-direction: column;
        align-items: stretch;
        flex-wrap: nowrap;
        gap: 12px;
    }

    body .step-navigation > .step-controls,
    body .step-navigation > .left-controls,
    body .step-navigation > .right-controls {
        display: flex;
        flex-direction: column;
        align-items: stretch;
        gap: 12px;
    }

    body .step-navigation > .nav-button,
    body .step-navigation > .btn,
    body .step-navigation .step-controls > .nav-button,
    body .step-navigation .step-controls > .btn,
    body .step-navigation .left-controls > .nav-button,
    body .step-navigation .left-controls > .btn,
    body .step-navigation .right-controls > .nav-button,
    body .step-navigation .right-controls > .btn {
        width: 100%;
        justify-content: center;
    }

    /* 1) avançar / salvar */
    body .step-navigation > .nav-button.btn-next,
    body .step-navigation > .nav-button.btn-save,
    body .step-navigation > .step-controls.right,
    body .step-navigation > .right-controls { order: 1; }

    /* 2) voltar (anterior) */
    body .step-navigation > .nav-button.btn-previous,
    body .step-navigation > .step-controls.left,
    body .step-navigation > .left-controls { order: 2; }

    /* 3) cancelar — sempre por último */
    body .step-navigation > .nav-button.btn-cancel,
    body .step-navigation > .btn-cancel { order: 3; }

    /* mesma ordem dentro dos agrupadores (.step-controls / .*-controls) */
    body .step-navigation .step-controls > .nav-button.btn-next,
    body .step-navigation .left-controls > .nav-button.btn-next,
    body .step-navigation .right-controls > .nav-button.btn-next { order: 1; }
    body .step-navigation .step-controls > .nav-button.btn-save,
    body .step-navigation .step-controls > .btn-save-step,
    body .step-navigation .left-controls > .nav-button.btn-save,
    body .step-navigation .right-controls > .nav-button.btn-save { order: 2; }
    body .step-navigation .step-controls > .btn-cancel,
    body .step-navigation .left-controls > .btn-cancel,
    body .step-navigation .right-controls > .btn-cancel { order: 3; }

    /* placeholders vazios não podem virar uma linha em branco na pilha */
    body .step-navigation > div:empty,
    body .step-navigation > span:empty { display: none; }
}

/* ==========================================================================
   VALORES MONETÁRIOS EM TABELA — nunca quebrar "R$ 1.234,56" em duas linhas
   ==========================================================================
   Nas listagens com 10+ colunas a coluna de valor ficava estreita e o
   navegador quebrava no espaço, virando "R$" numa linha e "150,00" na
   outra. As células dessas tabelas já carregam data-label (usado pelo
   layout mobile), então dá para alcançá-las aqui sem tocar em cada PHP.
   Vale só para o desktop: no mobile a linha vira card e tem largura sobrando.
   ========================================================================== */
@media (min-width: 769px) {
    td[data-label="Valor"],
    td[data-label="Valor Total"],
    td[data-label="Valor Plano"],
    td[data-label="Valor Final"],
    td[data-label="Total Recebido"],
    td[data-label="Total a pagar"],
    td[data-label="Caução"],
    td[data-label="Multa"],
    td[data-label="Multa atual"],
    td[data-label="Multa nova"],
    td[data-label="Multa diária atual"],
    td[data-label="Multa diária nova"],
    td[data-label="Juros"],
    td[data-label="Juros atual"],
    td[data-label="Juros novo"],
    td[data-label="Receita"],
    td[data-label="Despesa"],
    td[data-label="Dias Restantes"],
    td[data-label="Dias desc. atual"],
    td[data-label="Dias desc. novo"],
    td[data-label="Vencimento"],
    td[data-label="Venc."],
    td[data-label="Data Venc."],
    td[data-label^="Custo ("],
    td[data-label^="Valor ("] {
        white-space: nowrap;
    }
}

/* ==========================================================================
   TABELA COM ROLAGEM HORIZONTAL — indicar que há coluna escondida
   ==========================================================================
   .table-responsive já rola (overflow-x:auto), mas nada avisava o usuário:
   em multas.php são 440px de coluna fora da vista e a barra é discreta.
   Truque CSS puro (sem JS): duas "capas" presas ao conteúdo (background-
   attachment: local) escondem a sombra quando se chega ao fim do scroll,
   e duas sombras presas ao viewport (scroll) aparecem só enquanto há mais
   conteúdo para aquele lado.
   ========================================================================== */
.table-responsive,
.am-table-wrap {
    background-image:
        linear-gradient(to right,  var(--panel), rgba(0, 0, 0, 0)),
        linear-gradient(to left,   var(--panel), rgba(0, 0, 0, 0)),
        linear-gradient(to right,  rgba(0, 0, 0, .38), rgba(0, 0, 0, 0)),
        linear-gradient(to left,   rgba(0, 0, 0, .38), rgba(0, 0, 0, 0));
    background-position: left center, right center, left center, right center;
    background-repeat: no-repeat;
    background-size: 26px 100%, 26px 100%, 12px 100%, 12px 100%;
    background-attachment: local, local, scroll, scroll;
}

/* Listagens agrupadas por veículo: enquanto todos os grupos estão recolhidos,
   as linhas visíveis são só os resumos (um <td> com colspan) e o cabeçalho de
   colunas não descreve nada do que está na tela. O JS da página marca a tabela
   e o cabeçalho volta assim que um grupo é aberto. */
table.grupos-todos-recolhidos > thead { display: none; }

/* ==========================================================================
   CONTROLES NATIVOS — checkbox, radio e input[type=file]
   ==========================================================================
   Apareciam com a aparência padrão do sistema operacional (checkbox azul do
   Windows, botão cinza "Escolher arquivo | Nenhum arquivo escolhido") no meio
   de telas escuras: usuario.php, cadastrar_moto.php, email_config.php,
   contas_dre.php, admin_tributos_veiculo.php, modulos_assinaturas.php…
   Resolver aqui vale para o sistema inteiro sem tocar em cada página.
   ========================================================================== */
input[type="checkbox"],
input[type="radio"] {
    accent-color: var(--brand);
    width: 16px;
    height: 16px;
    cursor: pointer;
    vertical-align: middle;
}

input[type="file"] {
    color: var(--muted);
    font-size: var(--font-sm);
    max-width: 100%;
}
input[type="file"]::file-selector-button {
    background: var(--surface-2);
    color: var(--text);
    border: 1px solid var(--line);
    border-radius: var(--radius-btn);
    padding: 7px 14px;
    margin-right: 10px;
    font: inherit;
    font-weight: 600;
    cursor: pointer;
    transition: background .15s ease, border-color .15s ease;
}
input[type="file"]::file-selector-button:hover {
    background: var(--row-hover);
    border-color: var(--line-soft);
}

/* ==========================================================================
   FOCO RESTAURADO (page-state.js)
   --------------------------------------------------------------------------
   Aplicada por ~2,6s na linha/cartão que o usuário acabou de alterar, depois
   que a página recarregou e rolou de volta até ela. Serve para responder "onde
   eu estava?" num piscar, sem o usuário ter de reler a lista.

   Nada de box-shadow colorido (glow) — o guia proíbe. O destaque é um trilho
   verde na borda esquerda mais um fundo tintado que desaparece sozinho, os
   mesmos recursos já usados nos estados de linha do sistema.
   ========================================================================== */
.am-foco-restaurado {
    animation: am-foco-pisca 2.6s ease-out 1;
    /* box-shadow com spread negativo no eixo X desenha só a faixa da esquerda,
       sem deslocar a linha nem alterar a altura da tabela. */
    box-shadow: inset 3px 0 0 0 var(--brand);
    border-radius: var(--radius-btn);
}
.am-foco-restaurado > td:first-child { border-top-left-radius: var(--radius-btn); }

@keyframes am-foco-pisca {
    0%   { background-color: var(--green-dim); }
    70%  { background-color: var(--green-dim); }
    100% { background-color: transparent; }
}

/* Quem pediu menos movimento continua vendo QUAL é a linha — só não vê a
   animação. O trilho verde sozinho já identifica. */
@media (prefers-reduced-motion: reduce) {
    .am-foco-restaurado { animation: none; background-color: var(--green-dim); }
}

/* Item entregue JÁ EM FOCO pelo servidor (âncora #receita-N).
   O scroll-margin-top existe porque a âncora nativa encosta o elemento no topo
   absoluto da janela, e ali moram o cabeçalho fixo e a barra de avisos — o item
   ficaria escondido justamente atrás deles. */
.am-foco-alvo { scroll-margin-top: 96px; }
@media (max-width: 768px) { .am-foco-alvo { scroll-margin-top: 120px; } }
