/* ============================================================
   assets/css/main.css — MeuPet ETAP+
   ============================================================
   Arquivo CSS ÚNICO do projeto. Todas as páginas carregam este
   arquivo. Seletores de uma seção não afetam outras páginas —
   o browser simplesmente ignora seletores sem correspondência.

   Direção visual (PLANO seção 3): amigável, arredondado, leve —
   o oposto do dark/tech do Tappy+. Cantos generosos, sombras
   suaves, patinhas como elemento decorativo.

   SEÇÕES:
     1. Fontes (Baloo 2 + Nunito)
     2. Reset global e variáveis CSS
     3. Componentes compartilhados (botões, cards, forms)
     4. Página pública — pet.php
     5. Login e onboarding — painel.php
     6. Painel do tutor — painel.php
     7. Painel administrativo — admin/index.php
     8. Responsivo (breakpoints 720px e 560px)
     9. Impressão dos cartões do lote
   ============================================================ */


/* ── 1. FONTES ───────────────────────────────────────────────
   - Baloo 2: títulos — arredondada, calorosa
   - Nunito: corpo de texto                                    */
@import url('https://fonts.googleapis.com/css2?family=Baloo+2:wght@600;700;800&family=Nunito:wght@300;400;600;700&display=swap');


/* ── 2. RESET GLOBAL E VARIÁVEIS CSS ────────────────────────
   As variáveis abaixo definem o tema "Caramelo" (padrão) como
   fallback. pet.php sobrescreve --bg, --accent, --text e
   --text2 via <style> inline com as cores do pet (PLANO 3.3).  */
:root {
  --bg:      #FFF8F1;
  --accent:  #E8863B;
  --text:    #2B1B12;
  --text2:   #8A7466;
  --danger:  #DC2626;
  --danger-bg: #FEE2E2;
  --radius:  22px;      /* cantos generosos — PLANO 3.4 */

  --card:   color-mix(in srgb, var(--text)   6%,  transparent);
  --card-h: color-mix(in srgb, var(--accent) 12%, transparent);
  --border: color-mix(in srgb, var(--text)   10%, transparent);
}

*,
*::before,
*::after {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

html {
  scroll-behavior: smooth;
  /* Sem isso o Safari do iOS aumenta a fonte por conta própria
     quando o aparelho vira para paisagem. */
  -webkit-text-size-adjust: 100%;
}

body {
  min-height: 100vh;
  min-height: 100dvh; /* no celular 100vh inclui a barra de endereço */
  background: var(--bg);
  color: var(--text);
  font-family: 'Nunito', sans-serif;
}

a {
  color: inherit;
  text-decoration: none;
}

/* Rede de segurança: nada pode ser mais largo que a tela. Quando um
   elemento estoura, quem rola de lado é o <body> inteiro e a página
   toda desalinha — foi o que acontecia com as tabelas do admin. */
img,
table,
video {
  max-width: 100%;
}

/* As âncoras do painel (#saude, #links, #perdido) param embaixo da
   barra fixa sem esta margem de rolagem. */
.card[id],
.msg {
  scroll-margin-top: 76px;
}


/* ── 3. COMPONENTES COMPARTILHADOS ──────────────────────────
   Reaproveitados pelo painel do tutor (fase 3) e admin (fase 4). */

label {
  font-size: .78rem;
  font-weight: 600;
  color: var(--text2);
  display: block;
  margin-bottom: 5px;
}

input,
textarea,
select {
  background: var(--bg);
  border: 1.5px solid var(--border);
  border-radius: 14px;
  color: var(--text);
  font-family: inherit;
  font-size: .9rem;
  padding: 10px 14px;
  width: 100%;
  outline: none;
  transition: border-color .2s;
}
input:focus,
textarea:focus,
select:focus {
  border-color: var(--accent);
}

.card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 22px;
}
/* Espaço entre cards empilhados.
   Por margin-bottom com escopo, e NÃO por `.card + .card`: no painel e
   no admin quase todo card está dentro do seu próprio <form>, então os
   cards não são irmãos e o seletor de irmão adjacente nunca casava —
   ficavam colados. Pior: dentro do .stat-grid ele casava, e a margem
   somava ao gap do grid e esticava o primeiro card da linha. */
.panel-body main > .card,
.panel-body main > form > .card,
.admin-body main > .card,
.admin-body main > form > .card {
  margin-bottom: 16px;
}
.card-title {
  font-family: 'Baloo 2', sans-serif;
  font-weight: 700;
  font-size: .95rem;
  color: var(--accent);
  margin-bottom: 16px;
}

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 13px 22px;
  border-radius: 16px;
  font-family: 'Nunito', sans-serif;
  font-size: .92rem;
  font-weight: 700;
  cursor: pointer;
  border: none;
  transition: all .2s;
  white-space: nowrap;
}
.btn-primary         { background: var(--accent); color: #fff; }
.btn-primary:hover    { filter: brightness(1.06); transform: translateY(-1px); }
.btn-secondary         { background: var(--card); color: var(--text); border: 1.5px solid var(--border); }
.btn-secondary:hover   { border-color: var(--accent); color: var(--accent); }
.btn-danger             { background: transparent; color: var(--danger); border: 1.5px solid var(--danger); }
.btn-sm                 { padding: 8px 16px; font-size: .82rem; }
.btn-block              { width: 100%; }

/* Grids e campos de formulário — usados no painel do tutor e admin */
.grid-2 { display: grid; grid-template-columns: 1fr 1fr;         gap: 14px; }
.grid-3 { display: grid; grid-template-columns: 1fr 1fr 1fr;     gap: 14px; }
.grid-4 { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 14px; }
.field  { display: flex; flex-direction: column; margin-bottom: 14px; }
@media (max-width: 560px) {
  .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; }
}

