// NEO Joinville — Landing Page
const { useState, useEffect, useRef, useCallback } = React;

const WA_PHONE = "5547999344415";
const PHONE_DISPLAY = "(47) 3028-7722";
const WA_DISPLAY = "(47) 99934-4415";

// ─── Google Places API ─────────────────────────────────────────────────────
// Preencha para ativar avaliações em tempo real (máx. 5 reviews — limite Google).
// 1. Crie um projeto em: https://console.cloud.google.com/apis/credentials
//    Ative "Places API" e gere uma Chave de API.
// 2. Encontre o Place ID em:
//    https://developers.google.com/maps/documentation/javascript/examples/places-placeid-finder
//    Busque: "NEO Joinville Av. Juscelino Kubitscheck 705 Centro"
const GOOGLE_PLACES_CONFIG = {
  apiKey:  '',  // ex: 'AIzaSyAbCdEfGhIjKlMnOpQrStUv'
  placeId: '',  // ex: 'ChIJrTLr-GyuEmsRBfy61i59si4'
};

const waLink = (msg) =>
`https://wa.me/${WA_PHONE}${msg ? `?text=${encodeURIComponent(msg)}` : ""}`;

const scrollToForm = () => {
  const el = document.getElementById('avaliacao');
  if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' });
};

const openWa = (msg) => window.open(waLink(msg), "_blank", "noopener");

/* ============== WHATSAPP ICON ============== */
function WaIcon({ size = 18, className }) {
  return (
    <svg
      className={className}
      width={size}
      height={size}
      viewBox="0 0 24 24"
      fill="currentColor"
      aria-hidden="true"
      style={{ display: 'inline-block', verticalAlign: 'middle', flexShrink: 0 }}
    >
      <path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.71.306 1.263.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 0 1-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 0 1-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 0 1 2.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0 0 12.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 0 0 5.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 0 0-3.48-8.413Z"/>
    </svg>
  );
}


/* ============== ANIMATION HOOKS ============== */
// Adds an 'in' class to the ref'd node when it scrolls into view (once).
function useInView(opts = {}) {
  const ref = useRef(null);
  const [inView, setInView] = useState(false);
  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    if (reduced) {setInView(true);el.classList.add('in');return;}
    const io = new IntersectionObserver((entries) => {
      entries.forEach((e) => {
        if (e.isIntersecting) {
          setInView(true);
          e.target.classList.add('in');
          io.unobserve(e.target);
        }
      });
    }, { threshold: opts.threshold ?? 0.18, rootMargin: opts.rootMargin ?? '0px 0px -40px 0px' });
    io.observe(el);
    return () => io.disconnect();
  }, []);
  return [ref, inView];
}

// Counts from 0 to `to` over `duration` ms when `start` is true.
function useCountTo(to, duration = 1500, start = true, decimals = 0) {
  const [val, setVal] = useState(0);
  useEffect(() => {
    if (!start) return;
    const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    if (reduced) {setVal(to);return;}
    let raf;
    const t0 = performance.now();
    const tick = (now) => {
      const p = Math.min(1, (now - t0) / duration);
      // easeOutQuart
      const eased = 1 - Math.pow(1 - p, 4);
      setVal(eased * to);
      if (p < 1) raf = requestAnimationFrame(tick);
    };
    raf = requestAnimationFrame(tick);
    return () => cancelAnimationFrame(raf);
  }, [to, duration, start]);
  return decimals === 0 ? Math.round(val) : Number(val.toFixed(decimals));
}

// Walks the document for .reveal / .reveal-scale / .reveal-right and the
// timeline + final-cta + testimonial-card sections, attaching a one-shot
// IntersectionObserver that adds .in when each enters the viewport.
function useGlobalRevealObserver() {
  useEffect(() => {
    const reduced = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    const selectors = [
    '.reveal', '.reveal-scale', '.reveal-right',
    '.timeline', '.final-cta', '.testimonial-card'];

    const nodes = document.querySelectorAll(selectors.join(','));
    if (reduced) {
      nodes.forEach((n) => n.classList.add('in'));
      return;
    }
    const io = new IntersectionObserver((entries) => {
      entries.forEach((e) => {
        if (e.isIntersecting) {
          e.target.classList.add('in');
          io.unobserve(e.target);
        }
      });
    }, { threshold: 0.15, rootMargin: '0px 0px -40px 0px' });
    nodes.forEach((n) => io.observe(n));
    return () => io.disconnect();
  }, []);
}

/* ============== TOPBAR ============== */
function Topbar() {
  return (
    <div className="topbar">
      <div className="container">
        <div className="left">Joinville – SC &nbsp;|&nbsp; Seg–Sex 8h–19h</div>
        <div className="right">
          <a href={`tel:+554730287722`}>{PHONE_DISPLAY}</a>
          <a href={waLink("Olá! Vi o site da NEO e gostaria de saber mais sobre implantes dentários. Podem me ajudar?")} target="_blank" rel="noopener"><WaIcon size={14} /> WhatsApp</a>
        </div>
      </div>
    </div>);

}

/* ============== HEADER ============== */
function Header({ onOpenMenu }) {
  return (
    <header className="header">
      <div className="inner">
        <a href="#top" aria-label="NEO Joinville — início">
          <img src="assets/logo-neo-primary.png" alt="NEO Joinville" style={{height:'60px',width:'auto',display:'block'}} />
        </a>
        <nav className="nav">
          <a href="#implantes">Implantes</a>
          <a href="#especialista">Especialista</a>
          <a href="#antes-depois">Antes &amp; Depois</a>
          <a href="#clinica">A Clínica</a>
          <a href="#faq">FAQ</a>
        </nav>
        <button className="btn btn-primary" onClick={scrollToForm}>
          Agendar Avaliação
        </button>
        <button className="menu-btn" aria-label="Abrir menu" onClick={onOpenMenu}>
          <svg viewBox="0 0 24 24" fill="none" strokeWidth="2" strokeLinecap="round">
            <path d="M4 6h16M4 12h16M4 18h16" />
          </svg>
        </button>
      </div>
    </header>);

}

