// GuerrerosCR — About, Tech, Blog, CTA, Contact, Footer function About() { const isEn = window.location.pathname.startsWith("/en"); const VALUES = isEn ? [ { t: "Clarity", d: "We explain solutions in simple terms and work with concrete objectives." }, { t: "Accountability", d: "Business technology must be reliable, secure, and stable." }, { t: "Practical approach", d: "We don't build for the sake of building. We create tools that solve real problems." }, { t: "Continuous improvement", d: "Every solution can evolve as the company grows." }, ] : [ { t: "Claridad", d: "Explicamos las soluciones de forma sencilla y trabajamos con objetivos concretos." }, { t: "Responsabilidad", d: "La tecnología de una empresa debe ser confiable, segura y estable." }, { t: "Enfoque práctico", d: "No desarrollamos por desarrollar. Creamos herramientas que resuelven problemas reales." }, { t: "Mejora continua", d: "Cada solución puede evolucionar conforme crece la empresa." }, ]; return (
{isEn ? "About us" : "Nosotros"}

{isEn ? "Technology built from real business experience." : "Tecnología construida desde la experiencia real de negocio."}

{isEn ? "GuerrerosCR combines web development with operational experience in technical support, infrastructure, databases, ERP, and administrative processes. This allows us to build solutions that " : "GuerrerosCR combina desarrollo web con experiencia operativa en soporte técnico, infraestructura, bases de datos, ERP y procesos administrativos. Esto nos permite construir soluciones que "} {isEn ? "not only look great but actually work" : "no solo se ven bien, sino que funcionan"} {isEn ? " in real business scenarios." : " en escenarios reales de negocio."}

{isEn ? "We understand both the technical and operational sides: what users need, what management needs, and what the system needs to run properly." : "Entendemos tanto el lado técnico como el lado operativo: qué necesita el usuario, qué necesita la gerencia y qué necesita el sistema para funcionar correctamente."}

{VALUES.map((v, i) => (

{v.t}

{v.d}

))}

{isEn ? "Mission" : "Misión"}

{isEn ? "To help companies improve their processes through practical, secure, and scalable digital solutions." : "Ayudar a empresas a mejorar sus procesos mediante soluciones digitales prácticas, seguras y escalables."}

{isEn ? "Vision" : "Visión"}

{isEn ? "To be a technology partner for companies seeking to grow with more structure, automation, and information control." : "Ser un aliado tecnológico para empresas que buscan crecer con más orden, automatización y control de su información."}

{isEn ? "Promise" : "Promesa"}

{isEn ? "We turn manual processes into clear, secure, and scalable digital solutions." : "Convertimos procesos manuales en soluciones digitales claras, seguras y escalables."}

); } window.About = About; // === Tech Stack === function TechStack() { const isEn = window.location.pathname.startsWith("/en"); const TECH = isEn ? [ { name: "React", label: "Frontend" }, { name: "Node.js", label: "Runtime" }, { name: "Express", label: "API" }, { name: "Laravel", label: "Backend" }, { name: "PHP", label: "Backend" }, { name: "MySQL", label: "Database" }, { name: "SQL Server", label: "Database" }, { name: "Tailwind CSS", label: "UI" }, { name: "REST APIs", label: "Integration" }, { name: "ERP", label: "Integration" }, { name: "Hosting", label: "Deployment" }, { name: "Domains", label: "Deployment" }, ] : [ { name: "React", label: "Frontend" }, { name: "Node.js", label: "Runtime" }, { name: "Express", label: "API" }, { name: "Laravel", label: "Backend" }, { name: "PHP", label: "Backend" }, { name: "MySQL", label: "Base de datos" }, { name: "SQL Server", label: "Base de datos" }, { name: "Tailwind CSS", label: "UI" }, { name: "APIs REST", label: "Integración" }, { name: "ERP", label: "Integración" }, { name: "Hosting", label: "Despliegue" }, { name: "Dominios", label: "Despliegue" }, ]; return (
Stack

{isEn ? "Modern and reliable technologies." : "Tecnologías modernas y confiables."}

{isEn ? "Proven tools to build fast, secure, and scalable web solutions." : "Herramientas probadas para construir soluciones web rápidas, seguras y escalables."}