/* Mensagens de feedback (sucesso e erro) */
.msg {
  background: var(--card-h);
  border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
  color: var(--accent);
  border-radius: 14px;
  padding: 12px 16px;
  margin-bottom: 18px;
  font-size: .88rem;
  font-weight: 600;
}
.msg-err {
  background: var(--danger-bg);
  border: 1px solid color-mix(in srgb, var(--danger) 30%, transparent);
  color: var(--danger);
}

/* ── Campo de WhatsApp: DDI + número ────────────────────────
   O <select> do país fica com largura própria (só a bandeira e o
   +DDI cabem) e o número ocupa o resto. Em telas estreitas os dois
   empilham — ver seção 8.                                        */
.wa-field {
  display: flex;
  flex-direction: column;
  margin-bottom: 14px;
}
.wa-label {
  font-size: .78rem;
  font-weight: 600;
  color: var(--text2);
  margin-bottom: 5px;
}
.wa-row {
  display: flex;
  gap: 8px;
  align-items: center;
}
.wa-dial {
  width: auto;
  flex: 0 0 auto;
  max-width: 46%;
  padding-right: 8px;
}
.wa-number {
  flex: 1 1 auto;
  min-width: 0;
}
.wa-hint {
  font-size: .74rem;
  line-height: 1.35;
  color: var(--text2);
  margin-top: 5px;
  min-height: 1.35em; /* reserva a linha: sem isso o campo "pula" ao surgir o erro */
}
.wa-hint.is-error { color: var(--danger); font-weight: 600; }
.wa-field.is-error .wa-number { border-color: var(--danger); }

/* Só o seletor de país, na linha compacta de "links extras" */
.wa-dial-inline {
  width: auto;
  flex: 0 0 auto;
  max-width: 130px;
}
.wa-dial-inline[hidden] { display: none; }

/* Explicação curta abaixo de um campo (ex.: a dica do código da tag
   na tela de login) */
.field-hint {
  font-size: .78rem;
  line-height: 1.45;
  color: var(--text2);
  margin: -8px 0 14px;
}

.divider {
  border: none;
  border-top: 1px solid var(--border);
  margin: 18px 0;
}

/* Checkbox estilizado como toggle (ex.: "Castrado(a)", "Exibir galeria") */
.toggle {
  display: flex;
  align-items: center;
  flex-direction: row;
  gap: 8px;
  cursor: pointer;
  font-size: .88rem;
  font-weight: 600;
  color: var(--text);
}
.toggle input { width: auto; }


/* ── 4. PÁGINA PÚBLICA (pet.php) ─────────────────────────────
   O <body> recebe a classe .pet-body.                         */

.pet-body {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 44px 20px 70px;
  position: relative;
  overflow-x: hidden;
}

/* Fundo com patinhas — SVG inline repetido, opacity .04 embutida
   no próprio SVG (PLANO 3.4), sem imagem externa. */
.pet-body::before {
  content: '';
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 64 64'%3E%3Cg fill='%23808080' opacity='0.06'%3E%3Cellipse cx='32' cy='40' rx='11' ry='9'/%3E%3Ccircle cx='15' cy='23' r='5'/%3E%3Ccircle cx='25' cy='12' r='5'/%3E%3Ccircle cx='39' cy='12' r='5'/%3E%3Ccircle cx='49' cy='23' r='5'/%3E%3C/g%3E%3C/svg%3E");
  background-repeat: repeat;
  background-size: 64px 64px;
}

.pet-container {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 460px;
  display: flex;
  flex-direction: column;
  align-items: center;
}

/* Avatar com moldura sólida em --accent + "pingente" (coleira) —
   PLANO 3.4: sem animação conic-gradient girando. */
.avatar-wrap {
  position: relative;
  width: 112px;
  height: 112px;
  margin-bottom: 26px;
  flex-shrink: 0;
}
.avatar-inner {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  border: 5px solid var(--accent);
  background: var(--bg);
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: 'Baloo 2', sans-serif;
  font-size: 2.2rem;
  font-weight: 800;
  color: var(--accent);
  box-shadow: 0 10px 26px color-mix(in srgb, var(--accent) 25%, transparent);
}
.avatar-inner img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* pingente pendurado na borda inferior — motivo "coleira" */
.avatar-wrap::after {
  content: '';
  position: absolute;
  left: 50%;
  bottom: -6px;
  transform: translateX(-50%);
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: var(--accent);
  border: 3px solid var(--bg);
}
/* badge de espécie (🐶 / 🐱 / 🐰) no canto superior direito */
.species-badge {
  position: absolute;
  top: -4px;
  right: -6px;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--bg);
  border: 2px solid var(--accent);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 1.15rem;
  line-height: 1;
}

