Guía técnica y sistema de diseño unificado para el Tren Interurbano México-Toluca "El Insurgente". Consolida los colores, alertas, tipografías, logotipos y bibliotecas requeridas para futuros desarrollos en PHP, Python, React, Angular y Node.js, con soporte nativo para Antigravity AI y Temas Día / Noche.
Logotipos vectoriales y rasterizados extraídos del proyecto institucional Reunion_2026.
Utilízalos siempre en su formato original y respetando las proporciones.
Haz clic sobre cualquier muestra para copiar su código HEX y token CSS al portapapeles.
Las fuentes tipográficas oficiales combinan modernidad, legibilidad y el carácter institucional del Estado de México y la CDMX.
<!-- Fuentes Google Fonts en el <head> --> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Audiowide&family=Montserrat:wght@400;600;700;800&display=swap" rel="stylesheet"> <!-- Hoja de estilos TIMT que declara @font-face para fuentes locales --> <link rel="stylesheet" href="assets/css/timt-identity.css">
Estandarización obligatoria de alertas modales con SweetAlert2 v11 y el envoltorio institucional timt-alerts.js.
Inspirado en la documentación oficial de SweetAlert2 Examples,
cada caso a continuación incluye su botón interactivo ¡Pruébame! y la fracción exacta de código lista para copiar y pegar.
Alerta informativa directa sin íconos decorativos para anuncios generales.
Swal.fire({
title: "El Insurgente",
text: "Bienvenido al Sistema de Pasajeros del Tren Interurbano México-Toluca.",
confirmButtonColor: "#103e4d"
});
Modal descriptivo con ícono oficial y texto aclaratorio para el usuario.
Swal.fire({
icon: "info",
title: "¿Deseas consultar tu saldo TUMI?",
text: "Acerca tu tarjeta de movilidad integrada al lector de torniquetes.",
confirmButtonColor: "#103e4d"
});
Confirmación positiva estándar con botón Petróleo (#103e4d).
TimtAlert.success( "¡Operación Exitosa!", "Tu tarjeta de movilidad ha sido vinculada correctamente al sistema." );
Aviso de advertencia o cupos con botón Vino/Guinda institucional (#80242b).
TimtAlert.warning( "¡Cupo Limitado!", "Quedan únicamente <b>5 lugares</b> disponibles para esta corrida." );
Modal de error crítico con enlace de soporte técnico en el footer.
Swal.fire({
icon: "error",
title: "Error de Validación",
text: "No se pudo sincronizar con el validador central.",
footer: '<a href="#">¿Necesitas asistencia técnica de torniquetes?</a>',
confirmButtonColor: "#d93025"
});
Pregunta con dos botones ("Sí, confirmar" en Petróleo y "Cancelar" en Vino).
TimtAlert.confirm(
"¿Desea cancelar el boleto?",
"Esta acción liberará el asiento seleccionado para otro usuario.",
() => TimtAlert.toast("success", "✓ Boleto cancelado y cupo liberado"),
() => TimtAlert.toast("info", "Operación no realizada")
);
Acciones múltiples: Guardar cambios, No guardar o Cancelar la operación.
Swal.fire({
title: "¿Deseas guardar los cambios del itinerario?",
showDenyButton: true,
showCancelButton: true,
confirmButtonText: "Guardar",
denyButtonText: "No guardar",
cancelButtonText: "Cancelar",
confirmButtonColor: "#103e4d",
denyButtonColor: "#8b2b2b"
}).then((result) => {
if (result.isConfirmed) Swal.fire("¡Guardado!", "", "success");
else if (result.isDenied) Swal.fire("Cambios descartados", "", "info");
});
Modal con etiquetas HTML personalizadas, negritas y badges de estación.
Swal.fire({
title: "<strong>Estación <u>Metepec</u></strong>",
icon: "info",
html: `
El siguiente convoy arriba en <b>4 minutos</b>.<br>
<span class="timt-status-badge timt-status-resuelto">Vía 1: Despejada</span>
`,
confirmButtonText: "Ver Horarios",
confirmButtonColor: "#103e4d"
});
Spinner animado no cerrable mientras se completa una petición HTTP.
TimtAlert.loading("Sincronizando...", "Consultando telemetría de trenes en vía...");
setTimeout(() => {
TimtAlert.close();
TimtAlert.success("¡Sincronizado!", "7 trenes operando puntualmente.");
}, 2000);
Toast no intrusivo en esquina superior derecha con auto-cierre y barra de progreso.
TimtAlert.toast("success", "✓ Datos sincronizados con el servidor central");
Genera ficha de folio con tipografía display y botón para copiar en un clic.
TimtAlert.ticketCreated("FE-132", "ciudadano@ejemplo.com");
Consulta de reporte de queja o sugerencia con desglose de coordinación técnica.
TimtAlert.ticketStatus({
folio: "QS-2026-089",
estatus: "En Proceso",
estacion: "Estación Metepec",
fecha: "2026-10-27 10:15 hrs",
coordinacion: "Gerencia de Operaciones y Seguimiento Ferroviario"
});
Para avisos permanentes o alertas contextuales dentro del cuerpo de la página sin bloquear la pantalla:
<!-- Banner de Éxito -->
<div class="timt-alert timt-alert-success">
<div class="timt-alert-content">
<div class="timt-alert-title">Operación Exitosa</div>
<div>Tus cambios han sido registrados.</div>
</div>
<button class="timt-alert-close" onclick="this.parentElement.remove()">×</button>
</div>
<!-- Banner de Advertencia -->
<div class="timt-alert timt-alert-warning">
<div class="timt-alert-content">
<div class="timt-alert-title">Advertencia</div>
<div>Verifique los campos requeridos.</div>
</div>
</div>
Botones, tarjetas, badges pulsantes y controles de formulario diseñados con la identidad de El Insurgente.
<!-- Botones Oficiales --> <button class="timt-btn timt-btn-primary">Botón Primario</button> <button class="timt-btn timt-btn-secondary">Botón Secundario (Vino)</button> <button class="timt-btn timt-btn-outline">Botón Contorno</button> <button class="timt-btn timt-btn-danger">Botón Peligro</button> <!-- Badges Institucionales --> <span class="timt-badge timt-badge-petroleo">Oficial</span> <span class="timt-badge-cupo">¡Últimos 3 lugares!</span> <span class="timt-badge timt-badge-date">28 OCT 2026</span> <!-- Control de Formulario Estilizado --> <div class="timt-form-group"> <label class="timt-label" for="txtNombre">Nombre Completo</label> <input type="text" id="txtNombre" class="timt-input" placeholder="Ingresa tu nombre..."> </div>
Selecciona tu lenguaje o framework para ver qué librerías instalar, cómo mandarlas a traer y el código listo para copiar y pegar.
Librerías Requeridas: SweetAlert2 (CDN o NPM) y Google Fonts.
<?php
// 1. Incluir el CSS en el <head>
// <link rel="stylesheet" href="assets/css/timt-identity.css">
// <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
// <script src="assets/js/timt-alerts.js"></script>
// 2. Disparar alerta desde PHP tras procesar un formulario:
if ($registro_exitoso) {
echo "<script>
document.addEventListener('DOMContentLoaded', function() {
TimtAlert.success('¡Registro Exitoso!', 'Tus datos fueron guardados.');
});
</script>";
}
?>
templates/php/index.php
Librerías Requeridas: pip install flask (o django), SweetAlert2 v11 en plantilla base Jinja2.
# app.py (Flask)
from flask import Flask, render_template, flash, redirect
app = Flask(__name__)
app.secret_key = 'timt_secreto'
@app.route('/guardar', methods=['POST'])
def guardar():
# Enviar mensaje flash con la identidad TIMT
flash({'type': 'success', 'title': '¡Guardado!', 'msg': 'Operación en Python finalizada.'})
return redirect('/')
# En base.html (Jinja2):
# {% with messages = get_flashed_messages() %}
# {% for m in messages %}
# <script>TimtAlert.{{ m.type }}("{{ m.title }}", "{{ m.msg }}");</script>
# {% endfor %}
# {% endwith %}
templates/python/app.py y templates/python/templates/base.html
Librería Requerida: npm install sweetalert2
import Swal from 'sweetalert2';
import 'assets/css/timt-identity.css';
export const showTimtSuccess = (title, message) => {
Swal.fire({
icon: 'success',
title: title || '¡Operación Exitosa!',
html: message,
confirmButtonColor: '#103e4d',
confirmButtonText: 'Aceptar'
});
};
export const showTimtWarning = (title, message) => {
Swal.fire({
icon: 'warning',
title: title || '¡Atención!',
html: message,
confirmButtonColor: '#80242b',
confirmButtonText: 'Entendido'
});
};
templates/react/TimtAlert.js y templates/react/TimtComponents.jsx
Librería Requerida: npm install sweetalert2
import { Injectable } from '@angular/core';
import Swal from 'sweetalert2';
@Injectable({ providedIn: 'root' })
export class TimtAlertService {
success(title: string, msg: string) {
return Swal.fire({
icon: 'success',
title,
html: msg,
confirmButtonColor: '#103e4d'
});
}
warning(title: string, msg: string) {
return Swal.fire({
icon: 'warning',
title,
html: msg,
confirmButtonColor: '#80242b'
});
}
}
templates/angular/timt-alert.service.ts
Librerías Requeridas: npm install express ejs y SweetAlert2 en el front-end.
const express = require('express');
const app = express();
// Servir la carpeta de assets de identidad
app.use('/assets', express.static('assets'));
app.set('view engine', 'ejs');
app.get('/', (req, res) => {
res.render('index', { pageTitle: 'Panel TIMT' });
});
app.listen(3000, () => console.log('Servidor en http://localhost:3000'));
templates/nodejs/server.js y templates/nodejs/views/index.ejs
Diseñado para que todo tu equipo pueda utilizar Antigravity AI en cualquier lenguaje y la IA genere automáticamente interfaces que cumplan con la identidad sin tener que explicarle los colores ni las alertas cada vez.
Organización de carpetas lista para ser clonada o transferida a nuevos repositorios de trabajo:
c:/xampp/htdocs/manual_identidad/
├── AGENTS.md # Reglas para Antigravity AI en todos los lenguajes
├── GEMINI.md # Compatibilidad nativa con modelos de IA
├── README.md # Documentación rápida y guía de inicio
├── index.html # Visor interactivo del Manual de Identidad
├── .agents/
│ └── rules/
│ └── timt-design-system.md # Regla global de Antigravity (alwaysApply)
├── config/
│ └── identity-tokens.json # Tokens de diseño en JSON (para scripts y builds)
├── assets/
│ ├── css/
│ │ ├── timt-identity.css # CSS Maestro con variables, alertas y utilidades
│ │ └── showcase.css # Estilos del visualizador web
│ ├── js/
│ │ ├── timt-alerts.js # Módulo de alertas unificado SweetAlert2 + Toasts
│ │ └── showcase.js # Interactividad del manual
│ ├── img/
│ │ ├── favicon.ico
│ │ ├── fondo_tren.png # Banner hero oficial del tren
│ │ └── logos/
│ │ ├── logo_elinsurgente.svg # Logo oficial horizontal
│ │ ├── logo_circular.svg # Emblema circular
│ │ ├── logo_banobras.svg # Co-patrocinador
│ │ ├── logo_fonadin.svg # Co-patrocinador
│ │ └── Logo transparente.png # PNG alta resolución
│ └── fonts/
│ ├── MOVILIDAD_INTEGRADA_CDMX.otf
│ └── METRO-DF.TTF
└── templates/ # Plantillas de inicio rápido por lenguaje
├── php/ # header.php, footer.php, timt_helper.php, index.php
├── python/ # app.py, templates/base.html, templates/index.html
├── react/ # TimtAlert.js, TimtComponents.jsx, AppExample.jsx
├── angular/ # timt-alert.service.ts, header.component.ts/.html
└── nodejs/ # server.js, views/index.ejs
Estandarización técnica derivada del sistema operativo QuejasySugerencias.
Incluye el flujo completo de captura ciudadana, generación y consulta de números de folio,
análisis de sentimiento con Inteligencia Artificial y plantillas de actas oficiales imprimibles.
El ciudadano o el personal de atención ingresa el folio emitido por el sistema para conocer el dictamen, la fecha y la coordinación responsable:
El sistema clasifica automáticamente el impacto emocional del usuario y asigna la coordinación interna adecuada.
Utiliza los activos visuales estandarizados en assets/img/sentiment/:
ia_sentimiento (POS/NEU/NEG), ia_respuesta_sugerida (Borrador de disculpa o agradecimiento generado por IA) y
ia_coordinacion_sugerida (Asignación automática a Operaciones, Mantenimiento, TIC o Atención al Usuario).
Estandarizado a partir de reporte_folio.php.
Al presionar Ctrl + P o imprimir, se activa automáticamente la hoja membretada institucional en tamaño carta,
eliminando navegación web y añadiendo los bloques de firmas de los responsables:
Asunto: Resolución y atención formal a reporte de usuario en Tren Interurbano México-Toluca.
Estación: Metepec | Fecha del Suceso: 2026-10-27 10:15 hrs
<!-- Disparar Alerta con Folio Generado -->
<script>
// Al guardar el formulario de queja o sugerencia:
const nuevoFolio = "QS-2026-089";
TimtAlert.ticketCreated(nuevoFolio, "usuario@correo.com");
// Para consultar un folio existente:
TimtAlert.ticketStatus({
folio: "FE-132",
estatus: "En Proceso",
estacion: "Estación Metepec",
fecha: "2026-10-27 10:15 hrs",
coordinacion: "Gerencia de Operaciones"
});
</script>
Estandarización visual para la emisión de Pases de Abordaje / Boletos Térmicos y la interfaz de Escaneo QR y Trazabilidad de Activos con visor de cámara, esquinas de enfoque y haz láser animado.
Incluye muescas de corte perimetral, franja petróleo institucional, código QR y código de barras térmico:
<div class="timt-transport-ticket">
<div class="timt-ticket-header">
<img src="assets/img/logos/logo_elinsurgente.svg" alt="El Insurgente">
</div>
<div class="timt-ticket-route">
<div class="timt-ticket-station">
<div class="timt-ticket-station-code">ZIN</div>
<div class="timt-ticket-station-name">Zinacantepec</div>
</div>
<div class="timt-ticket-arrow">➔</div>
<div class="timt-ticket-station destination">
<div class="timt-ticket-station-code">OBS</div>
<div class="timt-ticket-station-name">Observatorio</div>
</div>
</div>
<div class="timt-ticket-body">
<div class="timt-ticket-row">
<span class="timt-ticket-label">Tarifa:</span>
<span class="timt-ticket-value">$100.00 MXN</span>
</div>
<div class="timt-ticket-qr-box">
<img src="assets/img/logos/logo_circular.svg" alt="QR">
<div class="timt-ticket-barcode"></div>
</div>
</div>
</div>
Visor de cámara con esquinas HUD, línea de escaneo láser en rojo institucional y detección con audio beep:
<!-- Librería oficial recomendada: html5-qrcode -->
<script src="https://unpkg.com/html5-qrcode"></script>
<div class="timt-scanner-box" id="reader">
<div class="timt-scanner-frame">
<div class="timt-scanner-laser"></div>
</div>
</div>
<script>
const html5QrCode = new Html5Qrcode("reader");
html5QrCode.start(
{ facingMode: "environment" },
{ fps: 10, qrbox: { width: 220, height: 220 } },
(decodedText) => {
TimtAlert.success("¡Código Escaneado!", decodedText);
}
);
</script>
Tarjetas de estado en tiempo real para servidores, torniquetes y validadores del TIMT. Incluye indicadores de latido (ping pulse) en verde, ámbar y rojo con medición de latencia.
<div class="timt-node-card">
<div class="timt-node-info">
<h4>Servidor Central TIMT</h4>
<div class="timt-node-ip">192.168.10.1</div>
</div>
<div style="text-align: right;">
<div class="timt-node-status" style="color: #1b7a43;">
<!-- timt-ping-online (verde) | timt-ping-warn (ámbar) | timt-ping-offline (rojo) -->
<span class="timt-ping-dot timt-ping-online"></span> En Línea
</div>
<span class="timt-latency-pill">14 ms</span>
</div>
</div>
Estandarización de temporizadores para aperturas de servicio, convocatorias, salidas de trenes o eventos institucionales.
<div class="timt-countdown">
<div class="timt-countdown-unit">
<div class="timt-countdown-num" id="cd-hours">00</div>
<div class="timt-countdown-label">Horas</div>
</div>
<div class="timt-countdown-unit">
<div class="timt-countdown-num" id="cd-minutes">00</div>
<div class="timt-countdown-label">Minutos</div>
</div>
<div class="timt-countdown-unit">
<div class="timt-countdown-num" id="cd-seconds">00</div>
<div class="timt-countdown-label">Segundos</div>
</div>
</div>
Estandarización de credenciales de identificación institucional para personal técnico, maquinistas, inspectores y directivos del TIMT. Diseñado bajo la norma de tarjetas plásticas PVC CR-80 con ranura para cordón, cabecera de alto contraste para logotipos sin fondo, área fotográfica nítida y módulo de seguridad QR.
Lineamientos oficiales de diseño y reglas de ensamble para credenciales de identificación:
#ffffff) para que la tipografía negra (#2d2a26) y el isotipo guinda resalten sin perderse en fondos oscuros.<div class="timt-id-badge">
<!-- Ranura porta-lanyard -->
<div class="timt-badge-top-slot">
<div class="timt-badge-lanyard-hole"></div>
</div>
<div class="timt-badge-strip">Tren Interurbano México-Toluca</div>
<!-- Cabecera de logotipo en fondo blanco puro -->
<div class="timt-badge-header">
<img src="assets/img/logos/logo_elinsurgente.svg" alt="El Insurgente">
</div>
<!-- Fotografía oficial en marco formal -->
<div style="padding: 14px 18px 6px; text-align: center;">
<div style="width: 100px; height: 118px; border-radius: 12px; border: 2.5px solid #103e4d; overflow: hidden; margin: 0 auto 8px;">
<img src="assets/img/avatar_empleado.svg" alt="Foto" style="width: 100%; height: 100%; object-fit: cover;">
</div>
<div class="timt-badge-status-chip">● VIGENTE | OPERACIONES CCO</div>
</div>
<!-- Datos y adscripción en cuadrícula 2x2 -->
<div class="timt-badge-info">
<div class="timt-badge-name">Ing. Carlos Mier</div>
<div class="timt-badge-role">Coordinador de Operaciones</div>
<div class="timt-badge-meta-grid">
<div class="timt-badge-meta-item">
<span class="timt-badge-meta-label">Empleado</span>
<span class="timt-badge-meta-val">#0482</span>
</div>
<div class="timt-badge-meta-item">
<span class="timt-badge-meta-label">Base</span>
<span class="timt-badge-meta-val">Zinacantepec</span>
</div>
<div class="timt-badge-meta-item">
<span class="timt-badge-meta-label">Nivel</span>
<span class="timt-badge-meta-val">CCO - A1</span>
</div>
<div class="timt-badge-meta-item">
<span class="timt-badge-meta-label">Vigencia</span>
<span class="timt-badge-meta-val">2026 - 2028</span>
</div>
</div>
</div>
<!-- Validación QR Real y Chip RFID -->
<div class="timt-badge-qr">
<div class="timt-badge-qr-box">
<img src="assets/img/qr_acceso.svg" alt="QR Acceso">
</div>
<div class="timt-badge-qr-info">
<div class="timt-badge-qr-title">Validación CCO Central</div>
<div class="timt-badge-qr-folio">FOLIO: CCO-A1-0482</div>
<div style="font-size: 0.64rem; color: #047857; font-weight: 700;">📶 CHIP RFID ACTIVO</div>
</div>
</div>
<div class="timt-badge-footer-ribbon"></div>
</div>
Soporte de color dinámico para aplicaciones del TIMT. Modo Día (Crema institucional cálido para portales ciudadanos y administrativos) y Modo Noche (Sleek Ferroviario Slate de alto contraste para cabinas de tren, centros de control CCO y visualización nocturna en andenes). Incluye persistencia en localStorage, detección automática de preferencia de sistema operativo (prefers-color-scheme) y sincronización con SweetAlert2.
Haz clic en cualquiera de las siguientes opciones para conmutar el tema del sistema completo en tiempo real:
Fondo Crema (#f2e9d3), tarjetas blancas y tipografía en Petróleo.
Fondo Slate Medianoche (#091519), superficies #10232a y resplandor cyan.
Sincroniza con el modo claro/oscuro del dispositivo del usuario.
<!-- Botón Switcher para colocar en el Navbar o Header -->
<div class="timt-theme-switcher" role="group" aria-label="Cambiar tema de color">
<button type="button" class="timt-theme-btn active" data-set-theme="light" title="Modo Día" onclick="setManualTheme('light')">
<span class="theme-icon">☀️</span>
<span>Día</span>
</button>
<button type="button" class="timt-theme-btn" data-set-theme="dark" title="Modo Noche" onclick="setManualTheme('dark')">
<span class="theme-icon">🌙</span>
<span>Noche</span>
</button>
<button type="button" class="timt-theme-btn" data-set-theme="auto" title="Automático según Sistema" onclick="setManualTheme('auto')">
<span class="theme-icon">💻</span>
<span>Auto</span>
</button>
</div>
/* --- Variables de Modo Día (Por defecto) --- */
:root,
[data-theme="light"] {
--timt-bg-cream: #f2e9d3;
--timt-surface: #ffffff;
--timt-surface-alt: #fbf8f1;
--timt-text-main: #1a1a1a;
--timt-text-muted: #555555;
--timt-border-color: #e2e8f0;
--timt-header-bg: #f2e9d3;
}
/* --- Variables de Modo Noche (Dark Mode Ferroviario) --- */
[data-theme="dark"],
body.timt-dark {
--timt-bg-cream: #091519;
--timt-surface: #10232a;
--timt-surface-alt: #0b1a20;
--timt-text-main: #edf6f9;
--timt-text-muted: #9bb7c2;
--timt-border-color: #1e3a45;
--timt-header-bg: #0c1c22;
}
/* Fallback automático si el usuario no ha forzado un tema */
@media (prefers-color-scheme: dark) {
:root:not([data-theme="light"]) {
--timt-bg-cream: #091519;
--timt-surface: #10232a;
--timt-text-main: #edf6f9;
--timt-text-muted: #9bb7c2;
--timt-border-color: #1e3a45;
}
}
// Inicializar Tema al cargar la página
function initTheme() {
const savedTheme = localStorage.getItem('timt_theme_mode') || 'auto';
applyTheme(savedTheme, false);
if (window.matchMedia) {
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
if ((localStorage.getItem('timt_theme_mode') || 'auto') === 'auto') {
applyTheme('auto', false);
}
});
}
}
function applyTheme(mode, showFeedback = true) {
let resolved = mode;
if (mode === 'auto') {
resolved = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
document.documentElement.setAttribute('data-theme', resolved);
document.body.classList.toggle('timt-dark', resolved === 'dark');
// Actualizar clases de botones
document.querySelectorAll('.timt-theme-switcher .timt-theme-btn').forEach(btn => {
btn.classList.toggle('active', btn.getAttribute('data-set-theme') === mode);
});
}
function setManualTheme(mode) {
localStorage.setItem('timt_theme_mode', mode);
applyTheme(mode, true);
}
document.addEventListener('DOMContentLoaded', initTheme);
import { useState, useEffect } from 'react';
export function useTimtTheme() {
const [theme, setTheme] = useState(() => localStorage.getItem('timt_theme_mode') || 'auto');
useEffect(() => {
let resolved = theme;
if (theme === 'auto') {
resolved = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
document.documentElement.setAttribute('data-theme', resolved);
document.body.classList.toggle('timt-dark', resolved === 'dark');
localStorage.setItem('timt_theme_mode', theme);
}, [theme]);
return { theme, setTheme };
}
Prototipo interactivo en vivo con la arquitectura completa recomendada para sistemas del Tren Interurbano México-Toluca. Integra autenticación con cuentas demo a 1 clic, menú lateral colapsable, header institucional con notificaciones, buscador global (Ctrl + K), dashboard con KPIs y mapa de vía, gestión de folios de quejas y emisión de boletos térmicos con soporte Día/Noche.
Pantalla con la identidad visual oficial, card elevada con franja superior bicolor (petróleo y vino), soporte de Modo Día / Noche, visor de contraseñas y cuentas demo instantáneas.
sessionStorage.
Plantilla maestro para sistemas de gestión: Menú lateral colapsable, barra superior con buscador
Ctrl + K, campana con dropdown de notificaciones y 4 módulos navegables en tiempo real.
[ ? ].1-5 para cambiar módulos, D para tema y T para despacho.Estructura estándar modular para que los equipos de desarrollo integren la identidad visual en sus lenguajes de programación:
| Componente | Clase CSS Principal | Descripción y Funcionalidad | Ubicación en Archivos |
|---|---|---|---|
| 1. Menú Lateral (Sidebar) | .app-sidebar |
Navegación colapsable con estado activo, badges numéricos y perfil del usuario autenticado. | mockups/dashboard.html |
| 2. Header Superior (Navbar) | .app-header |
Logos institucionales, buscador global con atajo Ctrl+K, notificaciones y switcher de tema. |
mockups/dashboard.html |
| 3. Tarjetas KPI (Dashboard) | .kpi-card, .kpi-value |
Contadores métricos con íconos temáticos y tendencias porcentuales en verde, ámbar o rojo. | mockups/dashboard.html |
| 4. Mapa de Línea (Track) | .line-track, .station-node |
Trazo esquemático de las 7 estaciones con badges de posición de trenes en circulación. | mockups/dashboard.html |
| 5. Tabla de Gestión | .timt-data-table |
Tablas con estilos oficiales, folios clicables, sentimiento IA y acciones modales. | mockups/dashboard.html |
| 6. Footer Institucional | .app-footer |
Franja inferior con logotipos del Gobierno de México, Banobras y Fonadin. | mockups/dashboard.html |
| 7. Login Card | .login-card |
Contenedor central con borde superior gradiente, botones de acceso demo y formulario oficial. | mockups/login.html |
<!-- Estructura Oficial del Portal TIMT (Header y Footer de Ancho Completo) -->
<div class="app-layout">
<!-- 1. HEADER SUPERIOR OFICIAL (ANCHO COMPLETO 100%) -->
<header class="app-header">
<button class="sidebar-toggle-btn" onclick="toggleSidebar()">☰</button>
<a href="dashboard.html" class="header-brand">
<img src="assets/img/logos/logo_circular.svg" height="36">
<img src="assets/img/logos/logo_elinsurgente.svg" height="30">
<div class="header-brand-title">PORTAL TIMT</div>
</a>
<!-- Perfil con Dropdown de Temas Día/Noche y Cerrar Sesión -->
<div class="header-user-wrapper">
<div class="header-user-pill" onclick="toggleUserDropdown()">...</div>
<div class="user-dropdown" id="userDropdown">...</div>
</div>
</header>
<!-- 2. CUERPO DE LA APLICACIÓN (SIDEBAR + CONTENIDO) -->
<div class="app-body">
<!-- MENÚ LATERAL (SIDEBAR COLAPSABLE) -->
<aside class="app-sidebar collapsed" id="appSidebar">
<nav class="sidebar-nav">
<a class="sidebar-link active" onclick="switchView('dashboard', this)">📊 Dashboard</a>
<a class="sidebar-link" onclick="switchView('quejas', this)">📑 Quejas y Folios</a>
<a class="sidebar-link" onclick="switchView('boletos', this)">🎫 Pases y Boletaje</a>
<a class="sidebar-link" onclick="switchView('telemetria', this)">📡 Telemetría</a>
</nav>
</aside>
<!-- PANEL DE CONTENIDO DINÁMICO -->
<div class="app-main">
<main class="app-content">
<section id="view-dashboard" class="tab-view-pane active">...</section>
<section id="view-quejas" class="tab-view-pane">...</section>
<section id="view-boletos" class="tab-view-pane">...</section>
</main>
</div>
</div>
<!-- 3. FOOTER INSTITUCIONAL (ANCHO COMPLETO 100%) -->
<footer class="app-footer">
<div class="footer-content">...</div>
</footer>
</div>