/* ═══════════════════════════════════════════════════════════════════════════
   FRONTERA · LAYOUT DO SISTEMA
   Um arquivo. Toda tela o inclui; nenhuma redefine o que está aqui.

   POR QUE UM ARQUIVO SÓ
     Antes cada tela carregava suas regras. Ao acertar uma, as outras
     divergiam — e dentro do mesmo arquivo chegamos a ter quatro blocos para
     o mesmo botão e cinco pontos de corte diferentes, disputando entre si.
     Mudar o padrão passa a ser mudar UM lugar.

   A REGRA: se está aqui, a tela não redefine. Se a tela precisa de algo
   próprio, escreve DEPOIS do include e com nome próprio — nunca
   sobrescrevendo .btn, .navBtn, .topo ou as variáveis.
   ═══════════════════════════════════════════════════════════════════════ */

@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600;700;800&family=Outfit:wght@400;600&display=swap');

/* ── A PALETA · sai da logomarca ────────────────────────────────────────
   #113218 folha escura · #4F6754 folha clara · #902A29 cereja.
   O verde de TRABALHO é #155D32: a folha com mais luz, mesmo matiz,
   7,4:1 sobre o papel. O #12b981 antigo dava 2,4:1 e falhava.           */
:root{
  --papel:#F6F7F4;  --carta:#FFFFFF;  --campo:#FFFFFF;
  --linha:#E0E4DF;  --linha-2:#EEF1ED; --linha-3:#CBD2CB;
  /* faixa de cabecalho de tabela — um degrau abaixo do --linha-2 */
  --thead:#D6DED4;
  --tinta:#14201B;  --tinta-2:#5C6B64; --tinta-3:#6B7A74;
  --verde:#155D32;  --verde-2:#0F4525; --verde-lv:#E8EFE9; --verde-md:#4F6754;
  /* 28/09 · AQUI MORAVAM DOIS TONS que a hierarquia do cadastro usou por
     algumas horas — o `--verde-lv2` (#CFE3D5) e o `--verde-meio` (#74B990),
     os degraus do meio de uma escada de três verdes. A escada caiu: os três
     níveis passaram ao MESMO verde cheio, com texto branco, porque o degrau
     do meio obriga a inventar tinta nova a cada faixa (ver o comentário em
     `cadastro_estrutura.php`). Os tons saíram junto — tom de paleta sem
     nenhum uso é a próxima pessoa achando que pode usar, e recomeçando a
     escada. O `--verde-lv` continua, no papel dele: fundo de estado
     positivo, em área pequena. */
  /* a série SECUNDÁRIA de gráfico (manual, sequeiro, safra baixa) */
  --verde-cl:#7FA98A;
  --cereja:#902A29; --cereja-lv:#F7ECEC;
  --ambar:#A16207;  --ambar-lv:#FDF6E7;

  /* apelidos, para telas que usam os nomes antigos */
  --bg-1:#F6F7F4;--bg-2:#F6F7F4;--bg-3:#F6F7F4;
  --card:#FFFFFF;--card-2:#FAFBF9;--stroke:#E0E4DF;--stroke-strong:#CBD2CB;
  --text:#14201B;--muted:#5C6B64;--muted-2:#6B7A74;
  --primary:#155D32;--primary-dark:#0F4525;--primary-ink:#FFFFFF;
  --accent-text:#155D32;--accent-lv:#E8EFE9;--danger:#902A29;--warning:#A16207;
  --success:#155D32;--card-hover:#F1F5F1;

  --r-sm:6px; --r:10px; --r-lg:14px; --r-xl:16px;
  --radius-md:10px;--radius-lg:14px;--radius-xl:16px;
  --sombra:0 1px 2px rgba(20,32,27,.06),0 1px 3px rgba(20,32,27,.04);
  --shadow:0 1px 2px rgba(20,32,27,.06),0 1px 3px rgba(20,32,27,.04);
  --ring:0 0 0 3px rgba(21,93,50,.13);
  --sans:'IBM Plex Sans',ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Arial;
  --mono:'IBM Plex Mono',ui-monospace,monospace;
  --font:'IBM Plex Sans',ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,Arial;

  /* O PONTO DE CORTE do sistema é 680px. Usar 760 numa tela e 680 noutra
     faz as duas divergirem na faixa entre os dois — onde caem telefone
     deitado e tablet. */
}

*,*::before,*::after{box-sizing:border-box}
html,body{max-width:100%;overflow-x:hidden;-webkit-text-size-adjust:100%}
body{margin:0;padding:0;background:var(--papel);color:var(--tinta);
  font-family:var(--sans);font-size:15px;line-height:1.5;
  -webkit-font-smoothing:antialiased;
  padding-bottom:env(safe-area-inset-bottom)}
button,input,select,textarea{font:inherit;color:inherit}
a{color:inherit;text-decoration:none}

/* ── O CABEÇALHO ───────────────────────────────────────────────────────
   Uma FAIXA de ponta a ponta, fora do conteúdo, separada pela borda
   inferior. Dentro de um cartão ele se emenda com o resto — e isso é
   estrutura, não aparência.                                             */
.topo{background:var(--carta);border-bottom:2px solid var(--verde);
  padding-top:env(safe-area-inset-top)}
.topoIn{max-width:1280px;margin:0 auto;padding:12px 20px;min-height:78px;
  display:flex;align-items:center;position:relative}
/* A marca é absolute: no celular ela volta ao fluxo, senão os botões
   passam por cima dela — absolute não ocupa espaço. */
.marca{position:absolute;left:50%;transform:translateX(-50%);line-height:0}
.marca svg{display:block;height:auto;width:clamp(184px,26vw,252px)}
.navEsq{margin-right:auto} .navDir{margin-left:auto}

/* ── O CONTEÚDO ───────────────────────────────────────────────────────
   minmax(0,1fr) prende a coluna à largura do pai: sem isso, um item largo
   (uma tabela) estica a coluna e leva todos os irmãos junto.            */
.pag{max-width:1280px;margin:0 auto;padding:24px 20px 90px;
  display:grid;grid-template-columns:minmax(0,1fr);gap:14px}
.pag > *{min-width:0;max-width:100%}

/* ── A ESCALA DE BOTÃO · três tamanhos, três papéis ────────────────────
     navBtn  36px · 12,5px   o CABEÇALHO — presença na barra, texto que
                             não compete com a marca
     btn     34px · 13px     AÇÃO NA PÁGINA — o texto é o que se lê
     btnSm   30px · 12,5px   AÇÃO DENTRO DE UM BLOCO

   Branco, não transparente: transparente some sobre o branco do cabeçalho
   e não se distingue sobre o cinza da página.                            */
.navBtn{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:36px;min-height:0;padding:0 14px;border-radius:var(--r);
  border:1px solid var(--verde);background:var(--carta);color:var(--verde);
  font-size:12.5px;font-weight:600;cursor:pointer;
  white-space:nowrap;transition:background .12s}