function MobileMenu({ open, onClose }) {
  const click = (id) => {onClose();setTimeout(() => {document.querySelector(id)?.scrollIntoView({ behavior: 'smooth' });}, 200);};
  return (
    <div className={`mobile-menu ${open ? "open" : ""}`}>
      <div className="top">
        <span><img src="assets/logo-neo-primary.png" alt="NEO Joinville" style={{height:'52px',width:'auto',display:'block'}} /></span>
        <button className="menu-btn" onClick={onClose} aria-label="Fechar menu">
          <svg viewBox="0 0 24 24" fill="none" strokeWidth="2" strokeLinecap="round"><path d="M6 6l12 12M6 18L18 6" /></svg>
        </button>
      </div>
      <nav>
        <a onClick={() => click("#implantes")}>Implantes</a>
        <a onClick={() => click("#especialista")}>Especialista</a>
        <a onClick={() => click("#antes-depois")}>Antes &amp; Depois</a>
        <a onClick={() => click("#clinica")}>A Clínica</a>
        <a onClick={() => click("#faq")}>FAQ</a>
      </nav>
      <button className="btn btn-primary" onClick={() => { onClose(); setTimeout(scrollToForm, 250); }}>
        Agendar Avaliação
      </button>
    </div>);

}

/* ============== AUTHORITY ============== */
function AuthorityItem({ inView, target, format, suffix, prefix, label, decimals = 0 }) {
  const val = useCountTo(target, 1500, inView, decimals);
  const display = format ? format(val) : `${prefix || ""}${val.toLocaleString("pt-BR")}${suffix || ""}`;
  return (
    <div className="item">
      <div className="num">{display}</div>
      <div className="label">{label}</div>
    </div>);

}

function AuthorityBar() {
  const [ref, inView] = useInView();
  return (
    <div className="authority" ref={ref}>
      <div className="container">
        <div className="grid">
          <AuthorityItem inView={inView} target={2000} prefix="+" label="Implantes Realizados" />
          <AuthorityItem
            inView={inView}
            target={4.9}
            decimals={1}
            format={(v) => <><span style={{ color: '#FFFFFF', opacity: 0.9 }}>★</span> {v.toFixed(1)}<span style={{ color: 'rgba(255,255,255,0.7)', fontWeight: 600 }}>/5</span></>}
            label="Avaliação no Google" />
          
          <AuthorityItem inView={inView} target={15} suffix=" Anos" label="de Experiência" />
          <div className="item">
            <div className="num">Certificado</div>
            <div className="label">Internacional</div>
          </div>
        </div>
      </div>
    </div>);

}

/* ============== HERO ============== */
function AvaliacaoForm({ variant }) {
  const [form, setForm] = useState({ nome: "", whatsapp: "", situacao: "", horario: "" });
  const update = (k) => (e) => setForm({ ...form, [k]: e.target.value });
  const [sending, setSending] = useState(false);
  const SHEET_URL = "https://script.google.com/macros/s/AKfycbykII1U-wZzNTl3oBizWoFEwE016T7RYjgcISmXkT1B4Cd30P3hiITukfl5XDq020HZAA/exec";
  const submit = (e) => {
    e.preventDefault();
    if (!form.nome || !form.whatsapp || sending) return;
    setSending(true);
    const msg = `Olá! Vim pelo site da NEO Joinville e gostaria de agendar minha avaliação gratuita.\n\n👤 Nome: ${form.nome}\n📱 WhatsApp: ${form.whatsapp}\n🦷 Situação: ${form.situacao || "Não informada"}\n🕐 Melhor horário: ${form.horario || "Não informado"}\n\nAguardo o contato da equipe!`;
    const waUrl = `https://api.whatsapp.com/send/?phone=${WA_PHONE}&text=${encodeURIComponent(msg)}`;
    fetch(SHEET_URL, {
      method: "POST",
      mode: "no-cors",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ nome: form.nome, whatsapp: form.whatsapp, situacao: form.situacao || "Não informada", horario: form.horario || "Não informado" })
    }).finally(() => {
      setSending(false);
      window.location.href = waUrl;
    });
  };
  return (
    <form className={`form-card ${variant || ""}`} onSubmit={submit}>
      <h3>Avaliação Gratuita</h3>
      <p className="form-sub">Preencha e entraremos em contato em até 2 horas.</p>
      <div className="field">
        <label>Nome completo</label>
        <input required type="text" placeholder="Seu nome" value={form.nome} onChange={update("nome")} />
      </div>
      <div className="field">
        <label>WhatsApp</label>
        <input required type="tel" placeholder="(47) 9 9999-9999" value={form.whatsapp} onChange={update("whatsapp")} />
      </div>
      <div className="field">
        <label>Qual é sua situação?</label>
        <select value={form.situacao} onChange={update("situacao")}>
          <option value="">Selecione…</option>
          <option>Perdi um ou mais dentes</option>
          <option>Uso prótese removível</option>
          <option>Quero trocar por implante fixo</option>
          <option>Quero Protocolo All-on-4</option>
          <option>Outro</option>
        </select>
      </div>
      <div className="field">
        <label>Melhor horário</label>
        <select value={form.horario} onChange={update("horario")}>
          <option value="">Selecione…</option>
          <option>Manhã</option>
          <option>Tarde</option>
          <option>Qualquer</option>
        </select>
      </div>
      <button type="submit" className="btn btn-primary" disabled={sending}>{sending ? "Enviando..." : <><WaIcon /> Agendar pelo WhatsApp</>}</button>
      <div className="form-foot">Seus dados estão seguros. Não enviamos spam.</div>
    </form>);

}

