- Agrega TTS (speechSynthesis) a chat.js del POS para leer respuestas IA - Copia lógica de voz completa (STT + TTS) a dashboard/chat-public.js - Extiende estilos TTS en chat.css y chat-public.css - Agrega chat widget a 13 templates POS que no lo tenían - Corrige duplicado de chat.css en diagrams.html - Minifica assets actualizados - 73/73 tests pasan
160 lines
9.2 KiB
HTML
160 lines
9.2 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="es" data-theme="industrial">
|
|
<head>
|
|
<script>/*pos_theme_early*/(function(){var t=localStorage.getItem("pos_theme")||"industrial";document.documentElement.setAttribute("data-theme",t);})()</script>
|
|
<meta charset="UTF-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>Diagramas — Nexus Autoparts POS</title>
|
|
<link rel="stylesheet" href="/pos/static/css/chat.css" />
|
|
<link rel="stylesheet" href="/pos/static/css/tokens.css" />
|
|
<link rel="stylesheet" href="/pos/static/css/common.css" />
|
|
<link rel="stylesheet" href="/pos/static/css/sidebar.css" />
|
|
<link rel="stylesheet" href="/pos/static/css/pos-glass.css" />
|
|
<link rel="stylesheet" href="/pos/static/css/onboarding.css" />
|
|
<link rel="manifest" href="/pos/static/pwa/manifest.json" />
|
|
<meta name="theme-color" content="#F5A623" />
|
|
<script src="/pos/static/js/native-bridge.js" defer></script>
|
|
|
|
<link rel="stylesheet" href="/pos/static/css/diagrams.css">
|
|
</head>
|
|
<body>
|
|
<div class="app-shell">
|
|
|
|
<!-- SIDEBAR -->
|
|
<aside class="sidebar themed-scrollbar" id="sidebar" role="navigation" aria-label="Menu principal">
|
|
<div class="sidebar__brand">
|
|
<div class="brand-logo" aria-hidden="true">N</div>
|
|
<div class="brand-name">
|
|
<span class="brand-name__primary">Nexus</span>
|
|
<span class="brand-name__sub">Autoparts POS</span>
|
|
</div>
|
|
</div>
|
|
<nav class="sidebar__nav">
|
|
<div class="nav-section-label">Principal</div>
|
|
<a class="nav-item" href="/pos/dashboard" role="menuitem">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg>
|
|
Dashboard
|
|
</a>
|
|
<a class="nav-item" href="/pos/sale" role="menuitem">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><path d="M6 2L3 6v14a2 2 0 002 2h14a2 2 0 002-2V6l-3-4z"/><path d="M3 6h18"/><path d="M16 10a4 4 0 01-8 0"/></svg>
|
|
Punto de Venta
|
|
</a>
|
|
<a class="nav-item" href="/pos/inventory" role="menuitem">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><path d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/></svg>
|
|
Inventario
|
|
</a>
|
|
<a class="nav-item" href="/pos/catalog" role="menuitem">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M8 7h8M8 12h8M8 17h5"/></svg>
|
|
Catalogo
|
|
</a>
|
|
<a class="nav-item is-active" href="/pos/diagrams" role="menuitem" aria-current="page">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><path d="M14.7 6.3a1 1 0 000 1.4l1.6 1.6a1 1 0 001.4 0l3.77-3.77a6 6 0 01-7.94 7.94l-6.91 6.91a2.12 2.12 0 01-3-3l6.91-6.91a6 6 0 017.94-7.94l-3.76 3.76z"/></svg>
|
|
Diagramas
|
|
</a>
|
|
<div class="nav-section-label" style="margin-top: var(--space-2);">Gestion</div>
|
|
<a class="nav-item" href="/pos/customers" role="menuitem">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 00-3-3.87"/><path d="M16 3.13a4 4 0 010 7.75"/></svg>
|
|
Clientes
|
|
</a>
|
|
<a class="nav-item" href="/pos/invoicing" role="menuitem">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14,2 14,8 20,8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg>
|
|
Facturacion
|
|
</a>
|
|
<a class="nav-item" href="/pos/accounting" role="menuitem">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><line x1="12" y1="1" x2="12" y2="23"/><path d="M17 5H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6"/></svg>
|
|
Contabilidad
|
|
</a>
|
|
<a class="nav-item" href="/pos/reports" role="menuitem">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><polyline points="22,12 18,12 15,21 9,3 6,12 2,12"/></svg>
|
|
Reportes
|
|
</a>
|
|
<div class="nav-section-label" style="margin-top: var(--space-2);">Sistema</div>
|
|
<a class="nav-item" href="/pos/config" role="menuitem">
|
|
<svg class="nav-item__icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75"><circle cx="12" cy="12" r="3"/><path d="M19.07 4.93l-1.41 1.41M6.34 17.66l-1.41 1.41M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M12 2v2M12 20v2M2 12h2M20 12h2"/></svg>
|
|
Configuracion
|
|
</a>
|
|
</nav>
|
|
<div class="sidebar__profile">
|
|
<div class="profile-avatar" id="profileAvatar" aria-hidden="true">--</div>
|
|
<div class="profile-info">
|
|
<div class="profile-info__name" id="profileName">--</div>
|
|
<div class="profile-info__role" id="profileRole">--</div>
|
|
</div>
|
|
</div>
|
|
</aside>
|
|
|
|
<!-- MAIN CONTENT -->
|
|
<main class="main-content">
|
|
|
|
<!-- Page header (list view) -->
|
|
<div class="page-header" id="pageHeader">
|
|
<h1 class="page-header__title">Diagramas Explodidos</h1>
|
|
<input type="text" class="page-header__filter" id="diagramFilter" placeholder="Filtrar diagramas..." />
|
|
</div>
|
|
|
|
<!-- Loading spinner -->
|
|
<div class="loading" id="loading"><div class="spinner"></div></div>
|
|
|
|
<!-- Empty state -->
|
|
<div class="empty-state" id="emptyState">
|
|
<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" style="color:var(--color-text-disabled)">
|
|
<path d="M14.7 6.3a1 1 0 000 1.4l1.6 1.6a1 1 0 001.4 0l3.77-3.77a6 6 0 01-7.94 7.94l-6.91 6.91a2.12 2.12 0 01-3-3l6.91-6.91a6 6 0 017.94-7.94l-3.76 3.76z"/>
|
|
</svg>
|
|
<div class="empty-state__title">Sin diagramas</div>
|
|
<div class="empty-state__subtitle">No hay diagramas disponibles. Los diagramas se asocian a vehiculos y categorias de partes.</div>
|
|
</div>
|
|
|
|
<!-- Diagram list (cards grid) -->
|
|
<div class="page-body" id="diagramList"></div>
|
|
|
|
<!-- Diagram viewer (SVG + parts list) -->
|
|
<div class="diagram-viewer" id="diagramViewer">
|
|
<div class="viewer-main">
|
|
<div class="viewer-toolbar">
|
|
<button class="btn-icon" id="backBtn" title="Volver a la lista">
|
|
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="15 18 9 12 15 6"/></svg>
|
|
</button>
|
|
<span class="viewer-toolbar__title" id="diagramTitle"></span>
|
|
<div class="zoom-controls">
|
|
<button class="btn-icon" id="zoomOutBtn" title="Alejar (-)">
|
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/><line x1="8" y1="11" x2="14" y2="11"/></svg>
|
|
</button>
|
|
<button class="btn-icon" id="zoomResetBtn" title="Restablecer zoom (0)">
|
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M1 4v6h6"/><path d="M3.51 15a9 9 0 102.13-9.36L1 10"/></svg>
|
|
</button>
|
|
<button class="btn-icon" id="zoomInBtn" title="Acercar (+)">
|
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/><line x1="11" y1="8" x2="11" y2="14"/><line x1="8" y1="11" x2="14" y2="11"/></svg>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- SVG display area -->
|
|
<div class="svg-container" id="svgContainer">
|
|
<div class="svg-wrapper" id="svgWrapper"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Parts list sidebar -->
|
|
<aside class="parts-sidebar" id="partsList"></aside>
|
|
</div>
|
|
|
|
<!-- Hotspot detail panel (slides up from bottom) -->
|
|
<div class="hotspot-panel" id="hotspotPanel">
|
|
<button class="hotspot-panel__close" id="hotspotClose" aria-label="Cerrar">✕</button>
|
|
<div id="hotspotBody"></div>
|
|
</div>
|
|
|
|
</main>
|
|
</div>
|
|
|
|
<script src="/pos/static/js/i18n.js" defer></script>
|
|
<script src="/pos/static/js/kiosk.js" defer></script>
|
|
<script src="/pos/static/js/app-init.js" defer></script>
|
|
<script src="/pos/static/js/pos-utils.js" defer></script>
|
|
<script src="/pos/static/js/sidebar.js" defer></script>
|
|
<script src="/pos/static/js/diagrams.js" defer></script>
|
|
<script>if('serviceWorker' in navigator){navigator.serviceWorker.register('/pos/sw.js',{scope:'/pos/'});}</script>
|
|
<script src="/pos/static/js/chat.js" defer></script>
|
|
</body>
|
|
</html>
|