// pesito — Three steps + SPEI deposit animation + Trust strip + Schedule + Testimonials + FAQ + final CTA + footer
const ThreeSteps = ({ lang, onSimulate }) => {
const t = lang === 'es' ? {
eyebrow: 'Tres pasos. Cero sorpresas.',
title: 'Pides. Vemos. Llega.',
sub: 'No te vamos a hacer subir 14 documentos ni hablar con un asesor. La burocracia se queda en el banco de tus papás.',
steps: [
{ n: '01', title: 'Solicitas', body: 'Cuéntanos quién eres, cuánto y por cuánto. Tres minutos. Tu dedo, tu teléfono, tu silencio.', time: '3 min', icon: 'user' },
{ n: '02', title: 'Revisamos', body: 'Nuestros modelos miran tu historial — y un humano, si hace falta. Te decimos que sí o que no, y por qué.', time: '< 2 min', icon: 'shield' },
{ n: '03', title: 'Recibes', body: 'Si sí, los pesos llegan a tu cuenta por SPEI antes de que apagues la pantalla.', time: '5 seg', icon: 'spei' },
],
cta: 'Ver cómo se ve el depósito',
} : {
eyebrow: 'Три шага. Ноль сюрпризов.',
title: 'Просите. Видим. Приходит.',
sub: 'Никаких 14 документов и звонков консультанту. Бюрократия — в банке ваших родителей.',
steps: [
{ n: '01', title: 'Заявка', body: 'Расскажите кто вы, сколько и насколько. Три минуты. Ваш палец, ваш телефон, ваша тишина.', time: '3 мин', icon: 'user' },
{ n: '02', title: 'Проверка', body: 'Наши модели смотрят историю — и человек, если надо. Говорим да или нет, и почему.', time: '< 2 мин', icon: 'shield' },
{ n: '03', title: 'Получаете', body: 'Если да, песо приходят на счёт через SPEI до того, как вы погасите экран.', time: '5 сек', icon: 'spei' },
],
cta: 'Посмотреть как приходит',
};
return (
{t.eyebrow}
{t.title}
{t.sub}
{t.steps.map((s, i) => (
{s.n}
{s.time}
{s.title}
{s.body}
))}
);
};
// SPEI deposit modal sheet — 5-second animation
const SPEISheet = ({ lang, open, onClose, principal }) => {
const [phase, setPhase] = React.useState(0); // 0:requesting,1:approved,2:routing,3:deposited
React.useEffect(() => {
if (!open) { setPhase(0); return; }
const timers = [
setTimeout(() => setPhase(1), 1100),
setTimeout(() => setPhase(2), 2300),
setTimeout(() => setPhase(3), 3700),
];
return () => timers.forEach(clearTimeout);
}, [open]);
if (!open) return null;
const t = lang === 'es' ? {
title: 'Depósito en vivo',
sub: 'Así se ve cuando tu préstamo llega. En serio.',
states: [
'Solicitud enviada a CNBV/UIF',
'✓ Aprobado por modelo de riesgo',
'Ruteando por SPEI · Banxico',
'✓ Depositado en tu cuenta',
],
label: 'Importe',
bank: 'BBVA México · ****7841',
ref: 'REF SPEI 2604RDM',
close: 'Cerrar',
} : {
title: 'Перевод в реальном времени',
sub: 'Вот как выглядит, когда заём приходит. Серьёзно.',
states: [
'Запрос отправлен в CNBV/UIF',
'✓ Одобрено моделью риска',
'Маршрут SPEI · Banxico',
'✓ Зачислено на счёт',
],
label: 'Сумма',
bank: 'BBVA México · ****7841',
ref: 'REF SPEI 2604RDM',
close: 'Закрыть',
};
return (
i ? 'var(--green)' : (phase === i ? 'var(--brand)' : 'var(--surface-3)'),
display: 'flex', alignItems: 'center', justifyContent: 'center',
color: '#fff', flexShrink: 0,
transition: 'background 220ms ease',
}}>
{phase > i
?
: (phase === i
?
: )}
= i ? 'var(--ink)' : 'var(--ink-soft)' }}>
{s}
{phase === i && i < 3 &&
...
}
))}
{phase === 3 && (
{lang === 'es' ? 'Los pesos están en tu cuenta. De verdad.' : 'Песо у вас на счёте. Серьёзно.'}
)}
);
};
// Trust strip
const TrustStrip = ({ lang }) => {
const t = lang === 'es' ? {
eyebrow: 'Regulado, supervisado, vigilado.',
title: 'No somos los primos del banco. Estamos en la lista.',
chips: [
['CNBV', 'Comisión Nacional Bancaria y de Valores nos audita.'],
['CONDUSEF', 'Si te queda duda, ahí pueden quejarse de nosotros.'],
['SPEI', 'Banxico mueve los pesos. Nosotros solo decimos cuántos.'],
['UIF', 'Sí, reportamos a la Unidad de Inteligencia Financiera.'],
['LFPDPPP', 'Tus datos son tuyos. Aviso de privacidad legible.'],
],
note: 'SOFOM ENR Bonum, S.A. de C.V., entidad regulada por CNBV y supervisada por CONDUSEF, registro CONDUSEF #pendiente. Consulta tu historial en Buró de Crédito.',
} : {
eyebrow: 'Регулируется, проверяется, наблюдается.',
title: 'Мы не кузены банка. Мы в реестре.',
chips: [
['CNBV', 'Национальная банковская комиссия аудирует нас.'],
['CONDUSEF', 'Если что — туда жалуются на нас.'],
['SPEI', 'Banxico двигает песо. Мы лишь говорим сколько.'],
['UIF', 'Да, отчитываемся в финразведку.'],
['LFPDPPP', 'Ваши данные — ваши. Уведомление по-человечески.'],
],
note: 'SOFOM ENR Bonum, S.A. de C.V., регулируется CNBV и под надзором CONDUSEF, регистрация #ожидание. Запрос в Бюро Кредитов.',
};
return (
{t.eyebrow}
{t.title}
{t.chips.map(([k, v], i) => (
{k}
{v}
))}
{t.note}
);
};
// Payment schedule visual
const Schedule = ({ lang, term, quincenal }) => {
const t = lang === 'es' ? {
eyebrow: 'Cronograma. Sin sorpresas.',
title: ['Mira los pagos', 'antes de firmar.'],
sub: 'Cada barrita es una quincena. La altura es lo que pagas. La línea de abajo es lo que ya pagaste.',
paid: 'pagado',
pending: 'por pagar',
payment: 'pago',
} : {
eyebrow: 'График. Без сюрпризов.',
title: ['Смотрите платежи', 'до подписи.'],
sub: 'Каждый столбик — двухнедельный период. Высота — сколько платите. Линия снизу — сколько уже заплачено.',
paid: 'оплачено',
pending: 'к оплате',
payment: 'платёж',
};
// Generate fake schedule with first 2 paid, rest pending
const today = new Date();
const items = Array.from({ length: term }, (_, i) => ({
idx: i + 1,
paid: i < 2,
date: new Date(today.getTime() + i * 14 * 24 * 3600 * 1000),
amount: quincenal,
}));
const months = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];
const monthsRu = ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'];
return (
);
};
const Testimonials = ({ lang }) => {
const t = lang === 'es' ? {
eyebrow: 'Nos lo dicen ellos.',
title: 'Verdaderos pesos, verdaderas personas.',
items: [
{ who: 'Daniela R., 34', city: 'CDMX', stars: 5, text: '"Pagué la inscripción del Felipe sin pedírselo a mi mamá. Y sin tener que mentirle a nadie sobre el CAT."' },
{ who: 'Mauricio T., 41', city: 'Guadalajara', stars: 5, text: '"Lo pedí a las 11:47 de la noche desde el camión. A las 11:48 ya tenía el dinero. Pensé que era estafa hasta que fui a la cajera."' },
{ who: 'Karla V., 28', city: 'Monterrey', stars: 5, text: '"Lo pagué tres semanas antes y me cobraron menos. La primera vez que un préstamo me sale más barato por portarme bien."' },
{ who: 'Iván P., 52', city: 'Puebla', stars: 4, text: '"Llamé al teléfono. Contestó una persona. Me explicó las cuentas. No volvió a llamar para venderme nada. Increíble."' },
],
} : {
eyebrow: 'Они нам говорят.',
title: 'Реальные песо, реальные люди.',
items: [
{ who: 'Daniela R., 34', city: 'CDMX', stars: 5, text: '"Заплатила за школу Фелипе, не прося маму. И не пришлось никому врать про CAT."' },
{ who: 'Mauricio T., 41', city: 'Guadalajara', stars: 5, text: '"Попросил в 23:47 из автобуса. В 23:48 деньги были на счёте. Думал — мошенники, пока не дошёл до банкомата."' },
{ who: 'Karla V., 28', city: 'Monterrey', stars: 5, text: '"Заплатила на 3 недели раньше — стало дешевле. Впервые заём дешевле за хорошее поведение."' },
{ who: 'Iván P., 52', city: 'Puebla', stars: 4, text: '"Позвонил. Ответил человек. Объяснил цифры. Не перезванивал что-то впаривать. Невероятно."' },
],
};
return (
{t.eyebrow}
{t.title}
{t.items.map((item, i) => (
{Array.from({ length: 5 }, (_, k) => (
★
))}
{item.text}
{item.who}{item.city}
))}
);
};
const FAQ = ({ lang }) => {
const t = lang === 'es' ? {
eyebrow: 'Las preguntas que de verdad nos hacen.',
title: 'Sin asterisco. Sin "consulte términos".',
items: [
['¿Cuánto puedo pedir la primera vez?', 'Empiezas chiquito. Hasta $5,000 MXN si es tu primera vez con nosotros. Si pagas a tiempo, en la siguiente subimos hasta $100,000. Sin trámite, sin pedir nada extra.'],
['¿En cuánto tiempo me llega el dinero?', 'Si tu solicitud se aprueba antes de las 6 pm, llega ese mismo día por SPEI. Después de las 6 pm, cae al siguiente día hábil. Banxico es quien decide la velocidad final, no nosotros.'],
['¿Qué documentos necesito?', 'Tu INE, un comprobante de domicilio (no más viejo de 3 meses), tu CLABE bancaria. Y un selfie con la INE. Eso es todo. Si te pedimos otra cosa, dudaríamos hasta de nosotros mismos.'],
['¿Y si pago antes? ¿Me cobran de más?', 'No. Pagas el principal, los intereses devengados hasta el día que pagaste, y ya. Cero penalización por prepago — está en el contrato, en letra grande, en la cláusula 7.'],
['¿Qué pasa si me atraso?', 'Te llamamos. No te gritamos, no te ponemos a tu vecino. Tienes 5 días de gracia, después se devenga moratorio del 0.15% diario sobre el saldo vencido. Y sí, lo reportamos al Buró.'],
['¿Consultan mi Buró de Crédito?', 'Sí. Es obligatorio por ley para evaluar tu capacidad de pago. Si no quieres que lo consultemos, no podemos prestarte. Es así de claro.'],
],
} : {
eyebrow: 'Вопросы, которые нам реально задают.',
title: 'Без звёздочек. Без "см. условия".',
items: [
['Сколько можно взять в первый раз?', 'Начинаете с малого. До $5,000 MXN при первой заявке. Заплатите вовремя — в следующий раз до $100,000. Без бумажек.'],
['Когда придут деньги?', 'Если одобрено до 18:00 — в тот же день через SPEI. После 18:00 — на следующий рабочий день. Скорость определяет Banxico, не мы.'],
['Какие документы нужны?', 'INE, справка адреса (не старше 3 мес), CLABE банка. И селфи с INE. Всё. Если просим больше — сомневаемся в себе.'],
['А если заплачу раньше?', 'Платите основной долг, проценты до даты оплаты, и всё. Ноль штрафов за досрочное погашение — крупным шрифтом в пункте 7 договора.'],
['Что если просрочу?', 'Звоним. Не кричим, не обзваниваем соседей. 5 дней льготных, потом 0.15% в день на просроченный остаток. И да, передаём в Бюро.'],
['Запрашиваете Бюро?', 'Да. Закон обязывает оценить платёжеспособность. Не хотите — не сможем выдать. Прямо говорим.'],
],
};
const [open, setOpen] = React.useState(0);
return (
{t.eyebrow}
{t.title}
{t.items.map(([q, a], i) => (
{a}
))}
);
};
const FinalCTA = ({ lang, onApply }) => {
const t = lang === 'es' ? {
title: ['Listo.', 'Pide tu préstamo.'],
sub: 'Sin asteriscos. Sin letra chica. Sin que te llamemos cinco veces para venderte un seguro.',
cta: 'Empezar solicitud',
note: 'Tres minutos. Una sola pantalla. Tu silencio respetado.',
} : {
title: ['Готово.', 'Берите заём.'],
sub: 'Без звёздочек. Без мелкого шрифта. Без пяти звонков с предложением страховки.',
cta: 'Начать заявку',
note: 'Три минуты. Один экран. Ваша тишина — ваша.',
};
return (