/* Design system do GoDive: paleta do sistema de 2017 (Cores.psd), degradê do
   logotipo (manual p.12), Oblik/Sansation/AmpleSoft. Extraído do protótipo.
   Fontes em WOFF2 desde 02/10/2026: a mesma fonte (caracteres, larguras, kerning e o
   contorno de cada glifo conferidos contra os .otf/.ttf originais, que ficam em
   fonte/fontes), só que com compressão melhor.
   O ?v=1 nas fontes deixa o navegador guardá-las por um ano (o servidor só dá "immutable" a /midia/ com v= na
   busca). Se um arquivo de fonte mudar, troque o número (?v=2) nos seis @font-face abaixo. */
@font-face{font-family:"Oblik";src:url(/midia/fontes/Oblik-Bold.woff2?v=1) format("woff2");font-weight:700;font-display:swap}
@font-face{font-family:"AmpleSoft";src:url(/midia/fontes/AmpleSoft.woff2?v=1) format("woff2");font-weight:400;font-display:swap}
@font-face{font-family:"AmpleSoft";src:url(/midia/fontes/AmpleSoft-Medium.woff2?v=1) format("woff2");font-weight:500;font-display:swap}
@font-face{font-family:"AmpleSoft";src:url(/midia/fontes/AmpleSoft-Bold.woff2?v=1) format("woff2");font-weight:700;font-display:swap}
@font-face{font-family:"Sansation";src:url(/midia/fontes/Sansation-Regular.woff2?v=1) format("woff2");font-weight:400;font-display:swap}
@font-face{font-family:"Sansation";src:url(/midia/fontes/Sansation-Bold.woff2?v=1) format("woff2");font-weight:700;font-display:swap}
:root{
  /* Paleta oficial do sistema (Cores.psd, 2017): ciano, mint, teal, ícones/texto/título do topo, box, fundo, títulos, descrições, laranja */
  /* Degradê do logotipo (manual p.12): azul 112,197,222 -> mint 127,224,184 */
  --g1:#70C5DE; --g2:#7FE0B8; --g3:#1ED3D6;
  /* --teal e --muted: tons da paleta de 2017 (#207E6F, #9FA1A4) escurecidos no mesmo matiz até
     passar WCAG AA (4,5:1) sobre --ground, --surface e --teal-soft; os originais reprovavam (4,4 e 2,3). */
  --teal:#1E7769; --teal-ink:#115046; --icon:#2AA390; --teal-soft:#E4F5F1; --mint-soft:#DDF8F0;
  --ink:#5E646B; --muted:#6D6E70; --faint:#B9BBBE;
  /* títulos: --ink escurecido no mesmo matiz (metade da luminância), para a hierarquia não depender só do tamanho */
  --titulo:#3E4247;
  --ground:#F0F4F5; --surface:#FCFEFE; --surface-2:#E6ECED; --line:#DDE3E5; --line-strong:#C4CBCE;
  --orange:#E16928; --orange-soft:#FBE9DE;
  --red:#B73736; --red-soft:#F8E4E3; --amber:#C97F12; --amber-soft:#FBEFD9; --green:#1B8F65; --green-soft:#DDF3EA;
  /* texto sobre os fundos -soft, no mesmo padrão de --teal/--teal-ink: a cor cheia serve a ponto,
     ícone e borda; o -ink é a mesma cor escurecida até AA sobre o -soft e sobre --surface. */
  --amber-ink:#9A610E; --green-ink:#187E59; --orange-ink:#B35320;
  /* texto sobre o degradê do logotipo e sobre superfícies que continuam claras no tema escuro */
  --on-grad:#063238;
  /* texto sobre superfícies que continuam como são nos dois temas: o título pequeno da faixa da página inicial (sobre a foto
     escura) e o do topo do ticket (sobre o degradê claro). Antes eram hex dentro de style= nos templates. */
  --sobre-foto:#DFFCF5; --sobre-claro:#0A4A55;
  /* área mínima de toque (WCAG 2.5.5 / diretriz de 44 pt da Apple) */
  --alvo:44px;
  /* visualizador de anexos (static/visor.js): escuro nos dois temas, então estes tokens não mudam no tema escuro */
  --visor-fundo:rgba(6,16,18,.985); --visor-veu:rgba(6,16,18,.62); --visor-texto:#F4F7F7; --visor-suave:#C9D3D5; --visor-branco:#fff;
  --visor-foco:#7FE0B8; --visor-baixar-hover:#9BEBCB; --visor-aviso-fundo:#3A2C12; --visor-aviso-texto:#FBEFD9;
  /* sinais de mão do briefing (fotos em fundo branco): no claro o branco some no cartão por
     multiplicação; no escuro a multiplicação apagava a foto, então ela vira uma placa clara */
  --sinal-mistura:multiply; --sinal-filtro:grayscale(1) contrast(1.05);
  --shadow:0 10px 30px rgba(0,80,95,.10); --shadow-sm:0 2px 8px rgba(0,80,95,.08);
  --r:14px; --r-sm:8px; --r-painel:22px;
  /* véu do cabeçalho do chat: o degradê do logotipo é claro demais para texto e logotipo brancos; o véu em verde-petróleo
     (o --teal-ink do tema claro) leva o contraste do branco a 5:1 ou mais nas duas pontas do degradê */
  --veu-topo:rgba(17,80,70,.72);
  --logo:#58595B; --show-light:block; --show-dark:none;
  color-scheme:light;
}
@media (prefers-color-scheme:dark){
  :root:not([data-theme="light"]){
    --teal:#3ED3BF; --teal-ink:#9BEADF; --icon:#2AA390; --teal-soft:#123A34; --mint-soft:#0F3A31;
    --ink:#E9EEEF; --muted:#A7ACB0; --faint:#6F7478; --titulo:#F4F7F7;
    --ground:#111C1F; --surface:#182629; --surface-2:#203033; --line:#2B3C40; --line-strong:#3D5054;
    --orange:#F0854B; --orange-soft:#3A2418;
    --red:#E07A78; --red-soft:#3B1E1E; --amber:#E6A63E; --amber-soft:#3A2C12; --green:#4FCB9B; --green-soft:#12362A;
    --amber-ink:#E6A63E; --green-ink:#4FCB9B; --orange-ink:#F0854B;
    --sinal-mistura:normal; --sinal-filtro:grayscale(1) contrast(1.05) brightness(.88);
    --shadow:0 10px 30px rgba(0,0,0,.35); --shadow-sm:0 2px 8px rgba(0,0,0,.3);
    --logo:#E6F1F3; --show-light:none; --show-dark:block; color-scheme:dark;
  }
}
:root[data-theme="dark"]{
  --teal:#3ED3BF; --teal-ink:#9BEADF; --icon:#2AA390; --teal-soft:#123A34; --mint-soft:#0F3A31;
  --ink:#E9EEEF; --muted:#A7ACB0; --faint:#6F7478; --titulo:#F4F7F7;
  --ground:#111C1F; --surface:#182629; --surface-2:#203033; --line:#2B3C40; --line-strong:#3D5054;
  --orange:#F0854B; --orange-soft:#3A2418;
  --red:#E07A78; --red-soft:#3B1E1E; --amber:#E6A63E; --amber-soft:#3A2C12; --green:#4FCB9B; --green-soft:#12362A;
  --amber-ink:#E6A63E; --green-ink:#4FCB9B; --orange-ink:#F0854B;
    --sinal-mistura:normal; --sinal-filtro:grayscale(1) contrast(1.05) brightness(.88);
  --shadow:0 10px 30px rgba(0,0,0,.35); --shadow-sm:0 2px 8px rgba(0,0,0,.3);
  --logo:#E6F1F3; --show-light:none; --show-dark:block; color-scheme:dark;
}
*{box-sizing:border-box}
body{margin:0;background:var(--ground);color:var(--ink);font-family:AmpleSoft,"Segoe UI",system-ui,sans-serif;font-size:15.5px;line-height:1.5;-webkit-font-smoothing:antialiased}
h1,h2,h3,h4{font-family:Oblik,AmpleSoft,system-ui,sans-serif;font-weight:700;color:var(--titulo);margin:0;text-wrap:balance;line-height:1.15;letter-spacing:.005em}
h1{font-size:2.1rem;font-weight:800}
h2{font-size:1.45rem;font-weight:800}
h3{font-size:1.08rem;font-weight:700}
h4{font-size:.95rem;font-weight:700}
p{margin:0}
a{color:var(--teal)}
button{font:inherit;cursor:pointer}
input,select{font:inherit;color:var(--ink);background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-sm);padding:9px 11px}
input:focus,select:focus,button:focus-visible{outline:2px solid var(--g1);outline-offset:2px}
input[type=checkbox],input[type=radio]{width:18px;height:18px;accent-color:var(--teal)}
input:not([type=checkbox]):not([type=radio]):not([type=range]),select{min-height:var(--alvo)}
.num{font-variant-numeric:tabular-nums}
.eyebrow{font-family:Sansation,AmpleSoft,sans-serif;font-size:.72rem;letter-spacing:.09em;text-transform:uppercase;font-weight:700;color:var(--teal)}
.muted{color:var(--muted)}
.small{font-size:.85rem}
.wrap{max-width:1160px;margin:0 auto;padding:0 22px}
[hidden]{display:none!important}

/* top bar */
.topbar{position:sticky;top:0;z-index:20;background:var(--surface);border-bottom:1px solid var(--line)}
.topbar .wrap{display:flex;align-items:center;gap:22px;height:62px}
.logo{display:grid;justify-items:end;align-content:center;gap:1px;min-height:var(--alvo);text-decoration:none;color:var(--logo)}
.logo img{height:26px;width:auto}
.logo small{font-family:Sansation,AmpleSoft,sans-serif;font-size:.6rem;color:var(--muted);letter-spacing:.01em;line-height:1}
html:not([lang^="pt"]) .logo small{justify-self:center}  /* "your dive app" e "tu app de buceo" são bem mais curtos que o logotipo: alinhados à direita, ficavam tortos; só a assinatura em português tem o tamanho dele */
.logo picture{display:contents}  /* uma versão só do logotipo é baixada: o <picture> escolhe pelo tema */

/* buttons */
.btn{border:0;border-radius:999px;padding:11px 20px;min-height:var(--alvo);font-weight:800;font-size:.92rem;display:inline-flex;align-items:center;justify-content:center;gap:8px;text-decoration:none;color:var(--ink)}
.btn-primary{background:linear-gradient(90deg,var(--g1),var(--g2));color:var(--on-grad);box-shadow:0 6px 18px rgba(112,197,222,.45)}
.btn-primary:hover{filter:saturate(1.15)}
.btn-ghost{background:transparent;border:1.5px solid var(--line-strong);color:var(--ink)}
.btn-ghost:hover{border-color:var(--teal);color:var(--teal)}
.btn-whatsapp{background:var(--green-ink);color:var(--surface)}  /* verde da paleta, com contraste AA; não o verde da marca do WhatsApp */
.btn-whatsapp:hover{filter:brightness(1.08)}
.btn-orange{background:var(--orange-ink);color:var(--surface)}
.btn-sm{padding:7px 14px;font-size:.82rem}
.btn:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}
.link{background:none;border:0;color:var(--teal);font-weight:700;padding:0 4px;display:inline-flex;align-items:center;min-height:var(--alvo);min-width:var(--alvo)}

/* pills */
.pill{display:inline-flex;align-items:center;gap:6px;font-size:.74rem;font-weight:800;padding:3px 10px;border-radius:999px;letter-spacing:.02em;white-space:nowrap}
.pill-teal{background:var(--teal-soft);color:var(--teal-ink)}
.pill-mint{background:var(--mint-soft);color:var(--green-ink)}
.pill-amber{background:var(--amber-soft);color:var(--amber-ink)}
.pill-red{background:var(--red-soft);color:var(--red)}
.pill-grey{background:var(--surface-2);color:var(--ink)}
.pill-orange{background:var(--orange-soft);color:var(--orange-ink)}
.dot{width:8px;height:8px;border-radius:50%;background:currentColor;display:inline-block}