function Hero() {
  return (
    <section className="hero" id="top">
      <div className="container">
        <div className="grid">
          <div className="hero-content">
            <h1>
              <span className="hero-line"><span className="hero-word" style={{ "--i": 0 }}>Recupere</span>{" "}<span className="hero-word" style={{ "--i": 1 }}>seu</span>{" "}<span className="hero-word" style={{ "--i": 2 }}>sorriso</span></span>
              <span className="hero-line"><span className="hero-word" style={{ "--i": 3 }}>com</span>{" "}<span className="hero-word accent" style={{ "--i": 4 }}>implantes</span>{" "}<span className="hero-word accent" style={{ "--i": 5 }}>dentários</span></span>
              <span className="hero-line"><span className="hero-word" style={{ "--i": 6 }}>em</span>{" "}<span className="hero-word" style={{ "--i": 7 }}>Joinville</span></span>
            </h1>
            <p className="sub">
              Chega de se esconder ao sorrir. Com tecnologia de ponta e equipe especializada,
              devolvemos sua confiança com segurança e conforto.
            </p>
            <ul className="bullets">
              {[
              "Avaliação inicial 100% gratuita",
              "+2.000 pacientes transformados em Joinville",
              "Atendimento particular humanizado"].
              map((t, i) =>
              <li key={i} style={{ "--i": i }}><span className="check">✓</span>{t}</li>
              )}
            </ul>
            <div className="hero-cta">
              <button className="btn btn-primary" onClick={scrollToForm}>
                <WaIcon /> Quero Minha Avaliação Gratuita
              </button>
            </div>
          </div>
          <div className="hero-visual-col">
            <img src="assets/hero-couple.webp" alt="Casal idoso brindando, com fotos de momentos de constrangimento ao lado" className="hero-couple-img" loading="eager" />
          </div>
        </div>
      </div>
    </section>);

}

/* ============== AVALIAÇÃO (form section) ============== */
function AvaliacaoSection() {
  return (
    <section className="avaliacao-section" id="avaliacao">
      <div className="avaliacao-bg" aria-hidden="true">
        <span className="blob blob-1"></span>
        <span className="blob blob-2"></span>
      </div>
      <div className="container">
        <div className="avaliacao-grid">
          <div className="avaliacao-copy reveal">
            <span className="section-label">Sua transformação começa aqui</span>
            <h2>
              Agende sua <span className="lime">avaliação gratuita</span> e descubra
              o melhor tratamento pra você
            </h2>
            <p className="avaliacao-sub">
              Em uma única consulta — sem custo e sem compromisso — você recebe diagnóstico
              completo, plano personalizado e todas as opções para recuperar seu sorriso.
            </p>

            <ul className="avaliacao-perks">
            </ul>

            <div className="avaliacao-trust">
              <span className="trust-chip">⏱ 30 min</span>
              <span className="trust-chip">💸 R$ 0,00</span>
              <span className="trust-chip">🔒 Sem compromisso</span>
            </div>
          </div>

          <div className="avaliacao-form-wrap reveal-right">
            <AvaliacaoForm variant="form-card-elevated" />
          </div>
        </div>
      </div>
    </section>);

}

/* ============== PAIN ICONS ============== */
function PainIcon({ name }) {
  const common = {
    width: 28, height: 28,
    viewBox: "0 0 24 24",
    fill: "none",
    stroke: "currentColor",
    strokeWidth: 1.75,
    strokeLinecap: "round",
    strokeLinejoin: "round",
    "aria-hidden": true,
  };
  switch (name) {
    case "shame":
      return <span className="pain-mask" style={{ "--icon-url": "url('assets/depression.svg')" }} aria-hidden="true" />;
    case "eat":
      return <span className="pain-mask" style={{ "--icon-url": "url('assets/dish.svg')" }} aria-hidden="true" />;
    case "denture":
      return <span className="pain-mask" style={{ "--icon-url": "url('assets/teeth.svg')" }} aria-hidden="true" />;
    case "shield":
      // Robotic surgery icon
      return <span className="pain-mask" style={{ "--icon-url": "url('assets/robotic-surgery.svg')" }} aria-hidden="true" />;
    case "bone":
      // Jaw / bone loss icon
      return <span className="pain-mask" style={{ "--icon-url": "url('assets/jaw.svg')" }} aria-hidden="true" />;
    case "heart-crack":
      return <span className="pain-mask" style={{ "--icon-url": "url('assets/sad.svg')" }} aria-hidden="true" />;
    default:
      return null;
  }
}

/* ============== PAIN ============== */
function PainSection() {
  const pains = [
  { i: "shame", t: "Vergonha ao sorrir", d: "Você evita mostrar os dentes e se esconde em fotos por conta dos espaços ou da prótese?" },
  { i: "eat", t: "Dificuldade para comer", d: "Carnes, frutas, alimentos duros viram um desafio diário por causa de dentes faltando ou soltos?" },
  { i: "denture", t: "Prótese que incomoda", d: "Dentadura soltando na hora errada, creme fixador, dor na gengiva e insegurança constante?" },
  { i: "shield", t: "Medo da cirurgia", d: "O procedimento é minimamente invasivo, feito com anestesia local. A maioria sente apenas pressão." },
  { i: "bone", t: "Perda óssea avançada", d: "Mesmo casos complexos têm solução com técnicas modernas como o All-on-4." },
  { i: "heart-crack", t: "Autoestima abalada", d: "Devolver seu sorriso é devolver sua confiança pra rir, falar e viver sem medo." }];

  return (
    <section className="bg-light" id="dor">
      <div className="container">
        <div className="section-head reveal">
          <span className="section-label">Você se identifica?</span>
          <h2>Viver sem dentes afeta muito mais do que você imagina</h2>
        </div>
        <div className="grid-3">
          {pains.map((p, i) =>
          <div className="pain-card reveal" key={i} style={{ "--i": i % 3 }}>
              <span className="pain-icon"><PainIcon name={p.i} /></span>
              <h3>{p.t}</h3>
              <p>{p.d}</p>
            </div>
          )}
        </div>
        <div className="section-cta reveal">
          <button className="btn btn-primary" onClick={scrollToForm}>
            <WaIcon /> Quero Resolver Isso Agora
          </button>
        </div>
      </div>
    </section>);

}

