// plans.jsx — 3 plan variants + comparison table const PLAN_DATA = [ { id: 'continuidad', name: 'Continuidad', tagline: 'Monitoreo y mantenimiento esencial para mantener tu web estable.', price: '49', currency: 'USD', period: '/mes', cta: 'Empezar con Continuidad', features: [ { strong: true, text: 'Actualización mensual de core, plugins y themes' }, { strong: false, text: 'Backup mensual completo' }, { strong: false, text: 'Verificación básica de seguridad' }, { strong: false, text: 'Reporte mensual al cliente' }, { strong: false, text: 'Soporte correctivo básico' }, { strong: false, text: 'Wordfence Community' }, { strong: false, text: 'AIO WPM Estándar' }, ], }, { id: 'control', name: 'Control', tagline: 'Mayor frecuencia y control preventivo para reducir riesgos y caídas.', price: '129', currency: 'USD', period: '/mes', featured: true, cta: 'Recomendado', features: [ { strong: true, text: 'Todo lo del plan Continuidad' }, { strong: false, text: 'Monitoreo semanal del sitio' }, { strong: false, text: 'Backups quincenales verificados' }, { strong: false, text: 'Revisión de vulnerabilidades conocidas (CVE)' }, { strong: false, text: 'Optimización básica de entorno (PHP, memoria)' }, { strong: false, text: 'Reporte detallado mensual' }, { strong: false, text: 'Wordfence Pro' }, { strong: false, text: 'AIO WPM PRO' }, ], }, { id: 'ultra', name: 'Ultra', tagline: 'Máxima continuidad y seguridad para operaciones críticas.', price: '299', currency: 'USD', period: '/mes', cta: 'Hablemos de Ultra', features: [ { strong: true, text: 'Todo lo del plan Control' }, { strong: false, text: 'Monitoreo diario del sitio' }, { strong: false, text: 'Backups semanales' }, { strong: false, text: 'Copia en AWS S3' }, { strong: false, text: 'Detección temprana de vulnerabilidades (CVE)' }, { strong: false, text: 'Alertas proactivas vía email' }, { strong: false, text: 'Auditoría técnica periódica' }, ], }, ]; const BILLING = { semiannual: { label: 'Semestral', badge: null, disc: 1.00, getNote: (base) => `$${base * 6} facturado c/6 meses`, noteColor: 'var(--text-dim)', }, annual: { label: 'Anual', badge: 'Ahorra 20%', disc: 0.80, getNote: (base) => { const yr = Math.round(base * 0.80) * 12; return `$${yr}/año · ahorras $${base * 12 - yr}`; }, noteColor: 'var(--ok)', }, }; // VARIANT 1 — Classic three cards, featured in middle function PlansCards({ billing }) { return (
{PLAN_DATA.map((p) => { const base = parseInt(p.price); const monthlyPrice = Math.round(base * BILLING[billing].disc); const bInfo = BILLING[billing]; return (
{p.featured &&
Recomendado
}
{p.name}
{p.tagline}
$ {monthlyPrice} {p.currency} /mes
{bInfo.getNote(base)}
{p.cta}
); })}
); } // VARIANT 2 — Table-first function PlansTable({ billing }) { const prices = PLAN_DATA.map(p => Math.round(parseInt(p.price) * BILLING[billing].disc)); return ( <>
Continuidad Control · Recomendado Ultra
${prices[0]}/mes ${prices[1]}/mes ${prices[2]}/mes
Mantenimiento
Seguridad
Backups
Soporte y reportes
Empezar con Continuidad Recomendado · Control Hablemos de Ultra
); } function CompareRow({ label, v }) { const render = (val, isFeat) => { if (val === true) return ; if (val === false) return ; return val; }; return ( {label} {render(v[0])} {render(v[1], true)} {render(v[2])} ); } // VARIANT 3 — Stacked/tiered horizontal function PlansStacked({ billing }) { return (
{PLAN_DATA.map((p, idx) => { const base = parseInt(p.price); const monthlyPrice = Math.round(base * BILLING[billing].disc); const bInfo = BILLING[billing]; return (
{p.featured &&
Recomendado
}
NIVEL · 0{idx + 1}
{p.name}
$ {monthlyPrice} /mes
{bInfo.getNote(base)}
{p.tagline}
    {p.features.map((f, i) => (
  • {f.text}
  • ))}
{p.cta}
); })}
); } function Plans({ variant }) { const [billing, setBilling] = React.useState('semiannual'); let body; if (variant === 'table') body = ; else if (variant === 'stacked') body = ; else body = ; return (
Planes

Tres niveles.
Misma promesa: que no tengas que ocuparte.

{/*

Todos los planes incluyen plataforma, soporte por chat y reporte mensual. Sin permanencia mínima — si no te aporta, te vas.

*/}
{Object.entries(BILLING).map(([key, b]) => ( ))}
{body} {/*
14 días de garantía · Sin permanencia · Diagnóstico inicial gratis
*/}
); } Object.assign(window, { Plans });