Demo pública del motor de reservas por capacidad de CTG Code: un panel de cupos con capacidad real, lista de espera ordenada y ascenso automático cuando alguien cancela.
Esto es la demo, no el servicio. La lógica de producción —el backend, su almacenamiento y el control de concurrencia que evita el sobrecupo— 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.
Un cupo lleno no tiene por qué ser una venta perdida. El panel deja probar el ciclo completo:
- Si quedan lugares, la reserva entra confirmada.
- Si el cupo está lleno, entra a la lista de espera con su posición.
- Al cancelar una reserva confirmada, el primero de la lista asciende solo.
- Cancelar a alguien que estaba en la lista no asciende a nadie: el cupo nunca se movió.
Ese cuarto caso es fácil de pasar por alto y es justamente donde un motor mal hecho se equivoca, así que la demo lo deja a la vista en la actividad.
El selector de rubro (gimnasio, restaurante, oficina) cambia los cupos y los nombres sin tocar la lógica: el mismo motor sirve para clases, turnos de mesa o salas de reunión.
- 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)
BookingDashboard.tsx la isla: cupos, lista de espera y actividad
locales/{es,en}.ts texto de la interfaz y cupos de ejemplo por rubro
layouts/Layout.astro <head>, fuentes y la marca `noindex` del modo demo
pages/index.astro encabezado, pie y montaje de la isla
| 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-reservas" 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.