{TECH.map((t, i) => (
{t.label} {t.name}
))}
); } window.TechStack = TechStack; // === Blog === function Blog() { const isEn = window.location.pathname.startsWith("/en"); const base = isEn ? "/en" : ""; const POSTS = [ { cat: isEn ? "Automation" : "Automatización", title: isEn ? "How to digitize internal approvals with web forms" : "Cómo digitalizar aprobaciones internas con formularios web", excerpt: isEn ? "From emails and spreadsheet signatures to a clear workflow with notifications and traceability." : "De correos y firmas en Excel a un flujo claro con notificaciones y trazabilidad.", read: isEn ? "10 min" : "10 min", date: "May 2026", href: `${base}/blog/digitalizar-aprobaciones-internas` }, { cat: isEn ? "ERP & Data" : "ERP & Datos", title: isEn ? "What ERP integration is and why it saves time" : "Qué es una integración con ERP y por qué ahorra tiempo", excerpt: isEn ? "When to connect your ERP to a web application and what to expect from the project." : "Cuándo conviene conectar su ERP con una aplicación web y qué esperar del proyecto.", read: "8 min", date: "May 2026", href: `${base}/blog/integracion-erp-ahorro-tiempo` }, { cat: isEn ? "Web Development" : "Desarrollo web", title: isEn ? "Website vs web application: key differences" : "Diferencias entre una página web y una aplicación web", excerpt: isEn ? "When a website is enough and when you truly need an internal platform." : "Cuándo basta con un sitio y cuándo realmente necesita una plataforma interna.", read: "5 min", date: isEn ? "Apr 2026" : "Abr 2026", href: `${base}/blog/pagina-web-vs-aplicacion-web` }, { cat: isEn ? "Productivity" : "Productividad", title: isEn ? "How to reduce Excel dependency in critical processes" : "Cómo reducir el uso de Excel en procesos críticos", excerpt: isEn ? "Typical spreadsheet risks and practical ways to replace them." : "Riesgos típicos del Excel compartido y rutas concretas para sustituirlo.", read: "7 min", date: isEn ? "Apr 2026" : "Abr 2026", href: `${base}/blog/reducir-uso-excel-procesos-criticos` }, { cat: "Dashboards", title: isEn ? "How to build dashboards for better decisions" : "Cómo crear dashboards para tomar mejores decisiones", excerpt: isEn ? "Which metrics to include, how to structure them, and how to connect to real data." : "Qué indicadores reportar, cómo estructurarlos y cómo conectarlos a los datos reales.", read: "6 min", date: "Mar 2026", href: `${base}/blog/crear-dashboards-mejores-decisiones` }, { cat: isEn ? "Business" : "Empresarial", title: isEn ? "What a business website in Costa Rica should include" : "Qué debe tener una página web empresarial en Costa Rica", excerpt: isEn ? "The essentials to turn your site into a real lead channel." : "Lo básico (y lo no tan básico) para que su sitio realmente genere conversaciones.", read: "9 min", date: "Mar 2026", href: `${base}/blog/pagina-web-empresarial-costa-rica` }, ]; return (
Blog

{isEn ? "Ideas and resources to digitize your business better." : "Ideas y recursos para digitalizar mejor su empresa."}

{isEn ? "Practical content on web development, automation, ERP, and business technology." : "Contenido práctico sobre desarrollo web, automatización, ERP y tecnología aplicada a negocios."}

{POSTS.map((p, i) => (
{p.cat}

{p.title}

{p.excerpt}

{p.date} {p.read} {isEn ? "read" : "de lectura"} →
))}
); } window.Blog = Blog; // === CTA banner === function CTABanner() { const isEn = window.location.pathname.startsWith("/en"); const base = isEn ? "/en" : ""; const go = (id) => (e) => { e.preventDefault(); const el = document.getElementById(id); if (el) { const top = el.getBoundingClientRect().top + window.scrollY - 70; window.scrollTo({ top, behavior: "smooth" }); } }; return (
{isEn ? "Free diagnosis" : "Diagnóstico inicial"}

{isEn ? "Do you have a process still relying on Excel, email, or manual work?" : "¿Tiene un proceso que todavía depende de Excel, correos o trabajo manual?"}

{isEn ? "We review one of your current processes and propose a clear roadmap to digitize, automate, or integrate it with your existing systems." : "Revisamos un proceso actual de su empresa y le proponemos una ruta clara para digitalizarlo, automatizarlo o integrarlo con sus sistemas existentes."}