/* ============== TREATMENTS ============== */
function Treatments() {
  const items = [
  { n: "01", t: "Implante Unitário", d: "Substitui um único dente perdido com naturalidade total. Coroa em zircônia indistinguível do dente natural.", img: "assets/implante-unitario.png", alt: "Implante unitário em corte 3D", btn: "Quero Implante Unitário", wa: "Olá! Tenho interesse em Implante Unitário. Gostaria de agendar uma avaliação gratuita." },
  { n: "02", t: "Implantes Zigomáticos", d: "Solução para casos de perda óssea severa. Implantes longos fixados no osso zigomático (maçã do rosto).", img: "assets/implante-zigomatico.jpg", alt: "Implante zigomático em 3D", btn: "Quero Implante Zigomático", wa: "Olá! Tenho interesse em Implantes Zigomáticos. Gostaria de agendar uma avaliação gratuita." },
  { n: "03", t: "Prótese Protocolo", d: "Reabilitação completa da arcada com apenas 4 ou 6 implantes. Dentes fixos no mesmo dia, sem necessidade de enxerto na maioria dos casos.", img: "assets/protocolo-allon4.png", alt: "Protocolo All-on-4 em 3D", btn: "Quero Prótese Protocolo", wa: "Olá! Tenho interesse em Prótese Protocolo (All-on-4). Gostaria de agendar uma avaliação gratuita." }];

  return (
    <section id="implantes">
      <div className="container">
        <div className="section-head reveal">
          <span className="section-label">Nossas Especialidades</span>
          <h2>Qual tratamento é o <span className="lime">ideal</span> para você?</h2>
          <p>Oferecemos diferentes técnicas para cada situação. Na avaliação gratuita, escolhemos a melhor para o seu caso.</p>
        </div>
        <div className="grid-3" id="protocolo">
          {items.map((it, i) =>
          <div className="treatment-card reveal" key={i} style={{ "--i": i }}>
              <div className="treatment-media">
                <img src={it.img} alt={it.alt} loading="lazy" />
                <span className="treatment-num">{it.n}</span>
              </div>
              <div className="treatment-body">
                <h3>{it.t}</h3>
                <p>{it.d}</p>
                <a className="btn btn-primary" href={waLink(it.wa)} target="_blank" rel="noopener"><WaIcon /> {it.btn}</a>
              </div>
            </div>
          )}
        </div>
      </div>
    </section>);

}

/* ============== DOCTOR ============== */
function Doctor() {
  return (
    <section className="doctor bg-light" id="especialista">
      <div className="container">
        <div className="grid">
          <div className="doctor-photo reveal-scale">
            <img src="assets/dr-leonardo.webp" alt="Dr. Leonardo L. Reinert" />
            <div className="doctor-seal">
              <div className="seal-icon" aria-hidden="true">
                <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
                  <circle cx="12" cy="8" r="6" />
                  <path d="M15.5 13.5L17 22l-5-3-5 3 1.5-8.5" />
                </svg>
              </div>
              <div className="seal-content">
                <div className="seal-num">+2.000</div>
                <div className="seal-lbl">Implantes realizados</div>
              </div>
            </div>
          </div>
          <div className="reveal">
            <span className="section-label">Conheça o especialista</span>
            <h2>Dr. Leonardo L. Reinert — <span className="lime">Implantodontista</span></h2>
            <p>
              Especialista em Implantodontia e Cirurgia Bucomaxilofacial, o Dr. Leonardo conduz
              pessoalmente cada etapa do tratamento — da avaliação inicial à coroa definitiva.
              Mais de 2.000 implantes realizados em Joinville, sempre com técnica de ponta e
              atenção individual a cada caso.
            </p>
            <p>
              Seu compromisso é devolver autoestima e qualidade de vida através de tratamentos
              que combinam rigor técnico e acolhimento humano.
            </p>
            <ul className="creds">
              <li>
                <span className="cred-icon" style={{background:'rgba(183,199,44,0.15)',color:'var(--lime)'}}>
                  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>
                </span>
                <span>Especialista em Implantodontia e Cirurgia Bucomaxilofacial</span>
              </li>
              <li>
                <span className="cred-icon" style={{background:'rgba(183,199,44,0.15)',color:'var(--lime)'}}>
                  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>
                </span>
                <span>Mais de 15 anos de experiência clínica em Joinville</span>
              </li>
              <li>
                <span className="cred-icon" style={{background:'rgba(183,199,44,0.15)',color:'var(--lime)'}}>
                  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>
                </span>
                <span>CRO/SC 13586</span>
              </li>
              <li>
                <span className="cred-icon" style={{background:'rgba(183,199,44,0.15)',color:'var(--lime)'}}>
                  <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><polyline points="20 6 9 17 4 12"></polyline></svg>
                </span>
                <span>Atende exclusivamente em Joinville – SC</span>
              </li>
            </ul>
            <button className="btn btn-primary" onClick={scrollToForm}>
              <WaIcon /> Agendar com Dr. Leonardo
            </button>
          </div>
        </div>
      </div>
    </section>);

}

/* ============== PROCESS ============== */
function Process() {
  const steps = [
  { t: "Avaliação Gratuita", d: "Exame clínico completo, radiografia e planejamento digital do seu caso, sem custo." },
  { t: "Plano Personalizado", d: "Apresentamos as opções ideais para seu caso, com prazos e formas de pagamento." },
  { t: "Procedimento", d: "Cirurgia rápida, com anestesia local e sedação se desejar. Conforto e segurança em 1º lugar." },
  { t: "Sorriso Novo!", d: "Em poucos meses (ou no mesmo dia com carga imediata) você exibe seu sorriso transformado." }];

  return (
    <section id="processo">
      <div className="container">
        <div className="section-head reveal">
          <span className="section-label">Sem mistério</span>
          <h2>Como funciona o <span className="lime">tratamento</span>?</h2>
          <p>Da avaliação ao sorriso novo, um processo simples e transparente.</p>
        </div>
        <div className="timeline">
          {steps.map((s, i) =>
          <div className="step" key={i} style={{ "--i": i }}>
              <div className="step-circle">{i + 1}</div>
              <h3>{s.t}</h3>
              <p>{s.d}</p>
            </div>
          )}
        </div>
      </div>
    </section>);

}