.pet-name {
  font-family: 'Baloo 2', sans-serif;
  font-size: clamp(1.6rem, 5vw, 2rem);
  font-weight: 800;
  text-align: center;
  line-height: 1.15;
  margin-bottom: 12px;
}

/* Chips de características — pílulas com fundo color-mix accent 12% */
.chips {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px;
  margin-bottom: 18px;
}
.chip {
  padding: 6px 14px;
  border-radius: 999px;
  background: var(--card-h);
  color: var(--text);
  font-size: .82rem;
  font-weight: 700;
  border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent);
}

.pet-bio {
  font-size: .95rem;
  font-weight: 400;
  line-height: 1.65;
  text-align: center;
  color: var(--text2);
  max-width: 360px;
  margin-bottom: 26px;
}

/* ── Modo Perdido ────────────────────────────────────────────
   Cores FIXAS, fora do tema do pet: o alerta precisa ler como
   alerta mesmo num perfil com tema escuro (PLANO 3.3).        */

.lost-banner {
  width: 100%;
  background: var(--danger-bg);
  border: 2px solid var(--danger);
  border-radius: var(--radius);
  padding: 20px;
  margin-bottom: 26px;
  text-align: center;
  color: #7f1d1d; /* legível sobre o fundo claro fixo do alerta */
}
.lost-title {
  font-family: 'Baloo 2', sans-serif;
  font-size: 1.35rem;
  font-weight: 800;
  color: var(--danger);
  letter-spacing: .02em;
}
.lost-pulse {
  display: inline-block;
  animation: lostPulse 1.4s ease-in-out infinite;
}
@keyframes lostPulse {
  0%, 100% { transform: scale(1);    opacity: 1;   }
  50%      { transform: scale(1.18); opacity: .75; }
}
/* Respeita quem pediu menos animação no sistema */
@media (prefers-reduced-motion: reduce) {
  .lost-pulse { animation: none; }
}
.lost-text   { font-size: .95rem; font-weight: 600; margin-top: 4px; }
.lost-msg    { font-size: .9rem; margin-top: 10px; line-height: 1.5; }
.lost-reward {
  display: inline-block;
  margin-top: 12px;
  padding: 6px 16px;
  border-radius: 999px;
  background: var(--danger);
  color: #fff;
  font-weight: 800;
  font-size: .88rem;
}
.lost-actions {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
  justify-content: center;
  margin-top: 16px;
}
.lost-actions .btn { flex: 1; min-width: 130px; }