.navBtn:hover{background:var(--verde-lv)}
.navBtn.p{background:var(--verde);color:#fff}
.navBtn.p:hover{background:var(--verde-2)}

.btn{display:inline-flex;align-items:center;justify-content:center;gap:7px;
  height:34px;min-height:0;padding:0 13px;border-radius:var(--r);
  border:1px solid var(--verde);background:var(--carta);color:var(--verde);
  font-size:13px;font-weight:600;cursor:pointer;
  white-space:nowrap;transition:.12s}
.btn:hover{background:var(--verde-lv)}
.btn:focus-visible,.navBtn:focus-visible{outline:2px solid var(--verde);outline-offset:2px}
.btnP{background:var(--verde-lv);border:1.5px solid var(--verde);
  color:var(--verde);font-weight:600}
.btnP:hover{background:#DCE7DE;border-color:var(--verde-2);color:var(--verde-2)}
.btnP.grava{background:var(--verde);border-color:var(--verde);color:#fff}
.btnP.grava:hover{background:var(--verde-2);border-color:var(--verde-2);color:#fff}
.btnD{background:var(--carta);color:var(--cereja);border-color:#E4CACA}
.btnD:hover{background:var(--cereja-lv);border-color:var(--cereja)}
.btnSm{height:30px;padding:0 11px;font-size:12.5px}
.btn:disabled{opacity:.45;cursor:not-allowed}

/* ── A BARRA DE AÇÕES ─────────────────────────────────────────────────
   Botões de larguras diferentes lado a lado parecem ter pesos diferentes.
   Largura igual, e no celular dividem a tela.                           */
.acoes,.actions-bar{display:flex;gap:8px;justify-content:center;align-items:center;
  flex-wrap:nowrap;margin:0 0 12px}
.acoes .btn{flex:1 1 0;min-width:0;max-width:190px}
/* A barra de ACOES sao controles (Filtros, Imprimir): ficam do tamanho do
   texto, centrados. Esticar da a eles peso de acao principal, e no celular
   um botao de borda a borda parece campo de formulario. O alvo do dedo vem
   da ALTURA (34px no celular), nao da largura. */
.actions-bar .btn{flex:0 0 auto;width:auto;max-width:none}
/* Botao sozinho nao estica: flex:1 mandaria ocupar a barra inteira. */
.acoes .btn:only-child,.actions-bar .btn:only-child{flex:0 0 auto}

/* ── TIPOGRAFIA ───────────────────────────────────────────────────────
   A cor diz QUEM FALA: verde o sistema, tinta o dado, cinza o apoio.    */
h1,.title{margin:0;font-size:24px;font-weight:600;letter-spacing:-.022em;
  color:var(--verde);line-height:1.2;text-align:center;
  background:transparent;border:0;padding:4px 2px 10px}
h2,.secTit{font-size:14px;font-weight:600;color:var(--verde)}
h3{font-size:13.5px;font-weight:600;color:var(--verde)}
.ident,.subtitulo,.subtitle{font-size:14.5px;font-weight:600;color:var(--tinta);
  text-align:center;padding:0 2px 14px;background:transparent}
.hint,.sub,.small,.nota,.dica{font-size:11.5px;color:var(--tinta-2);line-height:1.5}
label{display:block;margin-bottom:5px;color:var(--verde);font-weight:600;font-size:11.5px}

/* ── SUPERFÍCIES · página cinza, blocos brancos ───────────────────────
   É o contraste que faz cartões e tabelas se destacarem. Sem ele, tudo
   vira uma superfície só e as bordas fazem todo o trabalho.             */
.card,.box,.side,.panel,.section,.tblBox{background:var(--carta);
  border:1px solid var(--linha-3);border-radius:var(--r-lg);box-shadow:var(--sombra)}

/* ── CAMPOS ───────────────────────────────────────────────────────── */
input,select,textarea{background:var(--campo);border:1px solid #B9CDBE;
  border-radius:var(--r);color:var(--tinta);padding:0 11px;height:38px}
textarea{height:auto;min-height:56px;padding:9px 11px}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--verde);
  box-shadow:var(--ring)}
/* Rolar a página com o cursor sobre um campo numérico ALTERA o valor.
   Num cadastro de área isso corrompe dado em silêncio — use
   onwheel="this.blur()" em todo input de número. */

/* ── FILTRO ───────────────────────────────────────────────────────────
   Fundo transparente: o painel já está sobre o cinza, e um retângulo
   branco ali cria cartão dentro de cartão. Os CAMPOS ficam brancos.     */
.filtros{background:transparent;border:1px solid var(--linha);
  border-radius:var(--r-lg);padding:14px;margin-bottom:12px;
  display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));
  gap:11px;align-items:end}
.filtros.oculto{display:none}
.filtros input,.filtros select,.filtros textarea{background:var(--carta);width:100%}
.filtros .f{min-width:0}

/* ── TABELAS ──────────────────────────────────────────────────────────
   Tabela larga rola DENTRO da própria caixa. Sem overflow, as últimas
   colunas ficam invisíveis — não cortadas.                              */
.tblBox{overflow-x:auto;-webkit-overflow-scrolling:touch;padding:0}
.tblBox table{width:100%;border-collapse:collapse;font-size:13.5px}
/* A LISTA USA A MESMA FAIXA DA GRADE (30/09). Ela era texto verde sobre
   `--papel` — quase branco —, e ao lado da grade de lançamento, que virou
   faixa verde cheia, ficou divergente: a mesma tela mostrando dois desenhos
   de cabeçalho conforme o modo. A cor mora aqui, num lugar só, e vale para
   toda `.tblBox`: análise de solo e de folha, estoque, produtos, painel,
   safras a planejar, vazões e fechamento de colheita. */
/* E AS TABELAS DA FAMÍLIA DAS ANÁLISES entram no MESMO seletor (02/10), não
   numa segunda regra verde: elas vivem dentro de um `.panel` (que já é cartão),
   então não podem levar `.tblBox` na marcação — e escrever o verde outra vez
   seria a mesma cor em dois lugares, que é como ela diverge. */
.tblBox th,
table.paramTable thead th,
table.laudoTable thead th{font-size:10.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:#fff;background:var(--verde);
  padding:10px 12px;border-bottom:1px solid var(--verde-2);text-align:center}
.tblBox th *,table.paramTable thead th *,table.laudoTable thead th *{color:inherit}
.tblBox td{padding:11px 12px;border-bottom:1px solid var(--linha-3);
  color:var(--tinta);text-align:center}
/* Só a primeira coluna de texto à esquerda: nomes de comprimento variável
   leem melhor alinhados; números comparam melhor centrados. */
.tblBox td:first-child{text-align:left}
.tblBox th{text-align:center}
.tblBox tbody tr:hover td{background:#FBFCFA}
.tblBox tfoot td{background:var(--papel);font-weight:600;
  border-top:2px solid var(--linha-3)}
/* Cinza LÊ, branco DIGITA — em tabela de edição, a faixa marca onde se
   pode escrever, que é o que falta saber ao chegar. */
.tblBox td:has(input),.tblBox td:has(select){background:var(--carta)}

/* ── AVISO ────────────────────────────────────────────────────────── */
/* ── AJUDA POR BLOCO ─────────────────────────────────────────────── */
.ajuda{margin:0 0 8px}
.ajuda>summary{list-style:none;cursor:pointer;width:22px;height:22px;
  display:inline-grid;place-items:center;border-radius:50%;
  border:1.5px solid var(--verde);color:var(--verde);
  font-size:12px;font-weight:700;font-family:var(--sans);line-height:1;
  transition:background .12s}
.ajuda>summary::-webkit-details-marker{display:none}
.ajuda>summary:hover{background:var(--verde-lv)}
.ajuda[open]>summary{background:var(--verde);color:#fff;border-color:var(--verde)}
.ajuda>div{margin-top:8px;padding:12px 14px;border-radius:var(--r);
  background:var(--verde-lv);border:1px solid var(--linha-3);
  font-size:12.5px;color:var(--tinta-2);line-height:1.6}
.ajuda>div b{color:var(--tinta)}
@media print{.ajuda{display:none!important}}

.toast{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);z-index:90;
  padding:11px 18px;border-radius:var(--r);font-size:13.5px;font-weight:500;
  box-shadow:0 8px 26px rgba(20,32,27,.16);display:none;max-width:min(92vw,520px)}
.toast.on{display:block}
.toast.ok{background:var(--verde);color:#fff}
.toast.err{background:var(--cereja);color:#fff}

/* ═══ CELULAR · o corte é 680px ════════════════════════════════════ */
@media(max-width:680px){
  body{font-size:16px}
  .topoIn{padding:12px 16px;min-height:0;flex-wrap:wrap;
    justify-content:center;gap:9px}
  .marca{position:static;transform:none;order:-1;width:100%;
    text-align:center;margin-bottom:4px}
  .marca svg{width:clamp(196px,64vw,258px);margin:0 auto}
  .navEsq,.navDir{flex:1;min-width:0;margin:0;display:flex}
  /* No celular a borda engrossa: o botao ocupa metade da largura e 1px
     se perde na escala do dedo. E o rótulo longo ("← Todas as recomendações")
     CORTA com reticências em vez de passar por cima do vizinho. */
  .navBtn{flex:1 1 0;min-width:0;justify-content:center;height:34px;border-width:1.5px;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;
    line-height:32px;text-align:center;padding:0 10px}
  .btn{border-width:1.5px}
  .pag{padding:20px 16px 96px}
  h1,.title{font-size:19px}
  .acoes .btn{max-width:none;height:34px}
  .actions-bar .btn{height:34px;flex:0 0 auto;width:auto}
  .acoes .btn:only-child,.actions-bar .btn:only-child{max-width:none;width:auto;flex:0 0 auto}
  .filtros,.pnGrid,.f-grid,.filters-grid{grid-template-columns:1fr!important}
  .filter-actions{justify-content:stretch}
  .filter-actions .btn{flex:1}
  .filtros .f,.pnGrid .f{width:100%}
}

@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}

/* ═══════════════════════════════════════════════════════════════════════
 * SEÇÃO 42 · O DESENHO DAS TELAS DE PLANEJAMENTO
 *
 * Estas regras estavam COPIADAS em três a sete telas cada. Toda conversão
 * nova exigia lembrar quais copiar — e foi assim que o .jaTop nasceu sem
 * grid, o .formPanel.open sumiu e o .painelProd ficou sem estilo, cada um
 * custando uma rodada de correção.
 *
 * Aqui elas ficam uma vez. A próxima tela as herda ao incluir este arquivo,
 * e mudar uma cor é uma linha em vez de sete.
 * ═══════════════════════════════════════════════════════════════════════ */

  .execModalFoot{padding:11px 15px;border-top:1px solid var(--linha);
    background:var(--papel);display:flex;justify-content:flex-end;gap:10px}
  .execComo{margin-top:9px;padding-top:9px;border-top:1px solid var(--linha)}
  .execComoTit{font-size:10px;font-weight:600;text-transform:uppercase;
    letter-spacing:.04em;color:var(--verde);margin-bottom:3px}
  .filter-actions{display:flex;gap:8px;justify-content:flex-end}
  .execModalHead .sub{font-size:12px;color:var(--tinta-2);line-height:1.5}
.pnSub{font-size:12px;color:var(--tinta-2);margin-bottom:12px;line-height:1.5}
  .lote .tNome{font-weight:600;font-size:13px;color:var(--tinta);
    display:block;line-height:1.25}
  .recSub{font-size:11.5px;color:var(--tinta-2);margin-top:2px}
  .statusTag{font-size:9.5px;font-weight:600;padding:3px 8px;border-radius:999px;
    text-transform:uppercase;letter-spacing:.04em;margin-left:6px}
  .btn-danger:hover{background:var(--cereja-lv)} .msg.ok{color:var(--verde)}
  .recHead{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;
    padding:11px 14px;background:var(--linha-2);border-bottom:1px solid var(--linha)}
  .acao{display:flex;gap:10px;justify-content:center;flex-wrap:wrap;
    align-items:center;margin-top:16px}
  /* Pendente é CINZA: existe e não começou. Âmbar é só o que está em curso. */
  .statusTag.pend{background:var(--linha-2);color:var(--tinta-2);
    border:1px solid var(--linha)}
  .statusTag.curso{background:var(--ambar-lv);color:var(--ambar);
    border:1px solid #E8D2A0}
  .statusTag.late{background:var(--cereja-lv);color:var(--cereja);
    border:1px solid #E4CACA}
  .btn-success:hover{background:#DCE7DE}
  .secLb{font-size:10.5px;font-weight:600;text-transform:uppercase;
    letter-spacing:.04em;color:var(--verde);margin:14px 0 7px;padding-top:11px;
    border-top:1px solid var(--linha)}
  .rodape .cont b{color:var(--tinta);font-weight:500}
  .campo label{display:block;font-size:10.5px;color:var(--verde);
    text-transform:uppercase;letter-spacing:.04em;margin-bottom:5px;font-weight:600}
  .execForm .f{display:flex;flex-direction:column}
  .tSel.on{border-color:var(--verde);background:var(--verde);color:#fff}
  .modalOverlay.show{display:flex}
  /* align-items:end alinhava pelo RODAPÉ do grupo: quem tinha .hint embaixo
     ficava mais alto que os vizinhos, e o campo saía da linha (21/09/2026 —
     12 telas têm hint no filtro). Agora os campos alinham pelo topo e a dica
     fica na linha de baixo, sem empurrar nada; só a barra de botões continua
     colada embaixo, que é onde ela sempre esteve. */
  .filters-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));
    gap:12px;align-items:start}
  .filters-grid .filter-actions{align-self:end}
  .filters-grid .hint{margin-top:5px}

  /* A tabela de talhões do card quando não há talhão: uma linha só, com o
     que falta e o caminho, em vez de tabela vazia (21/09/2026). Serve às
     três telas do bloco — aplicações, correção e serviços. */
  .semTalhoes td{padding:14px}
  .semTalhoes .msg{margin:0}
    .rascunhoActions{display:flex;gap:8px}
.pnTit{font-size:14px;font-weight:600;color:var(--verde);margin-bottom:2px}
  .execBar{flex:1;max-width:90px;height:8px;background:var(--linha);
    border-radius:10px;overflow:hidden}
  .execText.done{color:var(--verde)}
  /* a MESMA faixa das grades e das listas (01/10): o cabecalho de tabela do
     sistema e verde com texto branco, e as tres telas do bloco eram as
     ultimas em cinza. No papel ela vira peso e linha, como as outras. */
  table.rc th{background:var(--verde);font-size:10px;color:#fff;
    text-transform:uppercase;letter-spacing:.05em;font-weight:600;
    padding:7px 6px;text-align:center}
  .execForm{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));
    gap:9px;margin-top:9px}
  .btnMini{height:28px;padding:0 10px;font-size:11px;border-radius:var(--r-sm)}

/* ── O ÚLTIMO RECURSO NÃO SE VESTE DE BOTÃO (24/09/2026) ──────────────────
   Corrigir e estornar aparecem lado a lado no extrato, e têm peso MUITO
   diferente: corrigir muda o que está errado e deixa o resto de pé; estornar
   apaga a nota inteira e não volta. Dois botões iguais convidam ao clique
   errado — quem tem pressa clica no que está mais à mão, não no que pensou.
   Então o destrutivo vira LINK: sem fundo, sem borda, menor, na cor do erro.
   Quem chega nele chegou de propósito. */
  .linkPerigo{background:none;border:0;padding:2px 0;font-size:11.5px;
    color:var(--cereja);text-decoration:underline;cursor:pointer;font-family:inherit}
  .linkPerigo:hover{color:#6E1F1F}
  .jaNome span{color:var(--tinta-2);font-size:11.5px}
.pnGrid .f{display:flex;flex-direction:column;min-width:0}

  .rodape{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-top:14px}
  .lote tfoot td:first-child{text-align:left;font-family:var(--sans);
    color:var(--verde);text-transform:uppercase;font-size:10.5px;
    letter-spacing:.05em}

  .painelNova{position:relative;z-index:5;
    border:1px solid rgba(21,93,50,.35);background:rgba(21,93,50,.06);
    border-radius:var(--r-lg);padding:14px 16px;margin-bottom:16px}
  .execModalHead h3{margin:0 0 5px;font-size:16px;font-weight:600;color:var(--verde)}
  .execItem.done{border-color:var(--linha-3);background:var(--verde-lv)}
  .filter-group select{width:100%}

  .filters{display:none;margin-bottom:14px;padding:14px;
    border-radius:var(--r-lg);border:1px solid var(--linha-3)}
  .jaTop:hover{background:var(--verde-lv)}
  .filtroAtivo{font-size:12px;color:var(--tinta-2);background:var(--linha-2);
    border:1px solid var(--linha);border-radius:var(--r-sm);padding:4px 10px;
    display:table;margin:0 auto 14px}
  .execFill{height:100%;background:var(--verde-md);border-radius:10px;
    transition:width .3s}
.pnAcao{display:flex;gap:8px;margin-top:14px}
.msg.err{color:var(--cereja)}
.painelNova.oculto{display:none}
  .jaNome b{font-weight:600;color:var(--tinta)}
  table.rc select{text-align:left}
  .execForm input,.execForm select{height:34px;padding:0 9px;font-size:12px}
  .recTit{font-size:13.5px;font-weight:600;color:var(--tinta)}
  .recBody{padding:13px 14px}
  .execDone{font-size:11.5px;color:var(--tinta-2);margin-top:6px;line-height:1.6}
  table.rc td:first-child{text-align:left}
  .execAviso{padding:10px 18px;border-bottom:1px solid var(--linha);font-size:12px;
    background:var(--ambar-lv);color:var(--ambar);line-height:1.5}
  .execFill.complete{background:var(--verde)}
  .tSel:disabled{cursor:not-allowed;border-color:var(--linha-3);
    background:var(--verde-lv);color:var(--verde)}
  .btn-danger{background:var(--carta);border-color:var(--cereja);color:var(--cereja)}
  .rodape .cont{font-family:var(--mono);font-size:12px;color:var(--tinta-2);
    margin-right:auto}
  .jaQtd{font-family:var(--mono);font-size:11.5px;color:var(--tinta-2);
    font-variant-numeric:tabular-nums;white-space:nowrap}
  .recNum{display:inline-flex;align-items:center;justify-content:center;
    min-width:24px;height:24px;padding:0 6px;border-radius:var(--r-sm);
    background:var(--verde-lv);color:var(--verde);font-family:var(--mono);
    font-size:10.5px;font-weight:600;margin-right:8px}
#blocoLista.oculto{display:none}
  .execFill.partial{background:var(--ambar)}
  /* O CANTO da grade, que gruda nos dois sentidos. Ele tem regra PRÓPRIA e
     mais peso que `.gradeLanc thead th` (0,2,2 contra 0,1,2), então ficou
     cinza quando a faixa virou verde — a ferramenta mediu #D6DED4 ao lado de
     #155D32 na mesma linha. Canto com regra própria já divergiu antes, por
     causa do z-index (seção 50). */
  .lote thead th:first-child{z-index:4;background:var(--verde)}
/* texto centrado — nasceu local no estoque_view e passou a servir
   tambem o empresas_admin (25/09), entao subiu para ca */
.centro{text-align:center}
.msg{margin-top:12px;font-size:13px;display:none}
  table.rc tfoot td{border-top:2px solid var(--linha-3);font-weight:600;
    padding-top:8px;background:var(--thead)}
  .filters.show{display:block}
  .resumoCard{background:var(--carta);border:1px solid var(--linha-3);
    border-radius:var(--r-lg);padding:14px;text-align:center}
.msg.show{display:block}
  .execModalHead .closeBtn{background:none;border:0;color:var(--tinta-2);
    font-size:22px;cursor:pointer;padding:2px 8px;border-radius:var(--r-sm);
    flex-shrink:0}
  .jaExec{font-size:10.5px;font-weight:600;color:var(--verde)}
  .execModal{background:var(--carta);border:1px solid var(--linha-3);
    border-radius:var(--r-lg);box-shadow:0 12px 40px rgba(20,32,27,.18);
    width:100%;max-width:640px;max-height:90vh;display:flex;
    flex-direction:column;overflow:hidden}
  .execModalHead .closeBtn:hover{background:var(--linha-2);color:var(--tinta)}
  .lote tbody tr:nth-child(even) td,
  .lote tbody tr:nth-child(even) td:first-child{background:var(--linha-2)}
  .acao .btn:only-child{flex:0 0 auto}
  .lote .tSub{font-size:10.5px;color:var(--tinta-3)}
  table.rc td{padding:5px 6px;border-top:1px solid var(--linha);
    vertical-align:middle;text-align:center}
  .execItem .nome{font-weight:600;font-size:13px;color:var(--tinta)}
    .totProd{font-family:var(--mono);font-weight:600;color:var(--verde);
      font-variant-numeric:tabular-nums}
  .execLoading{text-align:center;color:var(--tinta-2);padding:20px;font-size:12.5px}
  .execItem{border:1px solid var(--linha-3);background:var(--carta);
    border-radius:var(--r);padding:11px 13px}
  .filtroAtivo a{color:var(--verde);text-decoration:underline;margin-left:6px;
    cursor:pointer}
  .execModalBody{padding:13px 15px;overflow-y:auto;display:flex;
    flex-direction:column;gap:9px}
  .vzOk{font-size:9.5px;color:var(--verde);display:block;margin-top:1px}
  table.rc select,table.rc input{width:100%;height:32px;padding:0 7px;
    font-size:12px;text-align:center}

  .section{background:transparent;border:0;padding:0;box-shadow:none}
  .jaTop{display:grid;grid-template-columns:88px 1fr auto auto auto;gap:10px;
    align-items:center;padding:10px 13px;cursor:pointer;font-size:12.5px}
  .rec.edit .recHead{background:var(--ambar-lv)}
  .btn-success{background:var(--verde-lv);border-color:var(--verde);color:var(--verde)}
  .campo .dica{font-size:10.5px;color:var(--tinta-3);margin-top:3px;line-height:1.35}
  .campo select,.campo input{width:100%;height:36px;font-size:12.5px}
  table.rc tr.exec td{background:var(--verde-lv)}
.pnGrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  gap:12px;align-items:start}
  .resumoCard .label{font-size:11.5px;color:var(--verde);margin-top:4px;
    font-weight:600}
  .execText{font-family:var(--mono);font-size:11px;font-weight:600;
    color:var(--tinta-2);white-space:nowrap;font-variant-numeric:tabular-nums}
  .filter-group label{display:block;font-size:11px;font-weight:600;
    color:var(--verde);margin-bottom:5px;text-transform:uppercase;
    letter-spacing:.04em}
  table.rc tr.fora td.selCel{opacity:1}
  .acao .btn,.acao select{flex:1 1 auto;max-width:230px}

  .secTit,.section-title{font-size:11.5px;font-weight:600;text-transform:uppercase;
    letter-spacing:.05em;color:var(--verde);margin:22px 0 10px;padding-bottom:8px;
    text-align:center;border-bottom:1px solid var(--linha)}
  .tSel{width:26px;height:26px;border-radius:var(--r-sm);
    border:1px solid var(--linha-3);background:var(--carta);cursor:pointer;
    font-size:12px;line-height:1;color:var(--tinta-2);padding:0}
  .pgBar .pgInfo{font-size:12.5px;color:var(--tinta-2)}
  .jaPer{font-size:11px;font-weight:600;color:var(--verde);letter-spacing:.03em}
  /* a linha de botões do card, nas três telas do bloco. Era um style inline em
     cada uma, e o seletor :last-child caía no span oculto de correção/serviços */
  .jaAcoes{display:flex;gap:5px}
  /* o editor dentro do card (R18-10): abre no lugar do detalhe de leitura, e o
     card aberto se destaca do resto da lista enquanto se edita */
  .jaEdit{border-top:1px solid var(--linha);padding:10px 12px;background:var(--papel)}
  .jaL.editando{border-color:var(--verde);box-shadow:0 0 0 2px var(--verde-lv)}
  /* ── UM CABEÇALHO SÓ NA EDIÇÃO (02/10/2026) ──────────────────────────
     Abrir a edição mostrava TRÊS vezes a mesma coisa: o `.jaTop` de leitura
     com executar/editar/excluir, o `recHead` da edição logo abaixo com quase
     o mesmo texto, e o `.jaDet` aberto repetindo os produtos — este com o
     cinza do `thead` por cima. Lia-se o mesmo três vezes.

     A classe `.editando` já existia e só trocava a borda: o estado estava
     marcado e ninguém o usava. Agora ela faz o que o nome diz — na edição, o
     cabeçalho é UM, o da edição.

     O excluir fica fora enquanto se edita, e isso é certo: apagar no meio de
     uma alteração é gesto de outra natureza. Fecha-se primeiro. */
  .jaL.editando>.jaTop{display:none}
  .jaL.editando>.jaDet{display:none}

  .vazio,.estado{padding:34px 20px;text-align:center;color:var(--tinta-2);font-size:13.5px}
  .statusTag.exec{background:var(--verde-lv);color:var(--verde);
    border:1px solid var(--linha-3)}
  .linha3{display:grid;grid-template-columns:repeat(auto-fit,minmax(158px,1fr));gap:11px}
  .rec.edit .recNum{background:#F5E6C8;color:var(--ambar)}
  .box{border:1px solid var(--linha-3);border-radius:var(--r-lg);
    padding:14px 16px;background:var(--carta);font-size:12.5px;
    color:var(--tinta-2);line-height:1.7;margin-top:14px}
  .resumoCard .valor{font-family:var(--mono);font-size:26px;font-weight:500;
    color:var(--tinta);line-height:1.1;font-variant-numeric:tabular-nums}
  .med b{color:var(--tinta);font-weight:500}

  .resumoCards{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;
    margin-bottom:14px}
  .execModalHead{padding:16px 18px;border-bottom:1px solid var(--linha);
    background:var(--papel);display:flex;align-items:flex-start;
    justify-content:space-between;gap:12px}
  .jaDet{display:none;padding:11px 13px;border-top:1px solid var(--linha);
    background:var(--papel)}
  .vazio b{color:var(--tinta)}
  .pgBar a[aria-disabled=true]{opacity:.45;pointer-events:none}
  .jaDet.open{display:block}
  .execItem .plan{font-size:11.5px;color:var(--tinta-2);margin-top:4px}
  .execForm label{font-size:10px;color:var(--verde);text-transform:uppercase;
    letter-spacing:.04em;font-weight:600;margin-bottom:4px}
  .execItemActions{display:flex;justify-content:flex-end;margin-top:9px}

  .pgBar{display:flex;align-items:center;justify-content:center;gap:12px;
    padding:14px 0 0;flex-wrap:wrap}
  .med{font-family:var(--mono);font-size:11.5px;color:var(--tinta-2);
    font-variant-numeric:tabular-nums}
/* ── vocabulário comum: aviso de erro, estado vazio, caixa de tabela ────
   Estas três aparecem em DOZE telas, cada uma com a sua cópia e cores um
   pouco diferentes. Não entraram na primeira leva porque as versões
   divergiram entre si — e era justamente a divergência o problema. */
.alertErr{margin:0 0 14px;padding:14px;border-radius:var(--r);
  background:var(--cereja-lv);border:1px solid #E4CACA;color:var(--cereja)}
.emptyState{padding:40px 20px;text-align:center;color:var(--tinta-2)}
.emptyState p{margin:8px 0 0;font-size:13px}
.tableWrap,.table-wrapper,.tblWrap{overflow-x:auto;-webkit-overflow-scrolling:touch}


/* ═══════════════════════════════════════════════════════════════════════
 * SEÇÃO 43 · RELATÓRIOS — a tela e o papel
 *
 * Cinco relatórios, cinco blocos de impressão: o mesmo cabeçalho virando
 * assinatura copiado três vezes, cada um com o seu cinza no th, a sua faixa
 * no subtítulo e a sua orientação travada. A tela mostrava uma coisa e o
 * papel outra.
 *
 * O PAPEL É A TELA. Mesma identificação sem faixa, mesmo cabeçalho verde,
 * mesmas etiquetas. O que muda no papel é só o que o papel exige: some o que
 * se clica, a fonte vai para pt, a tabela repete o cabeçalho e não parte a
 * linha.
 *
 * Classe antiga ao lado da nova no mesmo seletor: as telas migram sem pressa,
 * e nenhuma precisa redefinir.
 * ═══════════════════════════════════════════════════════════════════════ */

/* ── "gerado em" · a data do relatório, sob a identificação ─────────── */
.geradoEm,.info-geracao,.amostra-info{font-size:12px;color:var(--tinta-2);
  text-align:center;padding:0 2px 14px;margin-top:-10px}
.muted{color:var(--tinta-2);font-size:12px}

/* ── ETIQUETA DE ESTADO · cinza não começou, âmbar em curso, verde feito,
      cereja atrasado. Nunca outra cor: azul para "em andamento" fazia o
      papel dizer uma coisa e a tela outra. ────────────────────────────── */
.badge{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;
  border-radius:999px;border:1px solid var(--linha);background:var(--linha-2);
  color:var(--tinta-2);font-size:11px;font-weight:600;white-space:nowrap;
  text-transform:uppercase;letter-spacing:.03em}
.badge-gray{background:var(--linha-2);border-color:var(--linha);color:var(--tinta-2)}
.badge-warn{background:var(--ambar-lv);border-color:#E8D2A0;color:var(--ambar)}
.badge-ok{background:var(--verde-lv);border-color:var(--linha-3);color:var(--verde)}
.badge-late{background:var(--cereja-lv);border-color:#E4CACA;color:var(--cereja)}

/* ── PREVISTO × REALIZADO · dentro de ±10% é verde, fora é cereja ────── */
.variacao{font-size:10px;font-weight:600;padding:2px 6px;border-radius:8px;
  margin-left:4px;white-space:nowrap}
.var-positive{background:var(--verde-lv);color:var(--verde)}
.var-negative{background:var(--cereja-lv);color:var(--cereja)}
.total-variacao{display:inline-flex;align-items:center;gap:6px}

/* ── A TABELA DE RELATÓRIO ──────────────────────────────────────────────
   Cabeçalho em --thead, célula 9px 12px, SEM ZEBRA: num relatório a leitura
   é por coluna, e a faixa alternada compete com o número. O fio mais
   escuro abre cada bloco de colunas (previsto | realizado).             */
.tblRel,table.rel,.compact-table{width:100%;border-collapse:collapse;
  font-size:13px;background:var(--carta);border:1px solid var(--linha)}
.tblRel th,table.rel th,.compact-table th{background:var(--thead);color:var(--verde);
  font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;
  padding:9px 12px;text-align:center;white-space:nowrap;border:1px solid var(--linha)}
.tblRel td,table.rel td,.compact-table td{padding:9px 12px;border:1px solid var(--linha);
  text-align:center;vertical-align:middle;background:var(--carta)}
.tblRel td:first-child,table.rel td:first-child,.compact-table td:first-child{text-align:left}
.tblRel tfoot td,table.rel tfoot td,.compact-table tfoot td{background:var(--thead);
  font-weight:600;font-variant-numeric:tabular-nums}
.colBloco,.border-left,.col-realizado-first{border-left:2px solid var(--linha-3)!important}

/* ── O CARTÃO DE UM PLANEJAMENTO no relatório (aplicação, nutrição, O.S.) */
.rec-card,.ordem-card{border:1px solid var(--linha-3);border-radius:var(--r-lg);
  background:var(--carta);margin-bottom:16px;overflow:hidden}
.rec-header{padding:12px 16px;background:var(--thead);border-bottom:1px solid var(--linha-3);
  display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
.rec-header-left{display:flex;flex-direction:column;gap:4px}
.rec-header-right{display:flex;align-items:center;gap:10px}
.rec-title-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.rec-title{font-weight:600;font-size:14px;color:var(--tinta)}
.rec-subtitle{font-size:12.5px;color:var(--tinta-2)}
.rec-body{padding:14px 16px;background:var(--carta)}
.rec-obs{margin-top:12px;font-size:12px;color:var(--tinta-2)}
/* o botão de abrir a execução, no cabeçalho do cartão */
.btn-executar{height:28px;padding:0 12px;font-size:12px;border-radius:999px}
.talhao-status{font-size:11px;font-weight:600;display:inline-flex;align-items:center;gap:4px}
.talhao-status.executado{color:var(--verde)}
.talhao-status.pendente{color:var(--tinta-2)}
.talhao-status.atrasado{color:var(--cereja)}

/* ── AS ABAS de módulo (Todos · Via Folha · Via Solo · Herbicida) ──────── */
.module-tabs{display:flex;border-bottom:1px solid var(--linha-3);overflow-x:auto;
  -webkit-overflow-scrolling:touch;margin-bottom:14px}
.module-tab{flex:1;min-width:80px;padding:10px;text-align:center;white-space:nowrap;
  font-size:12px;font-weight:600;color:var(--tinta-2);
  border-bottom:3px solid transparent;transition:.12s}
.module-tab:hover{color:var(--tinta);background:var(--verde-lv)}
.module-tab.active{color:var(--verde);border-bottom-color:var(--verde)}

/* ── O CONVITE · relatório abre vazio, e diz o que escolher ─────────────── */
.convite{padding:34px 20px;text-align:center;color:var(--tinta-2);font-size:13.5px;
  border:1px dashed var(--linha-3);border-radius:var(--r-lg);background:var(--carta)}
.convite b,.convite strong{color:var(--tinta)}
.warnBox{background:var(--ambar-lv);border:1px solid #E8D2A0;color:var(--ambar);
  border-radius:var(--r-lg);padding:12px 14px}
.debug-box{background:var(--linha-2);border:1px solid var(--linha);border-radius:var(--r);
  padding:12px;margin-bottom:16px;font-size:11px;font-family:var(--mono)}

/* ═══ O PAPEL ══════════════════════════════════════════════════════════
   @page SÓ com margem. `size` trava a orientação no diálogo: a tabela larga
   pede paisagem, o resumo pede retrato, e só quem imprime sabe qual. O
   cabeçalho do navegador (data, URL) se desliga no diálogo — nenhum CSS o
   remove sem cortar a margem de todas as páginas.                        */
@media print{
  @page{margin:8mm 10mm}
  *{-webkit-print-color-adjust:exact!important;print-color-adjust:exact!important}
  html,body{background:#fff!important}

  /* ── NO PAPEL, A HIERARQUIA É PESO, LINHA E ESPAÇO (30/09/2026) ──────
     O sistema FORÇA o fundo a imprimir (`print-color-adjust:exact` no `*`,
     duas linhas acima). Então a faixa verde do cabeçalho não some no papel —
     ela sai INTEIRA: um bloco chapado por linha de cabeçalho, que gasta
     toner e, em impressora monocromática, vira uma barra cinza escura com o
     texto branco em cima. Palavra do Darlan:

       *"no papel, a hierarquia se faz com peso, linha e espaço, não com
       fundo — texto preto em negrito, linha embaixo, fundo branco. é o
       padrão de documento impresso."*

     E VALE PARA O PDF PELO MESMO CAMINHO: não há biblioteca de PDF neste
     sistema (conferido: nem TCPDF, dompdf, wkhtmltopdf ou puppeteer). Todo
     PDF nasce do "salvar como PDF" do navegador, que usa ESTAS regras. Um
     caso só, e é o certo: o PDF existe para ser impresso depois.

     ISTO REVOGA, PARA O CABEÇALHO, o "na impressão o papel é a tela" que
     está no CLAUDE.md. O resto continua valendo — mesma identificação, mesmas
     etiquetas, mesmo conteúdo. O que muda é só o que era DECORAÇÃO: fundo
     colorido não carrega informação nenhuma, e negrito com fio faz o mesmo
     trabalho sem custo de tinta.

     NÃO VALE PARA GRÁFICO, e a diferença é essa: no cabeçalho o fundo é
     decoração; no gráfico a cor É o dado, e apagá-la apaga o que ele diz. */
  /* ESTRUTURAL, NÃO POR TELA: `thead th` e `tfoot td` valem em qualquer
     tabela do sistema, sem lista de nomes que envelhece. A primeira versão
     enumerava os seletores conhecidos e deixou passar 47,4 cm² de cinza no
     rodapé de uma grade — `#grade tfoot td`, que não estava na lista. Lista
     de seletores é lista de isentos ao contrário (R19-53). */
  /* ── NO PAPEL NENHUM CONTÊINER ROLA (30/09) ──────────────────────
     A barra de rolagem saiu impressa na análise de solo. Ela é elemento de
     TELA: no papel não há para onde rolar, e o que estiver fora da caixa
     simplesmente não existe — imprime-se metade da tabela com uma barra
     desenhada ao lado, o que é pior que só cortar.

     A moldura que rola é PADRÃO do sistema (`.tblBox`, `.gradeLanc`,
     `.tableWrap`…), então a regra é geral e vale para toda tela que imprima
     tabela larga. E vem com `max-height:none`: caixa de altura limitada
     corta na vertical pelo mesmo motivo.

     O `*` é largo de propósito. No papel, recorte é sempre perda: não há
     estado em que esconder conteúdo ajude quem lê uma folha. */
  *{overflow:visible!important;max-height:none!important}

  /* E AS FAIXAS DE BLOCO ENTRAM AQUI (02/10/2026). `.secTitle`, `.panelHead` e
     `.eqHd` são cabeçalho de BLOCO, em `--thead` na tela — e na tela está
     certo. No papel não: medido no DRIS, 74 cm² de cinza por página, numa
     folha de 622. A regra é a mesma do cabeçalho de tabela e vale pelo mesmo
     motivo, então mora no mesmo lugar: peso, fio e espaço.
     Elas chegaram tarde porque nasceram dentro das quatro telas de análise, no
     tema escuro, onde o `@media print` de cada uma as pintava de `#f5f5f5` à
     mão — cada tela com a sua cópia da decisão de papel. */
  thead th,tfoot td,
  .gCab,.grupo.aberto>.gCab,.prop>.pCab,.talhao>.tCab,
  .secTitle,.panelHead,.eqHd{
    background:#fff!important;background-image:none!important;
    color:#000!important;font-weight:700!important;
    box-shadow:none!important;
    border-bottom:1.2pt solid #000!important}
  /* os filhos também: o `<small>` da unidade e o nome do talhão herdavam o
     branco da faixa, e branco sobre branco no papel é tinta gasta à toa */
  thead th *,tfoot td *,
  .gCab *,.prop>.pCab *,.talhao>.tCab *,
  .secTitle *,.panelHead *,.eqHd *{color:#000!important;
    background:transparent!important}
  /* o fio da esquerda e a bolinha da inicial são enfeite: saem */
  .ini{background:#fff!important;color:#000!important;
    border:1pt solid #000!important}
  /* a etiqueta de pendência segue o mesmo desenho do `.faltaNota`: contorno
     em vez de fundo, porque no papel ela continua tendo de aparecer */
  .falta{background:#fff!important;color:#000!important;
    border:1pt solid #000!important;font-weight:700!important}
  body{font-size:10pt!important;padding:0!important;margin:0!important}

  /* fora do papel: o que se clica e o que recorta */
  .navEsq,.navDir,.navBtn,.btn,button,.filters,.filtros,.actions-bar,.acoes,
  .filtroAtivo,.module-tabs,.debug-box,.soTela,.painelNova,.toast,
  .rascunhoBanner{display:none!important}

  /* o cabeçalho vira a assinatura: a marca centrada, o fio verde embaixo */
  .topo{background:#fff!important;border-bottom:2px solid var(--verde)!important;
    padding:0 0 8px!important;margin:0 0 10px!important;box-shadow:none!important}
  .topoIn{display:block!important;padding:0!important;min-height:0!important}
  .marca{position:static!important;transform:none!important;display:block!important}
  .marca svg{width:180px!important;height:auto!important;margin:0 auto!important}
  .pag{max-width:100%!important;padding:0!important;gap:8px!important}
  h1,.title{font-size:15pt!important;padding:0 0 4px!important}
  .ident,.subtitulo,.subtitle{font-size:11pt!important;padding-bottom:4px!important}
  .geradoEm,.info-geracao{font-size:8.5pt!important;margin-top:0!important;padding-bottom:8px!important}

  /* superfície: sem sombra; o que é um bloco não se parte */
  .card,.box,.section,.tblBox,.rec-card,.ordem-card,.resumoCard,.stat{box-shadow:none!important}
  .rec-card,.ordem-card,.resumoCard,.stat{break-inside:avoid}
  h2,h3,.secTit,.section-title,.rec-header{break-after:avoid}

  /* a tabela: cabeçalho a cada página, linha inteira, nada rolando */
  table{font-size:8.5pt!important}
  thead{display:table-header-group} tfoot{display:table-footer-group}
  tr{break-inside:avoid}
  th{position:static!important}
  .tblRel th,.tblRel td,table.rel th,table.rel td,
  .compact-table th,.compact-table td{padding:4px 6px!important}
  .tblBox,.tableWrap,.table-wrapper,.tblWrap{overflow:visible!important}
  .badge{font-size:7.5pt!important;padding:1px 6px!important}

  .quebraAntes{break-before:page}
  canvas,svg{max-width:100%}
}

/* ═══════════════════════════════════════════════════════════════════════
 * SEÇÃO 44 · TELAS DE PLANEJAMENTO — o que ainda estava copiado nas três
 *
 * Aplicações, correção e ordens de serviço repetiam estas regras, idênticas,
 * em duas ou três cópias cada. Saíram das telas em 16/09/2026, junto com o
 * formulário antigo de painel único. Painel de produtos e resumo da pilha
 * vão presos ao bloco pai (.painelProd, .resumoBox): vazões e a calculadora
 * avulsa usam .ppGrid e .resumoGrid com outro desenho.
 * ═══════════════════════════════════════════════════════════════════════ */
.painelProd{border:1px solid var(--linha-3);background:var(--carta); border-radius:var(--r-lg);padding:12px 14px;margin-bottom:8px}
.painelProd .ppVazio{font-size:12px;color:var(--tinta-3);text-align:center;padding:6px}
.painelProd .ppGrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:7px}
.painelProd .ppItem{display:flex;justify-content:space-between;align-items:baseline;gap:8px; padding:8px 10px;border-radius:var(--r-sm);background:var(--papel); border:1px solid var(--linha);font-size:12px}
.painelProd .ppItem .n{font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis; white-space:nowrap;color:var(--tinta)}
.painelProd .ppItem .q{font-family:var(--mono);font-weight:600;color:var(--verde); font-variant-numeric:tabular-nums;white-space:nowrap}
.painelProd .ppItem small{display:block;font-size:10px;color:var(--tinta-3);font-weight:400}
.jaL{border:1px solid var(--linha-3);background:var(--carta); border-radius:var(--r);margin-bottom:6px;overflow:hidden}
.rec{border:1px solid var(--linha-3);background:var(--carta); border-radius:var(--r-lg);margin-bottom:14px;overflow:hidden}
.rec.edit{border-color:#E0C88A}
table.rc{width:100%;border-collapse:collapse;font-size:13.5px;table-layout:fixed}
table.rc tr.fora td{opacity:.40}
.rascunhoBanner{display:flex;align-items:center;justify-content:space-between; gap:12px;flex-wrap:wrap;padding:12px 14px;margin-bottom:12px; border-radius:var(--r);background:var(--ambar-lv); border:1px solid #E8D2A0;color:var(--ambar);font-size:13px}
.btnCadProd:hover{background:#DCE7DE}
.execProgress{display:flex;align-items:center;gap:8px;justify-content:center}
.modalOverlay{position:fixed;inset:0;background:rgba(20,32,27,.45); display:none;align-items:center;justify-content:center;padding:16px;z-index:60}
.execItem .topo{display:flex;justify-content:space-between;align-items:center; gap:8px;background:transparent;border:0;padding:0;min-height:0}
.count-bar{padding:10px 0;font-size:13px;color:var(--tinta-2);display:flex; gap:12px;align-items:center;justify-content:center;flex-wrap:wrap}
table.listagem{width:100%;border-collapse:collapse;font-size:13.5px; min-width:1000px}
table.listagem th{background:var(--thead);color:var(--verde);font-size:10.5px; font-weight:600;text-transform:uppercase;letter-spacing:.05em; position:sticky;top:0;z-index:2}
table.listagem td{padding:5px 6px;text-align:center; border-top:1px solid var(--linha);vertical-align:middle}
table.listagem td:first-child{text-align:left}
table.listagem th{text-align:center}
table.listagem th:first-child{text-align:left}
.ctr,table.rc th.ctr,table.listagem th.ctr{text-align:center}
table.listagem tbody tr:nth-child(even) td{background:var(--linha-2)}
table.listagem tbody tr:hover td{background:var(--verde-lv)}
.cellGrupo{text-align:center}
.cellGrupo .grupoNome{font-weight:600;font-size:12.5px;color:var(--tinta)}
.cellGrupo .propriedadeNome{color:var(--tinta-2);font-size:11px}
.pill{display:inline-block;padding:3px 10px;border-radius:999px; font-size:10.5px;font-weight:600;background:var(--linha-2); border:1px solid var(--linha);color:var(--tinta-2)}
.pill-alerta{background:var(--cereja-lv);border-color:#E4CACA;color:var(--cereja)}
.pill-ok{background:var(--verde-lv);border-color:var(--linha-3);color:var(--verde)}
.execCell{min-width:120px}
/* a mesma célula quando o bloco é o card: correção e serviços usavam a regra,
   só a correção a declarava (achado pelo tools/conferir_classes.py) */
.execCelBloco{min-width:120px}
.resumoBox{margin-top:14px;padding:12px;background:var(--linha-2); border-radius:var(--r);border:1px solid var(--linha)}
.resumoBox .resumoGrid{display:flex;gap:20px;flex-wrap:wrap;font-size:13px; align-items:center}
.resumoBox .resumoItem{display:flex;align-items:center;gap:6px;color:var(--tinta-2)}
.resumoBox .resumoItem.destaque span{font-family:var(--mono);font-size:18px; font-weight:600;color:var(--verde)}
.pagination{display:flex;align-items:center;justify-content:center;gap:8px; padding:14px 0 0;flex-wrap:wrap}
.pagination .pageBtn{height:34px;padding:0 13px;border-radius:var(--r); background:var(--carta);border:1.5px solid var(--verde);color:var(--verde); font-weight:600;font-size:13px;cursor:pointer;min-width:40px; text-align:center;font-family:inherit}
.pagination .pageBtn:hover:not(.active):not(:disabled){background:var(--verde-lv)}
.pagination .pageBtn.active{background:var(--verde);color:#fff; border-color:var(--verde)}
.pagination .pageBtn:disabled{opacity:.4;cursor:not-allowed}
.pagination .pageInfo{font-size:12.5px;color:var(--tinta-2);padding:0 12px}
.prodModal{max-width:460px;display:flex;flex-direction:column;overflow:hidden}
.prodModalBody{padding:18px 20px;display:grid;gap:14px}
.prodModalBody .field{display:flex;flex-direction:column;gap:6px}
.prodModalBody .row2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.btnCadProd{height:32px;padding:0 12px;border-radius:var(--r-sm); border:1.5px solid var(--verde);background:var(--verde-lv); color:var(--verde);font-weight:600;font-size:12px;cursor:pointer; white-space:nowrap;display:none;margin-top:6px;align-self:flex-start; align-items:center;justify-content:center;font-family:inherit}
@media (max-width:680px){
  .jaTop{grid-template-columns:1fr auto;gap:6px}
  .jaPer{grid-column:1/-1}
  .tblRolar{overflow-x:auto}
  table.rc{min-width:560px}
}
@media(max-width:800px){
  .resumoCards{grid-template-columns:repeat(2,1fr)}
}

/* ═══════════════════════════════════════════════════════════════════════
 * SEÇÃO 45 · VOCABULÁRIO QUE AS TELAS CONVERTIDAS REPETIAM (16/09/2026)
 *
 * Na conversão de cadastros, estoque, cotação, orçamento, custos e colheita,
 * cada tela trouxe a sua cópia destas regras — idênticas. Uma vez aqui.
 * ═══════════════════════════════════════════════════════════════════════ */

/* o atributo hidden sempre esconde — .filtroAtivo (display:table), .btn e
   .field declaram display e venciam o hidden */
[hidden]{display:none!important}

/* número de tabela: dígitos de largura fixa, sem quebrar */
.num{font-variant-numeric:tabular-nums;white-space:nowrap}
.tblRel td.txt{text-align:left;white-space:normal}
/* linha de GRUPO e de SUBTOTAL dentro de tabela de relatório */
.tblRel tr.grp td{background:var(--linha-2);color:var(--verde);font-size:10.5px;font-weight:600;
  text-transform:uppercase;letter-spacing:.05em;text-align:left}
.tblRel tr.sub td{font-weight:600;border-top:2px solid var(--linha-3)}

/* campo de formulário em quadro (modal) e grade de trabalho */
.field{display:flex;flex-direction:column}
.field label{display:block;font-size:10.5px;color:var(--verde);text-transform:uppercase;
  letter-spacing:.04em;margin-bottom:5px;font-weight:600}
.control{width:100%;height:36px;padding:0 11px;border-radius:var(--r);border:1px solid #B9CDBE;
  background:var(--campo);color:var(--tinta);font-size:12.5px;font-family:inherit;outline:none}
.control:focus{border-color:var(--verde);box-shadow:var(--ring)}
.control:disabled{opacity:.55;cursor:not-allowed;background:var(--linha-2)}
select.control{appearance:none;padding-right:34px;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12'%3E%3Cpath fill='%23155D32' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 12px center}
textarea.control{height:auto;min-height:76px;padding:10px 12px;resize:vertical}
.btn-primary{background:var(--verde);border-color:var(--verde);color:#fff}
.btn-primary:hover{background:var(--verde-2);border-color:var(--verde-2);color:#fff}
/* caixa de marcar ao lado dos filtros */
.chk{display:flex;align-items:center;gap:7px;height:38px;margin:0;color:var(--tinta);
  font-size:13px;font-weight:500;cursor:pointer}
.chk input{padding:0;width:16px;height:16px;accent-color:var(--verde)}

/* aba de módulo feita com <button> (a .module-tab foi escrita para <a>) */
button.module-tab{background:transparent;border:0;border-bottom:3px solid transparent;
  border-radius:0;height:auto;cursor:pointer;font-family:inherit}

/* o quadro de cadastro de produto: sem caixa própria ele saía transparente
   na correção (só o estoque o usava junto de .execModal) */
.prodModal{background:var(--carta);border:1px solid var(--linha-3);border-radius:var(--r-lg);
  box-shadow:0 12px 40px rgba(20,32,27,.18);width:100%}
.prodModalHead{padding:16px 18px;border-bottom:1px solid var(--linha);background:var(--papel);
  display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.prodModalFoot{padding:11px 15px;border-top:1px solid var(--linha);background:var(--papel);
  display:flex;justify-content:flex-end;gap:10px}

/* CADASTRO em sanfona (cadastro_estrutura, produtos): busca, bloco novo, grade de dados */
.cabec{text-align:center;margin-bottom:6px}
.busca{display:flex;gap:8px;align-items:center;margin-bottom:14px}
.busca input{width:100%;height:42px;padding-left:40px}
.buscaCampo{position:relative;flex:1;min-width:0}
.buscaCampo svg{position:absolute;left:13px;top:50%;transform:translateY(-50%);
  color:var(--tinta-3);pointer-events:none}
.novo{border:1px solid var(--verde);border-radius:var(--r);background:var(--carta);
  padding:14px;margin-top:12px;box-shadow:0 0 0 3px rgba(21,93,50,.08)}
.novoTit{font-size:13.5px;font-weight:600;margin:0 0 11px;display:flex;align-items:center;
  gap:8px;color:var(--verde)}
.detGrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(148px,1fr));gap:10px}
/* `min-width:0` NÃO É COSMÉTICO — é o que impede o campo de sair da tela.
   Um item de grade nasce com `min-width:auto`, que vale o min-content dele; o
   min-content de um `<input>` é a largura intrínseca do controle (~154px a
   13,5px), então a COLUNA não consegue encolher abaixo disso por mais estreita
   que a tela fique. Medido em 29/09, no cadastro a 360px: a caixa tinha 286px
   e a grade pedia 318, e cinco dos dez campos terminavam em x=366 — seis
   pixels fora de uma tela de 360.
   E o pior: a PÁGINA não rolava de lado (o corte é dentro da caixa), então os
   campos cortados eram INALCANÇÁVEIS. Campo que não se alcança é campo que não
   se preenche, e ninguém descobre que ele existe. */
/* ── A PRÉVIA DA CONVERSÃO, AO LADO E NUNCA NO LUGAR (02/10/2026) ───────
   Quem lança um laudo está lendo um papel e conferindo linha a linha. Trocar
   o número debaixo do dedo tira a única âncora entre a tela e o papel — por
   isso o digitado FICA no campo e o convertido aparece embaixo, menor. E só
   aparece quando há conversão: ecoar o mesmo número é ruído.

   O aviso de ordem de grandeza marca a CÉLULA, não o campo, para o olho
   pegar a coluna inteira de uma vez — escolher o perfil errado erra uma
   coluna toda, não um valor solto. É aviso, não trava: quem souber o que faz
   salva assim mesmo. */
.previaUn{display:block;font-size:10.5px;line-height:1.2;margin-top:2px;
  color:var(--verde);font-weight:600;font-variant-numeric:tabular-nums}
td.foraDaOrdem{background:var(--ambar-lv);box-shadow:inset 0 0 0 1.5px var(--ambar)}
td.foraDaOrdem .previaUn{color:var(--ambar)}
@media print{ td.foraDaOrdem{background:#fff!important;
  box-shadow:none!important;outline:1.2pt solid #000!important} }

.dF{display:flex;flex-direction:column;min-width:0}
.dF input,.dF select{height:36px;font-size:13.5px;width:100%;min-width:0}
.dF small{font-size:10.5px;color:var(--tinta-3);margin-top:3px;line-height:1.35}
.dF small b{color:var(--tinta-2)}
.dF.wide{grid-column:1/-1}
.dadosAcao{display:flex;gap:8px;justify-content:flex-end;margin-top:11px;flex-wrap:wrap}
@media(max-width:680px){
  .detGrid{grid-template-columns:1fr 1fr}
  .dadosAcao .btn{flex:1}
}

/* ═══════════════════════════════════════════════════════════════════════
 * SEÇÃO 46 · CONFIANÇA DO NÚMERO (17/09/2026)
 *
 * UM percentual ao lado do custo por saca; a abertura por parte ao clicar
 * (<details>, sem JS). Montado por confiancaHtml() em _confianca.php — a
 * tela só imprime. Cor: .badge-ok / -warn / -late pelas faixas CONF_FAIXAS.
 * ═══════════════════════════════════════════════════════════════════════ */
.conf{display:inline-block;text-align:left;margin-top:6px;max-width:100%}
.conf>summary{cursor:pointer;list-style:none;display:inline-flex;align-items:center;gap:6px;
  font-size:12px;color:var(--tinta-2)}
.conf>summary::-webkit-details-marker{display:none}
.conf>summary::after{content:"▸";font-size:10px;color:var(--tinta-3)}
.conf[open]>summary::after{content:"▾"}
.conf[open]{display:block}
.confCorpo{margin-top:8px}
.confTab td.txt{font-size:12px;line-height:1.45;color:var(--tinta-2);white-space:normal}
.confTab td small{color:var(--tinta-3)}
.confCorpo .dica{font-size:11.5px;color:var(--tinta-2);margin:6px 0 0}
/* a confiança ao lado do TOTAL (22/09/2026): indicador anda com o número, e não
   dentro do aviso de pendência — o aviso some quando as notas entram, ela fica.
   Aberta, ocupa a linha inteira: a tabela de partes não cabe ao lado do título. */
.totConf{display:flex;align-items:baseline;justify-content:space-between;gap:10px;flex-wrap:wrap}
.totConf>.section-title{margin-bottom:0}
.totConf>.conf{margin-top:0}
.totConf>.conf[open]{flex:1 0 100%;margin-top:6px}
.confSem{font-size:12px;color:var(--tinta-2)}
/* o aviso curto dentro de um card ou de uma linha de tabela: ambar, sem faixa.
   Estava so no relatorio_insumos_view; ao servir a segunda tela (importacao de
   XML) veio para ca, que e onde o desenho comum mora. */
.atencao{color:var(--ambar)}
/* ═══════════════════════════════════════════════════════════════════════
 * SEÇÃO 50 · A BUSCA QUE FILTRA AO DIGITAR (23/09/2026 · R19-25)
 *
 * Entra quando a lista passa de umas 30 linhas ou cresce sozinha com o uso.
 * Fica ACIMA da lista e abaixo do filtro de escopo: o escopo recorta o
 * universo, a busca procura dentro do que sobrou. Some no papel.
 * ═══════════════════════════════════════════════════════════════════════ */
.buscaLinha{display:flex;align-items:center;gap:10px;margin:0 0 10px}
.fBusca{flex:1 1 320px;max-width:520px;padding:8px 12px;border:1px solid var(--linha-3);
  border-radius:var(--r-lg);font:inherit;color:var(--tinta);background:var(--carta)}
.fBusca::placeholder{color:var(--tinta-3)}
.fBusca:focus{outline:2px solid var(--verde);outline-offset:1px}
@media print{.buscaLinha{display:none}}
/* o custo por saca em dois: realizado (colheita) e projetado (previsão) */
.custoSaca{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px;margin:0 0 14px}
.custoSaca .cs{background:var(--carta);border:1px solid var(--linha-3);border-radius:var(--r-lg);padding:14px}
.custoSaca .cs.proj{border-style:dashed}
.custoSaca .csTit{font-size:11px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--verde)}
.custoSaca .csVal{font-family:var(--mono);font-size:21px;font-weight:600;margin-top:4px;font-variant-numeric:tabular-nums}
.custoSaca .csVal.falta{font-family:var(--sans);font-size:14px;font-weight:400;color:var(--ambar)}
.custoSaca .csSub{font-size:12px;color:var(--tinta-2);margin-top:4px;line-height:1.5}
@media print{
  .conf>summary::after{content:""}
  .custoSaca .cs{break-inside:avoid}
}

/* ═══════════════════════════════════════════════════════════════════════
 * SEÇÃO 47 · O DEDO (18/09/2026)
 *
 * O alvo de toque é questão de PONTEIRO, não de largura: um tablet de
 * 1024px com dedo erra igual a um telefone de 360px, e um notebook de
 * 800px com mouse acerta um botão de 30px. Por isso a regra pega
 * `pointer:coarse` — quem aponta com o dedo — e não um breakpoint.
 *
 *   44px   o mínimo do dedo (Apple 44pt · Android 48dp)
 *   16px   no campo de entrada: abaixo disso o Safari do iPhone dá zoom
 *          sozinho a cada foco, e a tela salta no meio do apontamento
 *
 * Uma vez aqui, vale para toda tela que herda o layout.
 * ═══════════════════════════════════════════════════════════════════════ */
@media (pointer:coarse){
  /* botão, aba e link de ação */
  .btn,.btnSm,.btnMini,.btn-executar,.btnCadProd,.navBtn,.pageBtn,
  .module-tab,button.module-tab,.closeBtn{min-height:44px}
  .btn,.navBtn{padding:0 15px}
  /* o .navBtn vira bloco no estreito (para cortar com reticências): a altura
     do dedo só centraliza o rótulo com a entrelinha acompanhando */
  .navBtn{line-height:42px}
  .btnSm,.btnMini,.btn-executar,.btnCadProd{padding:0 14px;font-size:13px}
  .tblRel td a,table.listagem td a,.acoes a,.dadosAcao a,.conf>summary{
    min-height:44px;display:inline-flex;align-items:center}

  /* campo de entrada: 44 de altura, 16 de fonte (o zoom do iPhone é
     gatilho de FONTE, não de altura — 44px com 12px de fonte ainda salta) */
  input,select,textarea,.control,table.rc input,table.rc select,
  .execForm input,.execForm select{min-height:44px}

  /* ── A FONTE É PISO, E POR ISSO LEVA `!important` (27/09) ───────────────
     A altura funcionava e a fonte não, e o motivo é especificidade: o layout
     diz `input{font-size:16px}` (0,0,1) e as grades dizem
     `.lote input[type=number]{font-size:12.5px}` (0,2,1) — a tela vence. A
     altura escapava por acidente feliz: o layout usa `min-height`, que ganha
     de `height` no cálculo da caixa, não na cascata.
     Medido: **18 telas** declaram fonte menor que 16px em campo, entre elas as
     três grades de lançamento. Em todas, o iPhone dá zoom a cada foco — e com
     o ENTER andando na linha, isso é um salto por tecla digitada.
     `!important` aqui não é preguiça: é a forma correta de escrever um PISO.
     A fonte pequena existe para caber coluna no monitor, e no dedo não há
     coluna que justifique o salto. Tela que precise de fonte MAIOR no toque
     declara aqui, no layout, não localmente. */
  input,select,textarea,.control{font-size:16px!important}
  textarea,textarea.control{min-height:88px}
  select.control{background-position:right 14px center}

  /* caixa de marcar: o quadrado cresce e a linha inteira vira área de toque */
  .chk{min-height:44px}
  input[type=checkbox],input[type=radio]{width:24px;height:24px;min-height:0}
}

/* ── O TELEFONE ────────────────────────────────────────────────────────
   O corte de 680px atende tablet em retrato e telefone deitado. O telefone
   em pé (360–430px) precisa do segundo corte: com 680px só, a barra de
   ações continua em duas colunas de 170px e o cartão fica com 150px de
   largura útil. 430px cobre do Android de 360 ao iPhone Pro Max de 430. */
@media (max-width:430px){
  .pag{padding:16px 12px 96px}
  /* A barra de AÇÃO da tela (salvar, nova) divide a linha: é o alvo que o
     polegar procura. A barra de FILTROS não — Filtros e Relatório são desvios
     do caminho e ficam estreitos, mais estreitos que os botões do cabeçalho. */
  .acoes{flex-wrap:wrap}
  .acoes .btn{flex:1 1 0;max-width:none;min-width:0}
  .actions-bar{flex-wrap:wrap;gap:6px}
  .actions-bar .btn{flex:0 0 auto;width:auto;max-width:none;padding:0 12px;font-size:12.5px}
  .resumoCards,.custoSaca,.detGrid,.prodModalBody .row2{grid-template-columns:1fr}
  .painelProd .ppGrid{grid-template-columns:1fr}
  h1,.title{font-size:18px}
}

/* ═══════════════════════════════════════════════════════════════════════
 * SEÇÃO 48 · A TELA ESTREITA DO CAMPO (18/09/2026)
 *
 * Nas telas que o produtor usa NA ROÇA, a tabela de talhões rolava na
 * horizontal e o nome do talhão saía da tela junto com a rolagem: digitava-se
 * a dose sem ver em qual talhão — e ninguém percebe o erro depois.
 *
 * Abaixo de 430px a tabela deixa de ser tabela: cada talhão vira um CARTÃO,
 * com o nome no alto e um campo por linha, e o rótulo de cada campo traz o
 * nome do talhão ("Dose — Brota"). O HTML continua sendo uma tabela e as
 * linhas continuam com data-talhao: o JavaScript que monta a pilha e grava
 * não é tocado — só o CSS muda a forma.
 *
 * Entre 431 e 680px (tablet em pé, telefone deitado) a tabela continua, com
 * a coluna de marcar e a do nome FIXAS na esquerda — mesma doença, remédio
 * mais barato.
 *
 * Marca-se a tabela com .rcCartao; quem não tem a classe não muda.
 * ═══════════════════════════════════════════════════════════════════════ */
/* ── O NÚCLEO DO CARTÃO, escrito UMA VEZ para os dois donos ──────────────
 * Havia DUAS cópias desta regra — a da pilha (§48, `rcCartao`, ≤430px) e a da
 * grade de lançamento (§50, `viraCartao`, ≤680px). Escrevi a segunda em 27/09
 * copiando a primeira, e pelo teste da R19-26 isso é doença: mudar o cartão
 * (pôr o rótulo ACIMA do campo, por exemplo) obrigaria a mexer nas duas.
 *
 * Unificado sem renomear nada: os dois nomes continuam sendo a PORTA — cinco
 * arquivos usam `rcCartao`, inclusive as duas pilhas em JavaScript, e renomear
 * seria churn largo por ganho nenhum. O que mudou é que as declarações moram
 * num lugar só, e cada dono acrescenta apenas o que é dele.
 *
 * O CORTE CONTINUA DIFERENTE, e de propósito: a pilha tem 5 a 8 colunas e cabe
 * num tablet, então vira cartão só a ≤430; a grade tem 14 a 23 e não cabe em
 * tablet nenhum, então vira a ≤680. Por isso o núcleo vive na faixa LARGA e a
 * pilha o DESFAZ entre 431 e 680 — seis declarações, contra vinte de cópia. */
/* ── O NÚCLEO DO CARTÃO, SEPARADO POR DONO (30/09) ──────────────────────
 * Eram listas de vírgula compartilhadas entre a PILHA (`.rcCartao`) e a GRADE
 * (`.viraCartao`). Separei porque elas passaram a viver em MÍDIAS diferentes:
 * a grade vira cartão no PAPEL também, a pilha não — ela cabe (medido:
 * `estoque_view` pede 678px numa folha de 718). E uma media query não pode
 * valer para seletores diferentes conforme a mídia.
 *
 * Pelo teste da R19-26 isto é duplicação DECLARADA, não doença: as duas já
 * divergiam antes de mim — cortes diferentes (430 x 680) e um bloco inteiro
 * só da pilha logo abaixo. Mudar o cartão da grade não obriga a mudar o da
 * pilha, porque respondem a perguntas diferentes: "cabe num telefone?" e
 * "cabe numa folha?". O que as une é a FORMA, e a forma está escrita aqui
 * duas vezes de propósito, uma ao lado da outra, para quem mexer ver as duas.
 */

/* ═══ AS DUAS METADES DO CARTÃO — leia isto antes de querer unificar ═════
 *
 * O QUE ELAS TÊM EM COMUM: a FORMA. Tabela vira bloco, o cabeçalho some, cada
 * linha vira um cartão e cada célula vira "rótulo: valor" com o rótulo vindo
 * de `data-rot`. As declarações abaixo são quase idênticas, e é por isso que
 * daqui a meses alguém vai querer juntá-las numa lista de vírgula só. Já
 * estiveram assim, até 30/09/2026.
 *
 * POR QUE NÃO PODEM SER UMA: elas vivem em MÍDIAS diferentes.
 *
 *     a PILHA   vira cartão só no TELEFONE (≤680). No papel ela CABE —
 *               medido: `estoque_view` pede 678px numa folha útil de 718 —
 *               e cardá-la seria regressão: uma tabela que cabe virando
 *               cartão sem motivo, ocupando três vezes mais folha
 *     a GRADE   vira cartão no telefone E NO PAPEL, porque não cabe em
 *               nenhum dos dois: 23 colunas pedem 1180px
 *
 * E uma `@media` não pode valer para seletores diferentes conforme a mídia.
 * Juntá-las obriga a escolher UMA mídia, e qualquer escolha quebra um dos
 * dois lados: ou a pilha vira cartão no papel sem precisar, ou a grade sai
 * cortada pela metade.
 *
 * O TESTE DA R19-26 dá o mesmo veredito por outro caminho: mudar o cartão da
 * grade NÃO obriga a mudar o da pilha, porque elas respondem a perguntas
 * diferentes — "cabe num telefone?" e "cabe numa folha?". Duplicação
 * declarada é escolha; e elas já divergiam antes disto, em cortes (430 × 680)
 * e num bloco inteiro só da pilha, logo abaixo.
 *
 * SE UM DIA A PILHA PRECISAR DE CARTÃO NO PAPEL, a resposta não é unificar:
 * é dar a ela o mesmo `.cartaoNoPapel` que a grade usa. Aí sim as duas
 * responderão à mesma pergunta, e aí sim juntar será o certo.            */

/* ── a PILHA: cartão só no telefone ───────────────────────────────────── */
@media(max-width:680px){
  table.rc.rcCartao{min-width:0;display:block;border:0}
  table.rc.rcCartao thead{display:none}
  table.rc.rcCartao tbody{display:block}
  table.rc.rcCartao tr{display:block;margin:0 0 10px;padding:9px 11px;
    border:1px solid var(--linha-3);border-radius:var(--r);background:var(--carta)}
  table.rc.rcCartao td{display:flex;align-items:center;justify-content:space-between;
    gap:10px;padding:7px 0;border:0;border-bottom:1px solid var(--linha-2);text-align:right}
  table.rc.rcCartao td:last-child{border-bottom:0}
  table.rc.rcCartao td::before{content:attr(data-rot);flex:1 1 auto;text-align:left;
    font-size:12.5px;font-weight:600;color:var(--tinta-2)}
}

/* ── a GRADE: cartão no telefone E NO PAPEL ───────────────────────────────
 * (o par desta regra é o bloco da PILHA, logo acima; o porquê de serem duas
 *  está no comentário que abre os dois)
 *
 * DUAS CHAVES INDEPENDENTES, UMA POR MÍDIA — e isto foi conserto de 02/10:
 *
 *     .viraCartao      vira cartão no TELEFONE  (≤680px)
 *     .cartaoNoPapel   vira cartão no PAPEL     (print)
 *
 * Elas eram acopladas: o papel exigia `.viraCartao` presente, e o `.cartaoNo-
 * Papel` só desfazia a regra. Consequência — para dar cartão no PAPEL ao
 * fechamento de colheita e às vazões, eu pus `.viraCartao` nas duas; e as duas
 * trazem escrito no próprio arquivo que NÃO devem virar cartão no telefone
 * (vazões: 720px e 10 colunas, abaixo de 680 sobram 40px de rolagem — cartão
 * ali troca um incômodo pequeno por uma pilha longa). O acoplamento obrigou a
 * contrariar uma decisão declarada para obter outra, e foi a ferramenta da
 * grade que apanhou, cobrando `data-rot` de quem não devia virar cartão.
 *
 * Quem quer as duas põe as duas (as análises de solo e de folha). As decisões
 * são de mídias diferentes e nada obriga a andarem juntas.
 *
 * No papel é opt-in porque cortar a tabela e virar cartão são desenhos
 * diferentes e a escolha é de quem lê a folha. Medido na largura útil de uma
 * A4 retrato (718px), sem o cartão:
 *     análise de solo 23 col, precisa 1180px  → perde 39% da tabela
 *     análise de folha 14 col, precisa 1180px → perde 39%
 * O laudo já É uma lista vertical de "parâmetro: valor": o cartão tem a forma
 * do documento que se está copiando, e nada se perde além do papel ficar mais
 * longo.
 *
 * O NÚCLEO fica numa fonte só, na união das duas chaves — é ele que mudaria se
 * a aparência do cartão mudasse, e por isso é ele que não pode ter cópia
 * (R19-26). O que se repete abaixo é o DESFAZER, que é a tabela de volta: ele
 * não carrega decisão de aparência nenhuma, e muda quando o navegador muda, o
 * que não acontece.                                                         */
@media(max-width:680px), print{
  .gradeLanc.viraCartao > table,
  .gradeLanc.cartaoNoPapel > table{min-width:0;display:block;border:0}
  .gradeLanc.viraCartao thead,
  .gradeLanc.cartaoNoPapel thead{display:none}
  .gradeLanc.viraCartao tbody,.gradeLanc.viraCartao tfoot,
  .gradeLanc.cartaoNoPapel tbody,.gradeLanc.cartaoNoPapel tfoot{display:block}
  .gradeLanc.viraCartao tr,
  .gradeLanc.cartaoNoPapel tr{display:block;margin:0 0 10px;padding:9px 11px;
    border:1px solid var(--linha-3);border-radius:var(--r);background:var(--carta)}
  .gradeLanc.viraCartao td,
  .gradeLanc.cartaoNoPapel td{display:flex;align-items:center;
    justify-content:space-between;gap:10px;padding:7px 0;border:0;
    border-bottom:1px solid var(--linha-2);text-align:right}
  .gradeLanc.viraCartao td:last-child,
  .gradeLanc.cartaoNoPapel td:last-child{border-bottom:0}
  /* o rótulo repetido é o que faz cada campo se explicar sozinho — sem ele o
     cartão é uma pilha de caixas sem nome, e é por isso que a ferramenta da
     grade cobra `data-rot` de TODA tela que leva uma das duas chaves */
  .gradeLanc.viraCartao td::before,
  .gradeLanc.cartaoNoPapel td::before{content:attr(data-rot);flex:1 1 auto;
    text-align:left;font-size:12.5px;font-weight:600;color:var(--tinta-2)}
}
/* NO PAPEL, quem optou só pelo telefone fica tabela: as outras grades esperam
   decisão, e `safras_planejar` nem tem botão de imprimir */
@media print{
  .gradeLanc.viraCartao:not(.cartaoNoPapel) > table{display:table;min-width:0}
  .gradeLanc.viraCartao:not(.cartaoNoPapel) thead{display:table-header-group}
  .gradeLanc.viraCartao:not(.cartaoNoPapel) tbody{display:table-row-group}
  .gradeLanc.viraCartao:not(.cartaoNoPapel) tfoot{display:table-footer-group}
  .gradeLanc.viraCartao:not(.cartaoNoPapel) tr{display:table-row;margin:0;padding:0;
    border:0;border-radius:0;background:none}
  .gradeLanc.viraCartao:not(.cartaoNoPapel) td{display:table-cell;text-align:right;
    padding:4px 6px;border:0;border-bottom:1px solid var(--linha-2)}
  .gradeLanc.viraCartao:not(.cartaoNoPapel) td::before{content:none}
}
/* E NO TELEFONE, quem optou só pelo papel continua grade grudada (seção 50) */
@media(max-width:680px){
  .gradeLanc.cartaoNoPapel:not(.viraCartao) > table{display:table}
  .gradeLanc.cartaoNoPapel:not(.viraCartao) thead{display:table-header-group}
  .gradeLanc.cartaoNoPapel:not(.viraCartao) tbody{display:table-row-group}
  .gradeLanc.cartaoNoPapel:not(.viraCartao) tfoot{display:table-footer-group}
  .gradeLanc.cartaoNoPapel:not(.viraCartao) tr{display:table-row;margin:0;padding:0;
    border:0;border-radius:0;background:none}
  .gradeLanc.cartaoNoPapel:not(.viraCartao) td{display:table-cell;text-align:right;
    padding:5px 8px;border:0;border-bottom:1px solid var(--linha)}
  .gradeLanc.cartaoNoPapel:not(.viraCartao) td::before{content:none}
}

/* ── só da PILHA: o talhão é título, e marcar ocupa a largura ────────────── */
@media(max-width:430px){
  table.rc.rcCartao tr.fora{opacity:.6}
  table.rc.rcCartao tr.exec{background:var(--verde-lv)}
  table.rc.rcCartao td input,table.rc.rcCartao td select{width:58%;min-width:0}
  table.rc.rcCartao td.nomeCel{justify-content:flex-start;text-align:left;font-size:15px;
    padding-top:0;border-bottom:2px solid var(--linha)}
  table.rc.rcCartao td.nomeCel::before{content:none}
  /* marcar o talhão é o gesto que decide: ocupa a largura do cartão */
  table.rc.rcCartao td.selCel{border-bottom:0;padding-bottom:2px}
  /* ── O QUE SE ESPERA DELE, ESCRITO (01/10) ────────────────────────
     Largura cheia com fundo branco, borda cinza-clara e NENHUM texto quando
     desmarcado: parecia campo apagado e nao clicavel, e nada dizia que
     marcar o talhao era o proximo passo. O visto sozinho so aparece DEPOIS
     de marcar — ou seja, a dica so existia para quem ja tinha descoberto.
     Agora ele se parece com campo ativo e DIZ o que faz, nos tres estados. */
  table.rc.rcCartao td.selCel .tSel{width:100%;min-height:44px;
    background:var(--verde-lv);border:1.5px solid var(--verde);
    color:var(--verde);font-weight:700;font-size:13px;letter-spacing:.01em}
  table.rc.rcCartao td.selCel .tSel::after{content:"Incluir este talhão"}
  table.rc.rcCartao td.selCel .tSel.on{background:var(--verde);color:#fff;
    border-color:var(--verde)}
  table.rc.rcCartao td.selCel .tSel.on::after{content:" No plano — tocar para tirar"}
  table.rc.rcCartao td.selCel .tSel:disabled{background:var(--linha-2);
    border-color:var(--linha-3);color:var(--tinta-3);font-weight:600}
  table.rc.rcCartao td.selCel .tSel:disabled::after{content:"Já executado — não muda"}
}

@media(min-width:431px) and (max-width:680px){
  /* A PILHA NÃO VIRA CARTÃO AQUI. O núcleo acima vale até 680 porque a grade
     precisa dele até lá; a pilha cabe num tablet e continua tabela. Desfazer
     custa seis declarações — copiar o núcleo custaria vinte, e a cópia é que
     diverge. */
  table.rc.rcCartao{display:table}
  table.rc.rcCartao thead{display:table-header-group}
  table.rc.rcCartao tbody{display:table-row-group}
  table.rc.rcCartao tr{display:table-row;margin:0;padding:0;border:0;border-radius:0}
  table.rc.rcCartao td{display:table-cell;text-align:inherit}
  table.rc.rcCartao td::before{content:none}

  table.rc.rcCartao td.selCel,table.rc.rcCartao thead th:first-child{
    position:sticky;left:0;z-index:2;width:44px;min-width:44px;background:var(--carta)}
  table.rc.rcCartao td.nomeCel,table.rc.rcCartao thead th:nth-child(2){
    position:sticky;left:44px;z-index:2;background:var(--carta);
    box-shadow:1px 0 0 var(--linha-3)}
  table.rc.rcCartao thead th:first-child,table.rc.rcCartao thead th:nth-child(2){
    background:var(--thead)}
}

/* ═══════════════════════════════════════════════════════════════════════
 * 50 · A GRADE DE LANÇAMENTO — o cabeçalho e a primeira coluna não somem
 *
 * O PROBLEMA: uma tabela de lançamento larga (análise de solo tem 23 colunas
 * em 1340px) rola nos dois sentidos, e a pessoa perde as duas âncoras que
 * dizem o que ela está digitando: QUAL LINHA (o talhão) e QUAL COLUNA (o
 * parâmetro). Rolando até o enxofre, o número entra às cegas.
 *
 * Marca-se o BOX que rola com `.gradeLanc`. Vale para toda tabela larga de
 * lançamento — não se escreve de novo em tela nenhuma.
 *
 * ── POR QUE O BOX PRECISA DE ALTURA MÁXIMA, e é o defeito que existia ────
 * `position:sticky; top:0` gruda em relação ao ANCESTRAL QUE ROLA, não à
 * janela. As três telas que tinham essa regra escreviam
 * `<div class="card lote" style="overflow-x:auto">` — e é aí que ela morria,
 * em silêncio:
 *
 *     overflow-x:auto com overflow-y:visible faz o overflow-y computar AUTO
 *
 * Isso é da especificação, não um defeito de navegador. O box vira contêiner
 * de rolagem nos DOIS eixos; como ele não tem altura limitada, nunca rola na
 * vertical — então o cabeçalho nunca tem de onde grudar. A página rola, o box
 * inteiro sobe, e o cabeçalho sobe junto. A regra estava escrita, parecia
 * certa na leitura, e não fazia nada.
 *
 * Por isso a altura é do PADRÃO, não da tela: sem ela o resto é decorativo.
 * A tela ajusta com `--gradeAlt` quando tiver mais ou menos coisa em cima.
 *
 * ── OS TRÊS NÍVEIS DE z-index, e por que dois não bastam ────────────────
 *     canto     4   gruda nos DOIS sentidos e tem de vencer os dois
 *     cabeçalho 3   passa por cima do corpo ao rolar para baixo
 *     1ª coluna 2   passa por cima do corpo ao rolar de lado
 *     corpo     0
 * Com o canto no mesmo nível do cabeçalho, o nome do talhão passa POR CIMA
 * das outras células de cabeçalho ao rolar de lado — ou some por baixo delas,
 * conforme a ordem no documento. Era o caso aqui: `.lote th:first-child`
 * (0,2,1) vence `.lote thead th` (0,1,2) por especificidade e rebaixava o
 * canto para 2, abaixo do próprio cabeçalho.
 *
 * ── A BORDA VIRA SOMBRA, porque `border-collapse` a deixa para trás ─────
 * Com `collapse` a borda pertence à TABELA, não à célula: a célula grudada
 * se move e a borda fica onde estava. `box-shadow:inset` anda com a célula.
 *
 * ── E O TECLADO DO SISTEMA (R19-24), que é armadilha só desta casa ──────
 * O ENTER anda DENTRO da linha (`_grade_teclado.js`) e dá `prox.focus()`. O
 * navegador rola o campo para a vista sem saber que há coisa grudada — e o
 * campo para DEBAixo do cabeçalho, ou atrás da primeira coluna quando o
 * ENTER volta ao começo da linha. `scroll-margin` é o que ensina a ele onde
 * a área visível de verdade começa.
 * ═══════════════════════════════════════════════════════════════════════ */
.gradeLanc{
  /* os dois eixos no MESMO box: é ele o ancestral que rola, e é a ele que o
     sticky se prende */
  overflow:auto;
  max-height:var(--gradeAlt, calc(100vh - 250px));
  max-height:var(--gradeAlt, calc(100dvh - 250px));
  overscroll-behavior:contain;
  -webkit-overflow-scrolling:touch;
}
.gradeLanc > table{width:100%;border-collapse:collapse}

/* ── O CABEÇALHO DA GRADE É VERDE (29/09) ────────────────────────────
   As cinco grades declaravam a MESMA faixa cinza, cada uma no seu `<style>`
   e com um seletor diferente (`.lote thead th`, `#grade thead th`,
   `.tblBox thead th`). Mudar a cor exigia mexer em cinco lugares: era
   doença pela definição da R19-26, e se provou ao igualar — a cor passou a
   morar AQUI, e as telas guardam só o que é delas.

   O verde é o mesmo do cadastro, e pela mesma razão: a faixa grudada é o
   que ancora a leitura quando a tabela rola, e cinza a 84% de luminância
   não ancora nada. Texto branco, 7,94:1.

   O `*{color:inherit}` é o de sempre: enumerar filho por filho esquece um —
   e nestes cabeçalhos há `<small>` com a unidade, que é justamente o que
   fica ilegível quando se esquece. */
.gradeLanc thead th{position:sticky;top:0;z-index:3;
  background:var(--verde);color:#fff;
  box-shadow:inset 0 -1px 0 var(--verde-2)}
.gradeLanc thead th *{color:inherit}
.gradeLanc tbody td:first-child,
.gradeLanc tfoot td:first-child{position:sticky;left:0;z-index:2;
  background:var(--carta);box-shadow:inset -1px 0 0 var(--linha-3)}
.gradeLanc tfoot td:first-child{background:var(--thead)}
/* o CANTO: gruda nos dois sentidos e vence os dois */
.gradeLanc thead th:first-child{left:0;z-index:4;
  box-shadow:inset -1px 0 0 var(--verde-2), inset 0 -1px 0 var(--verde-2)}

/* ── O MOUSE NUMA TABELA QUE ROLA DE LADO (12/10/2026) ───────────────────
 * A RODA É DA PÁGINA, O ARRASTO É DA TABELA — e os dois são padrão em tabela
 * larga. O comportamento mora no `_grade_mouse.js`, porque não é possível em
 * folha de estilo; aqui fica o que é desenho: o cursor que diz que se pode
 * puxar, e o texto que não se seleciona enquanto se puxa.
 *
 * A CAUSA DO PROBLEMA ESTAVA NO EIXO QUE NINGUÉM SUSPEITAVA, e está escrita
 * aqui porque é contraintuitiva e vai morder de novo: **é a rolagem LATERAL
 * que engole a roda vertical.** O navegador prende o gesto na caixa rolável
 * mais próxima em QUALQUER eixo, e presa nela a roda não sobe para a página —
 * mesmo que a caixa não tenha nada a rolar na vertical. Medido com a roda de
 * verdade (CDP, `Input.dispatchMouseEvent` com `mouseWheel`), porque evento
 * sintético no DOM não rola:
 *
 *     overflow-y: visible   NÃO rola a página   (e computa `auto`)
 *     overflow-y: clip      NÃO rola a página   (computa `hidden`)
 *     overflow-x: visible   ROLA                 ← o eixo é o outro
 *
 * Duas correções foram tentadas no eixo Y antes disso e as duas falharam. A
 * lição que fica: **enquanto a tabela rolar de lado, nenhum valor de
 * `overflow-y` devolve a roda para a página** — o conserto é no evento.
 */
.tblBox,.gradeLanc{cursor:grab}
.tblBox.puxando,.gradeLanc.puxando{cursor:grabbing;user-select:none}
/* o cursor de "pode puxar" só faz sentido onde há para onde puxar, e a caixa
   não sabe disso em CSS — o dedo não tem cursor, e no telefone o arrasto
   nativo já existe */
@media (pointer:coarse){.tblBox,.gradeLanc{cursor:auto}}
/* dentro de um campo o cursor é o do campo: `grab` em cima de um `<input>`
   prometeria arrastar o que não se arrasta (o helper não inicia arrasto ali) */
.tblBox input,.tblBox select,.tblBox textarea,.tblBox button,.tblBox a,
.gradeLanc input,.gradeLanc select,.gradeLanc textarea,
.gradeLanc button,.gradeLanc a{cursor:auto}
.tblBox button,.tblBox a,.gradeLanc button,.gradeLanc a{cursor:pointer}

/* o campo que recebe o foco não para debaixo do que está grudado */
.gradeLanc input,.gradeLanc select,.gradeLanc textarea{
  scroll-margin-top:var(--gradeCab,52px);
  scroll-margin-left:var(--gradeCol,152px)}

/* ── O CAMPO PREENCHE A CÉLULA (10/10/2026) ──────────────────────────────
 * A grade alinhava as COLUNAS e não alinhava o que se digita dentro delas. O
 * cabeçalho é centrado (`.tblBox th`), e o `<input>` nascia com a largura
 * INTRÍNSECA do controle — ~154px — qualquer que fosse a largura da coluna.
 * Medido na ficha de talhões, a 1280px: célula de 244px com campo de 154
 * (78px de sobra), célula de 349 com 154 (183 de sobra), célula de 233 com
 * 102 (119 de sobra). As colunas batiam ao pixel (dx=0, dw=0) e os campos
 * saíam escalonados, cada um começando num lugar e nenhum debaixo do título.
 *
 * E A REGRA JÁ EXISTIA, ESCRITA DUAS VEZES À MÃO: `colheita_fechamento`
 * (`#grade td input{width:100%}`) e `safra.php` (`#grade td input,#grade td
 * select{width:100%;min-width:0}`) chegaram à mesma resposta, cada um por si.
 * Duas cópias da mesma regra é doença, não escolha (R19-26): a terceira tela
 * a usar a grade — a ficha de talhões — não escreveu nenhuma, e foi ela que
 * apareceu torta. É o caso exato da regra que mais se quebra neste projeto.
 *
 * E O `min-width:0` NÃO VEM JUNTO, embora ele seja o que deixa o campo encolher
 * abaixo do min-content do controle. Medido: posto aqui, ele mexeu em DOZE
 * colunas das vazões — de 1 a 5px cada — sem mexer num único campo, porque a
 * tela fixa `width` e não `min-width`, e o piso do controle participava do
 * cálculo da coluna. Mudança de 5px numa tela que ninguém mandou tocar é
 * mudança. Ele mora em quem precisa dele: a ficha de talhões, que tem coluna
 * de 70px e `table-layout:fixed` (lá o piso do controle não alarga a coluna —
 * transborda a célula, que é pior).
 *
 * QUEM FIXA LARGURA ESTREITA SOBRESCREVE, e isso é escolha declarada: a
 * análise de solo (23 colunas), a de folha e as vazões pinam o campo numérico
 * em 68–88px porque a tabela delas precisa CABER — ali esticar o campo até a
 * célula alargaria a tabela sem ganhar leitura.
 *
 * E A ESPECIFICIDADE É A DO PADRÃO, DE PROPÓSITO — medido, porque a primeira
 * versão desta regra foi `.gradeLanc td input` (0,1,2) e ATROPELOU as vazões,
 * cujo `.lote input` é (0,1,1): os campos foram de 88px para 95,8–164,2px e
 * TODA coluna andou, numa tela que ninguém mandou mexer. O antes e o depois
 * estão medidos no navegador.
 * Escrita no mesmo seletor da regra de rolagem — (0,1,1) —, ela EMPATA com o
 * `.lote input` da tela, e o `<style>` da tela vem depois do `_layout.css` no
 * `<head>`: a tela vence por ordem de origem, sem precisar de `!important`
 * nem de lista de exceções. Padrão que cede ao declarado é a forma certa aqui;
 * padrão que vence o declarado é uma decisão minha por cima da dele. */
.gradeLanc input,.gradeLanc select,.gradeLanc textarea{width:100%}

/* ── O SPINNER DO CAMPO NUMÉRICO SAI DA GRADE (12/10/2026) ───────────────
 * Ele desenha DENTRO da caixa de conteúdo e NÃO a reduz — medido: um
 * `input[type=number]` e um `type=text` com o mesmo valor devolvem
 * `clientWidth` e `scrollWidth` idênticos (70 e 70). Então o navegador acha que
 * o texto cabe, `scrollWidth - clientWidth` dá zero, e o último dígito fica
 * EMBAIXO da seta: *"a coluna ÁREA ainda corta: 12,00 perde parte do último
 * zero"*. Com o texto centrado — que é o padrão da célula — o corte é à direita.
 *
 * E NENHUMA MEDIÇÃO PEGAVA, porque a única resposta que o navegador dá sobre
 * transbordo de campo é o `scrollWidth`, e ele é cego para isto. Era a terceira
 * vez que esta coluna voltava.
 *
 * O SPINNER NÃO SERVE A NADA AQUI: ninguém ajusta área de talhão de 0,01 em
 * 0,01 clicando numa seta de 8px, e o sistema já gasta um `onwheel` em cada
 * campo para impedir que a roda do mouse mude o número sem ninguém pedir
 * (57 ocorrências). Tirá-lo devolve a largura inteira ao texto e tira a
 * armadilha junto.
 * `step` continua valendo para o teclado e para a validação — o que sai é só o
 * controle de apontar. */
.gradeLanc input[type=number]{appearance:textfield;-moz-appearance:textfield}
.gradeLanc input[type=number]::-webkit-outer-spin-button,
.gradeLanc input[type=number]::-webkit-inner-spin-button{
  -webkit-appearance:none;appearance:none;margin:0}
/* a caixa de marcar é a exceção óbvia: ela não se estica. Especificidade
   maior que a de cima (o atributo conta), e isso é intencional — nenhuma tela
   quer um checkbox de 100% de largura. */
.gradeLanc input[type=checkbox],.gradeLanc input[type=radio]{
  width:auto;min-width:0}

/* ── O CARTÃO, para a tabela que tem colunas DEMAIS (opt-in) ─────────────
 * Grudar o cabeçalho RESOLVE o problema; virar cartão o faz DESAPARECER — e
 * qual serve depende de quantas colunas a tabela tem, que o CSS não sabe
 * contar. Por isso é a tela que declara, com o motivo escrito:
 *
 *   sem `.viraCartao`   a grade fica, grudada. Serve à tabela que quase cabe
 *                       (vazões: 720px, 10 colunas — abaixo de 680 sobram
 *                       40px de rolagem, e cartão ali seria pior)
 *   com `.viraCartao`   abaixo de 680px vira cartão. Serve à tabela de muitas
 *                       colunas, onde grudar não basta: numa tela de 600px a
 *                       coluna grudada come 25% da largura PARA SEMPRE e ainda
 *                       restam cinco telas de rolagem lateral por talhão
 *
 * O corte é 680 e não 430 de propósito. As telas de planejamento viram cartão
 * em 430 porque têm 5 a 8 colunas e cabem num tablet. Uma grade de 21 medidas
 * não cabe em tablet nenhum.                                               */
@media(max-width:680px){
  /* o NÚCLEO do cartão está na seção 48 — aqui fica só o que é da grade */
  .gradeLanc.viraCartao{max-height:none;overflow:visible}
  .gradeLanc.viraCartao tfoot tr{background:var(--thead)}
  /* as células deixam de grudar: num cartão não há de que grudar */
  .gradeLanc.viraCartao td{position:static;box-shadow:none;background:none;
    min-width:0;max-width:none}
  .gradeLanc.viraCartao td input,.gradeLanc.viraCartao td select{width:46%;min-width:96px}
  /* a primeira célula é o TÍTULO do cartão, não mais um campo */
  /* ── O TÍTULO DO CARTÃO É FAIXA VERDE (12/10/2026) ──────────────────
     Pedido do Darlan sobre a ficha de talhões no telefone: *"hoje tudo tem o
     mesmo peso e os cartões se confundem na rolagem."*
     É O MESMO PADRÃO DE HIERARQUIA DA SEÇÃO 32 — a faixa cheia contra o cartão
     branco, que é a maior distância de luminância que a paleta permite entre
     dois fundos. O grupo e a propriedade já se separam assim; o cartão de
     talhão tinha só peso de fonte e um fio, que a 360px desaparece numa
     rolagem rápida.
     A MARGEM NEGATIVA faz a faixa sangrar até a borda do cartão: o `tr` tem
     9px/11px de recuo, e um fundo que para antes da borda lê-se como erro, não
     como faixa. O raio acompanha o do cartão, menos a espessura da borda.
     E ela vale para TODA grade que vira cartão, não só para esta: é a mesma
     pergunta — "onde começa um cartão e termina o outro?" — e a resposta mora
     num lugar só. No PAPEL ela NÃO entra (a decisão de 30/09: no papel a
     hierarquia é peso, linha e espaço, não fundo), e é por isso que o seletor
     não inclui `.cartaoNoPapel`. */
  .gradeLanc.viraCartao tbody td:first-child,
  .gradeLanc.viraCartao tfoot td:first-child{
    justify-content:flex-start;text-align:left;font-size:15px;font-weight:600;
    background:var(--verde);color:#fff;
    margin:-9px -11px 9px;padding:9px 11px;border-bottom:0;
    border-radius:calc(var(--r) - 1px) calc(var(--r) - 1px) 0 0}
  /* TUDO que estiver dentro da faixa fica branco — enumerar filho por filho é
     o erro que a seção 32 já pagou: o filho novo nasce ilegível e ninguém vê.
     A etiqueta é a exceção, e se exclui aqui porque traz o próprio fundo. */
  /* E PRECISA DO `-webkit-text-fill-color` JUNTO, senão não pinta nada:
     o modo leitura da ficha fixa `-webkit-text-fill-color: var(--tinta)` no
     campo travado (para vencer o cinza do navegador), e no Blink é ESSA
     propriedade que pinta o texto — `color` sozinho computa branco e o texto
     sai escuro. Medido: `color` branco e `fill` rgb(20,32,27) sobre o verde,
     que é 1,3:1. É a segunda vez em dois dias que o `fill` vence o `color` sem
     avisar, e a primeira foi no placeholder. */
  .gradeLanc.viraCartao tbody td:first-child *:not(.falta):not(.del):not(.selo){
    color:inherit;-webkit-text-fill-color:currentColor}
  .gradeLanc.viraCartao td:first-child::before{content:none}
  /* o talhão INATIVO não leva a faixa verde: ele é histórico, não hierarquia —
     mesma razão por que o cartão dele era cinza no cadastro antigo */
  .gradeLanc.viraCartao tbody tr.inativo td:first-child{
    background:var(--thead);color:var(--tinta-2)}
}

/* ── DE ONDE VEIO O NÚMERO (28/09) ───────────────────────────────────
   Campo que nasce preenchido com o planejado precisa dizer isso, senão quem
   confirma sem olhar aceita o previsto sem perceber que aceitou — e o sistema
   grava como se ele tivesse conferido.
   Está aqui, e não nas telas, porque são DUAS que têm o mesmo campo: a de
   campo (`campo_hoje`) e a de recomendações (`recomendacao_planejar`). Mudar
   a forma de dizer numa só faria o mesmo gesto parecer diferente conforme o
   lugar — que é exatamente o problema que esta linha existe para evitar. */
.fonteCampo{display:block;margin-top:4px;font-size:11.5px;color:var(--tinta-3)}
.fonteCampo.dele{color:var(--verde);font-weight:600}

/* ── A FALTA ANDA COM O TOTAL ─────────────────────────────────────────
   Custo incompleto parece MELHOR que a realidade: o que falta some da soma,
   e um COE pequeno se lê como safra barata. Por isso a falta vem ANTES dos
   números, com o peso deles — nunca como nota de rodapé (R19-18).          */
.faltaNota{max-width:820px;margin:0 auto 16px;padding:14px 16px;
  border-radius:var(--r-lg);background:var(--ambar-lv);
  border:1px solid #E8D2A0;border-left:5px solid var(--ambar);color:#5F3A05}
.faltaNota.grave{background:var(--cereja-lv);border-color:#E6BDBC;
  border-left-color:var(--cereja);color:#6B1F1E}
.faltaNota .fnTitulo{display:block;font-size:15px;line-height:1.35}
.faltaNota .fnProds{margin-top:7px;font-size:12px;line-height:1.5;opacity:.9}
.faltaNota .fnAcao{margin-top:12px;display:flex;flex-wrap:wrap;gap:10px;align-items:center}
@media(max-width:430px){
  .faltaNota .fnAcao .btn{width:100%}
}
@media print{
  /* no papel a falta CONTINUA: é o que impede o número de ser lido como final */
  .faltaNota{background:#fff!important;border:1.5pt solid #000!important;
    color:#000!important;break-inside:avoid}
}

/* ── O CABEÇALHO DO CARD COM PENDÊNCIA ────────────────────────────────
   A etiqueta de pendência tem PRIORIDADE sobre a lista de produtos: o que
   pode ser cortado é a lista, nunca o aviso. Em 21/09/2026 a lista de
   produtos (.jaQtd, com white-space:nowrap) passava da largura do card e
   levava a etiqueta junto, para fora da vista — o aviso do que falta era
   justamente a parte que sumia.

   Por isso o card com pendência tem OUTRO desenho: a primeira linha leva
   período, nome, etiqueta e ações; a lista de produtos desce para a segunda,
   inteira, e quebra em quantas linhas precisar.                          */
.jaTop.comPend{grid-template-columns:88px minmax(0,1fr) auto auto}
.jaTop.comPend>.jaPer  {grid-column:1;grid-row:1}
.jaTop.comPend>.jaNome {grid-column:2;grid-row:1;min-width:0}
.jaTop.comPend>.badge  {grid-column:3;grid-row:1;white-space:nowrap}
.jaTop.comPend>.jaAcoes{grid-column:4;grid-row:1}
.jaTop.comPend>.jaProds{grid-column:1/-1;grid-row:2}
.jaProds{font-size:11.5px;color:var(--tinta-2);min-width:0;line-height:1.4;
  overflow-wrap:anywhere}
.jaProds .maisN{color:var(--tinta-3)}

@media(max-width:430px){
  /* no telefone cada um na sua linha: a etiqueta primeiro, que é o que pede
     ação, e a lista de produtos depois */
  .jaTop.comPend{grid-template-columns:auto minmax(0,1fr)}
  .jaTop.comPend>.badge  {grid-column:1/-1;grid-row:2;justify-self:start}
  .jaTop.comPend>.jaProds{grid-column:1/-1;grid-row:3}
  .jaTop.comPend>.jaAcoes{grid-column:1/-1;grid-row:4;display:flex;gap:6px;width:100%}
  .jaTop.comPend>.jaAcoes .btn{flex:1 1 0;min-width:0}
}

/* ── O CARTÃO DO QUE JÁ ESTÁ SALVO, NO TELEFONE ───────────────────────
   Quatro linhas, nesta ordem: período e nome JUNTOS (AGOSTO · Pré-Florada),
   o tamanho (talhões · ha · litros), o que já foi executado e os botões.
   Antes o período tomava uma linha inteira só para ele.                  */
@media(max-width:430px){
  .jaTop{grid-template-columns:auto minmax(0,1fr);gap:5px 8px;align-items:baseline}
  .jaPer{grid-column:1;grid-row:1}
  .jaNome{grid-column:2;grid-row:1;min-width:0}
  .jaQtd{grid-column:1/-1;grid-row:2}
  .jaExec{grid-column:1/-1;grid-row:3}
  .jaTop>.jaAcoes{grid-column:1/-1;grid-row:4;display:flex;gap:6px;width:100%}
  .jaTop>.jaAcoes .btn{flex:1 1 0;min-width:0}
}

/* o rodapé de totais da tabela-cartão: uma faixa larga, não uma célula
   espremida no canto — é o número que fecha a aplicação */
@media(max-width:430px){
  table.rc.rcCartao tfoot{display:block}
  table.rc.rcCartao tfoot tr{display:flex;flex-wrap:wrap;gap:6px 16px;
    background:var(--verde-lv);border-color:var(--verde-md)}
  table.rc.rcCartao tfoot td{border:0;padding:3px 0;flex:0 0 auto;gap:6px}
  table.rc.rcCartao tfoot td:empty{display:none}
}

/* ── A AÇÃO QUE NÃO SE PROCURA ─────────────────────────────────────────
   No telefone, salvar ficava no fim de uma lista de vinte talhões: rolar
   até o fim para gravar, e rolar de volta para conferir. A barra gruda no
   rodapé, onde o polegar já está. .pag reserva os 96px embaixo.          */
@media(max-width:430px){
  .acoesFixas{position:fixed;left:0;right:0;bottom:0;z-index:50;margin:0;
    display:flex;gap:8px;align-items:center;
    padding:10px 12px calc(10px + env(safe-area-inset-bottom,0px));
    background:var(--carta);border-top:1px solid var(--linha-3);
    box-shadow:0 -6px 18px rgba(20,32,27,.10)}
  .acoesFixas .btn{flex:1 1 0;max-width:none}
}

/* ═══════════════════════════════════════════════════════════════════════
 * SEÇÃO 49 · A CONFIRMAÇÃO (18/09/2026, R18-12)
 *
 * CONFIRMAÇÃO vem DEPOIS da ação e some sozinha: "salvo", "excluído". É o
 * comprovante — diz O QUE mudou, não só que deu certo, para o produtor
 * conferir sem abrir nada.
 * PENDÊNCIA vem ANTES da ação e FICA até ser resolvida ("falta o período").
 * Pendência não vira faixa: mora na página, perto do que falta.
 *
 * O erro de gravação usa a mesma faixa, em cereja, e NÃO some sozinho —
 * erro se lê com calma.
 * ═══════════════════════════════════════════════════════════════════════ */
.aviso{position:fixed;z-index:95;right:24px;bottom:24px;max-width:min(440px,calc(100vw - 32px));
  display:flex;align-items:flex-start;gap:10px;padding:13px 14px;border-radius:var(--r-lg);
  background:var(--verde);color:#fff;box-shadow:0 14px 38px rgba(20,32,27,.26);
  font-size:13.5px;line-height:1.5;cursor:pointer;
  opacity:0;transform:translateY(10px);transition:opacity .15s ease,transform .15s ease}
.aviso.on{opacity:1;transform:none}
.aviso .avisoIco{flex:0 0 auto;font-size:15px;line-height:1.35}
.aviso .avisoTxt{flex:1 1 auto;min-width:0}
.aviso .avisoTxt b{font-weight:600}
.aviso .avisoSub{display:block;opacity:.88;font-size:12.5px}
.aviso .avisoAcao{color:#fff;text-decoration:underline;font-weight:600;white-space:nowrap}
.aviso .avisoX{flex:0 0 auto;background:none;border:0;color:#fff;opacity:.75;cursor:pointer;
  font-size:14px;line-height:1;padding:2px 2px 2px 6px;font-family:inherit}
.aviso .avisoX:hover{opacity:1}
.aviso.erro{background:var(--cereja)}
/* PENDÊNCIA na página: fica até ser resolvida — sem timer, sem sumiço */
.msg.av{background:var(--ambar-lv);border:1px solid #E8D2A0;color:#7A4A05}
/* PENDÊNCIA na página: fica até ser resolvida, e não tem timer nenhum */
.msg.av{background:var(--ambar-lv);border:1px solid #E8D2A0;color:#7A4A05}
@media(max-width:430px){
  /* no telefone a faixa ocupa a largura e senta ACIMA da barra de salvar,
     respeitando a área segura do aparelho */
  .aviso{left:12px;right:12px;max-width:none;
    bottom:calc(12px + env(safe-area-inset-bottom,0px));font-size:14px}
  body.temBarraFixa .aviso{bottom:calc(74px + env(safe-area-inset-bottom,0px))}
}
@media print{.aviso{display:none!important}}


/* ── A FAMÍLIA DAS ANÁLISES: laudo, radar, DRIS e relatório (02/10) ───────
 * Quatro telas respondem à mesma pergunta — *este nutriente está na faixa?* —
 * e por isso compartilham o mesmo desenho: um painel com cabeçalho, a tabela
 * parâmetro / faixa / teor, a legenda dos três estados e a caixa do gráfico.
 *
 *     analise_solo_laudo_view.php     o produtor alcança
 *     analise_folha_radar_view.php    o produtor alcança
 *     analise_folha_dris_view.php     só consultor
 *     analise_solo_relatorio_view.php só consultor
 *
 * As quatro nasceram no TEMA ESCURO, cada uma com a sua cópia destas regras —
 * 40 das 42 classes do radar eram as mesmas do laudo. Divergência entre elas
 * aparece para o produtor, que abre as duas primeiras; e pelo teste da R19-26
 * isto é doença e não escolha: mudar a cor de um estado obrigaria a mexer em
 * quatro arquivos. A cor dos estados, em particular, é a MESMA pergunta em
 * quatro lugares.
 *
 * O cabeçalho de TABELA é o verde do sistema e vem de `.tblBox th`, numa fonte
 * só (30/09). O cabeçalho de BLOCO é `--thead`, que é o que a paleta declara
 * para bloco — e a diferença entre os dois é hierarquia: o bloco é mais leve
 * que a tabela que ele contém, senão dois verdes se empilham e nenhum manda.  */

/* o painel: `.panel` já vem do grupo do cartão (linha do `.card`) */
.panelHead{padding:11px 14px;border-bottom:1px solid var(--linha-3);
  background:var(--thead);color:var(--verde);font-weight:600;font-size:13px;
  text-align:center;letter-spacing:.02em}
/* A TABELA LARGA NÃO EMPURRA A PÁGINA. Sem isto ela alarga o documento
   inteiro: o cabeçalho do site e os filtros andam de lado junto com ela, e no
   telefone a tela fica torta. `overflow-x:auto` faz o `overflow-y` computar
   `auto` também — sem altura limitada isso não cria rolagem vertical nenhuma,
   e aqui não há nada grudado para quebrar (é o cuidado da seção 50, ao
   contrário). Estava escrito na tela do radar e NÃO VALIA: um comentário mal
   fechado engolia a regra inteira, e o comentário afirmava que ela
   funcionava (R19-56, achado em 02/10 medindo `getComputedStyle`). */
.panelBody{padding:14px;flex:1;display:flex;flex-direction:column;
  overflow-x:auto;-webkit-overflow-scrolling:touch}

/* A LEGENDA DOS ESTADOS. Ela existe porque a cor sozinha não distingue —
   `abaixo` e `tóxico` são o mesmo cereja, e por isso a célula também carrega a
   PALAVRA (`.sitTxt`). Cor como único sinal reprova em papel monocromático e
   para quem não a distingue. */
.legend{display:flex;gap:22px;flex-wrap:wrap;justify-content:center;
  padding:12px 18px;border-top:1px solid var(--linha-2);
  border-bottom:1px solid var(--linha-2);font-size:13px;font-weight:600;
  color:var(--tinta-2)}
.legend .it{display:inline-flex;align-items:center;gap:8px}
.legend .sq,.eqLegend .sq{width:13px;height:13px;border-radius:3px;
  display:inline-block}
.legend .sq.abaixo{background:var(--cereja)}
.legend .sq.dentro{background:var(--verde)}
.legend .sq.acima{background:var(--ambar)}
.legend .sq.toxico{background:var(--cereja);
  outline:2px solid var(--cereja);outline-offset:1px}

/* O TEOR e o seu estado. `acima` é ÂMBAR e não azul: azul não existe nesta
   paleta, e o significado de "acima da faixa" é atenção, que é o papel do
   âmbar (a cor segue o estado). `sem` é tinta-3, a ausência. */
.teor{font-weight:700;font-variant-numeric:tabular-nums}
.teor.abaixo,.teor.toxico{color:var(--cereja)}
.teor.dentro{color:var(--verde)}
.teor.acima{color:var(--ambar)}
.teor.sem{color:var(--tinta-3)}
.teor .sitTxt{display:block;font-size:9.5px;font-weight:700;letter-spacing:.04em;
  text-transform:uppercase;margin-top:1px;line-height:1.1}

/* A TABELA parâmetro / faixa / teor. O cabeçalho verde vem do `.tblBox th`:
   a tabela mora dentro de uma `.tblBox`, então aqui ficam só os deltas. */
table.paramTable{width:100%;flex:1;border-collapse:collapse;font-size:13px}
table.paramTable th,table.paramTable td{padding:9px 10px;
  border-bottom:1px solid var(--linha-2);text-align:center;vertical-align:middle}
table.paramTable td.param{text-align:left;font-weight:600;color:var(--tinta)}
table.paramTable td.faixa{color:var(--tinta-2);font-variant-numeric:tabular-nums;
  white-space:nowrap}
/* a categoria escrita de lado: economiza largura numa coluna que repete */
table.paramTable td.cat{font-size:11px;font-weight:700;color:var(--tinta-2);
  writing-mode:vertical-rl;transform:rotate(180deg);background:var(--linha-2);
  white-space:nowrap}

/* a caixa do gráfico: altura fixa porque o canvas não tem altura intrínseca */
.radarBox{height:460px;position:relative}

/* O ERRO DA CONSULTA, em cereja e sem timer — é pendência, não confirmação
   (R18-12). Está em 20 telas; a cópia local de cada uma divergia na cor. */
.alertErr{margin:14px 0;padding:14px;border-radius:var(--r);
  background:var(--cereja-lv);border:1px solid var(--cereja);
  color:var(--cereja);font-size:13px;font-weight:600}

@media(max-width:920px){
  .radarBox{height:380px}
}
@media(max-width:560px){
  .radarBox{height:330px}
  table.paramTable{font-size:14px}
  table.paramTable td.cat{font-size:12px}
}

/* NO PAPEL: o gráfico cabe inteiro e o bloco não se parte. A altura em `mm` é
   do papel, não da tela — o canvas em `px` sairia do tamanho errado. */
@media print{
  .radarBox{height:88mm!important}
  .panel,.panelBody,.radarBox{overflow:visible!important}
  .legend{font-size:8.5pt!important;padding:5px 10px!important;gap:16px!important}
  .panelHead{break-after:avoid!important;page-break-after:avoid!important}
  .panel,.legend{break-inside:avoid!important;page-break-inside:avoid!important}
  table.paramTable{font-size:8pt!important;min-height:0!important}
  table.paramTable th,table.paramTable td{padding:3px 6px!important}
}

/* ── A MATRIZ DO LAUDO E O PAINEL DE EQUILÍBRIO (02/10) ───────────────────
 * A segunda metade da "família das análises", e ela subiu para cá quando as
 * outras duas telas da família foram convertidas:
 *
 *   a MATRIZ            `.laudoTable` — teores x mínimos, uma coluna por
 *                       talhão. Está no laudo de solo E no DRIS de folha
 *   o EQUILÍBRIO        o painel da CTC com o gráfico, a proporção Ca:Mg:K e
 *                       a leitura da saturação. Está no laudo de solo E no
 *                       relatório de solo
 *   o TÍTULO DE SEÇÃO   `.secTitle`, nas três
 *
 * Pelo teste da R19-26 isto é doença e não escolha: mudar a cor de um estado
 * do teor, ou a altura do gráfico, obrigaria a mexer em três arquivos. Eram
 * cópias idênticas quando eu as encontrei — o que significa que ainda não
 * tinham divergido, e não que não fossem divergir.
 *
 * O cabeçalho verde das duas tabelas vem do `.tblBox th`, mais acima, numa
 * fonte só.                                                                */
/* ── o título de seção ──────────────────────────────────────────────── */
.secTitle{padding:12px 16px;text-align:center;font-weight:600;font-size:15px;
  color:var(--verde);background:var(--thead);border-top:1px solid var(--linha-3);
  border-bottom:1px solid var(--linha-3);letter-spacing:.02em}

/* ── o LAUDO em matriz: teores x mínimos, uma coluna por talhão ──────── */
.laudoWrap{padding:0}
.laudoScroll{overflow-x:auto;-webkit-overflow-scrolling:touch;margin-bottom:12px}
.laudoScroll:last-child{margin-bottom:0}
table.laudoTable{width:100%;border-collapse:collapse;font-size:12.5px;min-width:640px}
table.laudoTable th,table.laudoTable td{padding:8px 10px;text-align:center;
  white-space:nowrap;border-bottom:1px solid var(--linha-2)}
/* o cabeçalho verde vem do `.tblBox th`; `th.rl` é o rótulo de LINHA, que
   é cabeçalho de outra natureza — fica na faixa de bloco, não na de tabela */
table.laudoTable th.rl{text-align:left;color:var(--verde);font-weight:700;
  text-transform:uppercase;font-size:10.5px;background:var(--thead)}
table.laudoTable td.t{font-weight:700;font-variant-numeric:tabular-nums}
table.laudoTable td.m{color:var(--tinta-2);font-variant-numeric:tabular-nums}
/* o estado do teor vem do `.teor` do layout; aqui só o apelido curto `.t` */
table.laudoTable td.t.abaixo,table.laudoTable td.t.toxico{color:var(--cereja)}
table.laudoTable td.t.acima{color:var(--ambar)}
table.laudoTable td.t.dentro{color:var(--verde)}
table.laudoTable td.t.sem{color:var(--tinta-3)}

/* ── EQUILÍBRIO ─────────────────────────────────────────────────────── */
.eqGrid{display:grid;grid-template-columns:1fr 1fr;gap:16px;padding:16px}
.eqGrid1{grid-template-columns:minmax(0,560px);justify-content:center}
.eqRadarGrid{display:grid;grid-template-columns:1fr 1fr;gap:16px;padding:16px;
  align-items:stretch}
@media(max-width:920px){.eqRadarGrid{grid-template-columns:1fr}.eqGrid{grid-template-columns:1fr}}
/* os dois cabeçalhos lado a lado com a mesma cor e altura: o `.eqHd` é o
   `.panelHead` do painel de equilíbrio, e tem de ler igual ao do radar */
.eqRadarGrid .eqHd,.eqRadarGrid .panelHead{min-height:44px;display:flex;
  align-items:center;justify-content:center;font-size:14px}
.eqPanel{border:1px solid var(--linha-3);background:var(--carta);
  border-radius:var(--r-lg);overflow:hidden;display:flex;flex-direction:column}
.eqPanel.corr{border-color:var(--verde)}
.eqHd{padding:10px 14px;text-align:center;font-weight:600;font-size:14px;
  border-bottom:1px solid var(--linha-3);background:var(--thead);color:var(--verde)}
.eqTop{display:grid;grid-template-columns:1fr 1.4fr;gap:8px;padding:10px 14px;
  border-bottom:1px solid var(--linha-2);font-size:12.5px;color:var(--tinta)}
.eqTop .lab{color:var(--tinta-2);font-weight:600;text-transform:uppercase;
  font-size:10.5px;letter-spacing:.3px;text-align:left}
.eqTop .val{font-weight:700;font-variant-numeric:tabular-nums}
.ratioBox{display:flex;gap:6px;justify-content:flex-end;align-items:flex-end;
  flex-wrap:wrap}
.ratioBox .rc{display:flex;flex-direction:column;align-items:center;gap:1px;
  padding:3px 9px;border-radius:var(--r-sm);background:var(--verde-lv);
  border:1px solid var(--linha-3);font-weight:700;font-variant-numeric:tabular-nums;
  color:var(--tinta)}
.ratioBox .rc .rct{font-size:8.5px;font-weight:600;color:var(--tinta-2);
  text-transform:uppercase;letter-spacing:.3px}

.eqCorrBar{padding:12px 16px 14px;border-bottom:1px solid var(--linha-2);
  background:var(--verde-lv)}
.eqCorrTitle{text-align:center;font-weight:600;font-size:12px;color:var(--verde);
  margin-bottom:10px;text-transform:uppercase;letter-spacing:.3px}
.eqCorrOut{text-align:center;margin-top:10px;font-size:12.5px;font-weight:700;
  color:var(--tinta)}
.eqCorrOut .tag{display:inline-flex;align-items:center;gap:5px;margin:0 8px}
.eqCorrOut .dot{width:10px;height:10px;border-radius:2px;display:inline-block}
.eqCorrOut .muted{color:var(--tinta-2);font-weight:400;margin-right:4px}
.eqInputs{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:14px;
  max-width:920px;margin:0 auto;align-items:end}
@media(max-width:700px){.eqInputs{grid-template-columns:1fr 1fr}}
@media(max-width:420px){.eqInputs{grid-template-columns:1fr}}
/* min-width:0 nos dois: item de grade nasce com `min-width:auto`, que vale
   o min-content do <input> (~154px), e a coluna não encolhe abaixo disso
   por mais estreita que a tela fique (29/09) */
.eqInputs .f{display:flex;flex-direction:column;gap:4px;min-width:0}
.eqInputs label{font-size:10.5px;font-weight:600;color:var(--verde);
  text-transform:uppercase}
.eqInputs input{width:100%;min-width:0;padding:8px 10px;border-radius:var(--r-sm);
  border:1px solid var(--linha-3);background:var(--carta);color:var(--tinta);
  font-size:14px;font-weight:600;text-align:right}
.eqInputs input:focus{border-color:var(--verde);outline:2px solid var(--verde-lv)}
.presetRow{display:flex;gap:6px;flex-wrap:wrap}
.preset{padding:6px 10px;border-radius:var(--r-sm);border:1px solid var(--verde);
  background:var(--carta);color:var(--verde);font-weight:600;font-size:12px;
  cursor:pointer}
.preset:hover{background:var(--verde-lv)}
.preset.active{background:var(--verde);color:#fff;border-color:var(--verde)}

.eqBody{display:grid;grid-template-columns:170px 1fr;grid-template-rows:minmax(0,1fr);
  gap:12px;padding:14px;flex:1;min-height:0}
@media(max-width:560px){.eqBody{grid-template-columns:1fr}}
.eqInfo{display:flex;flex-direction:column;gap:5px;font-size:12.5px;color:var(--tinta)}
.eqInfo .row{display:flex;justify-content:space-between;gap:8px}
.eqInfo .row .k{color:var(--tinta-2)}
.eqInfo .row .v{font-weight:700;font-variant-numeric:tabular-nums}
.eqInfo .sub{margin-top:6px;padding-top:6px;border-top:1px solid var(--linha-2);
  font-size:10.5px;font-weight:600;color:var(--tinta-2);text-transform:uppercase;
  text-align:center}
.eqInfo .dot{display:inline-block;width:9px;height:9px;border-radius:2px;
  margin-right:6px;vertical-align:middle}
.eqInfo .interp{margin-top:6px;padding-top:6px;border-top:1px solid var(--linha-2);
  display:flex;flex-direction:column;gap:3px;text-align:center}
.eqInfo .interp .it{font-size:11px}
.eqInfo .interp .it b{display:block;font-size:12.5px;font-weight:700}
/* as três leituras da saturação: a cor segue o estado da paleta */
.badgeAlto{color:var(--cereja)}.badgeMedio{color:var(--ambar)}.badgeBaixo{color:var(--verde)}

.eqChart{display:flex;flex-direction:column;min-width:0;min-height:0;
  justify-content:center}
.eqChartTitle{text-align:center;font-weight:600;font-size:12.5px;
  color:var(--tinta-2);margin-bottom:6px}
.eqChartBox{position:relative;width:100%;height:320px;max-height:100%;
  min-height:0;flex:0 0 auto}
.eqLegend{display:flex;gap:14px;justify-content:center;flex-wrap:wrap;
  margin-top:8px;font-size:11.5px;font-weight:600;color:var(--tinta-2)}
.eqLegend .it{display:inline-flex;align-items:center;gap:6px}


/* ── AO CRIAR, O IRMÃO SE RECOLHE E O ANCESTRAL FICA (07/10/2026) ─────────
 * Medido no `cadastro_estrutura` antes de escrever isto: o formulário de
 * criação nascia FORA DA VISTA nos TRÊS níveis, numa janela de 900px —
 *
 *     grupo       topo a 1456px   (num contêiner depois da lista inteira)
 *     propriedade topo a 1971px
 *     talhão      topo a 2544px
 *
 * Tocar em "Novo" não mudava nada do que se vê. O talhão escapava por
 * acidente: o `focus()` que põe o cursor no campo novo rola a página junto.
 * Os outros dois não tinham salvação nenhuma — o formulário existia, e exigia
 * procurar.
 *
 * A REGRA, e ela é de árvore, não de tela: **ao criar, esconde os IRMÃOS e
 * mantém os ANCESTRAIS.** Quem está no caminho do que se cria leva
 * `.noCaminho`; o resto se recolhe enquanto `body.criando` estiver ligado.
 *
 *     criar GRUPO        nenhum grupo está no caminho → a lista toda recolhe,
 *                        e sobra o formulário
 *     criar PROPRIEDADE  o grupo dela fica (é o contexto: em QUAL grupo), os
 *                        outros grupos e as outras propriedades recolhem
 *     criar TALHÕES      o grupo e a propriedade ficam; os talhões já salvos
 *                        recolhem, e sobra o lote que se está digitando
 *
 * POR QUE NÃO SÓ ROLAR ATÉ O FORMULÁRIO: rolar resolve o "não vejo" e deixa o
 * "não sei onde estou". Com catorze grupos abertos acima, o formulário novo
 * aparece no meio de uma parede de cadastro alheio. Esconder o irmão responde
 * às duas perguntas de uma vez — e é reversível: sai do modo, a lista volta
 * inteira, com o novo dentro.
 *
 * A VOLTA É PARTE DA REGRA: ela tem de acontecer ao SALVAR e ao CANCELAR. Um
 * modo em que só o sucesso devolve a tela prende quem desistiu.             */
body.criando #lista > .grupo:not(.noCaminho){display:none}
body.criando .grupo.noCaminho .prop:not(.noCaminho){display:none}
/* o lote de talhões novos nasce ABERTO (`talhaoAberto` decide por `id == null`),
   então "aberto" é exatamente o que se está digitando */
body.criando .prop.noCaminho .talhao:not(.aberto){display:none}
/* e o título do nível fica: sem ele o formulário começa sem dizer o que é */
body.criando #lista > .detTit{display:block}

/* ── O CAMINHO DE VOLTA, ABAIXO DOS CARDS (07/10/2026) ───────────────────
 * *"o fim do último card é o fim da tela"* — e quem acabou de cadastrar não
 * tem onde apertar. O bloco fica FORA do card de propósito: dentro, ele
 * pareceria uma ação daquele talhão; fora, é o fim do trabalho.
 * Aparece só quando há algo aberto: botão que está sempre lá e quase nunca
 * serve ensina a ignorar botão.                                           */
.acaoVoltar{display:flex;align-items:center;gap:12px;margin-top:18px;
  padding-top:16px;border-top:1px solid var(--linha-3)}
.acaoVoltar[hidden]{display:none}
@media(max-width:430px){
  /* no telefone ele ocupa a largura: alvo grande é o que o dedo acha */
  .acaoVoltar{flex-direction:column;align-items:stretch;text-align:center}
  .acaoVoltar .btn{width:100%}
}
@media print{ .acaoVoltar{display:none!important} }
