- F0 blindaje: Redis/Celery, pg_hba sin trust LAN, secretos a env 600, backups, webhook auth, jobs muertos - F1 caja: bugs POS, reembolsos al corte, apartados, CFDI, topes de descuento en cotizacion/apartado - F2/F7 IA de catalogo: autocategorizacion, dedup de SKUs con embeddings, OCR de facturas, descripciones, claves SAT, limpieza de fitment - F3 IA en el flujo: vision Yonke, preguntas MeLi, venta cruzada, anomalias, sinonimos, busqueda semantica (rerank/embeddings) - F4/F8 escala y cartera: /metrics+Prometheus+Grafana, pool, score de credito, churn, metricas multi-tenant - Nexus Yonke (M1-M6): modelo de datos 1-de-1, alta por donador, vitrina publica, MeLi usado, consignacion, garantia por dias, reportes, etiquetas - Marketplace B2B entre yonkes (catalogo + pedidos cross-tenant) - Seguridad: auth en /api/admin/* (35 endpoints), alertas por tenant - Migraciones v4.27/v4.28; timers expire-demos y rollup-metrics
98 lines
3.5 KiB
HTML
98 lines
3.5 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="es" data-theme="industrial">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Catalogo — Nexus Autoparts</title>
|
|
<script>
|
|
(function(){
|
|
var t = localStorage.getItem('nexus-theme') || 'industrial';
|
|
document.documentElement.setAttribute('data-theme', t);
|
|
})();
|
|
</script>
|
|
<link rel="stylesheet" href="/static/css/tokens.css">
|
|
<link rel="stylesheet" href="catalog-public.css">
|
|
</head>
|
|
<body>
|
|
|
|
<header class="site-header">
|
|
<div class="inner">
|
|
<a href="/" class="logo">Nexus Autoparts</a>
|
|
<div class="header-right">
|
|
<div class="mode-toggle" id="modeToggle" title="Cambiar entre catalogo OEM (TecDoc) y marcas locales">
|
|
<button data-mode="oem" onclick="setCatalogMode('oem')">OEM</button>
|
|
<button data-mode="local" onclick="setCatalogMode('local')">Local</button>
|
|
</div>
|
|
<a href="/usados" class="header-back" id="usedPartsLink" title="Partes usadas y reconstruidas">Usados</a>
|
|
<a href="/" class="header-back">← Inicio</a>
|
|
<button class="theme-toggle" onclick="toggleTheme()" id="themeToggle">
|
|
<span id="themeIcon">☾</span>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</header>
|
|
|
|
<!-- Country / Region selector -->
|
|
<div class="region-bar">
|
|
<div class="region-inner">
|
|
<span class="region-label">Region:</span>
|
|
<button class="region-btn is-active" data-region="north-america" onclick="setRegion('north-america')">MX / USA / CA</button>
|
|
<button class="region-btn" data-region="europe" onclick="setRegion('europe')">Europa</button>
|
|
<button class="region-btn" data-region="asia" onclick="setRegion('asia')">Asia</button>
|
|
<button class="region-btn" data-region="all" onclick="setRegion('all')">Todos</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="search-bar">
|
|
<div class="search-wrapper">
|
|
<input type="text" id="searchInput" placeholder="Buscar por numero de parte o nombre..." autocomplete="off">
|
|
<button onclick="doSearch()">Buscar</button>
|
|
</div>
|
|
</div>
|
|
|
|
<nav class="breadcrumb" id="breadcrumb"></nav>
|
|
|
|
<main class="main" id="content">
|
|
<div class="loading">Cargando catalogo...</div>
|
|
</main>
|
|
|
|
<!-- Part detail modal -->
|
|
<div class="modal-overlay" id="detailModal">
|
|
<div class="modal-content" id="detailContent">
|
|
<button class="modal-close" onclick="closeDetail()">×</button>
|
|
<div id="detailBody"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<footer class="site-footer">
|
|
<div>© 2026 Nexus Autoparts</div>
|
|
</footer>
|
|
|
|
<script>
|
|
// Theme toggle (inline for catalog page)
|
|
function toggleTheme() {
|
|
var html = document.documentElement;
|
|
var current = html.getAttribute('data-theme');
|
|
var next = current === 'industrial' ? 'modern' : 'industrial';
|
|
html.setAttribute('data-theme', next);
|
|
localStorage.setItem('nexus-theme', next);
|
|
var icon = document.getElementById('themeIcon');
|
|
if (icon) icon.innerHTML = next === 'industrial' ? '☾' : '☀';
|
|
}
|
|
// Init icon
|
|
(function(){
|
|
var theme = document.documentElement.getAttribute('data-theme');
|
|
var icon = document.getElementById('themeIcon');
|
|
if (icon) icon.innerHTML = theme === 'industrial' ? '☾' : '☀';
|
|
})();
|
|
</script>
|
|
|
|
<script src="/catalog-public.js?v=2"></script>
|
|
|
|
<!-- AI Chat Widget -->
|
|
<link rel="stylesheet" href="/chat-public.css">
|
|
<script src="/chat-public.js"></script>
|
|
|
|
</body>
|
|
</html>
|