.btn-alert         { background: var(--danger); color: #fff; }
.btn-alert:hover   { filter: brightness(1.08); }
.btn-alert svg     { width: 18px; height: 18px; }
.btn-alert-outline {
  background: transparent;
  color: var(--danger);
  border: 1.5px solid var(--danger);
}
.btn-alert-outline svg { width: 18px; height: 18px; }

/* ── Formulário "Encontrei este pet" ─────────────────────── */

.achei-card {
  width: 100%;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 18px 20px;
  margin-bottom: 22px;
}
/* No Modo Perdido o bloco ganha destaque de alerta */
.achei-card.is-lost {
  background: var(--danger-bg);
  border: 2px solid var(--danger);
}
.achei-card summary {
  font-family: 'Baloo 2', sans-serif;
  font-weight: 700;
  font-size: .98rem;
  color: var(--accent);
  cursor: pointer;
  list-style: none;
}
.achei-card.is-lost summary { color: var(--danger); }
.achei-card summary::-webkit-details-marker { display: none; }
.achei-card summary::after { content: '▾'; float: right; transition: transform .2s; }
.achei-card[open] summary::after { transform: rotate(180deg); }

.achei-body  { margin-top: 16px; }
.achei-hint  { font-size: .86rem; line-height: 1.5; margin-bottom: 14px; }
.achei-card.is-lost .achei-hint,
.achei-card.is-lost label { color: #7f1d1d; }
.achei-card .btn { margin-bottom: 10px; }
.achei-geo-status { font-size: .8rem; margin: -4px 0 12px; min-height: 1em; }
.achei-consent {
  align-items: flex-start;
  font-size: .82rem;
  font-weight: 400;
  line-height: 1.45;
  margin-bottom: 14px;
}
.achei-consent input { margin-top: 3px; flex-shrink: 0; }
.achei-send.is-disabled { opacity: .5; }
#acheiGeo.is-done { border-color: #2BB673; color: #1c8f58; }
.achei-done {
  font-size: .88rem;
  font-weight: 700;
  color: #1c8f58;
  text-align: center;
  margin-bottom: 10px;
}

/* Contato principal — botão de destaque, largura total (PLANO 3.4) */
.contact-hero {
  width: 100%;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 20px;
  margin-bottom: 14px;
  text-align: center;
}
.contact-hero .contact-name     { font-family:'Baloo 2',sans-serif; font-weight:700; font-size:1.05rem; }
.contact-hero .contact-relation { font-size:.8rem; color:var(--text2); margin-bottom:14px; display:block; }
.contact-hero-actions {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
}
.contact-hero-actions .btn { flex: 1; min-width: 140px; }
.contact-hero-actions .btn svg { width: 18px; height: 18px; }

/* Contatos adicionais — cartões menores */
.contacts { width:100%; display:flex; flex-direction:column; gap:10px; margin-bottom:20px; }
.contact-card {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 18px;
  padding: 14px 18px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}
.contact-info { display: flex; flex-direction: column; }
.contact-name { font-weight: 700; font-size: .92rem; }
.contact-relation { font-size: .76rem; color: var(--text2); }
.contact-actions { display: flex; gap: 8px; }
.btn-contact {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 8px 14px;
  border-radius: 12px;
  font-size: .8rem;
  font-weight: 700;
  background: var(--card-h);
  color: var(--accent);
}
.btn-contact svg { width: 15px; height: 15px; }

/* Botão "Salvar contato do tutor" (vCard) */
.btn-save-contact {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  margin-bottom: 22px;
  padding: 15px 22px;
  border: 1.5px solid var(--accent);
  border-radius: var(--radius);
  color: var(--accent);
  font-size: .95rem;
  font-weight: 700;
  transition: background .2s, color .2s;
}
.btn-save-contact:hover { background: var(--accent); color: #fff; }
.btn-save-contact svg { width: 20px; height: 20px; flex-shrink: 0; }

/* Ficha de saúde — card colapsável nativo (<details>) */
.health-card {
  width: 100%;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 18px 20px;
  margin-bottom: 22px;
}
.health-card summary {
  font-family: 'Baloo 2', sans-serif;
  font-weight: 700;
  font-size: .98rem;
  color: var(--accent);
  cursor: pointer;
  list-style: none;
}
.health-card summary::-webkit-details-marker { display: none; }
.health-card summary::after {
  content: '▾';
  float: right;
  transition: transform .2s;
}
.health-card[open] summary::after { transform: rotate(180deg); }
.health-body { margin-top: 14px; display: flex; flex-direction: column; gap: 10px; }
.health-row { font-size: .88rem; line-height: 1.5; }
.health-row strong { color: var(--text); }
.vaccine-table { width: 100%; border-collapse: collapse; margin-top: 6px; font-size: .82rem; }
.vaccine-table th {
  text-align: left;
  color: var(--text2);
  font-weight: 600;
  padding: 6px 8px;
  border-bottom: 1px solid var(--border);
}
.vaccine-table td {
  padding: 8px;
  border-bottom: 1px solid var(--border);
}

/* Galeria — carrossel arrastável (mesmo padrão do Tappy+, ver
   assets/js/main.js) */
.gallery {
  width: 100%;
  margin-bottom: 26px;
  overflow: hidden;
  border-radius: 18px;
  position: relative;
}
.gallery-track {
  display: flex;
  gap: 10px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scrollbar-width: none;
  padding-bottom: 4px;
  cursor: grab;
}
.gallery-track::-webkit-scrollbar { display: none; }
.gallery-track.dragging { cursor: grabbing; }
.gallery-item {
  flex: 0 0 calc(50% - 5px);
  scroll-snap-align: start;
  border-radius: 14px;
  overflow: hidden;
  aspect-ratio: 1;
  background: var(--card);
}
.gallery-item img { width: 100%; height: 100%; object-fit: cover; display: block; }
.gallery-dots { display: flex; justify-content: center; gap: 6px; margin-top: 10px; }
.gallery-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--border); transition: background .2s; }
.gallery-dot.active { background: var(--accent); }
.gallery-arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 2;
  width: 32px;
  height: 32px;
  border-radius: 50%;
  background: color-mix(in srgb, var(--bg) 75%, transparent);
  backdrop-filter: blur(8px);
  border: 1px solid var(--border);
  color: var(--text);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  padding: 0;
  font-size: 1.2rem;
  line-height: 1;
}
.gallery-arrow:hover { background: var(--accent); color: #fff; border-color: var(--accent); }
.gallery-arrow.prev { left: 8px; }
.gallery-arrow.next { right: 8px; }

/* Links extras */
.pet-links {
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin-bottom: 26px;
}
.link-card {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 15px 18px;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 18px;
  color: var(--text);
  transition: background .2s, transform .2s, border-color .2s;
}
.link-card:hover {
  background: var(--card-h);
  border-color: color-mix(in srgb, var(--accent) 40%, transparent);
  transform: translateY(-2px);
}
.link-icon {
  width: 36px;
  height: 36px;
  flex-shrink: 0;
  border-radius: 12px;
  background: var(--card-h);
  border: 1px solid color-mix(in srgb, var(--accent) 25%, transparent);
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--accent);
}
.link-icon svg { width: 17px; height: 17px; }
.link-label { flex: 1; font-weight: 600; font-size: .92rem; }
.link-arrow { opacity: .35; transition: opacity .2s, transform .2s; }
.link-card:hover .link-arrow { opacity: 1; transform: translateX(3px); }