/* ============== BEFORE / AFTER ============== */
function CompareSlider({ beforeSrc, afterSrc }) {
  const [x, setX] = useState(50);
  const ref = useRef(null);
  const dragging = useRef(false);

  const move = useCallback((clientX) => {
    const el = ref.current;if (!el) return;
    const rect = el.getBoundingClientRect();
    const pct = Math.max(8, Math.min(92, (clientX - rect.left) / rect.width * 100));
    setX(pct);
  }, []);

  useEffect(() => {
    const onMove = (e) => {if (!dragging.current) return;e.preventDefault();const cx = e.touches ? e.touches[0].clientX : e.clientX;move(cx);};
    const onUp = () => {dragging.current = false;};
    window.addEventListener('mousemove', onMove);
    window.addEventListener('mouseup', onUp);
    window.addEventListener('touchmove', onMove, { passive: false });
    window.addEventListener('touchend', onUp);
    return () => {
      window.removeEventListener('mousemove', onMove);
      window.removeEventListener('mouseup', onUp);
      window.removeEventListener('touchmove', onMove);
      window.removeEventListener('touchend', onUp);
    };
  }, [move]);

  const start = (e) => {
    dragging.current = true;
    const cx = e.touches ? e.touches[0].clientX : e.clientX;
    move(cx);
  };

  return (
    <div
      className="compare"
      ref={ref}
      style={{ "--x": `${x}%` }}
      onMouseDown={start}
      onTouchStart={start}>
      
      <div className="img before"><img src={beforeSrc} alt="Antes" /></div>
      <div className="img after"><img src={afterSrc} alt="Depois" /></div>
      <span className="tag left">ANTES</span>
      <span className="tag right">DEPOIS</span>
      <div className="divider"></div>
      <div className="handle">‹ ›</div>
    </div>);

}

function BeforeAfter() {
  const [current, setCurrent] = useState(0);
  const [cardW, setCardW] = useState(0);
  const [perView, setPerView] = useState(3);
  const wrapRef = useRef(null);

  useEffect(() => {
    const calc = () => {
      if (!wrapRef.current) return;
      const pv = window.innerWidth <= 560 ? 1 : window.innerWidth <= 900 ? 2 : 3;
      setPerView(pv);
      setCardW((wrapRef.current.offsetWidth - 24 * (pv - 1)) / pv);
    };
    calc();
    window.addEventListener('resize', calc);
    return () => window.removeEventListener('resize', calc);
  }, []);

  useEffect(() => {
    setCurrent(prev => Math.min(prev, Math.max(0, cases.length - perView)));
  }, [perView]);

  const cases = [
    { t: "Protocolo All-on-4", d: "Reabilitação completa da arcada superior com implantes fixos e prótese definitiva em zircônia.", badge: "Concluído em NEO Joinville", before: "assets/antes-1.jpg", after: "assets/depois-1.jpg" },
    { t: "Protocolo All-on-4", d: "Arcada completa recuperada com quatro implantes. Dentes fixos, sem desconforto, resultado natural.", badge: "Concluído em NEO Joinville", before: "assets/antes-2.jpg", after: "assets/depois-2.jpg" },
    { t: "Múltiplos implantes", d: "Recuperação de dentes perdidos com implantes unitários e coroas em zircônia indistinguíveis dos naturais.", badge: "Concluído em NEO Joinville", before: "assets/antes-4.jpg", after: "assets/depois-4.jpg" },
    { t: "Múltiplos implantes", d: "Reabilitação parcial com implantes integrados ao sorriso existente, sem alterar a estética natural.", badge: "Concluído em NEO Joinville", before: "assets/antes-6.jpg", after: "assets/depois-6.jpg" },
    { t: "Protocolo All-on-4", d: "Paciente recuperou função mastigatória e autoestima com arcada fixa sobre implantes, sem necessidade de enxerto.", badge: "Concluído em NEO Joinville", before: "assets/antes-9.jpg", after: "assets/depois-9.jpg" },
    { t: "Protocolo All-on-4", d: "Reabilitação de arcada com implantes. Resultado funcional e estético que devolveu o sorriso e a confiança.", badge: "Concluído em NEO Joinville", before: "assets/antes-10.jpg", after: "assets/depois-10.jpg" },
  ];

  const maxIdx = Math.max(0, cases.length - perView);
  const goTo = (idx) => setCurrent(Math.max(0, Math.min(maxIdx, idx)));
  const trackOffset = cardW > 0 ? current * (cardW + 24) : 0;

  return (
    <section className="bg-light" id="antes-depois">
      <div className="container">
        <div className="section-head reveal">
          <span className="section-label">Casos reais</span>
          <h2>Transformações que <span className="lime">emocionam</span></h2>
          <p>Pacientes reais da NEO Joinville. Arraste a alça para comparar antes e depois.</p>
        </div>
        <div className="carousel-outer" ref={wrapRef}>
          <div className="carousel-track" style={{transform: `translateX(-${trackOffset}px)`}}>
            {cases.map((c, i) =>
              <div className="ba-card" key={i}>
                <CompareSlider beforeSrc={c.before} afterSrc={c.after} />
                <div className="ba-body">
                  <h3>{c.t}</h3>
                  <p>{c.d}</p>
                  <span className="ba-badge">{c.badge}</span>
                </div>
              </div>
            )}
          </div>
        </div>
        <div className="carousel-nav">
          <button className="carousel-btn" onClick={() => goTo(current - 1)} disabled={current === 0}>
            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><path d="M15 18l-6-6 6-6"/></svg>
          </button>
          <span className="carousel-count">
            <span className="cur">{String(current + 1).padStart(2, '0')}</span>
            <span style={{color:'var(--gray-200)',margin:'0 6px'}}>/</span>
            <span>{String(maxIdx + 1).padStart(2, '0')}</span>
          </span>
          <button className="carousel-btn" onClick={() => goTo(current + 1)} disabled={current >= maxIdx}>
            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round"><path d="M9 18l6-6-6-6"/></svg>
          </button>
        </div>
        <div className="section-cta reveal">
          <button className="btn btn-primary" onClick={scrollToForm}>
            <WaIcon /> Quero Minha Transformação
          </button>
        </div>
      </div>
    </section>);
}

