/*
Theme Name: JLR Climatizações
Theme URI: https://www.jlrfafe.pt/
Author: Agilstore
Author URI: https://agilstore.pt
Description: Tema clássico da JLR Climatizações — landing page one-page, catálogo de material AVAC gerido por Custom Post Type e páginas legais. Conversão fiel do site estático original.
Version: 1.0.0
Requires at least: 6.3
Tested up to: 6.7
Requires PHP: 7.4
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: jlr-climatizacoes
Tags: one-page, custom-post-type, catalog, portuguese
*/
/* =====================================================================
   JLR CLIMATIZAÇÕES — Sistema de design
   ---------------------------------------------------------------------
   PILAR 2 · CORES — Regra 60-30-10
     60%  Branco / neutro (--bg / --surface)     fundos e áreas maiores
     30%  Azul-petróleo   (--navy-*)             cor institucional
     10%  Azul-água       (--accent)             botões, links, CTA
     +    Azul-céu        (--copper)             rima visual (fios, detalhes)

     Os dois azuis saem do próprio logótipo (LOGO 2.svg): #3595AE e #4FA2DA.
     O --accent é escurecido para #1E7A94 para o texto branco dos botões
     passar o contraste AA (5,0:1 — o azul do logótipo dava só 3,6:1).

   PILAR 3 · TIPOGRAFIA — dois níveis
     Geral (títulos, corpo, subtítulos)   Manrope         (sans-serif, uniforme)
     Labels/ref                           IBM Plex Mono   (carácter de engenharia)

   SISTEMA DE ÊNFASE — opacidade
     Alta   65–100%   títulos e informação principal
     Média  ~60%      subtítulos e informação secundária
     Baixa  5–40%     apoio, linhas, detalhes
   ===================================================================== */

/* ---------- 0. Tokens ---------- */
:root{
  /* 60% — dominante */
  --bg:            #F3F8FA;
  --bg-2:          #E4EFF4;
  --surface:       #FFFFFF;

  /* 30% — institucional */
  --navy-900:      #072B37;
  --navy-800:      #0C3A4A;
  --navy-700:      #14536A;
  --navy-600:      #1E7A94;
  --navy-050:      #E9F5F8;

  /* 10% — destaque / CTA */
  --accent:        #1E7A94;
  --accent-600:    #155E73;
  --accent-050:    #E7F4F8;

  /* rima visual */
  --copper:        #4FA2DA;
  --cyan:          #4FA2DA;
  --cyan-200:      #8FD3E8;      /* o mesmo azul, aclarado para fundos escuros */

  /* ênfase textual */
  --txt-high:      rgba(7,43,55,.96);
  --txt-mid:       rgba(7,43,55,.62);
  --txt-low:       rgba(7,43,55,.38);
  --txt-faint:     rgba(7,43,55,.16);

  --on-dark-high:  rgba(255,255,255,.97);
  --on-dark-mid:   rgba(255,255,255,.62);
  --on-dark-low:   rgba(255,255,255,.34);

  --line:          rgba(7,43,55,.10);
  --line-strong:   rgba(7,43,55,.18);
  --line-dark:     rgba(255,255,255,.13);

  /* forma — um só raio, para todos os cantos rimarem */
  --r-xs: 10px;
  --r-sm: 10px;
  --r:    10px;
  --r-lg: 10px;
  --r-xl: 10px;
  --r-pill: 10px;

  /* profundidade — três degraus, e só três.
     Quase todas as superfícies já têm um contorno (--line) a marcar o limite;
     a sombra só precisa de sugerir que a peça assenta por cima, não de a
     descolar da página. Por isso os valores são baixos de propósito:
       sh-1  peças assentes no fluxo (cartões, etiquetas)
       sh-2  o mesmo, ao passar o rato, ou painéis que sobressaem
       sh-3  o que flutua mesmo por cima de tudo (avisos, gaveta, menu) */
  --sh-1: 0 1px 2px rgba(7,43,55,.04);
  --sh-2: 0 1px 2px rgba(7,43,55,.04), 0 6px 16px -8px rgba(7,43,55,.10);
  --sh-3: 0 2px 6px rgba(7,43,55,.05), 0 16px 32px -16px rgba(7,43,55,.14);
  --sh-accent: 0 4px 12px -6px rgba(30,122,148,.30);

  /* tipografia — a fonte vem de assets/css/fonts.css, alojada connosco.
     A cadeia de recurso só entra em jogo se o ficheiro falhar a carregar. */
  --f-head: "Instrument Sans", -apple-system, "Segoe UI", system-ui, sans-serif;
  --f-body: "Instrument Sans", -apple-system, "Segoe UI", system-ui, sans-serif;
  --f-sub:  "Instrument Sans", -apple-system, "Segoe UI", system-ui, sans-serif;
  --f-mono: "IBM Plex Mono", ui-monospace, "Cascadia Mono", Consolas, monospace;
  /* Voz de cartaz — o desenho novo reserva a Inter para o que grita: a marca
     no cabecalho, o hero, o titulo dos contactos e o rodape inteiro. Tudo o
     resto (navegacao, cartoes, formularios) continua em Instrument Sans. */
  --f-display: "Inter", -apple-system, "Segoe UI", system-ui, sans-serif;

  /* ritmo */
  --gap:   clamp(1.1rem, 2.2vw, 1.75rem);
  --sec-y: clamp(4rem, 9vw, 7.5rem);
  --pad-x: clamp(1.15rem, 4vw, 2.5rem);

  /* Altura do cabeçalho: encolhe sem degraus, do telemóvel à secretária.
     O JS lê a altura real para posicionar o menu, por isso acompanha. */
  --head-h: clamp(66px, 52px + 3.4vw, 86px);

  --ease: cubic-bezier(.22,.61,.36,1);
}

/* ---------- 1. Base ---------- */
*,*::before,*::after{ box-sizing:border-box; }
/* o `display` do autor vence o do atributo `hidden` — sem isto, blocos
   escondidos por JS (ex.: .form__ok) ficam sempre à vista */
[hidden]{ display:none !important; }
html{ -webkit-text-size-adjust:100%; scroll-behavior:smooth; scroll-padding-top:calc(var(--head-h) + 22px); }
body{
  margin:0;
  font-family:var(--f-body);
  font-size:clamp(1rem,.97rem + .18vw,1.075rem);
  line-height:1.65;
  color:var(--txt-high);
  background:var(--bg);
  -webkit-font-smoothing:antialiased;
  overflow-x:hidden;
}
/* Profundidade: textura de ruído global, muito subtil */
body::before{
  content:"";
  position:fixed; inset:0; z-index:0; pointer-events:none;
  opacity:.035;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='160' height='160' filter='url(%23n)'/%3E%3C/svg%3E");
}
img,svg{ max-width:100%; display:block; }
img{ height:auto; }
a{ color:inherit; text-decoration:none; }
button,input,select,textarea{ font:inherit; color:inherit; }
button{ cursor:pointer; background:none; border:0; }
ul,ol{ margin:0; padding:0; list-style:none; }
p{ margin:0 0 1em; }
:focus-visible{ outline:3px solid var(--accent); outline-offset:3px; border-radius:4px; }

.sr-only{
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;
}
.skip-link{
  position:fixed; top:-100px; left:16px; z-index:200;
  background:var(--navy-800); color:#fff; padding:.75rem 1.15rem;
  border-radius:var(--r-xs); font-weight:600; transition:top .2s var(--ease);
}
.skip-link:focus{ top:16px; }
.sprite{ position:absolute; width:0; height:0; overflow:hidden; }

.container{
  width:min(1220px, 100%);
  margin-inline:auto;
  padding-inline:var(--pad-x);
  position:relative; z-index:1;
}
.container--narrow{ width:min(880px, 100%); }

/* ---------- 2. Tipografia ---------- */
.h1,.h2,.h3,h1,h2,h3{
  font-family:var(--f-head);
  font-weight:700;
  line-height:1.08;
  letter-spacing:0;
  margin:0 0 .55em;
  color:var(--txt-high);
  text-wrap:balance;
}
.h1{ font-size:clamp(2.35rem, 1.4rem + 4.2vw, 4.15rem); }
.h2{ font-size:clamp(1.85rem, 1.25rem + 2.5vw, 3rem); }
.h3{ font-size:clamp(1.12rem, 1rem + .5vw, 1.4rem); line-height:1.25; }

.h1 .hl{
  color:var(--accent);
  position:relative;
  white-space:nowrap;
}
.h1 .hl::after{           /* rima visual: sublinhado em cobre */
  content:""; position:absolute; left:0; right:0; bottom:.06em; height:.11em;
  background:linear-gradient(90deg,var(--copper),rgba(79,162,218,0));
  border-radius:var(--r-pill); opacity:.55;
}

/* destaque a cor sem o sublinhado; mantém-se inteiro na mesma linha */
.h1 .hl--plain{ white-space:nowrap; }
.h1 .hl--plain::after{ content:none; }

.lead{
  font-family:var(--f-sub);
  font-size:clamp(1.05rem,1rem + .4vw,1.24rem);
  color:var(--txt-mid);           /* ênfase média */
  max-width:60ch;
}
.lead strong{ color:var(--txt-high); font-weight:600; }
.lead--light{ color:var(--on-dark-mid); }
.lead--light strong{ color:var(--on-dark-high); }

/* Eyebrow — terceira fonte (mono) + rima visual do traço */
.eyebrow{
  display:flex; align-items:center; gap:.7rem;
  font-family:var(--f-mono); font-size:.78rem; font-weight:500;
  letter-spacing:.16em; text-transform:uppercase;
  color:var(--accent); margin:0 0 1rem;
}
.eyebrow__line{
  width:34px; height:2px; border-radius:var(--r-pill); flex:none;
  background:linear-gradient(90deg,var(--accent),var(--copper));
}
.eyebrow--light{ color:var(--cyan-200); }

/* ---------- 3. Botões ---------- */
.btn{
  --btn-bg:var(--navy-800); --btn-fg:#fff; --btn-bd:transparent;
  display:inline-flex; align-items:center; justify-content:center; gap:.55rem;
  padding:.78rem 1.35rem;
  background:var(--btn-bg); color:var(--btn-fg);
  border:.8px solid var(--btn-bd);
  border-radius:var(--r-pill);
  font-weight:600; font-size:.95rem; line-height:1.65; letter-spacing:-.01em;
  white-space:nowrap;
  transition:transform .18s var(--ease), box-shadow .25s var(--ease), background .2s var(--ease), color .2s var(--ease), border-color .2s var(--ease);
}
.btn:hover{ transform:translateY(-2px); }
.btn:active{ transform:translateY(0); }
.btn .ico{ width:18px; height:18px; transition:transform .25s var(--ease); }
.btn:hover .ico{ transform:translateX(3px); }

.btn--accent{ --btn-bg:var(--accent); box-shadow:var(--sh-accent); }
.btn--accent:hover{ --btn-bg:var(--accent-600); box-shadow:0 6px 16px -8px rgba(30,122,148,.38); }

/* Azul-petróleo cheio — o botão "Contactos" do cabeçalho. Leva a mesma
   sombra do accent: no desenho novo os dois botões assentam da mesma forma. */
.btn--navy{ --btn-bg:var(--navy-800); box-shadow:var(--sh-accent); }
.btn--navy:hover{ --btn-bg:var(--navy-900); box-shadow:0 6px 16px -8px rgba(30,122,148,.38); }