/* QR Code — reservado; sem gerador no v1 (AUDITORIA.md §7) */
.qr-wrap {
  margin-bottom: 26px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
}
.qr-wrap img { width: 120px; height: 120px; border-radius: 14px; padding: 8px; background: #fff; }
.qr-label { font-size: .75rem; color: var(--text2); text-align: center; }

.pet-footer {
  margin-top: 16px;
  font-size: .75rem;
  color: var(--text2);
  opacity: .7;
  text-align: center;
}
.pet-footer a { text-decoration: underline; }

/* Página de erro amigável (404 / 429) */
.notfound {
  text-align: center;
  padding: 40px 0 20px;
}
.notfound-paw {
  font-size: 3.4rem;
  line-height: 1;
  margin-bottom: 14px;
  opacity: .8;
}
.notfound .pet-bio { margin-left: auto; margin-right: auto; }


/* ── 5. LOGIN E ONBOARDING (painel.php) ──────────────────────
   O <body> recebe a classe .login-body.                       */

.login-body {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
  min-height: 100vh;
  position: relative;
}
.login-body::before {
  content: '';
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 64 64'%3E%3Cg fill='%23808080' opacity='0.06'%3E%3Cellipse cx='32' cy='40' rx='11' ry='9'/%3E%3Ccircle cx='15' cy='23' r='5'/%3E%3Ccircle cx='25' cy='12' r='5'/%3E%3Ccircle cx='39' cy='12' r='5'/%3E%3Ccircle cx='49' cy='23' r='5'/%3E%3C/g%3E%3C/svg%3E");
  background-repeat: repeat;
  background-size: 64px 64px;
}

.login-box {
  width: 100%;
  max-width: 380px;
  padding: 34px;
  position: relative;
  z-index: 1;
}
.onboarding-box { max-width: 420px; }

.login-title {
  font-family: 'Baloo 2', sans-serif;
  font-size: 1.4rem;
  font-weight: 800;
  margin-bottom: 4px;
  color: var(--accent);
}
.login-sub {
  font-size: .86rem;
  color: var(--text2);
  margin-bottom: 22px;
}
.login-box input { margin-bottom: 14px; }
.login-box label:first-of-type { margin-top: 0; }
.login-help {
  margin-top: 16px;
  font-size: .8rem;
  color: var(--text2);
  text-align: center;
}
.login-help a { color: var(--accent); font-weight: 700; text-decoration: underline; }


/* ── 6. PAINEL DO TUTOR (painel.php) ─────────────────────────
   O <body> recebe a classe .panel-body.                       */

.panel-body { position: relative; }
.panel-body::before {
  content: '';
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='64' viewBox='0 0 64 64'%3E%3Cg fill='%23808080' opacity='0.05'%3E%3Cellipse cx='32' cy='40' rx='11' ry='9'/%3E%3Ccircle cx='15' cy='23' r='5'/%3E%3Ccircle cx='25' cy='12' r='5'/%3E%3Ccircle cx='39' cy='12' r='5'/%3E%3Ccircle cx='49' cy='23' r='5'/%3E%3C/g%3E%3C/svg%3E");
  background-repeat: repeat;
  background-size: 64px 64px;
}

.panel-body nav {
  position: sticky;
  top: 0;
  z-index: 100;
  background: color-mix(in srgb, var(--bg) 85%, transparent);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--border);
  padding: 8px 20px;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  /* min-height, não height: com altura fixa o conteúdo que não coube
     vaza para fora da barra e cai por cima do <main>. */
  min-height: 60px;
  gap: 14px;
}
.brand { font-family: 'Baloo 2', sans-serif; font-weight: 800; font-size: 1.05rem; color: var(--accent); white-space: nowrap; }
.nav-pet-name { font-size: .9rem; font-weight: 700; }
.nav-right { margin-left: auto; display: flex; align-items: center; gap: 10px; }
/* O botão "Ver minha página" tem dois rótulos: o CSS troca pelo curto
   no celular (encurtar texto por CSS só daria gambiarra). */
.preview-btn .lbl-short { display: none; }
.preview-btn {
  background: var(--card-h);
  color: var(--accent);
  border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent);
  border-radius: 10px;
  padding: 7px 14px;
  font-size: .82rem;
  font-weight: 700;
}

.panel-body main {
  max-width: 640px;
  margin: 0 auto;
  padding: 26px 18px 80px;
  position: relative;
  z-index: 1;
}

.panel-body .card-title { display: flex; align-items: center; gap: 8px; }
.card-hint { font-size: .8rem; color: var(--text2); margin-bottom: 14px; margin-top: -8px; }

/* Card do Modo Perdido — visualmente destacado (fica no topo) */
.card-lost-mode {
  border-color: color-mix(in srgb, var(--danger) 35%, var(--border));
}
.card-lost-mode .card-title { color: var(--danger); }

/* Linha de edição de link/contato/vacina */
.edit-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 12px 0;
  border-top: 1px solid var(--border);
  flex-wrap: wrap;
}
.edit-row:first-of-type { border-top: none; padding-top: 0; }
.edit-row input,
.edit-row select { flex: 1; min-width: 110px; }
.edit-row select { max-width: 140px; }

/* Thumbnail de foto no gerenciamento da galeria */
.photo-item {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
}
.photo-item img {
  width: 76px;
  height: 76px;
  object-fit: cover;
  border-radius: 12px;
  border: 1px solid var(--border);
}

