diff --git a/public/css/style.css b/public/css/style.css index 12765e9..32372d5 100644 --- a/public/css/style.css +++ b/public/css/style.css @@ -1,58 +1,533 @@ +/* ============================================================================== + Help Desk & FSM — Sistema de Diseño UI/UX Ecosistema Telcotronics + ============================================================================== */ + +:root { + --app-font: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif; + --primary-gradient: linear-gradient(135deg, #0284c7 0%, #2563eb 100%); + --indigo-gradient: linear-gradient(135deg, #4f46e5 0%, #2563eb 100%); + --card-shadow: 0 4px 20px -2px rgba(15, 23, 42, 0.06), 0 2px 6px -1px rgba(15, 23, 42, 0.03); + --card-hover-shadow: 0 12px 28px -4px rgba(15, 23, 42, 0.12), 0 4px 10px -2px rgba(15, 23, 42, 0.05); +} + body { - font-size: .875rem; - background-color: #f8f9fa; + font-family: var(--app-font); + font-size: 0.885rem; + color: #1e293b; + background-color: #f8fafc; + -webkit-font-smoothing: antialiased; } -.sidebar { - position: fixed; - top: 0; - bottom: 0; - left: 0; - z-index: 100; - padding: 56px 0 0; - box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); +/* ============================================================================== + Topbar / Navbar Principal + ============================================================================== */ +.app-topbar { + background: linear-gradient(90deg, #070e20 0%, #0f172a 100%) !important; + height: 64px; + border-bottom: 1px solid rgba(255, 255, 255, 0.08); + z-index: 1030; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); } -.sidebar .nav-link { - font-weight: 500; - color: #333; - padding: .5rem 1rem; +.brand-logo-glow { + filter: drop-shadow(0 0 8px rgba(56, 189, 248, 0.45)); } -.sidebar .nav-link:hover { - background-color: #e9ecef; +.brand-text { + font-weight: 700; + font-size: 1.05rem; + color: #ffffff; + letter-spacing: -0.02em; } -.sidebar .nav-link i { - margin-right: 8px; - width: 20px; +.brand-subtext { + font-size: 0.78rem; + font-weight: 600; + color: #38bdf8; + background: rgba(56, 189, 248, 0.12); + border: 1px solid rgba(56, 189, 248, 0.3); + border-radius: 6px; + padding: 0.1rem 0.35rem; + margin-left: 0.25rem; } -main { - padding-top: 20px; +.company-nav-pill { + background: rgba(255, 255, 255, 0.06); + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 9999px; + padding: 0.25rem 0.75rem; + font-size: 0.78rem; + color: #e2e8f0; } -.card { - box-shadow: 0 1px 3px rgba(0,0,0,.1); +.company-plan-badge { + background: linear-gradient(135deg, #0284c7 0%, #38bdf8 100%); + color: #ffffff; + font-size: 0.68rem; + font-weight: 700; + text-transform: uppercase; + border-radius: 9999px; + padding: 0.2rem 0.5rem; + letter-spacing: 0.04em; } -.table th { - border-top: none; +.user-profile-badge { + background: rgba(255, 255, 255, 0.06); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 9999px; + padding: 0.25rem 0.75rem 0.25rem 0.35rem; } -.badge { - font-size: 85%; +.user-avatar-initials { + width: 32px; + height: 32px; + border-radius: 50%; + background: var(--primary-gradient); + color: #ffffff; + font-weight: 700; + font-size: 0.85rem; + display: flex; + align-items: center; + justify-content: center; } -.navbar-brand i { - margin-right: 8px; +.user-avatar-initials-sm { + width: 28px; + height: 28px; + border-radius: 50%; + background: #e2e8f0; + color: #334155; + font-weight: 700; + font-size: 0.78rem; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; } -@media (max-width: 768px) { - .sidebar { - position: static; - padding-top: 0; +.user-avatar-img { + width: 32px; + height: 32px; + border-radius: 50%; + object-fit: cover; + border: 1px solid rgba(255, 255, 255, 0.2); +} + +.user-nav-name { + font-size: 0.82rem; + font-weight: 600; + color: #f1f5f9; + line-height: 1.15; +} + +.user-nav-role { + font-size: 0.68rem; + text-transform: uppercase; + letter-spacing: 0.04em; + font-weight: 600; +} + +.badge-role-superadmin { color: #f59e0b; } +.badge-role-admin { color: #f87171; } +.badge-role-agent { color: #818cf8; } +.badge-role-client { color: #38bdf8; } + +.btn-logout-glass { + background: rgba(255, 255, 255, 0.08); + border: 1px solid rgba(255, 255, 255, 0.14); + color: #e2e8f0; + border-radius: 8px; + padding: 0.35rem 0.65rem; + font-size: 0.8rem; + transition: all 0.2s ease; +} + +.btn-logout-glass:hover { + background: rgba(239, 68, 68, 0.2); + border-color: rgba(239, 68, 68, 0.4); + color: #fca5a5; +} + +.btn-icon-glass { + background: rgba(255, 255, 255, 0.08); + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: 8px; + padding: 0.3rem 0.5rem; +} + +/* ============================================================================== + Sidebar / Menú Lateral + ============================================================================== */ +.app-sidebar { + background-color: #ffffff; + border-right: 1px solid #e2e8f0; + z-index: 1020; +} + +@media (min-width: 768px) { + .app-sidebar { + position: fixed; + top: 64px; + bottom: 0; + left: 0; + overflow-y: auto; + padding-top: 1rem; } + + .main-content { + margin-top: 15px; + padding-bottom: 3rem; + } +} + +.sidebar-company-card { + background: #f8fafc; + border: 1px solid #e2e8f0; +} + +.company-status-dot { + width: 6px; + height: 6px; + border-radius: 50%; + background-color: #10b981; +} + +.sidebar-heading { + font-size: 0.68rem; + font-weight: 700; + color: #94a3b8; + letter-spacing: 0.06em; + padding: 0.4rem 0.75rem 0.2rem; + list-style: none; +} + +.sidebar-nav .nav-link { + display: flex; + align-items: center; + gap: 10px; + font-size: 0.85rem; + font-weight: 500; + color: #475569; + padding: 0.55rem 0.75rem; + border-radius: 10px; + transition: all 0.2s ease; +} + +.nav-icon-wrapper { + width: 24px; + display: flex; + align-items: center; + justify-content: center; + font-size: 0.95rem; + color: #64748b; + transition: transform 0.2s ease; +} + +.sidebar-nav .nav-link:hover { + background-color: #f0f7ff; + color: #0284c7; +} + +.sidebar-nav .nav-link:hover .nav-icon-wrapper { + transform: scale(1.1); + color: #0284c7; +} + +.sidebar-nav .nav-link.active { + background: var(--primary-gradient); + color: #ffffff !important; + font-weight: 600; + box-shadow: 0 4px 12px rgba(37, 99, 235, 0.22); +} + +.sidebar-nav .nav-link.active .nav-icon-wrapper { + color: #ffffff !important; +} + +.sidebar-bot-card { + background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%); + border-color: #bae6fd !important; +} + +.bot-sidebar-avatar { + animation: floatBot 4s ease-in-out infinite; +} + +/* ============================================================================== + Tarjetas KPI & Métricas + ============================================================================== */ +.kpi-card { + background: #ffffff; + border-radius: 16px; + border: 1px solid #e2e8f0; + padding: 1.25rem 1.15rem; + box-shadow: var(--card-shadow); + transition: transform 0.25s ease, box-shadow 0.25s ease; +} + +.kpi-card:hover { + transform: translateY(-3px); + box-shadow: var(--card-hover-shadow); +} + +.kpi-icon-box { + width: 42px; + height: 42px; + border-radius: 12px; + display: flex; + align-items: center; + justify-content: center; + font-size: 1.1rem; +} + +.kpi-value { + font-size: 1.85rem; + font-weight: 800; + color: #0f172a; + line-height: 1.1; + margin-bottom: 0.25rem; + letter-spacing: -0.03em; +} + +.kpi-label { + font-size: 0.72rem; + font-weight: 700; + color: #64748b; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +.kpi-subtext { + font-size: 0.74rem; +} + +/* ============================================================================== + Contenedor de Tablas y Tarjetas Modernas (app-card) + ============================================================================== */ +.app-card { + background: #ffffff; + border-radius: 16px; + border: 1px solid #e2e8f0; + box-shadow: var(--card-shadow); + overflow: hidden; +} + +.app-card-header { + background: #ffffff; + border-bottom: 1px solid #e2e8f0; +} + +.app-table thead th { + background-color: #f8fafc !important; + color: #64748b !important; + font-size: 0.72rem !important; + text-transform: uppercase !important; + letter-spacing: 0.06em !important; + font-weight: 700 !important; + border-top: none !important; + border-bottom: 1px solid #e2e8f0 !important; + padding: 0.85rem 1rem !important; +} + +.app-table tbody td { + vertical-align: middle !important; + padding: 0.85rem 1rem !important; + border-bottom: 1px solid #f1f5f9 !important; + font-size: 0.86rem; +} + +.app-table tbody tr { + transition: background-color 0.15s ease; +} + +.app-table tbody tr:hover { + background-color: #f8fafc; +} + +.btn-action-view { + border: 1px solid #e2e8f0; + background: #ffffff; + color: #0284c7; + font-weight: 600; + font-size: 0.78rem; + border-radius: 8px; + padding: 0.35rem 0.65rem; + transition: all 0.2s ease; +} + +.btn-action-view:hover { + background: #e0f2fe; + border-color: #38bdf8; + color: #0369a1; +} + +.btn-filter { + border: 1px solid #e2e8f0; + background: #f8fafc; + color: #64748b; + font-size: 0.76rem; + font-weight: 600; + border-radius: 8px; + padding: 0.35rem 0.65rem; + transition: all 0.2s ease; + display: inline-flex; + align-items: center; + gap: 5px; +} + +.btn-filter:hover { + background: #e2e8f0; + color: #0f172a; +} + +.btn-filter.active { + background: #0284c7; + color: #ffffff; + border-color: #0284c7; +} + +.status-dot-sm { + width: 6px; + height: 6px; + border-radius: 50%; + display: inline-block; +} + +.search-input-group .form-control { + border-color: #cbd5e1; + font-size: 0.8rem; + border-top-right-radius: 8px; + border-bottom-right-radius: 8px; +} + +.search-input-group .input-group-text { + border-color: #cbd5e1; + border-top-left-radius: 8px; + border-bottom-left-radius: 8px; +} + +/* ============================================================================== + Píldoras de Estado y Prioridad + ============================================================================== */ +.status-pill { + display: inline-flex; + align-items: center; + gap: 6px; + border-radius: 9999px; + padding: 0.22rem 0.65rem; + font-size: 0.74rem; + font-weight: 600; + text-transform: capitalize; +} + +.status-dot { + width: 7px; + height: 7px; + border-radius: 50%; +} + +.status-abierto { + background-color: #ecfdf5; + color: #059669; + border: 1px solid #a7f3d0; +} +.status-abierto .status-dot { + background-color: #10b981; + box-shadow: 0 0 6px #10b981; +} + +.status-en-progreso { + background-color: #eff6ff; + color: #2563eb; + border: 1px solid #bfdbfe; +} +.status-en-progreso .status-dot { + background-color: #3b82f6; + box-shadow: 0 0 6px #3b82f6; +} + +.status-cerrado { + background-color: #f1f5f9; + color: #64748b; + border: 1px solid #cbd5e1; +} +.status-cerrado .status-dot { + background-color: #94a3b8; +} + +.priority-pill { + display: inline-flex; + align-items: center; + border-radius: 9999px; + padding: 0.2rem 0.6rem; + font-size: 0.72rem; + font-weight: 600; + text-transform: capitalize; +} + +.priority-critica { + background-color: #fef2f2; + color: #dc2626; + border: 1px solid #fecaca; +} + +.priority-alta { + background-color: #fffbeb; + color: #d97706; + border: 1px solid #fde68a; +} + +.priority-media { + background-color: #f0f9ff; + color: #0284c7; + border: 1px solid #bae6fd; +} + +.priority-baja { + background-color: #f8fafc; + color: #64748b; + border: 1px solid #e2e8f0; +} + +/* ============================================================================== + Hilo de Conversación y Respuestas + ============================================================================== */ +.ticket-message-card { + border-radius: 14px; + border: 1px solid #e2e8f0; + background: #ffffff; + overflow: hidden; + box-shadow: 0 2px 8px rgba(15, 23, 42, 0.04); +} + +.ticket-message-card.message-staff { + border-left: 4px solid #4f46e5; + background: #fbfbfe; +} + +.ticket-message-card.message-client { + border-left: 4px solid #0284c7; + background: #ffffff; +} + +.message-card-header { + background: rgba(248, 250, 252, 0.7); +} + +.btn-cta { + background: var(--primary-gradient); + border: none; + font-weight: 600; + border-radius: 10px; + padding: 0.6rem 1.15rem; + transition: all 0.25s ease; +} + +.btn-cta:hover { + background: linear-gradient(135deg, #0369a1 0%, #1d4ed8 100%); + box-shadow: 0 8px 18px -4px rgba(37, 99, 235, 0.4); + transform: translateY(-1px); + color: #ffffff; } /* ============================================================================== @@ -229,29 +704,6 @@ main { color: #ffffff; } -.demo-account-chip { - cursor: pointer; - border: 1px solid #e2e8f0; - background: #f8fafc; - border-radius: 8px; - padding: 0.4rem 0.75rem; - font-size: 0.78rem; - font-weight: 500; - color: #475569; - transition: all 0.2s ease; - user-select: none; -} - -.demo-account-chip:hover { - background: #e0f2fe; - border-color: #bae6fd; - color: #0369a1; - transform: translateY(-1px); -} - -/* ============================================================================== - Segmented Tabs & Social Buttons for Multi-Channel Login - ============================================================================== */ .login-segmented-tabs { display: flex; background: #f1f5f9; @@ -379,7 +831,7 @@ main { } /* ============================================================================== - Mobile & Responsive Optimization for Login Page + Mobile & Responsive Optimization for Login & App ============================================================================== */ @media (max-width: 991.98px) { @@ -515,11 +967,6 @@ main { font-size: 0.84rem; } - .demo-account-chip { - padding: 0.35rem 0.55rem; - font-size: 0.72rem; - } - .login-divider { margin: 1.15rem 0 0.85rem; font-size: 0.7rem; @@ -542,6 +989,3 @@ main { height: 48px; } } - - - diff --git a/views/admin/create-user.ejs b/views/admin/create-user.ejs index 6eb18c0..915d836 100644 --- a/views/admin/create-user.ejs +++ b/views/admin/create-user.ejs @@ -1,52 +1,129 @@ <%- include('../partials/header') %> -<% title = 'Crear Usuario'; %> +<% title = 'Crear Nuevo Usuario'; %> + <% if (success_msg && success_msg.length > 0) { %> <% success_msg.forEach(msg => { %> -
Registra un nuevo miembro del equipo técnico o asigna acceso a clientes.
+Visión global de rendimiento, gestión de agentes, tickets y catálogo de departamentos.
| # | Asunto | Usuario | Estado |
|---|---|---|---|
| #<%= t.id %> | -<%= t.asunto %> | -<%= t.usuario_nombre || '' %> | -<%= t.status %> | -
| ID | +Asunto | +Estado | +Fecha | +Acción | +
|---|---|---|---|---|
| No hay tickets registrados | ||||
| #<%= t.id %> | +
+ <%= t.asunto %>
+ <%= t.usuario_nombre %>
+ |
+ + <% if (t.status === 'abierto') { %> + Abierto + <% } else if (t.status === 'en_progreso') { %> + En Progreso + <% } else { %> + Cerrado + <% } %> + | ++ <%= new Date(t.created_at).toLocaleDateString('es-ES') %> + | ++ + + + | +
No hay departamentos creados aún.
+ <% } %> + <% departments.forEach(dept => { %> +Define las especialidades para enrutar automáticamente los tickets a los técnicos adecuados.
+Crea departamentos para que tus clientes puedan clasificar sus tickets.
+ +<%= d.descripcion || 'Sin descripción' %>
++ <%= d.descripcion || 'Sin descripción específica configurada.' %> +
+