/* Dashboard — plataforma-api. Resto dos tokens vem de design.css. */

body { background: var(--fundo); }

/* ---------------------------------------------------------------------
   Topo — logo, navegação principal, busca/notificações/conta.
   --------------------------------------------------------------------- */
.pa-topo {
  position: sticky;
  top: 0;
  z-index: 30;
  display: flex;
  align-items: center;
  gap: 28px;
  padding: 14px 32px;
  /* 01/09: pedido do Lincoln -- "a topbar na cor preta", acompanhando o
     fundo da página que virou preto de verdade (--fundo). Era #101010. */
  background: var(--fundo);
  border-bottom: 1px solid rgba(255,255,255,0.08);
  transition: background-color 0.32s ease, border-color 0.32s ease;
}
/* 31/08: a topbar tinha ficado escura só DENTRO do módulo Entrega (classe
   `.entrega-ativa`, ligada/desligada em dashboard.js). Lincoln viu ao vivo e
   pediu pra ficar "quase full preta" e valer como cor GERAL da navbar, não
   só dentro da Entrega — por isso o escuro (agora ainda mais preto, #101010
   em vez do #232322 de antes) virou a cor PADRÃO da topbar acima, e as
   variantes claras de texto/ícone que só valiam com `.entrega-ativa` viraram
   a cor padrão dos elementos abaixo. A função `definirTopoEscurecidoEntrega()`
   (dashboard.js) continua sendo chamada nos mesmos lugares de antes, mas
   agora é inofensiva (liga/desliga uma classe sem nenhum efeito visual
   próprio) — não vale a pena arriscar remover as chamadas agora. */
.pa-topo.entrega-ativa { background: var(--fundo); }

.pa-marca { display: flex; align-items: center; gap: 12px; flex: 0 0 auto; }
.pa-marca-logo { height: 30px; width: auto; object-fit: contain; }
.pa-marca-tagline {
  font-size: 11px; font-weight: 700; color: rgba(255,255,255,0.5); letter-spacing: 0.2px;
  line-height: 1.15; padding-left: 12px; border-left: 1px solid rgba(255,255,255,0.16);
  max-width: 90px;
}