/* ====== DIVER ====== */
.hero{position:relative;overflow:hidden;background:linear-gradient(100deg,var(--g1),var(--g2));color:#fff;isolation:isolate}
.hero > img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.5;mix-blend-mode:luminosity;z-index:-1}  /* só a foto de fundo (filha direta): com ".hero img" o selo ao lado do sobretítulo também virava fundo e aparecia como uma faixa no topo */
.hero::after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,rgba(17,80,70,.80),rgba(17,80,70,.50));z-index:-1}  /* véu em --teal-ink: medido sobre a foto, o texto fica acima de 5:1 */
.hero .wrap{padding:44px 22px 40px;display:grid;gap:18px}
.hero h1{font-size:clamp(1.7rem,3.6vw,2.6rem);max-width:640px;color:#fff;text-shadow:0 2px 12px rgba(0,60,70,.35)}
.hero p{max-width:560px;color:rgba(255,255,255,.92)}
.search{background:var(--surface);color:var(--ink);border-radius:18px;padding:10px;display:grid;grid-template-columns:1.6fr 1fr 1fr auto;gap:8px;box-shadow:var(--shadow);max-width:900px}
.search label{display:grid;gap:0;padding:6px 12px 2px;border-right:1px solid var(--line)}
.search label:nth-last-child(2){border-right:0}
.search label span{font-family:Sansation,AmpleSoft,sans-serif;font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:var(--teal)}
.search input,.search select{border:0;padding:0;background:transparent;font-weight:700;width:100%;min-height:var(--alvo)}  /* o campo em si tem 44 px: no iPhone, tocar no rótulo não abre a lista */
.search .btn{align-self:center}
.chips{display:flex;gap:8px;flex-wrap:wrap}
.chip{border:1.5px solid rgba(255,255,255,.55);background:rgba(255,255,255,.12);color:#fff;border-radius:999px;padding:6px 14px;min-height:var(--alvo);display:inline-flex;align-items:center;font-weight:700;font-size:.84rem;backdrop-filter:blur(4px)}
.chip[aria-current="true"]{background:#fff;color:var(--teal-ink);border-color:#fff}
.section{padding:34px 0 8px}
.section-head{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-bottom:16px;flex-wrap:wrap}
.ordenar{display:flex;align-items:center;flex-wrap:wrap;gap:4px 8px;margin:-6px 0 14px}  /* "Ordenar: Relevância | Data": dois links, o ativo em destaque */
.ordenar a{display:inline-flex;align-items:center;min-height:var(--alvo);padding:0 14px;border-radius:999px;border:1.5px solid var(--line-strong);color:var(--ink);font-weight:700;font-size:.88rem;text-decoration:none}
.ordenar a[aria-current="true"]{background:var(--teal-soft);border-color:var(--teal);color:var(--teal-ink)}
.grid-trips{display:grid;grid-template-columns:repeat(auto-fill,minmax(262px,1fr));gap:18px}
.trip{background:var(--surface);border-radius:var(--r);overflow:hidden;border:1px solid var(--line);display:grid;grid-template-rows:auto 1fr;cursor:pointer;transition:transform .18s,box-shadow .18s;text-align:left;padding:0;color:inherit;text-decoration:none}  /* o cartão é um link (<a class="trip">): sem sublinhado; antes era um style= em cada link */
.trip:hover{transform:translateY(-3px);box-shadow:var(--shadow)}
.trip .ph{position:relative;aspect-ratio:3/2;overflow:hidden}
.trip .ph picture,.dest picture{display:contents}
.trip .ph img{width:100%;height:100%;object-fit:cover;display:block}
.trip .ph .pill{position:absolute;left:10px;top:10px;background:rgba(255,255,255,.92);color:#0A4A55}
.trip .body{padding:13px 14px 14px;display:grid;gap:6px;align-content:start}
.trip h3{font-size:1rem}
.trip .meta{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:4px 8px;font-size:.84rem;color:var(--muted)}  /* o selo ("Pede Deep") desce para a linha de baixo em vez de espremer o preço */
.trip .price{font-family:Oblik;font-weight:800;font-size:1.05rem;color:var(--ink);white-space:nowrap}  /* "R$ 480,00 por pessoa" não quebra no meio */
.trip .price small{font-family:AmpleSoft;font-weight:600;color:var(--muted);font-size:.75rem}
.stars{color:var(--g2);letter-spacing:-1px;font-size:.9rem}
.stars b{color:var(--ink);font-family:AmpleSoft;letter-spacing:0;margin-left:4px;font-size:.82rem}
/* até 300 px por cartão: com 2 ou 3 destinos o 1fr esticava cada um para mais de 500 px e empurrava as saídas para baixo; no celular (2 colunas de 180 não cabem) nada muda */
.dest-row{display:grid;grid-auto-flow:column;grid-auto-columns:minmax(180px,300px);gap:12px;overflow-x:auto;padding-bottom:8px;scroll-snap-type:x mandatory}
.dest{position:relative;aspect-ratio:4/3;border-radius:var(--r);overflow:hidden;scroll-snap-align:start;color:#fff;border:0;padding:0;cursor:pointer;text-align:left}
.dest img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .3s}
.dest:hover img{transform:scale(1.05)}
.dest div{position:absolute;inset:auto 0 0 0;padding:12px;background:linear-gradient(transparent,rgba(0,40,50,.85));font-weight:800;font-family:Oblik;font-size:1rem;line-height:1.2}
.dest div small{display:block;font-family:AmpleSoft;font-weight:600;opacity:.85;font-size:.75rem}
.map{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;margin-bottom:18px}
.map > svg{width:100%;height:auto;display:block;max-height:520px}
.leaflet-container svg{max-width:none}
.leaflet-container img{max-width:none}
.map .leaflet{height:520px;width:100%;background:var(--teal-soft)}
.map .legenda{display:flex;gap:16px;flex-wrap:wrap;padding:8px 14px;font-size:.78rem;color:var(--muted);border-top:1px solid var(--line);align-items:center}
.map .legenda i{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:5px;vertical-align:-1px}
.map .legenda .p{background:#fff;border:2px solid var(--g1)}
.map .legenda .o{background:#2AA390}
.map .legenda .s{background:var(--orange);width:7px;height:7px}
.map{position:relative;isolation:isolate}  /* camadas do Leaflet (z-index até 1000) ficam presas aqui: os botões do mapa não passam por cima do cabeçalho fixo */
.map-gate{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:900;border:0;border-radius:999px;padding:10px 18px;min-height:var(--alvo);white-space:nowrap;font:inherit;font-weight:800;font-size:.85rem;color:var(--on-grad);background:linear-gradient(90deg,var(--g1),var(--g2));box-shadow:0 6px 16px rgba(17,80,70,.3)}  /* no centro do mapa, numa linha: embaixo cobria os créditos e a legenda */
.pin-selo{background:#fff;border:2px solid var(--g1);border-radius:50%;width:34px;height:34px;display:grid;place-items:center;box-shadow:0 3px 8px rgba(17,80,70,.25)}
.leaflet-container .leaflet-marker-pane .pin-selo img,.pin-selo img{width:22px;height:auto}  /* o leaflet.css põe width:auto em .leaflet-marker-pane img com mais peso; sem isto o selo aparece em 240px */
.leaflet-popup-content{font-family:AmpleSoft,sans-serif;font-size:.9rem;line-height:1.4;margin:10px 12px}
.leaflet-popup-content b{font-family:Oblik,AmpleSoft,sans-serif}
.leaflet-popup-content .pill{margin-top:4px}
.leaflet-popup-content a{color:var(--teal);font-weight:700}
.leaflet-container{font-family:AmpleSoft,sans-serif}
/* + e − do mapa com a área de toque do site; o leaflet.css (carregado depois) usa 26/30px, daí o seletor mais pesado */
.leaflet-container .leaflet-bar.leaflet-control-zoom a{width:var(--alvo);height:var(--alvo);line-height:var(--alvo);font-size:22px}
/* auto-fit: com 3 itens as colunas vazias somem e os cartões ocupam a linha (auto-fill deixava uma coluna vazia à direita); o teto de 420 px evita um cartão único esticado na tela inteira */
.dc-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,420px));gap:12px}
.dc{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px;display:grid;gap:4px;align-content:start}
.dc b{font-family:Oblik,AmpleSoft,sans-serif;font-size:.98rem}
.dc .l{display:flex;gap:8px;flex-wrap:wrap;font-size:.82rem;color:var(--muted)}
.dc a:not(.btn){color:var(--teal);font-weight:700;text-decoration:none;font-size:.85rem}
.dc .acao{margin-top:6px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.dc .acao a:not(.btn){display:inline-flex;align-items:center;justify-content:center;min-height:var(--alvo);min-width:var(--alvo);padding:0 6px}
.minimap{position:relative;isolation:isolate;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden;margin:8px 0 4px;background:var(--teal-soft)}  /* como no .map: as camadas do Leaflet (z-index 400) ficam presas aqui e não passam por cima do cabeçalho fixo ao rolar */
.minimap svg{width:100%;height:190px;display:block}
.ticket .minimap svg{height:150px}
.subnav{display:flex;gap:18px;border-bottom:1px solid var(--line);margin-top:4px}
.subnav button{background:none;border:0;padding:12px 2px;font-weight:800;color:var(--muted);border-bottom:2.5px solid transparent;margin-bottom:-1px}
.subnav button[aria-selected="true"]{color:var(--teal);border-color:var(--teal)}
.subnav:has(> a){overflow-x:auto;overflow-y:hidden;scrollbar-width:none;border-bottom:0;box-shadow:inset 0 -1px var(--line)}  /* em 320px as quatro abas não cabem: rolam dentro da faixa */
.subnav:has(> a)::-webkit-scrollbar{display:none}
.subnav a{display:inline-flex;align-items:center;flex:none;white-space:nowrap;min-height:var(--alvo);padding:0 2px;font-weight:800;color:var(--muted);text-decoration:none;border-bottom:2.5px solid transparent}
.subnav a:hover{color:var(--teal)}
.subnav a[aria-selected="true"]{color:var(--teal);border-color:var(--teal)}

/* trip detail */
.detail{display:grid;grid-template-columns:1.55fr 1fr;gap:26px;padding:6px 0 40px;align-items:start}  /* o "Voltar" já tem 44 px de altura: um respiro grande aqui deixava ~70 px vazios até a linha do dive center */
.back{background:none;border:0;color:var(--teal);font-weight:800;padding:4px 0;min-height:var(--alvo);display:inline-flex;gap:6px;align-items:center;margin-top:6px}
.center-line{display:flex;align-items:center;gap:8px 12px;margin:8px 0 6px;flex-wrap:wrap}
.center-line > div:not(.avatar){flex:1 1 11rem;min-width:0}
.center-line b a{display:inline-flex;align-items:center;min-height:var(--alvo)}
.avatar{width:44px;height:44px;border-radius:50%;background:#fff;border:1.5px solid var(--line);display:grid;place-items:center;flex:none;overflow:hidden}
.avatar img{width:68%;height:auto;display:block}
.kv{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin:16px 0}
.kv div{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:10px 12px}
.kv span{font-family:Sansation,AmpleSoft,sans-serif;display:block;font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:800}
.kv b{font-family:Oblik;font-size:1rem}
.points{display:grid;gap:8px;margin:8px 0 18px}
.point{display:grid;grid-template-columns:auto 1fr auto auto;gap:14px;align-items:center;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:10px 14px}
.point .n{width:26px;height:26px;border-radius:50%;background:var(--teal-soft);color:var(--teal-ink);font-weight:800;display:grid;place-items:center;font-size:.8rem}
.point .depth{font-family:Sansation,AmpleSoft,sans-serif;font-family:Oblik;font-weight:800;color:var(--teal)}
.detail h2,.detail h3{margin:18px 0 8px}
.detail h2{font-size:1.08rem;font-weight:700}  /* as seções da saída são h2 (a página pulava de h1 para h3), com a aparência do h3 */
.detail .minimap{margin:8px 0 14px}  /* respiro antes do texto do ponto de encontro, que colava no mapa */
.detail ul{margin:0;padding-left:18px}
.policy{border-left:3px solid var(--teal);background:var(--teal-soft);padding:10px 14px;border-radius:0 var(--r-sm) var(--r-sm) 0;font-size:.9rem}
.book{position:sticky;top:78px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:18px;box-shadow:var(--shadow);display:grid;gap:12px}
.book .price{font-family:Oblik;font-size:1.5rem;font-weight:800}
.book .price small{font-family:AmpleSoft;font-size:.8rem;font-weight:600;color:var(--muted)}
.field{display:grid;gap:4px}
.field label{font-family:Sansation,AmpleSoft,sans-serif;font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:var(--muted)}
.breakdown{display:grid;gap:5px;font-size:.9rem;border-top:1px dashed var(--line-strong);padding-top:10px}
.breakdown div{display:flex;justify-content:space-between}
.breakdown .total{font-family:Oblik;font-weight:800;font-size:1.1rem;border-top:1px solid var(--line);padding-top:8px;margin-top:3px}
.cert{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border-radius:var(--r-sm);font-size:.86rem}
.cert.ok{background:var(--green-soft);color:var(--green-ink)}
.cert.no{background:var(--amber-soft);color:var(--amber-ink)}
.cert b{display:block}
.cert svg{flex:none;margin-top:2px}

/* certificações: perfil do mergulhador e conferência do admin */
.certs,.conferir{display:grid;gap:12px;margin:14px 0}
.cert-item{display:grid;gap:8px;padding:14px 16px}
.cert-topo{display:flex;justify-content:space-between;align-items:flex-start;gap:8px 12px;flex-wrap:wrap}
.cert-topo > div:first-child{flex:1 1 14rem;min-width:0}  /* o selo desce para a linha de baixo antes de espremer o texto */
.cert-motivo{background:var(--red-soft);color:var(--red);border-radius:var(--r-sm);padding:8px 12px;font-size:.9rem;font-weight:700}
.cert-acoes{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.cert-foto{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.arquivo{position:relative;overflow:hidden;cursor:pointer;max-width:100%}
.arquivo input{position:absolute;inset:0;opacity:0;cursor:pointer;width:100%;min-height:0}
.conferir-item{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:18px;align-items:start}
.conferir-foto{display:block;border-radius:var(--r-sm);overflow:hidden;border:1px solid var(--line);background:var(--surface-2)}
.conferir-foto img{display:block;width:100%;height:auto}
.conferir-dados{display:grid;gap:12px;align-content:start}
.conferir-dados dl{display:grid;grid-template-columns:auto 1fr;gap:4px 12px;margin:0;font-size:.9rem}
.conferir-dados dt{font-family:Sansation,AmpleSoft,sans-serif;font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:var(--muted);align-self:center}
.conferir-dados dd{margin:0}
.recusar{display:grid;gap:8px}
.validar{display:grid;gap:8px}
.leitura{display:grid;gap:8px;border:1px solid var(--line);border-radius:var(--r-sm);padding:12px}
.leitura h3{margin:0;font-size:.95rem}
.leitura-lista{list-style:none;margin:0;padding:0;display:grid;gap:6px}
.leitura-lista li{display:grid;grid-template-columns:minmax(0,7rem) minmax(0,1fr);gap:4px 10px;align-items:baseline;font-size:.9rem}
/* a pílula vai embaixo do valor: ao lado, "Diferente: lido Instrutor" espremia o valor até uma letra por linha no celular */
.leitura-lista li .pill{grid-column:2;justify-self:start}
.leitura-campo{font-family:Sansation,AmpleSoft,sans-serif;font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:var(--muted)}
.leitura-valor{overflow-wrap:anywhere}
.leitura-lista .pill{white-space:normal}
.leitura-texto{white-space:pre-wrap;overflow-wrap:anywhere;max-height:14rem;overflow:auto;background:var(--surface-2);border-radius:var(--r-sm);padding:10px;font-size:.8rem;margin:8px 0 0}

/* app instalável */
.aviso-offline{background:var(--amber-soft);color:var(--amber-ink);font-weight:800;font-size:.88rem;text-align:center;padding:10px 16px}
.instalar{display:flex;justify-content:space-between;align-items:center;gap:12px 18px;flex-wrap:wrap;margin:6px 0 30px}

/* checkout */
.checkout{display:grid;grid-template-columns:1.4fr 1fr;gap:26px;padding:22px 0 50px;align-items:start}
.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:20px}
.card + .card{margin-top:16px}
.pay-opts{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.pay-opts label{border:1.5px solid var(--line);border-radius:var(--r-sm);padding:10px;display:grid;gap:2px;cursor:pointer;font-weight:700;font-size:.88rem}
.pay-opts label:has(input:checked){border-color:var(--teal);background:var(--teal-soft)}
.pay-opts input{display:none}
.pay-opts small{color:var(--muted);font-weight:600}
.check{display:flex;gap:10px;align-items:flex-start;font-size:.9rem;padding:12px 0;min-height:var(--alvo)}
.check input{margin-top:3px}
.ticket{background:var(--surface);border-radius:var(--r);border:1px solid var(--line);overflow:hidden;box-shadow:var(--shadow);max-width:560px}
.ticket .top{background:linear-gradient(100deg,var(--g1),var(--g2));color:var(--on-grad);padding:20px 22px;display:flex;justify-content:space-between;align-items:center;gap:12px}
.ticket .top h2{color:var(--on-grad)}
.ticket .mid{padding:18px 22px;display:grid;grid-template-columns:1fr 1fr;gap:12px 20px}
.ticket .mid span{font-family:Sansation,AmpleSoft,sans-serif;display:block;font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:800}
.ticket .mid b{font-family:Oblik}
.ticket .foot{border-top:1px dashed var(--line-strong);padding:16px 22px;display:flex;gap:14px;align-items:center;justify-content:space-between;flex-wrap:wrap}
.timeline{display:grid;gap:0;margin-top:14px}
.tl{display:grid;grid-template-columns:22px 1fr;gap:12px;font-size:.9rem}
.tl i{width:12px;height:12px;border-radius:50%;background:var(--line-strong);margin:5px auto 0;position:relative}
.tl i::after{content:"";position:absolute;left:5px;top:12px;width:2px;height:34px;background:var(--line)}
.tl:last-child i::after{display:none}
.tl i.on{background:var(--teal)}
.tl i.done{background:var(--green)}
.tl div{padding-bottom:16px}
.tl b{display:block}

/* bookings + logbook */
.bk-list{display:grid;gap:12px;padding:20px 0}
.bk{display:grid;grid-template-columns:96px 1fr auto;gap:16px;align-items:center;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:12px;overflow:hidden}
.bk img{width:96px;height:72px;object-fit:cover;border-radius:var(--r-sm)}
.logbook{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin:14px 0 20px}
.stat{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:14px 16px}
.stat b{font-family:Oblik;font-size:1.6rem;font-weight:800;color:var(--teal);display:block}
.stat span{font-size:.8rem;color:var(--muted);font-weight:700}
table{border-collapse:collapse;width:100%;font-size:.9rem}
th{text-align:left;font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);padding:8px 10px;border-bottom:1px solid var(--line)}
td{padding:10px;border-bottom:1px solid var(--line);vertical-align:middle}
tr:last-child td{border-bottom:0}
td.num,td:has(> .link){white-space:nowrap}  /* valor e ações não partem no meio; a tabela rola dentro do cartão */
td > a:only-child:not(.btn){display:inline-flex;align-items:center;min-height:var(--alvo)}  /* link que é o conteúdo da célula: alvo de 44px */
.tbl{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);overflow-x:auto}
th{white-space:nowrap}

/* ====== DIVE CENTER ====== */
.admin{display:grid;grid-template-columns:230px 1fr;min-height:calc(100vh - 62px)}
.side{background:var(--surface);border-right:1px solid var(--line);padding:18px 12px;display:flex;flex-direction:column;gap:2px;position:sticky;top:62px;height:calc(100vh - 62px);overflow:auto}
.side .co{display:flex;gap:10px;align-items:center;padding:8px 10px 16px;border-bottom:1px solid var(--line);margin-bottom:10px}
.side .co b{font-family:Oblik;font-size:.95rem;display:block;line-height:1.2}
.side .co small{color:var(--muted);font-size:.75rem}
.side button{display:flex;align-items:center;gap:10px;background:none;border:0;text-align:left;padding:9px 12px;border-radius:var(--r-sm);font-weight:700;color:var(--muted);font-size:.92rem}
.side button svg{width:18px;height:18px;flex:none}
.side button[aria-selected="true"]{background:var(--teal-soft);color:var(--teal-ink)}
.side button:hover{color:var(--teal)}
.side a{position:relative;display:flex;align-items:center;gap:10px;min-height:var(--alvo);padding:9px 12px;border-radius:var(--r-sm);font-weight:700;color:var(--muted);font-size:.92rem;text-decoration:none}
.side a.ativo,.side a:hover{background:var(--teal-soft);color:var(--teal-ink)}
.side form{padding:10px 12px;margin-top:8px;border-top:1px solid var(--line)}
.side form button{width:100%;min-height:var(--alvo);background:none;border:1.5px dashed var(--line-strong);color:var(--muted);border-radius:var(--r-sm);padding:8px;font-weight:700;font-size:.82rem}
.side .sp{flex:1}
.side .shoplink{font-size:.75rem;color:var(--muted);padding:10px 12px;border-top:1px solid var(--line);margin-top:8px;line-height:1.4}
.side .shoplink code{color:var(--teal);font-size:.75rem;word-break:break-all}
.content{padding:26px 30px 60px;max-width:1080px}
.content > h1{font-size:1.6rem;margin-bottom:4px}
.crumb{font-size:.82rem;color:var(--muted);margin-bottom:14px}
.crumb a{display:inline-flex;align-items:center;min-height:var(--alvo)}
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px;margin-bottom:22px}
.kpi{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;display:grid;gap:3px}
.kpi span{font-family:Sansation,AmpleSoft,sans-serif;font-size:.74rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);font-weight:800}
.kpi b{font-family:Oblik;font-size:1.5rem;font-weight:800}
.kpi b.kpi-vazio{font-family:AmpleSoft,sans-serif;font-size:1rem;font-weight:700;color:var(--muted);align-self:center}  /* "Nenhum" e "Sem avaliações" não são número: sem o destaque da fonte grande */
.kpi small{font-size:.8rem;color:var(--muted);font-weight:600}
.kpi.hi{border-color:transparent;background:linear-gradient(120deg,var(--g1),var(--g2));color:var(--on-grad)}
.kpi.hi span,.kpi.hi small{color:var(--on-grad)}
.two{display:grid;grid-template-columns:1.5fr 1fr;gap:18px;align-items:start}
.panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
.panel .ph{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;border-bottom:1px solid var(--line);gap:12px}
.panel .pb{padding:12px 16px;overflow-x:auto}
.trow{display:grid;grid-template-columns:1fr auto auto;gap:14px;align-items:center;padding:10px 0;border-bottom:1px solid var(--line)}
.trow:last-child{border-bottom:0}
.trow b{font-family:Oblik;display:block}
.trow b a{display:inline-flex;align-items:center;min-height:var(--alvo)}
.trow small{color:var(--muted)}
.cap{display:flex;align-items:center;gap:8px;font-size:.85rem;font-weight:700;color:var(--muted)}
.alert{display:grid;grid-template-columns:auto 1fr;gap:10px;padding:10px 0;border-bottom:1px solid var(--line);font-size:.88rem}
.alert:last-child{border-bottom:0}
.alert i{width:10px;height:10px;border-radius:50%;margin-top:6px}
.tabs{display:flex;gap:8px;margin-bottom:16px;flex-wrap:wrap}
.tabs button{border:1.5px solid var(--line-strong);background:transparent;color:var(--muted);border-radius:999px;padding:6px 14px;font-weight:800;font-size:.84rem}
.tabs button[aria-selected="true"]{background:linear-gradient(90deg,var(--g1),var(--g2));border-color:transparent;color:var(--on-grad)}
.tabs a:not(.btn){display:inline-flex;align-items:center;min-height:var(--alvo);border:1.5px solid var(--line-strong);background:transparent;color:var(--muted);border-radius:999px;padding:6px 16px;font-weight:800;font-size:.84rem;text-decoration:none}
.tabs a:not(.btn):hover{border-color:var(--teal);color:var(--teal)}
.tabs a.ativo{background:linear-gradient(90deg,var(--g1),var(--g2));border-color:transparent;color:var(--on-grad)}
.aviso-pendente{background:var(--amber-soft);color:var(--amber-ink);border-radius:var(--r-sm);padding:12px 16px;font-weight:700;margin-bottom:18px}
.manifest td .pill{font-size:.7rem}
.form{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
input[type=range]{width:100%;accent-color:var(--teal)}
.big{font-family:Oblik;font-size:2rem;font-weight:800;color:var(--teal)}
.cal{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;font-size:.8rem;text-align:center}
.cal .h{font-family:Sansation,AmpleSoft,sans-serif;font-size:.65rem;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);font-weight:800;padding:4px 0}
.cal :where(div:not(.h)){padding:7px 0;border-radius:8px;font-weight:700;color:var(--muted)}  /* :where zera o peso: .has/.sel precisam vencer */
.cal .has{background:var(--teal-soft);color:var(--teal-ink)}
.cal .sel{background:linear-gradient(90deg,var(--g1),var(--g2));color:var(--on-grad)}
.cal .off{opacity:.35}
pre{background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);padding:12px 14px;font-size:.8rem;overflow-x:auto;margin:0;line-height:1.5}

/* ====== PLATFORM ====== */
.doc{max-width:860px;margin:0 auto;padding:36px 22px 70px;display:grid;gap:40px}
.doc section{display:grid;gap:14px}
.doc p,.doc li{max-width:66ch}
.doc h2{font-size:1.5rem}

.signals{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-top:10px}
.signals figure{margin:0;background:var(--surface-2);border-radius:var(--r-sm);overflow:hidden;border:1px solid var(--line)}
.signals img{width:100%;aspect-ratio:4/3;object-fit:cover;display:block;filter:var(--sinal-filtro);mix-blend-mode:var(--sinal-mistura)}
.signals figcaption{padding:8px 10px;font-size:.82rem;line-height:1.25}
.signals figcaption b{display:block;font-family:Oblik,AmpleSoft,sans-serif}
.signals figcaption span{color:var(--ink);font-size:.74rem}  /* sobre --surface-2 o --muted não chega a 4,5:1 */
.med summary{cursor:pointer;font-weight:700;color:var(--teal);padding:6px 0;min-height:var(--alvo);display:flex;align-items:center}
.medq{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:4px 16px;font-size:.86rem}
.medq label{display:flex;gap:8px;align-items:center;padding:5px 0;min-height:var(--alvo);border-bottom:1px dashed var(--line)}
.medq input{margin:0;flex:none}

@media (max-width:900px){
  .topbar .wrap{flex-wrap:wrap;height:auto;padding:8px 14px;gap:6px 10px}
  .hero .wrap{padding:28px 16px 26px}
  .hero::after{background:rgba(17,80,70,.72)}  /* no celular o texto ocupa a largura toda: véu uniforme */
  .wrap{padding:0 16px}
  .form,.pay-opts{grid-template-columns:1fr}
  .trow{grid-template-columns:1fr auto;gap:8px 12px}
  .trow > :nth-child(3){grid-column:1/-1;justify-self:start}
  .ticket .mid{grid-template-columns:1fr 1fr}
  .kv{grid-template-columns:1fr 1fr}
  .content > h1{font-size:1.35rem}
  .side button,.side a{padding:8px 12px;font-size:.85rem}
  /* grade não pode crescer além da tela: quem tem tabela ou <pre> rola por dentro */
  .admin{grid-template-columns:minmax(0,1fr)}
  .content,.panel,.card,.tbl,.two > *,.checkout > *,.detail > *{min-width:0;max-width:100%}
  pre{max-width:100%}
  /* tabela larga rola dentro do cartão; a primeira coluna não vira uma palavra por linha */
  .tbl table,.panel .pb table{min-width:560px}
  .tbl td:first-child,.panel .pb td:first-child{min-width:150px}
  /* menu do painel em uma linha, rolando de lado */
  .side{flex-wrap:nowrap;overflow-x:auto;gap:4px;padding:8px 10px;-webkit-overflow-scrolling:touch}
  .side button,.side a{white-space:nowrap;flex:none}
  .kpis{grid-template-columns:1fr 1fr;gap:8px}
  .kpi b{font-size:1.2rem}
  .section{padding:22px 0 4px}
  .hero .wrap{gap:12px}
  .chips{flex-wrap:nowrap;overflow-x:auto;margin:0 -16px;padding:0 16px 6px;scrollbar-width:none}
  .chips::-webkit-scrollbar{display:none}
  .chip{white-space:nowrap;flex:none}
  /* saídas: cartão deitado, foto à esquerda, metade da altura */
  .grid-trips{grid-template-columns:1fr;gap:10px}
  .trip{grid-template-columns:118px 1fr;grid-template-rows:auto}
  .trip > .body:only-child{grid-column:1/-1}  /* cartão sem foto (página do dive center): o texto ocupa a largura toda, não a coluna de 118 px da foto */
  .trip .ph{aspect-ratio:auto;height:100%;min-height:128px}
  .trip .ph .pill{left:6px;top:6px;font-size:.62rem;padding:2px 7px}
  .trip .body{padding:10px 12px;gap:4px}
  .trip h3{font-size:.95rem}
  .trip .meta{font-size:.8rem}
  .dc-list{grid-template-columns:1fr}
  .map .leaflet{height:360px}
  .map .legenda{gap:4px 12px;padding:6px 10px;font-size:.72rem}
  .map .legenda span:last-child{display:none}
  .map-desc{display:none}
  .section-head{gap:8px 12px}
  .search{grid-template-columns:1fr 1fr}
  .search label{border-right:0;border-bottom:1px solid var(--line)}
  .search label:first-child{grid-column:1/-1}  /* destino na linha inteira: o exemplo do campo cabe e a grade não sobra uma célula */
  .search label:nth-child(2){border-right:1px solid var(--line)}
  .search .btn{grid-column:1/-1;justify-content:center}
  .checkout,.two{grid-template-columns:1fr}
  .book{position:static}
  /* Saída no celular: o cartão de preço ("Reservar e pagar") sobe para logo depois do quadro duração/profundidade/nível/barco,
     em vez de ficar depois de ~1.700 px de texto. Só ordem visual (a ordem do HTML e a leitura por teclado/leitor de tela
     seguem a mesma). A coluna principal vira display:contents para seus filhos entrarem na ordem junto com o .book.
     Em flex as margens não colapsam, então os blocos abaixo zeram uma das pontas para manter o espaçamento do desktop. */
  .detail{display:flex;flex-direction:column;align-items:stretch;gap:0}
  .detail-main{display:contents}
  .detail-main > :not(.center-line):not(h1):not(.kv){order:2}
  .detail > .book{order:1}
  .detail .points{margin:0}
  .detail .minimap{margin-top:0}
  .admin{grid-template-columns:1fr}
  .side{position:static;height:auto;flex-direction:row;flex-wrap:nowrap;overflow-x:auto;border-right:0;border-bottom:1px solid var(--line)}
  .side .co,.side .shoplink,.side .sp{display:none}
  /* os botões de teste do admin entram na faixa que rola: numa linha só. Espremidos, quebravam palavra por
     palavra e esticavam a faixa inteira (03/10/2026, no iPhone) */
  .side{align-items:center}
  .side form{flex:none;padding:0;margin:0;border-top:0}
  .side form button{width:auto;white-space:nowrap;padding:8px 14px}
  .content{padding:20px 18px 50px}
  .logo img{height:22px}.logo small{font-size:.5rem}
  .bk{grid-template-columns:72px 1fr}
  .bk img{width:72px;height:56px}
  .bk > :last-child{grid-column:1/-1}
  .conferir-item{grid-template-columns:1fr}
  /* sinais do briefing: três por linha, proporcionais à tela, em vez de um por linha ocupando tudo */
  .signals{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
  .signals figcaption{padding:6px 7px;font-size:.74rem}
  .signals figcaption span{font-size:.66rem}
}
@media (prefers-reduced-motion:reduce){*{transition:none!important}}

/* conferência de carteirinha: consulta no site da certificadora, quadro sem foto, detalhes do perfil */
.sem-foto{display:grid;place-items:center;min-height:120px;padding:16px;text-align:center}
.consulta{display:grid;gap:8px;justify-items:start;border:1px solid var(--line);border-radius:var(--r-sm);padding:10px 12px;background:var(--surface-2)}
.copiar{list-style:none;margin:0;padding:0;display:grid;gap:6px;width:100%}
.copiar li{display:flex;gap:10px;align-items:center;justify-content:space-between}
.copiar li span{min-width:0;overflow-wrap:anywhere}
.copiar li .btn{flex:none}
.cert-dados summary{cursor:pointer;font-weight:700;color:var(--teal);padding:12px 0}  /* 44 px de alvo */

/* aba "App": instalar no celular */
.app-instalar h2{font-size:1.05rem;margin:0 0 8px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.app-estado{display:grid;gap:10px;justify-items:start;margin:14px 0}
.app-estado p{margin:0;font-weight:700}
.app-plataformas{display:grid;gap:14px;margin:16px 0 30px}
.app-plataforma{display:grid;gap:6px}
.app-plataforma[hidden]{display:none}
.app-passos{margin:0;padding-left:1.3em;display:grid;gap:6px}
.app-icone{width:1.15em;height:1.15em;vertical-align:-.2em;color:var(--teal)}
.app-qr-codigo{justify-self:start;background:#fff;border-radius:var(--r-sm);padding:6px;line-height:0}
.app-qr-codigo svg{width:180px;height:auto}

/* estado vazio: a ação vira botão, não link no meio da frase */
.vazio .acoes{justify-content:center;margin-top:14px}

/* ====== CHAT FLUTUANTE (lançador + painel) ======
   O lançador é o antigo balão: um link (funciona sem JS) que o chat.js transforma no botão que abre o painel.
   Respeita a área segura do iPhone instalado; o body ganha espaço embaixo (.tem-balao) para o rodapé não ficar atrás. */
.balao{position:fixed;right:calc(16px + env(safe-area-inset-right));bottom:calc(16px + env(safe-area-inset-bottom));z-index:60;width:56px;height:56px;border-radius:50%;display:grid;place-items:center;background:linear-gradient(135deg,var(--g1),var(--g2));color:var(--on-grad);box-shadow:var(--shadow);text-decoration:none}
.balao svg{width:28px;height:28px;display:block}
.balao .ico-fechar{display:none}
.balao.aberto .ico-chat{display:none}
.balao.aberto .ico-fechar{display:block}
.balao.aberto .selo{display:none}
.balao:focus-visible{outline:3px solid var(--teal);outline-offset:3px}
.balao .selo{top:-4px;right:-4px;box-shadow:0 0 0 2px var(--ground)}
.tem-balao{padding-bottom:calc(88px + env(safe-area-inset-bottom))}
/* pulsação discreta enquanto há mensagem não lida; destaque curto quando chega uma nova com o painel fechado.
   Só para quem não pediu menos movimento. */
@media (prefers-reduced-motion:no-preference){
  .balao.pulsa{animation:balao-pulso 2.6s ease-out infinite}
  .balao.destaque{animation:balao-destaque .6s ease-in-out 3}
  @keyframes balao-pulso{0%{box-shadow:var(--shadow),0 0 0 0 rgba(112,197,222,.55)}70%,100%{box-shadow:var(--shadow),0 0 0 14px rgba(112,197,222,0)}}
  @keyframes balao-destaque{0%,100%{transform:scale(1)}50%{transform:scale(1.18)}}
  .chat-painel{animation:chat-entrar .18s ease-out}
  @keyframes chat-entrar{from{opacity:0;transform:translateY(10px) scale(.985)}}
}

.chat-painel{position:fixed;right:calc(16px + env(safe-area-inset-right));bottom:calc(84px + env(safe-area-inset-bottom));z-index:61;width:380px;height:640px;max-height:calc(100vh - 120px);display:flex;flex-direction:column;background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:var(--r-painel);box-shadow:var(--shadow);overflow:hidden}
.chat-painel:focus{outline:none}
.chat-painel.sem-anim{animation:none}
.chat-painel button{font:inherit}
.chat-vista{flex:1;min-height:0;display:flex;flex-direction:column}
.chat-painel[data-vista="conversa"] .chat-abas{display:none}

/* cabeçalho: o degradê do logotipo com o véu (ver --veu-topo); texto e logotipo brancos */
.chat-topo{flex:none;color:#fff;background:linear-gradient(var(--veu-topo),var(--veu-topo)),linear-gradient(135deg,var(--g1),var(--g2))}
.chat-topo h2,.chat-topo p{color:#fff}
.chat-topo-grande{padding:14px 12px 44px 20px}
.chat-topo-linha{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:16px}
.chat-logo{height:28px;width:auto;display:block}
.chat-saudacao{font-size:1.75rem;line-height:1.1}
.chat-sub{font-size:1.05rem;font-weight:500;margin-top:4px}
.chat-topo-compacto{display:flex;align-items:center;gap:4px;min-height:64px;padding:8px 8px 8px 20px}
.chat-topo-compacto .chat-voltar{margin-left:-14px}
.chat-titulos{flex:1;min-width:0}
.chat-titulo{font-size:1.15rem;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-com{font-size:.82rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-fechar,.chat-voltar{flex:none;width:44px;height:44px;border:0;border-radius:50%;background:transparent;color:#fff;display:grid;place-items:center;padding:0}
.chat-fechar:hover,.chat-voltar:hover{background:rgba(255,255,255,.2)}
.chat-fechar:focus-visible,.chat-voltar:focus-visible{outline:2px solid #fff;outline-offset:-2px}
.chat-fechar svg,.chat-voltar svg{width:24px;height:24px}

/* corpo das abas; na tela inicial ele sobe sobre o cabeçalho, com o canto arredondado */
.chat-corpo{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:14px 14px 18px;background:var(--ground)}
.chat-vista[data-vista="inicio"] .chat-corpo{margin-top:-24px;border-radius:var(--r-painel) var(--r-painel) 0 0;position:relative;padding-top:18px}
.chat-cartao{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;min-height:64px;text-align:left;padding:14px 16px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow-sm);color:var(--ink)}
.chat-cartao:hover{border-color:var(--teal)}
.chat-cartao-texto{display:grid;gap:2px}
.chat-cartao-texto b{font-family:Oblik,AmpleSoft,sans-serif;font-size:1rem;color:var(--titulo)}
.chat-cartao-texto small{font-size:.84rem;color:var(--muted)}
.chat-cartao svg{width:22px;height:22px;flex:none;color:var(--teal)}
.chat-secao{margin:18px 4px 8px;font-family:Sansation,AmpleSoft,sans-serif;font-size:.72rem;letter-spacing:.09em;text-transform:uppercase;font-weight:700;color:var(--muted)}
.chat-lista{display:grid;gap:8px}
.chat-vazio{margin:6px 4px;font-size:.88rem;color:var(--muted)}
.chat-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:2px 10px;width:100%;min-height:64px;text-align:left;padding:12px 14px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);color:var(--ink)}
.chat-item:hover{border-color:var(--teal)}
.chat-item.nova{border-left:4px solid var(--teal)}
.chat-item-titulo{font-family:Oblik,AmpleSoft,sans-serif;font-size:.95rem;color:var(--titulo);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-item-com{grid-column:1;font-size:.78rem;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-item-lado{grid-column:2;grid-row:1/3;display:grid;justify-items:end;align-content:start;gap:6px;font-size:.74rem;color:var(--muted)}
.chat-item-previa{grid-column:1/-1;font-size:.84rem;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-item-previa.nova{color:var(--ink);font-weight:700}
.chat-n{display:inline-block;min-width:20px;padding:1px 7px;border-radius:999px;background:var(--red);color:var(--surface);font-weight:800;font-size:.74rem;line-height:1.4;text-align:center}
.chat-ajuda{list-style:none;margin:0;padding:0;display:grid;gap:8px}
.chat-ajuda a{display:flex;align-items:center;min-height:52px;padding:10px 14px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);color:var(--ink);font-weight:700;text-decoration:none}
.chat-ajuda a:hover{border-color:var(--teal);color:var(--teal-ink)}
.chat-ajuda-fim{margin:18px 4px 8px;color:var(--muted);font-size:.88rem}
.chat-ajuda-falar{width:100%}

/* a conversa */
.chat-faixa{flex:none;padding:8px 14px;font-size:.8rem;font-weight:700}
.chat-faixa-contato{background:var(--amber-soft);color:var(--amber-ink)}
.chat-faixa-chamado{background:var(--teal-soft);color:var(--teal-ink)}
.chat-msgs{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;display:flex;flex-direction:column;gap:10px;padding:14px 12px;background:var(--ground)}
.chat-msgs:focus-visible{outline:2px solid var(--g1);outline-offset:-2px}
.chat-m{max-width:86%;align-self:flex-start;display:grid;gap:2px}
.chat-m-quem{font-size:.74rem;font-weight:800;color:var(--titulo);padding:0 4px}
.chat-m-bolha{margin:0;background:var(--surface);border:1px solid var(--line);border-radius:16px 16px 16px 4px;padding:8px 12px;white-space:pre-wrap;overflow-wrap:anywhere}
.chat-m-quando{font-size:.7rem;color:var(--muted);padding:0 4px}
.chat-m-marca{margin:0;font-size:.72rem;color:var(--muted);font-style:italic;padding:0 4px}
.chat-m-dive_center .chat-m-quem{color:var(--teal-ink)}
.chat-m-godive .chat-m-quem{color:var(--amber-ink)}
.chat-m-godive .chat-m-bolha{background:var(--amber-soft);border-color:transparent}
.chat-m-eu{align-self:flex-end;text-align:right}
.chat-m-eu .chat-m-bolha{background:var(--teal-soft);border-color:transparent;border-radius:16px 16px 4px 16px;text-align:left}
.chat-m-sistema{align-self:center;max-width:100%;text-align:center}
.chat-m-sistema .chat-m-bolha{background:none;border:0;padding:2px 6px;color:var(--muted);font-weight:700;font-size:.82rem}
.chat-vazia{margin:auto;text-align:center;color:var(--muted);font-size:.9rem;padding:0 16px}
.chat-avisos,.chat-chamar{flex:none;padding:4px 14px;background:var(--surface);border-top:1px solid var(--line)}
.chat-avisos .link,.chat-chamar .link{padding:0}
.chat-chamar-linha{display:flex;gap:8px;align-items:center;padding-bottom:6px}
.chat-chamar-linha input{flex:1;min-width:0;font-size:16px}
.chat-compor{flex:none;padding:10px 10px calc(10px + env(safe-area-inset-bottom));background:var(--surface);border-top:1px solid var(--line)}

/* barra de digitação (widget e páginas de conversa; markup em templates/_barra.html, comportamento em static/barra.js):
   uma caixa de borda arredondada, o texto em cima, o clipe à esquerda e o enviar redondo à direita. Com foco em qualquer
   parte de dentro, a borda da caixa toda vira --teal (o anel do campo), nos dois temas. */
.barra{display:grid;gap:6px;width:100%;margin:0}
.barra-caixa{position:relative;display:flex;flex-direction:column;gap:2px;background:var(--surface);border:1.5px solid var(--line-strong);border-radius:20px;padding:8px 8px 6px 14px;transition:border-color .12s,box-shadow .12s}
.barra-caixa:focus-within{border-color:var(--teal);box-shadow:0 0 0 1px var(--teal)}
.barra-caixa textarea{display:block;width:100%;min-height:28px;max-height:120px;resize:none;overflow-y:hidden;border:0;border-radius:0;background:transparent;color:var(--ink);padding:6px 6px 6px 0;font-size:16px;line-height:1.4;outline:none}
.barra-caixa textarea::placeholder{color:var(--muted);opacity:1}
.barra-base{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-left:-10px}
.barra-clipe,.barra-chip-x,.barra-mic{flex:none;width:44px;height:44px;border:0;border-radius:50%;background:transparent;color:var(--muted);display:grid;place-items:center;padding:0}
.barra-clipe:hover,.barra-chip-x:hover,.barra-mic:hover{background:var(--teal-soft);color:var(--teal-ink)}
.barra-clipe svg,.barra-mic svg{width:22px;height:22px}
.barra-clipe[aria-disabled="true"],.barra-mic[aria-disabled="true"]{opacity:.5;cursor:not-allowed}
.barra-clipe[aria-disabled="true"]:hover,.barra-mic[aria-disabled="true"]:hover{background:transparent;color:var(--muted)}
.barra-ferramentas{display:flex;align-items:center;gap:2px}
.barra-mic[hidden]{display:none}
/* mensagem de áudio: enquanto grava, a faixa (cancelar, ponto, tempo, enviar) ocupa o lugar do texto e dos botões */
.barra-gravacao{display:flex;align-items:center;gap:10px;margin-left:-10px;min-height:48px}
.barra-gravacao[hidden]{display:none}
.barra.gravando .barra-caixa>:not(.barra-gravacao){display:none}
.barra-grav-cancelar,.barra-grav-enviar{flex:none;width:44px;height:44px;border:0;border-radius:50%;display:grid;place-items:center;padding:0}
.barra-grav-cancelar{background:transparent;color:var(--muted)}
.barra-grav-cancelar:hover{background:var(--red-soft);color:var(--red)}
.barra-grav-cancelar svg{width:22px;height:22px}
.barra-grav-enviar{background:linear-gradient(135deg,var(--g1),var(--g2));color:var(--on-grad)}
.barra-grav-enviar svg{width:20px;height:20px}
.barra-grav-ponto{flex:none;width:12px;height:12px;border-radius:50%;background:var(--red)}
.barra-grav-tempo{flex:1;font-variant-numeric:tabular-nums;font-weight:700;color:var(--titulo)}
@media (prefers-reduced-motion:no-preference){
  .barra-grav-ponto{animation:grav-pulso 1.2s ease-in-out infinite}
  @keyframes grav-pulso{50%{opacity:.25}}
}
.barra-enviar{flex:none;width:44px;height:44px;border:0;border-radius:50%;display:grid;place-items:center;padding:0;background:linear-gradient(135deg,var(--g1),var(--g2));color:var(--on-grad)}
.barra-enviar svg{width:20px;height:20px}
.barra-enviar:disabled{background:var(--surface-2);color:var(--faint);cursor:not-allowed}
.barra-chip{display:flex;align-items:center;gap:10px;padding:2px 0 4px}
.barra-chip[hidden],.barra-aviso[hidden]{display:none}
.barra-chip-mini{flex:none;width:48px;height:48px;border-radius:10px;overflow:hidden;background:var(--teal-soft);color:var(--teal-ink);display:grid;place-items:center}
.barra-chip-mini img{width:100%;height:100%;object-fit:cover;display:block}
.barra-chip-texto{flex:1;min-width:0;display:grid}
.barra-chip-nome{font-weight:700;font-size:.88rem;color:var(--titulo);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.barra-chip-tam{font-size:.76rem;color:var(--muted)}
.barra-chip-x svg{width:20px;height:20px}
.barra-aviso,.barra-estado{margin:0;padding:0 6px;font-size:.82rem;font-weight:700}
.barra-aviso{color:var(--amber-ink)}
.barra-estado{color:var(--muted)}
.barra-estado:empty{display:none}
.barra-estado.erro{color:var(--red)}
/* com JavaScript o campo de arquivo some (o clipe o abre); sem JavaScript ele aparece como campo comum */
.barra.js .barra-arquivo{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden;clip:rect(0 0 0 0);pointer-events:none}
.barra:not(.js) .barra-clipe{display:none}
.barra:not(.js) .barra-arquivo{flex:1;min-width:0;max-width:100%;font-size:.85rem}
.barra:not(.js).sem-anexo .barra-clipe{display:grid}
.barra:not(.js).sem-anexo .barra-arquivo{display:none}

/* o anexo dentro da mensagem: a foto é miniatura clicável, o PDF é um cartão */
.anexo-foto{display:block;width:fit-content;max-width:100%;min-width:44px;min-height:44px;margin-top:4px}
.anexo-foto img{display:block;max-width:min(220px,100%);height:auto;border-radius:12px;border:1px solid var(--line);background:var(--surface-2)}
.anexo-pdf{display:flex;align-items:center;gap:10px;min-height:var(--alvo);max-width:260px;margin-top:4px;padding:8px 12px;border:1px solid var(--line);border-radius:12px;background:var(--surface);color:var(--ink);text-decoration:none}
.anexo-pdf:hover{border-color:var(--teal)}
.anexo-pdf .anexo-icone{flex:none;width:28px;height:28px;color:var(--teal)}
.barra-chip-mini .anexo-icone{width:26px;height:26px}
.anexo-pdf-texto{flex:1;min-width:0;display:grid;text-align:left}
.anexo-pdf-nome{font-weight:700;font-size:.86rem;color:var(--titulo);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.anexo-pdf-info{font-size:.74rem;color:var(--muted)}
.anexo-pdf-baixar{flex:none;font-size:.8rem;font-weight:800;color:var(--teal)}
.chat-m-eu .anexo-foto,.chat-m-eu .anexo-pdf,.chat-m-eu .anexo-audio{justify-self:end}
/* o tocador de áudio: o do próprio navegador, com a duração ao lado (o tempo só aparece nele depois do primeiro play) */
.anexo-audio{display:flex;align-items:center;gap:8px;max-width:100%;margin-top:4px}
.anexo-audio audio{width:220px;max-width:100%;height:44px;min-width:0}
.anexo-audio-tempo{flex:none;font-size:.74rem;color:var(--muted);font-variant-numeric:tabular-nums}
.arq-audio{display:block;width:100%;max-width:260px;height:44px;margin-top:6px}
.msg-eu .anexo-audio{justify-self:end}
.chat-liberar{flex:none;padding:0 14px;background:var(--surface);border-top:1px solid var(--line)}
.chat-liberar .link{padding:0}

/* abas de baixo */
.chat-abas{flex:none;display:grid;grid-template-columns:repeat(3,1fr);background:var(--surface);border-top:1px solid var(--line);padding-bottom:env(safe-area-inset-bottom)}
.chat-aba{position:relative;min-height:56px;display:grid;justify-items:center;align-content:center;gap:2px;border:0;background:none;color:var(--muted);font-size:.74rem;font-weight:700;padding:6px 4px}
.chat-aba svg{width:22px;height:22px}
.chat-aba[aria-current="true"]{color:var(--teal-ink)}
.chat-aba:focus-visible,.chat-item:focus-visible,.chat-cartao:focus-visible,.chat-ajuda a:focus-visible{outline:2px solid var(--g1);outline-offset:-2px}
.chat-aba .chat-n{position:absolute;top:4px;left:calc(50% + 6px);min-width:18px;font-size:.66rem;padding:0 5px}

/* celular: o painel ocupa a tela inteira (com a área segura do iPhone), o fechar é grande e a página atrás não rola.
   A altura vem do chat.js (visualViewport) quando o teclado abre, para o campo de texto ficar sempre à vista. */
@media (max-width:600px){
  .chat-painel{inset:0;width:auto;height:100vh;height:100dvh;max-height:none;border:0;border-radius:0;padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right)}
  .chat-topo-grande{padding-top:calc(14px + env(safe-area-inset-top))}
  .chat-topo-compacto{padding-top:calc(8px + env(safe-area-inset-top))}
  .chat-fechar,.chat-voltar{width:48px;height:48px}
  .chat-fechar svg,.chat-voltar svg{width:28px;height:28px}
  .chat-vista[data-vista="inicio"] .chat-corpo{border-radius:var(--r-painel) var(--r-painel) 0 0}
  html.chat-aberto,html.chat-aberto body{overflow:hidden}
}

/* ---- organização dos anexos (godive/arquivos.py, static/arquivos.js) ---------------------------------------------
   Menu "⋯" de cada anexo, selos, aba "Arquivos" (galeria), diálogo da carteirinha e os quadros do ticket e do manifesto.
   Só tokens do sistema (--surface, --line, --teal...): valem nos dois temas. Todo alvo de toque tem 44 px (--alvo). */
.anexo-bloco{display:grid;justify-items:start;gap:0;max-width:100%}
.chat-m-eu .anexo-bloco,.msg-eu .anexo-bloco{justify-items:end}
.anexo-acoes{display:flex;flex-wrap:wrap;align-items:center;gap:2px 6px;max-width:100%}
.chat-m-eu .anexo-acoes,.msg-eu .anexo-acoes{justify-content:flex-end}
.anexo-selo{font-size:.7rem;font-weight:800;line-height:1.5;border-radius:999px;padding:1px 9px;background:var(--teal-soft);color:var(--teal-ink);white-space:nowrap}
.anexo-selo-fixado{background:var(--amber-soft);color:var(--amber-ink)}
.anexo-menu-btn{flex:none;width:var(--alvo);height:var(--alvo);display:inline-grid;place-items:center;border:0;border-radius:50%;background:none;color:var(--muted);padding:0;cursor:pointer}
.anexo-menu-btn:hover,.anexo-menu-btn[aria-expanded="true"]{background:var(--surface-2);color:var(--ink)}
.anexo-menu-btn:focus-visible{outline:2px solid var(--teal);outline-offset:-2px}
.anexo-menu-btn:disabled{opacity:.5;cursor:progress}
.anexo-menu-icone{width:22px;height:22px;display:block}
/* o menu abre em posição fixa (arquivos.js o calcula): nenhum recorte nem rolagem do chat o esconde, e no celular ele
   nunca passa da borda da tela */
.anexo-menu{position:fixed;z-index:1300;min-width:232px;max-width:calc(100vw - 16px);padding:6px;display:grid;gap:2px;background:var(--surface);color:var(--ink);border:1px solid var(--line-strong);border-radius:12px;box-shadow:var(--shadow)}
.anexo-menu[hidden]{display:none}
.anexo-menu-item{display:flex;align-items:center;width:100%;min-height:var(--alvo);padding:0 14px;border:0;border-radius:8px;background:none;color:var(--ink);font:inherit;font-weight:700;font-size:.92rem;text-align:left;text-decoration:none;cursor:pointer}
.anexo-menu-item:hover{background:var(--teal-soft);color:var(--teal-ink)}
.anexo-menu-item:focus-visible{outline:none;background:var(--teal-soft);color:var(--teal-ink);box-shadow:inset 0 0 0 2px var(--teal)}
/* sem JavaScript: os selos e um <details> com as ações em formulários (o JavaScript troca tudo pelo menu acima) */
.anexo-sem-js summary{list-style:none;cursor:pointer;min-width:var(--alvo);min-height:var(--alvo);display:inline-grid;place-items:center;border-radius:50%;font-weight:800;font-size:1.3rem;color:var(--muted)}
.anexo-sem-js summary::-webkit-details-marker{display:none}
.anexo-sem-js-corpo{display:grid;gap:2px;padding:6px;border:1px solid var(--line);border-radius:12px;background:var(--surface)}
.anexo-sem-js-corpo form{margin:0}
.anexo-sem-js-corpo a,.anexo-sem-js-corpo button{display:flex;align-items:center;width:100%;min-height:var(--alvo);padding:0 12px;border:0;background:none;font:inherit;font-weight:700;color:var(--teal);text-decoration:none;text-align:left}
.anexo-apagado{margin:4px 0 0;padding:8px 12px;max-width:260px;border:1px dashed var(--line-strong);border-radius:12px;color:var(--muted);font-size:.84rem;font-weight:600;text-align:left}

/* aba "Arquivos": fotos, PDFs e material da saída */
.painel-arquivos{padding:12px}
.arq-secao+.arq-secao,.arq-titulo{margin-top:14px}
.arq-secao:first-child .arq-titulo{margin-top:0}
.arq-titulo{font-size:.92rem;margin-bottom:8px;color:var(--titulo)}
.arq-lista{list-style:none;margin:0;padding:0;display:grid;gap:10px}
.arq-fotos{grid-template-columns:repeat(auto-fill,minmax(150px,1fr))}
.arq-cartao{display:flex;gap:10px;align-items:flex-start;min-width:0;padding:8px;border:1px solid var(--line);border-radius:12px;background:var(--surface)}
.arq-fotos .arq-cartao{flex-direction:column}
.arq-mini{flex:none;width:64px;height:64px;display:grid;place-items:center;overflow:hidden;border-radius:10px;border:1px solid var(--line);background:var(--surface-2)}
.arq-mini img{width:100%;height:100%;object-fit:cover;display:block}
.arq-mini-doc{background:var(--teal-soft);color:var(--teal)}
.arq-mini .anexo-icone{width:30px;height:30px}
.arq-fotos .arq-mini{width:100%;height:auto;aspect-ratio:4/3}
.arq-info{flex:1;min-width:0;width:100%;display:grid;gap:2px}
.arq-nome{font-size:.86rem;color:var(--titulo);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.arq-meta{font-size:.74rem;color:var(--muted)}
.arq-vazio{margin:6px 0;color:var(--muted);text-align:center}
.arq-erro{color:var(--red);font-weight:700;font-size:.9rem}
/* abas da página da conversa (Conversa | Arquivos) */
.abas-conv{display:flex;gap:4px;margin:12px 0;border-bottom:1px solid var(--line)}
.aba-conv{display:inline-flex;align-items:center;min-height:var(--alvo);padding:0 16px;margin-bottom:-1px;border-bottom:3px solid transparent;font-weight:800;color:var(--muted);text-decoration:none}
.aba-conv[aria-selected="true"]{color:var(--teal-ink);border-bottom-color:var(--teal)}
.aba-conv:focus-visible{outline:2px solid var(--teal);outline-offset:-2px}
/* abas dentro da conversa do chat flutuante: no modo "Arquivos" a lista de mensagens e a barra de digitação saem */
.chat-subabas{flex:none;display:flex;background:var(--surface);border-bottom:1px solid var(--line)}
.chat-subabas[hidden]{display:none}
.chat-subaba{flex:1;min-height:var(--alvo);border:0;border-bottom:3px solid transparent;background:none;color:var(--muted);font-weight:800;font-size:.9rem}
.chat-subaba[aria-selected="true"]{color:var(--teal-ink);border-bottom-color:var(--teal)}
.chat-subaba:focus-visible{outline:2px solid var(--teal);outline-offset:-2px}
.chat-arquivos{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:12px;background:var(--ground)}
.chat-arquivos[hidden]{display:none}
.chat-vista[data-sub="arquivos"] .chat-msgs,.chat-vista[data-sub="arquivos"] .chat-faixa,.chat-vista[data-sub="arquivos"] .chat-avisos,
.chat-vista[data-sub="arquivos"] .chat-chamar,.chat-vista[data-sub="arquivos"] .chat-liberar,.chat-vista[data-sub="arquivos"] .chat-sugerir,.chat-vista[data-sub="arquivos"] .chat-compor{display:none}
/* diálogo "Usar como foto da carteirinha" */
.arq-fundo{position:fixed;inset:0;z-index:1400;display:grid;place-items:center;padding:16px;background:rgba(0,20,25,.55)}
.arq-dialogo{width:min(440px,100%);max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px);overflow:auto;padding:18px;background:var(--surface);color:var(--ink);border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--shadow)}
.arq-dialogo:focus{outline:none}
.arq-dialogo-titulo{font-size:1.1rem;margin:0 0 10px}
.arq-dialogo-foto{display:block;max-width:100%;max-height:180px;margin:0 0 10px;border-radius:12px;border:1px solid var(--line)}
.arq-escolha-lista,.arq-escolha fieldset{border:0;margin:0;padding:0;display:grid;gap:6px;min-width:0}
.arq-escolha legend{font-weight:800;color:var(--titulo);padding:0;margin-bottom:6px}
.arq-opcao{display:flex;align-items:center;gap:10px;min-height:var(--alvo);padding:6px 10px;border:1.5px solid var(--line);border-radius:10px;cursor:pointer}
.arq-opcao:has(input:checked){border-color:var(--teal);background:var(--teal-soft)}
.arq-opcao input{flex:none;width:20px;height:20px;accent-color:var(--teal)}
.arq-opcao-texto{display:grid;min-width:0;overflow-wrap:anywhere}
.arq-dialogo-botoes{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px}
.arq-aviso{position:fixed;left:50%;bottom:calc(24px + env(safe-area-inset-bottom));transform:translateX(-50%);z-index:1500;width:max-content;max-width:min(420px,calc(100vw - 32px));padding:10px 16px;border:1px solid var(--teal);border-radius:12px;background:var(--teal-soft);color:var(--teal-ink);font-weight:700;font-size:.9rem;box-shadow:var(--shadow)}
.arq-aviso[hidden]{display:none}
.arq-aviso.erro{border-color:var(--red);background:var(--red-soft);color:var(--red)}
/* ticket e manifesto: "Arquivos da reserva", "Material da saída" e o clipe com a contagem */
.quadro-arquivos{margin-top:14px}
.quadro-arquivos h3{margin-bottom:4px}
.quadro-arquivos .arq-lista{margin-top:10px}
.arq-botoes{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px}
.arq-botoes form{margin:0}
.arq-clipe summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:4px;min-width:var(--alvo);min-height:var(--alvo);padding:0 8px;border-radius:999px;color:var(--teal);font-weight:800}
.arq-clipe summary::-webkit-details-marker{display:none}
.arq-clipe summary:focus-visible{outline:2px solid var(--teal);outline-offset:-2px}
.arq-clipe svg{width:20px;height:20px;flex:none}
.arq-clipe-lista{list-style:none;margin:4px 0 0;padding:6px;display:grid;gap:2px;min-width:170px;border:1px solid var(--line);border-radius:10px;background:var(--surface)}
.arq-clipe-lista a{display:flex;align-items:center;min-height:var(--alvo);padding:0 6px;overflow-wrap:anywhere}

/* ---- visualizador de anexos (static/visor.js) -------------------------------------------------------------------
   Tela cheia ESCURA nos dois temas (a foto é vista melhor sobre fundo escuro): as cores vêm dos tokens --visor-* do
   :root, que são os mesmos nos dois temas de propósito (texto claro sobre quase preto passa de 12:1). Alvos de 44 px ou mais; foco visível em verde-água. z-index acima do
   chat (61), do menu de ações (1300), do diálogo (1400) e do aviso (1500). */
html.visor-aberto,html.visor-aberto body{overflow:hidden}
a[data-visor] img{cursor:zoom-in}
.visor{position:fixed;inset:0;z-index:2000;display:flex;flex-direction:column;background:var(--visor-fundo);color:var(--visor-texto)}
.visor[hidden]{display:none}
@media (prefers-reduced-motion:no-preference){
  .visor:not([hidden]){animation:visor-entrar .16s ease-out}
  @keyframes visor-entrar{from{opacity:0}to{opacity:1}}
}
.visor-topo{flex:none;display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:8px 12px;
  padding:calc(8px + env(safe-area-inset-top)) calc(12px + env(safe-area-inset-right)) 8px calc(12px + env(safe-area-inset-left));
  border-bottom:1px solid rgba(255,255,255,.16)}
.visor-info{min-width:0;display:grid;gap:1px}
.visor-nome{font-size:1rem;font-weight:800;color:var(--visor-branco);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.visor-meta{font-size:.84rem;color:var(--visor-suave)}
.visor-meta:empty{display:none}
.visor-acoes{display:flex;align-items:center;gap:8px}
.visor-zoom{display:inline-flex;gap:6px}
.visor-zoom[hidden]{display:none}
.visor-btn{flex:none;min-width:var(--alvo);min-height:var(--alvo);display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 12px;
  border:1.5px solid rgba(255,255,255,.45);border-radius:999px;background:rgba(255,255,255,.1);color:var(--visor-branco);font:inherit;font-weight:800;font-size:.92rem;
  text-decoration:none;cursor:pointer;line-height:1}
.visor-btn:hover{background:rgba(255,255,255,.22)}
.visor-btn:focus-visible{outline:3px solid var(--visor-foco);outline-offset:2px}
.visor-btn[aria-disabled="true"]{opacity:.45;cursor:default}
.visor-btn[aria-disabled="true"]:hover{background:rgba(255,255,255,.1)}
.visor-icone{width:22px;height:22px;flex:none;display:block}
/* Baixar em destaque (no PDF do celular é a ação principal): cor do degradê do logotipo com o texto escuro dele */
.visor-baixar{background:var(--g2);border-color:transparent;color:var(--on-grad)}
.visor-baixar:hover{background:var(--visor-baixar-hover)}
.visor-aviso{display:none;flex:none;margin:0;padding:10px 16px;background:var(--visor-aviso-fundo);color:var(--visor-aviso-texto);font-weight:700;font-size:.92rem;text-align:center}
.visor-palco{position:relative;flex:1;min-height:0}
/* touch-action: pinch-zoom deixa a pinça do sistema funcionar e libera os gestos de um dedo para o JavaScript (deslizar,
   duplo toque); ampliada, o dedo volta a rolar a foto */
.visor-rolagem{position:absolute;inset:0;display:flex;overflow:auto;overscroll-behavior:contain;touch-action:pinch-zoom;-webkit-overflow-scrolling:touch}
.visor-rolagem.visor-ampliada{touch-action:pan-x pan-y pinch-zoom}
.visor-rolagem:focus-visible{outline:3px solid var(--visor-foco);outline-offset:-3px}
.visor-img{flex:none;display:block;margin:auto;max-width:none;opacity:0;cursor:zoom-in;user-select:none;-webkit-user-select:none;-webkit-user-drag:none}
.visor-img.pronta{opacity:1}
.visor-ampliada .visor-img{cursor:grab}
.visor-arrastando .visor-img{cursor:grabbing}
.visor-pdf{flex:1;width:100%;height:100%;border:0;background:var(--visor-branco)}
.visor-eh-pdf .visor-rolagem{overflow:hidden}
.visor-carregando{position:absolute;inset:0;display:grid;place-items:center;margin:0;padding:0 24px;text-align:center;color:var(--visor-suave);pointer-events:none}
.visor-carregando[hidden]{display:none}
.visor-seta{position:absolute;top:50%;transform:translateY(-50%);width:48px;height:48px;padding:0;border-radius:50%;background:var(--visor-veu)}
.visor-seta[hidden]{display:none}
.visor-ant{left:calc(12px + env(safe-area-inset-left))}
.visor-prox{right:calc(12px + env(safe-area-inset-right))}
.visor-estado{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
/* celular: nome e Fechar na primeira linha, as ações na segunda; o zoom vira só ícone */
@media (max-width:600px){
  .visor-topo{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"info fechar" "acoes acoes"}
  .visor-info{grid-area:info}
  .visor-fechar{grid-area:fechar}
  .visor-acoes{grid-area:acoes;flex-wrap:wrap}
  .visor-zoom .visor-btn-texto{display:none}
  .visor-eh-pdf .visor-aviso{display:block}
  .visor-eh-pdf .visor-baixar{flex:1;min-height:52px;font-size:1rem}
  .visor-seta{width:44px;height:44px}
  .visor-ant{left:calc(6px + env(safe-area-inset-left))}
  .visor-prox{right:calc(6px + env(safe-area-inset-right))}
}
/* miniaturas maiores no ticket e no painel do dive center, e as do clipe do manifesto (foto, não só o nome) */
.quadro-arquivos .arq-mini{width:88px;height:88px}
.arq-clipe-lista .arq-mini{width:72px;height:72px}
.arq-clipe-lista a.arq-clipe-item{gap:10px;padding:4px 6px}
.arq-clipe-nome{min-width:0;overflow-wrap:anywhere;font-size:.84rem;font-weight:700}
@media (max-width:400px){.quadro-arquivos .arq-mini{width:72px;height:72px}}

/* painel do dive center: campos de texto por idioma (templates/painel/_traducoes.html). Um <details> por idioma, sem JavaScript. */
.trad-bloco{grid-column:1/-1;display:grid;gap:8px}
.trad{border:1px solid var(--line-strong);border-radius:var(--r-sm);background:var(--surface-2)}
.trad summary{cursor:pointer;font-weight:700;color:var(--teal);padding:0 14px;min-height:var(--alvo);display:flex;align-items:center}  /* 44 px de alvo */
.trad summary:focus-visible{outline:2px solid var(--teal);outline-offset:-2px;border-radius:var(--r-sm)}
.trad-corpo{display:grid;gap:12px;padding:2px 14px 14px}
/* tradução desatualizada (Traduzivel.desatualizados): selo âmbar com "!", campo com borda âmbar, caixa de confirmação */
.trad summary .trad-selo{margin-left:10px}
.trad-rotulo{display:flex;align-items:center;flex-wrap:wrap;gap:4px 10px}
.trad-selo{font-size:.7rem;padding:2px 8px}
.trad-velha{border-color:var(--amber)}
.trad-confirma{background:var(--amber-soft);color:var(--amber-ink);border-radius:var(--r-sm);padding:10px 14px 2px}
.trad-resumo{display:flex;align-items:center;gap:8px;margin:0 0 10px}
/* selo "EN" / "ES" ao lado do título, na lista de saídas */
.selo-idioma{margin-left:6px;font-size:.68rem;padding:2px 8px;vertical-align:middle}

/* Tradução automática do chat (godive/traducao.py; markup em reservas/_mensagem.html e static/barra.js::noTexto).
   O texto traduzido vem em cima; embaixo "Traduzido do espanhol · Ver original" é o resumo de um <details> nativo (alvo de
   toque de 44 px). Aberto, mostra o original no lugar da tradução e o rótulo vira "Ver tradução". */
.msg-trad{display:grid;gap:0}
.msg-trad .msg-traduzida,.msg-trad .msg-original{margin:0}
.msg-orig{margin:0}
.msg-orig-resumo{list-style:none;cursor:pointer;display:flex;flex-wrap:wrap;align-items:center;gap:0 10px;min-height:var(--alvo);font-size:.74rem;color:var(--muted);font-weight:700}
.msg-orig-resumo::-webkit-details-marker{display:none}
.msg-orig-resumo:focus-visible{outline:2px solid var(--g1);outline-offset:2px;border-radius:6px}
.msg-ver{color:var(--teal);font-weight:800;text-decoration:underline}
.msg-orig[open] .ver-orig,.msg-orig:not([open]) .ver-trad{display:none}
.msg-trad:has(.msg-orig[open]) .msg-traduzida{display:none}
.msg-aviso{margin:0;font-size:.72rem;color:var(--muted);font-style:italic;padding:0 4px}
.msg-aviso-falha{color:var(--amber-ink);font-style:normal;font-weight:700}
.chat-m-eu .msg-aviso{text-align:right}
.chat-sugerir,.sugerir{flex:none;display:grid;gap:4px;justify-items:start;padding:6px 14px;background:var(--surface);border-top:1px solid var(--line)}
.sugerir{margin-top:16px;border:1px solid var(--line);border-radius:var(--r-sm)}
.chat-rascunho{margin:0}

/* ====== COMPLEMENTOS DO APP (antes um <style> no base.html) ======
   Movido para cá para a CSP do site não precisar de 'unsafe-inline' no style-src: este arquivo vem logo depois
   do godive.css em TODA página, na mesma posição da cascata que o <style> tinha, então nada muda na tela. */
/* Complementos do app (o grosso está em /static/godive.css, extraído do protótipo) */
html{color-scheme:light}
.faixa-teste{background:var(--amber-soft);color:var(--amber-ink);font-size:.78rem;font-weight:800;text-align:center;padding:5px 12px;letter-spacing:.02em}
.faixa-teste a{color:inherit;display:inline-flex;align-items:center;min-height:var(--alvo)}  /* alvo de toque de 44 px */
/* "Entrar como": faixa abaixo da faixa de teste enquanto o admin está dentro de uma conta de teste. Fica no fluxo da
   página (não cobre nada); o botão tem 44 px de alvo. --teal-soft/--teal-ink existem nos dois temas. */
.faixa-como{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:4px 12px;background:var(--teal-soft);color:var(--teal-ink);border-bottom:1px solid var(--line);font-size:.86rem;font-weight:700;padding:4px 12px;text-align:center}
.faixa-como form{margin:0}
.faixa-como button{min-height:var(--alvo);padding:0 14px;border:1.5px solid currentColor;border-radius:999px;background:transparent;color:inherit;font:inherit;font-weight:800;font-size:.84rem;cursor:pointer}
/* O lançador do chat flutuante (.balao) e o painel (.chat-*) estão em /static/godive.css. */
.aviso{max-width:1160px;margin:14px auto 0;padding:0 22px}
.aviso div{border-radius:var(--r-sm);padding:10px 14px;font-weight:700;font-size:.92rem}
.aviso .ok{background:var(--green-soft);color:var(--green)}
.aviso .erro{background:var(--red-soft);color:var(--red)}
.nav{display:flex;gap:4px;align-items:center;margin-left:auto;flex-wrap:wrap}
/* :not(.btn): sem isso o "Criar conta" herdava a cor cinza do link e sumia sobre o degradê */
.nav a:not(.btn){color:var(--muted);text-decoration:none;font-weight:700;font-size:.9rem;padding:7px 12px;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;min-height:var(--alvo);min-width:var(--alvo)}
.nav a:not(.btn).ativo,.nav a:not(.btn):hover{color:var(--teal-ink);background:var(--teal-soft)}
/* a aba "App" só faz sentido no navegador: dentro do app instalado ela some */
@media (display-mode: standalone){.so-navegador{display:none!important}}
.em-app .so-navegador{display:none!important}
.nav .btn{padding:8px 16px}
/* Selo de mensagens não lidas. No menu do topo ele FLUTUA sobre o canto do item (position:absolute): não ocupa
   largura, então não empurra nenhum item para outra linha em 375 px. Cor: --red com --surface por cima
   (contraste acima de 5:1 nos dois temas). */
.selo{position:absolute;top:-1px;right:-3px;min-width:18px;height:18px;padding:0 5px;border-radius:999px;background:var(--red);color:var(--surface);font-size:.68rem;font-weight:800;line-height:18px;text-align:center;letter-spacing:0;pointer-events:none}
.nav a:not(.btn),.menu-botao{position:relative}
/* Seletor de idioma (PT | EN | ES): um formulário de três botões, funciona sem JavaScript. Não quebra linha no menu do celular. */
.idioma{display:inline-flex;align-items:center;gap:0;margin:0;white-space:nowrap;flex:none}
.idioma button{min-height:var(--alvo);min-width:34px;padding:0 6px;border:0;background:none;color:var(--muted);font:inherit;font-weight:800;font-size:.82rem;letter-spacing:.02em;cursor:pointer;border-radius:999px}
.idioma button:hover{color:var(--teal-ink);background:var(--teal-soft)}
.idioma button[aria-current="true"]{color:var(--teal-ink)}
.idioma .sep{color:var(--line-strong);font-weight:400;font-size:.82rem}
.rodape .idioma button{font-size:.8rem}
.sr-so{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.selo-lista{position:static;display:inline-block;margin-left:6px;vertical-align:middle}
.rodape{max-width:1160px;margin:40px auto 0;padding:18px 22px 30px;border-top:1px solid var(--line);font-size:.8rem;color:var(--muted);display:flex;gap:16px;flex-wrap:wrap;justify-content:space-between;align-items:center}  /* center: o texto e os links (44 px de alvo) ficam na mesma linha */
/* Links do rodapé: caixa flex com centralização, para os links de 44 px de altura não abrirem buracos no meio do texto quando quebram de linha.
   O crédito do mapa é um bloco só (não quebra no meio de "dados de mapa © OpenStreetMap contributors"). */
.rodape-links{display:flex;flex-wrap:wrap;align-items:center;column-gap:.4em}
.rodape-credito{display:inline-flex;align-items:center;column-gap:.3em;white-space:nowrap}
/* Os pontos entre os links somem no celular: quando o crédito desce de linha, o "·" ficava sobrando no fim da linha de cima. */
@media (max-width:900px){.rodape-sep{display:none}.rodape-links{column-gap:16px}}
.rodape a{color:var(--muted);display:inline-flex;align-items:center;min-height:var(--alvo)}  /* alvo de toque de 44 px */
.pagina{max-width:1160px;margin:0 auto;padding:22px 22px 40px}
.pagina-estreita{max-width:640px;margin:0 auto;padding:22px 22px 40px}
.form-linha{display:grid;gap:12px}
.form-2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.acoes{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:14px}
textarea{font:inherit;color:var(--ink);background:var(--surface);border:1px solid var(--line-strong);border-radius:var(--r-sm);padding:9px 11px;width:100%;min-height:90px}
input[type=text],input[type=email],input[type=password],input[type=number],input[type=date],input[type=datetime-local],input[type=tel],input[type=url],select{width:100%}
.vazio{padding:30px;text-align:center;color:var(--muted);border:1px dashed var(--line-strong);border-radius:var(--r)}
.menu-botao{display:none}
.voltar-app{border:0;background:none;color:var(--teal);font-weight:800;font-size:.95rem;min-height:var(--alvo);padding:0 8px 0 0;flex:none}
/* celular, conta de admin: a barra de seis links quebrava em duas linhas (159px); vira um botão Menu */
@media (max-width:600px){
  .topbar-menu .menu-botao{display:inline-flex;align-items:center;gap:8px;margin-left:auto;min-height:var(--alvo);padding:0 16px;border:1.5px solid var(--line-strong);border-radius:999px;background:var(--surface);color:var(--ink);font-weight:800;font-size:.9rem}
  .topbar-menu .menu-botao svg{width:18px;height:18px;flex:none}
  .topbar-menu .menu-botao[aria-expanded="true"]{background:var(--teal-soft);border-color:transparent;color:var(--teal-ink)}
  .topbar-menu .wrap{padding-top:9px;padding-bottom:9px}
  .js .topbar-menu .nav{display:none}
  .js .topbar-menu.aberto .nav{display:flex}
  .topbar-menu .nav{flex-direction:column;align-items:stretch;gap:2px;padding:4px 0 6px;border-top:1px solid var(--line)}
  .topbar-menu .nav a:not(.btn){justify-content:flex-start;padding:10px 14px;font-size:.95rem;border-radius:var(--r-sm)}
  .topbar-menu .nav .selo{top:50%;right:12px;transform:translateY(-50%)}
  .topbar-menu .menu-botao .selo{top:-4px;right:-4px;transform:none}
}
@media (max-width:900px){.form-2{grid-template-columns:1fr}.nav a:not(.btn){padding:6px 8px;font-size:.82rem}.rodape{flex-direction:column;align-items:flex-start;gap:6px}}
/* O menu espalhado pela largura toda (space-between) só vale no celular: em 601 a 900 px ele ficava com buracos enormes entre os itens.
   No tablet ele segue como no computador: agrupado à direita, com o gap normal, e quebra de linha se não couber. */
@media (max-width:600px){.nav{width:100%;justify-content:space-between;margin-left:0}}
/* telefone estreito: os seis itens do dono de dive center (com a aba App) cabem numa linha; o alvo continua com 44px */
@media (max-width:400px){.nav{gap:0}.nav a:not(.btn){padding:6px 6px}}
/* telas de 320px: cinco links (dive center) cabem numa linha só com menos respiro */
@media (max-width:360px){.nav a:not(.btn){padding:6px 4px;font-size:.78rem}}
/* Em inglês e em espanhol os rótulos do menu são mais longos que em português ("Dashboard", "Log out", "Reservas"...): menos respiro para o menu do
   dono de dive center continuar numa linha só em telefone estreito (o alvo de toque segue com 44 px de altura e o "App" com 44 de largura). */
@media (max-width:400px){html:not([lang^="pt"]) .nav a:not(.btn){padding:6px 3px}}
@media (max-width:360px){html:not([lang^="pt"]) .nav a:not(.btn){padding:6px 2px;font-size:.74rem}}
/* No topo o seletor fica na primeira linha, ao lado do logotipo (no celular o menu ocupa a segunda): não quebra o menu. */
.idioma-topo{order:3}
@media (max-width:600px){.idioma-topo{order:1;margin-left:auto}.topbar-menu .menu-botao{order:2;margin-left:0}.nav{order:3}}
/* Com três botões o seletor tem 108 px: em 320 px, ao lado do logotipo, ele empurrava o botão "Menu" do admin para uma segunda linha.
   Em telefone estreito o seletor encolhe (30 px de largura por botão, os 44 px de altura ficam) e o espaço entre os itens do topo também. */
@media (max-width:360px){.idioma button{min-width:30px;padding:0 4px}.topbar .wrap{column-gap:6px}.topbar-menu .menu-botao{padding:0 12px}}
body.so-offline .nav{display:none}  /* tela /offline: ver offline.html */

/* ====== UTILITÁRIOS ======
   Substituem os atributos style= que havia nos templates: a CSP do site não aceita mais estilo inline
   (style-src 'self' 'nonce-...', ver godive/app.py; tests/test_csp.py barra style= nos templates).
   Ficam no FIM deste arquivo, depois de tudo, para vencer (mesmo peso, vem depois) as regras de classe que o
   atributo style= vencia. Cada classe faz UMA coisa, com o mesmo valor que o style= tinha. */
.col-todas{grid-column:1/-1}
.d-contents{display:contents}
.d-inline{display:inline}
.sem-sublinhado{text-decoration:none}
.justifica-centro{justify-content:center}
.justify-self-start{justify-self:start}
.self-centro{align-self:center}
.align-fim{align-items:end}
.texto-centro{text-align:center}
.texto-direita{text-align:right}
.flex-1{flex:1}
.f-oblik{font-family:Oblik}
.fs-090,.kv .fs-090{font-size:.9rem}  /* .kv b (peso 0,1,1) vence a classe sozinha */
.fs-100,.kpi .fs-100{font-size:1rem}  /* .kpi span (peso 0,1,1) vence a classe sozinha */
.fs-130{font-size:1.3rem}
.fs-170{font-size:1.7rem}
.m-0{margin:0}
.m-4-0-0{margin:4px 0 0}
.m-6-0-12{margin:6px 0 12px}
.m-8-0-10{margin:8px 0 10px}
.m-8-0-18{margin:8px 0 18px}
.m-12-0{margin:12px 0}
.m-14-0-8{margin:14px 0 8px}
.m-18-0{margin:18px 0}
.m-18-0-8{margin:18px 0 8px}
.m-26-0-10{margin:26px 0 10px}
.m-n8-0-14{margin:-8px 0 14px}
.mt-0{margin-top:0}
.mt-4{margin-top:4px}
.mt-6{margin-top:6px}
.mt-8{margin-top:8px}
.mt-10{margin-top:10px}
.mt-12{margin-top:12px}
.mt-14{margin-top:14px}
.mt-16{margin-top:16px}
.mt-18{margin-top:18px}
.mt-26{margin-top:26px}
.mb-6{margin-bottom:6px}
.mb-12{margin-bottom:12px}
.mb-14{margin-bottom:14px}
.mb-16{margin-bottom:16px}
.mb-18{margin-bottom:18px}
.mb-20{margin-bottom:20px}
.ml-auto{margin-left:auto}
.pad-0{padding:0}
.pad-30-0{padding:30px 0}
.pad-t-60{padding-top:60px}
.pad-b-40{padding-bottom:40px}
.pad-b-50{padding-bottom:50px}
.gap-6{gap:6px}
.mw-60ch{max-width:60ch}
.mw-70ch{max-width:70ch}
.mw-360{max-width:360px}
.larg-100{width:100%}
.h-40{height:40px}
.h-190{height:190px}
.overflow-hidden{overflow:hidden}
.overflow-x-auto{overflow-x:auto}
.borda-topo{border-top:1px solid var(--line)}
.bg-amber{background:var(--amber)}
.cor-sobre-foto{color:var(--sobre-foto)}
.cor-sobre-claro{color:var(--sobre-claro)}
.flex-gap-8{display:flex;gap:8px}
.flex-centro-10{display:flex;align-items:center;gap:10px}
.col-gap-2{display:flex;flex-direction:column;gap:2px}
/* selo branco da faixa da página inicial */
.selo-hero{height:22px;width:auto;opacity:.9}
/* cabeçalho de "Minhas reservas" (título + atalho) e o cartão de cada reserva */
.cabeca-reservas{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap}
.reserva-cod{display:grid;place-items:center;width:96px;height:72px;border-radius:var(--r-sm);background:var(--surface-2)}
.reserva-lado{display:grid;gap:6px;justify-items:end}
/* aviso de "e-mail enviado" em /conta/esqueci. Essa tela NÃO carrega o conta.css (só o login e o cadastro carregam), então a regra
   mora aqui e não depende de .conta-ok; os mesmos valores do style= que havia no template. */
.conta-ok-esqueci{background:var(--green-soft);color:var(--green);border-radius:12px;padding:10px 14px;font-weight:700;margin-bottom:12px}
/* e-mail do admin: o corpo vem de /admin/emails/<id>/corpo dentro deste quadro */
.email-quadro{width:100%;height:70vh;border:0}
/* foto da carteirinha na conferência do dono */
.anexo-foto .anexo-carteirinha-img{max-width:min(280px,100%);border-radius:12px}  /* .anexo-foto img (acima) tem mais peso que a classe sozinha */

/* ====== CONSUMO DA IA (/admin/consumo e o cartão de /admin; godive/consumo.py) ====== */
/* O cartão do topo do /admin: o mesmo degradê do .kpi.hi, com texto em --on-grad (legível nos dois temas, pois o degradê não muda). */
.consumo-cartao{display:grid;grid-template-columns:minmax(0,1.6fr) repeat(2,minmax(0,1fr)) auto;gap:10px 22px;align-items:center;margin-bottom:22px;padding:16px 20px;border-radius:var(--r);background:linear-gradient(120deg,var(--g1),var(--g2));color:var(--on-grad)}
.consumo-cartao h2{font-size:1.15rem;color:var(--on-grad)}
.consumo-cartao small{display:block;font-size:.8rem;font-weight:500;color:var(--on-grad)}
.cc-num{display:grid;gap:2px}
.cc-num span{font-family:Sansation,AmpleSoft,sans-serif;font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:var(--on-grad)}
.cc-num b{font-family:Oblik;font-size:1.7rem;font-weight:800;line-height:1.1;overflow-wrap:anywhere}
.consumo-cartao .cc-ver{background:var(--surface);color:var(--teal-ink);box-shadow:var(--shadow-sm)}
.consumo-cartao .cc-ver:hover{color:var(--teal)}
.consumo .kpis{margin-bottom:18px}
.consumo .kpi b{overflow-wrap:anywhere}
.consumo .kpi.hi b{font-size:1.9rem}
.consumo .big{font-size:1.5rem;overflow-wrap:anywhere}
.consumo th.num,.consumo td.num{text-align:right}
.consumo td .bloco,.consumo .bloco{display:block}
.consumo summary{display:flex;align-items:center;min-height:var(--alvo);font-weight:700;color:var(--teal);cursor:pointer}
.consumo .grafico-tabela table{margin-top:6px}
/* Gráfico de 30 barras: a forma e a posição vão em atributos do <svg> (a CSP não deixa style=); a cor, aqui, pelos tokens do :root.
   `color` do svg é o --teal e as barras usam fill="currentColor"; o texto escolhe o seu fill abaixo. */
.grafico-rolagem{overflow-x:auto;direction:rtl}   /* no celular o gráfico é mais largo que a tela e abre pela direita, nos dias mais recentes */
.grafico{display:block;direction:ltr;width:100%;min-width:640px;height:auto;color:var(--teal)}
.grafico .gr-eixo{stroke:var(--line-strong);stroke-width:1}
.grafico .gr-zero{fill:var(--line-strong)}
.grafico .gr-hoje{fill:var(--orange)}
.grafico text{font-family:AmpleSoft,"Segoe UI",system-ui,sans-serif}
.grafico .gr-valor{font-size:10.5px;font-weight:700;fill:var(--ink)}
.grafico .gr-dia{font-size:11px;fill:var(--muted)}
.grafico .gr-dia-hoje{fill:var(--titulo);font-weight:800}
.grafico .gr-mes{font-size:11px;font-weight:800;fill:var(--teal-ink)}
/* Teto do dia: <progress> nativo (acessível, sem style=). */
.medidor{display:block;width:100%;height:14px;margin:10px 0;border:0;border-radius:999px;overflow:hidden;appearance:none;-webkit-appearance:none;background:var(--surface-2);color:var(--teal)}
.medidor::-webkit-progress-bar{background:var(--surface-2)}
.medidor::-webkit-progress-value{background:var(--teal);border-radius:999px}
.medidor::-moz-progress-bar{background:var(--teal);border-radius:999px}
.medidor-alto::-webkit-progress-value{background:var(--amber)}
.medidor-alto::-moz-progress-bar{background:var(--amber)}
.medidor-cheio::-webkit-progress-value{background:var(--red)}
.medidor-cheio::-moz-progress-bar{background:var(--red)}
/* Teto de gasto do mês (godive/ia_teto.py): caixas de aviso do /admin e do /admin/consumo. Sem style=; as cores são os tokens. */
.caixa-ia{margin:0 0 18px;padding:12px 16px;border-radius:var(--r-sm);font-weight:700;font-size:.92rem;background:var(--amber-soft);color:var(--amber-ink)}
.caixa-ia.perigo{background:var(--red-soft);color:var(--red)}
.caixa-ia a{color:inherit;text-decoration:underline;font-weight:800}
.caixa-ia p{margin:0 0 4px}
/* Interruptor da IA (godive/interruptor.py): o botão ocupa a largura toda e tem altura de dedo no celular. */
.interruptor{scroll-margin-top:80px}   /* o link /admin/consumo#interruptor não esconde o título atrás da barra fixa do topo */
.interruptor-quem{font-weight:700;margin:0 0 8px}
.interruptor-form{margin:14px 0 18px}
.btn-grande{display:block;width:100%;min-height:60px;font-size:1.15rem;font-weight:800}
.consumo-cartao-ia{grid-template-columns:minmax(0,1.6fr) repeat(3,minmax(0,1fr)) auto}
.cc-ia small{font-size:.8rem}
.cc-link{color:inherit;font-size:.8rem;font-weight:800;text-decoration:underline}
.erro-campo{color:var(--red);font-size:.84rem;font-weight:700}
.campo-erro input{border-color:var(--red)}
.limites-form{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px;align-items:start}
.limites-form .dica{font-size:.8rem;color:var(--muted)}
.limites-form .acoes{grid-column:1/-1}
.historico-ia{list-style:none;margin:0;padding:0;display:grid;gap:6px;font-size:.88rem}
@media (max-width:900px){.limites-form{grid-template-columns:1fr}}
@media (max-width:900px){
  .consumo-cartao{grid-template-columns:1fr 1fr;padding:14px 16px}
  .consumo-cartao .cc-tit,.consumo-cartao .cc-ver{grid-column:1/-1}
  .cc-num b{font-size:1.4rem}
  .consumo-cartao-ia .cc-ia{grid-column:1/-1}
  .consumo .kpi.hi b{font-size:1.5rem}
  /* as tabelas do consumo cabem na tela (o custo é a coluna que importa e não pode ficar escondida atrás da rolagem) */
  .consumo .col-tokens{display:none}   /* no celular, só chamadas e custo; os tokens do período estão nos números do topo */
  .consumo .panel .pb table{min-width:0;font-size:.85rem}
  .consumo .panel .pb td:first-child{min-width:0;overflow-wrap:anywhere}
  .consumo .panel .pb th,.consumo .panel .pb td{padding:8px 4px}
  .consumo .panel .pb th{white-space:normal;font-size:.62rem;letter-spacing:.03em;vertical-align:bottom}
}

/* ====== SEGURANÇA (/admin/seguranca, o cartão de /admin e a tela de conta suspensa; godive/incidentes.py) ====== */
/* O cartão vermelho do topo do /admin: --red com --surface por cima (o mesmo par do selo .chat-n), legível nos dois temas. */
.seguranca-cartao{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px 22px;margin-bottom:22px;padding:16px 20px;border-radius:var(--r);background:var(--red);color:var(--surface)}
.seguranca-cartao h2{font-size:1.15rem;color:var(--surface)}
.seguranca-cartao small{display:block;font-size:.85rem;font-weight:600;color:var(--surface)}
.seguranca-cartao .sc-ver{background:var(--surface);color:var(--titulo);box-shadow:var(--shadow-sm)}
.seguranca-cartao .sc-ver:hover{color:var(--red)}
.suspensa-aviso{background:var(--red-soft);color:var(--red);border-radius:var(--r-sm);padding:12px 16px;font-weight:800;margin:14px 0}
.suspensa-contato{overflow-wrap:anywhere}
.linha-suspensa{background:var(--red-soft)}
.seguranca .incidente{background:var(--surface);border:1px solid var(--line);border-left:6px solid var(--amber);border-radius:var(--r);padding:16px 18px;margin-bottom:16px}
.seguranca .incidente-forte{border-left-color:var(--red)}
.seguranca .inc-topo{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:10px}
.seguranca .inc-topo h2{font-size:1.1rem;margin-right:6px}
.seguranca .inc-dados{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px 22px;margin:0 0 12px}
.seguranca .inc-dados dt{font-family:Sansation,AmpleSoft,sans-serif;font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;font-weight:800;color:var(--muted)}
.seguranca .inc-dados dd{margin:2px 0 0;overflow-wrap:anywhere}
.seguranca .inc-sub{font-size:.95rem;margin:6px 0}
.seguranca .inc-sinais{list-style:none;margin:0 0 12px;padding:0;display:grid;gap:6px}
.seguranca .inc-sinais li{overflow-wrap:anywhere}
.seguranca .inc-ua{display:block;max-width:34ch;overflow-wrap:anywhere}
.seguranca .inc-sha summary,.seguranca .travar summary{display:flex;align-items:center;min-height:var(--alvo);cursor:pointer;font-weight:700;color:var(--teal)}
.seguranca .travar summary{display:inline-flex}
.seguranca .inc-sha-inteiro{display:block;overflow-wrap:anywhere;user-select:all;font-size:.82rem;padding-bottom:6px}
.seguranca .inc-acoes{align-items:flex-start}
.travar-form{display:grid;gap:8px;margin-top:8px;max-width:380px}
.travar-form input[type=text]{min-height:var(--alvo);padding:8px 12px;border:1.5px solid var(--line-strong);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font:inherit}
.travar-rotulo{font-size:.85rem;font-weight:700;color:var(--ink)}
@media (max-width:900px){
  .seguranca .incidente{padding:14px 14px}
  .seguranca .inc-dados{grid-template-columns:1fr}
}
