// Interactive budget calculator const CALC_OPTIONS = { type: [ { id: "landing", label: "Landing / 1 página", desc: "Solo presentación", base: 250 }, { id: "instit", label: "Sitio institucional", desc: "Multi-sección", base: 350 }, { id: "tienda", label: "Tienda / Catálogo", desc: "Vendés online", base: 600 }, { id: "sistema", label: "Sistema de gestión", desc: "Panel a medida", base: 1200 }, { id: "app", label: "App móvil", desc: "iOS + Android", base: 1800 }, ], pages: [ { id: 1, label: "1–3", mult: 1 }, { id: 2, label: "4–8", mult: 1.25 }, { id: 3, label: "9–15", mult: 1.55 }, { id: 4, label: "15+", mult: 1.9 }, ], extras: [ { id: "blog", label: "Blog con secciones", price: 80 }, { id: "admin", label: "Panel administrador", price: 180 }, { id: "pagos", label: "Pasarela de pagos", price: 120 }, { id: "reservas", label: "Sistema de turnos / reservas", price: 220 }, { id: "multi", label: "Multi-idioma", price: 90 }, { id: "seo", label: "SEO avanzado + Analytics", price: 140 }, { id: "ia", label: "Chatbot con IA", price: 280 }, { id: "auto", label: "Automatizaciones (mails, WhatsApp)", price: 200 }, { id: "api", label: "Integraciones por API", price: 250 }, { id: "users", label: "Usuarios y roles", price: 200 }, ], speed: [ { id: "normal", label: "Normal", desc: "3–4 semanas", mult: 1 }, { id: "rapid", label: "Rápido", desc: "1–2 semanas", mult: 1.2 }, { id: "express", label: "Express", desc: "5–7 días", mult: 1.45 }, ], }; function Calculator() { const [type, setType] = React.useState("instit"); const [pages, setPages] = React.useState(2); const [extras, setExtras] = React.useState(["seo", "admin"]); const [speed, setSpeed] = React.useState("normal"); const [bump, setBump] = React.useState(false); const t = CALC_OPTIONS.type.find((x) => x.id === type); const p = CALC_OPTIONS.pages.find((x) => x.id === pages); const s = CALC_OPTIONS.speed.find((x) => x.id === speed); const extraSum = CALC_OPTIONS.extras .filter((e) => extras.includes(e.id)) .reduce((a, b) => a + b.price, 0); const subtotal = t.base * p.mult + extraSum; const total = Math.round(subtotal * s.mult); const totalLow = Math.round(total * 0.92); const totalHigh = Math.round(total * 1.08); React.useEffect(() => { setBump(true); const id = setTimeout(() => setBump(false), 220); return () => clearTimeout(id); }, [total]); const toggleExtra = (id) => { setExtras((curr) => (curr.includes(id) ? curr.filter((x) => x !== id) : [...curr, id])); }; const fmt = (n) => "$" + n.toLocaleString("es-AR"); const summaryMsg = `Hola DINI! Cotización con la calculadora: • Tipo: ${t.label} • Páginas: ${p.label} • Extras: ${extras.length ? CALC_OPTIONS.extras.filter(e => extras.includes(e.id)).map(e => e.label).join(", ") : "ninguno"} • Tiempo: ${s.label} (${s.desc}) • Estimado: ${fmt(totalLow)} – ${fmt(totalHigh)} USD ¿Podemos avanzar?`; return (
Calculadora interactiva

Estimá tu proyecto en{" "} menos de un minuto.

Movés un par de opciones, ves el precio. Si te gusta, lo enviás directo a WhatsApp y te respondemos con un presupuesto formal.

{/* TIPO */}
¿Qué necesitás? Elegí lo que más se acerca
{CALC_OPTIONS.type.map((x) => ( ))}
{/* PÁGINAS */}
Cantidad de páginas o secciones Aproximado, no es estricto
{CALC_OPTIONS.pages.map((x) => ( ))}
{/* EXTRAS */}
Funciones extras Marcá las que necesites
{CALC_OPTIONS.extras.map((x) => ( ))}
{/* VELOCIDAD */}
¿Para cuándo lo necesitás? Tiempos aproximados
{CALC_OPTIONS.speed.map((x) => ( ))}
{/* SUMMARY */}
Estimado de tu proyecto
{fmt(totalLow)} {fmt(totalHigh)}
USD · pago único
Base ({t.label}){fmt(t.base)}
Tamaño ({p.label} pág.)×{p.mult}
{extras.length > 0 && (
Extras ({extras.length})+{fmt(extraSum)}
)}
Tiempo ({s.label})×{s.mult}
Enviar por WhatsApp Pedir presupuesto formal
Es un estimado de referencia. El presupuesto final depende de detalles que conversamos juntos. Sin compromiso.
); } Object.assign(window, { Calculator });