<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Cambios BlackMoney — Casa de cambio internacional</title>
<meta name="description" content="Enviá remesas entre Perú, Chile, Venezuela, Brasil y EE.UU. con las mejores tasas del mercado. Cotizá en segundos."/>
<link rel="preconnect" href="https://fonts.googleapis.com"/>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>
<link href="https://fonts.googleapis.com/css2?family=Bebas+Neue&family=DM+Sans:wght@300;400;500&display=swap" rel="stylesheet"/>
<style>
/* =============================================
CAMBIOS BLACKMONEY — Hoja de estilos principal
Para personalizar:
- Cambiá WA_NUMBER en el JS por tu número real
- Cambiá SHEET_ID en el JS por tu Google Sheet ID
- Actualizá las redes sociales en el footer
============================================= */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--gold: #c9a84c;
--gold-light: #d4b660;
--gold-dim: #c9a84c22;
--bg: #0a0a0a;
--bg-2: #111111;
--bg-3: #161616;
--bg-4: #0d0d0d;
--border: #1e1e1e;
--border-2: #252525;
--text: #f0ece0;
--text-muted: #888888;
--text-dim: #555555;
--green: #25D366;
--green-dark: #1ebe5d;
}
html { scroll-behavior: smooth; }
body {
font-family: 'DM Sans', sans-serif;
background: var(--bg);
color: var(--text);
overflow-x: hidden;
-webkit-font-smoothing: antialiased;
}
/* ---- Navegación ---- */
.nav {
position: sticky;
top: 0;
z-index: 100;
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem 2rem;
background: rgba(10,10,10,0.92);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border);
}
.nav-logo {
display: flex;
align-items: center;
gap: 12px;
text-decoration: none;
}
.nav-logo-icon {
width: 38px; height: 38px;
background: var(--gold);
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-size: 18px;
flex-shrink: 0;
}
.nav-brand {
font-family: 'Bebas Neue', sans-serif;
font-size: 22px;
letter-spacing: 3px;
color: var(--gold);
line-height: 1;
}
.nav-brand span { color: var(--text); }
.nav-tagline {
font-size: 10px;
color: var(--text-dim);
letter-spacing: 1.5px;
text-transform: uppercase;
}
.nav-right {
display: flex;
align-items: center;
gap: 10px;
}
.wa-btn-nav {
background: var(--green);
color: #fff;
border: none;
border-radius: 20px;
padding: 8px 16px;
font-family: 'DM Sans', sans-serif;
font-size: 12px;
font-weight: 500;
cursor: pointer;
display: flex;
align-items: center;
gap: 7px;
letter-spacing: 0.3px;
transition: background 0.2s;
}
.wa-btn-nav:hover { background: var(--green-dark); }
.wa-btn-nav svg { width: 15px; height: 15px; fill: #fff; flex-shrink: 0; }
/* ---- Hero ---- */
.hero {
padding: 5rem 2rem 3rem;
text-align: center;
position: relative;
overflow: hidden;
}
.hero::before {
content: '';
position: absolute;
top: -60px; left: 50%;
transform: translateX(-50%);
width: 600px; height: 300px;
background: radial-gradient(ellipse, rgba(201,168,76,0.08) 0%, transparent 70%);
pointer-events: none;
}
.hero-eyebrow {
display: inline-flex;
align-items: center;
gap: 8px;
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: 20px;
padding: 5px 14px;
font-size: 11px;
color: var(--text-dim);
letter-spacing: 1.5px;
text-transform: uppercase;
margin-bottom: 1.5rem;
}
.hero-dot {
width: 6px; height: 6px;
border-radius: 50%;
background: #4caf7d;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.4; transform: scale(0.85); }
}
.hero-title {
font-family: 'Bebas Neue', sans-serif;
font-size: clamp(52px, 10vw, 88px);
letter-spacing: 5px;
line-height: 0.95;
color: var(--text);
margin-bottom: 1rem;
}
.hero-title .gold { color: var(--gold); }
.hero-sub {
font-size: 15px;
color: var(--text-muted);
max-width: 480px;
margin: 0 auto 2rem;
line-height: 1.7;
font-weight: 300;
}
.hero-flags {
display: flex;
justify-content: center;
gap: 8px;
flex-wrap: wrap;
margin-bottom: 2.5rem;
}
.flag-pill {
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: 20px;
padding: 5px 14px;
font-size: 12px;
color: var(--text-muted);
display: flex;
align-items: center;
gap: 6px;
transition: border-color 0.2s, color 0.2s;
}
.flag-pill:hover { border-color: var(--gold); color: var(--text); }
.trust-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
max-width: 420px;
margin: 0 auto;
}
.trust-card {
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: 12px;
padding: 16px 12px;
text-align: center;
}
.trust-num {
font-family: 'Bebas Neue', sans-serif;
font-size: 30px;
color: var(--gold);
letter-spacing: 1px;
line-height: 1;
}
.trust-lbl {
font-size: 10px;
color: var(--text-dim);
letter-spacing: 1.5px;
text-transform: uppercase;
margin-top: 4px;
}
/* ---- Cómo funciona ---- */
.section {
padding: 3rem 2rem;
max-width: 700px;
margin: 0 auto;
}
.section-label {
font-family: 'Bebas Neue', sans-serif;
font-size: 13px;
letter-spacing: 4px;
color: var(--gold);
text-transform: uppercase;
margin-bottom: 0.5rem;
}
.section-title {
font-family: 'Bebas Neue', sans-serif;
font-size: 34px;
letter-spacing: 2px;
color: var(--text);
margin-bottom: 1.5rem;
}
.steps-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
.step-card {
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: 14px;
padding: 20px 16px;
}
.step-num {
font-family: 'Bebas Neue', sans-serif;
font-size: 40px;
color: var(--gold);
opacity: 0.4;
line-height: 1;
margin-bottom: 10px;
}
.step-title {
font-size: 14px;
font-weight: 500;
color: var(--text);
margin-bottom: 6px;
}
.step-desc {
font-size: 12px;
color: var(--text-dim);
line-height: 1.6;
}
.divider {
border: none;
border-top: 1px solid var(--border);
margin: 0 2rem;
}
/* ---- Calculadora ---- */
.calc-section {
padding: 2.5rem 2rem 1.5rem;
max-width: 700px;
margin: 0 auto;
}
.calc-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 1rem;
}
.calc-title {
font-family: 'Bebas Neue', sans-serif;
font-size: 20px;
letter-spacing: 2px;
color: var(--gold);
}
.mode-toggle {
display: grid;
grid-template-columns: 1fr 1fr;
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: 10px;
padding: 3px;
gap: 3px;
margin-bottom: 10px;
}
.mode-btn {
padding: 10px;
border: none;
border-radius: 7px;
font-family: 'DM Sans', sans-serif;
font-size: 12px;
letter-spacing: 0.4px;
text-transform: uppercase;
cursor: pointer;
transition: all 0.2s;
}
.mode-btn.active { background: var(--gold); color: #0a0a0a; font-weight: 500; }
.mode-btn:not(.active) { background: transparent; color: var(--text-dim); }
.mode-hint {
background: var(--bg-4);
border: 1px solid var(--border);
border-radius: 8px;
padding: 9px 14px;
font-size: 11px;
color: #777;
text-align: center;
line-height: 1.5;
margin-bottom: 10px;
}
.mode-hint .au { color: var(--gold); }
.calc-card {
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: 16px;
overflow: hidden;
}
.row-2 {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1px;
background: var(--border);
}
.cell {
background: var(--bg-2);
padding: 1.1rem 1.25rem;
}
.field-lbl {
font-size: 10px;
color: var(--text-dim);
letter-spacing: 2px;
text-transform: uppercase;
margin-bottom: 8px;
}
.bm-sel {
width: 100%;
background: var(--bg-3);
border: 1px solid var(--border-2);
border-radius: 8px;
color: var(--text);
padding: 10px 30px 10px 12px;
font-family: 'DM Sans', sans-serif;
font-size: 13px;
outline: none;
cursor: pointer;
appearance: none;
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath stroke='%23666' stroke-width='1.5' fill='none' d='M1 1l4 4 4-4'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 11px center;
transition: border-color 0.2s;
}
.bm-sel:focus { border-color: rgba(201,168,76,0.4); }
.swap-row {
display: flex;
align-items: center;
justify-content: center;
padding: 6px;
background: var(--bg-4);
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
}
.swap-btn {
background: var(--bg-3);
border: 1px solid var(--border-2);
border-radius: 50%;
width: 30px; height: 30px;
display: flex; align-items: center; justify-content: center;
cursor: pointer;
color: var(--text-muted);
font-size: 14px;
transition: border-color 0.2s, color 0.2s;
}
.swap-btn:hover { border-color: var(--gold); color: var(--gold); }
.amount-cell {
padding: 1rem 1.25rem;
}
.inp-wrap { position: relative; }
.inp-sym {
position: absolute;
left: 12px; top: 50%;
transform: translateY(-50%);
font-size: 13px;
color: var(--text-dim);
pointer-events: none;
}
.bm-inp {
width: 100%;
background: var(--bg-3);
border: 1px solid var(--border-2);
border-radius: 8px;
color: var(--text);
padding: 10px 12px 10px 30px;
font-family: 'DM Sans', sans-serif;
font-size: 22px;
font-weight: 500;
outline: none;
transition: border-color 0.2s;
}
.bm-inp:focus { border-color: rgba(201,168,76,0.4); }
.bm-inp::placeholder { color: var(--border-2); }
.hr { height: 1px; background: var(--border); }
.result-area {
padding: 1.25rem;
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 0.75rem;
}
.result-lbl {
font-size: 10px;
color: var(--text-dim);
letter-spacing: 2px;
text-transform: uppercase;
margin-bottom: 6px;
}
.result-num {
font-family: 'Bebas Neue', sans-serif;
font-size: 44px;
letter-spacing: 1px;
color: var(--gold);
line-height: 1;
}
.result-curr {
font-size: 16px;
color: var(--text-muted);
margin-left: 5px;
}
.rate-box {
background: var(--bg-3);
border: 1px solid var(--border-2);
border-radius: 10px;
padding: 12px 16px;
text-align: right;
flex-shrink: 0;
min-width: 150px;
}
.rate-lbl {
font-size: 10px;
color: var(--text-dim);
letter-spacing: 1.5px;
text-transform: uppercase;
margin-bottom: 4px;
}
.rate-val {
font-size: 13px;
font-weight: 500;
color: var(--text);
}
.rate-via {
font-size: 10px;
color: var(--text-dim);
margin-top: 3px;
}
.status-bar {
background: var(--bg-4);
border-top: 1px solid var(--border);
padding: 9px 1.25rem;
display: flex;
align-items: center;
justify-content: space-between;
}
.status-dot {
width: 7px; height: 7px;
border-radius: 50%;
background: #4caf7d;
display: inline-block;
margin-right: 7px;
animation: pulse 2s infinite;
}
.status-txt { font-size: 11px; color: var(--text-dim); letter-spacing: 0.5px; }
.status-time { font-size: 11px; color: #444; }
/* ---- Botones de acción ---- */
.action-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 8px;
margin-top: 12px;
}
.wa-main-btn {
background: var(--green);
color: #fff;
border: none;
border-radius: 10px;
padding: 14px 16px;
font-family: 'DM Sans', sans-serif;
font-size: 13px;
font-weight: 500;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 9px;
letter-spacing: 0.3px;
transition: background 0.2s;
}
.wa-main-btn:hover { background: var(--green-dark); }
.wa-main-btn svg { width: 18px; height: 18px; fill: #fff; flex-shrink: 0; }
.copy-btn {
background: transparent;
color: var(--gold);
border: 1px solid rgba(201,168,76,0.3);
border-radius: 10px;
padding: 14px 16px;
font-family: 'DM Sans', sans-serif;
font-size: 13px;
font-weight: 500;
cursor: pointer;
letter-spacing: 0.3px;
transition: background 0.2s, border-color 0.2s;
}
.copy-btn:hover { background: rgba(201,168,76,0.08); border-color: rgba(201,168,76,0.5); }
.calc-note {
margin-top: 10px;
padding: 10px 14px;
background: var(--bg-4);
border: 1px solid var(--border);
border-radius: 8px;
font-size: 11px;
color: var(--text-dim);
text-align: center;
line-height: 1.5;
}
.calc-note .au { color: var(--gold); }
/* ---- Testimonios ---- */
.testi-section {
padding: 2rem 2rem 3rem;
max-width: 700px;
margin: 0 auto;
}
.testi-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 10px;
}
.testi-card {
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: 14px;
padding: 18px;
}
.testi-stars {
color: var(--gold);
font-size: 13px;
letter-spacing: 2px;
margin-bottom: 10px;
}
.testi-text {
font-size: 13px;
color: var(--text-muted);
line-height: 1.6;
margin-bottom: 12px;
font-style: italic;
}
.testi-author {
font-size: 12px;
font-weight: 500;
color: var(--text);
display: flex;
align-items: center;
gap: 6px;
}
.testi-country {
font-size: 11px;
color: var(--text-dim);
font-weight: 400;
}
/* ---- Footer ---- */
.footer {
border-top: 1px solid var(--border);
padding: 2rem;
text-align: center;
}
.footer-logo {
font-family: 'Bebas Neue', sans-serif;
font-size: 20px;
letter-spacing: 3px;
color: var(--gold);
margin-bottom: 0.75rem;
}
.footer-logo span { color: var(--text-muted); }
.footer-links {
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 1rem;
flex-wrap: wrap;
}
.footer-link {
font-size: 12px;
color: var(--text-dim);
text-decoration: none;
letter-spacing: 0.5px;
transition: color 0.2s;
}
.footer-link:hover { color: var(--gold); }
.footer-copy {
font-size: 11px;
color: #333;
letter-spacing: 0.5px;
}
/* ---- Botón flotante WhatsApp ---- */
.wa-float {
position: fixed;
bottom: 24px;
right: 24px;
z-index: 999;
background: var(--green);
border: none;
border-radius: 50%;
width: 56px; height: 56px;
display: flex; align-items: center; justify-content: center;
cursor: pointer;
box-shadow: 0 4px 20px rgba(37,211,102,0.3);
transition: transform 0.2s, box-shadow 0.2s;
}
.wa-float:hover { transform: scale(1.08); box-shadow: 0 6px 28px rgba(37,211,102,0.4); }
.wa-float svg { width: 28px; height: 28px; fill: #fff; }
/* ---- Responsive ---- */
@media (max-width: 580px) {
.nav { padding: 0.85rem 1.25rem; }
.nav-tagline { display: none; }
.hero { padding: 3.5rem 1.25rem 2rem; }
.section, .calc-section, .testi-section { padding-left: 1.25rem; padding-right: 1.25rem; }
.steps-grid { grid-template-columns: 1fr; }
.result-num { font-size: 36px; }
.row-2 { grid-template-columns: 1fr; }
.action-grid { grid-template-columns: 1fr; }
.divider { margin: 0 1.25rem; }
}
</style>
</head>
<body>
<!-- ===== BARRA DE NAVEGACIÓN ===== -->
<nav class="nav">
<a href="#" class="nav-logo">
<div class="nav-logo-icon">💱</div>
<div>
<div class="nav-brand"><span>CAMBIOS</span> BLACKMONEY</div>
<div class="nav-tagline">Casa de cambio internacional</div>
</div>
</a>
<div class="nav-right">
<button class="wa-btn-nav" onclick="openWA('Hola! Quiero hacer una consulta')">
<svg viewBox="0 0 24 24"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>
Escribinos
</button>
</div>
</nav>
<!-- ===== HERO ===== -->
<header class="hero">
<div class="hero-eyebrow">
<span class="hero-dot"></span>
Tasas actualizadas hoy
</div>
<h1 class="hero-title">REMESAS<br>SIN <span class="gold">FRONTERAS</span></h1>
<p class="hero-sub">Enviá dinero entre Perú, Chile, Venezuela, Brasil y Estados Unidos. Rápido, seguro y con las mejores tasas del mercado.</p>
<div class="hero-flags">
<div class="flag-pill">🇵🇪 Perú</div>
<div class="flag-pill">🇨🇱 Chile</div>
<div class="flag-pill">🇻🇪 Venezuela</div>
<div class="flag-pill">🇧🇷 Brasil</div>
<div class="flag-pill">🇺🇸 EE.UU.</div>
</div>
<div class="trust-grid">
<div class="trust-card">
<div class="trust-num">5+</div>
<div class="trust-lbl">Países</div>
</div>
<div class="trust-card">
<div class="trust-num">24h</div>
<div class="trust-lbl">Atención</div>
</div>
<div class="trust-card">
<div class="trust-num">100%</div>
<div class="trust-lbl">Seguro</div>
</div>
</div>
</header>
<hr class="divider"/>
<!-- ===== CÓMO FUNCIONA ===== -->
<section class="section">
<div class="section-label">Simple y rápido</div>
<h2 class="section-title">¿Cómo funciona?</h2>
<div class="steps-grid">
<div class="step-card">
<div class="step-num">01</div>
<div class="step-title">Cotizás</div>
<div class="step-desc">Usá la calculadora para saber exactamente cuánto recibirá tu destinatario.</div>
</div>
<div class="step-card">
<div class="step-num">02</div>
<div class="step-title">Depositás</div>
<div class="step-desc">Realizás el depósito o transferencia según los datos que te enviamos por WhatsApp.</div>
</div>
<div class="step-card">
<div class="step-num">03</div>
<div class="step-title">Llega</div>
<div class="step-desc">Tu destinatario recibe el dinero en su país. Rápido y sin complicaciones.</div>
</div>
</div>
</section>
<hr class="divider"/>
<!-- ===== CALCULADORA ===== -->
<section class="calc-section" id="calculadora">
<div class="calc-header">
<span class="status-dot"></span>
<span class="calc-title">Calculadora de remesas</span>
</div>
<!-- Toggle de modo -->
<div class="mode-toggle">
<button class="mode-btn active" id="btnEnvio" onclick="setMode('envio')">¿Cuánto envío?</button>
<button class="mode-btn" id="btnRecibe" onclick="setMode('recibe')">¿Cuánto quiero recibir?</button>
</div>
<div class="mode-hint" id="modeDesc">
Ingresá el <span class="au">monto que enviás</span> y calculamos cuánto llega al destino.
</div>
<div class="calc-card">
<!-- Monedas -->
<div class="row-2">
<div class="cell">
<div class="field-lbl" id="fromLabel">País que envía</div>
<select class="bm-sel" id="fromCurrency" onchange="calculate()">
<option value="PEN">🇵🇪 PEN — Sol peruano</option>
<option value="USD">🇺🇸 USD — Dólar</option>
<option value="CLP">🇨🇱 CLP — Peso chileno</option>
<option value="VES">🇻🇪 VES — Bolívar</option>
<option value="BRL">🇧🇷 BRL — Real brasileño</option>
</select>
</div>
<div class="cell">
<div class="field-lbl">País que recibe</div>
<select class="bm-sel" id="toCurrency" onchange="calculate()">
<option value="USD">🇺🇸 USD — Dólar</option>
<option value="PEN">🇵🇪 PEN — Sol peruano</option>
<option value="CLP">🇨🇱 CLP — Peso chileno</option>
<option value="VES">🇻🇪 VES — Bolívar</option>
<option value="BRL">🇧🇷 BRL — Real brasileño</option>
</select>
</div>
</div>
<!-- Swap -->
<div class="swap-row">
<button class="swap-btn" onclick="swapCurrencies()" title="Intercambiar monedas">⇄</button>
</div>
<!-- Monto -->
<div class="amount-cell">
<div class="field-lbl" id="amountLabel">Monto a enviar</div>
<div class="inp-wrap">
<span class="inp-sym" id="fromSymbol">S/</span>
<input class="bm-inp" type="number" id="amountInput" value="100" min="0" step="any" oninput="calculate()" placeholder="0"/>
</div>
</div>
<div class="hr"></div>
<!-- Resultado -->
<div class="result-area">
<div>
<div class="result-lbl" id="resultLabel">Tu destinatario recibe</div>
<div>
<span class="result-num" id="resultAmount">—</span>
<span class="result-curr" id="resultCurrency">USD</span>
</div>
</div>
<div class="rate-box">
<div class="rate-lbl">Tasa del día</div>
<div class="rate-val" id="rateDisplay">—</div>
<div class="rate-via" id="rateVia"></div>
</div>
</div>
<!-- Barra de estado -->
<div class="status-bar">
<div>
<span class="status-dot"></span>
<span class="status-txt">Tasas actualizadas</span>
</div>
<span class="status-time" id="lastUpdated">Cargando...</span>
</div>
</div>
<!-- Botones -->
<div class="action-grid">
<button class="wa-main-btn" id="waQuoteBtn" onclick="openWAQuote()">
<svg viewBox="0 0 24 24"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>
Confirmar por WhatsApp
</button>
<button class="copy-btn" onclick="copyQuote()">Copiar cotización</button>
</div>
<div class="calc-note">
Cotización referencial. La tasa final la confirma <span class="au">Cambios BlackMoney</span> por WhatsApp.
</div>
</section>
<hr class="divider"/>
<!-- ===== TESTIMONIOS ===== -->
<section class="testi-section">
<div class="section-label">Clientes satisfechos</div>
<h2 class="section-title">Lo que dicen de nosotros</h2>
<div class="testi-grid">
<div class="testi-card">
<div class="testi-stars">★★★★★</div>
<p class="testi-text">"Rapidísimo, en menos de una hora le llegó el dinero a mi familia en Venezuela. Muy recomendado."</p>
<div class="testi-author">María G. <span class="testi-country">· Perú 🇵🇪</span></div>
</div>
<div class="testi-card">
<div class="testi-stars">★★★★★</div>
<p class="testi-text">"La mejor tasa que encontré. Ya llevo varios meses usando el servicio y nunca tuve problemas."</p>
<div class="testi-author">Carlos R. <span class="testi-country">· Chile 🇨🇱</span></div>
</div>
<div class="testi-card">
<div class="testi-stars">★★★★★</div>
<p class="testi-text">"Atención inmediata por WhatsApp. Me explicaron todo claramente. 100% confiable."</p>
<div class="testi-author">Luisa M. <span class="testi-country">· Venezuela 🇻🇪</span></div>
</div>
</div>
</section>
<!-- ===== FOOTER ===== -->
<footer class="footer">
<div class="footer-logo"><span>CAMBIOS</span> BLACKMONEY</div>
<div class="footer-links">
<a href="#calculadora" class="footer-link">Calculadora</a>
<!-- Reemplazá con tus redes reales -->
<a href="https://instagram.com/TU_INSTAGRAM" target="_blank" class="footer-link">Instagram</a>
<a href="https://t.me/TU_TELEGRAM" target="_blank" class="footer-link">Telegram</a>
<a href="javascript:void(0)" onclick="openWA('Hola!')" class="footer-link">WhatsApp</a>
</div>
<div class="footer-copy">© 2025 Cambios BlackMoney · Casa de cambio internacional</div>
</footer>
<!-- ===== BOTÓN FLOTANTE WHATSAPP ===== -->
<button class="wa-float" onclick="openWA('Hola! Quiero hacer una consulta sobre una remesa')" title="Escribinos por WhatsApp">
<svg viewBox="0 0 24 24"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg>
</button>
<!-- ===== JAVASCRIPT ===== -->
<script>
/*
=========================================================
CONFIGURACIÓN — EDITÁ ESTOS VALORES
=========================================================
WA_NUMBER → Tu número de WhatsApp con código de país
sin + ni espacios. Ej: 51987654321 (Perú)
SHEET_ID → El ID de tu Google Sheet (ver instrucciones
abajo en los comentarios de fetchRates)
SHEET_GID → El ID de la pestaña (normalmente '0')
=========================================================
*/
const WA_NUMBER = '51983450830'; // ← REEMPLAZÁ con tu número real
/* =========================================================
GOOGLE SHEETS — Cómo conectar tus tasas propias
=========================================================
1. Creá una hoja con este formato:
| (vacío) | USD | PEN | CLP | VES | BRL |
|---------|------|------|------|------|------|
| USD | 1 | 3.76 | 948 | 36.5 | 5.12 |
| PEN | 0.27 | 1 | 252 | 9.7 | 1.36 |
| CLP | ... | ... | 1 | ... | ... |
| VES | ... | ... | ... | 1 | ... |
| BRL | ... | ... | ... | ... | 1 |
2. Cada mañana actualizás los valores manualmente.
3. Publicá la hoja: Archivo → Compartir → Publicar en la web
Elegí CSV y copiá el ID que aparece en la URL de tu sheet.
4. Pegá el ID abajo en SHEET_ID.
========================================================= */
const SHEET_ID = '1UX3pVa7kpDpbppXRNhZQPyL4l70k7gNeX7brxFlsfxo'; // ← REEMPLAZÁ con tu Sheet ID
const SHEET_GID = '1119384781';
/* ---- Datos internos ---- */
const CURRENCIES = {
USD: { symbol: '$', name: 'Dólar', flag: '🇺🇸', decimals: 2 },
PEN: { symbol: 'S/', name: 'Sol peruano', flag: '🇵🇪', decimals: 2 },
CLP: { symbol: '$', name: 'Peso chileno', flag: '🇨🇱', decimals: 0 },
VES: { symbol: 'Bs.',name: 'Bolívar', flag: '🇻🇪', decimals: 2 },
BRL: { symbol: 'R$', name: 'Real brasileño', flag: '🇧🇷', decimals: 2 },
};
const DEMO_RATES_USD = { USD: 1, PEN: 3.76, CLP: 948, VES: 36.5, BRL: 5.12 };
let RATES = {};
let usdRates = {};
let mode = 'envio';
let lastTs = '—';
let lastResult = {};
/* ---- Construcción de matriz de tasas cruzadas ---- */
function buildMatrix(usdMap) {
const m = {};
const keys = Object.keys(usdMap);
keys.forEach(f => {
m[f] = {};
keys.forEach(t => {
m[f][t] = f === t ? 1 : (1 / usdMap[f]) * usdMap[t];
});
});
return m;
}
/* ---- Carga de tasas: primero Google Sheet, luego API, luego demo ---- */
async function fetchRates() {
// Intentar Google Sheet del usuario
if (SHEET_ID !== 'TU_SHEET_ID_AQUI') {
try {
const url = `https://docs.google.com/spreadsheets/d/${SHEET_ID}/export?format=csv&gid=${SHEET_GID}`;
const r = await fetch(url);
if (!r.ok) throw new Error();
const csv = await r.text();
const lines = csv.trim().split('\n');
const headers = lines[0].split(',').map(h => h.trim().toUpperCase());
const parsed = {};
for (let i = 1; i < lines.length; i++) {
const cols = lines[i].split(',').map(c => c.trim());
const rowKey = cols[0].toUpperCase();
if (!parsed[rowKey]) parsed[rowKey] = {};
for (let j = 1; j < headers.length; j++) {
const val = parseFloat(cols[j]);
if (!isNaN(val)) parsed[rowKey][headers[j]] = val;
}
parsed[rowKey][rowKey] = 1;
}
RATES = parsed;
// Extraer tasas USD para referencia
usdRates = {};
Object.keys(CURRENCIES).forEach(c => {
if (parsed['USD'] && parsed['USD'][c]) usdRates[c] = parsed['USD'][c];
});
const n = new Date();
lastTs = 'Tu Sheet · ' + n.toLocaleTimeString('es-PE', { hour: '2-digit', minute: '2-digit' });
return;
} catch (e) { /* seguir con alternativa */ }
}
// API de mercado como respaldo
try {
const r = await fetch('https://api.exchangerate-api.com/v4/latest/USD');
if (!r.ok) throw new Error();
const d = await r.json();
usdRates = { USD: 1, PEN: d.rates.PEN, CLP: d.rates.CLP, VES: d.rates.VES, BRL: d.rates.BRL };
RATES = buildMatrix(usdRates);
const n = new Date();
lastTs = 'Mercado · ' + n.toLocaleTimeString('es-PE', { hour: '2-digit', minute: '2-digit' });
return;
} catch (e) { /* seguir con demo */ }
// Demo como último respaldo
usdRates = DEMO_RATES_USD;
RATES = buildMatrix(DEMO_RATES_USD);
lastTs = 'Demo (configura tu Sheet)';
}
/* ---- Formateo de números ---- */
function fmt(val, currency) {
const d = CURRENCIES[currency]?.decimals ?? 2;
if (d === 0) return Math.round(val).toLocaleString('es-PE');
return val.toLocaleString('es-PE', { minimumFractionDigits: d, maximumFractionDigits: d });
}
/* ---- Modo de la calculadora ---- */
function setMode(m) {
mode = m;
document.getElementById('btnEnvio').className = 'mode-btn' + (m === 'envio' ? ' active' : '');
document.getElementById('btnRecibe').className = 'mode-btn' + (m === 'recibe' ? ' active' : '');
if (m === 'envio') {
document.getElementById('modeDesc').innerHTML = 'Ingresá el <span class="au">monto que enviás</span> y calculamos cuánto llega al destino.';
document.getElementById('amountLabel').textContent = 'Monto a enviar';
document.getElementById('resultLabel').textContent = 'Tu destinatario recibe';
} else {
document.getElementById('modeDesc').innerHTML = 'Ingresá <span class="au">cuánto querés que llegue</span> y te decimos cuánto tenés que enviar.';
document.getElementById('amountLabel').textContent = 'Monto que debe llegar';
document.getElementById('resultLabel').textContent = 'Tenés que enviar';
}
calculate();
}
/* ---- Intercambiar monedas ---- */
function swapCurrencies() {
const a = document.getElementById('fromCurrency').value;
const b = document.getElementById('toCurrency').value;
document.getElementById('fromCurrency').value = b;
document.getElementById('toCurrency').value = a;
calculate();
}
/* ---- Cálculo principal ---- */
function calculate() {
const from = document.getElementById('fromCurrency').value;
const to = document.getElementById('toCurrency').value;
const amount = parseFloat(document.getElementById('amountInput').value) || 0;
document.getElementById('fromSymbol').textContent = CURRENCIES[from]?.symbol || '';
const rate = RATES[from]?.[to];
if (!rate) {
document.getElementById('resultAmount').textContent = '—';
document.getElementById('rateDisplay').textContent = 'No disponible';
return;
}
let sendAmt, receiveAmt;
if (mode === 'envio') {
sendAmt = amount; receiveAmt = amount * rate;
} else {
receiveAmt = amount; sendAmt = amount / rate;
}
const displayAmt = mode === 'envio' ? receiveAmt : sendAmt;
const displayCurr = mode === 'envio' ? to : from;
document.getElementById('resultAmount').textContent = fmt(displayAmt, displayCurr);
document.getElementById('resultCurrency').textContent = displayCurr;
const rateStr = rate >= 1
? `1 ${from} = ${fmt(rate, to)} ${to}`
: `1 ${to} = ${fmt(1 / rate, from)} ${from}`;
document.getElementById('rateDisplay').textContent = rateStr;
document.getElementById('rateVia').textContent = (from !== 'USD' && to !== 'USD') ? 'vía USD' : '';
document.getElementById('lastUpdated').textContent = 'Act. ' + lastTs;
lastResult = { from, to, sendAmt, receiveAmt, rate };
}
/* ---- Abrir WhatsApp ---- */
function openWA(msg) {
window.open(`https://wa.me/${WA_NUMBER}?text=${encodeURIComponent(msg)}`, '_blank');
}
/* ---- WhatsApp con cotización completa ---- */
function openWAQuote() {
const { from, to, sendAmt, receiveAmt, rate } = lastResult;
if (!from) { openWA('Hola! Quiero hacer una remesa con Cambios BlackMoney.'); return; }
const f = CURRENCIES[from], t = CURRENCIES[to];
const rateStr = rate >= 1
? `1 ${from} = ${fmt(rate, to)} ${to}`
: `1 ${to} = ${fmt(1/rate, from)} ${from}`;
const msg =
`Hola Cambios BlackMoney! 👋\n\n` +
`Quiero confirmar esta remesa:\n\n` +
`📤 *Envío:* ${f.symbol}${fmt(sendAmt, from)} ${from} (${f.name}) ${f.flag}\n` +
`📥 *Recibe:* ${t.symbol}${fmt(receiveAmt, to)} ${to} (${t.name}) ${t.flag}\n\n` +
`💱 Tasa referencial: ${rateStr}\n\n` +
`¿Pueden confirmarme la tasa del día y los datos para el depósito?`;
openWA(msg);
}
/* ---- Copiar cotización al portapapeles ---- */
function copyQuote() {
const { from, to, sendAmt, receiveAmt, rate } = lastResult;
if (!from) return;
const f = CURRENCIES[from], t = CURRENCIES[to];
const rateStr = rate >= 1
? `1 ${from} = ${fmt(rate, to)} ${to}`
: `1 ${to} = ${fmt(1/rate, from)} ${from}`;
const txt =
`Cotización Cambios BlackMoney\n` +
`Envío: ${f.symbol}${fmt(sendAmt, from)} ${from} (${f.name})\n` +
`Recibe: ${t.symbol}${fmt(receiveAmt, to)} ${to} (${t.name})\n` +
`Tasa: ${rateStr}`;
navigator.clipboard?.writeText(txt).catch(() => {});
const btn = document.querySelector('.copy-btn');
const orig = btn.textContent;
btn.textContent = '¡Copiado! ✓';
setTimeout(() => btn.textContent = orig, 2000);
}
/* ---- Inicialización ---- */
async function init() {
await fetchRates();
calculate();
// Refrescar tasas cada 5 minutos automáticamente
setInterval(async () => {
await fetchRates();
calculate();
}, 5 * 60 * 1000);
}
init();
</script>
</body>
</html>