// Landing page sections const { useState: useStateP, useEffect: useEffectP } = React; /* ---------------- NAV ---------------- */ function Nav() { const [scrolled, setScrolled] = useStateP(false); const [open, setOpen] = useStateP(false); useEffectP(() => { const on = () => setScrolled(window.scrollY > 16); on(); window.addEventListener("scroll", on, { passive: true }); return () => window.removeEventListener("scroll", on); }, []); return (
{open && (
{NE.nav.map((l) => setOpen(false)}>{l.label})}
)}
); } /* ---------------- HERO ---------------- */ function Hero() { const h = NE.hero; return (
); } /* ---------------- PAIN ---------------- */ function Pain() { const p = NE.pain; return (
{p.eyebrow} {p.title} {p.sub}
{p.items.map((it, i) => (

{it}

))}

{p.closer}

); } /* ---------------- SOLUTION / FEATURES ---------------- */ function Solution() { const s = NE.solution; return (
{s.eyebrow} {s.title} {s.sub}
{s.features.map((f, i) => (

{f.title}

{f.desc}

))}
); } /* ---------------- DEMO band (interactive) ---------------- */ function Demo() { return (
Veja na prática Toda a sua escala na palma da mão. Acompanhe a pré-escala, conteste dentro do prazo e baixe a escala definitiva por setor, tudo pelo celular, em tempo real. {["Pré-escala com prazo para contestação", "Escala definitiva publicada por setor", "Plantões, trocas e ausências num só lugar"].map((t) => ( {t} ))}
App Na Escala — agenda mensal de plantões com pré-escala e escala definitiva
); } /* ---------------- DIFERENCIAIS ---------------- */ function Diferenciais() { const d = NE.diferenciais; return (
{d.eyebrow} {d.title} {d.sub}
{d.items.map((it, i) => (

{it.title}

{it.desc}

))}

{d.closer.title}

{d.closer.text}

); } /* ---------------- BENEFITS / STATS ---------------- */ function Benefits() { const b = NE.benefits; return (
{b.eyebrow} {b.title}
{b.items.map((s, i) => ( {s.stat} {s.label} ))}
{b.list.map((it, i) => ( {it} ))}
); } /* ---------------- SOCIAL PROOF ---------------- */ function Social() { const s = NE.social; const items = s.testimonials; const [i, setI] = useStateP(0); const [paused, setPaused] = useStateP(false); const go = (n) => setI((n + items.length) % items.length); useEffectP(() => { if (paused) return; const t = setInterval(() => setI((p) => (p + 1) % items.length), 6500); return () => clearInterval(t); }, [paused, items.length]); const t = items[i]; return (
{s.eyebrow}

{s.title}

setPaused(true)} onMouseLeave={() => setPaused(false)} >
{t.quote}
{t.init} {t.author}{t.role}
{items.map((_, n) => (
); } /* ---------------- OFFER ---------------- */ function Offer() { const o = NE.offer; return (
{o.eyebrow}

{o.title}

    {o.included.map((it) => (
  • {it}
  • ))}
Oferta especial

{o.trialTitle}

{o.trialDesc}

{o.trialPoints.map((t) => ( {t} ))}
Sem cartão de crédito · cancele quando quiser
); } /* ---------------- FAQ ---------------- */ function Faq() { const f = NE.faq; const [open, setOpen] = useStateP(0); return (
{f.eyebrow} {f.title}
{f.items.map((it, i) => { const isOpen = open === i; return (

{it.a}

); })}
); } /* ---------------- FINAL CTA ---------------- */ function FinalCta() { const c = NE.finalCta; return (
); } /* ---------------- FOOTER ---------------- */ function Footer() { const f = NE.footer; return ( ); } /* ---------------- BACK TO TOP ---------------- */ function BackToTop() { const [show, setShow] = useStateP(false); useEffectP(() => { const on = () => { const sc = window.scrollY || document.documentElement.scrollTop; const vh = window.innerHeight || document.documentElement.clientHeight; setShow(sc > vh * 0.5); }; on(); window.addEventListener("scroll", on, { passive: true }); return () => window.removeEventListener("scroll", on); }, []); const toTop = () => window.scrollTo({ top: 0, behavior: "smooth" }); return ( ); } Object.assign(window, { Nav, Hero, Pain, Solution, Demo, Diferenciais, Benefits, Social, Offer, Faq, FinalCta, Footer, BackToTop });