/* Avisos recebidos (card do painel do tutor) */
.report-item {
  padding: 14px 0;
  border-top: 1px solid var(--border);
}
.report-item:first-of-type { border-top: none; padding-top: 0; }
.report-item.is-unseen {
  border-left: 3px solid var(--accent);
  padding-left: 12px;
}
.report-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 10px;
  flex-wrap: wrap;
}
.report-msg { font-size: .88rem; line-height: 1.5; margin-top: 6px; }
.report-actions {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  align-items: center;
  margin-top: 10px;
}

/* Botões de tema prontos (Aparência) */
.theme-grid {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 16px;
}
.theme-btn {
  border-radius: 14px;
  padding: 10px 16px;
  font-family: inherit;
  font-size: .82rem;
  font-weight: 700;
  cursor: pointer;
}
.theme-btn.active { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Radio "principal" nas linhas de contato */
.primary-radio {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: .78rem;
  color: var(--text2);
  white-space: nowrap;
}
/* As três anulações são todas necessárias: `.edit-row input` aplica
   `flex: 1` e `min-width: 110px` ao rádio também, e ele esticava até
   ocupar a linha, jogando o texto "Principal" para o canto oposto. */
.primary-radio input {
  width: auto;
  flex: 0 0 auto;
  min-width: 0;
}


/* ── 7. PAINEL ADMINISTRATIVO (admin/index.php) ──────────────
   O <body> recebe a classe .admin-body.                       */

.admin-body {
  display: flex;
  flex-direction: column;
}

.admin-body nav {
  background: var(--card);
  border-bottom: 1px solid var(--border);
  padding: 0 24px;
  display: flex;
  align-items: center;
  gap: 24px;
  /* height fixo + flex-wrap era a causa da sobreposição: os 7 links
     quebravam para a 2ª linha e ela vazava por cima do <main>.
     Aqui a barra é sempre uma linha; no celular vira menu (seção 9). */
  min-height: 58px;
  position: sticky;
  top: 0;
  z-index: 100;
}
.nav-brand {
  font-family: 'Baloo 2', sans-serif;
  font-weight: 800;
  font-size: 1.05rem;
  color: var(--accent);
  white-space: nowrap;
}
.nav-links { display: flex; gap: 4px; margin-left: auto; flex-wrap: wrap; }
.nav-link {
  padding: 6px 13px;
  border-radius: 10px;
  font-size: .86rem;
  font-weight: 600;
  color: var(--text2);
  transition: all .2s;
}
.nav-link:hover { background: var(--card-h); color: var(--accent); }

/* Botão ☰ — invisível no desktop, aparece abaixo de 720px (seção 9) */
.nav-toggle {
  display: none;
  margin-left: auto;
  width: 44px;
  height: 44px;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1.5px solid var(--border);
  border-radius: 12px;
  color: var(--text);
  font-size: 1.15rem;
  line-height: 1;
  cursor: pointer;
}
.nav-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.admin-body main {
  flex: 1;
  padding: 28px 24px 60px;
  max-width: 1100px;
  width: 100%;
  margin: 0 auto;
}

.page-title {
  font-family: 'Baloo 2', sans-serif;
  /* clamp: encolhe sozinho na tela estreita, sem media query */
  font-size: clamp(1.25rem, 4.5vw, 1.5rem);
  font-weight: 800;
  margin-bottom: 22px;
  /* O título de editar-pet é "Nome /slug [badge]" — sem flex-wrap as
     três partes se atropelavam no celular. */
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
}

.muted { color: var(--text2); }

/* Cards de números do dashboard */
.stat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
  gap: 14px;
  margin-bottom: 20px;
}
/* Os cards do grid não entram na regra de empilhamento acima; o
   espaçamento deles é o gap do próprio grid. */
.stat-grid .card { margin-bottom: 0; }
.stat { text-align: center; padding: 18px; }
.stat-num {
  font-family: 'Baloo 2', sans-serif;
  font-size: 2rem;
  font-weight: 800;
  color: var(--accent);
  line-height: 1.1;
}
.stat-num.danger { color: var(--danger); }
.stat-label { color: var(--text2); font-size: .82rem; margin-top: 4px; }

/* Card de alerta (pets em Modo Perdido) */
.card-alert { border-color: color-mix(in srgb, var(--danger) 35%, var(--border)); }
.card-alert .card-title { color: var(--danger); }

/* Tabelas
   TODA tabela do admin fica dentro de um .table-wrap. Sem ele, uma
   tabela larga demais empurra a página inteira e o site passa a rolar
   de lado. Com ele, quem rola é só a tabela, dentro do card.
   role="region" + tabindex="0" no HTML: é o que torna a área rolável
   alcançável pelo teclado e anunciada por leitor de tela. */