.btn--outline{ --btn-bg:transparent; --btn-fg:#0C3A4A; --btn-bd:var(--line-strong); }
.btn--outline:hover{ --btn-bd:var(--navy-800); background:rgba(12,58,74,.04); }

.btn--ghost{ --btn-bg:transparent; --btn-fg:var(--txt-mid); }
.btn--ghost:hover{ --btn-fg:var(--navy-800); background:rgba(12,58,74,.06); }

/* Secundário sobre fundo escuro — contorno claro, sem preencher */
.btn--outline-light{ --btn-bg:transparent; --btn-fg:var(--on-dark-high); --btn-bd:rgba(255,255,255,.42); }
.btn--outline-light:hover{ --btn-bd:#fff; background:rgba(255,255,255,.12); }

/* Secundário sobre fundo claro — superfície branca, não transparente */
.btn--soft{ --btn-bg:var(--surface); --btn-fg:var(--navy-800); --btn-bd:var(--line); box-shadow:var(--sh-1); }
.btn--soft:hover{ --btn-bd:var(--line-strong); box-shadow:var(--sh-2); }

.btn .ico--static{ transition:none; }
.btn:hover .ico--static{ transform:none; }

.btn--lg{ padding:1rem 1.75rem; font-size:1.02rem; }
.btn--block{ display:flex; width:100%; }

.linkbtn{
  font-size:.86rem; font-weight:600; color:var(--txt-mid);
  text-decoration:underline; text-underline-offset:3px;
}
.linkbtn:hover{ color:var(--accent); }
.linkbtn--danger:hover{ color:#B91C1C; }

.iconbtn{
  position:relative;
  width:44px; height:44px; display:grid; place-items:center;
  border-radius:var(--r-sm); color:var(--navy-800);
  transition:background .2s var(--ease);
}
.iconbtn:hover{ background:rgba(12,58,74,.07); }

.ico{ width:19px; height:19px; flex:none; }
.ico--lg{ width:24px; height:24px; }
.ico--xl{ width:40px; height:40px; }

/* ---------- 4. Cabeçalho ---------- */
/* A barra atravessa o ecrã de ponta a ponta: no desenho novo a marca encosta
   à goteira da janela (40px), e não à do conteúdo — que é mais estreita, por
   ficar dentro dos 1220px. É de propósito, e não um desalinhamento. */
.header{
  position:sticky; top:0; z-index:70;
  background:rgba(243,248,250,.86);
  backdrop-filter:blur(14px) saturate(1.4);
  -webkit-backdrop-filter:blur(14px) saturate(1.4);
  border-bottom:1px solid transparent;
  transition:box-shadow .3s var(--ease), border-color .3s var(--ease), background .3s var(--ease);
}
.header.is-stuck{ border-bottom-color:var(--line); box-shadow:0 4px 16px -12px rgba(7,43,55,.16); background:rgba(243,248,250,.95); }
.header__inner{
  width:100%; margin-inline:0;
  display:flex; align-items:center;
  gap:clamp(.75rem, .3rem + 1.6vw, 1.25rem);
  min-height:var(--head-h);
}

/* Marca e ícones escalam por clamp: em ecrãs estreitos ficam menores, nunca
   desalinhados nem escondidos — o desenho é o mesmo, só mais pequeno. */
.brand{ display:flex; align-items:center; gap:clamp(.45rem, .2rem + .8vw, .7rem); flex:none; min-width:0; }
.brand__mark{
  width:clamp(32px, 20px + 3vw, 42px); aspect-ratio:1;
  flex:none; display:grid; place-items:center;
  border-radius:var(--r-sm); color:#fff;
  background:linear-gradient(145deg,var(--navy-700),var(--navy-900));
  box-shadow:var(--sh-1), inset 0 1px 0 rgba(255,255,255,.16);
}
.brand__mark svg{ width:62%; height:62%; }
.brand__mark-accent{ stroke:#8FD3E8; }        /* brilho dentro da gota */
/* O logótipo oficial carrega a marca toda — a gota, as letras e a linha de
   baixo com o nome da empresa —, e por isso pede bastante mais altura do que
   pedia quando era só um símbolo ao lado de uma assinatura de texto. A barra
   do cabeçalho subiu com ele: sem isso a linha do nome não se lia. */
.brand__logo{ height:clamp(46px, 30px + 3.6vw, 68px); width:auto; flex:none; }

/* Assinatura de texto — as três letras em Inter, o peso mais pesado da
   família. É o que o desenho novo põe no cabeçalho, no lugar do logótipo
   desenhado (que continua no rodapé). */
.brand__wordmark{
  font-family:var(--f-display); font-weight:800;
  font-size:clamp(1.75rem, 1.1rem + 2.1vw, 2.5rem);
  line-height:1.2; letter-spacing:-.01em;
  color:var(--navy-800);
}
.brand--light .brand__wordmark{ color:#fff; }
.brand__txt{ display:flex; flex-direction:column; line-height:1; }
.brand__txt strong{ font-family:var(--f-head); font-weight:600; font-size:1.28rem; letter-spacing:-.005em; color:var(--navy-900); }
.brand__txt em{ font-family:var(--f-mono); font-style:normal; font-size:.63rem; letter-spacing:.19em; text-transform:uppercase; color:var(--txt-low); margin-top:.28rem; }

/* Tudo encostado à direita menos a marca. O .brand fica sozinho à esquerda e
   empurra o resto com margin-right:auto; a navegação, o botão de contactos e
   os ícones viajam juntos no canto direito. Já não há duas colunas laterais a
   repartir o espaço para centrar o menu — era isso que o flex:1 1 0 fazia. */
.header__inner > .brand{ flex:0 0 auto; min-width:0; margin-right:auto; }
.nav{ flex:0 0 auto; display:flex; align-items:center; gap:1.5rem; }
.nav__list{ display:flex; align-items:center; gap:.15rem; }
.nav__link{
  position:relative; display:block; padding:.55rem .7rem;
  font-size:.92rem; font-weight:500; line-height:1.65; color:var(--txt-mid);
  border-radius:var(--r-xs); transition:color .2s var(--ease), background .2s var(--ease);
}
.nav__link:hover{ color:var(--navy-900); background:rgba(12,58,74,.05); }
.nav__link::after{
  content:""; position:absolute; left:.7rem; right:.7rem; bottom:.24rem; height:2px;
  border-radius:var(--r-pill); background:var(--accent);
  transform:scaleX(0); transform-origin:left; transition:transform .25s var(--ease);
}
.nav__link.is-active{ color:var(--navy-900); font-weight:600; }
.nav__link.is-active::after{ transform:scaleX(1); }
.nav__cta{ display:flex; align-items:center; gap:.4rem; }

/* Os dois ícones — pedido e menu — como um par: mesma caixa, mesma linha */
.header__actions{ display:flex; align-items:center; justify-content:flex-end; gap:.5rem; flex:0 0 auto; min-width:0; }
.header__actions .iconbtn{
  width:clamp(40px, 34px + 1.6vw, 44px);
  height:clamp(40px, 34px + 1.6vw, 44px);
}
/* A bolha do pedido é azul-petróleo, como o botão ao lado: no desenho novo
   os dois elementos do canto direito falam a mesma cor. */
.badge{
  position:absolute; top:2px; right:0;
  min-width:20px; height:20px; padding:0 5px;
  display:grid; place-items:center;
  background:var(--navy-800); color:#fff;
  font-family:var(--f-mono); font-size:.68rem; font-weight:500;
  border-radius:var(--r-pill); border:1.6px solid var(--bg);
  transition:transform .25s var(--ease);
}
.badge[data-empty="true"]{ transform:scale(0); }
.badge.is-bump{ animation:bump .4s var(--ease); }
@keyframes bump{ 0%,100%{transform:scale(1)} 45%{transform:scale(1.35)} }

/* O display:flex do hambúrguer substitui o grid do .iconbtn, que era quem
   centrava — sem justify-content as três barras encostavam ao topo da caixa
   e o ícone aparecia mais alto do que o do pedido, ao lado. */
.burger{ display:none; flex-direction:column; justify-content:center; align-items:center; gap:5px; }
.burger span{ width:20px; height:2px; background:var(--navy-800); border-radius:2px; transition:transform .25s var(--ease), opacity .2s var(--ease); }
.burger[aria-expanded="true"] span:nth-child(1){ transform:translateY(7px) rotate(45deg); }
.burger[aria-expanded="true"] span:nth-child(2){ opacity:0; }
.burger[aria-expanded="true"] span:nth-child(3){ transform:translateY(-7px) rotate(-45deg); }

/* ---------- 4b. Cabeçalho sobre o hero ---------- */
/* Enquanto a barra vai a passar por cima da fotografia do hero não tem fundo
   nenhum: nem vidro fosco, nem risco em baixo, nem sombra. Assim que o hero
   acaba, a classe cai e volta o cabeçalho normal — o desfoque de sempre.

   Quem põe e tira a classe .sobre-hero é o app.js (bloco 4): mede a caixa do
   #inicio a cada scroll e compara-a com a altura do cabeçalho. Nas páginas
   sem hero (catálogo, legais) a classe nunca chega a ser posta.

   Por cima da fotografia a barra escreve-se a branco. A sombra do texto é
   discreta de propósito: não escurece a imagem, só assenta as letras contra
   o que estiver por baixo, que muda a cada diapositivo. */
/* Com a barra do WordPress à vista (só para quem tem sessão iniciada), o topo
   do cabeçalho ficava escondido por trás dela. Estes desvios são os que a
   própria barra usa: 32px em ecrã largo, 46px em tablet e nenhum abaixo dos
   600px, onde ela deixa de ser fixa e acompanha o scroll. */
.admin-bar .header{ top:32px; }
@media screen and (max-width:782px){ .admin-bar .header{ top:46px; } }
@media screen and (max-width:600px){ .admin-bar .header{ top:0; } }

.header.sobre-hero{
  background:transparent;
  backdrop-filter:none; -webkit-backdrop-filter:none;
  border-bottom-color:transparent;
  box-shadow:none;
}
.header.sobre-hero .brand__wordmark,
.header.sobre-hero .nav__link,
.header.sobre-hero .iconbtn{ color:#fff; }
.header.sobre-hero .brand__wordmark{ text-shadow:0 2px 18px rgba(0,0,0,.45); }
.header.sobre-hero .nav__link{ text-shadow:0 1px 12px rgba(0,0,0,.5); }
.header.sobre-hero .nav__link:hover{ color:#fff; background:rgba(255,255,255,.14); }
.header.sobre-hero .nav__link.is-active{ color:#fff; }
.header.sobre-hero .nav__link::after{ background:#fff; }
.header.sobre-hero .iconbtn:hover{ background:rgba(255,255,255,.16); }
.header.sobre-hero .burger span{ background:#fff; }

/* O botão de contactos troca de lado: branco cheio com letra azul-petróleo.
   É o elemento com mais peso da barra e, sobre uma fotografia, o branco lê-se
   sempre — o azul do estado normal desaparecia nas zonas escuras. */
.header.sobre-hero .btn--navy{
  --btn-bg:#fff; --btn-fg:var(--navy-900);
  box-shadow:0 10px 26px -14px rgba(0,0,0,.6);
}
.header.sobre-hero .btn--navy:hover{ --btn-bg:#fff; --btn-fg:var(--navy-900); box-shadow:0 12px 28px -14px rgba(0,0,0,.7); }

/* O hero sobe para trás da barra — é o que dá sentido à transparência: por
   baixo do cabeçalho vê-se a fotografia e não o fundo claro da página. O que
   a margem negativa tira, o padding devolve, para o título continuar à mesma
   distância do topo do texto que estava antes. */
/* O 1px a mais é a linha de baixo do cabeçalho: o --head-h mede a barra e a
   borda fica de fora da conta. Sem ele sobrava um risco claro entre o
   cabeçalho e a fotografia. */
body.home #conteudo{ margin-top:calc((var(--head-h) + 1px) * -1); }

/* O hero ocupa o ecrã todo. svh e não vh: no telemóvel o vh conta com a barra
   do browser que desaparece ao rolar, e a fotografia ficava mais alta do que
   o que se vê. O vh fica em cima, como recurso para quem não conheça svh. */
body.home .hero{
  padding-top:calc(clamp(3rem,6vw,5.5rem) + var(--head-h));
  min-height:100vh;
  min-height:100svh;
}
/* Com a barra do WordPress à vista o ecrã útil é menor — só para quem tem
   sessão iniciada. */
body.admin-bar.home .hero{ min-height:calc(100svh - 32px); }
@media screen and (max-width:782px){
  body.admin-bar.home .hero{ min-height:calc(100svh - 46px); }
}

/* ---------- 5. Hero ---------- */
/* Diapositivo a toda a largura: as fotografias cruzam-se ao fundo, um véu
   preto a 30% segura o contraste do texto branco e a composição resume-se a
   duas linhas — o sobretítulo espaçado e o título em caixa alta.

   O desenho novo tirou daqui o parágrafo e os botões: quem chega vê a
   fotografia e a promessa, e a acção está no cabeçalho, sempre à mão.

   --hero-dur acompanha o DUR do app.js (bloco 5b). Mudar um obriga a mudar
   o outro, senão a barra do indicador deixa de bater certo com a troca. */
.hero{
  --hero-dur:6.5s;
  /* --hero-slide acompanha o DESLIZE do app.js (bloco 5b), tal como o
     --hero-dur acompanha o DUR. São dois tempos distintos: um é quanto a
     fotografia demora a entrar, o outro quanto fica parada. */
  --hero-slide:1s;
  position:relative; overflow:hidden;
  display:grid; grid-template-columns:100%; align-content:center;
  min-height:clamp(26rem,66vh,36.75rem);
  padding:clamp(3rem,6vw,5.5rem) 0 clamp(4.5rem,8vw,7rem);
  background:var(--navy-900);
}

/* --- Fundo --- */
/* Sem z-index: o .container tem z-index:1 e chega para o conteúdo ficar
   por cima destas camadas, que são as primeiras do fluxo. */
.hero__slides{ position:absolute; inset:0; overflow:hidden; }
/* Carrossel: cada fotografia espera fora do ecrã, à direita; entra a
   deslizar e sai pela esquerda. Só duas se movem de cada vez e nunca se
   sobrepõem — a que sai e a que entra viajam lado a lado, não empilhadas. */
.hero__slide{
  position:absolute; inset:0;
  width:100%; height:100%;
  object-fit:cover; object-position:center;
  transform:translateX(100%);
  transition:transform var(--hero-slide) var(--ease);
}
.hero__slide.is-on{ transform:translateX(0); }
.hero__slide.is-out{ transform:translateX(-100%); }
/* Vale só no instante em que a fotografia que saiu regressa ao ponto de
   espera. Sem isto, via-se atravessar o ecrã para trás. */
.hero__slide.no-anim{ transition:none; }
/* Enquadramento imagem a imagem: o motivo de cada fotografia não está à
   mesma altura, e num hero largo é o corte vertical que decide o que fica
   à vista. */
.hero__slides .hero__slide:nth-child(1){ object-position:center 15%; }
.hero__slides .hero__slide:nth-child(3){ object-position:center 42%; }

/* Véu de uma só camada: preto a 30%, a toda a largura. Substituiu os três
   degradês que fechavam o lado esquerdo — o texto passou a ocupar menos
   altura e a fotografia ganhou em ler-se inteira. */
.hero__scrim{
  position:absolute; inset:0;
  background:rgba(0,0,0,.30);
}

/* --- Conteúdo --- */
/* O .container centra a coluna na página; o max-width é que mantém o texto
   encostado à esquerda dela, e não esticado até ao outro lado. */
.hero__inner{ min-width:0; }
.hero__copy{ max-width:min(100%,46rem); text-align:left; margin-right:auto; }

/* Título em dois degraus: a primeira linha pequena e muito espaçada, a
   segunda enorme e fechada. O contraste entre as duas é a composição toda. */
.hero__title{ margin:0; max-width:min(100%,44rem); }
.hero__title-a,
.hero__title-b{ display:block; text-transform:uppercase; font-family:var(--f-display); color:#fff; }
.hero__title-a{
  font-size:clamp(.9rem,.7rem + .9vw,1.25rem);
  font-weight:600; line-height:1.25; letter-spacing:.222em;
  text-wrap:balance;
}
.hero__title-b{
  margin-top:.28em;
  font-size:clamp(2.1rem,1.1rem + 3.4vw,3.75rem);
  font-weight:900; line-height:1; letter-spacing:-.017em;
  text-wrap:balance;
}

/* --- Indicadores --- */
/* Barras no fundo do diapositivo, à mesma goteira do texto. A barra ativa
   enche-se ao ritmo do --hero-dur — vê-se quanto falta para a próxima
   imagem sem ser preciso adivinhar. */
.hero__navwrap{ position:absolute; left:0; right:0; bottom:clamp(1.75rem,4vw,3rem); }
.hero__nav{ display:flex; align-items:center; gap:.6rem; }
/* A barra por encher está mais clara do que estava: quem se enche por cima
   dela passou a ser azul-escuro, e sobre um branco a 28% não se via nada. */
.hero__ind{
  position:relative;
  width:2.25rem; height:4px; padding:0;
  border:0; border-radius:var(--r-pill);
  background:rgba(255,255,255,.5);
  cursor:pointer;
  transition:width .35s var(--ease), background .25s var(--ease);
}
/* O alvo do dedo é muito maior do que a barra que se vê */
.hero__ind::before{ content:""; position:absolute; inset:-14px -4px; }
.hero__ind::after{
  content:""; position:absolute; inset:0; border-radius:inherit;
  background:var(--navy-800);
  transform:scaleX(0); transform-origin:left;
}
.hero__ind:hover{ background:rgba(255,255,255,.45); }
.hero__ind.is-on{ width:4.5rem; background:rgba(255,255,255,.45); }
.hero__ind.is-on::after{ animation:heroInd var(--hero-dur) linear forwards; }
@keyframes heroInd{ from{ transform:scaleX(0) } to{ transform:scaleX(1) } }

/* O anel de foco global é azul-água e perde-se sobre o azul-petróleo */
.hero :focus-visible{ outline-color:var(--cyan-200); }

/* ---------- 6. Secções ---------- */
.section{ padding:var(--sec-y) 0; position:relative; }
.section--tight{ padding-block:clamp(2.5rem,5vw,4rem); }
.section--alt{ background:linear-gradient(180deg,var(--bg-2),var(--bg)); border-block:1px solid var(--line); }
.section--dark{ background:var(--navy-900); color:var(--on-dark-high); overflow:hidden; }
.section--dark .h2,.section--dark .h3{ color:var(--on-dark-high); }
.section--dark p{ color:var(--on-dark-mid); }
.dark-bg{ position:absolute; inset:0; z-index:0; pointer-events:none; opacity:.5; }
.section--dark .grid-lines{
  background-image:linear-gradient(var(--line-dark) 1px,transparent 1px),linear-gradient(90deg,var(--line-dark) 1px,transparent 1px);
  mask-image:radial-gradient(ellipse 70% 70% at 50% 0%,#000 10%,transparent 75%);
  -webkit-mask-image:radial-gradient(ellipse 70% 70% at 50% 0%,#000 10%,transparent 75%);
}

.sec-head{ max-width:48.7rem; margin-bottom:clamp(2rem,4vw,3.25rem); }
.sec-head .h2{ margin-bottom:0; }
.sec-head--split{
  max-width:none; display:grid; grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);
  gap:clamp(1rem,4vw,3rem); align-items:end;
}
.sec-head__side{ font-family:var(--f-sub); margin:0; color:var(--txt-mid); font-size:1rem; padding-bottom:.35rem; }
.section--dark .sec-head__side{ color:var(--on-dark-mid); }

/* ---------- 7. Cartão base + as 3 respostas ---------- */
.card{
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:var(--r-lg);
  padding:clamp(1.4rem,3vw,2rem);
  box-shadow:var(--sh-1);
  transition:transform .3s var(--ease), box-shadow .3s var(--ease), border-color .3s var(--ease);
}
.card:hover{ transform:translateY(-4px); box-shadow:var(--sh-2); border-color:var(--line-strong); }
.card p{ margin:0; color:var(--txt-mid); font-size:.97rem; }

.three{ display:grid; grid-template-columns:repeat(3,1fr); gap:var(--gap); }
.card--answer{ position:relative; }
.card--answer .h3{ margin-bottom:.5rem; }

/* ---------- 7b. Sobre nós — faixa fotográfica ---------- */
/* A secção passou a ser uma fotografia a toda a largura com um véu preto a
   65% por cima. Tudo o que lá vive é branco e está centrado: título,
   parágrafo de apresentação e as três respostas — Missão, Visão, Valores —
   agora sem caixa nenhuma, apenas texto sobre a imagem.

   A fotografia entra por --sobre-img, escrita no template a partir do
   Personalizador. Sem imagem escolhida a variável fica vazia e resta o
   azul-petróleo, que é o fundo de reserva declarado a seguir. */
.sobre{
  position:relative;
  /* 41px em cima, 93px em baixo — a folga é assimétrica de propósito: o
     título tem de respirar contra o hero que fica logo acima, e o bloco das
     três respostas precisa de mais chão por baixo do que por cima. */
  padding-block:clamp(2rem,4vw,2.56rem) clamp(3rem,6vw,5.81rem);
  background-color:var(--navy-900);
  background-image:linear-gradient(rgba(0,0,0,.65),rgba(0,0,0,.65)), var(--sobre-img,none);
  background-size:cover;
  background-position:50%;
  color:var(--on-dark-high);
}
.sobre__inner{
  display:flex; flex-direction:column; align-items:center;
  gap:1.75rem;
  text-align:center;
}
.sobre__titulo{
  margin:0; max-width:50.5rem;
  font-family:var(--f-display); font-weight:700;
  font-size:clamp(1.85rem,1.25rem + 2.5vw,3rem); line-height:1.08;
  color:rgba(255,255,255,.96); text-wrap:balance;
}
.sobre__lead{
  margin:0; max-width:54.25rem;
  font-family:var(--f-display);
  font-size:.9375rem; line-height:1.4;
  color:rgba(255,255,255,.96); text-wrap:balance;
}
/* As três respostas: sem fundo, sem contorno, sem sombra — o padding é a
   única coisa que as separa. Era o que o desenho pedia. */
.sobre__grid{
  display:grid; grid-template-columns:repeat(3,1fr);
  gap:1.75rem; width:100%; max-width:59.7rem;
  text-align:left; margin-top:.5rem;
}
.sobre__item{ padding:2rem; border-radius:var(--r-lg); }
.sobre__item h3{
  margin:0 0 .5rem;
  font-family:var(--f-head); font-weight:700;
  font-size:1.4rem; line-height:1.25;
  color:rgba(255,255,255,.96); text-wrap:balance;
}
.sobre__item p{
  margin:0;
  font-family:var(--f-head); font-size:.97rem; line-height:1.65;
  color:rgba(255,255,255,.62);
}
.sobre__item strong{ color:rgba(255,255,255,.96); font-weight:600; }
.sobre :focus-visible{ outline-color:var(--cyan-200); }

@media (max-width:960px){
  .sobre__grid{ grid-template-columns:1fr; gap:.5rem; max-width:34rem; }
  .sobre__item{ padding:1rem 0; }

  /* Em coluna única o texto passa a atravessar a fotografia inteira, e
     apanha zonas claras que no computador ficavam de fora do bloco. A
     sombra assenta as letras sem escurecer mais a imagem — é o mesmo
     recurso, e pela mesma razão, do que se faz no hero. */
  .sobre__inner{ text-shadow:0 1px 3px rgba(0,0,0,.55), 0 2px 14px rgba(0,0,0,.45); }
}

/* ---------- 8. Categorias ---------- */
/* Cada família em foto real de produto, com um gradiente por cima a garantir
   que o texto branco se lê sempre — a mesma peça, seja o fundo claro ou
   escuro. A grelha de 6 colunas dá o cartão largo (Ventilação, span 4) na
   mesma linha que um regular (span 2); a linha seguinte enche-se sozinha
   com os três que restam. */
/* Quatro cartões em linha. O cartão é só a fotografia; o nome fica por
   baixo, fora dele, ao lado da seta que o dá a ler como botão.

   Sem véu por cima da imagem: o texto saiu de lá, e com ele a razão de
   existir do escurecimento que tapava metade da fotografia. */
.cats{ display:grid; grid-template-columns:repeat(4,1fr); gap:var(--gap); }
.cat{
  display:flex; flex-direction:column; gap:.85rem;
  text-decoration:none; color:inherit;
}

/* A moldura da fotografia. É ela que recorta, arredonda e levanta no
   hover — o <a> em si não tem forma nenhuma, para o rótulo de baixo não
   ficar dentro da sombra. */
.cat__media{
  position:relative; overflow:hidden;
  display:flex; align-items:center; justify-content:center;
  /* 3/2 é a proporção de duas das quatro fotografias (2528x1684), que assim
     assentam exatas. As outras duas são 16:9 e sobra-lhes uma faixa estreita
     em cima e em baixo — que é o fundo do cartão, e lê-se como margem. */
  aspect-ratio:3/2;
  padding:clamp(.55rem,1.3vw,1rem);
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:var(--r-lg);
  box-shadow:var(--sh-1);
  transition:transform .3s var(--ease), box-shadow .3s var(--ease);
}
.cat:hover .cat__media{ transform:translateY(-5px); box-shadow:var(--sh-3); }

/* "contain" e não "cover": a fotografia entra inteira, nunca cortada nem a
   transbordar. O max-* impede que uma imagem maior do que a caixa a estique
   — com object-fit sozinho, o <img> continuaria a ocupar o tamanho nativo. */
.cat__img{
  display:block;
  width:100%; height:100%;
  max-width:100%; max-height:100%;
  object-fit:contain;
  border-radius:calc(var(--r-lg) - 12px);
  transition:transform .6s var(--ease);
}
.cat:hover .cat__img{ transform:scale(1.06); }

/* O rótulo: nome e seta, centrados sob a fotografia. */
.cat__foot{
  display:flex; align-items:center; justify-content:center; gap:.45rem;
  padding-inline:.25rem;
}
.cat__name{
  font-family:var(--f-head); font-weight:700;
  font-size:clamp(1rem,.92rem + .35vw,1.18rem); letter-spacing:-.01em;
  line-height:1.2; color:var(--txt-high);
}
.cat__arrow{
  width:17px; height:17px;
  color:var(--accent);
  transition:transform .25s var(--ease);
}
.cat:hover .cat__arrow{ transform:translateX(4px); }
/* O foco assenta no rótulo, que é onde está o nome — o anel à volta do
   cartão inteiro perdia-se contra a fotografia. */
.cat:focus-visible{ outline:none; }
.cat:focus-visible .cat__foot{
  outline:2px solid var(--accent);
  outline-offset:4px;
  border-radius:var(--r-pill);
}

/* ---------- 9. Catálogo ---------- */
.toolbar{
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  flex-wrap:wrap; margin-bottom:1.25rem;
}
.chips{ display:flex; flex-wrap:wrap; gap:.45rem; }
.chip{
  padding:.5rem 1rem; border-radius:var(--r-pill);
  background:var(--surface); border:1px solid var(--line);
  font-size:.88rem; font-weight:500; color:var(--txt-mid);
  transition:all .2s var(--ease);
}
.chip:hover{ border-color:var(--line-strong); color:var(--navy-900); }
.chip.is-active{ background:var(--navy-800); border-color:var(--navy-800); color:#fff; font-weight:600; }

.search{ position:relative; flex:1 1 320px; max-width:420px; }
.search__ico{ position:absolute; left:.95rem; top:50%; transform:translateY(-50%); color:var(--txt-low); pointer-events:none; }
.search input{
  width:100%; padding:.75rem 2.6rem;
  background:var(--surface); border:1px solid var(--line);
  border-radius:var(--r-pill); font-size:.92rem;
  transition:border-color .2s var(--ease), box-shadow .2s var(--ease);
}
.search input::-webkit-search-cancel-button{ display:none; }
.search input:focus{ outline:none; border-color:var(--accent); box-shadow:0 0 0 4px var(--accent-050); }
.search__clear{
  position:absolute; right:.6rem; top:50%; transform:translateY(-50%);
  width:28px; height:28px; border-radius:var(--r); font-size:1.25rem; line-height:1;
  color:var(--txt-mid); display:grid; place-items:center;
}
.search__clear:hover{ background:var(--bg-2); color:var(--navy-900); }

.results{ font-family:var(--f-mono); font-size:.78rem; letter-spacing:.06em; color:var(--txt-low); margin:0 0 1.25rem; }

.produtos{ display:grid; grid-template-columns:repeat(auto-fill,minmax(255px,1fr)); gap:var(--gap); }
/* As três camadas do cartão saem todas do azul-petróleo institucional:
   a moldura exterior é a mais clara, o contorno da foto o mais escuro. */
.prod{
  --prod-base:   var(--surface);    /* fundo branco */
  --prod-frame:  #E8EFF4;           /* contorno da foto e etiquetas */
  --prod-panel:  #F3F8FA;           /* fundo atrás da foto */
  display:flex; flex-direction:column; gap:.5rem;
  background:var(--prod-base);
  border:.8px solid var(--line);
  border-radius:var(--r); padding:.5rem; box-shadow:var(--sh-1);
  transition:transform .28s var(--ease), box-shadow .28s var(--ease), border-color .28s var(--ease);
  animation:prodEntra .7s var(--ease-rv) backwards;
}
.prod:hover{ transform:translateY(-4px); box-shadow:var(--sh-2); border-color:rgba(30,122,148,.35); }
@keyframes fadeUp{ from{ opacity:0; transform:translateY(14px) } to{ opacity:1; transform:none } }
/* Os cartões entram como tudo o resto: de lado e de baixo. O 'backwards'
   (em vez de 'both') larga o transform quando acaba — e só assim o
   translateY do :hover volta a pegar. */
@keyframes prodEntra{
  from{ opacity:0; transform:translate3d(var(--rv-x,-40px),34px,0) scale(.96) }
  to  { opacity:1; transform:none }
}
.produtos .prod:nth-child(2n){ --rv-x:40px }
@media (max-width:680px){
  .produtos .prod{ --rv-x:-16px }
  .produtos .prod:nth-child(2n){ --rv-x:16px }
}

.prod__media{
  position:relative; overflow:hidden;
  border-radius:var(--r);
  background:linear-gradient(155deg,var(--prod-panel),var(--prod-frame));
}
.prod__media img{
  display:block; width:100%; aspect-ratio:3/2; object-fit:contain; padding:1.1rem; box-sizing:border-box;
}
/* Selo de stock — pequena etiqueta flutuante sobre a foto, em vez de barra */
.prod__banner{
  position:absolute; top:.7rem; left:.7rem; z-index:1;
  padding:.32rem .7rem; border-radius:var(--r-pill);
  background:rgba(255,255,255,.92); backdrop-filter:blur(4px);
  color:var(--accent-600);
  font-family:var(--f-mono); font-size:.66rem; font-weight:600; letter-spacing:.03em;
}
.prod__banner[data-stock="encomenda"]{ color:#B45309; }

.prod__body{ display:flex; flex-direction:column; gap:.5rem; padding:1.15rem 1rem 1.1rem; flex:1; }
.prod__ref{ font-family:var(--f-mono); font-size:.68rem; letter-spacing:.08em; text-transform:uppercase; color:var(--accent); }
/* O nome ocupa a largura toda: em coluna estreita as palavras compridas do
   catálogo ("Recuperador", "helicoidal") partiam-se a meio. */
.prod__name{ font-weight:700; font-size:1.04rem; line-height:1.3; letter-spacing:0; margin:0; color:var(--navy-900); text-wrap:balance; }
/* Especificações em linha corrida, separadas por ponto — não em pastilhas */
.prod__tags{ display:flex; flex-wrap:wrap; font-family:var(--f-sub); font-size:.85rem; color:var(--txt-mid); }
.prod__tags li{ list-style:none; white-space:nowrap; }
.prod__tags li:not(:last-child)::after{ content:"·"; margin:0 .38rem; color:var(--txt-faint); }
/* Preço e ação lado a lado */
.prod__foot{ margin-top:auto; padding-top:.65rem; display:flex; align-items:center; justify-content:space-between; gap:.75rem; }
.prod__divider{ display:none; }
.prod__price{
  flex:1; min-width:0;
  font-family:var(--f-mono); font-size:.78rem; color:var(--txt-low);
  white-space:nowrap;
}
.prod__add{
  flex:none;
  padding:.5rem 1.05rem; border-radius:var(--r-pill);
  background:var(--accent-050);
  font-family:var(--f-sub); font-size:.85rem; font-weight:700; color:var(--accent);
  transition:background .2s var(--ease), color .2s var(--ease);
}
.prod__add:hover{ background:var(--accent); color:#fff; }
.prod__add.is-added{ background:var(--accent); color:#fff; }

.empty{
  text-align:center; padding:clamp(2.5rem,6vw,4rem) 1rem;
  border:1px dashed var(--line-strong); border-radius:var(--r-lg);
  background:var(--surface);
}
.empty .ico{ color:var(--txt-faint); margin:0 auto 1rem; }
.empty p{ color:var(--txt-mid); max-width:46ch; margin:0 auto 1.5rem; }
.loadmore{ display:flex; justify-content:center; margin-top:2.25rem; }

/* ---------- 9b. Página do catálogo — cabeçalho e filtros laterais ---------- */
.cat-hero{ padding:clamp(2.25rem,5vw,3.5rem) 0; border-bottom:1px solid var(--line); }
.cat-hero__inner{
  display:flex; align-items:flex-end; justify-content:space-between; gap:clamp(1.5rem,4vw,3rem); flex-wrap:wrap;
}
.cat-hero__copy{ max-width:34rem; }
.cat-hero .h1{ font-size:clamp(2rem,1.4rem + 2.4vw,3rem); margin-bottom:.4em; }
.cat-hero .lead{ margin:0; }
.cat-hero .search{ flex:0 0 340px; max-width:100%; }

.catalog-layout{ display:grid; grid-template-columns:260px minmax(0,1fr); gap:clamp(2rem,4vw,3.5rem); align-items:start; }

.filters{ display:flex; flex-direction:column; gap:1.9rem; position:sticky; top:calc(var(--head-h) + 24px); }
.filters__head{ display:flex; align-items:center; justify-content:space-between; }
.filters__head h2{ margin:0; }
.filters__clear{ font-family:var(--f-sub); font-size:.85rem; font-weight:600; color:var(--accent); }
.filters__clear:hover{ color:var(--accent-600); }
.filters__group{ display:flex; flex-direction:column; gap:.9rem; }
.filters__label{ font-family:var(--f-mono); font-size:.7rem; font-weight:500; letter-spacing:.1em; text-transform:uppercase; color:var(--txt-low); }
.filters__divider{ height:1px; background:var(--line); border:0; margin:0; }

/* Família — mesmos botões .chip do catálogo, em coluna e com contagem */
.chips--vertical{ display:flex; flex-direction:column; gap:.15rem; }
.chips--vertical .chip{
  display:flex; align-items:center; justify-content:space-between; gap:.75rem;
  width:100%; padding:.55rem .15rem;
  background:none; border:0; border-radius:var(--r-xs);
  font-size:.92rem; font-weight:500; color:var(--txt-mid);
}
.chips--vertical .chip:hover{ color:var(--navy-900); }
.chips--vertical .chip.is-active{ background:none; color:var(--navy-900); font-weight:700; }
.chips--vertical .chip::before{
  content:""; flex:none; width:8px; height:8px; border-radius:50%;
  border:1.5px solid var(--line-strong); transition:all .2s var(--ease);
}
.chips--vertical .chip.is-active::before{ background:var(--accent); border-color:var(--accent); }
.chips--vertical .chip [data-count]{ font-family:var(--f-mono); font-size:.78rem; color:var(--txt-faint); margin-left:auto; }

/* Marca — checkboxes reais, multi-seleção */
.brandlist{ display:flex; flex-direction:column; gap:.15rem; }
.brandbox{
  display:flex; align-items:center; gap:.65rem;
  width:100%; padding:.4rem .15rem;
  background:none; border:0; font-size:.92rem; color:var(--txt-mid);
}
.brandbox__box{
  flex:none; width:17px; height:17px; border-radius:5px;
  border:1.5px solid var(--line-strong); transition:all .2s var(--ease);
}
.brandbox.is-checked .brandbox__box{
  background:var(--accent); border-color:var(--accent);
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 12.5l5 5L20 6.5' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat; background-position:center; background-size:65%;
}
.brandbox:hover .brandbox__box{ border-color:var(--accent); }
.brandbox.is-checked .brandbox__name{ color:var(--navy-900); font-weight:600; }
.brandbox__count{ margin-left:auto; font-family:var(--f-mono); font-size:.78rem; color:var(--txt-faint); }

.filters__promo{
  display:flex; flex-direction:column; gap:.5rem;
  padding:1.25rem; background:var(--accent-050); border-radius:var(--r-lg);
}
.filters__promo strong{ font-size:.92rem; color:var(--navy-900); }
.filters__promo p{ margin:0; font-size:.83rem; line-height:1.5; color:var(--txt-mid); }
.filters__promo a{ font-size:.83rem; font-weight:700; color:var(--accent); }
.filters__promo a:hover{ color:var(--accent-600); }

/* ---------- 10. Processo ---------- */
.steps{ display:grid; grid-template-columns:repeat(4,1fr); gap:var(--gap); }
.step{ position:relative; padding-top:1.75rem; }
.step::before{        /* linha-guia: rima visual */
  content:""; position:absolute; top:0; left:0; right:0; height:2px;
  background:var(--line);
}
.step::after{
  content:""; position:absolute; top:0; left:0; width:38%; height:2px;
  background:linear-gradient(90deg,var(--accent),var(--copper));
  transition:width .45s var(--ease);
}
.step:hover::after{ width:100%; }
.step .h3{ margin-bottom:.4rem; }
.step p{ font-family:var(--f-sub); margin:0; color:var(--txt-mid); font-size:.94rem; }

/* ---------- 11. Confiança ---------- */
.feats{ display:grid; grid-template-columns:repeat(3,1fr); gap:var(--gap); }
.feat{
  padding:clamp(1.4rem,3vw,1.9rem);
  background:rgba(255,255,255,.04);
  border:1px solid var(--line-dark);
  border-radius:var(--r-lg);
  backdrop-filter:blur(6px);
  transition:transform .3s var(--ease), background .3s var(--ease), border-color .3s var(--ease);
}
.feat:hover{ transform:translateY(-4px); background:rgba(255,255,255,.07); border-color:rgba(255,255,255,.22); }
.feat__ico{
  display:grid; place-items:center; width:48px; height:48px; margin-bottom:1.1rem;
  border-radius:var(--r); color:#8FD3E8;
  background:linear-gradient(145deg,rgba(30,122,148,.28),rgba(79,162,218,.12));
  border:1px solid rgba(246,169,124,.22);
}
.feat .h3{ margin-bottom:.45rem; }
.feat p{ font-family:var(--f-sub); margin:0; font-size:.94rem; }

.marcas__list{ display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:.7rem; }
.marcas__list li{
  display:grid; place-items:center;
  min-height:76px; padding:.9rem 1rem;
  background:var(--surface);
  border:1px solid var(--line); border-radius:var(--r-sm);
  transition:transform .25s var(--ease), box-shadow .25s var(--ease), border-color .25s var(--ease);
}
.marcas__list li:hover{
  transform:translateY(-4px); box-shadow:var(--sh-2);
  border-color:rgba(30,122,148,.35);
}
.marcas__list img{
  max-height:32px; width:auto; object-fit:contain;
  filter:grayscale(1); opacity:.68;
  transition:filter .25s var(--ease), opacity .25s var(--ease);
}
.marcas__list li:hover img{ filter:grayscale(0); opacity:1; }

/* ---------- 12. Setores ---------- */
.setores{
  padding:clamp(1.5rem,3vw,2.25rem);
  background:var(--navy-050); border:1px solid var(--line); border-radius:var(--r-lg);
}
.setores__title{ margin-bottom:1.1rem; font-size:1.05rem; }
.setores__list{ display:grid; grid-template-columns:repeat(3,1fr); gap:.7rem 1.5rem; }
.setores__list li{ display:flex; align-items:center; gap:.6rem; font-size:.94rem; color:var(--txt-mid); }
.setores__list .ico{ width:15px; height:15px; color:var(--accent); flex:none; }

/* ---------- 13. CTA / Orçamento ---------- */
.section--cta{
  background:
    radial-gradient(ellipse 70% 90% at 12% 10%,rgba(79,162,218,.20),transparent 60%),
    radial-gradient(ellipse 60% 80% at 92% 90%,rgba(30,122,148,.22),transparent 62%),
    var(--navy-900);
  color:var(--on-dark-high);
}
.section--cta .h2{ color:var(--on-dark-high); }
/* O formulário passou para a esquerda e o texto para a direita — é a troca
   que o desenho novo faz, e a fotografia de apoio (bloco 27) acompanha-a
   para o lado oposto. */
.orc{ display:grid; grid-template-columns:minmax(0,.95fr) minmax(0,1.05fr); gap:clamp(2rem,5vw,4rem); align-items:start; }
/* O título dos contactos é o único título do site em Inter extra-negro: é a
   voz do hero a repetir-se no fim da página. */
.section--cta .orc__side .h2{
  font-family:var(--f-display); font-weight:800;
  margin-bottom:1.65rem; color:rgba(255,255,255,.97);
}
.orc__contacts{ display:flex; flex-direction:column; margin-top:2.25rem; max-width:28rem; border-bottom:.8px solid var(--line-dark); }
.orc__contacts li{ display:flex; flex-direction:column; gap:.25rem; padding:1.1rem 0; border-top:.8px solid var(--line-dark); }
.orc__label{ font-size:.72rem; font-family:var(--f-mono); font-weight:500; letter-spacing:.13em; text-transform:uppercase; color:var(--on-dark-low); }
.orc__contacts a,.orc__value{ color:rgba(255,255,255,.97); font-family:var(--f-display); font-weight:500; }
.orc__contacts a{ font-size:1.05rem; transition:color .2s var(--ease); width:fit-content; }
.orc__contacts a:hover{ color:#8FD3E8; }
.orc__value{ font-size:1.02rem; }

.orc__form{
  background:var(--surface); color:var(--txt-high);
  border-radius:var(--r-xl); padding:clamp(1.5rem,3.5vw,2.5rem);
  box-shadow:var(--sh-2);   /* painel branco sobre secção escura: já contrasta sozinho */
  position:relative; overflow:hidden;
}
form{ display:grid; gap:1rem; }
.field{ display:grid; gap:.4rem; }
.field-row{ display:grid; grid-template-columns:1fr 1fr; gap:1rem; }
.field label{ font-size:.85rem; font-weight:600; color:var(--txt-mid); }
.field label span{ color:var(--accent); }
.field input,.field select,.field textarea{
  width:100%; padding:.8rem .95rem;
  background:var(--bg); border:.8px solid var(--line);
  border-radius:var(--r-xs); font-size:.95rem;
  transition:border-color .2s var(--ease), box-shadow .2s var(--ease), background .2s var(--ease);
}
.field textarea{ resize:vertical; min-height:110px; }
.field select{ appearance:none; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%230C3A4A' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); background-repeat:no-repeat; background-position:right 1rem center; padding-right:2.5rem; }
.field input:focus,.field select:focus,.field textarea:focus{ outline:none; background:var(--surface); border-color:var(--accent); box-shadow:0 0 0 4px var(--accent-050); }
.field.is-invalid input,.field.is-invalid select,.field.is-invalid textarea{ border-color:#DC2626; background:#FEF2F2; }
.err{ margin:0; font-size:.8rem; color:#DC2626; min-height:0; }
.field--check{ grid-template-columns:auto 1fr; align-items:start; gap:.65rem; }
.field--check input{ width:13px; height:13px; margin-top:.15rem; accent-color:var(--accent); padding:0; border-radius:2px; }
.field--check label{ font-size:.85rem; font-weight:400; color:var(--txt-mid); line-height:1.5; }
.field--check .err{ grid-column:1/-1; }
.form__note{ display:flex; align-items:center; gap:.5rem; margin:0; font-size:.8rem; color:var(--navy-900); }
.form__note .ico{ width:14px; height:14px; }

/* Dúvida simples ou pedido com referências — dois modos, um formulário */
.modo{
  display:flex; gap:.25rem; margin:0 0 1.4rem; padding:.28rem;
  border:1px solid var(--line); border-radius:var(--r-pill);
  background:var(--navy-050);
}
.modo__opt{ flex:1 1 0; }
.modo__opt input{ position:absolute; opacity:0; width:0; height:0; }
.modo__opt span{
  display:block; padding:.6rem .75rem; border-radius:var(--r-pill);
  text-align:center; font-size:.9rem; font-weight:600; color:var(--txt-mid);
  cursor:pointer; transition:background .2s var(--ease), color .2s var(--ease), box-shadow .2s var(--ease);
}
.modo__opt input:checked + span{ background:var(--surface); color:var(--navy-900); box-shadow:var(--sh-1); }
.modo__opt input:focus-visible + span{ outline:3px solid var(--accent); outline-offset:2px; }

/* Armadilha para robôs: fora do ecrã, nunca display:none (há robôs que o detetam) */
.hp{ position:absolute; left:-9999px; width:1px; height:1px; overflow:hidden; }

.cart-summary{
  background:var(--navy-050); border:.8px solid var(--line);
  border-radius:var(--r-sm); padding:1rem 1.1rem;
}
.cart-summary__head strong{ font-size:.9rem; color:var(--txt-high); }
.cart-summary__head{ display:flex; align-items:center; justify-content:space-between; gap:1rem; margin-bottom:.6rem; font-size:.9rem; }
.cart-summary ul{ display:grid; gap:.45rem; max-height:190px; overflow:auto; }
.cart-summary li{
  display:flex; align-items:center; justify-content:space-between; gap:1rem;
  font-size:.85rem; color:var(--txt-mid);
}
.csum__name{ display:grid; gap:.1rem; color:var(--txt-high); font-weight:500; }
.csum__name small{ font-family:var(--f-mono); font-size:.7rem; color:var(--txt-low); font-weight:400; }

/* Escolher a referência sem sair do formulário */
.picker{ display:flex; gap:.5rem; align-items:stretch; }
.picker select{ flex:1 1 auto; min-width:0; }
.picker .btn{ flex:none; padding-inline:1.1rem; }
.field__hint{ margin:.45rem 0 0; font-size:.8rem; line-height:1.4; color:var(--txt-low); }
.field__hint a{ color:var(--accent); text-decoration:underline; text-underline-offset:2px; }

.form__ok{
  position:absolute; inset:0; z-index:5;
  display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center;
  gap:.4rem; padding:clamp(1.5rem,4vw,3rem);
  background:var(--surface);
  animation:fadeUp .35s var(--ease) both;
  overflow-y:auto;   /* em telemóvel o painel pode ficar mais alto do que o formulário */
}
.form__ok .ico{ color:#059669; }
.form__ok p{ color:var(--txt-mid); max-width:42ch; margin-bottom:1.25rem; }
.form__ok-actions{ display:flex; flex-wrap:wrap; gap:.6rem; justify-content:center; }
.form__ok--erro .ico{ color:var(--accent); }
.form__ok #okVoltar{ margin-top:1.1rem; }

/* Enquanto o pedido está a caminho do servidor */
#formSubmit[disabled]{ opacity:.62; cursor:progress; transform:none; }
#formSubmit[disabled] .ico{ animation:pulseIco 1s ease-in-out infinite; }
@keyframes pulseIco{ 50%{ opacity:.35 } }

/* ---------- 15. Rodapé ---------- */
/* O rodapé inteiro fala Inter — é o bloco onde o desenho novo troca a
   Instrument Sans pela voz de cartaz da marca. */
.footer{
  background:var(--navy-900); color:var(--on-dark-mid);
  padding:clamp(3rem,6vw,4.5rem) 0 2rem;
  font-family:var(--f-display); font-size:.93rem; line-height:1.65;
}
/* Quatro colunas numa linha só. A da loja ficou no lugar do antigo
   "Siga-nos", que tinha um ícone sozinho a segurar todo o lado direito.

   Todas as colunas são auto: cada uma pede a largura da sua linha mais
   comprida — "Termos e condições de uso", a morada — e nunca parte ao meio.
   O que sobra vai para os intervalos, com space-between, e não para a coluna
   da marca: com a marca a comer o espaço todo, as três colunas de links
   encostavam-se umas às outras à direita e o peso caía todo desse lado. */
.footer__top{
  display:grid;
  grid-template-columns:minmax(0,auto) auto auto auto;
  justify-content:space-between;
  gap:clamp(1.5rem,3vw,3rem);
}
/* A medida do parágrafo cresce com o ecrã: num monitor largo, deixá-lo curto
   punha intervalos enormes entre as colunas. */
.footer__brand p{ max-width:clamp(19rem,26vw,26rem); margin:1.15rem 0 0; }
/* Selo do PRR: arte clara sobre transparente — só se vê em fundo escuro */
.footer__prr{ width:241px; max-width:100%; height:auto; margin-top:1.6rem; }
.brand--light .brand__txt strong{ color:#fff; }
.brand--light .brand__txt em{ color:var(--on-dark-low); }
.brand--light .brand__mark{ background:linear-gradient(145deg,rgba(255,255,255,.14),rgba(255,255,255,.05)); border:.8px solid var(--line-dark); }
.footer__social{ display:flex; gap:.5rem; }
.footer__social a{
  width:38px; height:38px; display:grid; place-items:center;
  border-radius:var(--r); background:rgba(255,255,255,.05); border:1px solid var(--line-dark);
  color:var(--on-dark-mid); transition:all .2s var(--ease);
}
.footer__social a:hover{ background:var(--accent); border-color:var(--accent); color:#fff; transform:translateY(-2px); }
.footer__col h3{ font-size:.78rem; font-family:var(--f-display); font-weight:500; line-height:1.08; letter-spacing:.15em; text-transform:uppercase; color:var(--on-dark-low); margin-bottom:1.1rem; }
.footer__col ul{ display:grid; gap:.6rem; }
.footer__col a{ transition:color .2s var(--ease); }
.footer__col a:hover{ color:#fff; }
/* A coluna da loja: morada, telefone e email, o estado ao vivo e as redes. */
.footer__contactos{ display:grid; gap:.6rem; }
.footer__contactos a{ transition:color .2s var(--ease); }
.footer__contactos a:hover{ color:#fff; }

/* Aberto ou fechado. A cor do ponto não vai sozinha: quem não a distingue lê
   na mesma "Aberto agora" ou "Fechado" ao lado, por palavras. */
.footer__estado{
  display:flex; align-items:center; gap:.55rem;
  margin:1.25rem 0 .35rem;
  color:#fff; font-weight:600; font-size:.9rem;
}
.footer__ponto{
  width:8px; height:8px; border-radius:50%; flex:none;
  background:var(--on-dark-low);
}
.footer__estado.is-aberto .footer__ponto{ background:#3FD08A; box-shadow:0 0 0 4px rgba(63,208,138,.16); }
.footer__estado.is-fechado .footer__ponto{ background:#E07A5F; box-shadow:0 0 0 4px rgba(224,122,95,.16); }
.footer__horario{ margin:0; font-size:.85rem; color:var(--on-dark-low); }
.footer__col--loja .footer__social{ margin-top:1.4rem; }

.footer__bot{
  margin-top:clamp(2.5rem,5vw,3.5rem); padding-top:1.5rem;
  border-top:1px solid var(--line-dark);
  display:flex; align-items:center; justify-content:space-between; gap:1rem; flex-wrap:wrap;
  font-size:.85rem; color:var(--on-dark-low);
}
.footer__bot p{ margin:0; }
.footer__bot a{ color:var(--on-dark-mid); text-decoration:underline; text-underline-offset:3px; }
.footer__bot a:hover{ color:#fff; }

/* Abaixo dos 1040px já não há largura para as quatro colunas na mesma linha
   sem partir alguma delas ao meio. A marca sobe para uma linha só dela e as
   três colunas de links seguem por baixo, repartidas pela largura toda. */
@media (max-width:1040px){
  .footer__top{ grid-template-columns:repeat(3,minmax(0,auto)); gap:2rem 1.5rem; }
  .footer__brand{ grid-column:1/-1; margin-bottom:.75rem; }
  .footer__brand p{ max-width:46ch; }
}

/* ---------- 15b. Páginas legais ---------- */
.legal-top{
  border-bottom:1px solid var(--line); background:var(--surface);
  padding:1.1rem 0;
}
.legal-top__inner{ display:flex; align-items:center; justify-content:space-between; gap:1rem; }
.legal-hero{ padding:clamp(2.5rem,5vw,4rem) 0 clamp(1.5rem,3vw,2.5rem); background:var(--bg); }
.legal-hero .h2{ margin-bottom:.4rem; }
.legal-hero__meta{ margin:0; font-family:var(--f-mono); font-size:.78rem; color:var(--txt-low); }

.legal{ padding-bottom:clamp(3rem,6vw,5rem); }
.legal h2{
  font-size:clamp(1.15rem,1rem + .5vw,1.45rem);
  margin:2.25rem 0 .7rem; color:var(--navy-900);
}
.legal h2:first-child{ margin-top:0; }
.legal p{ margin:0 0 1rem; color:var(--txt-mid); max-width:74ch; }
.legal ul{ display:grid; gap:.5rem; margin:0 0 1.25rem; max-width:74ch; }
.legal li{
  position:relative; padding-left:1.15rem;
  color:var(--txt-mid); font-size:.97rem;
}
.legal li::before{
  content:""; position:absolute; left:0; top:.62em;
  width:6px; height:6px; border-radius:50%; background:var(--copper);
}
.legal a{ color:var(--accent); text-decoration:underline; text-underline-offset:3px; }
.legal__nota{
  margin-top:2.5rem; padding:1.15rem 1.35rem;
  background:var(--navy-050); border:1px solid var(--line); border-radius:var(--r);
  font-size:.9rem; color:var(--txt-mid);
}

/* ---------- 16. Painel de orçamento ---------- */
.overlay{
  position:fixed; inset:0; z-index:90;
  background:rgba(7,43,55,.55); backdrop-filter:blur(3px);
  animation:fade .25s var(--ease) both;
}
@keyframes fade{ from{opacity:0} to{opacity:1} }

.cart{
  position:fixed; top:0; right:0; z-index:100;
  width:min(420px,100%); height:100dvh;
  display:flex; flex-direction:column;
  background:var(--surface);
  box-shadow:-16px 0 40px -24px rgba(7,43,55,.22);
  transform:translateX(102%);
  transition:transform .38s var(--ease);
  visibility:hidden;
}
.cart.is-open{ transform:none; visibility:visible; }
.cart__head{
  display:flex; align-items:flex-start; justify-content:space-between; gap:1rem;
  padding:1.4rem 1.4rem 1.1rem; border-bottom:1px solid var(--line);
}
.cart__head .h3{ margin:0; }
.cart__sub{ margin:.25rem 0 0; font-size:.85rem; color:var(--txt-low); }
.cart__head .iconbtn{ font-size:1.8rem; line-height:1; }
.cart__body{ flex:1; overflow-y:auto; padding:1.1rem 1.4rem; display:grid; gap:.75rem; align-content:start; }
.cart__foot{ padding:1.2rem 1.4rem calc(1.2rem + env(safe-area-inset-bottom)); border-top:1px solid var(--line); background:var(--bg); display:grid; gap:.75rem; justify-items:center; }
.cart__total{ display:flex; justify-content:space-between; width:100%; margin:0; font-size:.88rem; color:var(--txt-mid); }
.cart__total strong{ font-family:var(--f-mono); color:var(--navy-900); }

.citem{ display:grid; grid-template-columns:56px 1fr auto; gap:.9rem; align-items:center; padding:.7rem; border-bottom:1px solid var(--line); }
.citem img{ width:56px; height:56px; object-fit:contain; border-radius:var(--r-sm); background:var(--accent-050); padding:.5rem; box-sizing:border-box; }
.citem__name{ font-size:.9rem; font-weight:700; line-height:1.3; margin:0; }
.citem__ref{ font-family:var(--f-mono); font-size:.66rem; color:var(--txt-low); }
.citem__qty{ display:flex; align-items:center; gap:.4rem; }
.citem__qty button{ width:24px; height:24px; border-radius:7px; border:1px solid var(--line-strong); background:none; color:var(--navy-800); font-weight:700; line-height:1; display:grid; place-items:center; }
.citem__qty button:hover{ background:var(--navy-800); border-color:var(--navy-800); color:#fff; }
.citem__qty span{ min-width:16px; text-align:center; font-family:var(--f-mono); font-size:.85rem; font-weight:600; }
.cart__empty{ text-align:center; padding:3rem 1rem; color:var(--txt-low); }
.cart__empty .ico{ margin:0 auto .75rem; color:var(--txt-faint); }

/* ---------- 17. Flutuantes ---------- */
.fab{
  position:fixed; z-index:80;
  width:54px; height:54px; display:grid; place-items:center;
  border-radius:var(--r); color:#fff;
  box-shadow:var(--sh-3);
  transition:transform .25s var(--ease), opacity .25s var(--ease), background .2s var(--ease);
}
.fab:hover{ transform:translateY(-3px) scale(1.05); }
.fab--top{ right:22px; bottom:22px; background:var(--navy-800); opacity:0; pointer-events:none; }
.fab--top.is-on{ opacity:1; pointer-events:auto; }

/* Aviso que aparece quando há produtos no pedido.
   Fica à esquerda para não tapar os botões flutuantes do lado direito. */
.nudge{
  position:fixed; left:22px; bottom:22px; z-index:90;
  width:min(340px,calc(100vw - 44px));
  padding:1.15rem 1.25rem 1.25rem;
  background:var(--surface);
  border:1px solid var(--line); border-radius:var(--r-lg);
  box-shadow:var(--sh-3);
  transform:translateY(12px); opacity:0;
  transition:transform .35s var(--ease), opacity .35s var(--ease);
}
.nudge.is-on{ transform:none; opacity:1; }
.nudge__x{
  position:absolute; top:.5rem; right:.6rem;
  width:30px; height:30px; border-radius:50%;
  font-size:1.35rem; line-height:1; color:var(--txt-low);
  display:grid; place-items:center;
}
.nudge__x:hover{ background:var(--bg-2); color:var(--navy-900); }
.nudge__t{ margin:0 0 .3rem; font-size:.95rem; padding-right:1.5rem; }
.nudge__t strong{ color:var(--accent); }
.nudge__d{ margin:0 0 1rem; font-size:.86rem; line-height:1.45; color:var(--txt-mid); }
.nudge__acoes{ display:grid; gap:.5rem; }
.nudge__acoes .btn{ width:100%; font-size:.88rem; padding:.65rem 1rem; }
.btn--whats{ --btn-bg:#25D366; --btn-fg:#0A3D20; }
.btn--whats:hover{ --btn-bg:#1EB558; }

/* ---------- 18. Revelação ao scroll (AnimatedContent) ---------- */
/*
 * Porte do AnimatedContent do ReactBits para CSS puro. O elemento entra
 * deslocado ao mesmo tempo de lado e de baixo, com opacidade e um ligeiro
 * encolhimento, e assenta na posição natural — sem GSAP e sem React. O
 * gatilho continua a ser o IntersectionObserver do app.js.
 *
 * Três variáveis afinam cada entrada:
 *   --rv-x  deslocamento lateral   (negativo vem da esquerda)
 *   --rv-y  deslocamento vertical  (positivo vem de baixo)
 *   --rv-s  escala de partida
 *
 * A curva é mais travada do que a --ease geral: o percurso aqui é longo e,
 * sem essa travagem, o fim do movimento fica a arrastar.
 */
:root{ --ease-rv:cubic-bezier(.16,1,.3,1); }

.reveal{
  --rv-x:-52px; --rv-y:38px; --rv-s:.96;
  opacity:0;
  transform:translate3d(var(--rv-x),var(--rv-y),0) scale(var(--rv-s));
  transition:opacity .8s var(--ease-rv), transform .8s var(--ease-rv);
  will-change:transform,opacity;
}
.reveal.is-in{ opacity:1; transform:none; will-change:auto; }

/* De que lado vem. O app.js alterna os irmãos; o template pode mandar. */
.reveal[data-reveal="esq"]  { --rv-x:-52px }
.reveal[data-reveal="dir"]  { --rv-x: 52px }
.reveal[data-reveal="baixo"]{ --rv-x:  0px }

/* O carrossel ocupa a largura toda do ecrã: só lhe assenta vir de baixo. */
.marcas-carrossel.reveal{ --rv-x:0px }

.reveal[data-delay="1"]{ transition-delay:.09s }
.reveal[data-delay="2"]{ transition-delay:.18s }
.reveal[data-delay="3"]{ transition-delay:.27s }
.reveal[data-delay="4"]{ transition-delay:.36s }
.reveal[data-delay="5"]{ transition-delay:.45s }

/* Em ecrãs estreitos o percurso lateral encurta: com a largura toda
   ocupada, um salto grande de lado lê-se como solavanco. */
@media (max-width:680px){
  .reveal{ --rv-x:-20px; --rv-y:28px; --rv-s:.98 }
  .reveal[data-reveal="esq"]{ --rv-x:-20px }
  .reveal[data-reveal="dir"]{ --rv-x: 20px }
}

/* ---------- 19. Responsivo ---------- */
/* Cinco degraus, do maior para o menor:
     1080px  portátil pequeno / tablet em paisagem
      960px  tablet — o menu passa a hambúrguer e o hero desmonta-se
      680px  telemóvel — tudo em coluna
      380px  telemóvel estreito
     +       ecrãs táteis e paisagem baixa, por capacidade e não por largura   */

@media (max-width:1080px){
  .nav__list{ gap:0; }
  .nav__link{ padding:.55rem .5rem; font-size:.88rem; }
  .marcas__list{ grid-template-columns:repeat(5,minmax(0,1fr)); }
}

/* --- Tablet --- */
@media (max-width:960px){
  /* a altura do cabeçalho e o scroll-padding já acompanham por clamp */
  .burger{ display:flex; }
  .nav{
    position:fixed; inset:0 0 auto 0; top:var(--nav-top,110px);
    margin:0; flex-direction:column; align-items:stretch; gap:1.25rem;
    padding:1.5rem var(--pad-x) 2rem;
    background:var(--surface); border-bottom:1px solid var(--line);
    box-shadow:var(--sh-3);
    transform:translateY(-14px); opacity:0; visibility:hidden;
    transition:opacity .28s var(--ease), transform .28s var(--ease), visibility .28s;
    max-height:calc(100dvh - var(--nav-top,110px)); overflow-y:auto;
  }
  .nav.is-open{ transform:none; opacity:1; visibility:visible; }
  .nav__list{ flex-direction:column; align-items:stretch; gap:.15rem; }
  .nav__link{ padding:.8rem .5rem; font-size:1.05rem; border-bottom:1px solid var(--line); }
  .nav__link::after{ display:none; }
  .nav__link.is-active{ color:var(--accent); }

  /* Em tablet e telemóvel o menu é um painel claro, fora da barra: as letras
     brancas do estado sobre o hero não podem viajar para lá dentro. */
  .header.sobre-hero .nav__link{ color:var(--txt-mid); text-shadow:none; }
  .header.sobre-hero .nav__link:hover{ color:var(--navy-900); background:rgba(12,58,74,.05); }
  .header.sobre-hero .nav__link.is-active{ color:var(--accent); }

  /* A coluna do hero deixa de ter folga à direita, mas continua encostada à
     esquerda — é a medida que encolhe, não o alinhamento. */
  .hero__copy{ max-width:none; }
  .hero__title{ max-width:none; }

  /* O véu único do desenho novo fecha um pouco em ecrã pequeno: aqui o
     título ocupa mais da fotografia e apanha zonas claras que no computador
     ficavam de fora. */
  .hero__scrim{ background:rgba(0,0,0,.44); }

  /* A sombra faz o resto do trabalho. Assenta as letras contra o que
     estiver por baixo sem escurecer mais a fotografia — é isso que permite
     manter o véu leve e o texto legível. */
  .hero__copy{
    text-shadow:0 1px 3px rgba(7,43,55,.55), 0 2px 14px rgba(7,43,55,.45);
  }

  .sec-head--split{ grid-template-columns:1fr; align-items:start; }
  .three{ grid-template-columns:1fr; }
  .cats{ grid-template-columns:repeat(2,1fr); }
  .steps{ grid-template-columns:repeat(2,1fr); }
  .feats{ grid-template-columns:repeat(2,1fr); }
  .marcas__list{ grid-template-columns:repeat(4,minmax(0,1fr)); }
  .setores__list{ grid-template-columns:repeat(2,1fr); }
  /* Em coluna única a ordem do desenho inverte-se: primeiro diz-se o que a
     secção é, só depois se pede que preencham. */
  .orc{ grid-template-columns:1fr; }
  .orc__side{ order:-1; }

  .cat-hero .search{ flex-basis:100%; }
  .catalog-layout{ grid-template-columns:1fr; }
  .filters{ position:static; gap:1.5rem; }
  .filters__group{ gap:.6rem; }

  /* a marca ocupa a linha toda e as três colunas de links seguem por baixo;
     sem a grelha larga do desktop, tudo fica centrado no rodapé */
  .footer__top{ grid-template-columns:repeat(3,minmax(0,1fr)); justify-items:center; text-align:center; gap:2rem 1.5rem; }
  .footer__brand{ grid-column:1/-1; display:flex; flex-direction:column; align-items:center; }
  .footer__brand p{ max-width:52ch; }
  .footer__col ul{ justify-items:center; }
  .footer__contactos{ justify-items:center; }
  .footer__estado{ justify-content:center; }
  .footer__social{ justify-content:center; }
  .footer__bot{ justify-content:center; text-align:center; }
}

/* --- Telemóvel --- */
@media (max-width:680px){
  /* nenhum título parte o alinhamento por causa de uma referência comprida */
  .h1,.h2,.h3,h1,h2,h3,.cat__name,.prod__name{ overflow-wrap:break-word; }

  /* Hero */
  .h1 .hl,.h1 .hl--plain{ white-space:normal; }
  .hero{ min-height:clamp(24rem,72vh,32rem); }

  /* Num ecrã ao alto sobra pouca largura e o corte cai a meio da fotografia:
     o motivo das duas está do lado direito, por isso é esse lado que fica à
     vista. A altura de cada uma mantém-se — só muda o lado. */
  .hero__slides .hero__slide{ object-position:right center; }
  .hero__slides .hero__slide:nth-child(1){ object-position:right 15%; }
  .hero__slides .hero__slide:nth-child(3){ object-position:right 42%; }
  .marcas__list{ grid-template-columns:repeat(3,minmax(0,1fr)); gap:.5rem; }
  /* Em coluna única o quadrado ficaria alto demais e empurrava o rótulo
     seguinte para fora do ecrã. */
  .cats{ grid-template-columns:1fr; }
  .cat__media{ aspect-ratio:16/10; }
  .steps{ grid-template-columns:1fr; }
  .feats{ grid-template-columns:1fr; }
  .setores__list{ grid-template-columns:1fr; }

  /* Catálogo: os filtros quebram para a linha seguinte e ficam todos dentro
     do contentor — nenhum sai pela margem nem fica cortado ao meio. */
  .toolbar{ flex-direction:column; align-items:stretch; gap:.75rem; }
  /* Numa coluna flex a linha fica com a largura do item mais largo, e a
     largura máxima dos seis filtros em fila (~630px) esticava a barra toda,
     levando o campo de pesquisa para fora do ecrã. Fixar a largura resolve. */
  .toolbar > *{ width:100%; min-width:0; }
  .chips{ flex-wrap:wrap; }
  /* com a barra em coluna, o eixo principal é o vertical: os 320px do
     flex-basis passavam a ALTURA e abriam um vazio por baixo do campo */
  .search{ flex:0 0 auto; max-width:none; }
  .produtos{ grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); }

  /* Formulário e painel do pedido */
  .field-row{ grid-template-columns:1fr; }
  .cart{ width:100%; }
  .cart__head{ padding:1.1rem 1.1rem .9rem; }
  .cart__body{ padding:1rem 1.1rem; }
  .cart__foot{ padding-inline:1.1rem; }
  .citem{ grid-template-columns:48px 1fr auto; gap:.65rem; }
  .citem img{ width:48px; height:48px; }

  /* Rodapé */
  .footer__top{ grid-template-columns:1fr; }
  .footer__brand{ grid-column:auto; }
  .footer__bot{ flex-direction:column; align-items:center; gap:.35rem; }

  /* Flutuantes: o aviso ocupa a largura toda, por isso o botão de topo e o
     aviso de estado sobem por cima dele em vez de se sobreporem. */
  .fab--top{
    right:14px; width:46px; height:46px;
    bottom:calc(14px + env(safe-area-inset-bottom));
  }
  .nudge{
    left:12px; right:12px; width:auto;
    bottom:calc(12px + env(safe-area-inset-bottom));
  }
  body.tem-aviso .fab--top{ bottom:calc(24px + env(safe-area-inset-bottom) + var(--nudge-h,0px)); }

  .legal-top__inner{ gap:.75rem; }
}

/* --- Telemóvel estreito --- */
/* O cabeçalho não entra aqui: escala por clamp e cabe inteiro até aos 320px,
   sem esconder o selo nem colar os ícones um ao outro. */
@media (max-width:380px){
  .hero__title-b{ font-size:1.95rem; }
  .hero__title-a{ letter-spacing:.16em; }
  .hero__ind{ width:1.9rem; }
  .hero__ind.is-on{ width:3.6rem; }
  .btn--lg{ padding:.9rem 1.3rem; font-size:.96rem; }
  /* mantém as três colunas — em duas, catorze marcas dariam sete filas */
  .marcas__list li{ padding:.7rem .55rem; min-height:66px; }
  .form__ok-actions .btn{ width:100%; }
}

/* --- Paisagem baixa (telemóvel deitado) --- */
@media (max-width:960px) and (orientation:landscape) and (max-height:520px){
  /* deitado, a altura mínima do hero deixava-o mais alto do que o ecrã — e o
     ecrã inteiro, aqui, não tem altura para o título respirar */
  .hero{ min-height:0; padding-block:2rem 4.5rem; }
  body.home .hero, body.admin-bar.home .hero{ min-height:0; padding-top:calc(2rem + var(--head-h)); }
  .cart__head{ padding-block:1rem .8rem; }
  .nudge{ padding:.9rem 1rem 1rem; }
  .nudge__d{ margin-bottom:.7rem; }
}

/* --- Ecrãs táteis: alvos maiores e sem ampliação automática --- */
@media (pointer:coarse){
  /* abaixo de 16px o Safari do iPhone amplia a página ao focar o campo */
  .field input,.field select,.field textarea,.search input{ font-size:16px; }

  .citem__qty button{ width:36px; height:36px; }
  .citem__qty span{ min-width:30px; }
  .field--check input{ width:22px; height:22px; }
  .prod__add{ padding:.6rem; margin:-.6rem; }
  .search__clear{ width:34px; height:34px; }
  .nudge__x{ width:36px; height:36px; }
  .cart__head .iconbtn{ width:42px; height:42px; }
  .chip{ padding:.6rem 1.05rem; }
  .footer__col a,.footer__bot a,.orc__contacts a{ display:inline-block; padding-block:.2rem; }
}

/* Sem rato não há como desfazer um :hover — ficaria preso depois do toque */
@media (hover:none){
  .btn:hover,.card:hover,.prod:hover,
  .marcas__list li:hover,.fab:hover{ transform:none; }
  /* O cartão deixou de se mexer a si próprio: quem levanta é a moldura da
     fotografia, e quem desliza é a seta do rótulo. */
  .cat:hover .cat__media,
  .cat:hover .cat__img,
  .cat:hover .cat__arrow{ transform:none; }
  .btn:hover .ico{ transform:none; }
}

/* ---------- 20. Acessibilidade / impressão ---------- */
@media (prefers-reduced-motion:reduce){
  html{ scroll-behavior:auto; }
  *,*::before,*::after{ animation-duration:.01ms !important; animation-iteration-count:1 !important; transition-duration:.01ms !important; }
  .reveal{ opacity:1; transform:none; }
}

@media print{
  .header,.fab,.cart,.overlay,.hero__slides,.hero__navwrap,.dark-bg{ display:none !important; }
  /* sem o véu por trás, o texto claro do hero desapareceria na folha */
  .hero{ min-height:0; padding-block:1.5rem; background:#fff; }
  .hero__title-b{ color:#000; }
  .hero__title-a{ color:#333; }
  body{ background:#fff; }
  .section{ padding:1.5rem 0; break-inside:avoid; }
}

/* ---------- 21. Produtos em destaque na página inicial ---------- */
/* Quatro cartões por linha. Os restantes ficam no DOM, com o atributo
   `hidden`, até alguém carregar em "Ver mais produtos" — assim o motor de
   busca vê-os na mesma e o botão não tem de ir buscar nada ao servidor. */
.produtos--destaque{ grid-template-columns:repeat(4,minmax(0,1fr)); }
/* O cartão da homepage reduziu-se a fotografia, família, nome e uma só
   acção. O "Ver mais detalhes" encosta ao fundo do cartão para que cartões
   de nomes com uma e com duas linhas acabem à mesma altura. */
.produtos--destaque .prod__more{ margin-top:auto; padding-top:.9rem; }

/* Botão de texto, sem caixa: vive no fundo do cartão, por baixo do rodapé
   de preço, e não disputa atenção com o "Adicionar". */
.prod__more{
  display:inline-flex; align-items:center; gap:.4rem;
  margin-top:.9rem; padding:0;
  background:none; border:0;
  font-family:var(--f-sub); font-size:.88rem; font-weight:600;
  color:var(--accent); cursor:pointer;
  transition:color .2s var(--ease), gap .2s var(--ease);
}
.prod__more:hover,
.prod__more:focus-visible{ color:var(--accent-600); gap:.55rem; }
.prod__more:focus-visible{ outline:2px solid var(--accent); outline-offset:3px; border-radius:var(--r-sm); }
/* A seta aponta em frente e avança um pouco ao passar o rato — no desenho
   novo é o único gesto do cartão, e a diagonal de antes saiu com ele. */
.prod__more .ico{ width:17px; height:17px; transition:transform .25s var(--ease); }
.prod__more:hover .ico,
.prod__more:focus-visible .ico{ transform:translateX(3px); }

/* A seta do "Ver mais produtos" aponta para baixo; com a lista aberta vira-se
   para cima, para dizer que o mesmo botão volta a fechá-la. */
.loadmore .btn .ico{ transform:rotate(90deg); transition:transform .25s var(--ease); }
.loadmore .btn:hover .ico{ transform:rotate(90deg) translateX(3px); }
.loadmore .btn[aria-expanded="true"] .ico{ transform:rotate(-90deg); }
.loadmore .btn[aria-expanded="true"]:hover .ico{ transform:rotate(-90deg) translateX(3px); }

/* ---------- 22. Carrossel de marcas ---------- */
/* Sai do .container de propósito: a fila atravessa o ecrã de ponta a ponta e
   é a máscara — não uma caixa — que a apaga nas bordas. */
.marcas-carrossel{
  position:relative;
  width:100%;
  overflow:hidden;
  margin-top:clamp(1.5rem,4vw,2.5rem);
  padding-block:.4rem;
  -webkit-mask-image:linear-gradient(90deg,transparent 0,#000 9%,#000 91%,transparent 100%);
          mask-image:linear-gradient(90deg,transparent 0,#000 9%,#000 91%,transparent 100%);
}
.marcas-carrossel__pista{
  display:flex;
  width:max-content;
  animation:jlr-marquee 48s linear infinite;
  will-change:transform;
}
/* Parar com o rato em cima deixa ler um logótipo sem correr atrás dele. */
.marcas-carrossel:hover .marcas-carrossel__pista,
.marcas-carrossel:focus-within .marcas-carrossel__pista{ animation-play-state:paused; }

.marcas-carrossel__fila{
  display:flex; align-items:center; gap:.7rem;
  list-style:none; margin:0; padding:0 .35rem;
}
/* Sem caixa: os logótipos assentam diretamente no fundo da secção. A largura fixa
   fica — é ela que dá o compasso da fila; o que saiu foi a moldura. */
.marcas-carrossel__fila li{
  flex:none;
  display:grid; place-items:center;
  width:clamp(140px,13.5vw,176px); min-height:86px;
  padding:.9rem .7rem;
  transition:opacity .25s var(--ease);
}
.marcas-carrossel__fila li:hover{ opacity:.65; }
/* A cores, e sem véu: era o grayscale que apagava as marcas. */
.marcas-carrossel__fila img{
  max-height:46px; width:auto; max-width:100%;
  object-fit:contain;
  filter:none; opacity:1;
}
/* Duas cópias da fila; recuar metade da pista fecha o ciclo sem salto. */
@keyframes jlr-marquee{
  from{ transform:translate3d(0,0,0); }
  to{   transform:translate3d(-50%,0,0); }
}

/* ---------- 23. Adaptações de ecrã das duas secções novas ---------- */
@media (max-width:1080px){
  /* Quatro cartoes em duas filas equilibradas em vez de tres mais um orfao. */
  .produtos--destaque{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:960px){
  .produtos--destaque{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:680px){
  .produtos--destaque{ grid-template-columns:repeat(2,minmax(0,1fr)); }
  .marcas-carrossel__fila li{ width:132px; min-height:74px; padding:.7rem .5rem; }
}
@media (max-width:380px){
  .produtos--destaque{ grid-template-columns:1fr; }
}

/* Sem movimento: a fila deixa de andar sozinha e passa a arrastar-se à mão. */
@media (prefers-reduced-motion:reduce){
  .marcas-carrossel{ overflow-x:auto; }
  .marcas-carrossel__pista{ animation:none !important; transform:none !important; }
}

/* ---------- 24. Ficha de produto (single-produto.php) ---------- */
.ficha__migalhas{
  display:flex; flex-wrap:wrap; align-items:center; gap:.5rem;
  margin:0 0 1.5rem;
  font-family:var(--f-mono); font-size:.76rem;
  letter-spacing:.06em; text-transform:uppercase;
  color:var(--txt-low);
}
.ficha__migalhas a{ color:var(--accent); text-decoration:none; }
.ficha__migalhas a:hover{ text-decoration:underline; text-underline-offset:3px; }

.ficha__grid{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:clamp(1.75rem,4vw,3.25rem);
  align-items:start;
}
/* A moldura repete a do cartão: a fotografia entra inteira, nunca cortada. */
.ficha__media{
  position:relative;
  border:1px solid var(--line);
  border-radius:var(--r-lg);
  background:linear-gradient(155deg,var(--bg-2),var(--surface));
  overflow:hidden;
}
.ficha__media img{
  display:block; width:100%;
  aspect-ratio:4/3; object-fit:contain;
  padding:clamp(1rem,3vw,2.25rem);
  box-sizing:border-box;
}
.ficha__media .prod__banner{ top:1rem; left:1rem; }

.ficha__corpo .h2{ margin:.15rem 0 0; }
.ficha__tags{ margin:.9rem 0 1.5rem; }

/* Uma linha por dado, com o valor encostado à direita: lê-se em diagonal. */
.ficha__dados{
  margin:0 0 1.75rem;
  border-top:1px solid var(--line);
}
.ficha__dados > div{
  display:flex; justify-content:space-between; align-items:baseline; gap:1rem;
  padding:.72rem 0;
  border-bottom:1px solid var(--line);
}
.ficha__dados dt{ margin:0; font-family:var(--f-sub); font-size:.94rem; color:var(--txt-mid); }
.ficha__dados dd{ margin:0; font-weight:600; color:var(--txt-high); text-align:right; }

.ficha__acoes{ display:flex; flex-wrap:wrap; gap:.75rem; }

.ficha__texto{
  margin-top:clamp(2rem,5vw,3.25rem);
  max-width:70ch;
  color:var(--txt-mid);
}
.ficha__texto p{ margin:0 0 1rem; }
.ficha__texto :is(h2,h3){ margin-top:1.75rem; }

@media (max-width:860px){
  .ficha__grid{ grid-template-columns:1fr; }
}

/* ---------- 25. Filtro de famílias da secção de Produtos ---------- */
/* Pastilhas próprias, não as .chip do catálogo: o app.js trata as .chip
   como parte do catálogo e apagava o estado destas ao passar por cima. */
.fchips{
  display:flex; flex-wrap:wrap; gap:.45rem;
  margin:0 0 clamp(1.35rem,3vw,2rem);
}
.fchip{
  padding:.5rem 1rem; border-radius:var(--r-pill);
  background:var(--surface); border:1px solid var(--line);
  font-family:var(--f-sub); font-size:.88rem; font-weight:500;
  color:var(--txt-mid); cursor:pointer;
  transition:background .2s var(--ease), border-color .2s var(--ease), color .2s var(--ease);
}
.fchip:hover{ border-color:var(--line-strong); color:var(--navy-900); }
.fchip.is-active{ background:var(--navy-800); border-color:var(--navy-800); color:#fff; font-weight:600; }
.fchip:focus-visible{ outline:2px solid var(--accent); outline-offset:2px; }

.produtos__vazio{
  margin:1.5rem 0 0; padding:clamp(1.5rem,4vw,2.5rem);
  border:1px dashed var(--line-strong); border-radius:var(--r-lg);
  background:var(--surface);
  text-align:center; color:var(--txt-mid);
}

/* ---------- 26. Janela do produto (lightbox) ---------- */
/* Fica entre o painel do pedido (100) e os avisos (120): tapa o painel se
   ambos estiverem abertos, mas nunca o aviso que confirma a adição. */
.lb[hidden]{ display:none; }
.lb{
  position:fixed; inset:0; z-index:110;
  display:grid; place-items:center;
  padding:clamp(1rem,4vw,2.5rem);
}
.lb__fundo{
  position:absolute; inset:0;
  background:rgba(7,43,55,.55);
  backdrop-filter:blur(3px);
  animation:lb-fundo .2s var(--ease) both;
}
.lb__caixa{
  position:relative;
  width:min(940px,100%); max-height:min(88vh,860px);
  overflow:auto;
  display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);
  gap:clamp(1.25rem,3vw,2.25rem);
  padding:clamp(1.25rem,3vw,2rem);
  background:var(--surface);
  border:1px solid var(--line);
  border-radius:var(--r-lg);
  box-shadow:var(--sh-3);
  animation:lb-caixa .24s var(--ease) both;
}
.lb__x{
  position:absolute; top:.7rem; right:.7rem; z-index:2;
}
.lb__media{
  position:relative;
  align-self:start;
  border:1px solid var(--line);
  border-radius:var(--r-lg);
  background:linear-gradient(155deg,var(--bg-2),var(--surface));
  overflow:hidden;
}
.lb__media img{
  display:block; width:100%;
  aspect-ratio:4/3; object-fit:contain;
  padding:clamp(.9rem,2.5vw,1.75rem);
  box-sizing:border-box;
}
.lb__media .prod__banner{ top:.85rem; left:.85rem; }
.lb__corpo{ min-width:0; padding-right:2.2rem; }
.lb__corpo .h3{ margin:.2rem 0 0; }
.lb__tags{ margin:.85rem 0 1.35rem; }

@keyframes lb-fundo{ from{ opacity:0 } to{ opacity:1 } }
@keyframes lb-caixa{ from{ opacity:0; transform:translateY(10px) scale(.99) } to{ opacity:1; transform:none } }

@media (max-width:760px){
  .lb__caixa{ grid-template-columns:1fr; }
  .lb__corpo{ padding-right:0; }
}
@media (prefers-reduced-motion:reduce){
  .lb__fundo,.lb__caixa{ animation:none !important; }
}

/* ---------- 27. Fotografia de fundo dos Contactos ---------- */
/* A pessoa do apoio entra pela direita, do lado oposto ao formulário — que
   no desenho novo passou para a esquerda —, e dissolve-se antes de chegar
   ao texto. Não é background-image
   de propósito: sendo <img>, o browser trata-a como imagem (lazy, formatos
   modernos) e uma foto pequena não é esticada para caber. */
.section--cta{ position:relative; overflow:hidden; }
.section--cta > .container{ position:relative; z-index:1; }

.orc__fundo{
  position:absolute; right:0; top:clamp(12rem,24vw,19rem); bottom:0; z-index:0;
  width:min(58%,780px);
  pointer-events:none; user-select:none;
}
/* A fotografia é grande e passa por trás das informações de contacto. Duas
   coisas a segurá-la, e a ordem em que o browser as aplica importa:
   1. o enquadramento: cover com object-position a 58% deixa o rosto e os
      auscultadores dentro da caixa — a fotografia é um grande plano na
      horizontal, e ao centro apanhava-se sobretudo o cabelo;
   2. a máscara: dois degradês cruzados. O vertical apaga a imagem em cima e
      em baixo, para não ficar com ar de fotografia cortada rente ao fim da
      secção; o horizontal apaga-a à esquerda, senão fazia aresta contra o
      cartão do formulário.
   O espelho (scaleX) saiu daqui quando a fotografia mudou de lado: agora
   nasce à direita, que é onde o desenho novo a quer. */
.orc__fundo img{
  width:100%; height:100%;
  object-fit:cover; object-position:58% center;
  opacity:.26;
  filter:grayscale(.45) contrast(1.05);
  -webkit-mask-image:
    linear-gradient(180deg,transparent 0,#000 20%,#000 76%,transparent 100%),
    linear-gradient(90deg,transparent 0,#000 40%);
  -webkit-mask-composite:source-in;
          mask-image:
    linear-gradient(180deg,transparent 0,#000 20%,#000 76%,transparent 100%),
    linear-gradient(90deg,transparent 0,#000 40%);
          mask-composite:intersect;
}

/* Em coluna única a fotografia ficaria por baixo do texto, e sai. */
@media (max-width:960px){
  .orc__fundo{ display:none; }
}

/* ---------- 27b. Formulário do plugin nos Contactos ---------- */
/* O formulário deixou de ser o do tema e passa a vir de um shortcode do
   plugin. Quem valida e envia os emails é o plugin — nada disso se toca
   aqui. Este bloco só o veste com o desenho do resto do site: a mesma
   tipografia, os mesmos campos e o mesmo botão que o formulário antigo.

   Está feito no tema e não nos ficheiros do plugin de propósito: mexer lá
   dentro perde-se na primeira atualização, e é esse código que faz o envio
   funcionar. Tudo está preso a #contactos, para o formulário continuar com
   o aspeto do plugin se for usado noutra página. */

/* O plugin traz o seu próprio cartão — margem interior, largura máxima e
   centragem. O cartão branco já é o .orc__form do tema, por isso o de
   dentro sai: era ele que afastava os campos das bordas. */
#contactos .wp-formcraft-frontend > div{
  padding:0; max-width:none; margin-inline:0;
  background:transparent; border:0; box-shadow:none;
  font-family:var(--f-body); color:var(--txt-high);
}

/* O espaço entre campos passa a vir do grid, como no formulário antigo, e
   não das margens que o plugin põe em cada bloco. */
#contactos .wp-formcraft-frontend form > div:first-child{ display:grid; gap:1rem; }
#contactos .wp-formcraft-frontend form > div:first-child > div{ margin-bottom:0; }

#contactos .wp-formcraft-frontend .fc-label{
  font-family:var(--f-body); font-size:.85rem; font-weight:600;
  color:var(--txt-mid); margin-bottom:.4rem;
}
#contactos .wp-formcraft-frontend .fc-label span{ color:var(--accent); font-weight:600; }

/* A cor do texto de exemplo é uma variável do plugin: redefinida aqui no
   próprio campo, porque a regra dele lê-a a partir do elemento. */
#contactos .wp-formcraft-frontend .fc-input{
  --fc-input-placeholder:var(--txt-low);
  width:100%; padding:.8rem .95rem;
  background:var(--bg); border:.8px solid var(--line);
  border-radius:var(--r-xs); box-shadow:none;
  font-family:var(--f-body); font-size:.95rem; line-height:1.5; color:var(--txt-high);
  transition:border-color .2s var(--ease), box-shadow .2s var(--ease), background .2s var(--ease);
}
#contactos .wp-formcraft-frontend textarea.fc-input{ resize:vertical; min-height:110px; }
/* O !important responde ao !important do plugin, não a outra coisa. */
#contactos .wp-formcraft-frontend .fc-input:focus{
  outline:none; background:var(--surface);
  border-color:var(--accent) !important;
  box-shadow:0 0 0 4px var(--accent-050) !important;
}

/* A linha divisória e o vão antes do botão saem: o formulário antigo ia
   direto do último campo para o botão. */
#contactos .wp-formcraft-frontend form > div:last-child{
  margin-top:.5rem; padding-top:0; border-top:0;
}

/* O botão fica igual ao .btn--accent do tema. Aqui o !important é preciso
   porque o plugin escreve a cor de fundo no atributo style do botão. */
#contactos .wp-formcraft-frontend button{
  padding:.78rem 1.35rem;
  background-color:var(--accent) !important; color:#fff;
  border:.8px solid transparent; border-radius:var(--r-pill);
  font-family:var(--f-body); font-weight:600; font-size:.95rem; line-height:1.65;
  box-shadow:var(--sh-accent);
  transition:transform .18s var(--ease), box-shadow .25s var(--ease), background .2s var(--ease);
}
#contactos .wp-formcraft-frontend button:hover{
  transform:translateY(-2px);
  background-color:var(--accent-600) !important;
}
#contactos .wp-formcraft-frontend button:active{ transform:translateY(0); }

/* ---------- 28. Convite a descer, no fundo do hero ---------- */
/* Um rato desenhado a CSS: a caixa é o corpo, o filho é a roda. Fica ao
   centro, na mesma linha de base dos indicadores das fotografias — que são
   à esquerda, por isso não se estorvam. É <a> e não <div>: quem carrega
   desce mesmo, e quem navega por teclado apanha-o na ordem certa. */
.hero__scroll{
  position:absolute; left:50%; bottom:clamp(1.75rem,4vw,3rem);
  z-index:2;
  display:grid; place-items:center;
  padding:.35rem;
  color:#fff; text-decoration:none;
  animation:hero-saltar 2.2s var(--ease) infinite;
}
.hero__mouse{
  display:block; width:26px; height:42px;
  /* raio pela metade da largura: sem isto deixa de se ler como um rato */
  border:2px solid rgba(255,255,255,.6);
  border-radius:13px;
  transition:border-color .25s var(--ease);
}
.hero__wheel{
  display:block; width:3px; height:8px;
  margin:7px auto 0;
  border-radius:2px;
  background:rgba(255,255,255,.9);
  animation:hero-roda 2.2s var(--ease) infinite;
}
.hero__scroll:hover .hero__mouse,
.hero__scroll:focus-visible .hero__mouse{ border-color:#fff; }

/* O salto leva o translateX(-50%) dentro: sem ele o rato saltava para o
   lado ao arrancar a animação. */
@keyframes hero-saltar{
  0%,100%{ transform:translate(-50%,0); }
  50%    { transform:translate(-50%,8px); }
}
@keyframes hero-roda{
  0%  { opacity:0; transform:translateY(-4px); }
  30% { opacity:1; }
  70% { opacity:1; transform:translateY(10px); }
  100%{ opacity:0; transform:translateY(10px); }
}

/* Em ecrãs baixos ao deitado o hero mal tem altura: o rato só roubava espaço. */
@media (max-width:960px) and (orientation:landscape) and (max-height:520px){
  .hero__scroll{ display:none; }
}
@media (prefers-reduced-motion:reduce){
  .hero__scroll{ animation:none !important; transform:translateX(-50%) !important; }
  .hero__wheel{ animation:none !important; }
}

/* ---------- 29. Botão de contacto no topo, em ecrã estreito ---------- */
/* Deixou de viver na gaveta e passou a partilhar a barra com os ícones:
   encolhe para caber ao lado deles sem empurrar a marca. */
@media (max-width:960px){
  .nav__cta .btn{ padding:.6rem 1rem; font-size:.9rem; }
}
@media (max-width:560px){
  .nav__cta .btn{ padding:.55rem .8rem; font-size:.84rem; }
}

/* ---------- 31. Cartão de produto no telemóvel ---------- */
/*
 * O que este bloco escondia — referência comprida, selo de disponibilidade,
 * preço encostado ao botão — saiu do cartão da homepage com o desenho novo.
 * Sobrou fotografia, família, nome e uma acção, que cabem nas duas colunas
 * de telemóvel sem se atropelarem.
 *
 * A regra que fica é a da família: em coluna estreita, é a única linha de
 * monoespaçado do cartão e não pode partir a meio de uma palavra.
 */
@media (max-width:680px){
  .produtos--destaque .prod__ref{ overflow-wrap:anywhere; }
}