{isEn ? "Let's talk about your project" : "Hablemos de su proyecto"} WhatsApp
); } window.CTABanner = CTABanner; // === Contact === function Contact() { const isEn = window.location.pathname.startsWith("/en"); const base = isEn ? "/en" : ""; const [form, setForm] = useState({ nombre: "", empresa: "", correo: "", whatsapp: "", servicio: isEn ? "Custom web application" : "Aplicación web a la medida", presupuesto: "", mensaje: "", }); const [errors, setErrors] = useState({}); const [sent, setSent] = useState(false); const [submitting, setSubmitting] = useState(false); const [serverError, setServerError] = useState(""); const set = (k) => (e) => setForm({ ...form, [k]: e.target.value }); const setBudget = (v) => setForm({ ...form, presupuesto: v }); const submit = async (e) => { e.preventDefault(); const errs = {}; if (!form.nombre.trim()) errs.nombre = isEn ? "Required" : "Requerido"; if (!form.correo.trim()) errs.correo = isEn ? "Required" : "Requerido"; else if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(form.correo)) errs.correo = isEn ? "Invalid email" : "Correo no válido"; if (!form.mensaje.trim() || form.mensaje.trim().length < 10) errs.mensaje = isEn ? "Tell us a bit more" : "Cuéntenos un poco más"; setErrors(errs); if (Object.keys(errs).length > 0) return; setSubmitting(true); setServerError(""); try { const fd = new FormData(); Object.entries(form).forEach(([k, v]) => fd.append(k, v)); fd.append("website", document.getElementById("gc-hp")?.value || ""); fd.append("page_origin", window.location.href); const r = await fetch("/api/contact.php", { method: "POST", body: fd }); const data = await r.json().catch(() => ({})); if (!r.ok || !data.ok) { setServerError(data.error || (isEn ? "We couldn't send your message. Please try again." : "No pudimos enviar su mensaje. Inténtelo de nuevo.")); return; } window.location.href = `${base}/gracias`; } catch (err) { setServerError(isEn ? "Network error. Check your connection and try again." : "Error de red. Verifique su conexión e intente de nuevo."); } finally { setSubmitting(false); } }; const servicios = isEn ? [ "Custom web application", "Process automation", "ERP / Database integration", "Professional web development", "Dashboards and reports", "IT consulting / Support", "Not sure, I need guidance", ] : [ "Aplicación web a la medida", "Automatización de procesos", "Integración con ERP / Bases de datos", "Desarrollo web profesional", "Dashboards y reportes", "Consultoría / Soporte IT", "No estoy seguro, necesito orientación", ]; const presupuestos = isEn ? ["< $300", "$300 – $700", "$700 – $1,500", "$1,500+", "Not sure"] : ["< $300", "$300 – $700", "$700 – $1,500", "$1,500+", "No estoy seguro"]; return (
{isEn ? "Contact" : "Contacto"}

{isEn ? "Let's talk about your project." : "Hablemos de su proyecto."}

{isEn ? "Tell us what process you want to improve, what system you need developed, or what idea you want to turn into a digital solution. We'll reply with a clear initial assessment." : "Cuéntenos qué proceso desea mejorar, qué sistema necesita desarrollar o qué idea quiere llevar a una solución digital. Le respondemos con una orientación inicial clara."}

{isEn ? "WhatsApp · quick reply" : "WhatsApp · respuesta rápida"}
+506 7018-1607
{isEn ? "Email" : "Correo"}
adrian@guerreroscr.com
{isEn ? "Location" : "Ubicación"}
San José, Costa Rica
{sent ? (

{isEn ? "Thank you, " : "Gracias, "}{form.nombre.split(" ")[0]}.

{isEn ? "We have received your message and will review the information to get back to you with an initial assessment." : "Hemos recibido su mensaje y revisaremos la información para responderle con una orientación inicial."}

{isEn ? "Continue on WhatsApp" : "Continuar por WhatsApp"}
) : (
{/* Honeypot anti-spam — debe quedar vacío */}
{errors.nombre &&
{errors.nombre}
}
{errors.correo &&
{errors.correo}
}
{presupuestos.map(b => ( ))}
{errors.mensaje &&
{errors.mensaje}
}
{isEn ? "We'll reply within 24 business hours." : "Responderemos en menos de 24h hábiles."}
{serverError &&
{serverError}
}
)}
); } window.Contact = Contact; // === Footer === function Footer() { const isEn = window.location.pathname.startsWith("/en"); const base = isEn ? "/en" : ""; return ( ); } window.Footer = Footer;