Files
Lucy 46360b6827 feat: agregar design system completo con 2 temas (Industrial + Moderno)
- Tokens CSS con variables para ambos temas (dark/light)
- 21 componentes reutilizables (buttons, cards, tables, modals, etc.)
- 10 pantallas POS (login, catálogo, POS, inventario, clientes, facturación, contabilidad, dashboard, configuración, reportes)
- Preview interactivo con selector de tema
- Generado por el equipo de Hugo (Milo-UX, Iris-UI, Zara-Frontend)
2026-04-01 01:41:04 +00:00

574 lines
16 KiB
HTML
Raw Permalink 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" data-theme="industrial">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nexus Autoparts — Navigation</title>
<link rel="stylesheet" href="../tokens/tokens.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: var(--font-body);
background: var(--color-bg-base);
color: var(--color-text-primary);
padding: var(--space-8);
transition: var(--transition-normal);
}
.theme-switcher {
position: sticky;
top: 0;
z-index: var(--z-sticky);
display: flex;
gap: var(--space-2);
padding: var(--space-3) var(--space-4);
background: var(--color-bg-elevated);
border-bottom: 1px solid var(--color-border);
margin: calc(-1 * var(--space-8));
margin-bottom: var(--space-8);
}
.theme-switcher button {
padding: var(--space-2) var(--space-4);
border: 1px solid var(--color-border);
background: var(--color-bg-base);
color: var(--color-text-primary);
border-radius: var(--radius-md);
cursor: pointer;
font-family: var(--font-body);
font-size: var(--text-body-sm);
transition: var(--transition-fast);
}
.theme-switcher button.active {
background: var(--color-primary);
color: var(--color-text-inverse);
border-color: var(--color-primary);
}
h1 {
font-family: var(--font-heading);
font-size: var(--text-h2);
font-weight: var(--heading-weight-primary);
margin-bottom: var(--space-2);
color: var(--color-text-accent);
}
.subtitle {
color: var(--color-text-muted);
font-size: var(--text-body);
margin-bottom: var(--space-8);
}
section {
margin-bottom: var(--space-10);
}
section h2 {
font-family: var(--font-heading);
font-size: var(--text-h4);
font-weight: var(--heading-weight-secondary);
color: var(--color-text-secondary);
margin-bottom: var(--space-4);
padding-bottom: var(--space-2);
border-bottom: 1px solid var(--color-border);
}
.component-row {
display: flex;
flex-wrap: wrap;
gap: var(--space-4);
align-items: center;
margin-bottom: var(--space-6);
}
.label {
font-size: var(--text-caption);
color: var(--color-text-muted);
text-transform: uppercase;
letter-spacing: var(--tracking-widest);
font-weight: var(--font-weight-semibold);
margin-bottom: var(--space-2);
}
/* ====== Sidebar ====== */
.sidebar-demo {
display: flex;
gap: var(--space-6);
margin-bottom: var(--space-6);
}
.sidebar {
width: 260px;
min-height: 500px;
background: var(--color-bg-elevated);
border-right: 1px solid var(--color-border);
border-radius: var(--radius-md);
overflow: hidden;
flex-shrink: 0;
}
.sidebar-header {
padding: var(--space-5) var(--space-4);
border-bottom: 1px solid var(--color-border);
display: flex;
align-items: center;
gap: var(--space-3);
}
.sidebar-logo {
width: 36px;
height: 36px;
background: var(--color-primary);
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
font-weight: var(--font-weight-bold);
color: var(--color-text-inverse);
font-size: var(--text-body-lg);
}
[data-theme="industrial"] .sidebar-logo {
border-radius: 0;
clip-path: polygon(0 0, calc(100% - 6px) 0, 100% 6px, 100% 100%, 0 100%);
}
.sidebar-brand {
font-family: var(--font-heading);
font-weight: var(--heading-weight-primary);
font-size: var(--text-body-lg);
color: var(--color-text-accent);
}
.sidebar-section {
padding: var(--space-3) var(--space-3);
}
.sidebar-section-title {
font-size: var(--text-caption);
color: var(--color-text-muted);
text-transform: uppercase;
letter-spacing: var(--tracking-widest);
font-weight: var(--font-weight-semibold);
padding: var(--space-2) var(--space-3);
margin-bottom: var(--space-1);
}
.sidebar-item {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-3) var(--space-3);
border-radius: var(--radius-md);
color: var(--color-text-secondary);
text-decoration: none;
font-size: var(--text-body-sm);
cursor: pointer;
transition: var(--transition-fast);
}
[data-theme="industrial"] .sidebar-item {
border-radius: 0;
}
.sidebar-item:hover {
background: var(--color-primary-muted);
color: var(--color-text-primary);
}
.sidebar-item.active {
background: var(--color-primary-muted);
color: var(--color-primary);
font-weight: var(--font-weight-semibold);
border-left: 3px solid var(--color-primary);
}
.sidebar-item .icon {
width: 20px;
text-align: center;
font-size: var(--text-body);
}
.sidebar-item .badge-count {
margin-left: auto;
background: var(--color-primary);
color: var(--color-text-inverse);
font-size: var(--text-caption);
padding: 2px 8px;
border-radius: var(--radius-full);
font-weight: var(--font-weight-semibold);
}
.sidebar-footer {
padding: var(--space-4);
border-top: 1px solid var(--color-border);
margin-top: auto;
}
.sidebar-user {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-2);
}
.sidebar-avatar {
width: 32px;
height: 32px;
border-radius: var(--radius-full);
background: var(--color-primary);
display: flex;
align-items: center;
justify-content: center;
color: var(--color-text-inverse);
font-weight: var(--font-weight-bold);
font-size: var(--text-body-sm);
}
.sidebar-user-info {
flex: 1;
}
.sidebar-user-name {
font-size: var(--text-body-sm);
font-weight: var(--font-weight-semibold);
color: var(--color-text-primary);
}
.sidebar-user-role {
font-size: var(--text-caption);
color: var(--color-text-muted);
}
/* ====== Breadcrumbs ====== */
.breadcrumb {
display: flex;
align-items: center;
gap: var(--space-2);
list-style: none;
font-size: var(--text-body-sm);
padding: var(--space-3) var(--space-4);
background: var(--color-bg-elevated);
border-radius: var(--radius-md);
border: 1px solid var(--color-border);
}
[data-theme="industrial"] .breadcrumb {
border-radius: 0;
clip-path: polygon(0 0, calc(100% - 8px) 0, 100% 8px, 100% 100%, 0 100%);
}
.breadcrumb-item a {
color: var(--color-text-muted);
text-decoration: none;
transition: var(--transition-fast);
}
.breadcrumb-item a:hover {
color: var(--color-primary);
}
.breadcrumb-item.active {
color: var(--color-text-primary);
font-weight: var(--font-weight-semibold);
}
.breadcrumb-separator {
color: var(--color-text-disabled);
}
/* ====== Tabs ====== */
.tabs {
display: flex;
gap: 0;
border-bottom: 2px solid var(--color-border);
margin-bottom: var(--space-4);
}
.tab {
padding: var(--space-3) var(--space-5);
font-family: var(--font-body);
font-size: var(--text-body-sm);
font-weight: var(--font-weight-semibold);
color: var(--color-text-muted);
background: transparent;
border: none;
cursor: pointer;
position: relative;
transition: var(--transition-fast);
}
.tab:hover {
color: var(--color-text-primary);
}
.tab.active {
color: var(--color-primary);
}
.tab.active::after {
content: '';
position: absolute;
bottom: -2px;
left: 0;
right: 0;
height: 2px;
background: var(--color-primary);
}
.tab .tab-badge {
margin-left: var(--space-2);
font-size: var(--text-caption);
background: var(--color-primary-muted);
color: var(--color-primary);
padding: 1px 6px;
border-radius: var(--radius-full);
}
/* Tabs — Pill Variant */
.tabs-pills {
display: flex;
gap: var(--space-2);
padding: var(--space-1);
background: var(--color-bg-elevated);
border-radius: var(--radius-lg);
border: 1px solid var(--color-border);
}
[data-theme="industrial"] .tabs-pills {
border-radius: 0;
}
.tab-pill {
padding: var(--space-2) var(--space-4);
font-family: var(--font-body);
font-size: var(--text-body-sm);
font-weight: var(--font-weight-semibold);
color: var(--color-text-muted);
background: transparent;
border: none;
border-radius: var(--radius-md);
cursor: pointer;
transition: var(--transition-fast);
}
[data-theme="industrial"] .tab-pill {
border-radius: 0;
}
.tab-pill:hover {
color: var(--color-text-primary);
}
.tab-pill.active {
background: var(--color-primary);
color: var(--color-text-inverse);
}
/* Tab content */
.tab-content {
padding: var(--space-4);
background: var(--color-bg-elevated);
border: 1px solid var(--color-border);
border-top: none;
border-radius: 0 0 var(--radius-md) var(--radius-md);
color: var(--color-text-secondary);
font-size: var(--text-body-sm);
}
/* ====== Main content area ====== */
.main-content {
flex: 1;
min-width: 0;
}
</style>
</head>
<body>
<div class="theme-switcher">
<button class="active" onclick="setTheme('industrial')">🔧 Industrial</button>
<button onclick="setTheme('modern')">⚡ Moderno</button>
</div>
<h1>Navigation</h1>
<p class="subtitle">Sidebar, Breadcrumbs y Tabs — componentes de navegación del sistema POS</p>
<!-- ====== Sidebar ====== -->
<section>
<h2>Sidebar</h2>
<div class="label">Navegación principal del POS</div>
<div class="sidebar-demo">
<div class="sidebar">
<div class="sidebar-header">
<div class="sidebar-logo">N</div>
<span class="sidebar-brand">NEXUS</span>
</div>
<div class="sidebar-section">
<div class="sidebar-section-title">Principal</div>
<a class="sidebar-item active">
<span class="icon">📊</span>
Dashboard
</a>
<a class="sidebar-item">
<span class="icon">🛒</span>
Punto de Venta
<span class="badge-count">3</span>
</a>
<a class="sidebar-item">
<span class="icon">📦</span>
Inventario
</a>
<a class="sidebar-item">
<span class="icon">🔍</span>
Catálogo
</a>
</div>
<div class="sidebar-section">
<div class="sidebar-section-title">Gestión</div>
<a class="sidebar-item">
<span class="icon">👥</span>
Clientes
</a>
<a class="sidebar-item">
<span class="icon">📋</span>
Órdenes
<span class="badge-count">12</span>
</a>
<a class="sidebar-item">
<span class="icon">💰</span>
Contabilidad
</a>
<a class="sidebar-item">
<span class="icon">📈</span>
Reportes
</a>
</div>
<div class="sidebar-section">
<div class="sidebar-section-title">Sistema</div>
<a class="sidebar-item">
<span class="icon">⚙️</span>
Configuración
</a>
<a class="sidebar-item">
<span class="icon">👤</span>
Usuarios
</a>
</div>
<div class="sidebar-footer">
<div class="sidebar-user">
<div class="sidebar-avatar">JR</div>
<div class="sidebar-user-info">
<div class="sidebar-user-name">Juan Rodríguez</div>
<div class="sidebar-user-role">Administrador</div>
</div>
</div>
</div>
</div>
<div class="main-content">
<div style="padding: var(--space-4); color: var(--color-text-muted); font-style: italic;">
← Sidebar de navegación principal con secciones, badges y perfil de usuario.
</div>
</div>
</div>
</section>
<!-- ====== Breadcrumbs ====== -->
<section>
<h2>Breadcrumbs</h2>
<div class="label">Navegación jerárquica</div>
<div class="component-row" style="flex-direction: column; align-items: flex-start; gap: var(--space-4);">
<nav class="breadcrumb">
<span class="breadcrumb-item"><a href="#">Inicio</a></span>
<span class="breadcrumb-separator"></span>
<span class="breadcrumb-item"><a href="#">Inventario</a></span>
<span class="breadcrumb-separator"></span>
<span class="breadcrumb-item active">Filtros de aceite</span>
</nav>
<nav class="breadcrumb">
<span class="breadcrumb-item"><a href="#">Inicio</a></span>
<span class="breadcrumb-separator"></span>
<span class="breadcrumb-item"><a href="#">Catálogo</a></span>
<span class="breadcrumb-separator"></span>
<span class="breadcrumb-item"><a href="#">Toyota</a></span>
<span class="breadcrumb-separator"></span>
<span class="breadcrumb-item"><a href="#">Corolla 2020</a></span>
<span class="breadcrumb-separator"></span>
<span class="breadcrumb-item active">Frenos</span>
</nav>
<nav class="breadcrumb">
<span class="breadcrumb-item"><a href="#">Inicio</a></span>
<span class="breadcrumb-separator"></span>
<span class="breadcrumb-item active">Dashboard</span>
</nav>
</div>
</section>
<!-- ====== Tabs ====== -->
<section>
<h2>Tabs — Línea</h2>
<div class="label">Navegación por pestañas (inventario, contabilidad, etc.)</div>
<div class="tabs">
<button class="tab active">Todos <span class="tab-badge">1,240</span></button>
<button class="tab">En stock <span class="tab-badge">980</span></button>
<button class="tab">Bajo stock <span class="tab-badge">45</span></button>
<button class="tab">Agotados <span class="tab-badge">15</span></button>
<button class="tab">Pedidos</button>
</div>
<div class="tab-content">
Contenido de la pestaña activa. Aquí se mostraría la tabla de inventario filtrada.
</div>
</section>
<section>
<h2>Tabs — Pills</h2>
<div class="label">Variante con fondo de selección</div>
<div class="tabs-pills">
<button class="tab-pill active">General</button>
<button class="tab-pill">Precios</button>
<button class="tab-pill">Compatibilidad</button>
<button class="tab-pill">Historial</button>
</div>
</section>
<section>
<h2>Tabs — Contexto Contabilidad</h2>
<div class="label">Navegación entre módulos financieros</div>
<div class="tabs">
<button class="tab active">Ventas</button>
<button class="tab">Compras</button>
<button class="tab">Cuentas por Cobrar</button>
<button class="tab">Cuentas por Pagar</button>
<button class="tab">Corte de Caja</button>
<button class="tab">Reportes</button>
</div>
<div class="tab-content">
Módulo de contabilidad con tabs contextuales para cada sección financiera del POS.
</div>
</section>
<script>
function setTheme(theme) {
document.documentElement.setAttribute('data-theme', theme);
document.querySelectorAll('.theme-switcher button').forEach(btn => {
btn.classList.toggle('active', btn.textContent.includes(theme === 'industrial' ? 'Industrial' : 'Moderno'));
});
}
</script>
</body>
</html>