/* Furadouro SPA — erros por campo, estados vazios e de carga (site público); o ecrã de sucesso passou a assets/final-v3.css (3.0 F7).
   Camada própria da versão 3.0: usa os tokens de luxo.css; só opacity/transform animados. */

/* ---------- Ecrã final «A sua visita» (3.0 F7): assets/final-v3.css ---------------------------------------------- */

/* ---------- Erros junto ao campo ----------------------------------------------------------- */
body.site-publico .campo-erro {
  display: block;
  margin: 0.45rem 0 0;
  font-family: var(--sans);
  font-size: 0.9rem;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  line-height: 1.4;
  color: #7a2f17;
}
body.site-publico .aceite + .campo-erro, body.site-publico .metodo-pagamento + .campo-erro { margin: -0.4rem 0 1rem; }
body.site-publico input[aria-invalid="true"] { border-color: var(--coral) !important; box-shadow: 0 0 0 3px rgba(180, 86, 47, 0.16); }
body.site-publico .aceite input[aria-invalid="true"], body.site-publico .radio input[aria-invalid="true"] { outline: 2px solid var(--coral); outline-offset: 2px; box-shadow: none; }

.espera { margin: 0.5rem 0 0; font-variant-numeric: lining-nums tabular-nums; }
.so-leitor { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }

/* ---------- Estados: a carregar, vazio, erro com «Tentar novamente» ----------------------------- */
body.site-publico .estado-cheio { grid-column: 1 / -1; }
body.site-publico .estado-carga { margin: 0; padding: 0.4rem 0; color: var(--tinta-suave); }
body.site-publico .estado-vazio,
body.site-publico .estado-erro {
  margin: 0;
  padding: 1.1rem 1.2rem;
  border-radius: 18px;
  max-width: 40rem;
}
body.site-publico .estado-vazio { background: var(--pergaminho-2); box-shadow: inset 0 0 0 1px var(--linha-solida); color: var(--tinta); }
body.site-publico .estado-erro { background: var(--coral-fundo); box-shadow: inset 0 0 0 1px rgba(180, 86, 47, 0.35); color: #7a2f17; }
body.site-publico .estado-vazio p, body.site-publico .estado-erro p { margin: 0 0 0.9rem; }
body.site-publico .estado-vazio > p:last-child, body.site-publico .estado-erro > p:last-child { margin-bottom: 0; }
body.site-publico .estado-vazio .btn, body.site-publico .estado-erro .btn { min-height: 44px; }
body.site-publico p.estado-vazio { margin: 0; }

/* ---------- Carrinho: item a rever ------------------------------------------------------------- */
body.site-publico .carrinho-aviso {
  grid-column: 1 / -1;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 0.7rem 1rem;
  margin-top: 0.7rem;
  padding: 0.8rem 1rem;
  border-radius: 14px;
  background: var(--coral-fundo);
  box-shadow: inset 0 0 0 1px rgba(180, 86, 47, 0.35);
}
body.site-publico .carrinho-aviso p { margin: 0; color: #7a2f17; flex: 1 1 14rem; }
body.site-publico .carrinho-aviso .btn { min-height: 44px; padding-top: 0.4rem; padding-bottom: 0.4rem; }

/* a faixa «Reservar agora» do telemóvel não faz sentido depois de a marcação estar registada */
body.site-publico:has(#passo-sucesso:not(.oculto)) .cta-movel { display: none; }
body.site-publico:has(#passo-sucesso:not(.oculto)) .barra-movel { display: none; }

/* ---------- Acessibilidade: foco programático e anúncios ------------------------------------------------ */
/* Títulos e contentor que recebem foco por código (tabindex -1) não são controlos: sem anel, para não «piscar» ao mudar de passo. */
body.site-publico #app:focus,
body.site-publico .passo h2[tabindex="-1"]:focus,
body.site-publico .passo h3[tabindex="-1"]:focus,
body.site-publico #guia-menu [tabindex="-1"]:focus,
body.site-publico #lista-servicos .ts-titulo:focus,
body.site-publico .erro[tabindex="-1"]:focus { outline: none; }
/* o anúncio do leitor de ecrã nunca ocupa espaço */
#anuncio { position: absolute; }
/* erro do calendário (.ics) por baixo dos botões do ecrã de sucesso */
#sucesso-ics-erro { margin: 0.9rem 0 0; }
#sucesso-ics-erro:empty { display: none; }
