/* global React, ReactDOM */
const { useState, useEffect, useRef } = React;
/* ============================================================
STRINGS — bilingual copy (ported from the Claude Design redesign)
============================================================ */
const buildStrings = (lang) => {
const T = (es, en) => lang === "en" ? en : es;
const s = {
navFeatures: T("El problema", "The problem"),
navHow: T("Cómo funciona", "How it works"),
navPricing: T("Precios", "Pricing"),
navDownload: T("Descargar", "Download"),
heroEyebrow: T("El método de presupuesto más honesto que vas a encontrar", "The most honest budgeting method you'll find"),
heroHeadA: T("Tu dinero necesita un plan,", "Your money needs a plan,"),
heroHeadB: T(" no un historial.", " not a history."),
heroSub: T("1% Budget te ayuda a decidir en qué vas a gastar antes de hacerlo, mira tu plan evolucionar en tiempo real.", "1% Budget helps you decide what you'll spend on before you spend — watch your plan evolve in real time."),
heroShot: T("Pantalla principal — categorías con barras de progreso y badge “disponible”", "Home screen — categories with progress bars and “available” pill"),
appStoreSmall: T("Descargar en el", "Download on the"),
appStoreBig: "App Store",
googlePlaySmall: T("Disponible en", "Get it on"),
googlePlayBig: "Google Play",
soon: T("Próximamente", "Coming soon"),
trust0: T("Sin tarjeta para empezar", "No card to start"),
trust1: T("Datos seguros en la nube", "Your data, safe in the cloud"),
trust2: T("Prueba gratis de 30 días", "Free 30-day trial"),
painEyebrow: T("El problema", "The problem"),
painHead: T("¿Te suena familiar?", "Sound familiar?"),
pain1q: T("“Gasté y gasté pensando que mi cuenta era infinita.”", "“I spent and spent like my account was infinite.”"),
pain1b: T("Sin límites claros, cada compra parece pequeña… hasta que el saldo dice lo contrario.", "With no clear limits, every purchase feels small — until the balance says otherwise."),
pain2q: T("“Empecé un excel pero lo abandoné a la semana.”", "“I started a spreadsheet but gave up within a week.”"),
pain2b: T("Las hojas de cálculo funcionan hasta que dejan de funcionar — que es casi siempre.", "Spreadsheets work until they stop working — which is almost always."),
pain3q: T("“Ahorro lo que me sobra. O sea, nada…”", "“I save whatever's left over. Which means, nothing…”"),
pain3b: T("Sin un plan, el ahorro siempre pierde contra los gastos del día a día.", "Without a plan, saving always loses to day-to-day spending."),
pain4q: T("“Mi presupuesto es como la dieta: siempre empiezo el lunes… o el próximo mes.”", "“My budget is like a diet: I always start Monday… or next month.”"),
pain4b: T("Empezar no debería depender del lunes perfecto. Con un sistema, ya empezaste.", "Starting shouldn't depend on the perfect Monday. With a system, you already started."),
painFoot1: T("Estos no son problemas de disciplina. Son problemas de método.", "These aren't discipline problems. They're method problems."),
painFoot2: T("1% Budget te da el sistema.", "1% Budget gives you the system."),
howEyebrow: T("Cómo funciona", "How it works"),
howHead: T("Cuatro pasos para que tu dinero tenga una misión", "Four steps to give every dollar a job"),
step1Title: T("Define tu plan mensual", "Define your monthly plan"),
step1Body: T("Decide al inicio del mes cuánto va a cada categoría. La app te muestra cuánto te queda por asignar.", "Decide at the start of the month how much goes to each category. The app shows you what's left to assign."),
step1Shot: T("Configuración del plan / selector de plantillas", "Budget setup / template picker"),
step2Title: T("Registra cada movimiento", "Log every transaction"),
step2Body: T("Anota gastos, ingresos y transferencias en segundos. Tus saldos se actualizan al instante.", "Capture expenses, income and transfers in seconds. Your balances update instantly."),
step2Shot: T("Modal para agregar movimiento", "Add transaction modal"),
step3Title: T("Ve a dónde va tu dinero en tiempo real", "See where your money goes, in real time"),
step3Body: T("Mira cómo se mueven tus sobres durante el mes y ajusta antes de que sea tarde.", "Watch your envelopes shift through the month and adjust before it's too late."),
step3Shot: T("Pantalla principal con saldos en vivo", "Home screen with live balances"),
step4Title: T("Todas tus cuentas, en un solo lugar", "All your accounts in one place"),
step4Body: T("Registra tus cuentas de banco, tu efectivo y tus tarjetas de crédito.", "Add your bank accounts, cash and credit cards."),
step4Shot: T("Captura por agregar", "Screenshot to add"),
priceEyebrow: T("Precios", "Pricing"),
priceHead: T("Todas las funciones, en ambos planes", "All features, on both plans"),
priceSub: T("Prueba gratis por 30 días.", "Try it free for 30 days."),
cloudLine: T("Tu plan por menos de un café al mes.", "Your plan for less than a coffee a month."),
pickLabel: T("Elige cómo pagar", "Choose how to pay"),
annualPill: T("Mejor valor", "Best value"),
annualName: T("Anual", "Annual"),
annualPrice: T("$39.99 / año", "$39.99 / year"),
annualSub: T("Solo $3.33 / mes · Ahorras 33%", "Just $3.33 / month · Save 33%"),
monthlyName: T("Mensual", "Monthly"),
monthlyPrice: T("$4.99 / mes", "$4.99 / month"),
monthlySub: T("Misma app, mismas funciones, sin compromiso anual.", "Same app, same features, no annual commitment."),
planCta: T("Empezar prueba de 30 días", "Start 30-day trial"),
planFootnote: T("No se cobra nada hasta el día 31. Cancela cuando quieras.", "Nothing is charged until day 31. Cancel anytime."),
includedTitle: T("Todo incluido en ambos planes", "Everything included on both plans"),
faqEyebrow: T("Preguntas frecuentes", "FAQ"),
faqHead: T("Lo que la gente nos pregunta.", "What people ask us."),
faq1q: T("¿Hay una versión gratis?", "Is there a free version?"),
faq1a: T("No hay un plan gratuito permanente, pero sí 30 días de prueba completa con todas las funciones. Si decides no continuar, simplemente cancela antes del día 30 y no se te cobra.", "There is no permanent free plan, but there is a full 30-day trial with every feature. If you decide not to continue, just cancel before day 30 and you aren't charged."),
faq2q: T("¿Mis datos están seguros?", "Is my data safe?"),
faq2a: T("Tus datos se sincronizan de forma segura en la nube usando Firebase. Solo tú tienes acceso desde tu cuenta.", "Your data is synced securely to the cloud through Firebase. Only you have access from your account."),
faq3q: T("¿Necesito internet para usar la app?", "Do I need internet to use the app?"),
faq3a: T("Sí. 1% Budget necesita conexión a internet para sincronizar tus movimientos, presupuestos y cuentas entre dispositivos. No funciona sin conexión.", "Yes. 1% Budget needs an internet connection to sync your transactions, budgets and accounts across devices. It doesn't work offline."),
faq4q: T("¿La app se conecta con el banco?", "Does the app connect to my bank?"),
faq4a: T("No, pero está diseñada para facilitar el mantenimiento de tus cuentas.", "No, but it's designed to make keeping your accounts up to date easy."),
ctaEyebrow: T("Descarga la app", "Get the app"),
ctaHead: T("Empieza a tomar control hoy", "Start taking control today"),
ctaSub1: T("30 días gratis", "30 days free"),
ctaSub2: T("Sin tarjeta para empezar", "No card to start"),
footerTagline: T("Presupuesto por sobres para que puedas organizar cada dólar en donde debe ir.", "Envelope budgeting so you can put every dollar exactly where it belongs."),
footerProducto: T("Producto", "Product"),
footerEmpresa: T("Empresa", "Company"),
footerLegal: "Legal",
flAbout: T("Sobre nosotros", "About"),
flContact: T("Contacto", "Contact"),
flBlog: "Blog",
flTerms: T("Términos de uso", "Terms of use"),
flPrivacy: T("Privacidad", "Privacy"),
flSupport: T("Soporte", "Support"),
copyright: T("© 2026 1% academy · Hecho en Panamá", "© 2026 1% academy · Made in Panama")
};
const benefits = [
T("Cada dólar tiene una misión", "Every dollar has a job"),
T("Conoce en todo momento cuánto puedes gastar", "Always know how much you can spend"),
T("Dile adiós a tu hoja de Excel", "Say goodbye to your spreadsheet"),
T("Todas tus cuentas y tarjetas en un solo lugar", "All your accounts and cards in one place"),
T("Sincronización en todos tus dispositivos", "Sync across all your devices"),
T("Todas las funciones incluidas", "All features included")];
return { s, benefits };
};
/* ============================================================
ICONS
============================================================ */
const IconAppStore = () =>
;
const IconGooglePlay = () =>
;
const featIcons = {
envelope: ,
wallet: ,
arrows: ,
template:
};
const IconChevron = () => ;
const IconCheckSm = () => ;
/* ============================================================
SMALL COMPONENTS
============================================================ */
const AppStoreBadge = ({ s }) =>
{s.heroSub}
{p.b}
{s.painFoot1}
{s.painFoot2}
{s.priceSub}
{lang === "es" ? "Tu plan por menos de " : "Your plan for less than "}{lang === "es" ? "un café" : "a coffee"}{lang === "es" ? " al mes" : " a month"}
{s.ctaSub1}·{s.ctaSub2}