/* Escala — Account, Checkout, About, Legal pages */ const { useState: useStateA, useEffect: useEffectA } = React; // ===================== LOGIN ===================== function LoginPage({ navigate, onLogin }) { const [mode, setMode] = useStateA('login'); const [email, setEmail] = useStateA(''); const [pwd, setPwd] = useStateA(''); const [name, setName] = useStateA(''); const [err, setErr] = useStateA(''); const submit = (e) => { e.preventDefault(); if (!email.includes('@')) { setErr('Email no válido'); return; } if (pwd.length < 6) { setErr('Mínimo 6 caracteres'); return; } onLogin({ email, name: name || email.split('@')[0] }); navigate('/account'); }; return (

{mode === 'login' ? 'Inicia sesión' : 'Crear cuenta'}

{mode === 'login' ? 'Bienvenida.' : 'Hola.'}

O CON EMAIL
{mode === 'register' && (
setName(e.target.value)} required/>
)}
setEmail(e.target.value)} required/>
{err &&

{err}

}

{mode === 'login' ? '¿Aún no tienes cuenta?' : '¿Ya tienes cuenta?'}{' '} { e.preventDefault(); setMode(mode === 'login' ? 'register' : 'login'); }} style={{ textDecoration: 'underline' }}> {mode === 'login' ? 'Regístrate' : 'Inicia sesión'}

); } // ===================== ACCOUNT ===================== function AccountPage({ navigate, route, user, onLogout }) { const orders = window.ESCALA_DATA.orders; const sub = route.replace('/account', '').replace(/^\//, '') || 'overview'; return (

Cuenta

Hola, {user.name.split(' ')[0]}.

{sub === 'overview' && } {sub === 'orders' && } {sub === 'addresses' && } {sub === 'payments' && } {sub === 'settings' && }
); } function AccountOverview({ user, orders, navigate }) { const last = orders[0]; return (

MIEMBRO DESDE

{user.memberSince || 'Hoy'}

PEDIDOS

{orders.length}

Último pedido

{ e.preventDefault(); navigate('/account/orders'); }} style={{ fontSize: 13, textDecoration: 'underline' }}>Ver todos
{last && }
); } function OrderCard({ order }) { const statusLabel = { delivered: 'Entregado', 'in-transit': 'En camino', preparing: 'Preparando' }[order.status]; return (

{order.id}

{new Date(order.date).toLocaleDateString('es-ES', { year: 'numeric', month: 'long', day: 'numeric' })}

{statusLabel}

{window.ESCALA_FORMAT(order.total)}

{order.items.map((it, i) => (
{it.qty} × {it.product} · {it.color === 'white' ? 'Blanco' : 'Negro'} · {it.size} línea {it.line}
))}
); } function AccountOrders({ orders }) { return (

Mis pedidos

{orders.map(o => )}
); } function AccountAddresses({ user }) { return (

Direcciones

{user.addresses.map(a => (
{a.label} {a.default && POR DEFECTO}

{a.line1}
{a.zip} {a.city}
{a.country}

e.preventDefault()} style={{ textDecoration: 'underline' }}>Editar e.preventDefault()} style={{ textDecoration: 'underline', color: 'var(--ink-4)' }}>Eliminar
))}
); } function AccountPayments({ user }) { return (

Métodos de pago

Tus tarjetas se guardan tokenizadas en Stripe. Escala nunca ve los datos completos.

{user.cards.map(c => (
{c.brand.toUpperCase().slice(0,4)}

•••• •••• •••• {c.last4}

Caduca {c.exp}

{c.default && POR DEFECTO}
))}
); } function AccountSettings({ user }) { return (

Ajustes

); } // ===================== CHECKOUT ===================== function CheckoutPage({ navigate }) { const lines = window.ESCALA_CART.get(); const subtotal = window.ESCALA_CART.subtotal(); const shipping = subtotal > 60 ? 0 : 4.90; const total = subtotal + shipping; const [coupon, setCoupon] = useStateA(''); const [discount, setDiscount] = useStateA(0); const applyCoupon = () => { if (coupon.toUpperCase() === 'SEND10') setDiscount(subtotal * 0.10); else if (coupon.toUpperCase() === 'CRAG20') setDiscount(subtotal * 0.20); else { setDiscount(0); alert('Cupón no válido'); } }; const placeOrder = () => { alert('Pago procesado con Stripe — pedido confirmado.'); window.ESCALA_CART.clear(); navigate('/account/orders'); }; if (lines.length === 0) { return (

Tu bolsa está vacía

); } return (

Pago seguro · Stripe

Checkout

{/* Contact */}

Contacto

{/* Shipping */}

Envío

{/* Payment */}

Pago

Pago seguro mediante Stripe SSL · 3D Secure
); } // ===================== ABOUT ===================== function AboutPage() { return (

Sobre Escala

Una camiseta.
Cuatro cortes.
Cero ruido.

Escala nace de una frustración compartida: la ropa de escalada o es ruidosa, con logos enormes y colores que gritan, o está pensada para una pasarela que nunca pisa la roca.

Por eso hicimos cuatro camisetas. Una manga corta, en cuatro cortes — performance, relajado, ceñido y heavyweight — en blanco o negro. Y una sola línea de color en la espalda, en cuatro tonos para elegir.

Hechas en Portugal con tejido reciclado certificado. Pensadas para durar tantas temporadas como tus pies de gato.

{[ ['01', 'Diseño', 'Barcelona — un equipo pequeño, opiniones fuertes.'], ['02', 'Producción', 'Fábrica familiar en Vila Nova de Famalicão, Portugal.'], ['03', 'Materiales', 'Poliéster reciclado certificado y algodón orgánico GOTS.'], ['04', 'Logística', 'Envíos consolidados desde Lisboa.'], ].map(([n, t, d]) => (

{n}

{t}

{d}

))}
); } // ===================== LEGAL ===================== function LegalPage() { return (

Legal

Términos & privacidad

1. Datos del titular

Escala Apparel S.L. — CIF B12345678 — Carrer de la Riera 14, 08003 Barcelona — contacto@escala.shop

2. Tratamiento de datos

Tratamos tus datos para gestionar pedidos, contestarte si nos escribes y enviarte la newsletter si te has suscrito. Base legal: ejecución de contrato y consentimiento. No vendemos tus datos a terceros.

3. Pagos

Los pagos se procesan a través de Stripe. Escala nunca almacena los datos completos de tu tarjeta — sólo un identificador tokenizado.

4. Devoluciones

Tienes 30 días desde la entrega para devolver cualquier producto sin estrenar y con etiqueta. Reembolso en el mismo medio de pago en 5–10 días.

5. Cookies

Usamos cookies técnicas (sesión, carrito) y analíticas anónimas. Puedes configurarlas desde tu navegador.

); } Object.assign(window, { LoginPage, AccountPage, CheckoutPage, AboutPage, LegalPage });