Files
moraworld/portal-cliente.html
T
Lizandro GuarnizoandClaude Sonnet 4.6 492dc5436c fix: auditoría UI/UX landing page y consistencia entre subpáginas
- Agrega menú móvil funcional con panel deslizable y animación hamburger
- Corrige hero stat "150 N / Day St" confuso por "$3.50/lb (flete)"
- Arregla bug CSS `flex-wrap: gap` inválido en footer-bottom
- Corrige links "Carga Pesada" en nav y footer para apuntar a #cotizacion
- Agrega acción al botón de pre-alerta con validación
- Limpia address del footer (eliminado placeholder "Suite EC-" vacío)
- Agrega favicon, OG tags y theme-color a las 4 páginas
- Consolida event listeners para evitar conflictos móvil/WhatsApp

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-28 11:35:15 -05:00

685 lines
45 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>Mi Casillero — Moraworld Imports</title>
<link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>📦</text></svg>" />
<meta name="theme-color" content="#0057FF" />
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;600&display=swap" rel="stylesheet"/>
<style>
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{
--primary:#0057FF;--primary-d:#003FC7;--primary-l:#EEF3FF;
--accent:#FF6B00;--dark:#0D1117;--green:#10B981;--red:#EF4444;
--yellow:#F59E0B;--purple:#8B5CF6;
--gray-900:#111827;--gray-800:#1F2937;--gray-700:#374151;
--gray-600:#4B5563;--gray-500:#6B7280;--gray-400:#9CA3AF;
--gray-300:#D1D5DB;--gray-200:#E5E7EB;--gray-100:#F3F4F6;
--white:#fff;--sidebar-w:260px;
--font-mono:'JetBrains Mono',monospace;
}
body{font-family:'Inter',sans-serif;background:var(--gray-100);color:var(--gray-900);display:flex;min-height:100vh}
a{text-decoration:none;color:inherit}
/* SIDEBAR */
aside{
width:var(--sidebar-w);min-width:var(--sidebar-w);
background:var(--dark);position:fixed;top:0;left:0;bottom:0;
overflow-y:auto;z-index:100;display:flex;flex-direction:column;
border-right:1px solid rgba(255,255,255,.06);
}
.sb-logo{padding:24px 20px 20px;border-bottom:1px solid rgba(255,255,255,.07)}
.sb-logo .name{font-size:1rem;font-weight:800;color:#fff}
.sb-logo .name span{color:var(--accent)}
.sb-logo .tag{font-size:.68rem;color:rgba(255,255,255,.3);margin-top:4px;font-family:var(--font-mono)}
.sb-user{padding:16px 20px;border-bottom:1px solid rgba(255,255,255,.07);display:flex;gap:12px;align-items:center}
.sb-avatar{width:36px;height:36px;border-radius:50%;background:var(--primary);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.85rem;color:#fff;flex-shrink:0}
.sb-user-info .uname{font-size:.85rem;font-weight:600;color:#fff}
.sb-user-info .urole{font-size:.7rem;color:rgba(255,255,255,.35)}
.sb-section{padding:20px 16px 8px;font-size:.62rem;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:rgba(255,255,255,.25)}
.sb-link{display:flex;align-items:center;gap:10px;padding:9px 20px;font-size:.82rem;color:rgba(255,255,255,.55);cursor:pointer;border-left:3px solid transparent;transition:all .15s}
.sb-link:hover{color:#fff;background:rgba(255,255,255,.04);border-left-color:rgba(255,255,255,.15)}
.sb-link.active{color:#fff;background:rgba(0,87,255,.12);border-left-color:var(--primary)}
.sb-link .ico{font-size:.9rem;flex-shrink:0;width:16px;text-align:center}
.sb-link .badge{margin-left:auto;background:var(--accent);color:#fff;font-size:.62rem;font-weight:700;padding:1px 7px;border-radius:999px}
.sb-suite{
margin:12px 16px;background:rgba(0,87,255,.12);border:1px solid rgba(0,87,255,.25);
border-radius:10px;padding:14px 16px;
}
.sb-suite .st-label{font-size:.65rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:rgba(255,255,255,.35);margin-bottom:8px}
.sb-suite .st-addr{font-family:var(--font-mono);font-size:.75rem;color:#A5B4FC;line-height:1.7}
.sb-suite .st-suite{color:var(--accent);font-weight:700;font-size:.82rem}
.sb-suite .copy-btn{display:flex;align-items:center;gap:6px;margin-top:10px;background:rgba(0,87,255,.2);color:#7AADFF;border:none;border-radius:6px;padding:6px 10px;font-size:.72rem;font-weight:600;cursor:pointer;width:100%;justify-content:center;font-family:inherit;transition:background .2s}
.sb-suite .copy-btn:hover{background:rgba(0,87,255,.35)}
.sb-footer{margin-top:auto;padding:16px 20px;border-top:1px solid rgba(255,255,255,.07)}
.sb-footer a{font-size:.78rem;color:rgba(255,255,255,.3);display:flex;align-items:center;gap:8px;padding:6px 0}
.sb-footer a:hover{color:#fff}
/* MAIN */
main{margin-left:var(--sidebar-w);flex:1;min-width:0}
/* TOPBAR */
.topbar{
position:sticky;top:0;z-index:90;background:rgba(255,255,255,.92);
backdrop-filter:blur(12px);border-bottom:1px solid var(--gray-200);
display:flex;align-items:center;justify-content:space-between;
padding:0 32px;height:56px;gap:16px;
}
.topbar-title{font-size:.95rem;font-weight:700;color:var(--gray-900)}
.topbar-right{display:flex;align-items:center;gap:12px}
.notif-btn{position:relative;width:36px;height:36px;border-radius:8px;border:1px solid var(--gray-200);background:var(--white);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:1rem}
.notif-dot{position:absolute;top:6px;right:6px;width:8px;height:8px;border-radius:50%;background:var(--accent);border:2px solid #fff}
.tb-avatar{width:34px;height:34px;border-radius:50%;background:var(--primary);display:flex;align-items:center;justify-content:center;font-weight:700;font-size:.8rem;color:#fff;cursor:pointer}
/* CONTENT */
.content{padding:32px;max-width:1100px}
/* STAT CARDS */
.stats-row{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:28px}
.stat-card{background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:20px 22px}
.stat-card .sc-label{font-size:.78rem;color:var(--gray-500);font-weight:600;margin-bottom:8px;display:flex;align-items:center;gap:6px}
.stat-card .sc-val{font-size:1.7rem;font-weight:800;color:var(--gray-900);margin-bottom:2px}
.stat-card .sc-sub{font-size:.75rem;color:var(--gray-400)}
.stat-card .sc-icon{font-size:1.4rem}
/* SECTION TITLE */
.section-hd{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}
.section-hd h2{font-size:1rem;font-weight:700;color:var(--gray-900)}
.btn-sm{padding:8px 16px;border-radius:7px;font-size:.8rem;font-weight:600;border:none;cursor:pointer;font-family:inherit;transition:all .2s}
.btn-primary{background:var(--primary);color:#fff}
.btn-primary:hover{background:var(--primary-d)}
.btn-outline{background:transparent;border:1.5px solid var(--gray-200);color:var(--gray-700)}
.btn-outline:hover{border-color:var(--primary);color:var(--primary)}
.btn-green{background:var(--green);color:#fff}
/* PACKAGES TABLE */
.pkg-table{width:100%;border-collapse:collapse;font-size:.83rem}
.pkg-table th{text-align:left;padding:10px 14px;background:var(--gray-900);color:#fff;font-size:.72rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase}
.pkg-table th:first-child{border-radius:8px 0 0 0}
.pkg-table th:last-child{border-radius:0 8px 0 0}
.pkg-table td{padding:12px 14px;border-bottom:1px solid var(--gray-200);color:var(--gray-700);vertical-align:middle}
.pkg-table tr:last-child td{border-bottom:none}
.pkg-table tr:hover td{background:var(--gray-100)}
.pkg-table .tid{font-family:var(--font-mono);font-size:.78rem;color:var(--primary);font-weight:600}
.pkg-table .desc{font-weight:600;color:var(--gray-900)}
.pkg-table .store{font-size:.75rem;color:var(--gray-500);margin-top:2px}
/* STATUS BADGES */
.badge{display:inline-flex;align-items:center;gap:5px;padding:3px 10px;border-radius:999px;font-size:.72rem;font-weight:700}
.b-gray{background:#F3F4F6;color:#6B7280}
.b-yellow{background:#FEF3C7;color:#92400E}
.b-blue{background:#DBEAFE;color:#1D4ED8}
.b-purple{background:#EDE9FE;color:#6D28D9}
.b-green{background:#D1FAE5;color:#065F46}
.b-orange{background:#FFEDD5;color:#C2410C}
.b-red{background:#FEE2E2;color:#991B1B}
.b-teal{background:#CCFBF1;color:#0F766E}
.badge .dot{width:6px;height:6px;border-radius:50%;background:currentColor}
/* ACTION BTNS */
.action-wrap{display:flex;gap:6px}
.act-btn{padding:5px 10px;border-radius:6px;border:1px solid var(--gray-200);background:var(--white);font-size:.75rem;font-weight:600;cursor:pointer;color:var(--gray-700);font-family:inherit;transition:all .2s}
.act-btn:hover{background:var(--primary);border-color:var(--primary);color:#fff}
/* MODAL */
.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:200;display:none;align-items:center;justify-content:center;padding:20px}
.modal-overlay.show{display:flex}
.modal{background:var(--white);border-radius:14px;padding:32px;width:100%;max-width:540px;max-height:90vh;overflow-y:auto;position:relative}
.modal h3{font-size:1.15rem;font-weight:700;margin-bottom:20px}
.modal-close{position:absolute;top:16px;right:16px;background:none;border:none;font-size:1.2rem;cursor:pointer;color:var(--gray-500);padding:4px}
.modal-close:hover{color:var(--gray-900)}
.form-group{margin-bottom:16px}
.form-group label{display:block;font-size:.83rem;font-weight:600;color:var(--gray-700);margin-bottom:5px}
.form-group input,.form-group select,.form-group textarea{width:100%;padding:11px 14px;border:2px solid var(--gray-200);border-radius:8px;font-size:.9rem;font-family:inherit;outline:none;transition:border-color .2s}
.form-group input:focus,.form-group select:focus,.form-group textarea:focus{border-color:var(--primary)}
.form-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.upload-box{border:2px dashed var(--gray-200);border-radius:8px;padding:20px;text-align:center;cursor:pointer;transition:border-color .2s}
.upload-box:hover{border-color:var(--primary)}
.upload-box p{font-size:.82rem;color:var(--gray-500);margin-top:6px}
.tab-pills{display:flex;gap:4px;background:var(--gray-100);padding:4px;border-radius:8px;margin-bottom:20px}
.tab-pill{flex:1;padding:8px 12px;border:none;border-radius:6px;font-size:.82rem;font-weight:600;cursor:pointer;font-family:inherit;color:var(--gray-600);background:transparent;transition:all .2s}
.tab-pill.active{background:var(--white);color:var(--primary);box-shadow:0 1px 4px rgba(0,0,0,.08)}
.tab-content{display:none}
.tab-content.active{display:block}
/* TRACKING PANEL */
.tracking-wrap{background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:24px}
.tl{display:flex;flex-direction:column;gap:0}
.tl-item{display:flex;gap:14px}
.tl-line{display:flex;flex-direction:column;align-items:center}
.tl-dot{width:14px;height:14px;border-radius:50%;border:2px solid var(--gray-200);background:var(--gray-200);flex-shrink:0}
.tl-dot.done{background:var(--green);border-color:var(--green)}
.tl-dot.active{background:var(--primary);border-color:var(--primary);box-shadow:0 0 0 4px rgba(0,87,255,.15)}
.tl-connector{width:2px;flex:1;background:var(--gray-200);min-height:20px}
.tl-connector.done{background:var(--green)}
.tl-body{padding:0 0 18px 0}
.tl-body strong{font-size:.87rem;display:block;margin-bottom:2px}
.tl-body span{font-size:.78rem;color:var(--gray-500)}
/* EMPTY STATE */
.empty-state{text-align:center;padding:60px 20px;color:var(--gray-500)}
.empty-state .es-icon{font-size:3rem;margin-bottom:12px}
.empty-state p{font-size:.9rem}
/* ALERT TOAST */
.toast{position:fixed;bottom:24px;right:24px;z-index:500;background:var(--green);color:#fff;padding:12px 20px;border-radius:10px;font-size:.85rem;font-weight:600;display:flex;gap:10px;align-items:center;transform:translateY(80px);opacity:0;transition:all .3s;pointer-events:none}
.toast.show{transform:translateY(0);opacity:1}
/* PANEL PAGES */
.panel-page{display:none}
.panel-page.active{display:block}
/* RESPONSIVE */
@media(max-width:900px){
aside{display:none}
main{margin-left:0}
.stats-row{grid-template-columns:1fr 1fr}
.content{padding:20px}
}
</style>
</head>
<body>
<!-- ═══ SIDEBAR ═══ -->
<aside>
<div class="sb-logo">
<div class="name">Moraworld<span>.</span>Imports</div>
<div class="tag">Portal del Cliente</div>
</div>
<div class="sb-user">
<div class="sb-avatar">JP</div>
<div class="sb-user-info">
<div class="uname">Juan Pérez</div>
<div class="urole">Cliente · Suite EC-04512</div>
</div>
</div>
<div class="sb-suite">
<div class="st-label">Tu dirección en EE.UU.</div>
<div class="st-addr">
<div>150 N Day St,</div>
<div class="st-suite">Suite EC-04512,</div>
<div>City of Orange, NJ 07050</div>
<div>United States 🇺🇸</div>
</div>
<button class="copy-btn" onclick="copySuite()">📋 Copiar dirección</button>
</div>
<div class="sb-section">Principal</div>
<div class="sb-link active" onclick="showPage('dashboard',this)"><span class="ico">🏠</span>Dashboard</div>
<div class="sb-link" onclick="showPage('paquetes',this)"><span class="ico">📦</span>Mis paquetes<span class="badge">3</span></div>
<div class="sb-link" onclick="showPage('prealerta',this)"><span class="ico">📬</span>Pre-alertas</div>
<div class="sb-link" onclick="showPage('tracking',this)"><span class="ico">🔍</span>Tracking</div>
<div class="sb-section">Registro</div>
<div class="sb-link" onclick="openModal('modal-compra')"><span class="ico"></span>Registrar compra</div>
<div class="sb-link" onclick="openModal('modal-prealerta')"><span class="ico">📝</span>Nueva pre-alerta</div>
<div class="sb-section">Mi cuenta</div>
<div class="sb-link" onclick="showPage('historial',this)"><span class="ico">📋</span>Historial</div>
<div class="sb-link" onclick="showPage('calculadora',this)"><span class="ico">💰</span>Calculadora</div>
<div class="sb-link" onclick="showPage('perfil',this)"><span class="ico">👤</span>Mi perfil</div>
<div class="sb-footer">
<a href="index.html">← Ir al sitio web</a>
<a href="login.html">🚪 Cerrar sesión</a>
</div>
</aside>
<!-- ═══ MAIN ═══ -->
<main>
<div class="topbar">
<div class="topbar-title" id="topbar-title">Dashboard</div>
<div class="topbar-right">
<button class="notif-btn" onclick="showToast('No hay notificaciones nuevas')">🔔<div class="notif-dot"></div></button>
<div class="tb-avatar">JP</div>
</div>
</div>
<div class="content">
<!-- ══ DASHBOARD ══ -->
<div class="panel-page active" id="page-dashboard">
<div class="stats-row">
<div class="stat-card">
<div class="sc-label"><span class="sc-icon">📦</span>En tránsito a bodega</div>
<div class="sc-val">2</div>
<div class="sc-sub">paquetes en camino a NJ</div>
</div>
<div class="stat-card">
<div class="sc-label"><span class="sc-icon">🔵</span>En bodega NJ</div>
<div class="sc-val">1</div>
<div class="sc-sub">recibido, en verificación</div>
</div>
<div class="stat-card">
<div class="sc-label"><span class="sc-icon">✈️</span>En tránsito a Ecuador</div>
<div class="sc-val">0</div>
<div class="sc-sub">en camino a Ecuador</div>
</div>
<div class="stat-card">
<div class="sc-label"><span class="sc-icon"></span>Entregados</div>
<div class="sc-val">7</div>
<div class="sc-sub">paquetes entregados</div>
</div>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:24px">
<!-- Recent packages -->
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:20px">
<div class="section-hd">
<h2>Paquetes recientes</h2>
<button class="btn-sm btn-outline" onclick="showPage('paquetes', null)">Ver todos</button>
</div>
<div style="display:flex;flex-direction:column;gap:10px">
<div style="display:flex;gap:12px;align-items:center;padding:10px 0;border-bottom:1px solid var(--gray-100)">
<div style="font-size:1.4rem">📱</div>
<div style="flex:1">
<div style="font-size:.85rem;font-weight:600">Auriculares Sony WH-1000XM5</div>
<div style="font-size:.75rem;color:var(--gray-500)">EC-20260510-014523</div>
</div>
<span class="badge b-yellow"><span class="dot"></span>En tránsito</span>
</div>
<div style="display:flex;gap:12px;align-items:center;padding:10px 0;border-bottom:1px solid var(--gray-100)">
<div style="font-size:1.4rem">👟</div>
<div style="flex:1">
<div style="font-size:.85rem;font-weight:600">Zapatillas Nike Air Max</div>
<div style="font-size:.75rem;color:var(--gray-500)">EC-20260508-009821</div>
</div>
<span class="badge b-blue"><span class="dot"></span>En bodega</span>
</div>
<div style="display:flex;gap:12px;align-items:center;padding:10px 0">
<div style="font-size:1.4rem">💻</div>
<div style="flex:1">
<div style="font-size:.85rem;font-weight:600">Laptop Dell XPS 13</div>
<div style="font-size:.75rem;color:var(--gray-500)">EC-20260501-078234</div>
</div>
<span class="badge b-green"><span class="dot"></span>Entregado</span>
</div>
</div>
</div>
<!-- Quick actions -->
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:20px">
<div class="section-hd"><h2>Acciones rápidas</h2></div>
<div style="display:flex;flex-direction:column;gap:10px">
<button onclick="openModal('modal-compra')" style="display:flex;align-items:center;gap:12px;padding:14px 16px;background:var(--primary-l);border:1px solid #C7D7FF;border-radius:10px;cursor:pointer;text-align:left;font-family:inherit;transition:all .2s" onmouseover="this.style.background='#DEEAFF'" onmouseout="this.style.background='var(--primary-l)'">
<span style="font-size:1.3rem"></span>
<div><div style="font-size:.88rem;font-weight:700;color:var(--primary)">Registrar nueva compra</div><div style="font-size:.75rem;color:var(--gray-500)">Por enlace URL o ingreso manual</div></div>
</button>
<button onclick="openModal('modal-prealerta')" style="display:flex;align-items:center;gap:12px;padding:14px 16px;background:#F0FDF4;border:1px solid #A7F3D0;border-radius:10px;cursor:pointer;text-align:left;font-family:inherit;transition:all .2s" onmouseover="this.style.background='#DCFCE7'" onmouseout="this.style.background='#F0FDF4'">
<span style="font-size:1.3rem">📬</span>
<div><div style="font-size:.88rem;font-weight:700;color:var(--green)">Crear pre-alerta</div><div style="font-size:.75rem;color:var(--gray-500)">Avísanos antes de que llegue tu paquete</div></div>
</button>
<button onclick="showPage('tracking',null)" style="display:flex;align-items:center;gap:12px;padding:14px 16px;background:#FFF3E8;border:1px solid #FED7AA;border-radius:10px;cursor:pointer;text-align:left;font-family:inherit;transition:all .2s" onmouseover="this.style.background='#FFE4C7'" onmouseout="this.style.background='#FFF3E8'">
<span style="font-size:1.3rem">🔍</span>
<div><div style="font-size:.88rem;font-weight:700;color:var(--accent)">Rastrear paquete</div><div style="font-size:.75rem;color:var(--gray-500)">Ingresa tu Tracking ID</div></div>
</button>
</div>
</div>
</div>
<!-- Notifications -->
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:20px">
<div class="section-hd"><h2>Notificaciones recientes</h2></div>
<div style="display:flex;flex-direction:column;gap:0">
<div style="display:flex;gap:12px;padding:12px 0;border-bottom:1px solid var(--gray-100);align-items:flex-start">
<div style="width:36px;height:36px;border-radius:10px;background:#D1FAE5;display:flex;align-items:center;justify-content:center;font-size:1rem;flex-shrink:0"></div>
<div><div style="font-size:.85rem;font-weight:600">Paquete verificado en bodega</div><div style="font-size:.78rem;color:var(--gray-500)">EC-20260508-009821 · Nike Air Max · Peso confirmado: 2.3 lbs</div><div style="font-size:.72rem;color:var(--gray-400);margin-top:2px">Hace 2 horas</div></div>
</div>
<div style="display:flex;gap:12px;padding:12px 0;border-bottom:1px solid var(--gray-100);align-items:flex-start">
<div style="width:36px;height:36px;border-radius:10px;background:#DBEAFE;display:flex;align-items:center;justify-content:center;font-size:1rem;flex-shrink:0">📦</div>
<div><div style="font-size:.85rem;font-weight:600">Paquete recibido en bodega NJ</div><div style="font-size:.78rem;color:var(--gray-500)">EC-20260508-009821 · Recibido en 150 N Day St, Orange NJ</div><div style="font-size:.72rem;color:var(--gray-400);margin-top:2px">Ayer a las 11:30 AM</div></div>
</div>
<div style="display:flex;gap:12px;padding:12px 0;align-items:flex-start">
<div style="width:36px;height:36px;border-radius:10px;background:#FEF3C7;display:flex;align-items:center;justify-content:center;font-size:1rem;flex-shrink:0">🚚</div>
<div><div style="font-size:.85rem;font-weight:600">Paquete en tránsito hacia la bodega</div><div style="font-size:.78rem;color:var(--gray-500)">EC-20260510-014523 · Auriculares Sony · UPS tracking: 1Z999AA10123456784</div><div style="font-size:.72rem;color:var(--gray-400);margin-top:2px">Hace 3 días</div></div>
</div>
</div>
</div>
</div>
<!-- ══ MIS PAQUETES ══ -->
<div class="panel-page" id="page-paquetes">
<div class="section-hd" style="margin-bottom:20px">
<h2>Mis paquetes</h2>
<button class="btn-sm btn-primary" onclick="openModal('modal-compra')">+ Registrar compra</button>
</div>
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;overflow:hidden">
<table class="pkg-table">
<thead>
<tr>
<th>Tracking ID</th>
<th>Producto</th>
<th>Tienda</th>
<th>Peso</th>
<th>Valor</th>
<th>Estado</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<tr>
<td><div class="tid">EC-20260510-014523</div></td>
<td><div class="desc">Auriculares Sony WH-1000XM5</div></td>
<td><div class="store">Amazon</div></td>
<td>0.6 lbs</td>
<td>$349.99</td>
<td><span class="badge b-yellow"><span class="dot"></span>En tránsito a bodega</span></td>
<td><div class="action-wrap"><button class="act-btn" onclick="showPkgDetail('EC-20260510-014523')">Ver</button><button class="act-btn">Fotos</button></div></td>
</tr>
<tr>
<td><div class="tid">EC-20260508-009821</div></td>
<td><div class="desc">Zapatillas Nike Air Max 270</div></td>
<td><div class="store">Nike.com</div></td>
<td>2.3 lbs</td>
<td>$129.00</td>
<td><span class="badge b-purple"><span class="dot"></span>En verificación</span></td>
<td><div class="action-wrap"><button class="act-btn" onclick="showPkgDetail('EC-20260508-009821')">Ver</button><button class="act-btn">📸 Fotos</button></div></td>
</tr>
<tr>
<td><div class="tid">EC-20260503-061004</div></td>
<td><div class="desc">Cámara GoPro HERO12</div></td>
<td><div class="store">Best Buy</div></td>
<td>1.8 lbs</td>
<td>$399.99</td>
<td><span class="badge b-orange"><span class="dot"></span>En tránsito a Ecuador</span></td>
<td><div class="action-wrap"><button class="act-btn" onclick="showPkgDetail('EC-20260503-061004')">Ver</button></div></td>
</tr>
<tr>
<td><div class="tid">EC-20260501-078234</div></td>
<td><div class="desc">Laptop Dell XPS 13</div></td>
<td><div class="store">Dell.com</div></td>
<td>4.4 lbs</td>
<td>$1,299.00</td>
<td><span class="badge b-green"><span class="dot"></span>Entregado</span></td>
<td><div class="action-wrap"><button class="act-btn">Ver</button></div></td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- ══ PRE-ALERTAS ══ -->
<div class="panel-page" id="page-prealerta">
<div class="section-hd" style="margin-bottom:20px">
<h2>Pre-alertas de paquetes</h2>
<button class="btn-sm btn-primary" onclick="openModal('modal-prealerta')">+ Nueva pre-alerta</button>
</div>
<div style="background:#EFF6FF;border:1px solid #BFDBFE;border-radius:10px;padding:14px 18px;margin-bottom:20px;font-size:.85rem;color:#1D4ED8;display:flex;gap:10px">
<span>💡</span>
<span>Envíanos una pre-alerta antes de que llegue tu paquete a la bodega. El operador lo buscará y asignará a tu Suite más rápido.</span>
</div>
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;overflow:hidden">
<table class="pkg-table">
<thead>
<tr><th>Fecha</th><th>Tienda</th><th>Tracking vendedor</th><th>Descripción</th><th>Valor declarado</th><th>Estado</th></tr>
</thead>
<tbody>
<tr>
<td>10 may 2026</td>
<td>Amazon</td>
<td><span style="font-family:var(--font-mono);font-size:.78rem">1Z999AA10123456784</span></td>
<td>Auriculares Sony WH-1000XM5</td>
<td>$349.99</td>
<td><span class="badge b-yellow"><span class="dot"></span>En espera</span></td>
</tr>
</tbody>
</table>
</div>
</div>
<!-- ══ TRACKING ══ -->
<div class="panel-page" id="page-tracking">
<h2 style="font-size:1rem;font-weight:700;margin-bottom:20px">Rastrear paquete</h2>
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:24px">
<div style="display:flex;gap:0;max-width:500px;margin-bottom:28px">
<input type="text" id="track-input" placeholder="Ej: EC-20260510-014523" style="flex:1;padding:13px 16px;border:2px solid var(--gray-200);border-right:none;border-radius:8px 0 0 8px;font-size:.93rem;font-family:inherit;outline:none;transition:border-color .2s" onfocus="this.style.borderColor='var(--primary)'" onblur="this.style.borderColor='var(--gray-200)'"/>
<button onclick="doTracking()" style="padding:13px 24px;background:var(--primary);color:#fff;border:none;border-radius:0 8px 8px 0;font-weight:700;font-size:.9rem;cursor:pointer;font-family:inherit;transition:background .2s" onmouseover="this.style.background='var(--primary-d)'" onmouseout="this.style.background='var(--primary)'">Rastrear</button>
</div>
<div id="tracking-result" style="display:none">
<div style="font-size:.9rem;font-weight:700;color:var(--gray-900);margin-bottom:20px">📦 <span id="t-id">EC-20260508-009821</span><span style="color:var(--primary)">En verificación en bodega NJ</span></div>
<div class="tl">
<div class="tl-item"><div class="tl-line"><div class="tl-dot done"></div><div class="tl-connector done"></div></div><div class="tl-body"><strong>✅ Registrado</strong><span>08 may 2026, 09:14 AM ECT</span></div></div>
<div class="tl-item"><div class="tl-line"><div class="tl-dot done"></div><div class="tl-connector done"></div></div><div class="tl-body"><strong>✅ En tránsito a bodega NJ</strong><span>09 may 2026, 10:00 AM EST</span></div></div>
<div class="tl-item"><div class="tl-line"><div class="tl-dot done"></div><div class="tl-connector done"></div></div><div class="tl-body"><strong>✅ Recibido en bodega NJ</strong><span>10 may 2026, 11:30 AM EST</span></div></div>
<div class="tl-item"><div class="tl-line"><div class="tl-dot active"></div><div class="tl-connector"></div></div><div class="tl-body"><strong style="color:var(--primary)">🔵 En verificación</strong><span>Operador verificando peso y dimensiones</span></div></div>
<div class="tl-item"><div class="tl-line"><div class="tl-dot"></div><div class="tl-connector"></div></div><div class="tl-body"><strong style="color:var(--gray-400)">⏳ Declaración SENAE</strong><span>Pendiente</span></div></div>
<div class="tl-item"><div class="tl-line"><div class="tl-dot"></div><div class="tl-connector"></div></div><div class="tl-body"><strong style="color:var(--gray-400)">⏳ En tránsito a Ecuador</strong><span>Pendiente</span></div></div>
<div class="tl-item"><div class="tl-line"><div class="tl-dot"></div></div><div class="tl-body"><strong style="color:var(--gray-400)">⏳ Entregado</strong><span>Pendiente</span></div></div>
</div>
</div>
</div>
</div>
<!-- ══ HISTORIAL ══ -->
<div class="panel-page" id="page-historial">
<h2 style="font-size:1rem;font-weight:700;margin-bottom:20px">Historial de envíos</h2>
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;overflow:hidden">
<table class="pkg-table">
<thead><tr><th>Tracking ID</th><th>Producto</th><th>Fecha entrega</th><th>Peso</th><th>Total pagado</th><th>Estado</th></tr></thead>
<tbody>
<tr><td><div class="tid">EC-20260501-078234</div></td><td>Laptop Dell XPS 13</td><td>15 may 2026</td><td>4.4 lbs</td><td>$78.50</td><td><span class="badge b-green"><span class="dot"></span>Entregado</span></td></tr>
<tr><td><div class="tid">EC-20260420-045001</div></td><td>Auriculares Bose 700</td><td>05 may 2026</td><td>0.8 lbs</td><td>$23.40</td><td><span class="badge b-green"><span class="dot"></span>Entregado</span></td></tr>
<tr><td><div class="tid">EC-20260410-033210</div></td><td>Cargador iPhone 15 Pro</td><td>25 abr 2026</td><td>0.2 lbs</td><td>$8.90</td><td><span class="badge b-green"><span class="dot"></span>Entregado</span></td></tr>
</tbody>
</table>
</div>
</div>
<!-- ══ CALCULADORA ══ -->
<div class="panel-page" id="page-calculadora">
<h2 style="font-size:1rem;font-weight:700;margin-bottom:20px">Calculadora de envío</h2>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:20px">
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:24px">
<h3 style="font-size:1rem;font-weight:700;margin-bottom:20px">📊 Datos del producto</h3>
<div class="form-group"><label>Peso (lbs)</label><input type="number" id="cc-w" placeholder="Ej: 2.5" step="0.1"/></div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
<div class="form-group"><label>Largo (cm)</label><input type="number" id="cc-l" placeholder="30"/></div>
<div class="form-group"><label>Ancho (cm)</label><input type="number" id="cc-a" placeholder="20"/></div>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
<div class="form-group"><label>Alto (cm)</label><input type="number" id="cc-h" placeholder="15"/></div>
<div class="form-group"><label>Valor ($USD)</label><input type="number" id="cc-v" placeholder="150"/></div>
</div>
<div class="form-group"><label>Categoría SENAE</label>
<select id="cc-cat">
<option value="4x4">4x4 — Sin arancel (máx $400, 4 kg)</option>
<option value="B">Cat. B — Consumo general (10%)</option>
<option value="C">Cat. C — Textiles, calzado (20%)</option>
<option value="D">Cat. D — Electrónicos (10%)</option>
</select>
</div>
<button onclick="calcPortal()" style="width:100%;padding:12px;background:var(--primary);color:#fff;border:none;border-radius:8px;font-weight:700;cursor:pointer;font-family:inherit;font-size:.9rem">Calcular →</button>
</div>
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:24px">
<h3 style="font-size:1rem;font-weight:700;margin-bottom:20px">💰 Desglose estimado</h3>
<div style="display:flex;flex-direction:column;gap:0">
<div style="display:flex;justify-content:space-between;padding:11px 0;border-bottom:1px solid var(--gray-100);font-size:.87rem"><span style="color:var(--gray-500)">Peso a cobrar</span><span id="cc-r-peso" style="font-weight:600"></span></div>
<div style="display:flex;justify-content:space-between;padding:11px 0;border-bottom:1px solid var(--gray-100);font-size:.87rem"><span style="color:var(--gray-500)">Flete ($3.50/lb)</span><span id="cc-r-flete" style="font-weight:600">$0.00</span></div>
<div style="display:flex;justify-content:space-between;padding:11px 0;border-bottom:1px solid var(--gray-100);font-size:.87rem"><span style="color:var(--gray-500)">Seguro (2%)</span><span id="cc-r-seg" style="font-weight:600">$0.00</span></div>
<div style="display:flex;justify-content:space-between;padding:11px 0;border-bottom:1px solid var(--gray-100);font-size:.87rem"><span style="color:var(--gray-500)">FODINFA (0.5%)</span><span id="cc-r-fod" style="font-weight:600">$0.00</span></div>
<div style="display:flex;justify-content:space-between;padding:11px 0;border-bottom:1px solid var(--gray-100);font-size:.87rem"><span style="color:var(--gray-500)">Arancel</span><span id="cc-r-ara" style="font-weight:600">$0.00</span></div>
<div style="display:flex;justify-content:space-between;padding:11px 0;border-bottom:1px solid var(--gray-100);font-size:.87rem"><span style="color:var(--gray-500)">IVA (15%)</span><span id="cc-r-iva" style="font-weight:600">$0.00</span></div>
</div>
<div style="background:linear-gradient(135deg,var(--primary),var(--primary-d));border-radius:10px;padding:18px 20px;margin-top:16px;display:flex;justify-content:space-between;align-items:center">
<span style="color:rgba(255,255,255,.8);font-size:.88rem;font-weight:600">TOTAL ESTIMADO</span>
<span id="cc-r-total" style="color:#fff;font-size:1.4rem;font-weight:800">$0.00</span>
</div>
</div>
</div>
</div>
<!-- ══ PERFIL ══ -->
<div class="panel-page" id="page-perfil">
<h2 style="font-size:1rem;font-weight:700;margin-bottom:20px">Mi perfil</h2>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:20px">
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:24px">
<h3 style="font-size:.95rem;font-weight:700;margin-bottom:20px">Datos personales</h3>
<div class="form-group"><label>Nombre completo</label><input type="text" value="Juan Pérez"/></div>
<div class="form-group"><label>Correo electrónico</label><input type="email" value="juan.perez@ejemplo.com"/></div>
<div class="form-group"><label>Teléfono WhatsApp</label><input type="tel" value="+593 99 123 4567"/></div>
<div class="form-group"><label>Ciudad</label><input type="text" value="Cuenca, Ecuador"/></div>
<div class="form-group"><label>Cédula / Pasaporte</label><input type="text" value="0102030405"/></div>
<button class="btn-sm btn-primary" style="width:100%">Guardar cambios</button>
</div>
<div style="background:var(--white);border:1px solid var(--gray-200);border-radius:12px;padding:24px">
<h3 style="font-size:.95rem;font-weight:700;margin-bottom:20px">Mi Suite asignada</h3>
<div style="background:var(--dark);border-radius:10px;padding:18px 20px;font-family:var(--font-mono);font-size:.85rem;color:#A5B4FC;line-height:2;border:1px solid rgba(0,87,255,.3);margin-bottom:16px">
<div style="color:#fff;font-weight:700">Juan Pérez</div>
<div>150 N Day St,</div>
<div style="color:var(--accent);font-weight:700;font-size:.95rem">Suite EC-04512,</div>
<div>City of Orange, NJ 07050</div>
<div>United States 🇺🇸</div>
</div>
<button onclick="copySuite()" style="width:100%;padding:12px;background:var(--primary-l);color:var(--primary);border:1px solid #C7D7FF;border-radius:8px;font-weight:700;font-size:.88rem;cursor:pointer;font-family:inherit">📋 Copiar dirección completa</button>
<div style="margin-top:20px">
<h3 style="font-size:.95rem;font-weight:700;margin-bottom:16px">Seguridad</h3>
<div style="display:flex;align-items:center;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--gray-100);font-size:.85rem"><span>Contraseña</span><button class="btn-sm btn-outline">Cambiar</button></div>
<div style="display:flex;align-items:center;justify-content:space-between;padding:12px 0;font-size:.85rem"><span>MFA (autenticación 2 pasos)</span><span style="background:#D1FAE5;color:#065F46;font-size:.72rem;font-weight:700;padding:3px 10px;border-radius:999px">Activo ✓</span></div>
</div>
</div>
</div>
</div>
</div><!-- /content -->
</main>
<!-- ═══ MODAL: REGISTRAR COMPRA ═══ -->
<div class="modal-overlay" id="modal-compra">
<div class="modal">
<button class="modal-close" onclick="closeModal('modal-compra')"></button>
<h3> Registrar nueva compra</h3>
<div class="tab-pills">
<button class="tab-pill active" onclick="switchTab('tab-url','tab-manual',this)">🔗 Por enlace URL</button>
<button class="tab-pill" onclick="switchTab('tab-manual','tab-url',this)">✏️ Ingreso manual</button>
</div>
<div class="tab-content active" id="tab-url">
<div class="form-group">
<label>Pega el enlace del producto (Amazon, eBay, etc.)</label>
<div style="display:flex;gap:8px">
<input type="url" id="url-input" placeholder="https://www.amazon.com/dp/..." style="flex:1;padding:11px 14px;border:2px solid var(--gray-200);border-radius:8px;font-family:inherit;font-size:.9rem;outline:none" onfocus="this.style.borderColor='var(--primary)'" onblur="this.style.borderColor='var(--gray-200)'"/>
<button onclick="scanUrl()" style="padding:11px 16px;background:var(--primary);color:#fff;border:none;border-radius:8px;font-weight:700;cursor:pointer;font-family:inherit;white-space:nowrap">Escanear</button>
</div>
</div>
<div id="url-preview" style="display:none;background:var(--gray-100);border-radius:10px;padding:16px;margin-bottom:16px">
<div style="font-size:.85rem;font-weight:700;margin-bottom:4px" id="url-prod-name">Auriculares Sony WH-1000XM5</div>
<div style="font-size:.8rem;color:var(--gray-500)">Amazon · $349.99 · ~0.6 lbs</div>
</div>
</div>
<div class="tab-content" id="tab-manual">
<div class="form-group"><label>Nombre del producto</label><input type="text" placeholder="Ej: Auriculares Sony WH-1000XM5"/></div>
<div class="form-group"><label>Tienda / Plataforma</label><select><option>Amazon</option><option>eBay</option><option>Walmart</option><option>Shein</option><option>Otra</option></select></div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
<div class="form-group"><label>Valor ($USD)</label><input type="number" placeholder="349.99"/></div>
<div class="form-group"><label>Peso estimado (lbs)</label><input type="number" placeholder="0.6"/></div>
</div>
<div class="form-group"><label>Categoría SENAE</label><select><option>4x4 — Sin arancel</option><option>Cat. B — 10%</option><option>Cat. C — 20%</option><option>Cat. D — 10%</option></select></div>
<div class="form-group"><label>Cantidad</label><input type="number" value="1" min="1"/></div>
</div>
<button onclick="submitCompra()" style="width:100%;padding:13px;background:var(--primary);color:#fff;border:none;border-radius:8px;font-weight:700;font-size:.95rem;cursor:pointer;font-family:inherit;margin-top:8px">Registrar compra →</button>
</div>
</div>
<!-- ═══ MODAL: PRE-ALERTA ═══ -->
<div class="modal-overlay" id="modal-prealerta">
<div class="modal">
<button class="modal-close" onclick="closeModal('modal-prealerta')"></button>
<h3>📬 Nueva pre-alerta</h3>
<div class="form-group"><label>Tienda / Plataforma</label><select><option>Amazon</option><option>eBay</option><option>Walmart</option><option>Shein</option><option>Otra</option></select></div>
<div class="form-group"><label>Número de tracking del vendedor</label><input type="text" placeholder="Ej: 1Z999AA10123456784 (UPS)"/></div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px">
<div class="form-group"><label>Valor declarado ($USD)</label><input type="number" placeholder="120"/></div>
<div class="form-group"><label>Peso estimado (lbs)</label><input type="number" placeholder="1.5"/></div>
</div>
<div class="form-group"><label>Descripción del producto</label><input type="text" placeholder="Ej: Auriculares Bluetooth Sony"/></div>
<div class="form-group"><label>Fecha estimada de llegada a NJ</label><input type="date"/></div>
<div class="form-group">
<label>Factura comercial (PDF o imagen)</label>
<div class="upload-box" onclick="document.getElementById('factura-file').click()">
<div style="font-size:1.8rem">📎</div>
<p>Haz clic para subir la factura de Amazon o la tienda</p>
<input type="file" id="factura-file" style="display:none" accept=".pdf,image/*"/>
</div>
</div>
<button onclick="submitPrealerta()" style="width:100%;padding:13px;background:var(--green);color:#fff;border:none;border-radius:8px;font-weight:700;font-size:.95rem;cursor:pointer;font-family:inherit">Enviar pre-alerta →</button>
</div>
</div>
<!-- TOAST -->
<div class="toast" id="toast"><span id="toast-msg"></span></div>
<script>
// Page navigation
function showPage(id, el){
document.querySelectorAll('.panel-page').forEach(p=>p.classList.remove('active'));
document.getElementById('page-'+id).classList.add('active');
document.querySelectorAll('.sb-link').forEach(l=>l.classList.remove('active'));
if(el) el.classList.add('active');
const titles={dashboard:'Dashboard',paquetes:'Mis paquetes',prealerta:'Pre-alertas',tracking:'Tracking',historial:'Historial de envíos',calculadora:'Calculadora de envío',perfil:'Mi perfil'};
document.getElementById('topbar-title').textContent = titles[id]||id;
}
// Modals
function openModal(id){ document.getElementById(id).classList.add('show'); document.body.style.overflow='hidden'; }
function closeModal(id){ document.getElementById(id).classList.remove('show'); document.body.style.overflow=''; }
document.querySelectorAll('.modal-overlay').forEach(o=>{ o.addEventListener('click',function(e){ if(e.target===this) this.classList.remove('show'),document.body.style.overflow=''; }); });
// Tabs
function switchTab(show, hide, btn){
document.getElementById(show).classList.add('active');
document.getElementById(hide).classList.remove('active');
btn.closest('.tab-pills').querySelectorAll('.tab-pill').forEach(b=>b.classList.remove('active'));
btn.classList.add('active');
}
// Copy suite
function copySuite(){
const addr = 'Juan Pérez\n150 N Day St, Suite EC-04512\nCity of Orange, NJ 07050\nUnited States';
navigator.clipboard.writeText(addr).catch(()=>{});
showToast('¡Dirección copiada al portapapeles!');
}
// Tracking
function doTracking(){
const v = document.getElementById('track-input').value.trim();
if(!v){ alert('Ingresa un Tracking ID'); return; }
document.getElementById('t-id').textContent = v;
document.getElementById('tracking-result').style.display='block';
}
// Scan URL (demo)
function scanUrl(){
const url = document.getElementById('url-input').value.trim();
if(!url){ return; }
document.getElementById('url-preview').style.display='block';
}
// Calc
function calcPortal(){
const w=parseFloat(document.getElementById('cc-w').value)||0;
const l=parseFloat(document.getElementById('cc-l').value)||0;
const a=parseFloat(document.getElementById('cc-a').value)||0;
const h=parseFloat(document.getElementById('cc-h').value)||0;
const v=parseFloat(document.getElementById('cc-v').value)||0;
const cat=document.getElementById('cc-cat').value;
const volW=(l*a*h)/139;
const pf=Math.max(w,volW);
const aranceles={'4x4':0,'B':.10,'C':.20,'D':.10};
const flete=pf*3.5,seg=v*.02,fod=v*.005,ara=v*(aranceles[cat]||0),iva=(v+fod+ara)*.15;
const total=flete+seg+fod+ara+iva;
const f=n=>'$'+n.toFixed(2);
document.getElementById('cc-r-peso').textContent=pf.toFixed(2)+' lbs';
document.getElementById('cc-r-flete').textContent=f(flete);
document.getElementById('cc-r-seg').textContent=f(seg);
document.getElementById('cc-r-fod').textContent=f(fod);
document.getElementById('cc-r-ara').textContent=f(ara)+(cat==='4x4'?' (exento)':'');
document.getElementById('cc-r-iva').textContent=f(iva);
document.getElementById('cc-r-total').textContent=f(total);
}
function submitCompra(){ closeModal('modal-compra'); showToast('¡Compra registrada con éxito! Tracking ID asignado.'); }
function submitPrealerta(){ closeModal('modal-prealerta'); showToast('¡Pre-alerta enviada a la bodega NJ!'); }
function showToast(msg){
const t=document.getElementById('toast');
document.getElementById('toast-msg').textContent=msg;
t.classList.add('show');
setTimeout(()=>t.classList.remove('show'),3000);
}
function showPkgDetail(tid){ showToast('Abriendo detalle de '+tid); }
</script>
</body>
</html>