/* ============== TESTIMONIALS (Trustindex) ============== */
function Testimonials() {
  const ref = useRef(null);
  useEffect(() => {
    if (!ref.current) return;
    const s = document.createElement('script');
    s.src = 'https://cdn.trustindex.io/loader.js?6bfdb2772ab0223772266c141fc';
    s.defer = true;
    s.async = true;
    ref.current.appendChild(s);

    // Injeta setas customizadas após o widget carregar
    const injectArrows = setInterval(() => {
      const prev = ref.current.querySelector('.ti-prev');
      const next = ref.current.querySelector('.ti-next');
      if (!prev || !next) return;
      clearInterval(injectArrows);

      // Cria container de navegação customizado
      const nav = document.createElement('div');
      nav.className = 'ti-custom-nav';
      const btnPrev = document.createElement('button');
      btnPrev.className = 'carousel-btn';
      btnPrev.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M15 18l-6-6 6-6"/></svg>';
      btnPrev.onclick = () => prev.click();
      const btnNext = document.createElement('button');
      btnNext.className = 'carousel-btn';
      btnNext.innerHTML = '<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"/></svg>';
      btnNext.onclick = () => next.click();
      nav.appendChild(btnPrev);
      nav.appendChild(btnNext);

      const widget = ref.current.querySelector('.ti-widget');
      if (widget) {
        widget.appendChild(nav);

        // Auto-scroll a cada 4 segundos, pausa no hover
        let auto = setInterval(() => next.click(), 4000);
        widget.addEventListener('mouseenter', () => clearInterval(auto));
        widget.addEventListener('mouseleave', () => { auto = setInterval(() => next.click(), 4000); });

        // Desabilita popup "leia mais" — expande texto inline
        const disableReadMore = () => {
          widget.querySelectorAll('[class*="read-more"], [class*="readmore"]').forEach(el => {
            el.style.display = 'none';
          });
          widget.querySelectorAll('[class*="review-content"], [class*="text-content"]').forEach(el => {
            el.style.webkitLineClamp = 'unset';
            el.style.maxHeight = 'none';
            el.style.overflow = 'visible';
            el.style.display = 'block';
          });
        };
        disableReadMore();
        // Intercepta cliques no "leia mais" para impedir popup
        widget.addEventListener('click', (e) => {
          const target = e.target.closest('[class*="read-more"], [class*="readmore"]');
          if (target) { e.preventDefault(); e.stopPropagation(); }
        }, true);
        // Observa mudanças no DOM (carrossel troca cards)
        const obs = new MutationObserver(disableReadMore);
        obs.observe(widget, { childList: true, subtree: true });
      }
    }, 500);

    return () => clearInterval(injectArrows);
  }, []);

  return (
    <section id="depoimentos">
      <div className="container">
        <div className="section-head reveal">
          <span className="section-label">O que dizem nossos pacientes</span>
          <h2>Histórias reais de <span className="lime">transformação</span></h2>
        </div>
        <div className="trustindex-wrap reveal" ref={ref}></div>
      </div>
    </section>);

}

/* ============== STRUCTURE ============== */
function Structure() {
  const tiles = [
  { src: "assets/estrutura-5.jpg", l: "Consultório" },
  { src: "assets/estrutura-1.jpg", l: "Atendimento clínico" },
  { src: "assets/estrutura-3.jpg", l: "Sala de planejamento" },
  { src: "assets/estrutura-4.jpg", l: "Recepção" },
  { src: "assets/estrutura-2.jpg", l: "Tomografia 3D" }];

  return (
    <section className="bg-light" id="clinica">
      <div className="container">
        <div className="section-head reveal">
          <span className="section-label">Nossa estrutura</span>
          <h2>Clínica <span className="lime">moderna</span> e acolhedora</h2>
          <p>Equipamentos de última geração para garantir precisão, segurança e conforto em cada procedimento.</p>
        </div>
        <div className="mosaic">
          {tiles.map((t, i) =>
          <div key={i} className={`tile tile-${i + 1} reveal-scale`} style={{ "--i": i }}>
              <img src={t.src} alt={t.l} loading="lazy" />
              <span className="lbl">{t.l}</span>
            </div>
          )}
        </div>
        <div className="section-cta reveal">
          <button className="btn btn-primary" onClick={scrollToForm}>
            <WaIcon /> Agendar Visita à Clínica
          </button>
        </div>
      </div>
    </section>);

}

/* ============== FAQ ============== */
function Faq() {
  const [open, setOpen] = useState(-1);
  const items = [
  { q: "Implante dentário dói?", a: "Não! O procedimento é feito sob anestesia local, então durante a cirurgia você não sente dor — apenas uma leve pressão. No pós-operatório pode haver desconforto por 2 a 3 dias, controlado com medicação simples prescrita por nós." },
  { q: "Quanto tempo dura um implante dentário?", a: "Com os cuidados corretos (higiene e consultas de manutenção), um implante pode durar a vida toda. Os implantes que colocamos têm garantia de 5 anos e são fabricados em titânio de grau médico, material 100% biocompatível." },
  { q: "O que é o All-on-4 e qual a diferença para o implante comum?", a: "O All-on-4 (Protocolo) é a reabilitação de uma arcada completa — todos os dentes superiores ou inferiores — apoiados em apenas 4 implantes estrategicamente posicionados. Permite dentes fixos no mesmo dia, sem necessidade de enxerto ósseo na maioria dos casos. É diferente do implante unitário, que substitui apenas um dente." },
  { q: "Tenho pouco osso na mandíbula. Posso fazer implante?", a: "Na maioria dos casos, sim! O All-on-4 foi criado justamente para pacientes com perda óssea. Para casos mais severos, temos o implante zigomático. Tudo isso é avaliado na consulta gratuita." },
  { q: "Vocês atendem convênio?", a: "Não trabalhamos com convênios. Atendemos exclusivamente em modalidade particular, o que nos permite oferecer o melhor tratamento, com tecnologia de ponta e dedicação total a cada paciente." },
  { q: "Quanto tempo leva o tratamento completo?", a: "Depende do tratamento. Com carga imediata (All-on-4), você já sai da clínica com dentes fixos no mesmo dia da cirurgia. Para implantes unitários, o processo de osseointegração leva em média 3 a 6 meses até a colocação da coroa definitiva. Cada caso é único!" }];

  return (
    <section id="faq">
      <div className="container">
        <div className="section-head reveal">
          <span className="section-label">Tire suas dúvidas</span>
          <h2>Perguntas <span className="lime">Frequentes</span></h2>
        </div>
        <div className="faq-wrap">
          {items.map((it, i) => {
            const isOpen = open === i;
            return (
              <div className={`faq-item ${isOpen ? "active" : ""}`} key={i}>
                <button className={`faq-q ${isOpen ? "open" : ""}`} onClick={() => setOpen(isOpen ? -1 : i)}>
                  <span className="faq-q-text">{it.q}</span>
                  <span className="faq-arrow" aria-hidden="true">
                    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.4" strokeLinecap="round" strokeLinejoin="round"><polyline points="6 9 12 15 18 9" /></svg>
                  </span>
                </button>
                <div className={`faq-a ${isOpen ? "open" : ""}`}>
                  <p>{it.a}</p>
                </div>
              </div>);

          })}
        </div>
      </div>
    </section>);

}