.pa-nav { display: flex; align-items: center; gap: 26px; flex: 1; }
.pa-nav-item {
  position: relative;
  background: transparent; border: none; padding: 6px 0;
  font-size: 14.5px; font-weight: 700; color: rgba(255,255,255,0.65); cursor: pointer;
}
.pa-nav-item:hover { color: #fff; }
.pa-nav-item.ativo { color: var(--acento); }
.pa-nav-dot { display: inline-block; width: 5px; height: 5px; border-radius: 50%; background: var(--acento); margin-left: 5px; vertical-align: middle; }

.pa-topo-direita { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }
.pa-topo-icone-btn {
  width: 38px; height: 38px; border-radius: 50%;
  border: 1px solid transparent; background: transparent; color: rgba(255,255,255,0.65);
  display: flex; align-items: center; justify-content: center; cursor: pointer;
}
.pa-topo-icone-btn:hover { background: rgba(255,255,255,0.12); color: #fff; }
.pa-topo-icone-btn svg { width: 19px; height: 19px; }

.pa-conta { position: relative; margin-left: 6px; }
.pa-conta-botao {
  display: flex; align-items: center; gap: 10px;
  background: transparent; border: none; padding: 4px 6px 4px 4px; border-radius: var(--raio-pill);
  cursor: pointer;
}
.pa-conta-botao:hover { background: rgba(255,255,255,0.12); }
.pa-avatar {
  width: 34px; height: 34px; border-radius: 50%;
  background: var(--acento); color: var(--acento-texto);
  display: flex; align-items: center; justify-content: center;
  font-size: 12.5px; font-weight: 800; flex: 0 0 auto;
}
.pa-conta-texto { display: flex; flex-direction: column; line-height: 1.15; text-align: left; }
.pa-conta-nome { font-size: 13.5px; font-weight: 800; color: #fff; max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pa-conta-sub { font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.5); }
.pa-conta-chevron { width: 14px; height: 14px; color: rgba(255,255,255,0.5); flex: 0 0 auto; }

/* 31/08, item 11 do backlog ("todos os pop-ups... fade"): achado enquanto
   procurava outras superfícies ainda abruptas além do popup do mapa (o
   confirmado must-fix, ver .pa-mapa-ponto-popup acima) — este menu também
   usava `[hidden]` puro. Correção trivial (só entrada, sem reescrever a
   lógica de abrir/fechar em JS — que já funciona bem via `hidden` direto,
   inclusive o "clicar fora fecha"): um "pop" leve só na ENTRADA via
   animação CSS em `:not([hidden])` — `[hidden]` continua tirando o
   elemento do layout instantaneamente na saída (não dá pra animar a saída
   sem trocar `hidden` por classe, o que exigiria reescrever o listener de
   "clicar fora" — fora de escopo pra esta correção pontual). */
.pa-conta-dropdown {
  position: absolute; top: calc(100% + 8px); right: 0; min-width: 160px;
  background: var(--superficie); border: 1px solid var(--borda); border-radius: var(--raio-m);
  box-shadow: var(--sombra-2); padding: 6px; z-index: 40;
}
.pa-conta-dropdown:not([hidden]) { animation: pa-conta-dropdown-pop 0.16s cubic-bezier(.2,.9,.3,1.2); }
@keyframes pa-conta-dropdown-pop { from { opacity: 0; transform: translateY(-6px) scale(0.96); } to { opacity: 1; transform: translateY(0) scale(1); } }
@media (prefers-reduced-motion: reduce) {
  .pa-conta-dropdown:not([hidden]) { animation: none; }
}
.pa-conta-dropdown button {
  display: flex; align-items: center; gap: 8px; width: 100%;
  background: transparent; border: none; padding: 10px 12px; border-radius: var(--raio-p);
  font-size: 13.5px; font-weight: 700; color: var(--texto); cursor: pointer; text-align: left;
}
.pa-conta-dropdown button:hover { background: var(--erro-fundo); color: var(--erro); }
.pa-conta-dropdown button svg { width: 16px; height: 16px; }

/* ---------------------------------------------------------------------
   Conteúdo — largo pra visão geral (dashboard), estreito pra fluxos
   focados de uma tarefa só (entrega, em breve).
   --------------------------------------------------------------------- */
.pa-conteudo { max-width: 1180px; margin: 0 auto; padding: 32px 32px 72px; }
.pa-largura-leitura { max-width: 640px; margin: 0 auto; }

.pa-tela { animation: pa-entrar var(--duracao-tela) ease both; }
@keyframes pa-entrar { from { opacity: 0; transform: translateY(14px) scale(0.98); } to { opacity: 1; transform: translateY(0) scale(1); } }
.pa-tela[hidden] { display: none; }
/* Saída (mostrarTela em dashboard.js acrescenta esta classe na tela atual
   antes de esconder e revelar a próxima) — junto com a animação de entrada
   acima, forma a transição de fade "disfarçando" a troca em qualquer
   mostrarTela() do projeto, não só numa tela específica.
   Pedido do Lincoln (3ª vez): mesmo depois de aumentar duração/deslocamento
   e corrigir um bug real na 2ª rodada (ver trocarConteudoComFade em
   dashboard.js), ele continuou sem ver nenhuma animação. Por isso, de
   propósito, esse fade de tela/passo NÃO respeita mais
   `prefers-reduced-motion` (diferente do resto do projeto, que continua
   respeitando essa preferência normalmente) — é a hipótese mais provável
   pra "nenhuma animação aparece em lugar nenhum" mesmo com o código
   corrigido: um ambiente com animações do sistema desligadas (comum em
   Área de Trabalho Remota/VM do Windows) faz o Chrome reportar
   `prefers-reduced-motion: reduce` sozinho, o que desligava esse efeito por
   completo sem ninguém ter pedido isso. Como é uma ferramenta interna, e o
   próprio Lincoln pediu esse fade especificamente (repetidas vezes), essa
   troca específica ganhou prioridade sobre a preferência do sistema.
   Também ganhou mais um reforço visual: além de opacidade/deslocamento,
   agora também escala levemente (0.98→1), pra ficar ainda mais visível. */
.pa-tela-saindo { animation: none; opacity: 0; transform: translateY(-14px) scale(0.965); transition: opacity 0.3s ease, transform 0.3s ease; pointer-events: none; }

/* Mesmo fade, mas pra troca de CONTEÚDO dentro de uma tela só (ex.: os
   passos do fluxo de Entrega — robô/menu/destinos/ativa — que não passam
   por mostrarTela(), já que a tela em si não muda, só o miolo dela). Pedido
   do Lincoln: "coloque uma animação de fade nas trocas de páginas" — os
   passos internos também contam como "página" na cabeça do usuário, então
   ganham o mesmo tratamento, via trocarConteudoComFade() em dashboard.js.
   Valores idênticos aos de cima de propósito, pra ficar com a mesma cara
   em todo o projeto (inclusive não respeitar `prefers-reduced-motion` — ver
   comentário acima). */
.pa-fade-saida { opacity: 0; transform: translateY(-14px) scale(0.965); transition: opacity 0.3s ease, transform 0.3s ease; pointer-events: none; }
.pa-fade-entrada { animation: pa-entrar var(--duracao-tela) ease both; }

/* ---------------------------------------------------------------------
   Revelação ao entrar na tela / ao rolar — texto do hero, KPIs e os
   cards das colunas "sobem" de baixo pra cima com fade, em vez de
   simplesmente aparecerem. `configurarRevelacoes()` (dashboard.js) observa
   cada `.pa-reveal` com IntersectionObserver e acrescenta `.visivel` na
   primeira vez que o elemento entra na tela — o que já cobre os dois casos
   pedidos: elementos que começam visíveis (hero, KPIs) revelam quase que
   imediatamente ao carregar/atualizar a página, e os mais abaixo (cards das
   colunas) revelam conforme o usuário rola até eles.
   --------------------------------------------------------------------- */
.pa-reveal {
  opacity: 0;
  transform: translateY(34px);
  transition: opacity 0.65s ease, transform 0.65s cubic-bezier(.16,.84,.44,1);
}
.pa-reveal.visivel { opacity: 1; transform: translateY(0); }
@media (prefers-reduced-motion: reduce) {
  .pa-reveal { opacity: 1; transform: none; transition: none; }
}

/* ---------------------------------------------------------------------
   Hero — saudação (varia com o horário) + ilustração de robô.
   --------------------------------------------------------------------- */
/* Full-bleed: quebra pra fora do .pa-conteudo (max-width 1180px) e ocupa a
   largura inteira da janela, igual referência (foto de ponta a ponta, sem
   cartão/borda). */
.pa-hero {
  position: relative;
  left: 50%;
  width: 100vw;
  margin-left: -50vw;
  /* Cancela o padding-top do .pa-conteudo (32px) — sem isso, uma faixa da
     cor de fundo da página aparecia entre a barra de navegação e a foto. */
  margin-top: -32px;
  display: flex; align-items: center;
  /* 01/09: pedido do Lincoln -- "diminuir o tamanho do banner até a linha
     tracejada" (referência desenhada à mão marcando uma altura bem menor,
     terminando perto do topo dos 3 cards de KPI). Era 420px, foi pra 300px.
     Na mesma tarde ele pediu "aumenta uns 25%" -- 375px -- e depois "aumenta
     mais, uns 40%" -- 525px. A partir daqui a altura vira uma variável só
     (--pa-hero-h, design.css) porque `.pa-kpis` precisa da MESMA altura pra
     calcular o quanto sobe por cima do banner (ver comentário lá). */
  min-height: var(--pa-hero-h);
  background-color: #0a0908; /* enquanto a foto carrega */
  margin-bottom: 0;
  overflow: hidden;
}
/* A foto agora é um <img> real (em vez de background-image) pra dar corda
   pro efeito de parallax no scroll (ver dashboard.js, configurarParallaxHero):
   a caixa (.pa-hero-imgwrap) é mais alta que a área visível (130%) e o
   excesso — o "corpo" do robô que fica cortado embaixo em repouso — só
   aparece conforme a página rola, quando o JS desloca a caixa pra cima
   dentro da área visível (que continua com altura fixa e overflow:hidden).
   Dentro dela ficam DUAS imagens sobrepostas (não uma só): são os banners
   alternados (configurarBannersAlternados em dashboard.js) — a cada
   intervalo, a próxima foto entra com um crossfade por cima da atual.
   Cada imagem tem seu próprio object-position (definido por JS, cada foto
   tem o robô numa posição vertical diferente no quadro original). */
.pa-hero-imgwrap {
  position: absolute; left: 0; top: 0;
  width: 100%; height: 130%;
  z-index: 0;
  transform: translateY(0);
  will-change: transform;
}
/* Zoom sutil e contínuo ("respirando") — pedido do Lincoln: "fazer um
   efeito zoom nessa imagem do banner, mas apenas um pouco, cerca de 10% e
   depois volta". Anima na própria `.pa-hero-img` (a foto), não em
   `.pa-hero-imgwrap` (o wrapper) — o wrapper já tem seu `transform`
   controlado direto por JS pro parallax de scroll (configurarParallaxHero
   em dashboard.js); animar `transform` nele colidiria com esse JS (CSS
   animation e `element.style.transform` do JS disputariam a mesma
   propriedade). Como são elementos diferentes (uma foto dentro do
   wrapper), os dois efeitos se somam sem conflito. `alternate` faz ir até
   110% e voltar suavemente (sem "pulo" no final do ciclo).
   2ª rodada: Lincoln continuou reportando que "não roda" mesmo depois de
   confirmado (via medição direta do `transform` computado ao longo do
   tempo) que a animação realmente está tocando o tempo todo — a explicação
   mais provável não é um bug de código, é que 10% de zoom espalhado em 7s
   por perna (14s o ciclo completo) é sutil o bastante pra passar
   despercebido numa olhada rápida no painel. Duração reduzida pra 4s por
   perna (8s o ciclo completo) — mesma amplitude de 10%, só mais rápida de
   perceber — mantendo suave. As duas camadas do banner alternado
   (`heroImgA`/`heroImgB`, ver `configurarBannersAlternados` em
   dashboard.js) sempre ficam no MESMO instante da animação uma da outra
   (nenhuma reinicia por conta própria, ambas correm desde o carregamento
   da página), então mudar esta duração não desalinha o zoom com a troca
   de foto — continuam sincronizadas em qualquer duração. */
.pa-hero-img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover; object-position: 100% 22%;
  opacity: 0;
  transition: opacity 1.1s ease;
  pointer-events: none;
  animation: pa-hero-zoom 9s ease-in-out infinite alternate;
}
.pa-hero-img.ativa { opacity: 1; }
/* 26/08, 3ª rodada: Lincoln pediu "diminuir o tamanho do zoom para ele
   ficar beeem sutil e mais devagar" -- amplitude reduzida de 10% pra 3,5%
   (scale 1 -> 1.035) e duração de cada perna de 4s pra 9s (18s o ciclo
   ida-e-volta completo, era 8s). */
@keyframes pa-hero-zoom {
  from { transform: scale(1); }
  to { transform: scale(1.035); }
}
/* 26/08: Lincoln reportou de novo "o zoom sutil ainda nao esta
   funcionando, o vai e volta" e "ao trocar, uma animacao suave deve
   ficar entre elas" (o crossfade tambem parecia nao suavizar) -- mesmo
   padrao ja diagnosticado uma vez neste projeto pra outra animacao (ver
   o comentario grande de SEM_MOVIMENTO em dashboard.js): o navegador
   dele, rodando numa VM/Area de Trabalho Remota, as vezes reporta
   "prefers-reduced-motion: reduce" por conta propria, sem ninguem ter
   escolhido isso deliberadamente -- e essa regra abaixo desligava tanto
   o crossfade (transition) quanto o zoom (animation) de uma vez so
   quando isso acontece, o que bate exatamente com os dois sintomas
   relatados juntos. Como isto e uma ferramenta interna e ele ja pediu
   esse efeito repetidas vezes, o banner do Inicio passou a ignorar essa
   preferencia do sistema (removida a regra que desligava
   transition/animation em .pa-hero-img). */
/* Reforço de contraste sobre a foto — a própria imagem já é escura à
   esquerda, isso aqui é só uma garantia pra qualquer recorte de tela. */
.pa-hero::before {
  content: '';
  position: absolute; inset: 0;
  /* 03/09, pedido do Lincoln: "o banner não termina o lado esquerdo, tem um
     fade e aí o banner termina de ser exibido pela direita mas pela esquerda
     não" -- antes o degradê começava em 62% de opacidade (rgba(6,6,5,0.62)),
     nunca chegando a preto de verdade -- a foto sempre ficava visível por
     baixo do texto, só um pouco escurecida, então o lado esquerdo nunca
     "terminava"/fechava em preto sólido como a faixa da base (.pa-hero::after,
     que vai até var(--fundo) 100% opaco) já fazia. Primeiro stop trocado pra
     `var(--fundo)` (preto sólido, mesma cor da faixa de baixo) -- agora o
     lado esquerdo também fecha em preto de verdade bem na borda, só o
     degradê continua abrindo pra foto nítida do mesmo jeito de antes. */
  background: linear-gradient(90deg, var(--fundo) 0%, rgba(6,6,5,0.35) 45%, transparent 72%);
  pointer-events: none;
  z-index: 1;
}
/* 01/09: pedido do Lincoln -- "mudar o fundo de cinza pra preto mesmo, com
   o banner terminando em um fade degradê que dá nesse fundo". Faixa extra
   colada na base do banner, esmaecendo a foto até --fundo (preto) em vez
   de cortar seco -- é o que dá a sensação de a foto "se dissolver" no
   fundo da página, em vez de uma linha reta entre foto e fundo.
   Mesma tarde, ajuste fino: a faixa começava alta demais (45% da altura do
   banner) -- por volta do momento em que os cards de KPI apareciam
   (puxados pra cima, ver `.pa-kpis` abaixo), o fundo atrás deles já tinha
   escurecido quase todo (medido via Playwright: o topo dos cards caía uns
   60% dentro da faixa de fade). O Lincoln pediu explicitamente "o banner
   tem que começar a acabar só quando estiver abaixo dos cards" -- faixa
   reduzida pra 20% (só a base mesmo) pra sobrar foto nítida por trás da
   maior parte dos cards, escurecendo pra preto só perto da base deles em
   diante. */
.pa-hero::after {
  content: '';
  position: absolute; left: 0; right: 0; bottom: 0; height: 20%;
  background: linear-gradient(to bottom, rgba(0,0,0,0) 0%, var(--fundo) 100%);
  pointer-events: none;
  z-index: 1;
}
.pa-hero-inner {
  position: relative; z-index: 2;
  width: 100%; max-width: 1180px; margin: 0 auto;
  padding: 0 32px;
}
.pa-hero-texto { min-width: 0; max-width: 620px; }
.pa-hero-saudacao { font-size: 72px; line-height: 1.04; font-weight: 800; margin: 0 0 16px; letter-spacing: -1px; color: #fff; }
.pa-hero-sub { font-size: 18px; color: rgba(255,255,255,0.75); margin: 0 0 30px; font-weight: 600; }
.pa-hero-texto .pa-btn svg { width: 16px; height: 16px; }

/* ---------------------------------------------------------------------
   Cabeçalho "de modo" (Entrega, Cruzeiro, Mapa, Demais funções, e os
   outros itens de nav ainda em construção) — mesma referência visual da
   Nubank pedida pelo Lincoln: imagem de fundo, título grande no canto
   esquerdo nomeando o modo. Reaproveita as fotos do hero do Início (ainda
   não existe uma foto própria por modo) com um overlay bem mais escuro —
   aqui o fundo é só ambientação, o conteúdo real é o cartão abaixo, então
   não precisa (nem deve) competir em contraste com o hero do Início.
   --------------------------------------------------------------------- */
.pa-modo-hero {
  position: relative;
  left: 50%;
  width: 100vw;
  margin-left: -50vw;
  margin-top: -32px;
  min-height: 220px;
  display: flex;
  align-items: center;
  overflow: hidden;
  margin-bottom: 28px;
}
.pa-modo-hero-fundo {
  position: absolute; inset: 0;
  background: linear-gradient(90deg, rgba(6,6,5,0.86) 0%, rgba(6,6,5,0.72) 55%, rgba(6,6,5,0.55) 100%),
    url('/plataforma-api/imagens/hero-inicio-2.jpg');
  background-size: cover;
  background-position: 100% 20%;
}
.pa-modo-hero-conteudo {
  position: relative; z-index: 1;
  width: 100%; max-width: 1180px; margin: 0 auto;
  padding: 0 32px;
}
.pa-modo-hero-titulo { font-size: 40px; line-height: 1.05; font-weight: 800; margin: 0 0 8px; letter-spacing: -0.6px; color: #fff; display: flex; align-items: center; }
.pa-modo-hero-titulo .barra { width: 5px; height: 30px; background: var(--acento); border-radius: 2px; display: inline-block; margin-right: 14px; }
.pa-modo-hero-sub { font-size: 14.5px; color: rgba(255,255,255,0.72); margin: 0; font-weight: 600; }
.pa-modo-corpo { padding-bottom: 8px; }
@media (max-width: 1024px) {
  .pa-modo-hero { min-height: 180px; margin-top: -24px; }
  .pa-modo-hero-conteudo { padding: 0 20px; }
  .pa-modo-hero-titulo { font-size: 28px; }
}

/* ---------------------------------------------------------------------
   Entrega — quadro cheio (passos "menu" e "robo"): componente próprio pra
   bater com a referência visual que o Lincoln mandou — foto de fundo
   cobrindo a tela toda, título grande à esquerda, cards à direita e uma
   barra de status do robô da sessão fixa embaixo. Os dois passos
   compartilham esse mesmo quadro (só o miolo — #entregaHeroInterno — troca
   de conteúdo, com fade, ao alternar entre "escolher robô" e "menu de
   ações"): pedido do Lincoln (2ª rodada de feedback) — escolher o robô tem
   que acontecer "naquela telinha toda formatada", um card abrindo o outro,
   não numa tela separada. Os passos seguintes (destinos/ativa) continuam
   com o .pa-modo-hero enxuto + corpo branco, que já foi validado com o
   Lincoln antes. Decisão confirmada: o menu principal do topo
   (Início/Robôs/Chamados/Mapas/Tarefas) continua do jeito que está — só o
   conteúdo desta tela mudou.
   --------------------------------------------------------------------- */
.pa-entrega-menu {
  position: relative;
  left: 50%;
  width: 100vw;
  margin-left: -50vw;
  margin-top: -32px;
  /* Cancela também o padding-bottom do .pa-conteudo (72px) — pedido do
     Lincoln: "o background e as informações devem aparecer na tela toda,
     sem essa faixa cinza". Sem isso, quando o conteúdo (foto + cards +
     barra de status) é mais baixo que a janela, sobrava um respiro da cor
     de fundo da página entre a barra de status e o rodapé da tela — em vez
     disso, a foto agora estica até preencher a altura visível toda (100vh
     menos a altura da barra de topo — 71px no desktop, 67px no tablet/
     celular, onde o `.pa-topo` tem menos padding). */
  margin-bottom: -72px;
  min-height: calc(100vh - 71px);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.pa-entrega-menu-fundo {
  position: absolute; inset: 0;
  /* Foto enviada pelo Lincoln especificamente pra este módulo ("Imagem de
     fundo do módulo Entrega") — substitui a hero-inicio.jpg genérica que
     estava aqui antes (reaproveitada só como estilo provisório). */
  background:
    linear-gradient(100deg, rgba(6,6,5,0.82) 0%, rgba(6,6,5,0.5) 45%, rgba(6,6,5,0.25) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.9) 0%, rgba(6,6,5,0.1) 32%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/hero-entrega.jpg');
  background-size: cover;
  background-position: 50% 40%;
  /* 28/08: esta transição de opacity ficou "morta" por um bom tempo (a
     regra `.sem-foto` que a acionava nunca chegou a ser usada de fato —
     ver histórico). Agora tem uso de verdade: o Lincoln pediu uma animação
     de troca em toda mudança de foto de fundo (vazia<->ativa, ou trocar de
     robô) — `atualizarFundoEntrega()` (dashboard.js) liga `.pa-fundo-
     trocando` (abaixo), espera este fade-out terminar, só ENTÃO troca a
     imagem, e tira a classe de novo pro fade-in. A duração aqui precisa
     bater com `DURACAO_TROCA_FUNDO_MS` em dashboard.js. */
  transition: opacity 0.35s ease;
}
.pa-entrega-menu-fundo.pa-fundo-trocando {
  opacity: 0;
}

/* 28/08: Lincoln pediu pra trocar o fundo genérico do módulo por uma foto
   cinematográfica do robô específico durante a EXECUÇÃO da entrega ("o
   background de entrega, quando for um BellaBot, vai mudar pra essa" +
   "ficar com essa pegada durante a execução da tarefa") — por enquanto só
   o BellaBot tem essa foto (os outros modelos continuam com o fundo
   genérico `hero-entrega.jpg` de sempre, até ele mandar fotos equivalentes
   dos outros modelos). A classe é ligada/desligada em
   atualizarFundoEntrega() (dashboard.js) sempre que o passo muda pra
   "ativa" (ou sai dele) — não dá pra confiar só na renderização inicial
   porque, na troca normal de passo (destinos->ativa, ao confirmar "Iniciar
   entrega"), só o MIOLO da tela recebe fade; a foto de fundo é propositalmente
   preservada sem recriar pra não "piscar" entre passos (ver comentário
   grande em renderizarEntrega()) — então o fundo precisa ser atualizado à
   parte, no mesmo momento da troca de passo. */
.pa-entrega-menu-fundo.fundo-bellabot-ativa {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-bellabot.jpg');
  background-size: cover;
  background-position: 50% 35%;
}
/* 28/08, correção de escopo vazia/ativa: restaurante vazio (sem robô), pra
   quando a tarefa do BellaBot ainda está sendo montada. O Lincoln mandou
   uma foto só e disse "Kettybot e bellabot" -- serve pros dois modelos (a
   entrada 'kettybot' em FUNDO_ENTREGA_POR_MODELO, dashboard.js, reaproveita
   esta mesma classe, mesmo raciocínio já usado pro T300 no T150/T600). */
.pa-entrega-menu-fundo.fundo-bellabot-vazia {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-bellabot-vazia.jpg');
  background-size: cover;
  background-position: 50% 35%;
}
/* 28/08, mesma rodada: T300 (reaproveitada pro T150/T600 -- ver comentário
   em resolverClasseFundoEntregaAtiva(), dashboard.js). Foto quadrada
   (1536x1024, corredor de armazém) -- posição um pouco mais alta (28%) que
   a do BellaBot porque o robô nesta foto já fica bem no centro vertical do
   quadro, diferente da foto do Bella (mais larga, robô mais pra baixo). */
.pa-entrega-menu-fundo.fundo-t300-ativa {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-t300.jpg');
  background-size: cover;
  background-position: 50% 28%;
}
/* 28/08, correção de escopo vazia/ativa: mesmo corredor de armazém vazio,
   pra quando a tarefa do T300/T150/T600 ainda está sendo montada. */
.pa-entrega-menu-fundo.fundo-t300-vazia {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-t300-vazia.jpg');
  background-size: cover;
  background-position: 50% 28%;
}
/* 28/08, rodada seguinte: FlashBot (corredor de hotel/lobby, robô já
   parado no centro do quadro com a trilha/pin amarelos apontando o
   destino -- a própria foto já remete à identidade visual do "trajeto"
   que o app desenha no mapa). */
.pa-entrega-menu-fundo.fundo-flashbot-ativa {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-flashbot.jpg');
  background-size: cover;
  background-position: 50% 38%;
}
/* 28/08, rodada seguinte: KettyBot (restaurante escuro, robô já com a
   tela de rosto "acordada" + trilha/pin amarelos igual ao FlashBot). */
.pa-entrega-menu-fundo.fundo-kettybot-ativa {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-kettybot.jpg');
  background-size: cover;
  background-position: 50% 38%;
}
/* 28/08, rodada seguinte: CC1 (robô de limpeza, corredor de supermercado
   com câmaras refrigeradas à direita + trilha/pin amarelos). Robô mais
   baixo/largo que os outros já cadastrados -- posição um pouco mais baixa
   (42%) pra não cortar o topo das prateleiras/câmaras ao redor. */
.pa-entrega-menu-fundo.fundo-cc1-ativa {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-cc1.jpg');
  background-size: cover;
  background-position: 50% 42%;
}
.pa-entrega-menu-fundo.fundo-cc1-vazia {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-cc1-vazia.jpg');
  background-size: cover;
  background-position: 50% 42%;
}
/* 28/08, rodada seguinte: MT1 (robô de limpeza/varrição, estacionamento
   subterrâneo com trilha/pin amarelos -- mesma identidade visual da faixa
   de sinalização do próprio estacionamento). */
.pa-entrega-menu-fundo.fundo-mt1-ativa {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-mt1.jpg');
  background-size: cover;
  background-position: 50% 40%;
}
.pa-entrega-menu-fundo.fundo-mt1-vazia {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-mt1-vazia.jpg');
  background-size: cover;
  background-position: 50% 40%;
}
/* 28/08, rodada seguinte: PuduBot2 (laboratório/farmácia, bancadas com
   microscópio e armários de vidro ao fundo + trilha/pin amarelos).
   Posição um pouco mais alta (38%) pra não cortar as bancadas no topo da
   foto. */
.pa-entrega-menu-fundo.fundo-pudubot2-ativa {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-pudubot2-ativa.jpg');
  background-size: cover;
  background-position: 50% 38%;
}
.pa-entrega-menu-fundo.fundo-pudubot2-vazia {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-pudubot2-vazia.jpg');
  background-size: cover;
  background-position: 50% 38%;
}
/* 28/08, correção de escopo (mesmo dia): o Lincoln esclareceu que o par de
   fotos de cada modelo tem papéis diferentes -- "vazia" (ambiente sem o
   robô) enquanto a tarefa ainda está sendo MONTADA (menu de ações,
   destinos), "ativa" (com o robô) só quando ela já está em andamento ou
   concluída. A ideia anterior (universal, só na tela de escolher robô) foi
   descartada; esta classe agora é POR MODELO, ligada em
   atualizarFundoEntrega() (dashboard.js) junto com o resto da lógica. */
.pa-entrega-menu-fundo.fundo-flashbot-vazia {
  background:
    linear-gradient(100deg, rgba(6,6,5,0.75) 0%, rgba(6,6,5,0.4) 45%, rgba(6,6,5,0.2) 100%),
    linear-gradient(0deg, rgba(6,6,5,0.85) 0%, rgba(6,6,5,0.15) 30%, rgba(6,6,5,0) 55%),
    url('/plataforma-api/imagens/entrega-fundo-flashbot-vazia.jpg');
  background-size: cover;
  background-position: 50% 38%;
}
/* Envolve .pa-entrega-menu-conteudo + .pa-entrega-menu-status — é o alvo
   do fade quando "menu"/"robo" trocam entre si (trocarConteudoComFade em
   dashboard.js): só este miolo re-renderiza, a foto de fundo (.pa-entrega-
   menu-fundo, irmã dele, fora deste wrapper) nunca é recriada, então não
   "pisca" — só os cards e a barra de status é que trocam, dando a
   sensação de um card abrindo o outro na mesma tela. `flex:1` + coluna
   repete a mesma estrutura que .pa-entrega-menu já tinha antes de existir
   este wrapper, pra continuar preenchendo até o rodapé sem sobra cinza. */
.pa-entrega-menu-interno {
  position: relative; z-index: 1;
  flex: 1;
  display: flex;
  flex-direction: column;
}
.pa-entrega-menu-conteudo {
  flex: 1;
  /* 1180px bastava enquanto só existia a coluna estreita de cards (até
     520px) ao lado do título. Com o painel dos passos "destinos"/"ativa"
     (até 640px — precisa de espaço pro mapa/etapas/comandos), bug real
     encontrado nesta rodada: 1180px menos padding sobra só ~1116px de
     espaço pros dois lados, e título(até 540px) + gap(28px) + painel
     (640px) = 1208px — não cabe, quebra pra duas linhas. O detalhe: o
     título raramente chega aos 540px de verdade (a largura dele encolhe
     pro texto real), então esse estouro dependia do TAMANHO EXATO do
     subtítulo de cada passo — "destinos" cabia numa linha só, "ativa" não,
     por uma diferença de menos de 40px entre os dois textos. Resultado:
     painel e título apareciam lado a lado num passo e empilhados no outro,
     sem nenhuma mudança de código entre eles — só o texto do subtítulo
     diferia. 1320px garante espaço (1256px úteis) pro pior caso (540+28+
     640=1208) com folga, então o layout não fica na dependência do
     tamanho exato de cada subtítulo. `.pa-entrega-menu-status-interno`
     (mais abaixo) precisa do MESMO valor, senão as colunas do título/
     painel não alinhariam mais com as da barra de status embaixo. */
  width: 100%; max-width: 1440px; margin: 0 auto;
  padding: 48px 32px 28px;
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  justify-content: space-between;
  gap: 28px;
}
.pa-entrega-menu-mensagem { margin-top: 16px; }
/* Pedido do Lincoln: título "Entrega" maior e mais pra baixo (não colado no
   topo da foto) — centraliza o bloco de título na altura do miolo da tela
   (align-self:center, só nele — os cards continuam no topo, do jeito que
   já estava certo pra ele) e aumenta a fonte bem além do .pa-modo-hero-
   titulo padrão (usado também nos passos destinos/ativa e no "em breve",
   que não devem crescer). */
/* Pedido do Lincoln (nova rodada): aumentar consideravelmente o título
   "Entrega", a barrinha amarela ao lado dele e o subtítulo — já tinham
   sido aumentados numa rodada anterior, mas ainda pequenos pra ele. */
.pa-entrega-menu-titulo-bloco { max-width: 540px; align-self: center; }
.pa-entrega-menu-titulo-bloco .pa-modo-hero-titulo { font-size: 92px; }
.pa-entrega-menu-titulo-bloco .pa-modo-hero-titulo .barra { width: 10px; height: 64px; }
.pa-entrega-menu-titulo-bloco .pa-modo-hero-sub { font-size: 20px; }
/* Pedido do Lincoln, com print marcando a posição errada: a coluna de
   cards ficava colada no topo (align-items:flex-start, herdado de
   .pa-entrega-menu-conteudo) enquanto o bloco de título ao lado já usa
   align-self:center — os cards de ação, o carrossel e o card único de
   escolha ficavam "flutuando" sem alinhar com a altura do título.
   align-self:center aqui alinha os três estados na mesma referência
   vertical do título, em vez de cada um numa altura diferente. */
.pa-entrega-menu-cards { display: flex; flex-direction: column; gap: 12px; width: 100%; max-width: 340px; align-self: center; }
/* Foto do robô já escolhido, acima dos cards de ação — pedido do Lincoln
   (print anotado circulando o vão vazio ali em cima). Mesmo visual "quadro
   translúcido" dos cards abaixo, só que maior e centralizado. */
.pa-entrega-menu-foto-robo {
  display: flex; flex-direction: column; align-items: center; gap: 10px;
  padding: 16px 16px 18px;
  background: rgba(0,0,0,0.6);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: var(--raio-m);
  backdrop-filter: blur(6px);
}
.pa-entrega-menu-foto-robo-img {
  width: 86px; height: 86px; border-radius: var(--raio-p); overflow: hidden;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,0.1); color: var(--acento);
}
.pa-entrega-menu-foto-robo-img img { width: 100%; height: 100%; object-fit: cover; }
.pa-entrega-menu-foto-robo-img svg { width: 38px; height: 38px; }
.pa-entrega-menu-foto-robo-nome { font-size: 15px; font-weight: 800; color: #fff; text-align: center; }
.pa-entrega-menu-card {
  display: flex; align-items: center; gap: 12px;
  width: 100%;
  background: rgba(0,0,0,0.72);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: var(--raio-m);
  padding: 14px 16px;
  cursor: pointer;
  text-align: left;
  backdrop-filter: blur(6px);
  transition: background var(--duracao-rapida), border-color var(--duracao-rapida);
}
.pa-entrega-menu-card:hover { background: rgba(255,209,0,0.16); border-color: var(--acento-suave-2); }
.pa-entrega-menu-card[disabled] { opacity: 0.55; cursor: not-allowed; }
.pa-entrega-menu-card[disabled]:hover { background: rgba(0,0,0,0.72); border-color: rgba(255,255,255,0.14); }
.pa-entrega-menu-card-icone {
  flex: 0 0 auto; width: 40px; height: 40px; border-radius: var(--raio-p);
  background: rgba(255,255,255,0.1); display: flex; align-items: center; justify-content: center;
  color: var(--acento);
}
.pa-entrega-menu-card-icone svg { width: 20px; height: 20px; }
/* Variante com a foto do robô (cards do passo "escolher robô") em vez do
   ícone — a foto preenche o mesmo quadradinho arredondado. */
.pa-entrega-menu-card-icone-foto { padding: 0; overflow: hidden; }
.pa-entrega-menu-card-icone-foto img { width: 100%; height: 100%; object-fit: cover; border-radius: inherit; }
.pa-entrega-menu-card-texto { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pa-entrega-menu-card-texto .titulo { font-size: 14.5px; font-weight: 800; color: #fff; }
.pa-entrega-menu-card-texto .desc { font-size: 12px; color: rgba(255,255,255,0.66); font-weight: 600; }
.pa-entrega-menu-card-seta { width: 18px; height: 18px; color: rgba(255,255,255,0.5); flex: 0 0 auto; }
.pa-entrega-menu-vazio { color: rgba(255,255,255,0.66); font-size: 13.5px; font-weight: 600; margin: 0; }

/* Card único "Selecione o robô desejado" (nenhum robô escolhido ainda).
   1ª tentativa (rodada anterior): esticar o card pra preencher a coluna
   toda (`align-self:stretch` + `height:100%`) pra não deixar vão vazio.
   Lincoln corrigiu com print marcando o tamanho certo: nem do tamanho
   pequeno original, nem esticado até a barra de status — um tamanho
   médio, centralizado na coluna (mesmo espírito do bloco de título ao
   lado, que já usa `align-self:center`). Por isso `min-height` fixa (não
   preenche mais a altura toda) e `align-self:center` em vez de `stretch`.
   A seta lateral (usada nos outros cards pra indicar "mais opções à
   direita") não faz sentido nesse layout centralizado, então fica
   escondida aqui. */
.pa-entrega-menu-cards.selecionar-robo { align-self: center; max-width: 420px; }
.pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card {
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  gap: 20px;
  padding: 44px 36px;
  min-height: 340px;
}
.pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card-icone { width: 64px; height: 64px; }
.pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card-icone svg { width: 30px; height: 30px; }
/* 31/08, item 14 do backlog — causa raiz de verdade (re-investigada com
   Playwright/getBoundingClientRect, não só lendo CSS): a correção de uma
   rodada anterior (reverter uma regra de @media max-width:1024px) mexeu no
   lugar ERRADO — o bug nunca foi de breakpoint estreito, reproduzia igual
   em 1366/1440/1600/1920px. A regra BASE `.pa-entrega-menu-card-texto`
   (mais acima, linha ~655) tem `flex: 1` — faz sentido pro layout em LINHA
   dos outros cards de ação (empurra a seta pra ponta direita, ocupando o
   espaço horizontal que sobra). Quando `.selecionar-robo` vira o card pra
   COLUNA (`flex-direction:column`), esse MESMO `flex:1` passa a valer no
   eixo VERTICAL — faz o bloco de texto esticar pra baixo até preencher
   todo o espaço vertical que sobra dentro do `min-height:340px` do card
   (medido: ~163px de altura pro bloco de texto, contra ~44px do conteúdo
   real dele) — e como esse bloco não tem `justify-content` próprio, o
   texto fica colado no TOPO da própria caixa esticada, deixando um vão
   vazio embaixo (exatamente o sintoma reportado: "espaço vazio abaixo
   muito discrepante"). `justify-content:center` no CARD (que já estava
   certo) nunca teve chance de agir sobre o GRUPO ícone+texto, porque o
   texto sozinho já ocupava sozinho quase toda a altura disponível.
   Corrigido anulando o `flex:1` herdado (`flex: 0 0 auto`) só nesta
   variante — o bloco de texto volta a ter só a altura do próprio conteúdo,
   e o `justify-content:center` do card passa a centralizar de verdade o
   grupo [ícone + texto] dentro da caixa, com folga igual acima/abaixo. */
.pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card-texto { flex: 0 0 auto; align-items: center; gap: 6px; }
.pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card-texto .titulo { font-size: 20px; }
.pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card-texto .desc { font-size: 14px; max-width: 300px; }
.pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card-seta { display: none; }

/* Carrossel de escolha do robô (3ª rodada de feedback do Lincoln): um robô
   por vez, com setas pra navegar e um botão pra confirmar o que está em
   exibição. `.pa-entrega-carrossel-viewport` corta o que passa dos 100% de
   largura; `.pa-entrega-carrossel-trilha` é o trilho que deslisa via
   transform (mexido diretamente pelo JS em entregaAtualizarCarrosselRoboDom(),
   não recriado a cada clique de seta — é isso que faz a transição rodar).
   Pedido do Lincoln (rodada seguinte): aumentar mais ainda, pra cobrir bem
   o canto direito da tela (onde os cards de ação também ficam) — por isso
   o `.pa-entrega-menu-cards` ganha a largura maior só quando o carrossel
   está de fato na tela (classe `.carrossel-ativo`, aplicada em
   entregaMenuInternoHtml()), sem alargar os cards de ação junto. */
.pa-entrega-menu-cards.carrossel-ativo { max-width: 520px; }
.pa-entrega-carrossel-robo { display: flex; align-items: center; gap: 16px; width: 100%; max-width: 520px; }
.pa-entrega-carrossel-seta {
  flex: 0 0 auto; width: 42px; height: 42px; border-radius: 50%;
  border: 1px solid rgba(255,255,255,0.24); background: rgba(0,0,0,0.6); color: #fff;
  display: flex; align-items: center; justify-content: center; cursor: pointer;
  transition: background var(--duracao-rapida), border-color var(--duracao-rapida);
}
.pa-entrega-carrossel-seta svg { width: 19px; height: 19px; }
.pa-entrega-carrossel-seta:hover { background: rgba(255,209,0,0.16); border-color: var(--acento-suave-2); }
.pa-entrega-carrossel-seta:disabled { opacity: 0.35; cursor: not-allowed; }
.pa-entrega-carrossel-viewport { flex: 1; min-width: 0; overflow: hidden; }
.pa-entrega-carrossel-trilha { display: flex; transition: transform 0.4s ease; }
.pa-entrega-carrossel-slide {
  flex: 0 0 100%;
  display: flex; flex-direction: column; align-items: center; text-align: center; gap: 12px;
  background: rgba(0,0,0,0.72);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: var(--raio-m);
  padding: 36px 24px;
}
.pa-entrega-carrossel-slide.offline { opacity: 0.6; }
.pa-entrega-carrossel-slide-icone {
  width: 84px; height: 84px; border-radius: var(--raio-p);
  background: rgba(255,255,255,0.1); display: flex; align-items: center; justify-content: center;
  color: var(--acento);
  transition: transform 0.25s ease;
}
/* Pedido do Lincoln: passar o mouse sobre o robô do carrossel amplia
   levemente o ícone/foto dele (não o card inteiro, pra não empurrar o
   texto ao redor) — o movimento entre robôs (setas) já tinha sua própria
   transição suave (`.pa-entrega-carrossel-trilha`, acima). */
.pa-entrega-carrossel-slide:not(.offline):hover .pa-entrega-carrossel-slide-icone { transform: scale(1.08); }
@media (prefers-reduced-motion: reduce) {
  .pa-entrega-carrossel-slide-icone { transition: none; }
}
.pa-entrega-carrossel-slide-icone svg { width: 38px; height: 38px; }
.pa-entrega-carrossel-slide-icone.com-foto { padding: 0; overflow: hidden; }
.pa-entrega-carrossel-slide-icone.com-foto img { width: 100%; height: 100%; object-fit: cover; border-radius: inherit; }
/* 28/08: indicador de status pulsante no canto do ícone/foto do robô,
   pedido do Lincoln em cima de uma referência visual — reaproveita as
   MESMAS cores/animações de .pa-chip (design.css: pa-pulso/pa-pulso-
   vermelho), só num formato de bolinha sobre o ícone em vez de chip de
   texto. A borda na cor do próprio card (mesma cor de fundo do
   .pa-entrega-carrossel-slide) "recorta" a bolinha contra o ícone por
   baixo, em vez de ficar com uma borda dura. */
.pa-entrega-carrossel-slide-icone-wrap { position: relative; display: inline-flex; }
.pa-entrega-carrossel-slide-status-dot {
  position: absolute; right: -2px; bottom: -2px; width: 15px; height: 15px; border-radius: 50%;
  border: 3px solid rgba(0,0,0,0.92);
}
.pa-entrega-carrossel-slide-status-dot.disponivel,
.pa-entrega-carrossel-slide-status-dot.trabalhando {
  background: var(--sucesso); animation: pa-pulso 1.7s ease-out infinite;
}
.pa-entrega-carrossel-slide-status-dot.carregando {
  background: var(--alerta); animation: pa-pulso 1.7s ease-out infinite;
}
.pa-entrega-carrossel-slide-status-dot.offline {
  background: var(--erro); animation: pa-pulso-vermelho 1.7s ease-out infinite;
}
.pa-entrega-carrossel-slide-status-dot.indisponivel { background: var(--erro); }
.pa-entrega-carrossel-slide-nome { font-size: 19px; font-weight: 800; color: #fff; }
.pa-entrega-carrossel-slide-modelo { font-size: 12.5px; color: rgba(255,255,255,0.6); font-weight: 700; margin-top: -8px; }
.pa-entrega-carrossel-slide-sn { font-size: 13px; color: rgba(255,255,255,0.66); font-weight: 600; }
/* Pedido do Lincoln: o botão "Escolher este robô" tem que ficar centrado
   em relação ao card acima dele, não alinhado numa ponta enquanto o
   contador fica na outra (era `justify-content: space-between`) — vira
   coluna, os dois centralizados. */
.pa-entrega-carrossel-rodape { display: flex; flex-direction: column; align-items: center; gap: 12px; width: 100%; max-width: 520px; margin-top: 18px; }
.pa-entrega-carrossel-contador { font-size: 12.5px; font-weight: 700; color: rgba(255,255,255,0.6); }
.pa-entrega-carrossel-rodape .pa-btn { min-width: 240px; }

/* Painel dos passos "destinos"/"ativa" (montar a tarefa/acompanhar) —
   pedido do Lincoln: essas duas etapas tinham um visual totalmente
   diferente do "menu" (cabeçalho pequeno de fundo liso, sem a foto, com um
   corpo simples de leitura embaixo) — agora usam a MESMA moldura escura
   translúcida dos cards de ação (`.pa-entrega-menu-card`), só que maior,
   pra caber a lista de etapas + mapa + comandos. Os elementos internos
   (`.pa-etapa-card`, `.pa-mapa-picker`, `.pa-toggle-ordem` etc.) continuam
   com o próprio estilo claro de sempre — já são pensados pra flutuar sobre
   um fundo escuro (ver --superficie/--superficie-2 em design.css), então
   não precisam de tema escuro próprio, só o CONTAINER em volta é que
   precisava virar essa moldura em vez do corpo branco de página. Altura
   limitada + rolagem própria (em vez de deixar crescer livre): o quadro
   cheio tem `overflow:hidden` (pela foto full-bleed), então sem isso um
   painel mais alto que a tela ficaria cortado e inacessível. */
/* 28/08: Lincoln pediu pra aumentar o card do mapa (painel inteiro dos
   passos "destinos"/"ativa") — max-width subiu de 640 pra 760px (e o
   viewport do mapa, mais abaixo, de 340 pra 420px de altura). Precisou
   subir junto o max-width de `.pa-entrega-menu-conteudo`/`.pa-entrega-
   menu-status-interno` (1320→1440px) pra manter as contas do comentário
   de lá batendo (título até 540px + gap 28px + este painel agora até
   760px = 1328px, cabe dentro dos 1376px úteis de 1440px com padding). */
.pa-entrega-menu-painel {
  width: 100%;
  max-width: 760px;
  max-height: calc(100vh - 260px);
  overflow-y: auto;
  background: rgba(0,0,0,0.72);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: var(--raio-m);
  padding: 26px 26px 24px;
  backdrop-filter: blur(6px);
}

/* Barra de status do robô da sessão — full-bleed (mesmo truque de
   left:50%/width:100vw/margin-left:-50vw usado em .pa-entrega-menu) pra
   preencher a largura da tela toda, não só até 1180px. Pedido do Lincoln:
   "vamos aumentar o card da bar pra ficar do tamanho da tela também" — o
   fundo/borda precisam ir de ponta a ponta, mas o CONTEÚDO continua
   centralizado e limitado a 1180px (.pa-entrega-menu-status-interno),
   senão os itens ficariam esparramados/ilegíveis em telas muito largas. */
.pa-entrega-menu-status {
  position: relative;
  left: 50%;
  width: 100vw;
  margin-left: -50vw;
  z-index: 1;
  border-top: 1px solid rgba(255,255,255,0.14);
  background: rgba(6,6,5,0.6);
}
/* align-items mudou de center pra flex-start: o item "Bateria" tem um
   bloco de valor mais baixo (so track+numero) que os outros (que tem o
   texto do robo + o botao "Trocar", mais alto) - com "center" cada item
   fica centralizado sozinho dentro da altura da linha inteira, entao o
   rotulo "BATERIA" ficava mais baixo que "ROBO SELECIONADO"/"MAPA ATUAL"/
   "LOCAL ATUAL". Com flex-start os 4 rotulos alinham no topo, uniforme. */
.pa-entrega-menu-status-interno {
  display: flex; align-items: flex-start; gap: 24px;
  /* Mesmo max-width de `.pa-entrega-menu-conteudo` (1440px, ver comentário
     lá) — as duas colunas (título/painel em cima, robô/bateria/local
     embaixo) precisam alinhar as bordas esquerda/direita. */
  width: 100%; max-width: 1440px; margin: 0 auto;
  padding: 16px 32px;
}
.pa-entrega-menu-status-item { flex: 1; min-width: 0; }
.pa-entrega-menu-status-rotulo { display: block; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em; color: rgba(255,255,255,0.5); margin-bottom: 4px; }
.pa-entrega-menu-status-valor { display: flex; align-items: center; gap: 6px; font-size: 14px; font-weight: 800; color: #fff; flex-wrap: wrap; }
/* 31/08: pedido do Lincoln — quando o robô não está sobre nenhum ponto
   cadastrado (ver LIMIAR_PONTO_PROXIMO_METROS em dashboard.js), "Local
   atual" mostra o texto honesto "Em um ponto não marcado no mapa" mais essa
   referência menor/apagada com o ponto mais próximo, numa segunda linha
   (flex-basis:100% força a quebra dentro do container flex acima, sem
   precisar de uma estrutura HTML nova). */
.pa-entrega-menu-status-secundario { display: block; flex-basis: 100%; font-size: 11px; font-weight: 600; color: rgba(255,255,255,0.5); margin-top: 2px; }
/* 26/08: mesmo pedido do Lincoln do chip principal (.pa-chip, em design.css)
   -- verde pulsante com conexao, vermelho pulsante sem. Usa os keyframes
   pa-pulso/pa-pulso-vermelho definidos em design.css (mesma pagina, ambos os
   arquivos sao carregados juntos). */
.pa-entrega-menu-status-dot { position: relative; width: 8px; height: 8px; border-radius: 50%; background: var(--erro); flex: 0 0 auto; animation: pa-pulso-vermelho 1.7s ease-out infinite; }
.pa-entrega-menu-status-dot.online { background: var(--sucesso); animation: pa-pulso 1.7s ease-out infinite; }
/* Botão de troca do robô — pedido do Lincoln: precisa ficar mais intuitivo
   (ícone de troca + rótulo "Trocar", não só um chevron mudo) e colado ao
   valor de "Robô selecionado" (é um filho de `.pa-entrega-menu-status-
   valor` agora, não mais um item solto na ponta da barra). */
.pa-entrega-menu-status-trocar {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; gap: 5px;
  margin-left: 6px;
  padding: 4px 10px 4px 8px;
  border-radius: var(--raio-pill);
  border: 1px solid rgba(255,255,255,0.24);
  background: rgba(255,255,255,0.08);
  color: #fff;
  font-size: 12px; font-weight: 700;
  cursor: pointer;
  transition: background var(--duracao-rapida), border-color var(--duracao-rapida);
}
.pa-entrega-menu-status-trocar svg { width: 13px; height: 13px; }
.pa-entrega-menu-status-trocar:hover { background: rgba(255,209,0,0.16); border-color: var(--acento-suave-2); }
.pa-entrega-menu-status .pa-bateria-trilho { background: rgba(255,255,255,0.2); }
.pa-entrega-menu-status .pa-bateria-numero { color: #fff; }
@media (max-width: 1024px) {
  .pa-entrega-menu { min-height: calc(100vh - 67px); margin-top: -24px; }
  .pa-entrega-menu-conteudo { flex-direction: column; padding: 28px 20px 20px; }
  /* Em coluna (empilhado), align-self passa a valer no eixo horizontal —
     sem resetar pra flex-start aqui, o título ficaria centralizado na
     largura da tela, o que não faz sentido empilhado. */
  .pa-entrega-menu-titulo-bloco { align-self: flex-start; }
  .pa-entrega-menu-titulo-bloco .pa-modo-hero-titulo { font-size: 56px; }
  .pa-entrega-menu-titulo-bloco .pa-modo-hero-titulo .barra { width: 8px; height: 40px; }
  .pa-entrega-menu-titulo-bloco .pa-modo-hero-sub { font-size: 17px; }
  .pa-entrega-menu-cards,
  .pa-entrega-menu-cards.carrossel-ativo,
  .pa-entrega-menu-cards.selecionar-robo { max-width: none; }
  /* 31/08, pedido do Lincoln (viu esse card numa tela estreita e achou as
     informações desalinhadas): "centralizar as informações no card cinza"
     -- a versão anterior deste ajuste trocava pra um layout em linha
     (ícone + texto à esquerda + seta) só pra ganhar espaço vertical numa
     tela estreita; revertido pro mesmo tratamento centralizado do
     desktop (ícone em cima, texto embaixo, tudo centralizado), só com
     padding/gap menores pra continuar compacto numa tela pequena. */
  .pa-entrega-menu-cards.selecionar-robo { align-self: auto; }
  .pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card {
    height: auto;
    min-height: 0;
    flex-direction: column;
    justify-content: center;
    text-align: center;
    padding: 28px 18px;
    gap: 14px;
  }
  .pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card-texto { flex: 0 0 auto; align-items: center; }
  .pa-entrega-menu-cards.selecionar-robo .pa-entrega-menu-card-seta { display: none; }
  .pa-entrega-carrossel-robo,
  .pa-entrega-carrossel-rodape { max-width: none; }
  .pa-entrega-menu-painel { max-width: none; max-height: calc(100vh - 230px); }
  .pa-entrega-menu-status-interno { flex-wrap: wrap; padding: 14px 20px; gap: 14px; }
}
@media (max-width: 480px) {
  .pa-entrega-menu-status-interno { flex-direction: column; align-items: stretch; }
  /* O botão "Trocar" agora mora dentro do próprio valor de "Robô
     selecionado" (não mais solto na ponta da barra) — em telas estreitas,
     se não couber ao lado do texto, cai pra linha de baixo em vez de
     estourar a largura. */
  .pa-entrega-menu-status-valor { flex-wrap: wrap; }
}

/* ---------------------------------------------------------------------
   KPIs
   --------------------------------------------------------------------- */
/* Corte limpo — o hero termina numa altura fixa e os cards começam direto
   em seguida, sem sobrepor a foto (banner e cards são dois blocos distintos,
   divisão nítida entre a foto escura e o fundo acinzentado dos cards). */
.pa-kpis {
  /* 3 cards agora — "Tarefas ativas" saiu (a informação de tarefa já
     aparece dentro do painel de "Em operação"). */
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px;
  /* 01/09: pedido do Lincoln -- "subir os cards pra encaixar no fundo do
     banner", com o banner "cortando" atrás deles e só o fundo preto
     aparecendo abaixo. Como .pa-kpis é irmão do .pa-hero (não filho — o
     overflow:hidden do hero não afeta isso) e vem DEPOIS dele no HTML, uma
     margin-top negativa é o bastante pra puxar o grid pra cima por cima da
     faixa de fade (.pa-hero::after) sem precisar de z-index: a ordem normal
     de pintura já coloca quem vem depois por cima. Era +32px.
     Mesma tarde, mais um pedido: "à medida que aumente o banner, suba os
     cards junto" -- puxão trocado de um pixel fixo (-90px) pra uma FRAÇÃO
     da altura do banner (--pa-hero-h, design.css: ~28,6% dela), assim os
     dois crescem/encolhem sempre na mesma proporção sem eu precisar
     recalcular esse número toda vez que o banner mudar de tamanho de novo.
     Fração escolhida medindo com Playwright (posição real do topo/base dos
     cards vs. o começo/fim do gradiente .pa-hero::after) até os cards
     ficarem por cima da parte ainda nítida da foto, escurecendo pra preto
     só a partir da base deles. */
  margin-top: calc(var(--pa-hero-h) * -0.286); margin-bottom: 42px;
  position: relative; z-index: 3;
}
/* Cada KPI é um botão (leva pra a área correspondente — Robôs/Tarefas/
   notificações), com a mesma seta ">" usada nos Atalhos, pra deixar claro
   que dá pra clicar. */
.pa-kpi {
  position: relative;
  width: 100%;
  /* Sem isso, o item de grid não encolhe abaixo do min-content do texto
     (ex.: "Notificações e alertas") e o card fica mais largo que a própria
     coluna — estoura a tela em telas estreitas (2 colunas no mobile). */
  min-width: 0;
  /* Pedido do Lincoln (01/09): "esses cards em branco, vamos deixar eles da
     cor da topbar" — escopado só a este componente (não mexe no token
     global --superficie, usado em botões/inputs/outros cards do app
     inteiro, ex.: login, Entrega). Borda no mesmo tom translúcido branco já
     usado no resto do app (ao invés de var(--borda), clara demais pra um
     fundo escuro). Texto interno dos 3 KPIs (rótulo/valor/status/seta)
     ganhou cor própria logo abaixo — os tokens --texto/--texto-suave são
     escuros, pensados pro card branco original, e ficariam ilegíveis aqui.
     Mesma tarde, rodada seguinte: como esses 3 cards agora sobem por cima
     da base do banner (.pa-kpis com margin-top negativa, ver mais abaixo),
     o Lincoln pediu "preto transparente nos cards superiores" — em vez do
     #101010 opaco, um vidro escuro de verdade (fundo semi-transparente +
     desfoque do que está atrás), deixando entrever um pouco da foto/fade
     do banner por trás em vez de tampar tudo com um retângulo sólido. Os
     cards mais abaixo (robô/atalhos/tarefa) continuam sólidos de propósito
     — não sobrepõem nada, então a transparência não teria função ali (só
     pedido pros 3 de cima). */
  background: rgba(0, 0, 0, 0.45);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border: 1px solid rgba(255,255,255,0.1); border-radius: var(--raio-g);
  padding: 18px 20px 18px; box-shadow: var(--sombra-1);
  /* Pedido do Lincoln (01/09): ícone movido pro canto esquerdo do card —
     `justify-content:space-between` (que empurrava o ícone pra ponta
     direita, já que ele vinha depois do texto no DOM) trocado por
     `align-items:center` simples; o ícone agora vem PRIMEIRO no HTML (ver
     dashboard.js), o texto ganha `flex:1` pra ocupar o resto do espaço, e a
     seta continua na ponta (mesmo padrão já usado em `.pa-atalho-item`,
     reaproveitado aqui em vez de inventado do zero). */
  display: flex; align-items: center; gap: 14px;
  font-family: inherit; text-align: left; cursor: pointer;
  transition: box-shadow var(--duracao-rapida) ease, transform var(--duracao-rapida) ease;
}
.pa-kpi:hover { box-shadow: var(--sombra-2); transform: translateY(-1px); }
/* Card com o painel aberto embaixo — mesmo destaque visual do hover, só
   que fixo enquanto o painel estiver expandido. */
.pa-kpi.ativo { border-color: var(--acento-suave-2); box-shadow: var(--sombra-2); }
.pa-kpi.ativo .pa-kpi-seta { transform: rotate(90deg); color: var(--acento-forte); }
.pa-kpi-seta { transition: transform var(--duracao-tela) ease, color var(--duracao-rapida) ease; }
/* Deixou de ser `position:absolute` (só fazia sentido com o ícone solto na
   ponta direita) — agora é só mais um item da fileira flex, sempre no fim
   por causa do `flex:1` do `.pa-kpi-texto` ao lado. */
.pa-kpi-seta { flex: 0 0 auto; width: 15px; height: 15px; color: rgba(255,255,255,0.35); }
.pa-kpi-texto { display: flex; flex-direction: column; flex: 1; min-width: 0; }
.pa-kpi-rotulo { font-size: 12.5px; font-weight: 700; color: rgba(255,255,255,0.55); margin-bottom: 8px; }
.pa-kpi-valor { font-size: 28px; font-weight: 900; color: #fff; line-height: 1; margin-bottom: 10px; }
.pa-kpi-status { display: flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 700; color: rgba(255,255,255,0.55); }
.pa-kpi-status .bolinha { position: relative; width: 7px; height: 7px; border-radius: 50%; flex: 0 0 auto; }
.pa-kpi-status.verde .bolinha { background: var(--sucesso); } .pa-kpi-status.verde { color: var(--sucesso); }
.pa-kpi-status.amber .bolinha { background: var(--alerta); } .pa-kpi-status.amber { color: var(--alerta); }
.pa-kpi-status.vermelho .bolinha { background: var(--erro); } .pa-kpi-status.vermelho { color: var(--erro); }
.pa-kpi-status.neutro .bolinha { background: var(--texto-fraco); }
/* Pedido do Lincoln: a bolinha de "X online agora" (verde) e a de "robô
   com bateria baixa" (vermelho, dentro do KPI de alertas) também devem
   pulsar — mesmo efeito de anel (`pa-piscar`, já usado no selo de "Em
   operação" acima) só que aqui direto na própria bolinha, via `::before`
   com `background:currentColor` (pega a cor certa sozinho, verde ou
   vermelho, sem precisar duplicar a regra). Não pulsa em "amber"/"neutro"
   nem nos chips de status dos cards de robô (esses usam .pa-chip, uma
   classe diferente) — só aqui, nos 2 casos que o Lincoln pediu. */
.pa-kpi-status.verde .bolinha::before,
.pa-kpi-status.vermelho .bolinha::before {
  content: '';
  position: absolute; inset: -4px;
  border-radius: 50%;
  background: currentColor;
  animation: pa-piscar 1.6s ease-out infinite;
}
@media (prefers-reduced-motion: reduce) {
  .pa-kpi-status .bolinha::before { animation: none; opacity: 0; }
}

.pa-kpi-icone {
  position: relative;
  width: 42px; height: 42px; border-radius: var(--raio-p); flex: 0 0 auto;
  /* Pedido do Lincoln (01/09): "todos os cards brancos... inclusive os
     ícones" — o selo trocou do chip creme (var(--superficie-2), pensado
     pro card branco original) pra um vidro escuro sutil, mesma família do
     `.pa-kpi`/`.pa-topo` (leve tom translúcido em vez de idêntico ao fundo,
     só pra continuar reconhecível como um selo separado). Cor do ícone
     (var(--acento-forte), dourado) já tinha contraste bom sobre escuro,
     não mudou. */
  background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.08); color: var(--acento-forte);
  display: flex; align-items: center; justify-content: center;
}
.pa-kpi-icone svg { width: 20px; height: 20px; }

/* "Em operação" tinha um tratamento diferente dos outros 2 KPIs (um
   indicador vivo isolado — bolinha + pulso — pedido do Lincoln numa rodada
   anterior, em vez do ícone-em-selo). Quando não há nenhum robô operando
   (0, o caso mais comum), essa bolinha ficava cinza e sem pulso — sem
   nenhum ícone, destoando visualmente dos outros 2 cards (que sempre têm
   um selo com ícone) e lendo como "ícone quebrado/faltando". Lincoln pediu
   pra arrumar — agora esse card usa o MESMO selo com ícone dos outros
   (`#i-atividade`), sempre presente; o "indicador vivo" continua existindo,
   só que como uma bolinha pequena com pulso no canto do selo — some por
   completo (não fica cinza) quando não há nenhum robô operando agora. */
.pa-kpi-icone-pulso {
  position: absolute; top: -3px; right: -3px;
  width: 10px; height: 10px; border-radius: 50%;
  background: var(--sucesso);
}
.pa-kpi-icone-pulso::before {
  content: ''; position: absolute; inset: -5px; border-radius: 50%; background: var(--sucesso);
  animation: pa-piscar 1.6s ease-out infinite;
}
@keyframes pa-piscar { 0% { transform: scale(0.5); opacity: 0.55; } 70% { transform: scale(1.9); opacity: 0; } 100% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
  .pa-kpi-icone-pulso::before { animation: none; opacity: 0; }
}

/* Painel do KPI — pop-up centrado na tela (não mais um acordeão embutido
   entre os KPIs e as colunas), com fundo escurecido atrás. Cada card abre
   "na própria página" (sem navegar pra outra tela), com animação de abrir
   (fade do fundo + o card subindo/crescendo levemente) e fechar (inverso).
   Um só aberto por vez — abrir outro card fecha o anterior primeiro. */
.pa-kpi-painel {
  position: fixed; inset: 0; z-index: 50;
  display: flex; align-items: center; justify-content: center;
  padding: 24px;
  background: rgba(6, 6, 5, 0);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.25s ease, background 0.25s ease, visibility 0s linear 0.25s;
}
.pa-kpi-painel.aberto {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  background: rgba(6, 6, 5, 0.55);
  transition: opacity 0.25s ease, background 0.25s ease;
}
/* 01/09, pedido do Lincoln: "quero excluir o branco desse painel" — este é
   o popup COMPARTILHADO por todos os KPIs ("Robôs online", "Em operação",
   "Alertas") e pelo "Detalhes do robô" (clique num card do carrossel) —
   mudar aqui vale pros dois. Mesma técnica/cor dos cards já escurecidos
   (#101010 + borda translúcida). Todo texto/chip interno (rótulo, linhas
   da lista, campos do detalhe, métricas) ganhou cor/fundo próprios logo
   abaixo — os tokens claros (--superficie(-2)/--texto(-suave/-fraco))
   eram pensados pro popup branco original. */
.pa-kpi-painel-caixa {
  width: 100%; max-width: 420px; max-height: min(520px, 80vh);
  overflow-y: auto;
  background: #101010; border: 1px solid rgba(255,255,255,0.08); border-radius: var(--raio-g);
  /* Rede de segurança: qualquer texto interno SEM cor própria (ex.:
     `.pa-detalhe-robo-nota` sem variante verde/vermelho, usado pros avisos
     de "sem dado"/"disponível só no módulo de Limpeza") herdava
     var(--texto) do body inteiro (escuro, pensado pro popup branco
     original) e ficava quase invisível aqui — em vez de caçar cada
     elemento sem cor um por um, um `color` claro na própria caixa cobre
     qualquer descendente que não tenha a própria cor definida. */
  color: rgba(255,255,255,0.85);
  padding: 20px 22px 22px; box-shadow: var(--sombra-2);
  transform: translateY(22px) scale(0.97);
  opacity: 0;
  transition: transform 0.3s cubic-bezier(.2,.8,.2,1), opacity 0.25s ease;
}
.pa-kpi-painel.aberto .pa-kpi-painel-caixa { transform: translateY(0) scale(1); opacity: 1; }
@media (prefers-reduced-motion: reduce) {
  .pa-kpi-painel, .pa-kpi-painel-caixa { transition: opacity 0.15s ease; transform: none; }
}
.pa-kpi-painel-cabeca { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
.pa-kpi-painel-titulo { font-size: 15px; font-weight: 800; margin: 0; color: #fff; }
.pa-kpi-painel-fechar {
  background: transparent; border: none; color: rgba(255,255,255,0.4); cursor: pointer;
  padding: 7px; border-radius: 50%; display: flex; align-items: center; justify-content: center; flex: 0 0 auto;
}
.pa-kpi-painel-fechar:hover { background: rgba(255,255,255,0.08); color: #fff; }
.pa-kpi-painel-fechar svg { width: 16px; height: 16px; }

.pa-kpi-painel-lista { display: flex; flex-direction: column; gap: 8px; }
.pa-kpi-painel-linha {
  display: flex; align-items: center; gap: 12px;
  background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.08); border-radius: var(--raio-m); padding: 10px 12px;
}
.pa-kpi-painel-linha-foto {
  width: 34px; height: 34px; border-radius: var(--raio-p); background: rgba(255,255,255,0.08);
  display: flex; align-items: center; justify-content: center; overflow: hidden; flex: 0 0 auto; color: var(--acento-forte);
}
.pa-kpi-painel-linha-foto img { width: 100%; height: 100%; object-fit: contain; }
.pa-kpi-painel-linha-foto svg { width: 16px; height: 16px; }
.pa-kpi-painel-linha-texto { flex: 1; min-width: 0; }
.pa-kpi-painel-linha-nome { font-size: 13px; font-weight: 800; color: #fff; }
.pa-kpi-painel-linha-detalhe { display: block; font-size: 11.5px; color: rgba(255,255,255,0.55); font-weight: 600; margin-top: 2px; }
.pa-kpi-painel-linha-detalhe.vermelho { color: var(--erro); }
.pa-kpi-painel-linha-detalhe.verde { color: var(--sucesso); }
.pa-kpi-painel-linha-detalhe.amber { color: var(--alerta); }
.pa-kpi-painel-linha .pa-chip { flex: 0 0 auto; font-size: 10.5px; padding: 4px 9px; }
/* 26/08: painel "Todos os robôs" (Entrega) -- cada linha agora é um
   <button> selecionável, não um <div> de leitura (pedido do Lincoln: tem
   que dar pra escolher o robô direto daqui, igual no carrossel). O reset
   abaixo faz o botão herdar exatamente a mesma cara do .pa-kpi-painel-linha
   normal (usado nos KPIs, que continuam só leitura); só acrescenta o hover
   e o estado desabilitado (robô offline). */
.pa-kpi-painel-linha.selecionavel {
  width: 100%; border: none; font: inherit; text-align: left; cursor: pointer;
  transition: background-color 0.15s ease;
}
.pa-kpi-painel-linha.selecionavel:hover:not(:disabled) { background: rgba(255,255,255,0.1); }
.pa-kpi-painel-linha.selecionavel:disabled { opacity: 0.45; cursor: not-allowed; }
.pa-kpi-painel-dica {
  font-size: 12px; color: rgba(255,255,255,0.5); font-weight: 600; margin: 0 0 10px; text-align: center;
}
.pa-kpi-painel-vazio {
  font-size: 13px; color: rgba(255,255,255,0.5); font-weight: 600; text-align: center; padding: 22px 10px;
}

/* Card de detalhe do robô (clique num card do carrossel) — mesmo popup dos
   KPIs (.pa-kpi-painel), só bem mais largo pra caber a foto grande +
   coluna de cartões lado a lado (ver .pa-detalhe-robo-corpo abaixo). */
/* 02/09, 2ª rodada, referência visual nova do Lincoln (print "KettyBot
   Demo"): 520px -> 720px -- precisa de espaço pra duas colunas de verdade,
   não só uma foto maior num card ainda vertical. */
/* 02/09, 3ª rodada: o Lincoln pediu pra tirar a barra de rolagem do
   pop-up -- a causa era o `max-height: min(520px, 80vh)` herdado de
   `.pa-kpi-painel-caixa` (pensado pros popups menores dos KPIs), que
   sobrava pequeno demais pro conteúdo bem maior deste card desde a
   reformulação em cartões (item 50). Sobe pra 92vh (praticamente a tela
   inteira, com folga só pra não colar nas bordas) -- o conteúdo real do
   card (foto + cartões) cabe de sobra na maioria das telas sem precisar
   rolar; a rolagem interna continua existindo como rede de segurança só
   pra telas bem baixas (celular deitado, por exemplo). */
.pa-detalhe-robo-caixa {
  max-width: 720px; max-height: 92vh;
  background: rgba(0,0,0,0.7); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
}

/* 02/09, 2ª rodada: reformulação completa a partir da referência visual do
   Lincoln -- foto GRANDE à esquerda (mesma altura da coluna de
   informações) + coluna de cartões (nome/SN, modelo/mapa, métricas,
   bateria, localização) à direita, em vez do bloco "foto pequena + linhas
   de texto" da rodada anterior. Mesmo grid serve pro pop-up E pra página
   própria do robô (confirmado com o Lincoln) -- em telas estreitas as duas
   colunas empilham sozinhas (ver media query no fim deste bloco), sem
   precisar de nenhuma lógica diferente no HTML pros dois contextos. */
.pa-detalhe-robo-corpo { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.35fr); gap: 20px; align-items: stretch; margin-bottom: 16px; }
.pa-detalhe-robo-foto-grande {
  position: relative; height: 320px; align-self: start;
  display: flex; align-items: center; justify-content: center;
}
/* 02/09, 4ª rodada: "cover" preenchia o card inteiro mas cortava o robô
   quando a foto tinha um enquadramento diferente (ex.: MT1 Max com a antena
   vertical sendo cortada no topo) -- pedido do Lincoln: "a foto encaixar
   dentro do card de acordo com o modelo". "contain" sempre mostra o robô
   inteiro, do jeito que cada foto foi enquadrada, com uma margem interna
   (inset diferente de 0) pra não colar o robô na borda do card. */
.pa-detalhe-robo-foto-grande img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: contain; }
.pa-detalhe-robo-foto-grande svg { width: 30%; height: 30%; color: rgba(255,255,255,0.25); }
.pa-detalhe-robo-info-coluna { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
.pa-detalhe-robo-cabeca-info { margin-bottom: 2px; }
.pa-detalhe-robo-nome-linha { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-bottom: 4px; }
.pa-detalhe-robo-nome-linha .pa-chip { flex: 0 0 auto; }
.pa-detalhe-robo-nome { font-size: 19px; font-weight: 800; margin: 0; color: #fff; }
.pa-detalhe-robo-nota { font-size: 12px; font-weight: 700; margin: 0 0 4px; }
.pa-detalhe-robo-nota.verde { color: var(--sucesso); }
.pa-detalhe-robo-nota.vermelho { color: var(--erro); }
/* Botão "copiar SN" -- pedido implícito da referência (o SN aparece junto
   com um ícone de copiar). Usa a mesma API nativa do navegador
   (`navigator.clipboard`); se falhar (contexto sem HTTPS, permissão
   negada), a notificação de canto mostra o SN por extenso em vez de
   simplesmente não fazer nada (ver copiarSnRobo() em dashboard.js). */
.pa-detalhe-robo-sn-copiar {
  display: inline-flex; align-items: center; gap: 6px;
  background: none; border: none; padding: 0; margin: 0; cursor: pointer;
  font: inherit; font-size: 11.5px; color: rgba(255,255,255,0.45); font-weight: 700;
  transition: color var(--duracao-rapida);
}
.pa-detalhe-robo-sn-copiar:hover { color: rgba(255,255,255,0.8); }
.pa-detalhe-robo-sn-copiar svg { width: 13px; height: 13px; }

/* Base compartilhada por todos os "cartões" da coluna de info (modelo/mapa,
   métricas, bateria) -- ícone à esquerda (quando tem) + rótulo pequeno em
   maiúsculas acima do valor, mesma linguagem visual da referência do
   Lincoln. Também funciona em cima de um <button> (grade de métricas
   clicável) -- por isso zera as bordas/fonte nativas do elemento aqui,
   central, em vez de cada uso repetir o reset. */
.pa-detalhe-robo-cartao {
  width: 100%; display: block; text-align: inherit; font: inherit; cursor: default;
  background: rgba(0,0,0,0.4); border: 1px solid rgba(255,255,255,0.08); border-radius: var(--raio-m);
  padding: 12px 14px;
}
.pa-detalhe-robo-cartao .rotulo { display: block; font-size: 10px; color: rgba(255,255,255,0.5); font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; margin-bottom: 2px; }
.pa-detalhe-robo-cartao-linha { display: flex; align-items: center; gap: 10px; min-width: 0; }
.pa-detalhe-robo-cartao-icone {
  flex: 0 0 30px; width: 30px; height: 30px; border-radius: 50%;
  background: var(--acento-suave); color: var(--acento-forte);
  display: flex; align-items: center; justify-content: center;
}
.pa-detalhe-robo-cartao-icone svg { width: 15px; height: 15px; }
.pa-detalhe-robo-cartao-texto { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.pa-detalhe-robo-cartao-texto strong { color: #fff; font-weight: 700; font-size: 13px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pa-detalhe-robo-cartao-texto span:not(.rotulo) { font-size: 11px; color: rgba(255,255,255,0.5); font-weight: 600; }
/* Mensagens mais longas (ex.: estado vazio de métricas) reaproveitam o
   mesmo cartão ícone+texto do Modelo/Mapa atual, mas não podem truncar numa
   linha só como os valores curtos -- .multilinha desliga o corte. */
.pa-detalhe-robo-cartao-texto.multilinha strong,
.pa-detalhe-robo-cartao-texto.multilinha span:not(.rotulo) { white-space: normal; overflow: visible; text-overflow: clip; }
.pa-detalhe-robo-cartao-texto.multilinha strong { font-size: 12.5px; }
/* Cartão "Modelo"/"Mapa atual" -- duas linhas com um divisor fino entre
   elas, dentro do mesmo cartão (em vez de dois cartões separados). */
.pa-detalhe-robo-cartao-dupla { display: flex; flex-direction: column; gap: 10px; padding: 12px 14px; }
.pa-detalhe-robo-cartao-divisor { height: 1px; background: rgba(255,255,255,0.08); margin: 0 -14px; }

/* Cartão "Bateria" -- rótulo + ícone de raio no topo, número grande +
   barra embaixo (reaproveita bateriaHtml() de sempre, só com fonte maior
   neste contexto específico). */
/* 02/09, 4ª rodada, pedido do Lincoln: "o card indicador da bateria não
   precisa ser tão grande" -- cartão em si já usa o padding padrão de
   `.pa-detalhe-robo-cartao` (12px/14px, igual aos outros), só o número
   (que estava com fonte bem maior que o resto) encolheu, e o espaço entre
   cabeçalho/número/barra ficou mais compacto. */
.pa-detalhe-robo-cartao-bateria { padding-top: 8px; padding-bottom: 8px; }
.pa-detalhe-robo-cartao-bateria-cabeca { display: flex; align-items: center; justify-content: space-between; margin-bottom: 3px; }
.pa-detalhe-robo-cartao-bateria .pa-bateria { display: flex; flex-direction: column-reverse; align-items: stretch; gap: 3px; }
.pa-detalhe-robo-cartao-bateria .pa-bateria-numero { font-size: 13px; font-weight: 800; color: var(--sucesso); }
/* Bug real achado nesta verificação: `.pa-bateria-trilho` herda `flex: 1`
   de design.css (pensado pro layout em LINHA padrão, onde a barra ocupa o
   espaço horizontal restante) -- mas aqui o cartão usa `flex-direction:
   column-reverse` (número acima, barra abaixo), e nesse eixo vertical
   `flex:1` vira `flex-basis:0%`, que IGNORA a `height` declarada e some com
   a barra por completo (barra sempre invisível, altura 0). `flex: none`
   cancela o crescimento herdado, deixando a `height: 6px` valer. */
.pa-detalhe-robo-cartao-bateria .pa-bateria-trilho { flex: none; height: 6px; }
/* 03/09, pedido do Lincoln: ícone de raio saiu do cabeçalho do cartão e foi
   pro lado esquerdo da própria barra -- ver bateriaHtml(dados, true) em
   dashboard.js. `.pa-bateria-linha-barra` é a linha nova (ícone + barra),
   ocupa o lugar que antes era só a barra sozinha (1º filho no DOM de
   `.pa-bateria`, mas aparece embaixo por causa do `column-reverse` acima) --
   herda `align-items:stretch` do pai, então continua esticando pra largura
   inteira do cartão. Como o trilho agora vive DENTRO dessa linha em vez de
   direto em `.pa-bateria`, o `flex:none` de cima não alcança mais ele (regra
   mais específica abaixo ganha) -- aqui dentro o `flex:1` volta a funcionar
   normal (eixo horizontal de verdade, não tem o bug do column-reverse). */
.pa-detalhe-robo-cartao-bateria .pa-bateria-linha-barra { display: flex; align-items: center; gap: 6px; }
.pa-detalhe-robo-cartao-bateria .pa-bateria-linha-barra .pa-bateria-trilho { flex: 1; height: 6px; }
/* Ícone reaproveita o círculo padrão dos outros cartões
   (.pa-detalhe-robo-cartao-icone, 30px) -- só encolhe pra caber ao lado de
   uma barra fina de 6px sem dominar a linha. */
.pa-detalhe-robo-cartao-icone.pa-bateria-icone-inline { flex: none; width: 20px; height: 20px; }
.pa-detalhe-robo-cartao-icone.pa-bateria-icone-inline svg { width: 11px; height: 11px; }

/* Seção "Localização" -- só um rótulo acima do cartão clicável que já
   existia (.pa-detalhe-robo-localizacao-card, ver dashboard.js) -- não usa
   `.pa-detalhe-robo-cartao` aqui pra não duplicar borda (o cartão clicável
   já tem a própria). */
.pa-detalhe-robo-secao-localizacao { display: flex; flex-direction: column; gap: 6px; }
.pa-detalhe-robo-secao-localizacao > .rotulo { font-size: 10px; color: rgba(255,255,255,0.5); font-weight: 700; text-transform: uppercase; letter-spacing: 0.03em; }

/* Métricas de uso -- cardzinho com tempo rodado/km/tarefas somados no
   período (ver /api/metricas-uso), 3 números lado a lado dentro do mesmo
   cartão (a classe `.pa-detalhe-robo-cartao` de cima já dá o fundo/borda). */
.pa-detalhe-robo-metricas-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.pa-detalhe-robo-metrica { text-align: center; }
.pa-detalhe-robo-metrica strong { display: block; font-size: 15px; font-weight: 800; color: #fff; }
.pa-detalhe-robo-metrica span { font-size: 10px; color: rgba(255,255,255,0.5); font-weight: 700; text-transform: uppercase; letter-spacing: 0.02em; }
/* No pop-up, a grade de métricas é um <button> que leva pra página própria
   do robô — cursor + realce sutil no hover pra comunicar que é clicável. */
.pa-detalhe-robo-metricas-clicavel { cursor: pointer; }
.pa-detalhe-robo-metricas-clicavel:hover { background: var(--acento-suave); border-color: var(--acento-forte); }

/* Em telas estreitas as duas colunas empilham -- foto vira uma faixa no
   topo (altura fixa, já que não tem mais uma coluna de info do lado pra
   "ditar" a altura por igual) em vez de tentar continuar lado a lado. */
@media (max-width: 640px) {
  .pa-detalhe-robo-corpo { grid-template-columns: 1fr; }
  .pa-detalhe-robo-foto-grande { height: 220px; }
}

/* Página própria do robô (tela-robo) — o miolo é o MESMO markup do pop-up
   (`.pa-detalhe-robo-campo`/`-metrica`/etc.), que agora tem texto/chip
   claros (01/09, "excluir o branco desse painel") — por isso o cartão por
   baixo precisou virar escuro junto (senão o texto claro ficaria
   ilegível aqui, ainda que legível no pop-up). Mesma cor/borda dos outros
   cards já escurecidos. */
.pa-detalhe-robo-pagina { background: #101010; border: 1px solid rgba(255,255,255,0.08); border-radius: var(--raio-g); color: rgba(255,255,255,0.85); padding: 20px; box-shadow: var(--sombra-1); margin-bottom: 24px; }

/* Mini-mapa "zoom no local onde o robô estiver" — o wrapper
   (.pa-detalhe-robo-mapa-zoom) recebe o transform (scale + translate,
   montado inline em conteudoDetalheRobo), NUNCA a imagem sozinha: assim a
   planta e o marcador escalam/deslocam juntos e o marcador continua exatamente
   sobre o ponto certo da planta em qualquer zoom. */
.pa-detalhe-robo-mapa { cursor: default; }
.pa-detalhe-robo-mapa-legenda {
  position: absolute; top: 8px; left: 8px; z-index: 2;
  background: rgba(23, 22, 15, 0.72); color: #fff; font-size: 11px; font-weight: 700;
  padding: 4px 10px; border-radius: var(--raio-pill); letter-spacing: 0.02em;
  pointer-events: none; max-width: calc(100% - 16px); overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.pa-detalhe-robo-mapa-zoom {
  position: absolute; inset: 0; transform-origin: 50% 50%;
  transition: transform 0.25s ease;
}
/* Bug real encontrado nesta rodada: o marcador (pin) é filho de
   `.pa-detalhe-robo-mapa-zoom`, que tem `transform: scale(2.6)` (o zoom no
   entorno do robô, ver ZOOM_MAPA_DETALHE em dashboard.js) — como o marcador
   NÃO tinha nenhum contra-zoom próprio, ele era ampliado pelo mesmo 2,6x do
   mapa (medido: 40px -> ~104px renderizado), ficando um "rosto gigante"
   cobrindo boa parte do mini-mapa (era isso, e não a planta em si, que
   parecia "não carregar" — a planta continua atrás, só ficava tapada).
   `scale(calc(1 / 2.6))` aqui cancela o zoom do ancestral só pro TAMANHO do
   marcador — a posição (left/top em %, resolvida contra o layout do
   ancestral ANTES do transform) continua certa sobre o ponto do robô.
   02/09: o valor fixo 2.6 virou a custom property `--zoom-mapa-detalhe`
   (definida inline em `.pa-detalhe-robo-mapa-zoom` por detalheRoboMiniMapaHtml()
   em dashboard.js, herdada por este elemento por ser filho dela) -- agora
   este mini-mapa é reaproveitado com DOIS níveis de zoom diferentes (a
   página própria do robô usa 2.6, o modal "Localização em tempo real" do
   pop-up usa 2 -- ver ZOOM_MAPA_DETALHE/ZOOM_MAPA_DETALHE_MODAL), então o
   contra-zoom não podia mais ser um número fixo. O `2.6` depois da vírgula
   é só o valor de fallback, caso a custom property não chegue por algum
   motivo. */
.pa-detalhe-robo-marcador {
  position: absolute; width: 40px; height: 40px;
  transform: translate(-50%, -50%) scale(calc(1 / var(--zoom-mapa-detalhe, 2.6)));
  display: flex; align-items: center; justify-content: center; z-index: 1;
}
.pa-detalhe-robo-marcador img { width: 30px; height: 30px; object-fit: contain; position: relative; z-index: 1; filter: drop-shadow(0 2px 6px rgba(6, 6, 5, 0.4)); }
.pa-detalhe-robo-marcador-pulso {
  position: absolute; inset: 4px; border-radius: 50%; background: var(--acento);
  animation: pa-pulsar-marcador-robo 1.8s ease-out infinite;
}
@keyframes pa-pulsar-marcador-robo {
  0% { transform: scale(0.6); opacity: 0.55; }
  70% { transform: scale(1.8); opacity: 0; }
  100% { opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .pa-detalhe-robo-marcador-pulso { animation: none; opacity: 0.25; }
}

/* 02/09, pedido do Lincoln: cartão "Localização em tempo real" no card de
   detalhe do robô (pop-up) -- mesma ideia visual do "Ver robô em tempo
   real" da Entrega (indicador pulsante + mapa acinzentado), só que aqui
   clicar abre um modal (.pa-ativa-mapa-modal, reaproveitado) em vez de um
   card de progresso. Reaproveita @keyframes pa-pulsar-marcador-robo (já
   definida acima) pro ponto pulsante do próprio cartão. */
.pa-detalhe-robo-localizacao-card {
  display: flex; align-items: center; gap: 12px; width: 100%;
  background: rgba(0,0,0,0.4); border: 1px solid rgba(255,255,255,0.08); border-radius: var(--raio-m);
  padding: 12px 14px; cursor: pointer; text-align: left; color: inherit; font: inherit;
  transition: background var(--duracao-rapida), border-color var(--duracao-rapida);
}
.pa-detalhe-robo-localizacao-card:hover { background: var(--acento-suave); border-color: var(--acento-forte); }
.pa-detalhe-robo-localizacao-pulso-wrap { position: relative; width: 14px; height: 14px; flex: 0 0 14px; }
.pa-detalhe-robo-localizacao-pulso { position: absolute; inset: 3px; border-radius: 50%; background: var(--sucesso); }
.pa-detalhe-robo-localizacao-pulso::before {
  content: ''; position: absolute; inset: 0; border-radius: 50%; background: var(--sucesso);
  animation: pa-pulsar-marcador-robo 1.8s ease-out infinite;
}
@media (prefers-reduced-motion: reduce) {
  .pa-detalhe-robo-localizacao-pulso::before { animation: none; opacity: 0.25; }
}
.pa-detalhe-robo-localizacao-texto { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.pa-detalhe-robo-localizacao-texto strong { font-size: 13px; font-weight: 800; color: #fff; }
.pa-detalhe-robo-localizacao-texto span { font-size: 11.5px; color: rgba(255,255,255,0.55); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Sem posição conhecida -- vira um aviso não clicável (honestidade de
   sempre: nunca oferece uma ação que não teria dado nenhum pra mostrar). */
.pa-detalhe-robo-localizacao-card.indisponivel { cursor: default; }
.pa-detalhe-robo-localizacao-card.indisponivel:hover { background: rgba(0,0,0,0.4); border-color: rgba(255,255,255,0.08); }
.pa-detalhe-robo-localizacao-card.indisponivel svg { width: 18px; height: 18px; flex: 0 0 18px; color: var(--acento-forte); }

/* 02/09, pedido do Lincoln: "quando a localização não estiver disponível,
   mostrar o último mapa e a última posição atualizada" -- quando
   `info.posicaoAoVivo` é false (ver carregarInfoCompletaRobo() em
   dashboard.js), o cartão/mini-mapa continuam mostrando normalmente, só
   trocam o indicador verde pulsante por um neutro parado -- honesto sobre
   não ser uma leitura em tempo real, sem esconder a informação que temos. */
.pa-detalhe-robo-localizacao-card.desatualizada .pa-detalhe-robo-localizacao-pulso {
  background: rgba(255,255,255,0.35); animation: none;
}
.pa-detalhe-robo-localizacao-card.desatualizada .pa-detalhe-robo-localizacao-pulso::before { display: none; }
.pa-detalhe-robo-marcador.desatualizado img { filter: drop-shadow(0 2px 6px rgba(6, 6, 5, 0.4)) grayscale(0.7); opacity: 0.8; }
.pa-detalhe-robo-marcador.desatualizado .pa-detalhe-robo-marcador-pulso { animation: none; opacity: 0.3; }
.pa-detalhe-robo-mapa-selo-desatualizado {
  position: absolute; top: 8px; right: 8px; z-index: 2;
  background: rgba(23, 22, 15, 0.72); color: rgba(255,255,255,0.75); font-size: 10.5px; font-weight: 700;
  padding: 4px 10px; border-radius: var(--raio-pill); letter-spacing: 0.02em;
  pointer-events: none;
}

/* Bug real reportado pelo Lincoln (02/09): "o card do mapa dentro do card
   do robô não atualiza o mapa, não tem ponto, não tem nenhuma animação,
   nada" -- se a URL da planta (info.mapDetail.url) falhar (link expirado,
   caminho errado, CORS, etc.), o <img> simplesmente não aparece, e como
   .pa-mapa-picker-viewport tem overflow:hidden, nem o ícone padrão de
   "imagem quebrada" do navegador chega a mostrar -- fica tudo em branco,
   sem nenhuma pista do motivo (só o marcador, sozinho, continuava visível,
   já que é um elemento próprio sem depender da imagem). O onerror do <img>
   (ver detalheRoboMiniMapaHtml() em dashboard.js) chama
   mapaPlantaFalhouAoCarregar(), que loga a URL crua no console (nunca pro
   usuário) e adiciona esta classe -- escondendo a planta/marcador quebrados
   e mostrando um aviso honesto no lugar. */
.pa-detalhe-robo-mapa-erro {
  position: absolute; inset: 0; z-index: 2; display: none;
  align-items: center; justify-content: center; flex-direction: column; gap: 8px;
  text-align: center; padding: 24px;
  color: rgba(255,255,255,0.55); font-size: 12.5px; font-weight: 600;
}
.pa-detalhe-robo-mapa-erro svg { width: 22px; height: 22px; color: var(--acento-forte); }
.pa-mapa-picker-viewport.erro-carregar-planta .pa-detalhe-robo-mapa-zoom,
.pa-mapa-picker-viewport.erro-carregar-planta .pa-detalhe-robo-mapa-legenda,
.pa-mapa-picker-viewport.erro-carregar-planta .pa-detalhe-robo-mapa-selo-desatualizado { visibility: hidden; }
.pa-mapa-picker-viewport.erro-carregar-planta .pa-detalhe-robo-mapa-erro { display: flex; }

/* ---------------------------------------------------------------------
   Colunas do Início
   --------------------------------------------------------------------- */
.pa-colunas-inicio { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; align-items: start; margin-top: 16px; }
.pa-coluna-card {
  /* Mesmo pedido/mesma técnica do .pa-kpi acima (01/09) — cor da topbar,
     escopada só aqui, sem tocar em --superficie global. Vale pros 3 painéis
     que usam esta classe (Robôs em tempo real, Realize uma Task, Atalhos).
     Os "tiles" claros de dentro (.pa-robo-card, .pa-acao-btn) NÃO mudam —
     são auto-contidos (fundo+texto próprios, sempre claros) e continuam
     legíveis flutuando sobre o painel escuro, mesmo padrão "cards claros
     sobre fundo escuro" já usado noutras telas do app (ex. Entrega). Só o
     texto que fica DIRETO sobre este fundo (título/subtítulo do painel,
     rótulo dos Atalhos) precisou de cor própria — ver abaixo. */
  background: #101010; border: 1px solid rgba(255,255,255,0.08); border-radius: var(--raio-g);
  padding: 22px; box-shadow: var(--sombra-1);
  /* Mesmo motivo do .pa-kpi acima — sem isso, o card não encolhe abaixo do
     min-content do conteúdo (ex.: a grade 2x2 de ações) e estoura a
     largura da coluna em telas estreitas. */
  min-width: 0;
}
.pa-coluna-cabeca { margin-bottom: 16px; }
.pa-coluna-titulo { font-size: 15.5px; font-weight: 800; margin: 0 0 3px; color: #fff; }
.pa-coluna-sub { font-size: 12.5px; color: rgba(255,255,255,0.55); margin: 0; font-weight: 600; }

.pa-dica-selecao {
  font-size: 12px; font-weight: 600; color: var(--texto-fraco);
  background: var(--superficie-2); border-radius: var(--raio-p); padding: 10px 12px; margin: 0 0 14px;
}
.pa-dica-selecao[hidden] { display: none; }

/* Grade de ações (Realize uma Task) — botões maiores (pedido do Lincoln:
   "vamos aumentar um pouco mais os botões"), sempre clicáveis agora (não
   dependem mais de selecionar um robô no carrossel). */
.pa-acoes-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; }
/* 01/09, pedido do Lincoln: "os botões em branco, quero excluir o branco
   desse painel" — os 4 botões de "Realize uma Task" (Entrega/Modo
   cruzeiro/Mapa/Demais funções) tinham ficado brancos de propósito numa
   rodada anterior (como "tile claro flutuando sobre o painel escuro"),
   mas o Lincoln pediu pra também escurecer. Mesma cor/borda dos cards já
   escurecidos (#101010); como o botão vive dentro de um painel
   (`.pa-coluna-card`) da MESMA cor, a borda ficou um pouco mais clara
   (rgba(255,255,255,0.12), igual já foi feito no `.pa-robo-card`) pra
   continuar reconhecível como um botão à parte. */
.pa-acao-btn {
  display: flex; flex-direction: column; align-items: flex-start; gap: 12px;
  background: #101010;
  border: 1px solid rgba(255,255,255,0.12);
  border-radius: var(--raio-m);
  padding: 20px 18px;
  min-height: 108px;
  text-align: left;
  cursor: pointer;
  box-shadow: none;
}
.pa-acao-btn:hover { border-color: var(--acento-suave-2); background: var(--acento-suave); }
.pa-acao-icone {
  width: 44px; height: 44px;
  border-radius: var(--raio-p);
  background: rgba(255,255,255,0.06);
  border: 1px solid rgba(255,255,255,0.08);
  color: var(--acento-forte);
  display: flex; align-items: center; justify-content: center;
}
.pa-acao-icone svg { width: 21px; height: 21px; }
.pa-acao-label { font-size: 15.5px; font-weight: 800; color: #fff; }
.pa-acao-desc { font-size: 12px; color: rgba(255,255,255,0.55); font-weight: 600; margin-top: -6px; }
.pa-acao-tag {
  font-size: 9.5px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.3px;
  color: rgba(255,255,255,0.4); background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.08);
  border-radius: var(--raio-pill); padding: 2px 7px; align-self: flex-start;
}

/* ---------------------------------------------------------------------
   Carrossel "Robôs em tempo real" — mostra TODOS os robôs da loja numa
   fileira horizontal com rolagem/scroll-snap (pedido do Lincoln: "vamos
   fazer como se fosse um carrossel com todos os robôs da loja"), com setas
   de navegação pra desktop. Card ocupa a largura toda (fica acima da grade
   de 2 colunas "Realize uma Task"/"Atalhos", que ficam por baixo).
   --------------------------------------------------------------------- */
.pa-carrossel-secao { margin-bottom: 0; }
.pa-carrossel-cabeca { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.pa-carrossel-setas { display: flex; gap: 6px; flex: 0 0 auto; }
/* 01/09: mesmo vidro escuro do `.pa-kpi-icone`/`.pa-atalho-icone` — o
   painel ao redor (`.pa-coluna-card`) ficou escuro, então o chip creme
   original (var(--superficie-2)) + ícone escuro (var(--texto)) ficariam
   quase invisíveis; cor do ícone também precisou virar clara. */
.pa-carrossel-seta {
  width: 32px; height: 32px; border-radius: var(--raio-p); border: 1px solid rgba(255,255,255,0.08);
  background: rgba(255,255,255,0.06); color: rgba(255,255,255,0.75); display: flex; align-items: center; justify-content: center;
  cursor: pointer; transition: border-color var(--duracao-rapida) ease, transform var(--duracao-rapida) ease;
}
.pa-carrossel-seta:hover:not(:disabled) { border-color: var(--acento-suave-2); transform: translateY(-1px); }
.pa-carrossel-seta:active:not(:disabled) { transform: scale(0.9); }
.pa-carrossel-seta:disabled { opacity: 0.35; cursor: not-allowed; }
.pa-carrossel-seta svg { width: 15px; height: 15px; transition: transform 0.15s ease; }
/* Pedido do Lincoln (31/08): "adicione uma animação de scroll nas setinhas,
   para que não fique tão estático" — a seta em si (hover/active acima) já
   ganhou uma leve resposta ao toque; isso aqui é o "empurrão" na SETA
   (ícone) na hora do clique, sincronizado com a rolagem que ele dispara —
   um nudge de uns 4px na direção do movimento e volta, ligado/desligado via
   JS (ver animarEmpurraoSetaCarrossel em dashboard.js) toda vez que a seta é
   clicada, pra dar a sensação de "empurrar" a fileira em vez de um clique
   seco e estático. */
@keyframes pa-carrossel-seta-empurra-esquerda { 0% { transform: translateX(0); } 40% { transform: translateX(-4px); } 100% { transform: translateX(0); } }
@keyframes pa-carrossel-seta-empurra-direita { 0% { transform: translateX(0); } 40% { transform: translateX(4px); } 100% { transform: translateX(0); } }
.pa-carrossel-seta.empurra-esquerda svg { animation: pa-carrossel-seta-empurra-esquerda 0.4s ease; }
.pa-carrossel-seta.empurra-direita svg { animation: pa-carrossel-seta-empurra-direita 0.4s ease; }

.pa-carrossel-robos {
  display: flex; gap: 12px; overflow-x: auto; scroll-snap-type: x proximal;
  padding: 2px 2px 6px; margin: 0 -2px; scroll-behavior: smooth;
  scrollbar-width: none; -ms-overflow-style: none;
  cursor: grab; /* pedido do Lincoln: arrastar a listagem com o mouse (efeito carrossel do exemplo motion.dev) */
}
/* Poucos robôs (fileira cabe toda na largura, sem precisar rolar) —
   centraliza os cards em vez de deixá-los colados na esquerda; a classe é
   ligada/desligada via JS (atualizarSetasCarrossel), a mesma checagem que já
   habilita/desabilita as setas. Com robôs suficientes pra precisar de
   rolagem, essa classe não é aplicada — `justify-content:center` com
   overflow ativo esconde o início da fileira atrás da centralização. */
.pa-carrossel-robos.sem-rolagem { justify-content: center; }
.pa-carrossel-robos::-webkit-scrollbar { display: none; }
/* Estado de arraste ativo (ligado/desligado em ligarArrasteCarrosselRobos,
   dashboard.js) — desliga o snap/scroll suave enquanto a pessoa está com o
   botão do mouse pressionado (senão o navegador briga com o scrollLeft que o
   JS está definindo a cada movimento, travando o arraste); some o cursor de
   "mãozinha aberta" pro de "mãozinha fechada", igual o padrão já visto em
   outros lugares que arrastam nesta plataforma (ex.: o mapa da Entrega).
   `pointer-events:none` nos cards evita hover/foco piscando embaixo do
   cursor enquanto a fileira desliza. */
.pa-carrossel-robos.arrastando { cursor: grabbing; scroll-snap-type: none; scroll-behavior: auto; user-select: none; }
.pa-carrossel-robos.arrastando .pa-robo-card { pointer-events: none; }
/* 01/09, pedido do Lincoln: "todos os cards brancos... da mesma cor" — o
   card de cada robô do carrossel trocou de var(--superficie) (branco) pra
   a mesma cor do resto (#101010/borda translúcida), igual `.pa-kpi`/
   `.pa-coluna-card` acima. Como agora ele vive DENTRO de um painel da MESMA
   cor (`.pa-coluna-card`), a borda é o que separa um do outro visualmente
   — por isso NÃO usei o mesmo tom de borda do painel pai (ficaria "solto",
   sem contorno perceptível); em vez disso um tom levemente mais claro
   (rgba(255,255,255,0.12)) pra o card continuar reconhecível como um
   cartão à parte. Textos internos (nome/SN/local), antes escuros
   (pensados pro card branco original), ganharam cor clara própria. */
.pa-robo-card {
  flex: 0 0 172px; scroll-snap-align: start; min-width: 0;
  display: flex; flex-direction: column; gap: 10px;
  padding: 14px; border-radius: var(--raio-m); border: 1px solid rgba(255,255,255,0.12); background: #101010;
  cursor: pointer; text-align: left;
  transition: border-color var(--duracao-rapida) ease, background var(--duracao-rapida) ease, transform var(--duracao-rapida) ease, box-shadow var(--duracao-rapida) ease;
}
/* 31/08, pedido do Lincoln: "ao passar o mouse em algum item do carrossel,
   o mesmo amplia levemente (como destaque)" -- amplitude pequena (2%) pra
   ficar sutil, não brigar com o resto da fileira; `z-index` sobe junto pra
   o card ampliado não ficar por baixo do vizinho (ele cresce um pouco além
   da própria largura). Não aplica durante o arraste (`.arrastando` já
   desliga `pointer-events` nos cards -- ver item 28 -- então o hover nunca
   dispara nesse momento mesmo sem regra extra aqui).
   01/09: fundo do hover trocado de var(--superficie-2) (creme) pra um
   overlay branco translúcido, mesma técnica já usada no hover do
   `.pa-atalho-item` acima — combina com o card agora escuro. */
.pa-robo-card:hover { border-color: var(--acento-suave-2); background: rgba(255,255,255,0.07); transform: scale(1.035); box-shadow: var(--sombra-2); z-index: 1; position: relative; }
.pa-robo-card.selecionado { border-color: var(--acento-suave-2); background: var(--acento-suave); }
.pa-robo-card-foto {
  width: 100%; height: 88px; border-radius: var(--raio-p); background: rgba(255,255,255,0.06);
  display: flex; align-items: center; justify-content: center; overflow: hidden; flex: 0 0 auto; position: relative;
}
.pa-robo-card-foto img { width: 100%; height: 100%; object-fit: contain; }
.pa-robo-card-foto svg { width: 28px; height: 28px; color: rgba(255,255,255,0.35); }
.pa-robo-card-check {
  position: absolute; top: 6px; right: 6px; width: 18px; height: 18px; border-radius: 50%;
  background: var(--sucesso); color: #fff; display: flex; align-items: center; justify-content: center;
}
.pa-robo-card-check svg { width: 11px; height: 11px; }
.pa-robo-card-nome { font-size: 13.5px; font-weight: 800; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: #fff; }
.pa-robo-card-sn { font-size: 10.5px; color: rgba(255,255,255,0.4); font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: -6px; letter-spacing: 0.1px; }
.pa-robo-card-local { font-size: 11px; color: rgba(255,255,255,0.55); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: -5px; }
.pa-robo-card-rodape { display: flex; align-items: center; }
.pa-robo-card-rodape .pa-chip { font-size: 10.5px; padding: 4px 9px; }
.pa-carrossel-vazio { font-size: 13px; color: rgba(255,255,255,0.55); font-weight: 600; margin: 0; }

/* Atalhos */
.pa-atalhos-lista { display: flex; flex-direction: column; gap: 2px; }
.pa-atalho-item {
  display: flex; align-items: center; gap: 12px; width: 100%;
  background: transparent; border: none; padding: 11px 6px; border-radius: var(--raio-m);
  cursor: pointer; text-align: left;
}
/* Hover trocado de var(--superficie-2) (creme, pensado pro card branco
   original) pra um overlay branco translúcido — combina com o painel
   escuro novo (ver .pa-coluna-card acima) sem "acender" um retângulo claro
   atrás do rótulo, que agora é texto claro (ver .pa-atalho-label abaixo). */
.pa-atalho-item:hover { background: rgba(255,255,255,0.08); }
/* Mesmo tratamento do `.pa-kpi-icone` (01/09) — vidro escuro sutil em vez
   do chip creme original, já que o painel ao redor (`.pa-coluna-card`)
   também é escuro agora. */
.pa-atalho-icone {
  width: 32px; height: 32px; border-radius: var(--raio-p); background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.08);
  color: var(--acento-forte); display: flex; align-items: center; justify-content: center; flex: 0 0 auto;
}
.pa-atalho-icone svg { width: 16px; height: 16px; }
.pa-atalho-label { flex: 1; font-size: 13.5px; font-weight: 700; color: rgba(255,255,255,0.85); }
.pa-atalho-item svg.pa-atalho-seta { width: 16px; height: 16px; color: rgba(255,255,255,0.35); flex: 0 0 auto; }

/* ---------------------------------------------------------------------
   Navegação / voltar (telas focadas: entrega, em breve)
   --------------------------------------------------------------------- */
/* Estas duas telas (Entrega, Em breve) ficam direto sobre o fundo escuro da
   página (--fundo), sem cartão claro por baixo — por isso usam cor clara
   explícita aqui, em vez de herdar var(--texto) (pensado pra texto sobre
   cartão branco). */
.pa-voltar {
  background: transparent; border: none; color: rgba(255,255,255,0.6);
  font-size: 13.5px; font-weight: 700; padding: 0; margin-bottom: 20px;
  display: flex; align-items: center; gap: 6px; cursor: pointer;
}
.pa-voltar:hover { color: var(--acento); }
.pa-voltar svg { width: 16px; height: 16px; }

.pa-titulo-tela { font-size: 20px; font-weight: 900; margin: 0 0 6px; letter-spacing: -0.2px; display: flex; align-items: center; color: #fff; }
.pa-titulo-tela .barra { width: 4px; height: 16px; background: var(--acento); border-radius: 2px; display: inline-block; margin-right: 10px; }
.pa-subtitulo-tela { font-size: 13.5px; color: rgba(255,255,255,0.6); margin: 0 0 22px; font-weight: 600; }

/* Entrega — passos "destinos"/"acompanhar" (header enxuto + corpo branco).
   O passo "escolher robô" NÃO usa mais este visual — ele foi unificado com
   o quadro cheio do menu (.pa-entrega-menu, mais abaixo), pedido do
   Lincoln: a escolha do robô tem que acontecer "naquela telinha toda
   formatada", não num layout separado. */
.pa-entrega-passo-legenda {
  font-size: 11px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em;
  color: var(--acento); margin: 0 0 14px;
}
.pa-link-trocar {
  display: inline-block; background: transparent; border: none; padding: 0; margin: -8px 0 16px;
  font-size: 12.5px; font-weight: 700; color: rgba(255,255,255,0.6); cursor: pointer; text-decoration: underline;
}
.pa-link-trocar:hover { color: var(--acento); }
/* 26/08: o .pa-link-trocar padrao tem margem negativa em cima (pensado pra
   ficar colado no topo do carrossel de troca de robo) -- no botao "Ver
   todos os robos" (que fica embaixo do subtitulo do menu da Entrega, nao no
   topo de nada) isso empurrava o texto pra cima de mais. Este modificador so
   ajusta a margem, sem duplicar o resto do estilo. */
/* 26/08: o botão "Ver todos os robôs" mudou de lugar (correção do
   Lincoln) -- não fica mais colado no subtítulo do menu, agora vive no
   rodapé do carrossel (.pa-entrega-carrossel-rodape), embaixo do botão
   "Escolher este robô". Esse rodapé já é uma coluna centralizada com
   gap:12px entre os itens, então aqui só precisa remover a margem negativa
   padrão do .pa-link-trocar (pensada pra ficar colado no topo do
   carrossel de troca de robô, não no meio de uma coluna). */
.pa-link-trocar.ver-todos-robos { margin: 0; }

/* 31/08: rota TOPOGRÁFICA real (elementos `track` de element_list),
   sobreposta à planta do mapa nos passos "destinos" e "ativa" (ver
   entregaTrajetoSvgHtml em dashboard.js) — substitui a prévia reta antiga
   entre pontos marcados.
   01/09, pedido do Lincoln ("o traçejado da rota topográfica deve ser da
   cor branca"): trocada de magenta/rosa pra branco (com um glow suave, mais
   discreto que o magenta original) — bate com a imagem de referência que
   ele mandou pra esta mesma tela, e contrasta melhor com o resto do mapa
   escurecido (item 12 do backlog) sem competir visualmente com os pontos
   (amarelo/âmbar) nem o marcador do robô. */
/* `inset:0` sozinho não é suficiente pra esticar um <svg> sem width/height
   próprios (ele cai pro tamanho intrínseco default do elemento substituído
   em vez do tamanho do container) — por isso width/height:100% explícitos. */
.pa-entrega-trajeto { position: absolute; inset: 0; width: 100%; height: 100%; pointer-events: none; }
.pa-entrega-trajeto polyline {
  fill: none; stroke: #ffffff; stroke-width: 1; stroke-dasharray: 2 1.6;
  opacity: 0.85; vector-effect: non-scaling-stroke;
  filter: drop-shadow(0 0 3px rgba(255,255,255,0.75));
  animation: pa-entrega-trajeto-fluxo 1.4s linear infinite;
}
/* Decorativo (não funcional/de status) — ao contrário do pulso do marcador
   do robô (ver item 22 do backlog), respeita a preferência do sistema. */
@media (prefers-reduced-motion: reduce) {
  .pa-entrega-trajeto polyline { animation: none; }
}
@keyframes pa-entrega-trajeto-fluxo { from { stroke-dashoffset: 7.2; } to { stroke-dashoffset: 0; } }

/* 28/08: Passo 3 (tela "Comando de entrega") redesenhado a partir de uma
   referência visual do Lincoln — grade de cards (progresso / mapa ao vivo),
   card de "voltar pra base" e uma barra de botões circulares só-ícone pro
   comando (pausar/retomar/concluir/cancelar), no lugar da antiga grade de
   botões retangulares com texto (.pa-entrega-comandos, removida). Os cards
   usam o mesmo "vidro" translúcido escuro do .pa-mapa-picker, já que este
   passo inteiro vive dentro do hero escuro da tela de Entrega. */
.pa-ativa-grade { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; margin: 14px 0; }
.pa-ativa-card {
  background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.10);
  border-radius: var(--raio-g); padding: 16px; box-shadow: var(--sombra-1);
}
.pa-ativa-card-titulo { font-size: 12.5px; font-weight: 800; color: rgba(255,255,255,0.6); margin: 0 0 8px; text-transform: uppercase; letter-spacing: 0.02em; }
.pa-ativa-progresso-numero { font-size: 30px; font-weight: 800; color: #fff; margin: 0 0 12px; line-height: 1; }
.pa-ativa-progresso-numero span { font-size: 16px; font-weight: 700; color: rgba(255,255,255,0.5); margin-left: 4px; }
/* 01/09: redesenho a partir da referência nova -- cada linha era "rótulo
   .... valor" espremido nas duas pontas (justify-content:space-between);
   virou bolinha numerada + coluna (rótulo pequeno em cima, valor forte
   embaixo), tudo alinhado à esquerda -- ver entregaAtivaProgressoHtml()
   em dashboard.js pro novo HTML (agora são 2 <span> por linha, não mais
   <span>+<strong> soltos, por isso as regras antigas "linha span"/"linha
   strong" saíram: cada uma tem sua própria classe agora). */
.pa-ativa-progresso-linha { display: flex; align-items: center; gap: 12px; padding: 10px 0; border-top: 1px solid rgba(255,255,255,0.08); }
.pa-ativa-progresso-bolha {
  flex: 0 0 auto; width: 28px; height: 28px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: rgba(124,92,191,0.3); border: 1px solid rgba(124,92,191,0.6);
  color: #fff; font-size: 12px; font-weight: 800;
}
.pa-ativa-progresso-texto { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.pa-ativa-progresso-texto em { font-style: normal; font-size: 11.5px; font-weight: 600; color: rgba(255,255,255,0.55); }
.pa-ativa-progresso-texto strong { color: #fff; font-weight: 700; font-size: 14px; }
/* 31/08 (2a leva): "Ponto atual" virou clicável (abre o mapa em tempo real
   — ver entregaAtivaProgressoHtml() em dashboard.js), no lugar do botão
   redondo removido. Sublinhado pontilhado + cursor de link deixam claro que
   dá pra clicar sem parecer um botão "de verdade" destoando do resto da
   linha. 01/09: alinhamento voltou pra esquerda (era right, da época da
   linha "duas pontas" que não existe mais). */
.pa-ativa-progresso-atual-btn {
  display: block;
  background: none; border: none; padding: 0; cursor: pointer;
  color: #fff; font-weight: 700; font-size: 14px; font-family: inherit;
  text-align: left; text-decoration: underline dotted rgba(255,255,255,0.5);
  text-underline-offset: 3px;
}
.pa-ativa-progresso-atual-btn:hover { color: var(--acento); }
/* Aviso persistente de tarefa finalizada (concluída/cancelada) — some
   quando `tarefaFinalizada` volta a null (ver entregaFinalizadaAvisoHtml()).
   Fica sozinho no fluxo, sem `position:absolute`, entre a fileira de
   comandos (agora travados) e o card de "voltar à base". */
.pa-ativa-cheio-finalizada {
  position: relative; z-index: 2;
  margin: 14px 0 0; max-width: 420px;
  background: rgba(199,169,79,0.14); border: 1px solid rgba(199,169,79,0.4);
  color: #fff; font-size: 13px; font-weight: 600; line-height: 1.4;
  padding: 10px 14px; border-radius: var(--raio-g);
}
.pa-ativa-card-mapa .pa-btn { justify-content: center; margin-bottom: 0; }
.pa-ativa-card-mapa .pa-mapa-picker { margin: 14px 0 0; }
/* Em telas estreitas os dois cards da grade (progresso/mapa) empilham —
   o card do mapa tem conteúdo bem mais alto quando aberto (viewport +
   controles de zoom), então força ele a ocupar a largura toda mesmo na
   grade de 2 colunas em telas largas, evitando um card de progresso
   "esticado" pra acompanhar a altura do mapa ao lado. */
@media (max-width: 720px) {
  .pa-ativa-grade { grid-template-columns: 1fr; }
}
.pa-ativa-card-base { display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; }
.pa-ativa-card-base-texto { flex: 1; min-width: 200px; }
.pa-ativa-card-base .pa-btn { flex: 0 0 auto; }
.pa-ativa-comandos { display: flex; align-items: flex-start; justify-content: center; gap: 28px; margin: 22px 0 6px; }
/* 01/09 (1ª rodada): cada comando virou um ITEM (círculo + rótulo embaixo),
   não só o círculo sozinho — pedido explícito do Lincoln ("nome da ação
   abaixo do círculo"), sem criar nenhum card/fundo retangular por trás do
   conjunto: o wrapper era só flex, sem background/borda próprios.
   01/09 (2ª rodada, referência nova da tela inteira): os 4 itens viraram
   CARDS de verdade (mesmo "vidro" translúcido dos outros blocos desta
   tela — progresso, voltar à base) — o círculo colorido + rótulo continuam
   dentro, só ganharam uma moldura em volta em vez de flutuar soltos sobre
   a foto (um dos motivos da tela ficar "com informação jogada"). */
.pa-ativa-comando-item {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;
  flex: 1 1 0; min-width: 0;
  background: rgba(0,0,0,0.82);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: var(--raio-g);
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
  box-shadow: var(--sombra-2);
  /* 11/09: pedido do Lincoln -- "diminuir um pouco eles" (junto com o
     reposicionamento pro centro da tela) -- padding e fonte reduzidos um
     pouco (18px 10px -> 14px 10px), acompanhando o círculo menor logo
     abaixo (.pa-ativa-comando-btn). */
  padding: 14px 10px;
}
.pa-ativa-comando-label {
  font-size: 11.5px; font-weight: 700; color: rgba(255,255,255,0.85);
  text-shadow: 0 1px 3px rgba(0,0,0,0.7); text-align: center;
}
.pa-ativa-comando-btn {
  /* 11/09: pedido do Lincoln -- "diminuir um pouco eles" -- 62px -> 54px. */
  width: 54px; height: 54px; border-radius: 50%; border: none; cursor: pointer;
  display: flex; align-items: center; justify-content: center; color: #fff;
  box-shadow: var(--sombra-2); transition: transform 0.15s ease, box-shadow 0.15s ease;
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
}
.pa-ativa-comando-btn:hover { transform: translateY(-2px); }
.pa-ativa-comando-btn:active { transform: translateY(0); }
.pa-ativa-comando-btn svg { width: 20px; height: 20px; }
/* 31/08 (2a leva): Lincoln achou as 4 cores "muito vivas/berrantes" nesta
   tela em tela cheia sobre a foto (funcionavam bem como chip pequeno de
   status, mas em botão grande de 54px ficam gritantes). Cores dedicadas e
   dessaturadas SÓ para estes 4 botões — não mexe nos tokens globais
   (--alerta/--sucesso/--acento/--erro), que continuam servindo chips/
   badges/outros botões no resto do app exatamente como antes.
   01/09, ajuste fino a partir da referência nova: os 4 círculos ganharam
   uma leve transparência + glow própria de cada cor (pedido explícito —
   "leve transparência, glow extremamente discreto") no lugar da cor sólida
   opaca de antes. "Concluir" deixou de ser dourado (ficava parecido com
   "Pausar") e virou roxo/grafite com destaque, cor dedicada só pra esta
   tela (não mexe em nenhum token global). */
.pa-ativa-comando-btn.pausar { background: rgba(169,121,63,0.62); box-shadow: var(--sombra-2), 0 0 16px rgba(169,121,63,0.35); }
.pa-ativa-comando-btn.retomar { background: rgba(79,143,110,0.62); box-shadow: var(--sombra-2), 0 0 16px rgba(79,143,110,0.35); }
.pa-ativa-comando-btn.concluir { background: rgba(124,92,191,0.68); box-shadow: var(--sombra-2), 0 0 18px rgba(124,92,191,0.45); }
.pa-ativa-comando-btn.cancelar { background: rgba(178,90,86,0.62); box-shadow: var(--sombra-2), 0 0 16px rgba(178,90,86,0.35); }
@media (prefers-reduced-motion: reduce) {
  .pa-ativa-comando-btn { transition: none; }
}
/* 31/08 (2a leva): quando a tarefa termina (concluída ou cancelada), os 4
   comandos ficam travados em vez da tela sumir — ver
   entregaFinalizadaAvisoHtml()/atualizarEntregaAtivaFinalizacao() em
   dashboard.js. Opacidade reduzida + cursor "not-allowed" deixa claro que
   não tem mais ação disponível, sem esconder os botões (a pessoa ainda vê
   o desenho final da tela, só não consegue mais clicar). */
.pa-ativa-comando-btn:disabled {
  opacity: 0.4; cursor: not-allowed; filter: grayscale(0.4);
}
.pa-ativa-comando-btn:disabled:hover { transform: none; }

/* 31/08: redesenho completo do passo "ativa" (item 17 do backlog) — tela
   cheia flutuando sobre a foto cinematográfica do robô (`.pa-entrega-menu-
   fundo`, já full-bleed desde o item 15), mesma linguagem visual já validada
   no passo "destinos" (item 27: painéis/controles translúcidos com blur
   sobre um fundo full-bleed) — ver `entregaAtivaTelaCheiaHtml()` em
   dashboard.js. Reaproveita as classes de conteúdo já existentes
   (`.pa-ativa-card-titulo`, `.pa-ativa-progresso-*`, `.pa-ativa-comandos`,
   `.pa-ativa-comando-btn`) por dentro — só a MOLDURA/posicionamento é nova. */
.pa-ativa-cheio {
  position: relative;
  flex: 1;
  min-height: 0;
  display: flex; flex-direction: column;
  /* 04/09: pedido do Lincoln -- "deixar os cards menos colados com a
     lateral da página" -- 20px -> 32px (mesmo respiro usado nos cantos dos
     cards abaixo, pra tudo alinhar). */
  padding: 32px;
}
.pa-ativa-cheio-topbar {
  position: relative; z-index: 3;
  display: flex; align-items: center; gap: 14px;
  margin-bottom: 0;
}
/* 01/09: pedido do Lincoln (referência) -- breadcrumb + título viram UM
   elemento só ("← Comando de entrega", ver entregaAtivaTelaCheiaHtml()) no
   lugar de "Voltar para a etapa anterior" + título centralizado separados.
   Cor/tamanho subiram (era o cinza discreto padrão de `.pa-voltar`) porque
   aqui ele também FAZ as vezes de título da tela, não só um link de voltar
   secundário. */
.pa-ativa-cheio-voltar {
  margin-bottom: 0; filter: drop-shadow(0 1px 3px rgba(0,0,0,0.6));
  color: rgba(255,255,255,0.92); font-size: 15px;
}
.pa-ativa-cheio-voltar svg { width: 15px; height: 15px; }
/* 04/09: a pílula de bateria da topbar saiu -- pedido do Lincoln ("remover
   o indicador de bateria lá perto da topbar"); a barra de status debaixo
   (`entregaMenuStatusHtml()`) já mostra a bateria de um jeito mais legível
   (número + barra), essa aqui só duplicava a informação. */
/* 11/09: pedido do Lincoln -- deixar a tela responsiva de verdade (caber
   bem em qualquer monitor e no celular, sem apertar) + botões de comando
   mais centralizados. Antes, a coluna direita (mapa/nova-entrega/voltar-
   base) era `position:absolute` com largura fixa em px calibrada à mão
   contra 3 breakpoints testados (1440/1280/800) -- o conteúdo da esquerda
   nunca soube quanto espaço ela realmente ocupava, então "centralizar" os
   comandos só dava pra fazer com risco de invadir o mapa em telas mais
   estreitas que as testadas. Este wrapper novo (`.pa-ativa-cheio-corpo`)
   vira um flex ROW de verdade com as duas colunas como filhos reais --
   agora elas SEMPRE dividem o espaço disponível corretamente, em qualquer
   largura, sem precisar recalibrar nada à mão pra cada monitor novo. */
/* 21/09: pedido do Lincoln (com print anotado) -- "jogar o mapa e os
   botões pro canto direito da tela e as opções de comando no canto
   esquerdo". As duas colunas já eram flex-grow:1 com max-width (640px/
   560px) -- em monitores bem largos as duas batiam no teto do max-width
   e sobrava espaço livre depois da coluna direita (sem `justify-content`
   definido, o padrão é `flex-start`, que empilha as duas colunas coladas
   à esquerda e deixa a sobra do lado de fora, à direita do mapa -- por
   isso o mapa não ficava realmente "no canto"). `justify-content:
   space-between` distribui essa sobra entre as duas colunas em vez de
   deixá-la solta depois da última -- a esquerda cola no canto esquerdo
   de verdade e o mapa cola no canto direito de verdade, em qualquer
   largura de tela. */
.pa-ativa-cheio-corpo {
  position: relative; z-index: 2;
  flex: 1; min-height: 0;
  display: flex; gap: 32px;
  justify-content: space-between;
  margin-top: 28px;
}
.pa-ativa-cheio-coluna-esquerda {
  flex: 1 1 380px; min-width: 0; max-width: 640px;
  display: flex; flex-direction: column; min-height: 0;
}
.pa-ativa-cheio-headline {
  position: relative; z-index: 2;
  margin: 0; max-width: 420px;
}
.pa-ativa-cheio-headline h2 {
  /* 04/09: pedido do Lincoln -- "aumentar os textos entrega em andamento"
     -- 26px -> 34px. */
  margin: 0 0 6px; font-size: 34px; font-weight: 900; color: #fff;
  text-shadow: 0 2px 10px rgba(0,0,0,0.55);
}
/* 31/08 (2a leva): Lincoln pediu o cabeçalho "Entrega em andamento" MENOR e
   mais colado no topo (era um título grande de "passo", igual aos passos
   1/2 — mas este passo agora é o foco principal da tela, não um mero
   título de etapa; o texto de apoio "Acompanhe e controle o robô" saiu,
   virando redundante com o resto do conteúdo logo abaixo). */
.pa-ativa-cheio-headline-compacta { margin-top: 10px; }
.pa-ativa-cheio-headline-compacta h2 { font-size: 17px; margin-bottom: 4px; }
/* 01/09: o subtítulo "Acompanhe e controle o robô" entrou pra dentro de
   #entregaAtivaTitulo (ver entregaAtivaTituloTopoHtml() em dashboard.js),
   pra ficar entre o título e o selo, na ordem certa da referência nova --
   por isso ganhou classe própria em vez de continuar pego pelo seletor
   genérico `> p` (que só pegava filho DIRETO de .pa-ativa-cheio-headline;
   o subtítulo agora é neto, não filho). Mesmo visual de antes. */
.pa-ativa-cheio-subtitulo { margin: 0 0 10px; color: rgba(255,255,255,0.75); font-size: 14px; font-weight: 600; text-shadow: 0 1px 4px rgba(0,0,0,0.5); }
/* 01/09: achado ao conferir a prévia visual do título/selo virando
   atualizável (ver entregaAtivaTituloTopoHtml()) -- o selo (`.pa-kpi-
   status`) não tinha nenhuma margem própria, ficando colado direto no
   subtítulo "Acompanhe e controle o robô" logo abaixo, quase se
   misturando visualmente com ele. Pequeno respiro só aqui, sem mexer no
   `.pa-kpi-status` global (usado em vários outros lugares que já
   funcionam bem). */
#entregaAtivaTitulo .pa-kpi-status { margin-bottom: 8px; }
.pa-ativa-cheio-robo { margin: -4px 0 10px; color: rgba(255,255,255,0.5); font-size: 12px; }
.pa-ativa-cheio-headline #entregaMensagem:empty,
.pa-ativa-cheio-headline #entregaAtivaStatus:empty { display: none; }
/* Cards flutuantes translúcidos — mesmo "vidro" escuro com blur do painel
   do passo "destinos" (.pa-entrega-destinos-cheio-painel), só reposicionado
   por card em vez de um painel único: progresso fica em cima à esquerda
   (como na referência do Lincoln), "voltar à base" embaixo à direita. */
/* 11/09: era `position:absolute` (assumia que cada card flutuava sozinho,
   posicionado à parte, num canto calculado em px) -- mas os 4 usos deste
   card (progresso/mapa/nova-entrega/base) já tinham virado filhos normais
   de fluxo flex (coluna-esquerda ou coluna-direita) e cada um precisava
   sobrescrever de volta pra `position:relative` só pra se comportar direito
   dentro da coluna (ver comentários nas regras deles abaixo). Trocado a
   base pra `relative` -- nenhum destes 4 cards precisa mais de posição
   própria fora do fluxo da coluna que os contém; os overrides individuais
   ficaram redundantes, mas inofensivos (mantidos como estão). */
.pa-ativa-cheio-card {
  position: relative; z-index: 2;
  background: rgba(0,0,0,0.82);
  border: 1px solid rgba(255,255,255,0.14);
  backdrop-filter: blur(8px);
  box-shadow: var(--sombra-2);
}
.pa-ativa-cheio-progresso {
  /* 31/08: era `top:128px` fixo, mas a altura do bloco de headline varia
     (aviso "Pudu ainda não confirmou..." e o status às vezes ocupam mais
     linhas) -- com posição absoluta fixa isso fazia o card de progresso
     SOBREPOR o texto do headline quando havia aviso. Trocado pra ficar no
     fluxo normal logo abaixo do headline (sempre "gruda" embaixo dele,
     não importa a altura), só os cards de canto (base/expandir mapa)
     continuam absolutos porque não dependem da altura do headline. */
  position: relative; align-self: flex-start;
  /* 04/09: pedido do Lincoln -- "aumentar o card progresso da entrega" --
     280px -> 340px. 11/09: pedido novo -- "aumentar um pouco mais o card"
     -- 340px -> 380px, acompanhando o pedido de encolher levemente os
     botões de comando logo abaixo (ver .pa-ativa-comando-btn) pra manter as
     proporções entre os dois blocos coerentes. */
  width: 380px; max-width: calc(100% - 40px);
  margin: 20px 0 0;
}
/* 04/09: deixou de ter posição própria (position:absolute no canto
   inferior direito) -- pedido do Lincoln pra dar lugar ao card do mapa
   real ali. Agora é um filho flex normal de `.pa-ativa-cheio-coluna-direita`
   (ver abaixo), empilhado embaixo do card do mapa. Continua usando
   `.pa-ativa-cheio-card` pro mesmo "vidro" translucido dos outros cards. */
.pa-ativa-cheio-base {
  /* precisa de position:relative pra CANCELAR o position:absolute que
     `.pa-ativa-cheio-card` (base, aplicada na mesma tag) ainda define --
     sem isso o card sai do fluxo flex da coluna e some do lugar certo
     (bug encontrado na verificação visual: ele ficava flutuando por cima
     do card do mapa em vez de empilhado embaixo). */
  position: relative; flex: none;
  display: flex; align-items: center; justify-content: space-between; gap: 14px;
  padding: 18px; cursor: pointer; text-align: left;
  transition: background var(--duracao-rapida), border-color var(--duracao-rapida);
}
.pa-ativa-cheio-base:hover { background: rgba(255,209,0,0.12); border-color: var(--acento-suave-2); }
.pa-ativa-cheio-base-texto { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.pa-ativa-cheio-base-titulo { font-size: 14.5px; font-weight: 800; color: #fff; }
.pa-ativa-cheio-base-desc { font-size: 12px; color: rgba(255,255,255,0.66); font-weight: 600; line-height: 1.35; }
/* 04/09: coluna fixa do lado direito -- pedido do Lincoln: "nesse canto
   direito todo, vamos deixar um card com o mapa para visualização em
   tempo real do robô no mesmo formato da página de criar entrega". Empilha
   o card do mapa (ocupa o espaço disponível, flex:1) com o card "Voltar
   para a base" logo abaixo -- os dois cabiam nesse canto sem se sobrepor
   porque agora dividem a mesma coluna em vez de cada um ter seu próprio
   position:absolute solto. */
.pa-ativa-cheio-coluna-direita {
  /* 11/09: era `position:absolute` com largura fixa em px (440px, depois
     520px), calibrada à mão contra só 3 breakpoints testados (1440/1280/
     800) -- fora deles não havia garantia de que não ia sobrepor o
     conteúdo da esquerda. Agora é um filho flex normal de
     `.pa-ativa-cheio-corpo` (ver acima), irmão de `.pa-ativa-cheio-coluna-
     esquerda` -- os dois SEMPRE dividem o espaço horizontal disponível
     corretamente, em qualquer largura de tela, sem precisar recalibrar
     nada à mão. `flex-basis:460px` mantém o tamanho "de referência" (perto
     do que já tinha sido calibrado e aprovado), `max-width:560px` evita que
     a coluna cresça demais em monitores muito largos, e `min-width:300px`
     evita que o mapa fique pequeno demais antes de empilhar no mobile (ver
     @media abaixo). */
  position: relative; z-index: 2;
  flex: 1 1 460px; max-width: 560px; min-width: 300px;
  display: flex; flex-direction: column; gap: 16px;
}
/* Card do mapa: reaproveita o MESMO componente (`entregaMapaAtivaHtml()`,
   igual ao que já rodava dentro do modal antigo) -- só o tamanho muda,
   pra esticar (flex:1) e preencher a coluna inteira em vez de ficar com
   os 420px fixos de altura que ele usa nos outros lugares (dentro de um
   card comum, com scroll). O `.pa-mapa-picker` interno perde sua PRÓPRIA
   moldura (fundo/borda/padding/sombra) aqui porque o card externo
   (`.pa-ativa-cheio-card`) já fornece o "vidro" escuro -- duas moldura uma
   dentro da outra ficava com aparencia de caixa-dentro-de-caixa. */
.pa-ativa-cheio-mapa-card {
  position: relative;
  flex: 1; min-height: 0;
  display: flex; flex-direction: column;
}
.pa-ativa-cheio-mapa-card #entregaMapaAoVivo { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.pa-ativa-cheio-mapa-card .pa-mapa-picker {
  flex: 1; min-height: 0; display: flex; flex-direction: column;
  background: none; border: none; padding: 0; margin: 12px 0 0; box-shadow: none;
}
.pa-ativa-cheio-mapa-card .pa-mapa-picker-viewport { flex: 1; height: auto; min-height: 0; }
/* 11/09: pedido do Lincoln -- "colocar uma opção no mapa para expandir ele
   em tela cheia (abre como popup)". Cabeçalho novo dentro do card do mapa,
   com o título ("Robô em tempo real", que antes era só o topo do
   `.pa-mapa-picker` interno, sem destaque próprio) ao lado do botão de
   expandir -- ver entregaAtivaTelaCheiaHtml()/abrirMapaExpandidoEntrega()
   em dashboard.js. */
.pa-ativa-cheio-mapa-card-cabecalho {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  margin-bottom: 8px;
}
.pa-ativa-cheio-mapa-card-cabecalho .pa-ativa-card-titulo { margin: 0; }
.pa-ativa-cheio-mapa-expandir-btn {
  flex: none; width: 30px; height: 30px; border-radius: 50%; border: none; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,0.1); color: rgba(255,255,255,0.85);
  transition: background var(--duracao-rapida), color var(--duracao-rapida);
}
.pa-ativa-cheio-mapa-expandir-btn:hover { background: rgba(255,209,0,0.18); color: #fff; }
.pa-ativa-cheio-mapa-expandir-btn svg { width: 15px; height: 15px; }
/* Popup de mapa em tela cheia -- o MIOLO do mapa (#entregaMapaAoVivo, com
   zoom/arraste já ligados) é literalmente movido pra dentro deste overlay
   ao abrir, e devolvido ao card ao fechar (ver moverMapaEntregaEQuadrar()/
   abrirMapaExpandidoEntrega()/fecharMapaExpandidoEntrega() em dashboard.js)
   -- nunca um segundo mapa independente. */
/* 11/09 (achado na verificação visual, com Playwright): `display:flex`
   direto na classe (sem o `[hidden]` abaixo) VENCIA o `display:none` que o
   próprio navegador aplicaria pro atributo `hidden` -- CSS de autor sempre
   tem prioridade sobre o "user agent stylesheet" que implementa `hidden`,
   então o popup ficava visível o tempo todo, escondido só por estar com
   `hidden` (que virava um no-op) -- só não aparecia em cima de nada porque
   as capturas de tela anteriores a esta correção ainda mostravam o
   popup preso dentro de `.pa-tela` (bug diferente, já corrigido acima).
   Precisa dos DOIS seletores: o de baixo (`[hidden]`) tem a MESMA
   especificidade do de cima, então só ganha por vir depois no arquivo. */
.pa-ativa-mapa-expandido {
  position: fixed; inset: 0; z-index: 60;
  /* era rgba(...,0.94) -- com o popup agora cobrindo a tela INTEIRA de
     verdade, esse tanto de transparência deixava a topbar do app (nav/
     conta) fantasma por baixo do título/botão de fechar, os dois brigando
     no mesmo canto. 11/09, 2ª tentativa: rgba(...,0.99) ainda deixava uma
     sombra bem fraca passar (texto branco/ícones coloridos por trás
     bastam pra aparecer, mesmo com só 1% de transparência) -- cor sólida,
     sem alpha nenhum, é realmente opaca, sem exceção. Este popup é uma
     visão dedicada (bem diferente do painel de KPI, que PRECISA mostrar o
     fundo escurecido pra dar contexto) -- não faz sentido nenhum grau de
     transparência aqui. */
  background: #06080e;
  display: flex; flex-direction: column;
  padding: 20px;
}
.pa-ativa-mapa-expandido[hidden] { display: none; }
.pa-ativa-mapa-expandido-topo {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  margin-bottom: 14px;
}
.pa-ativa-mapa-expandido-topo h3 {
  margin: 0; font-size: 17px; font-weight: 800; color: #fff;
}
.pa-ativa-mapa-expandido-fechar {
  flex: none; width: 36px; height: 36px; border-radius: 50%; border: none; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,0.12); color: #fff;
  transition: background var(--duracao-rapida);
}
.pa-ativa-mapa-expandido-fechar:hover { background: rgba(178,90,86,0.5); }
.pa-ativa-mapa-expandido-fechar svg { width: 17px; height: 17px; }
.pa-ativa-mapa-expandido-corpo {
  flex: 1; min-height: 0; display: flex; flex-direction: column;
}
.pa-ativa-mapa-expandido-corpo #entregaMapaAoVivo,
.pa-ativa-mapa-expandido-corpo .pa-mapa-picker,
.pa-ativa-mapa-expandido-corpo .pa-mapa-picker-viewport {
  flex: 1; min-height: 0; display: flex; flex-direction: column;
}
.pa-ativa-mapa-expandido-corpo .pa-mapa-picker {
  background: none; border: none; padding: 0; margin: 0; box-shadow: none;
}
@media (max-width: 640px) {
  .pa-ativa-mapa-expandido { padding: 14px; }
}
/* 04/09: "Fazer outra entrega com este robô" -- era um link de texto
   solto flutuando por cima da foto; pedido do Lincoln: "transformar num
   cardzinho e posicionar no canto esquerdo".
   11/09: pedido novo do Lincoln -- "diminuímos ele e colocamos acima do
   'Voltar para base'". Saiu do posicionamento independente (canto inferior
   esquerdo, sozinho) e virou filho flex normal de `.pa-ativa-cheio-coluna-
   direita`, empilhado ENTRE o card do mapa e `.pa-ativa-cheio-base` (mesmo
   HTML da `.pa-ativa-cheio-base`, ver entregaAtivaTelaCheiaHtml() em
   dashboard.js) -- por isso ganhou o mesmo `position:relative; flex:none`
   que cancela o `position:absolute` herdado de `.pa-ativa-cheio-card`, e
   perdeu bottom/left/width/max-width (a largura agora vem de esticar pra
   preencher a coluna, igual ao card "Voltar para a base"). Padding/ícone/
   fonte reduzidos em relação aos outros dois cards da coluna -- "outra
   entrega" é uma ação secundária ali, não precisa do mesmo peso visual. */
.pa-ativa-cheio-nova-card {
  position: relative; flex: none;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 12px 14px; cursor: pointer; text-align: left;
  transition: background var(--duracao-rapida), border-color var(--duracao-rapida);
}
.pa-ativa-cheio-nova-card:hover { background: rgba(255,209,0,0.12); border-color: var(--acento-suave-2); }
.pa-ativa-cheio-nova-card .pa-ativa-cheio-base-titulo { font-size: 13px; }
.pa-ativa-cheio-nova-card .pa-ativa-cheio-base-desc { font-size: 11px; }
.pa-ativa-cheio-nova-card .pa-entrega-menu-card-icone { width: 32px; height: 32px; }
.pa-ativa-cheio-nova-card .pa-entrega-menu-card-icone svg { width: 16px; height: 16px; }
/* 31/08 (2a leva): o botão redondo dedicado que abria o mapa (flutuante,
   canto inferior esquerdo) foi removido — agora é o valor "Ponto atual"
   dentro do card de progresso que abre o mapa (ver
   .pa-ativa-progresso-atual-btn logo abaixo, e abrirMapaAoVivoEntrega() em
   dashboard.js). A regra `.pa-ativa-cheio-expandir-mapa` foi removida por
   completo (inclusive do @media abaixo) — elemento não existe mais no HTML.
   Os 4 comandos também deixaram de ficar "flutuando" empurrados pro rodapé
   via `margin: auto 0` (um dos motivos do Lincoln achar a tela "bagunçada,
   com botão espalhado") — agora ficam em fluxo normal, logo abaixo do card
   de progresso (ver ordem no HTML de entregaAtivaTelaCheiaHtml()), numa
   fileira horizontal fixa. */
.pa-ativa-cheio-comandos {
  position: relative; z-index: 2;
  /* 11/09: pedido novo do Lincoln -- "posicionar os botões de pausar,
     retomar etc, bem acima da downbar". Uma rodada anterior (01/09) tinha
     tirado justamente um `margin: auto 0` que empurrava esta fileira pro
     rodapé, porque na época deixava a tela "bagunçada, com botão espalhado"
     -- mas isso era com os cards ainda meio soltos entre si; agora que o
     resto da tela (mapa/voltar-base/nova-entrega) já está todo organizado
     na coluna da direita, o pedido é o oposto: grudar os comandos bem em
     cima da barra de status inferior (`.pa-entrega-menu-status`, fora
     deste container). `margin-top: auto` num filho de flex-column empurra
     ele (e só ele) pro fim do espaço livre -- como é o ÚLTIMO elemento
     visível no fluxo normal desta coluna (o aviso de finalização, quando
     aparece, foi movido pra cima do card de progresso -- ver
     entregaAtivaTelaCheiaHtml() -- exatamente pra não brigar por esse
     lugar), ele cola direto acima da downbar. */
  margin-top: auto;
  /* 01/09: pedido do Lincoln -- "os botões de comandos deveriam estar no
     canto esquerdo" -- alinhou à esquerda na época.
     11/09: pedido NOVO e oposto -- "posicionar os cards de pausar/retomar/
     concluir entrega/cancelar mais pro centro da tela". Passou a usar
     `justify-content:center` + `align-self:center`, centralizando a
     fileira dentro da largura da coluna esquerda.
     21/09: pedido NOVO e de volta ao original -- print anotado pedindo
     "as opções de comando no canto esquerdo" (par do ajuste acima em
     `.pa-ativa-cheio-corpo`, que joga o mapa pro canto direito de
     verdade). Volta a `flex-start`/`flex-start`, igual ao ajuste de
     01/09. */
  justify-content: flex-start;
  align-self: flex-start;
  /* 01/09 (referência nova): gap reduzido (era 28px, pensado pra círculos
     soltos) -- os 4 itens viraram cards lado a lado (ver .pa-ativa-comando-
     item), um gap menor deixa a fileira mais compacta/coesa.
     11/09: max-width reduzido (620px -> 460px) acompanhando os botões
     menores (ver .pa-ativa-comando-btn) -- pedido do Lincoln, "diminuir um
     pouco eles", pra fileira inteira ficar mais compacta e realmente
     centralizada em vez de esticada. */
  gap: 12px;
  width: 100%; max-width: 460px;
}
/* 04/09: a trilha/pino decorativos (ilustrativos, nunca foram o mapa real
   -- ver histórico em entregaAtivaTelaCheiaHtml(), dashboard.js) e o modal
   de mapa (`.pa-ativa-mapa-modal*`) saíram por completo daqui. O canto
   direito da tela agora mostra o mapa DE VERDADE, sempre visível (ver
   `.pa-ativa-cheio-coluna-direita`/`.pa-ativa-cheio-mapa-card` acima) --
   não precisa mais nem da trilha ilustrativa (redundante/conflitante com
   o mapa real ocupando o mesmo canto) nem do modal (o mapa não fica mais
   escondido atrás de um clique). `@keyframes pa-entrega-trajeto-fluxo
   continua no arquivo -- é usada também pela rota do mapa real. */
@media (max-width: 860px) {
  /* 11/09: com as duas colunas agora sendo flex de verdade (ver
     .pa-ativa-cheio-corpo/.pa-ativa-cheio-coluna-esquerda/.pa-ativa-cheio-
     coluna-direita acima), empilhar em telas estreitas é só virar a
     direção do row pra column -- as colunas passam a ocupar 100% da
     largura automaticamente, sem precisar zerar width/max-width uma por
     uma como no esquema antigo (absolute + px fixo).
     11/09 (achado na verificação visual, com Playwright): SÓ virar a
     direção não bastava -- em `flex-direction:column` o `flex-basis` de
     cada coluna (380px/460px, pensados como LARGURA pro row do desktop)
     passa a valer como ALTURA (o eixo principal virou vertical), e as
     duas colunas ainda tinham `flex-grow:1` -- iam disputar e "inflar"
     verticalmente dentro do espaço da `.pa-ativa-cheio-corpo`, cada uma
     querendo uma fatia de altura calculada pra layout horizontal. Como o
     conteúdo de dentro (headline+progresso+comandos, à esquerda) não
     enchia essa altura toda, e `.pa-ativa-cheio-comandos` ainda tinha
     `margin-top:auto` (o mesmo truque que gruda os comandos acima da
     downbar no desktop) sobrando dentro da coluna, os comandos eram
     empurrados pra BEM mais baixo do que o conteúdo deles precisava --
     ultrapassando a altura que a coluna direita (mapa) começava,
     sobrepondo os dois blocos. `flex:none` em ambas as colunas (voltam a
     ser dimensionadas pelo próprio CONTEÚDO, não por um flex-basis pensado
     pro row) + `margin-top` fixo nos comandos (em vez de `auto`) resolve:
     cada bloco ocupa só a altura que precisa, em sequência, sem inflar
     nem empurrar nada pra fora do lugar. */
  .pa-ativa-cheio-corpo { flex-direction: column; }
  .pa-ativa-cheio-coluna-esquerda { flex: none; max-width: none; }
  .pa-ativa-cheio-progresso { position: static; width: auto; margin: 16px 0; }
  .pa-ativa-cheio-base { margin: 0; }
  /* Altura fixa no mapa pra ele não colapsar (flex:1 sem um pai com altura
     definida vira 0 quando a coluna empilha no fluxo normal). */
  .pa-ativa-cheio-coluna-direita {
    flex: none; max-width: none; min-width: 0; margin: 16px 0 0; height: 360px;
  }
  .pa-ativa-cheio-nova-card { margin: 16px 0 0; }
  /* 01/09: os 4 cards de comando (ver .pa-ativa-comando-item) não cabem
     numa fileira só em telas estreitas -- quebra em 2x2 em vez de espremer
     cada card numa fatia minúscula. width:auto (em vez do max-width:460px
     fixo do desktop) deixa a grade 2x2 usar toda a largura disponível da
     coluna. */
  .pa-ativa-cheio-comandos {
    margin-top: 18px; flex-wrap: wrap; width: auto; max-width: none; align-self: stretch;
  }
  .pa-ativa-comando-item { flex: 1 1 calc(50% - 6px); }
}
@media (max-width: 480px) {
  /* 11/09: telas de celular bem estreitas -- o popup de mapa expandido
     já usa padding reduzido (ver .pa-ativa-mapa-expandido acima); aqui só
     dá mais respiro vertical pro card do mapa da coluna direita, que em
     860px ainda usa a altura fixa de 360px (boa o bastante em tablets/
     telas médias, meio alta demais perto do limite inferior de um celular
     comum na horizontal). */
  .pa-ativa-cheio-coluna-direita { height: 300px; }
}

/* Entrega — etapas + mapa */
.pa-etapas-lista { display: flex; flex-direction: column; gap: 10px; margin-bottom: 14px; }
/* 01/09: pedido do Lincoln -- "configurar os botões [cards] para ficarem
   com aquele preto transparente" (mesmo vidro escuro translúcido já usado
   nos outros cards desta sessão) no lugar do branco (`var(--superficie)`)
   original. Como o card passa a ficar escuro, TUDO por dentro que usava
   tokens claros (--texto/--texto-suave/--texto-fraco/--borda/--superficie-2,
   pensados pra fundo branco) precisou de tom claro/translúcido branco —
   ver cada regra abaixo. */
.pa-etapa-card {
  display: flex; align-items: center; gap: 14px;
  background: rgba(0, 0, 0, 0.45); border: 1px solid rgba(255,255,255,0.12);
  border-radius: var(--raio-g); padding: 14px 16px; box-shadow: var(--sombra-1);
  backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
}
.pa-etapa-numero {
  width: 28px; height: 28px; border-radius: 50%;
  background: var(--acento); color: var(--acento-texto);
  display: flex; align-items: center; justify-content: center;
  font-size: 12.5px; font-weight: 800; flex: 0 0 auto;
}
.pa-etapa-info { flex: 1; min-width: 0; }
/* 01/09: pedido do Lincoln -- "a info principal do card é o nome do
   ponto, embaixo ficaria o que o usuário estaria levando (caso esteja
   preenchido)" -- inverte a hierarquia visual de antes (o campo "o que
   deseja entregar" vinha primeiro e em negrito, o nome do ponto era só um
   texto pequeno abaixo). Criei uma classe NOVA e dedicada
   (`.pa-etapa-ponto-nome`) pro nome do ponto dentro do card de etapa —
   claro, maior, em negrito — em vez de reaproveitar `.pa-etapa-destino`,
   porque essa classe já era usada em outros dois lugares (popup de
   detalhe do robô e o card "Voltar para a base" da tela de Comando de
   entrega) onde o texto precisa continuar pequeno/discreto, não virar
   título. `.pa-etapa-item-input` vira secundário — menor, tom
   translúcido mais fraco, e quando vazio (classe `.vazio`, ver
   entregaEtapasHtml() em dashboard.js) fica ainda mais discreto, quase
   invisível até a pessoa passar o mouse/focar, pra não competir com o
   nome do ponto quando não há nada preenchido. */
.pa-etapa-ponto-nome {
  font-size: 14.5px; color: #fff; margin: 0; font-weight: 800;
}
/* 01/09: `.pa-etapa-destino` é compartilhada por 2 outros contextos (popup
   de detalhe do robô e o card "Voltar para a base"), sempre como texto
   pequeno/secundário. Ambos os contextos hoje têm fundo ESCURO (o popup
   de detalhe já tinha virado vidro escuro numa rodada anterior desta
   sessão), mas o tom original (`var(--texto-suave)`, cinza escuro pensado
   pra fundo branco) ficava praticamente invisível em cima de preto —
   provavelmente um bug não percebido desde aquela rodada. Corrigido pra
   um branco translúcido claro, mantendo o tamanho pequeno/discreto. */
.pa-etapa-destino {
  font-size: 12.5px; color: rgba(255,255,255,0.55); margin: 0; font-weight: 600;
}
.pa-etapa-item-input {
  background: transparent; border: none; color: rgba(255,255,255,0.6);
  font-size: 12.5px; font-weight: 600; padding: 0; width: 100%; margin-top: 3px;
}
.pa-etapa-item-input::placeholder { color: rgba(255,255,255,0.35); }
.pa-etapa-item-input.vazio { color: rgba(255,255,255,0.35); }
.pa-etapa-item-input:focus { outline: none; }
.pa-etapa-item-input:focus::placeholder { color: rgba(255,255,255,0.5); }
.pa-etapa-remover {
  background: transparent; border: none; color: rgba(255,255,255,0.4); cursor: pointer; padding: 6px;
  display: flex; align-items: center; justify-content: center; border-radius: 50%;
}
.pa-etapa-remover svg { width: 18px; height: 18px; }
.pa-etapa-remover:hover { color: var(--erro); background: rgba(217,59,74,0.16); }

/* "Ligar ao chegar" por destino (31/08) — mini-forma dentro do próprio card
   de etapa. 01/09: o card virou vidro escuro (ver `.pa-etapa-card` acima),
   então esta mini-forma trocou os tokens claros originais (--superficie-2/
   --borda/--texto-suave, pensados pro card branco de antes) pelo mesmo
   tom translúcido branco usado no resto do painel escuro da Entrega. */
.pa-link-telefonia {
  display: block; background: transparent; border: none; padding: 0; margin: 6px 0 0;
  font-size: 11.5px; font-weight: 700; color: rgba(255,255,255,0.55); cursor: pointer; text-decoration: underline;
}
.pa-link-telefonia:hover { color: var(--acento); }
.pa-etapa-telefonia { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; padding-top: 8px; border-top: 1px dashed rgba(255,255,255,0.14); }
.pa-etapa-telefonia input {
  font-size: 12.5px; font-weight: 600; padding: 7px 9px; border-radius: var(--raio-p);
  border: 1px solid rgba(255,255,255,0.14); background: rgba(255,255,255,0.06); color: #fff; width: 100%;
}
.pa-etapa-telefonia input::placeholder { color: rgba(255,255,255,0.35); }
.pa-etapa-telefonia input:focus { outline: none; border-color: var(--acento-suave-2); }
.pa-etapa-telefonia-dica { font-size: 10.5px; color: rgba(255,255,255,0.45); font-weight: 600; margin: 2px 0 0; }

/* "Ações do robô" (31/08) — texto na tela/portas (FlashBot) e áudio/volume
   (KettyBot), filtrados por modelo (ver entregaAcoesRoboHtml() em
   dashboard.js). Diferente da mini-forma de telefonia acima (que vive
   DENTRO de um .pa-etapa-card claro), este bloco fica direto no painel
   flutuante ESCURO (.pa-entrega-destinos-cheio-painel) — por isso o link
   de abrir/fechar usa o mesmo tom translúcido branco do .pa-link-trocar
   (não o .pa-link-telefonia, pensado pra fundo claro), e o conteúdo vira
   um "cartão" claro por cima do vidro escuro, mesmo tratamento visual já
   usado em .pa-etapa-card/.pa-toggle-ordem nesta mesma tela. */
.pa-link-acoes-robo {
  display: block; background: transparent; border: none; padding: 0; margin: 0 0 14px;
  font-size: 12.5px; font-weight: 700; color: rgba(255,255,255,0.6); cursor: pointer; text-decoration: underline;
}
.pa-link-acoes-robo:hover { color: var(--acento); }
.pa-acoes-robo {
  display: flex; flex-direction: column; gap: 14px; margin-bottom: 16px;
}
.pa-acao-robo-bloco {
  background: var(--superficie); border: 1px solid var(--borda);
  border-radius: var(--raio-g); padding: 14px 16px; box-shadow: var(--sombra-1);
}
.pa-acao-robo-bloco h4 { font-size: 12.5px; font-weight: 800; margin: 0 0 10px; color: var(--texto); }
.pa-acao-robo-input {
  font-size: 12.5px; font-weight: 600; padding: 9px 10px; border-radius: var(--raio-p);
  border: 1px solid var(--borda); background: var(--superficie-2); color: var(--texto); width: 100%;
  margin-bottom: 10px;
}
.pa-acao-robo-input:focus { outline: none; border-color: var(--acento-suave-2); }
.pa-acao-portas { display: flex; flex-direction: column; gap: 8px; }
.pa-acao-porta-linha { display: flex; align-items: center; gap: 8px; }
.pa-acao-porta-nome { flex: 1; font-size: 12.5px; font-weight: 700; color: var(--texto-suave); }
.pa-acao-audio-botoes { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.pa-acao-volume-rotulo {
  display: flex; align-items: center; gap: 8px; font-size: 12px; font-weight: 700; color: var(--texto-suave);
}
.pa-acao-volume-rotulo input[type="range"] { flex: 1; }
.pa-btn.minimo {
  height: 34px; padding: 0 14px; font-size: 12px;
  background: var(--superficie-2); color: var(--texto); border: 1px solid var(--borda);
}
.pa-btn.minimo:hover { border-color: var(--acento-suave-2); }
.pa-btn.minimo:disabled { opacity: 0.5; cursor: not-allowed; }

/* Fundo trocado de branco/creme (var(--superficie)/var(--superficie-2)) pra
   um vidro escuro translucido, a pedido do Lincoln: esta tela (Entrega)
   tem o painel/hero e a barra de status embaixo todos escuros, e o card
   do mapa em branco batendo em cima disso ficava "gritante" (fora do
   tom). Mesma familia visual do `.pa-login-card` (rgba branco baixo sobre
   fundo escuro), so que aqui dentro de um card que ja e escuro por si. */
/* 31/08, versão anterior deste ajuste (histórico): o card do passo
   "Destino" virou uma grade de 2 colunas (etapas+ordem+botão à esquerda,
   mapa à direita) dentro do mesmo card centralizado, pra caber tudo sem
   rolagem. Substituído poucas rodadas depois pelo layout de TELA CHEIA
   abaixo (pedido do Lincoln, com referência visual) — as classes
   `.pa-entrega-destinos-grade`/`.pa-entrega-destinos-coluna` saíram
   daqui por não terem mais uso (a resolução da rolagem passou a vir de
   graça: o mapa ocupando o resto da tela toda, não só metade de um card
   de 760px, sobra altura de sobra pro painel da esquerda).
   `entregaPassoDestinosHtml()` (dashboard.js) só a lista/ordem/botão; o
   mapa mudou pra `entregaDestinosMapaHtml()`, fora do painel. */
.pa-entrega-passo-dica { font-size: 12.5px; color: rgba(255,255,255,0.55); margin: 0 0 14px; font-weight: 600; }

/* 01/09, pedido do Lincoln (imagem de referência): o rótulo pequeno em
   caixa alta/cor de acento ("SELECIONE UM DESTINO", ver
   .pa-entrega-passo-legenda acima, que segue existindo só por se usada em
   outro lugar) virou um título de verdade, branco e maior, nesta tela
   específica. */
.pa-entrega-passo-titulo { font-size: 20px; font-weight: 800; color: #fff; margin: 0 0 6px; }

/* Seção "Pontos selecionados (N)" — cabeçalho com contagem + "Limpar
   lista" (só aparece havendo pelo menos 1 ponto), no lugar do antigo rótulo
   estático sem contagem nem ação (.pa-entrega-etapas-titulo, removido). */
.pa-secao-pontos { margin-bottom: 18px; }
.pa-secao-pontos-cabecalho { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
.pa-secao-pontos-titulo { font-size: 13px; font-weight: 800; color: #fff; margin: 0; }
.pa-link-limpar-lista {
  flex: 0 0 auto; background: transparent; border: none; padding: 0;
  font-size: 11.5px; font-weight: 700; color: rgba(255,255,255,0.55); cursor: pointer; text-decoration: underline;
}
.pa-link-limpar-lista:hover { color: var(--erro); }

/* Alcinha de arrastar (ver moverEtapaArrastadaSeNecessario() em
   dashboard.js) — mesmo tratamento visual do botão de remover ao lado
   (círculo com ícone, hover sutil), só que com cursor de "segurar" em vez
   de ponteiro comum. */
.pa-etapa-arraste {
  background: transparent; border: none; color: rgba(255,255,255,0.4); padding: 6px;
  display: flex; align-items: center; justify-content: center; border-radius: 50%;
  cursor: grab; flex: 0 0 auto; touch-action: none;
}
.pa-etapa-arraste svg { width: 16px; height: 16px; }
.pa-etapa-arraste:hover { color: #fff; background: rgba(255,255,255,0.1); }
.pa-etapa-arraste:active { cursor: grabbing; }
/* Card sendo arrastado no momento — feedback visual simples (opacidade +
   destaque na borda), sem nenhuma animação de "seguir o cursor" (a
   reordenação já acontece ao vivo, empurrando o card pra antes/depois do
   vizinho — ver moverEtapaArrastadaSeNecessario()). */
.pa-etapa-card.arrastando { opacity: 0.55; border-color: var(--acento); }

/* Seção "Ordem da entrega" — dois cartões de opção (rádio), no lugar do
   antigo toggle de 2 botões (.pa-toggle-ordem, sem uso a partir desta
   leva, mas mantido no arquivo por precaução).
   01/09: pedido do Lincoln -- "esses botões que estão em branco, vamos
   deixar pretos" (screenshot mostrando os 2 cartões ainda em
   var(--superficie)/var(--superficie-2), esquecidos na rodada que
   escureceu o resto desta tela) -- mesmo vidro escuro translúcido já
   usado no `.pa-etapa-card` logo acima. */
.pa-secao-ordem { margin-bottom: 18px; }
.pa-secao-ordem .pa-secao-pontos-titulo { margin-bottom: 10px; }
.pa-ordem-opcao {
  display: flex; align-items: flex-start; gap: 10px;
  background: rgba(0,0,0,0.45); border: 1px solid rgba(255,255,255,0.12); border-radius: var(--raio-g);
  padding: 10px 12px; margin-bottom: 8px; cursor: pointer;
  backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
}
.pa-ordem-opcao:last-child { margin-bottom: 0; }
.pa-ordem-opcao.selecionada { border-color: var(--acento); background: rgba(255,209,0,0.1); }
.pa-ordem-opcao input[type="radio"] { margin: 3px 0 0; flex: 0 0 auto; }
.pa-ordem-opcao-texto { display: flex; flex-direction: column; gap: 2px; }
.pa-ordem-opcao-texto strong { font-size: 13px; font-weight: 800; color: #fff; }
.pa-ordem-opcao-texto small { font-size: 11.5px; color: rgba(255,255,255,0.55); font-weight: 600; }

/* Tela cheia do passo "Destino" (marcar os pontos) — pedido do Lincoln,
   com referência visual: tirar o título "Entrega" grande do lado e deixar
   o mapa ocupar a tela toda, com um painel flutuando por cima à esquerda
   (lista de etapas, ordem, botão) em vez do card centralizado que os
   outros passos ainda usam. Só ESTA tela muda — confirmado com o Lincoln
   que o menu de ações e o acompanhamento (passo "ativa") continuam com o
   título "Entrega" normal. `flex:1` no lugar do antigo
   `.pa-entrega-menu-conteudo` (que este passo deixou de usar) — ocupa
   toda a altura que sobra entre o topo do quadro cheio e a barra de
   status embaixo, que continua existindo como sempre. */
.pa-entrega-destinos-cheio {
  position: relative;
  flex: 1;
  min-height: 0;
  display: flex;
}
.pa-entrega-destinos-cheio-mapa {
  position: absolute; inset: 0;
}
/* 31/08: pedido do Lincoln — o mapa/foto em tela cheia terminava num corte
   seco (retângulo) contra o fundo escuro do módulo (--fundo). Uma vinheta
   radial nas bordas (transparente no centro, funde pro MESMO tom de fundo
   nas pontas) resolve isso pra qualquer container full-bleed do módulo —
   reaproveitada aqui e na tela "ativa" (ver .pa-ativa-cheio-fundo). Fica
   por CIMA do conteúdo (pseudo-elemento entra depois no DOM) mas abaixo dos
   controles/painéis flutuantes (que já têm z-index maior, ver mais abaixo)
   — puramente decorativo, `pointer-events:none`. */
/* 31/08, correção urgente: esta classe chegou a forçar `position:relative`
   aqui — quando aplicada JUNTO com `.pa-entrega-destinos-cheio-mapa`
   (mesmo elemento, dois `class`), como as duas regras têm a mesma
   especificidade e esta vinha DEPOIS no arquivo, ela vencia a cascata e
   sobrescrevia o `position:absolute; inset:0` que aquele container precisa
   pra cobrir a tela inteira — o mapa ficava do tamanho do seu conteúdo
   (não da tela) e a foto de fundo do módulo aparecia ao lado, um bug visual
   grave reportado pelo Lincoln em produção. Os dois containers que usam
   esta classe (`.pa-entrega-destinos-cheio-mapa` e `.pa-ativa-cheio`) já
   definem seu PRÓPRIO `position` (absolute/relative) — não precisa (e não
   pode) ser fixado aqui de novo. */
.pa-fundo-vinheta { /* position já vem do próprio container, ver acima */ }
.pa-fundo-vinheta::after {
  content: ""; position: absolute; inset: 0; pointer-events: none; z-index: 1;
  background: radial-gradient(ellipse at center, rgba(21,21,21,0) 58%, var(--fundo) 100%);
}
/* O mapa em si (viewport/zoom/popup) é o MESMO componente usado em todo
   o resto do app — só o tamanho/moldura mudam aqui, pra ficar de ponta a
   ponta em vez de dentro de um card. Nenhuma outra regra de
   `.pa-mapa-picker-viewport` é alterada (cursor, overflow, filtro da
   planta, etc. continuam valendo). */
.pa-entrega-destinos-cheio-mapa .pa-mapa-picker-viewport {
  width: 100%; height: 100%; border-radius: 0;
}
/* Breadcrumb flutuante no canto (troca o antigo "← Voltar" + título
   "Entrega" grande) — mesmo id (`voltarDeEntrega`) do botão que já existia,
   então o listener genérico em ligarEntrega() continua funcionando sem
   nenhuma mudança de código. */
.pa-entrega-destinos-cheio-voltar {
  position: absolute; top: 20px; left: 20px; z-index: 3;
  display: inline-flex; align-items: center; gap: 8px;
  background: rgba(0,0,0,0.72); border: 1px solid rgba(255,255,255,0.14);
  border-radius: var(--raio-g); padding: 10px 16px 10px 14px;
  color: rgba(255,255,255,0.85); font-size: 13px; font-weight: 700;
  backdrop-filter: blur(6px); cursor: pointer;
}
.pa-entrega-destinos-cheio-voltar:hover { color: var(--acento); }
.pa-entrega-destinos-cheio-voltar svg { width: 14px; height: 14px; }
/* Painel flutuante da esquerda — mesma "vidro" translúcido escuro que o
   `.pa-entrega-menu-painel` normal já usava, só que agora sobrepõe o mapa
   em vez de ficar ao lado dele dentro de um card. Rolagem própria
   (`overflow-y:auto`) continua necessária pra quando a lista de etapas
   crescer bastante (muitos pontos marcados) e não couber na altura da
   tela. */
.pa-entrega-destinos-cheio-painel {
  position: absolute; z-index: 2;
  top: 84px; left: 20px; bottom: 20px;
  width: 360px; max-width: calc(100% - 40px);
  overflow-y: auto;
  background: rgba(0,0,0,0.82);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: var(--raio-m);
  padding: 22px 22px 20px;
  backdrop-filter: blur(8px);
  display: flex; flex-direction: column;
}
.pa-entrega-destinos-cheio-painel .pa-toggle-ordem { margin-bottom: 16px; }
.pa-entrega-destinos-cheio-painel .pa-btn { margin-top: auto; }
/* Controles de zoom flutuando sobre o mapa (canto inferior direito), em
   vez da fileira fixa embaixo do card — mesmos botões/cores de sempre
   (`.pa-mapa-zoom-controles`, sem nenhuma mudança de estilo), só a
   POSIÇÃO muda, com um fundo translúcido igual ao do painel da esquerda
   pra continuar legível em cima do mapa. */
.pa-mapa-zoom-controles-flutuante {
  position: absolute; z-index: 3;
  right: 20px; bottom: 20px;
  margin-top: 0;
  background: rgba(0,0,0,0.72); border: 1px solid rgba(255,255,255,0.14);
  border-radius: var(--raio-g); padding: 8px 10px;
  backdrop-filter: blur(6px);
}
/* Em telas estreitas o painel flutuante ocuparia largura demais por cima
   do mapa — vira uma faixa no topo (auto-height, sem cobrir o mapa
   inteiro) em vez de uma coluna lateral fixa de 360px. */
@media (max-width: 720px) {
  .pa-entrega-destinos-cheio-painel {
    top: 76px; left: 12px; right: 12px; bottom: auto;
    width: auto; max-width: none;
    max-height: calc(100vh - 260px);
  }
  .pa-entrega-destinos-cheio-voltar { top: 12px; left: 12px; }
  .pa-mapa-zoom-controles-flutuante { right: 12px; bottom: 12px; }
}

.pa-mapa-picker { background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.10); border-radius: var(--raio-g); padding: 16px; margin: 18px 0 10px; box-shadow: var(--sombra-1); }
.pa-mapa-picker-dica { font-size: 12.5px; color: rgba(255,255,255,0.55); margin: 0 0 12px; font-weight: 600; }
/* Porte do mapa "ao vivo" de public/painel.js (ver comentário grande em
   dashboard.js, logo antes de ligarEntregaMapaZoom()) — pedido do Lincoln:
   "copie exatamente como está funcionando lá na pasta". Antes deste porte,
   este viewport era height:220px + img object-fit:contain preenchendo a
   caixa inteira — como a planta quase nunca tem a MESMA proporção da caixa
   fixa, sobrava letterbox e os pontinhos (posicionados em % contra a planta
   inteira) ficavam levemente desalinhados da imagem visível: bem provável
   causa real do "a formatação do mapa e dos pontos está muuuuuito feia".
   Agora, igual à referência: altura fixa só como TETO (overflow:hidden +
   zoom/arraste pra ver o resto), largura sempre 100%, e a imagem em
   width:100%;height:auto (proporção real, sem distorcer nem cortar) — os
   pontos (position:absolute; left/top em %) ficam sempre exatamente em cima
   da imagem, sem sobra de letterbox pra desalinhar nada. */
.pa-mapa-picker-viewport {
  position: relative;
  width: 100%;
  height: 420px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  background: rgba(255,255,255,0.06);
  border-radius: var(--raio-m);
  overflow: hidden;
  cursor: grab;
  touch-action: none;
  user-select: none;
  -webkit-user-select: none;
}
.pa-mapa-picker-viewport.arrastando { cursor: grabbing; }
.pa-mapa-picker-viewport img {
  display: block; width: 100%; height: auto; pointer-events: none; user-select: none; -webkit-user-drag: none;
}
/* 26/08: a planta vem branca (fundo claro) direto da Pudu -- gritava
   junto do resto do painel, que é todo escuro. Como é uma imagem em
   escala de cinza (piso claro, paredes/pontos escuros), inverter e
   escurecer um pouco deixa o piso escuro (bate com o tema) e as paredes
   claras (continuam bem legíveis) -- sem precisar re-processar a imagem
   no backend, só CSS.
   28/08: Lincoln achou que ficou escuro demais depois do ajuste acima --
   brightness subiu de 0.85 pra 1.05 (só isso, mesma técnica de invert).
   28/08, correção: este filtro só pode valer pra planta do mapa em si --
   estava em ".pa-mapa-picker-viewport img" (todo <img> do viewport), o que
   também pegava o ícone SVG do marcador do robô (<img
   src=".../mapa-marcador-robo.svg">, fica por cima da planta dentro do
   mesmo viewport) e invertia/desbotava o branco original dele. Agora
   escopado só na planta via alt="Planta do mapa" (único <img> que usa esse
   alt em dashboard.js); o marcador do robô usa outro alt e fica de fora,
   preservando a cor branca original do ícone. */
/* 01/09: pedido do Lincoln -- "vamos mudar a coloração do mapa para um
   acinzentado" (item 1 do backlog).
   Primeira tentativa (mantendo o `invert(1)` de 26/08 e só ajustando
   grayscale/brightness/contrast) ficou ERRADA na prática: o `invert(1)`
   já transforma o piso claro original em quase-preto ANTES de qualquer
   outro ajuste, e reduzir brightness/contrast em cima disso só deixa esse
   preto ainda mais escuro -- resultado real (visto pelo Lincoln): "o mapa
   ainda tá na cor preta", não cinza. Corrigido removendo o `invert(1)`
   por completo: sem ele, o piso claro original vira cinza médio já só com
   `grayscale(1)` + `brightness` reduzido (piso ~255 * 0.65 ≈ 166, depois
   o `contrast(0.9)` aproxima um pouco mais do cinza neutro), enquanto as
   paredes/pontos escuros originais continuam escuros e legíveis (não há
   mais glare branco nem preto estourado -- é o "acinzentado" pedido). */
.pa-mapa-picker-viewport img[alt="Planta do mapa"] {
  filter: grayscale(1) brightness(0.65) contrast(0.9);
}
/* Recebe o transform (translate+scale) do zoom/arraste — sem transition no
   arraste (senão fica "atrasado" seguindo o mouse), só no zoom via
   botão/roda do mouse (classe .transicao, ligada/desligada em volta da
   chamada em dashboard.js). */
/* 01/09: investigando "o mapa está um pouco pesado" (item 7 do backlog) --
   achado real: este é o elemento que recebe `transform: translate()
   scale()` em CADA `mousemove` durante o arraste e em cada tick da roda do
   mouse (ver ligarListenersGlobaisMapaEntrega()/ligarEntregaMapaZoom() em
   dashboard.js) -- e o filho direto dele (a planta do mapa, ver
   `.pa-mapa-picker-viewport img[alt="Planta do mapa"]` acima) tem um
   `filter` (invert/brightness/contrast) próprio, além dos rótulos de texto
   sempre visíveis de cada ponto (item 16) que também vivem dentro deste
   mesmo container. `will-change: transform` promove pra sua própria camada
   de composição (GPU) e evita recalcular o filtro/reamostrar o conteúdo a
   cada frame do arraste/zoom.
   CORREÇÃO (01/09, mesma noite): o Lincoln reportou "o mapa agora carrega
   com os textos borrados" logo depois desta mudança -- causa raiz: deixar
   `will-change` LIGADO O TEMPO TODO (não só durante o gesto) faz o
   navegador manter esta camada permanentemente promovida/rasterizada à
   parte, e como o mapa quase sempre abre com um zoom inicial diferente de
   100% (ver centralizarMapaNoRoboEntrega(), abre com zoom automático em
   cima do robô), o texto dos rótulos ficava sendo re-escalado a partir de
   um raster antigo em vez de nítido no zoom atual -- efeito colateral
   conhecido de deixar `will-change` estático (a própria documentação do
   padrão recomenda ligar só ANTES do gesto e desligar DEPOIS, nunca
   deixar fixo). Trocado por uma classe (`.otimizado-gpu`) ligada só
   durante o arraste/zoom ativo e desligada assim que o gesto termina (ver
   ativarOtimizacaoMapaEntrega()/desativarOtimizacaoMapaEntrega() em
   dashboard.js) -- ganha a suavidade durante o gesto em si (o que
   realmente pesava) sem deixar o texto permanentemente borrado em
   repouso. */
.pa-mapa-zoom-conteudo {
  position: relative;
  transform-origin: center center;
}
.pa-mapa-zoom-conteudo.otimizado-gpu { will-change: transform; }
.pa-mapa-zoom-conteudo.transicao { transition: transform 0.08s linear; }
.pa-mapa-picker-vazio {
  position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center;
  color: rgba(255,255,255,0.55); font-size: 12.5px; font-weight: 600; text-align: center; padding: 0 24px;
}
.pa-mapa-picker-vazio svg { color: var(--acento-forte); width: 22px; height: 22px; margin-bottom: 8px; }
.pa-mapa-picker-ponto {
  position: absolute; width: 14px; height: 14px; border-radius: 50%;
  background: var(--superficie); border: 2px solid var(--texto-fraco);
  transform: translate(-50%, -50%); cursor: pointer;
  transition: transform var(--duracao-rapida) ease, border-color var(--duracao-rapida) ease, width var(--duracao-rapida) ease, height var(--duracao-rapida) ease;
  display: flex; align-items: center; justify-content: center;
}
.pa-mapa-picker-ponto:hover { border-color: var(--acento-forte); transform: translate(-50%, -50%) scale(1.15); }
/* 26/08: Lincoln pediu pra marcar no corpo do ponto qual é a posição dele
   na ordem da entrega (1o, 2o...) -- por isso o círculo marcado cresce um
   pouco (de 14px pra 18px) só pra caber o número legível; o número em si
   vem de calcularOrdemExibicaoEtapas() em dashboard.js, que já dá conta de
   recalcular pra ordem por distância quando "Ordem por distância" está
   ativo (ver comentário grande lá). */
.pa-mapa-picker-ponto.marcado {
  width: 18px; height: 18px;
  background: var(--acento); border-color: var(--acento-forte);
  animation: pa-pulsar-ponto 1.6s ease-out infinite;
}
.pa-mapa-picker-ponto-numero { font-size: 9px; font-weight: 800; line-height: 1; color: #1a1600; pointer-events: none; user-select: none; }
/* 28/08: Lincoln mandou referência de um painel (dev) onde cada ponto do
   mapa mostra sempre um "cardzinho" com o nome dele ao lado, em vez de só
   aparecer ao clicar. Mantém o comportamento de clique como já era (nome
   técnico cru + tipo no popup, ver sincronizarPopupPontoEntrega) -- este
   rótulo aqui é só um resumo sempre visível, com o nome formatado/
   humanizado (formatarNomePonto(), ex.: "rack_showroom1" -> "Rack
   Showroom 1") pra não expor o nome técnico cru direto no mapa. Fica
   acima do marcador (mesmo left/top dele, só desloca no transform) e
   escala junto com o zoom do mapa, igual ao ponto e ao número de ordem --
   consistente com o resto deste picker (ver comentário em
   .pa-mapa-picker-ponto.marcado).
   28/08, ajuste: Lincoln achou o rótulo grande demais e posicionado do
   lado errado -- reduzido (fonte/padding) e trocado de "ao lado" (translate
   X positivo, -50% em Y) pra "acima da bolinha" (centralizado em X,
   deslocado inteiramente pra cima em Y + uma folga extra que cobre até o
   raio do ponto "marcado", que é o maior dos dois estados: 18px/2 = 9px). */
.pa-mapa-picker-ponto-rotulo {
  position: absolute;
  transform: translate(-50%, calc(-100% - 12px));
  background: rgba(10, 10, 12, 0.82);
  color: #fff;
  font-size: 8px;
  font-weight: 700;
  line-height: 1.2;
  padding: 1px 5px;
  border-radius: 5px;
  white-space: nowrap;
  pointer-events: none;
  user-select: none;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.35);
  z-index: 1;
}
@keyframes pa-pulsar-ponto {
  0% { box-shadow: 0 0 0 0 rgba(255, 209, 0, 0.45); }
  70% { box-shadow: 0 0 0 8px rgba(255, 209, 0, 0); }
  100% { box-shadow: 0 0 0 0 rgba(255, 209, 0, 0); }
}
/* 26/08: Lincoln reportou que este ícone "está péssimo" e pediu pra se
   inspirar no do painel de desenvolvimento (public/painel.js/.mapa-marcador
   -- rosto do robô com um halo de brilho suave, baked direto nos pixels do
   PNG). O CSS já era praticamente idêntico ao de lá (mesmo pulso de
   escala) -- a diferença real era só a IMAGEM: mapa-marcador-robo.png
   (256x256) era um recorte apertado, sem nenhuma margem/glow, então o
   pulso de escala só fazia o quadrado do rosto crescer/encolher sem o
   efeito de "brilhando" que o painel de desenvolvimento tem. Regenerado
   o PNG (mesmo rosto, sem redesenhar) com mais margem em volta + um halo
   branco suave (blur da própria silhueta) atrás do rosto nítido, igual à
   técnica do bellabot-marcador.png -- o CSS abaixo não mudou nada, só a
   imagem. */
/* 28/08: Lincoln mandou o ícone de gatinho-robô (referência de outro
   contexto) e pediu pra virar o indicador de posição atual do robô no
   mapa, "conservando ele todo (sem criar espaços entre as orelhas ou no
   desenho)". Trocado o PNG por um SVG vetorizado a partir do ícone
   (mapa-marcador-robo.svg): silhueta branca + "face-plate" escura + olhos,
   traçados com potrace a partir de máscaras de cor isoladas por
   flood-fill (cuidado extra fio isolar corretamente a folga entre as
   orelhas do interior do rosto, já que as duas regiões share tons bem
   parecidos na imagem original -- por isso a instrução do Lincoln de não
   criar espaços ali). O halo de brilho agora é um <feGaussianBlur> dentro
   do próprio SVG (reaproveitando a mesma silhueta via <use>), em vez de
   pixels borrados de um PNG -- mesmo efeito visual, mas escala nítido em
   qualquer zoom. O CSS abaixo não mudou nada, o <img> só passou a apontar
   pro .svg. */
/* Marcador do robô ao vivo dentro deste mapa (entregaMapaMarcadorHtml() em
   dashboard.js) — mesma ideia visual do .pa-detalhe-robo-marcador já
   existente (pulso + imagem), mas SEM contra-escala: diferente daquele
   (zoom fixo e constante, 2.6x, só de enquadramento), aqui o zoom é
   dinâmico e controlado pela pessoa (1x-4x) — deixar o marcador (e os
   pontos acima) crescerem/encolherem junto com o zoom é o comportamento da
   própria referência (public/painel.css, .mapa-marcador) e dá o feedback
   espacial certo de "estou aumentando esta área do mapa", em vez de um
   ícone de tamanho fixo flutuando por cima. */
.pa-mapa-picker-marcador {
  position: absolute;
  width: 30px; height: 30px;
  transform: translate(-50%, -50%);
  transition: left 0.4s ease, top 0.4s ease;
  animation: pa-pulsar-marcador-mapa 1.6s ease-in-out infinite;
  cursor: default;
  z-index: 2;
  filter: drop-shadow(0 0 1px rgba(0, 0, 0, 0.5));
}
.pa-mapa-picker-marcador img { width: 100%; height: 100%; display: block; object-fit: contain; z-index: 1; position: relative; }
.pa-mapa-picker-marcador[hidden] { display: none; }
@keyframes pa-pulsar-marcador-mapa {
  0%, 100% { transform: translate(-50%, -50%) scale(1); }
  50% { transform: translate(-50%, -50%) scale(1.18); }
}
/* 01/09: pedido do Lincoln -- "no indicador de posição do robô, colocar
   uma aura verde pulsante junto com a animação dele" (item 6 do backlog).
   `::before` cria um halo verde atrás do ícone (z-index:-1 dentro do
   próprio marcador, que já forma seu contexto de empilhamento por ter
   position+z-index -- não interfere no resto do mapa), com a MESMA duração
   (1.6s) do pulso de escala que o ícone já tinha, só que expandindo e
   sumindo (efeito "radar") em vez de só aumentar de tamanho -- fica
   sincronizado com a animação existente sem precisar tocar nela. */
.pa-mapa-picker-marcador::before {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  background: var(--sucesso);
  z-index: -1;
  pointer-events: none;
  animation: pa-aura-marcador-robo 1.6s ease-out infinite;
}
@keyframes pa-aura-marcador-robo {
  0% { transform: scale(1); opacity: 0.55; }
  100% { transform: scale(2.2); opacity: 0; }
}
/* 28/08: removida a regra "@media (prefers-reduced-motion: reduce) { .pa-mapa-picker-marcador { animation: none; } }"
   que existia aqui -- Lincoln reportou (na tela de acompanhamento, "tarefa
   em andamento") que o indicador do robô no mapa não estava pulsando.
   Mesma causa já vista e corrigida no zoom/crossfade do banner do Início
   (ver comentário grande no topo deste arquivo): o navegador/ambiente do
   Lincoln às vezes reporta `prefers-reduced-motion: reduce` sozinho, sem
   ninguém ter escolhido isso -- e essa regra desligava o pulso por completo
   quando isso acontece. Diferente de uma animação decorativa, esse pulso
   comunica "o robô está online e a posição é ao vivo" -- informação
   funcional, não só estética -- por isso ganhou a mesma prioridade sobre a
   preferência do sistema que o banner já tinha. */
.pa-mapa-zoom-controles { display: flex; align-items: center; gap: 6px; margin-top: 10px; }
.pa-mapa-zoom-controles button {
  width: 30px; height: 30px;
  border-radius: var(--raio-m);
  border: 1px solid var(--borda);
  background: var(--superficie-2);
  color: var(--texto);
  font-size: 16px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  padding: 0;
}
.pa-mapa-zoom-controles button:hover { border-color: var(--acento-forte); color: var(--acento-forte); }
.pa-mapa-zoom-controles #entregaMapaZoomReset { width: auto; padding: 0 10px; font-size: 11.5px; font-weight: 700; }
.pa-mapa-zoom-dica { font-size: 11px; color: var(--texto-fraco); margin-left: 4px; }
/* 31/08: toggle da "rota topográfica" (prévia tracejada da ordem dos
   pontos — item 22/backlog) — antes aparecia sempre que houvesse 2+
   pontos marcados, sem jeito de desligar; agora é opcional, ligado por
   padrão (mesmo comportamento de antes). Empurrado pro fim da mesma
   fileira dos controles de zoom (`margin-left:auto`); cores nos mesmos
   tokens já usados pelos botões de zoom vizinhos (--borda/--superficie-2/
   --texto-suave), não nos tokens "escuros" do resto do card, pra ficar
   visualmente consistente com o que já existia ali. */
.pa-mapa-trajeto-toggle {
  display: flex; align-items: center; gap: 6px; margin-left: auto;
  font-size: 11.5px; font-weight: 700; color: var(--texto-suave);
  cursor: pointer; user-select: none;
}
.pa-mapa-trajeto-toggle input {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}
.pa-mapa-trajeto-toggle-trilho {
  position: relative; width: 30px; height: 17px; border-radius: var(--raio-pill);
  background: var(--superficie-2); border: 1px solid var(--borda);
  flex: 0 0 auto; transition: background 0.15s ease, border-color 0.15s ease;
}
.pa-mapa-trajeto-toggle-bolinha {
  position: absolute; top: 1px; left: 1px; width: 13px; height: 13px; border-radius: 50%;
  background: var(--texto-fraco); transition: transform 0.15s ease, background 0.15s ease;
}
.pa-mapa-trajeto-toggle input:checked + .pa-mapa-trajeto-toggle-trilho { background: var(--acento-suave); border-color: var(--acento); }
.pa-mapa-trajeto-toggle input:checked + .pa-mapa-trajeto-toggle-trilho .pa-mapa-trajeto-toggle-bolinha { transform: translateX(13px); background: var(--acento); }
.pa-mapa-trajeto-toggle input:focus-visible + .pa-mapa-trajeto-toggle-trilho { outline: 2px solid var(--acento); outline-offset: 2px; }
@media (prefers-reduced-motion: reduce) {
  .pa-mapa-trajeto-toggle-trilho, .pa-mapa-trajeto-toggle-bolinha { transition: none; }
}
/* Popup "toquei num ponto" (destino da etapa) — ancorado em cima do ponto
   clicado via left/top preenchidos em JS (reposicionarPopupPontoEntrega,
   dashboard.js), acompanhando zoom/arraste. Visual inspirado no popup de
   info equivalente da referência (public/painel.css, .mapa-ponto-info),
   adaptado aos tokens deste projeto e com os campos de edição que esta
   etapa realmente tem (nome do ponto + "o que entregar" + remover). */
/* 31/08, pedido do Lincoln — item 11 do backlog ("todos os pop-ups...
   fade") + item 15 ("poder mover o cardzinho pro lado"): antes este popup
   usava `[hidden]` (display:none) pra aparecer/sumir — sem nenhuma
   transição possível na SAÍDA (display:none não anima). Trocado pro mesmo
   padrão já usado em `.pa-kpi-painel` (classe `.aberto`, visibility+opacity
   com atraso só na saída) — ver sincronizarPopupPontoEntrega()/
   fecharPopupPontoEntrega() em dashboard.js. O offset de arraste
   (`--arraste-x`/`--arraste-y`, setado via JS em
   aplicarOffsetPopupPontoEntrega()) soma por CIMA da posição ancorada
   normal (translate base), sem precisar de nenhuma outra mudança na conta
   de posicionamento já feita em reposicionarPopupPontoEntrega(). */
.pa-mapa-ponto-popup {
  position: absolute;
  top: 0; left: 0;
  --arraste-x: 0px; --arraste-y: 0px;
  transform: translate(calc(-50% + var(--arraste-x)), calc(-100% - 12px + var(--arraste-y))) scale(0.92);
  opacity: 0; visibility: hidden; pointer-events: none;
  transition: opacity 0.18s ease, transform 0.18s cubic-bezier(.2,.8,.2,1), visibility 0s linear 0.18s;
  z-index: 5;
  width: 200px;
  background: var(--superficie);
  border: 1px solid var(--acento-forte);
  border-radius: var(--raio-m);
  padding: 10px 12px 12px;
  box-shadow: var(--sombra-2);
  cursor: grab;
}
.pa-mapa-ponto-popup.aberto {
  opacity: 1; visibility: visible; pointer-events: auto;
  transform: translate(calc(-50% + var(--arraste-x)), calc(-100% - 12px + var(--arraste-y))) scale(1);
  transition: opacity 0.18s ease, transform 0.18s cubic-bezier(.2,.8,.2,1);
}
.pa-mapa-ponto-popup.arrastando { cursor: grabbing; transition: none; }
.pa-mapa-ponto-popup input, .pa-mapa-ponto-popup button { cursor: auto; }
@media (prefers-reduced-motion: reduce) {
  .pa-mapa-ponto-popup { transition: opacity 0.12s ease, visibility 0s linear 0.12s; }
  .pa-mapa-ponto-popup.aberto { transition: opacity 0.12s ease; }
}
.pa-mapa-ponto-popup::after {
  content: '';
  position: absolute;
  left: 50%;
  bottom: -6px;
  width: 10px;
  height: 10px;
  background: var(--superficie);
  border: 1px solid var(--acento-forte);
  border-top: none;
  border-left: none;
  transform: translateX(-50%) rotate(45deg);
}
/* Variante "abaixo do ponto" (reposicionarPopupPontoEntrega, dashboard.js) —
   usada quando não cabe espaço acima (ponto perto do topo do mapa): mesma
   caixa, só troca o lado do deslocamento e vira a setinha pro lado oposto
   (agora aponta pra CIMA, na borda de cima da caixa, em vez de pra baixo). */
.pa-mapa-ponto-popup.abaixo { transform: translate(calc(-50% + var(--arraste-x)), calc(12px + var(--arraste-y))) scale(0.92); }
.pa-mapa-ponto-popup.abaixo.aberto { transform: translate(calc(-50% + var(--arraste-x)), calc(12px + var(--arraste-y))) scale(1); }
.pa-mapa-ponto-popup.deslocado::after { display: none; }
.pa-mapa-ponto-popup.abaixo::after {
  top: -6px;
  bottom: auto;
  border: 1px solid var(--acento-forte);
  border-bottom: none;
  border-right: none;
}
.pa-mapa-ponto-popup-fechar {
  position: absolute;
  top: 4px; right: 6px;
  background: none;
  border: none;
  color: var(--texto-fraco);
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  padding: 4px;
}
.pa-mapa-ponto-popup-fechar:hover { color: var(--texto); }
.pa-mapa-ponto-popup-nome { font-size: 12.5px; font-weight: 800; color: var(--texto); padding-right: 16px; margin-bottom: 4px; }
/* 26/08: tipo do ponto (destino/coleta/retirada), com ícone -- ver
   tipoPontoClienteInfo() em dashboard.js. Chip pequeno, discreto (não é a
   informação principal do card, só um contexto extra). */
.pa-mapa-ponto-popup-tipo {
  display: flex; align-items: center; gap: 5px;
  font-size: 11px; font-weight: 700; color: var(--texto-fraco);
  margin-bottom: 8px;
}
.pa-mapa-ponto-popup-tipo svg { width: 13px; height: 13px; flex-shrink: 0; color: var(--acento-forte); }
.pa-mapa-ponto-popup-tipo:empty { display: none; }
.pa-mapa-ponto-popup-input {
  width: 100%; background: var(--superficie-2); border: 1px solid var(--borda);
  border-radius: var(--raio-p); color: var(--texto); font-size: 12.5px; font-weight: 600;
  padding: 7px 9px; margin-bottom: 8px;
}
.pa-mapa-ponto-popup-input:focus { outline: none; border-color: var(--acento-forte); }
.pa-mapa-ponto-popup-remover {
  width: 100%; background: transparent; border: 1px solid var(--erro); color: var(--erro);
  border-radius: var(--raio-p); font-size: 11.5px; font-weight: 700; padding: 6px 8px; cursor: pointer;
}
.pa-mapa-ponto-popup-remover:hover { background: var(--erro-fundo); }

.pa-toggle-ordem { display: flex; gap: 6px; background: var(--superficie-2); border: 1px solid var(--borda); border-radius: var(--raio-g); padding: 5px; margin-bottom: 22px; }
.pa-toggle-ordem button { flex: 1; background: transparent; border: none; color: var(--texto-suave); border-radius: var(--raio-m); font-size: 12.5px; font-weight: 800; height: 40px; cursor: pointer; }
/* 28/08: Lincoln pediu uma cor mais neutra pros botões amarelos deste
   passo (destaque virou "chamativo demais" no card maior) — reaproveitado
   o mesmo gradiente cinza-escuro já usado em `.pa-btn.escuro` (design.css),
   em vez de inventar um tom novo. Só este toggle + o botão "Iniciar
   entrega" abaixo mudaram; nenhum outro botão amarelo do app (login,
   outros passos, etc.) foi tocado. */
.pa-toggle-ordem button.ativo { background: linear-gradient(135deg, #3a3a37 0%, #1b1a17 100%); color: #f5f2e8; }

.pa-placeholder-em-breve {
  background: var(--superficie); border: 1px solid var(--borda); border-radius: var(--raio-g);
  padding: 32px 22px; text-align: center; color: var(--texto-suave); font-size: 14px; font-weight: 600; line-height: 1.5;
  box-shadow: var(--sombra-1);
}
.pa-placeholder-em-breve svg { display: block; width: 30px; height: 30px; color: var(--acento-forte); margin: 0 auto 14px; }

.pa-estado-geral {
  display: flex; align-items: center; justify-content: center; gap: 10px;
  padding: 60px 20px; color: rgba(255,255,255,0.65); font-size: 14px; font-weight: 700; text-align: center;
}
.pa-estado-geral[hidden] { display: none; }
/* Sobre o fundo escuro da página (sem cartão), o spinner padrão (pensado
   pra fundo claro) precisa de um anel claro pra ficar visível. */
.pa-estado-geral .pa-spinner { border-color: rgba(255,255,255,0.2); border-top-color: var(--acento); }

/* ---------------------------------------------------------------------
   Responsivo — abaixo de ~1024px, colunas do Início e nav empilham.
   --------------------------------------------------------------------- */
@media (max-width: 1024px) {
  .pa-nav { display: none; }
  /* Nome/subtítulo da conta ("AESA Empilhadeiras" / "Cliente Taskr") não
     encolhem — em telas estreitas isso empurrava a barra de topo pra fora
     da largura da tela (scroll horizontal). Some o texto e o chevron,
     mantém só o avatar circular, que já é suficiente pra abrir o menu. */
  .pa-topo { padding: 12px 16px; gap: 14px; }
  .pa-conta-texto, .pa-conta-chevron, .pa-marca-tagline { display: none; }
  .pa-conta-botao { padding: 4px; gap: 0; }
  .pa-colunas-inicio { grid-template-columns: 1fr; }
  /* 1 coluna — "Realize uma Task" e "Atalhos" ficam empilhados no mobile. */
  .pa-kpis { grid-template-columns: 1fr; }
  /* Setas do carrossel só fazem sentido com mouse/trackpad — no touch o
     usuário arrasta direto na lista, então elas só ocupam espaço. */
  .pa-carrossel-setas { display: none; }
  .pa-robo-card { flex-basis: 150px; }
  /* 01/09: --pa-hero-h redefinida aqui pro valor proporcional do banner no
     mobile (era 360px -> 240px -> +25% = 300px -> +40% = 420px) -- redefinir
     a MESMA variável usada no desktop (em vez de só o min-height) garante
     que `.pa-kpis` (que também depende dela, ver dashboard.css) recalcule o
     puxão certo pra esta altura menor automaticamente. */
  :root { --pa-hero-h: 420px; }
  .pa-hero { min-height: var(--pa-hero-h); }
  .pa-hero::before { background: linear-gradient(90deg, var(--fundo) 0%, rgba(6,6,5,0.55) 55%, rgba(6,6,5,0.2) 85%); }
  .pa-hero-inner { padding: 0 24px; }
  .pa-hero-texto { max-width: 100%; }
  .pa-hero-saudacao { font-size: 40px; }
  .pa-hero-sub { font-size: 15px; }
  /* .pa-kpis não precisa de regra própria aqui -- seu margin-top já é
     calc(var(--pa-hero-h) * -0.286) (ver dashboard.css), então redefinir
     --pa-hero-h acima (420px) já recalcula o puxão certo pra este tamanho
     (~120px) sem precisar repetir o número aqui. */
}

/* ---------------------------------------------------------------------
   Notificações de canto (26/08) -- mostrarNotificacao()/mostrarMensagemEntrega()
   em dashboard.js. Pedido do Lincoln: substituir o aviso que ficava FIXO
   acima do card do mapa, na Entrega, por um popup nosso (não do navegador)
   no canto da tela, cobrindo sucesso/erro/aviso de qualquer comando.
   Container fica fora de .pa-tela (ver comentário no index.html, mesmo
   motivo dos outros dois painéis que já ficam lá fora).
   --------------------------------------------------------------------- */
.pa-notificacoes-canto {
  position: fixed;
  right: 20px; bottom: 20px;
  z-index: 60;
  display: flex; flex-direction: column; gap: 10px;
  max-width: min(360px, calc(100vw - 40px));
  pointer-events: none;
}
.pa-notificacao {
  pointer-events: auto;
  display: flex; align-items: flex-start; gap: 10px;
  padding: 13px 14px;
  border-radius: var(--raio-m);
  background: #16151a;
  border: 1px solid rgba(255,255,255,0.08);
  box-shadow: var(--sombra-2);
  color: #f2f2f0;
  animation: pa-notificacao-entrar 0.32s cubic-bezier(0.34, 1.56, 0.64, 1);
}
.pa-notificacao.saindo { animation: pa-notificacao-sair 0.18s ease-in forwards; }
/* 26/08: Lincoln pediu "pop in e pop out" no lugar do slide+fade que tinha
   antes -- entrada com um leve overscale (efeito de "estourar" pra dentro,
   por isso o cubic-bezier com overshoot em vez de ease) e saída encolhendo
   pro centro (em vez de deslizar pro lado). */
@keyframes pa-notificacao-entrar {
  0% { opacity: 0; transform: scale(0.72); }
  60% { opacity: 1; transform: scale(1.04); }
  100% { opacity: 1; transform: scale(1); }
}
@keyframes pa-notificacao-sair {
  from { opacity: 1; transform: scale(1); }
  to { opacity: 0; transform: scale(0.75); }
}
@media (prefers-reduced-motion: reduce) {
  /* Diferente do zoom/crossfade do banner (ver comentário grande mais
     acima), aqui é seguro respeitar a preferência de verdade -- é só a
     transição de entrada/saída de um toast, não um efeito que o Lincoln
     pediu repetidas vezes pra "fazer funcionar". */
  .pa-notificacao, .pa-notificacao.saindo { animation: none; }
}
.pa-notificacao-icone { width: 18px; height: 18px; flex-shrink: 0; margin-top: 1px; }
.pa-notificacao-texto { flex: 1; font-size: 13.5px; font-weight: 600; line-height: 1.4; margin: 0; }
.pa-notificacao-fechar {
  background: none; border: none; color: rgba(255,255,255,0.5); font-size: 18px; line-height: 1;
  cursor: pointer; padding: 0 0 0 4px; flex-shrink: 0;
}
.pa-notificacao-fechar:hover { color: #fff; }
.pa-notificacao-sucesso { border-left: 3px solid var(--sucesso); }
.pa-notificacao-sucesso .pa-notificacao-icone { color: var(--sucesso); }
.pa-notificacao-erro { border-left: 3px solid var(--erro); }
.pa-notificacao-erro .pa-notificacao-icone { color: var(--erro); }
.pa-notificacao-aviso { border-left: 3px solid var(--alerta); }
.pa-notificacao-aviso .pa-notificacao-icone { color: var(--alerta); }
@media (max-width: 640px) {
  .pa-notificacoes-canto { right: 12px; left: 12px; bottom: 12px; max-width: none; }
}