.table-wrap {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.table-wrap:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

table { width: 100%; border-collapse: collapse; }
th {
  text-align: left;
  font-size: .76rem;
  font-weight: 700;
  color: var(--text2);
  text-transform: uppercase;
  letter-spacing: .04em;
  padding: 0 12px 10px;
}
td {
  padding: 12px;
  border-top: 1px solid var(--border);
  font-size: .89rem;
  vertical-align: middle;
}
tbody tr:hover td { background: color-mix(in srgb, var(--accent) 5%, transparent); }
td a { color: var(--accent); font-weight: 600; }
.row-unseen td { background: color-mix(in srgb, var(--accent) 8%, transparent); }

/* Badges de status */
.badge {
  display: inline-flex;
  align-items: center;
  padding: 3px 11px;
  border-radius: 999px;
  font-size: .74rem;
  font-weight: 700;
  white-space: nowrap;
}
.badge-green { background: color-mix(in srgb, #2BB673 18%, transparent); color: #1c8f58; }
.badge-amber { background: color-mix(in srgb, #E8863B 18%, transparent); color: #b3641f; }
.badge-red   { background: var(--danger-bg); color: var(--danger); }
.badge-muted { background: var(--card); color: var(--text2); }

/* Barra de filtros */
.filter-bar {
  display: flex;
  gap: 10px;
  align-items: center;
  flex-wrap: wrap;
}
/* O campo de busca CRESCE (flex-grow 1) em vez de encolher — com
   `flex: 0 1 auto` ele espremia até 170px e cortava o placeholder. */
.filter-bar input[type="text"] { width: auto; flex: 1 1 240px; min-width: 0; }
.filter-bar select            { width: auto; flex: 1 1 160px; min-width: 0; }

/* Empurra o botão para a direita no desktop; anulado no celular */
.filter-push { margin-left: auto; }

/* Rótulo "De/Até" colado no campo de data */
.filter-date {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 0;
  font-size: .8rem;
  font-weight: 600;
  color: var(--text2);
  white-space: nowrap;
}
.filter-date input { min-width: 150px; }

/* Cabeçalho de tabela clicável (ordenação) */
.th-sort {
  color: inherit;
  font-weight: 700;
  display: inline-block;
  white-space: nowrap;
}
.th-sort:hover { color: var(--accent); }

/* Navegação de páginas */
.pager {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 14px;
  margin-top: 16px;
  padding-top: 16px;
  border-top: 1px solid var(--border);
  font-size: .85rem;
}
.pager .is-disabled { opacity: .4; cursor: default; }

.msg-warn {
  background: color-mix(in srgb, #E8863B 12%, transparent);
  border: 1px solid color-mix(in srgb, #E8863B 35%, transparent);
  color: #a35a17;
}
.msg code {
  background: var(--card);
  padding: 2px 8px;
  border-radius: 6px;
  font-size: .95em;
}


/* ── 8. RESPONSIVO ───────────────────────────────────────────
   Dois breakpoints, e só dois, para não pulverizar a manutenção:

     720px — celular e tablet em pé: o menu do admin vira ☰, as listas
             de trabalho viram cartões, os campos passam a 16px
     560px — celular estreito: o que ainda estava lado a lado empilha

   A página pública (pet.php) nasceu mobile-first e quase não aparece
   aqui. O que precisou de conserto foi o painel do tutor e o admin,
   desenhados em medidas de desktop.                             */

@media (max-width: 720px) {

  /* ── Campos ────────────────────────────────────────────────
     16px não é escolha de estilo: o Safari do iOS dá zoom automático
     ao focar qualquer campo com fonte menor — e não desfaz o zoom
     depois. Num painel que é quase todo formulário, isso inviabiliza
     o uso no iPhone.                                             */
  input,
  textarea,
  select {
    font-size: 16px;
  }

  /* ── Alvos de toque ────────────────────────────────────────
     .btn-sm tinha ~33px de altura; o mínimo confortável para o dedo
     é 44px.                                                      */
  .btn    { padding: 13px 20px; }
  .btn-sm { min-height: 40px; padding: 10px 16px; }

  /* ── Menu do admin ─────────────────────────────────────────
     A barra fica sempre em uma linha (marca + ☰) e a lista de links
     desce como painel por cima do conteúdo.                      */
  .nav-toggle { display: inline-flex; }

  .admin-body nav { padding: 0 16px; gap: 12px; }

  .admin-body .nav-links {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    flex-direction: column;
    gap: 2px;
    margin-left: 0;
    padding: 8px;
    background: var(--bg);
    border-bottom: 1px solid var(--border);
    box-shadow: 0 12px 24px color-mix(in srgb, var(--text) 12%, transparent);
  }
  .admin-body .nav-links.is-open { display: flex; }

  .admin-body .nav-link {
    display: flex;
    align-items: center;
    min-height: 44px;
    padding: 6px 14px;
    font-size: .95rem;
  }

  /* ── Listas de trabalho viram cartões (.table-cards) ───────
     Cada <tr> vira um cartão e cada <td> uma linha "rótulo → valor".
     O rótulo sai do data-label do próprio <td>: sem ele, um valor
     solto dentro do cartão ("17/08/2026") não diz nada.

     Ressalva conhecida: display:block desfaz a semântica nativa de
     tabela para leitores de tela. Só é aplicado no admin, área do
     operador, onde a legibilidade no celular pesa mais — e o rótulo
     visível preserva o significado de cada valor.                */
  .table-cards,
  .table-cards tbody,
  .table-cards tr,
  .table-cards td {
    display: block;
    width: 100%;
  }
  .table-cards thead { display: none; }

  .table-cards tr {
    border: 1px solid var(--border);
    border-radius: 16px;
    padding: 14px 16px;
    margin-bottom: 12px;
    background: var(--bg);
  }
  .table-cards tbody tr:hover td { background: none; }

  .table-cards td {
    border-top: none;
    padding: 5px 0;
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 14px;
    text-align: right;
  }
  .table-cards td::before {
    content: attr(data-label);
    flex: 0 0 auto;
    text-align: left;
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--text2);
  }

  /* Primeira coluna = identidade do registro → título do cartão */
  .table-cards td:first-child {
    display: block;
    font-size: 1.05rem;
    font-weight: 700;
    text-align: left;
    padding-bottom: 8px;
    margin-bottom: 4px;
    border-bottom: 1px solid var(--border);
  }
  .table-cards td:first-child::before { content: none; }

  /* Coluna de ações → botões lado a lado no rodapé do cartão.
     Escopo pela classe, não por :last-child: em tabela de 3 colunas a
     última célula é DADO (ex.: "Desde", "Status"), e ela precisa do
     rótulo como qualquer outra. */
  .table-cards td.cell-actions {
    justify-content: flex-start;
    flex-wrap: wrap;
    gap: 8px;
    margin-top: 10px;
  }
  .table-cards td.cell-actions::before { content: none; }

  /* "Nenhum registro encontrado" continua sendo uma linha de texto */
  .table-cards td[colspan] {
    display: block;
    text-align: left;
    font-weight: 400;
    border-bottom: none;
    font-size: .89rem;
    margin: 0;
    padding: 0;
  }
  .table-cards td[colspan]::before { content: none; }
}


@media (max-width: 560px) {
  :root { --radius: 18px; }

  .card            { padding: 16px; }
  .admin-body main { padding: 20px 14px 60px; }
  .panel-body main { padding: 20px 14px 80px; }
  .login-body      { padding: 16px; }
  .login-box       { padding: 24px 20px; }

  /* ── Barra do painel do tutor ──────────────────────────────
     Cabe em uma linha só escondendo o nome do pet (que aparece logo
     abaixo, no card "Meu Pet") e usando o rótulo curto do botão de
     pré-visualização.                                            */
  .panel-body nav { padding: 8px 14px; gap: 10px; }
  .nav-pet-name   { display: none; }
  .preview-btn .lbl-full  { display: none; }
  .preview-btn .lbl-short { display: inline; }

  /* ── Filtros empilhados, todos em largura total ────────────── */
  .filter-bar { flex-direction: column; align-items: stretch; }
  .filter-bar > *,
  .filter-bar input[type="text"],
  .filter-bar select { width: 100%; flex: none; }
  .filter-date       { justify-content: space-between; }
  .filter-date input { width: 100%; min-width: 0; }
  /* Empilhado, "+ Gerar tags" ficava colado em "Filtrar" e os dois
     laranja pareciam o mesmo botão — o respiro separa as duas ações. */
  .filter-push       { margin-left: 0; margin-top: 6px; }

  /* ── Dashboard ─────────────────────────────────────────────
     Respiro menor e 2 colunas garantidas em qualquer aparelho.  */
  .stat-grid { grid-template-columns: repeat(2, 1fr); gap: 10px; margin-bottom: 14px; }
  .stat      { padding: 14px 10px; }

  /* ── Linhas de edição (contatos, links, vacinas) ───────────
     Três campos lado a lado não cabem em 360px.                 */
  .edit-row { flex-direction: column; align-items: stretch; }
  /* :not(radio/checkbox) é essencial: com width:100% no rádio, o
     "Principal" era empurrado para a direita e a bolinha ficava
     solta no meio da linha. */
  .edit-row input:not([type="radio"]):not([type="checkbox"]),
  .edit-row select { max-width: none; min-width: 0; width: 100%; }
  .edit-row .btn   { width: 100%; }

  /* País e número empilham: lado a lado em 360px sobra pouco espaço
     para o número, que é o campo que a pessoa precisa conferir. */
  .wa-row  { flex-direction: column; align-items: stretch; }
  .wa-dial { max-width: none; width: 100%; }
  .wa-dial-inline { max-width: none; width: 100%; }

  /* "Principal" alinhado à esquerda, colado na bolinha */
  .primary-radio {
    justify-content: flex-start;
    gap: 8px;
    min-height: 32px;
  }

  .report-actions .btn   { flex: 1 1 auto; }
  .theme-grid .theme-btn { flex: 1 1 calc(50% - 5px); }

  .pager { gap: 10px; font-size: .8rem; }
}


/* ── 9. IMPRESSÃO DE CARTÕES DO LOTE ─────────────────────────
   Cartõezinhos com código + senha + URL, para acompanhar a tag
   na embalagem. Só aparecem no print; na tela ficam ocultos.  */

.print-sheet { display: none; }

@media print {
  nav, .no-print, .page-title, .msg { display: none !important; }
  body { background: #fff; color: #000; }

  .print-sheet {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 8mm;
  }
  .print-card {
    border: 1px dashed #999;
    border-radius: 4mm;
    padding: 6mm;
    page-break-inside: avoid;
    text-align: center;
    font-family: 'Nunito', sans-serif;
  }
  .print-brand { font-family: 'Baloo 2', sans-serif; font-weight: 800; font-size: 12pt; margin-bottom: 3mm; }
  .print-url   { font-size: 9pt; margin-bottom: 3mm; word-break: break-all; }
  .print-cred  { font-size: 10pt; }
}