/* ============== FINAL CTA ============== */
function FinalCta() {
  return (
    <section className="bg-dark final-cta">
      <div className="particles" aria-hidden="true">
        <span></span><span></span><span></span><span></span>
      </div>
      <div className="container">
        <h2>Seu sorriso perfeito começa com <span className="lime">uma consulta gratuita</span></h2>
        <p className="sub">Mais de 2.000 pacientes já transformaram suas vidas. Chegou a sua vez. Sem compromisso, sem custo.</p>
        <div className="trust-badges">
          {[
          "Avaliação 100% Gratuita",
          "Sem compromisso",
          "4.9 no Google",
          "+2.000 implantes"].
          map((t, i) =>
          <span key={i} className="trust-pill" style={{ "--i": i }}>{t}</span>
          )}
        </div>
        <button className="btn btn-primary btn-lg" onClick={scrollToForm}>
          <WaIcon size={22} /> Agendar Minha Avaliação Gratuita
        </button>

      </div>
    </section>);

}

/* ============== FOOTER ============== */
function Footer() {
  return (
    <footer className="footer">
      <div className="container">
        <div className="grid">
          <div>
            <img src="assets/logo-neo-white.webp" className="logo-foot-img" alt="NEO Joinville" />
            <p className="desc">
              Clínica especializada em implantes dentários e reabilitação oral em Joinville.
              Mais de 15 anos devolvendo sorrisos e autoestima.
            </p>
            <div className="socials">
              <a href="https://www.instagram.com/neo.odontojoinville/" target="_blank" rel="noopener" aria-label="Instagram">
                <svg viewBox="0 0 24 24" fill="currentColor"><path d="M12,2.162c3.204,0,3.584,0.012,4.849,0.07c1.308,0.06,2.655,0.358,3.608,1.311c0.962,0.962,1.251,2.296,1.311,3.608c0.058,1.265,0.07,1.645,0.07,4.849c0,3.204-0.012,3.584-0.07,4.849c-0.059,1.301-0.364,2.661-1.311,3.608c-0.962,0.962-2.295,1.251-3.608,1.311c-1.265,0.058-1.645,0.07-4.849,0.07s-3.584-0.012-4.849-0.07c-1.291-0.059-2.669-0.371-3.608-1.311c-0.957-0.957-1.251-2.304-1.311-3.608c-0.058-1.265-0.07-1.645-0.07-4.849c0-3.204,0.012-3.584,0.07-4.849c0.059-1.296,0.367-2.664,1.311-3.608c0.96-0.96,2.299-1.251,3.608-1.311C8.416,2.174,8.796,2.162,12,2.162 M12,0C8.741,0,8.332,0.014,7.052,0.072C5.197,0.157,3.355,0.673,2.014,2.014C0.668,3.36,0.157,5.198,0.072,7.052C0.014,8.332,0,8.741,0,12c0,3.259,0.014,3.668,0.072,4.948c0.085,1.853,0.603,3.7,1.942,5.038c1.345,1.345,3.186,1.857,5.038,1.942C8.332,23.986,8.741,24,12,24c3.259,0,3.668-0.014,4.948-0.072c1.854-0.085,3.698-0.602,5.038-1.942c1.347-1.347,1.857-3.184,1.942-5.038C23.986,15.668,24,15.259,24,12c0-3.259-0.014-3.668-0.072-4.948c-0.085-1.855-0.602-3.698-1.942-5.038c-1.343-1.343-3.189-1.858-5.038-1.942C15.668,0.014,15.259,0,12,0z" /><path d="M12,5.838c-3.403,0-6.162,2.759-6.162,6.162c0,3.403,2.759,6.162,6.162,6.162s6.162-2.759,6.162-6.162C18.162,8.597,15.403,5.838,12,5.838z M12,16c-2.209,0-4-1.791-4-4s1.791-4,4-4s4,1.791,4,4S14.209,16,12,16z" /><circle cx="18.406" cy="5.594" r="1.44" /></svg>
              </a>
              <a href="https://www.facebook.com/NEOJOINVILLE/" target="_blank" rel="noopener" aria-label="Facebook">
                <svg viewBox="0 0 24 24" fill="currentColor"><path d="M24,12.073c0,5.989-4.394,10.954-10.13,11.855v-8.363h2.789l0.531-3.46H13.87V9.86c0-0.947,0.464-1.869,1.95-1.869h1.509V5.045c0,0-1.37-0.234-2.679-0.234c-2.734,0-4.52,1.657-4.52,4.656v2.637H7.091v3.46h3.039v8.363C4.395,23.025,0,18.061,0,12.073c0-6.627,5.373-12,12-12S24,5.445,24,12.073z" /></svg>
              </a>
              <a href={waLink("Olá! Encontrei a NEO pelo site e quero agendar minha avaliação gratuita de implantes. Qual o próximo horário disponível?")} target="_blank" rel="noopener" aria-label="WhatsApp">
                <svg viewBox="0 0 24 24" fill="currentColor"><path fillRule="evenodd" clipRule="evenodd" d="M20.463,3.488C18.217,1.24,15.231,0.001,12.05,0C5.495,0,0.16,5.334,0.157,11.892c-0.001,2.096,0.547,4.142,1.588,5.946L0.057,24l6.304-1.654c1.737,0.948,3.693,1.447,5.683,1.448h0.005c6.554,0,11.89-5.335,11.893-11.893C23.944,8.724,22.708,5.735,20.463,3.488z M12.05,21.785h-0.004c-1.774,0-3.513-0.477-5.031-1.378l-0.361-0.214l-3.741,0.981l0.999-3.648l-0.235-0.374c-0.99-1.574-1.512-3.393-1.511-5.26c0.002-5.45,4.437-9.884,9.889-9.884c2.64,0,5.122,1.03,6.988,2.898c1.866,1.869,2.893,4.352,2.892,6.993C21.932,17.351,17.498,21.785,12.05,21.785z M17.472,14.382c-0.297-0.149-1.758-0.868-2.031-0.967c-0.272-0.099-0.47-0.149-0.669,0.148s-0.767,0.967-0.941,1.166c-0.173,0.198-0.347,0.223-0.644,0.074c-0.297-0.149-1.255-0.462-2.39-1.475c-0.883-0.788-1.48-1.761-1.653-2.059s-0.018-0.458,0.13-0.606c0.134-0.133,0.297-0.347,0.446-0.521C9.87,9.97,9.919,9.846,10.019,9.647c0.099-0.198,0.05-0.372-0.025-0.521C9.919,8.978,9.325,7.515,9.078,6.92c-0.241-0.58-0.486-0.501-0.669-0.51C8.236,6.401,8.038,6.4,7.839,6.4c-0.198,0-0.52,0.074-0.792,0.372c-0.272,0.298-1.04,1.017-1.04,2.479c0,1.463,1.065,2.876,1.213,3.074c0.148,0.198,2.095,3.2,5.076,4.487c0.709,0.306,1.263,0.489,1.694,0.626c0.712,0.226,1.36,0.194,1.872,0.118c0.571-0.085,1.758-0.719,2.006-1.413c0.248-0.694,0.248-1.29,0.173-1.413C17.967,14.605,17.769,14.531,17.472,14.382z" /></svg>
              </a>
            </div>
          </div>

          <div>
            <h4>Navegação</h4>
            <ul>
              <li><a href="#implantes">Implantes</a></li>
              <li><a href="#especialista">Especialista</a></li>
              <li><a href="#clinica">Nossa Estrutura</a></li>
              <li><a href="#antes-depois">Antes &amp; Depois</a></li>
              <li><a href="#depoimentos">Depoimentos</a></li>
            </ul>
          </div>

          <div>
            <h4>Contato</h4>
            <div className="contact-line">
              <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" style={{flexShrink:0,marginTop:3,color:'var(--lime)'}}><path d="M21 10c0 7-9 13-9 13S3 17 3 10a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/></svg>
              <span>Av. Juscelino Kubitscheck, 705 - Centro, Joinville - SC, 89201-100</span>
            </div>
            <div className="contact-line">
              <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" style={{flexShrink:0,marginTop:3,color:'var(--lime)'}}><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.13.96.36 1.9.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.91.34 1.85.57 2.81.7A2 2 0 0 1 22 16.92z"/></svg>
              <span>{PHONE_DISPLAY}</span>
            </div>
            <div className="contact-line">
              <WaIcon size={16} />
              <span>WhatsApp {WA_DISPLAY}</span>
            </div>
            <div className="contact-line">
              <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round" style={{flexShrink:0,marginTop:3,color:'var(--lime)'}}><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
              <span>Seg–Sex 8h–19h</span>
            </div>
          </div>
        </div>

        <div className="footer-bot">
          <div>© 2026 NEO Joinville. Responsável Técnico: Dr. Eberson G. dos Santos – CRO/SC 10704</div>
          <div className="right">
            <a href="#">Política de Privacidade</a>
            <a href="#">Termos de Uso</a>
            <a href="https://acronn.com.br/metodo-clinica-360/" target="_blank" rel="noopener" className="footer-dev">
              <span>Desenvolvido por</span>
              <img src="assets/logo-acronn.svg" alt="Acronn" className="acronn-logo" />
            </a>
          </div>
        </div>
      </div>
    </footer>);

}

