// app.jsx — SPCK landing page (single-page, dark, original brand) const { useState, useEffect, useRef, useMemo, useCallback } = React; /* ─────────────── CONFIG ─────────────── */ const SPCK_CONFIG = { accent: "#2E7DB8", accentDeep: "#1F5A8C", accentLight: "#A8C9E0", accentSoft: "rgba(46,125,184,0.18)", headlineIdx: 0, showCircuit: true, density: "regular", }; const ACCENT_PRESETS = { "#2E7DB8": { deep: "#1F5A8C", light: "#A8C9E0", soft: "rgba(46,125,184,0.18)" }, // brand azul "#7C5CFF": { deep: "#4E36C7", light: "#C8BCFF", soft: "rgba(124,92,255,0.18)" }, // violeta "#22C55E": { deep: "#0F8A47", light: "#A9E9C2", soft: "rgba(34,197,94,0.18)" }, // verde lima "#F0682E": { deep: "#B14820", light: "#F9C5A8", soft: "rgba(240,104,46,0.18)" } // âmbar }; const HEADLINES = [ { line1: "Tecnologia sob medida", line2: "para empresas que não têm tempo de errar." }, { line1: "Sistemas de verdade,", line2: "construídos por quem também faz produto." }, { line1: "Sai do improviso.", line2: "Entra software que dá conta do recado." }]; /* ─────────────── Reveal-on-scroll ─────────────── */ function Reveal({ children, delay = 0, as: As = "div", className = "" }) { const ref = useRef(null); useEffect(() => { const el = ref.current;if (!el) return; const io = new IntersectionObserver((ents) => { ents.forEach((e) => { if (e.isIntersecting) { setTimeout(() => e.target.classList.add("in"), delay); io.unobserve(e.target); } }); }, { threshold: 0.12, rootMargin: "0px 0px -40px 0px" }); io.observe(el); return () => io.disconnect(); }, [delay]); return {children}; } /* ─────────────── Card with mouse glow ─────────────── */ function GlowCard({ children, className = "", ...rest }) { const ref = useRef(null); const onMove = (e) => { const el = ref.current;if (!el) return; const rect = el.getBoundingClientRect(); el.style.setProperty("--mx", `${e.clientX - rect.left}px`); el.style.setProperty("--my", `${e.clientY - rect.top}px`); }; return (
{children}
); } /* ─────────────── Header ─────────────── */ function Header({ onCTA }) { const [scrolled, setScrolled] = useState(false); const [open, setOpen] = useState(false); useEffect(() => { const onS = () => setScrolled(window.scrollY > 8); onS();window.addEventListener("scroll", onS, { passive: true }); return () => window.removeEventListener("scroll", onS); }, []); const nav = [ { href: "#servicos", label: "Serviços" }, { href: "#processo", label: "Processo" }, { href: "#porque", label: "Por que a SPCK" }, { href: "#contato", label: "Contato" }]; return (
SPCK EMPRESA DE TECNOLOGIA
{/* mobile menu */} {open &&
{nav.map((n) => setOpen(false)} className="py-2 text-chrome-100">{n.label} )}
}
); } /* ─────────────── Hero ─────────────── */ function Hero({ headlineIdx, showCircuit, density, onCTA }) { const auroraRef = useRef(null); useEffect(() => { const onMove = (e) => { const el = auroraRef.current;if (!el) return; const x = (e.clientX / window.innerWidth - 0.5) * 12; const y = (e.clientY / window.innerHeight - 0.5) * 8; el.style.transform = `translate3d(${x}px, ${y}px, 0)`; }; window.addEventListener("mousemove", onMove); return () => window.removeEventListener("mousemove", onMove); }, []); const h = HEADLINES[headlineIdx % HEADLINES.length]; return (
{/* aurora */}
); } /* ─────────────── Credibility strip ─────────────── */ function CredStrip() { const items = [ "Baseados em São Paulo", "Equipe técnica enxuta", "Produtos próprios em produção", "Stack moderna"]; return (
{items.map((it, i) => {i > 0 && ·} {it} )}
); } /* ─────────────── Services ─────────────── */ const SERVICES = [ { i: IconCode, title: "Sistemas sob medida", desc: "Aplicações web completas para automatizar processos internos ou abrir novos canais. Stack moderna (Next.js, Supabase, Postgres) e código que sua equipe consegue manter no futuro.", tag: "01" }, { i: IconWorkflow, title: "Automações", desc: "Integrações entre sistemas, robôs de processo e fluxos de trabalho que eliminam tarefas repetitivas. Do disparo de WhatsApp ao fechamento mensal.", tag: "02" }, { i: IconGlobe, title: "Sites institucionais", desc: "Sites rápidos, performáticos e otimizados para SEO. Nada de templates engessados.", tag: "03" }, { i: IconChart, title: "Dashboards e BI", desc: "Painéis sob medida conectados aos seus dados. Indicadores que sua diretoria realmente vai abrir todo dia.", tag: "04" }, { i: IconCompass, title: "Consultoria em tecnologia", desc: "Avaliação de stack, escolha de ferramentas, arquitetura e roadmap. Para quando você precisa de uma segunda opinião técnica antes de investir.", tag: "05" }]; function Services() { return (
[ serviços ]

O que fazemos?

Cinco áreas de atuação. Tudo construído com a mesma stack moderna, com escopo fechado e prazo realista.

{SERVICES.map((s, i) => { const Icon = s.i; const isWide = i === 3; // dashboards card spans more on lg return (
{s.tag}

{s.title}

{s.desc}

{/* dashboard preview embedded only for card 4 */} {i === 3 &&
{[42, 28, 60, 38, 75, 52, 88, 64, 70, 95, 58, 80].map((h, k) =>
)}
} ); })}
); } /* ─────────────── Process ─────────────── */ const STEPS = [ { n: "01", title: "Diagnóstico", body: "Conversa de 30 minutos para entender o problema real, não o sintoma.", meta: "30 min · sem compromisso" }, { n: "02", title: "Proposta enxuta", body: "Escopo claro, prazo realista, preço fechado. Sem surpresa.", meta: "em até 5 dias úteis" }, { n: "03", title: "Entrega iterativa", body: "Você acompanha cada release. Nada de \"vamos voltar daqui a 3 meses\".", meta: "releases semanais" }]; function Process() { return (
[ processo ]

Como entregamos?

{/* connecting line */}
{STEPS.map((s, i) =>
{s.n}
{s.meta}

{s.title}

{s.body}

)}
); } /* ─────────────── Why SPCK ─────────────── */ const REASONS = [ { i: IconLayers, title: "Pensamento de produto, não só de código", body: "Construímos nossos próprios SaaS. Sabemos o que escala e o que vai dar dor de cabeça em 6 meses." }, { i: IconUsers, title: "Time enxuto, comunicação direta", body: "Você fala com quem está construindo. Sem intermediários." }, { i: IconSpark, title: "Stack moderna e padrão de mercado", body: "Next.js, TypeScript, Postgres, Supabase, Vercel. Você não fica refém de tecnologia obscura." }, { i: IconBook, title: "Documentação e handoff", body: "Se um dia você quiser internalizar, vai conseguir. Tudo entregue documentado." }]; function Why() { return (
[ por que ]

Por que escolher
a SPCK?

Quatro razões concretas. Sem promessa vazia.

{REASONS.map((r, i) => { const Icon = r.i; return (

{r.title}

{r.body}

); })}
); } /* ─────────────── Mid CTA banner ─────────────── */ function MidCTA({ onCTA }) { return (

Vamos conversar sobre o seu projeto?

Diagnóstico inicial sem compromisso, em 30 minutos.

); } /* ─────────────── Contact ─────────────── */ function Contact({ formRef }) { const [data, setData] = useState({ nome: "", email: "", empresa: "", telefone: "", tipo: "", msg: "" }); const [errors, setErrors] = useState({}); const [sent, setSent] = useState(false); const set = (k) => (e) => setData((d) => ({ ...d, [k]: e.target.value })); const validate = () => { const e = {}; if (!data.nome.trim()) e.nome = "Nome é obrigatório."; if (!data.email.trim()) e.email = "E-mail é obrigatório.";else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(data.email)) e.email = "E-mail inválido."; if (!data.tipo) e.tipo = "Selecione um tipo."; if (!data.msg.trim() || data.msg.trim().length < 12) e.msg = "Conte um pouco mais (mín. 12 caracteres)."; return e; }; const submit = async (e) => { e.preventDefault(); const errs = validate(); setErrors(errs); if (Object.keys(errs).length > 0) return; try { const res = await fetch("https://api.web3forms.com/submit", { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json" }, body: JSON.stringify({ access_key: "d34dc0ee-45c1-4989-9aad-4f6746a872f5", subject: `Novo lead SPCK — ${data.nome}`, from_name: "Site SPCK", ...data, }), }); if (res.ok) setSent(true); else alert("Erro ao enviar. Manda direto pro spck@spck.com.br."); } catch { alert("Erro ao enviar. Manda direto pro spck@spck.com.br."); } }; return (
[ contato ]

Conta o que
você precisa.

Diagnóstico em 30 minutos, sem compromisso. Respondemos em até um dia útil.

{sent ?

Recebemos.

Vamos responder em até um dia útil com próximos passos. Enquanto isso, fica à vontade pra mandar mais contexto pelo WhatsApp.

: <>