Demo pública del módulo de control de acceso inteligente de CTG Code: un panel que valida una credencial (carné, QR, tag NFC o biometría) contra su estado, su vigencia y sus permisos de zona, y deja constancia de cada lectura en una bitácora.
Esto es la demo, no el servicio. La lógica de producción —el backend, su almacenamiento y su integración con el hardware de puerta— vive en un repositorio privado. Aquí solo está la pieza que se enseña: una simulación que corre entera en el navegador, sin backend ni datos reales.
El panel reproduce las cuatro salidas posibles de una validación, que se evalúan en este orden:
- La cuenta debe estar activa (no suspendida).
- La suscripción no debe estar vencida.
- La zona solicitada debe estar entre las permitidas.
- Si todo pasa, el acceso se concede.
El método de lectura (tarjeta, biometría, QR o manual) no altera la decisión, pero sí queda anotado en la bitácora junto al lector que originó la lectura — igual que en el servicio real, donde eso es lo que da trazabilidad.
El selector de rubro (gimnasio, restaurante, oficina) cambia los nombres del padrón y de las zonas sin tocar las reglas: es la forma corta de enseñar que el modelo es genérico y el mismo módulo sirve para negocios distintos.
- Astro 5 en modo estático, una sola página.
- Tailwind CSS 4 con la paleta de shadcn/ui en variables CSS. El tema claro y el oscuro salen de la preferencia del sistema.
- React 19 solo para la isla del panel (
client:load); el encabezado, el pie y el resto de la página son HTML estático. - Los componentes de
src/components/ui/son de shadcn/ui, copiados al repositorio como manda su modelo: son código propio y editable, no una dependencia.
src/
components/
ui/ primitivas de shadcn/ui
dashboard/ piezas compartidas del panel (tarjetas de métrica)
AccessDashboard.tsx la isla: estado, reglas y render del panel
data/credentials.ts padrón de ejemplo (vigencias en días relativos)
locales/{es,en}.ts todo el texto de la interfaz
layouts/Layout.astro <head>, fuentes y la marca `noindex` del modo demo
pages/index.astro encabezado, pie y montaje de la isla
Las vigencias se guardan como días relativos, nunca como fechas absolutas: así el panel dice lo mismo el día que se compila y seis meses después, y el HTML generado en el build coincide con lo que pinta el navegador al hidratar.
| Variable | Para qué |
|---|---|
BASE_PATH |
Subdirectorio del que cuelga la demo. Sin ella, cuelga de la raíz. |
PUBLIC_LOCALE |
es (por defecto) o en. Se fija en el build, no en ejecución. |
PUBLIC_DEMO |
Con true, la página sale con noindex, follow. |
PUBLIC_DEMO existe porque la demo simula un negocio que no existe: sin
noindex, un buscador podría tomarla por una ficha legítima.
bun install
bun run devPara reproducir el build que se publica:
BASE_PATH="/automatizacion-control-acceso" PUBLIC_LOCALE="es" PUBLIC_DEMO="true" bun run buildLa construye el deploy.yml de ctgcode.com,
dos veces —una por idioma—, igual que las tres plantillas web. Un push a main
dispara ahí un repository_dispatch que rehace el sitio.