/* ============== WHATSAPP FLOAT ============== */
function WhatsAppFloat() {
  return (
    <div className="wa-float">
      <a className="wa-btn" href={waLink("Olá! Estou no site da NEO e gostaria de agendar uma avaliação gratuita para implantes dentários.")} target="_blank" rel="noopener" aria-label="Falar no WhatsApp">
        <WaIcon size={32} />
      </a>
      <div className="wa-bubble">Fale conosco agora!</div>
    </div>);

}

/* ============== SCROLL PROGRESS / BACK TO TOP ============== */
function ScrollProgress() {
  const [w, setW] = useState(0);
  useEffect(() => {
    const onScroll = () => {
      const h = document.documentElement;
      const total = h.scrollHeight - h.clientHeight;
      setW(total > 0 ? h.scrollTop / total * 100 : 0);
    };
    onScroll();
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  return <div className="scroll-progress" style={{ width: `${w}%` }} />;
}

function BackToTop() {
  const [show, setShow] = useState(false);
  useEffect(() => {
    const onScroll = () => setShow(window.scrollY > 600);
    window.addEventListener('scroll', onScroll, { passive: true });
    return () => window.removeEventListener('scroll', onScroll);
  }, []);
  return (
    <button
      className={`to-top ${show ? "show" : ""}`}
      aria-label="Voltar ao topo"
      onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}>
      
      <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.5" strokeLinecap="round" strokeLinejoin="round">
        <path d="M12 19V5M5 12l7-7 7 7" />
      </svg>
    </button>);

}

/* ============== APP ============== */
function App() {
  const [menuOpen, setMenuOpen] = useState(false);
  useEffect(() => {
    document.body.style.overflow = menuOpen ? "hidden" : "";
  }, [menuOpen]);
  useGlobalRevealObserver();

  return (
    <>
      <ScrollProgress />
      <Topbar />
      <Header onOpenMenu={() => setMenuOpen(true)} />
      <MobileMenu open={menuOpen} onClose={() => setMenuOpen(false)} />
      <Hero />
      <AuthorityBar />
      <AvaliacaoSection />
      <PainSection />
      <Treatments />
      <Doctor />
      <Process />
      <BeforeAfter />
      <Testimonials />
      <Structure />
      <Faq />
      <FinalCta />
      <Footer />
      <WhatsAppFloat />
      <BackToTop />
    </>);

}

ReactDOM.createRoot(document.getElementById("root")).render(<App />);