El verde UABC (#00723F) es demasiado oscuro para texto carbón (~2:1,
falla AA). Corrige BrandMark, nav activo (sidebar/dock), chip de
FiltroCategorias y botón de Google en login a texto/ícono blanco
(~6.2:1). Actualiza DESIGN.md/PRODUCT.md y design.json acorde.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Segunda iteración del rediseño (sesión separada con skill impeccable).
Toca prácticamente toda la UI: layout base, tokens (global.css),
todas las páginas de alumno y admin, componentes de solicitudes,
inventario, catálogo, filtros, toaster y modales.
Docs y sistema:
- DESIGN.md y PRODUCT.md actualizados con la nueva iteración.
- .impeccable/design.json refleja tokens vigentes.
- .impeccable/review/ contiene screenshots de la revisión visual.
Dependencias:
- Añade @fontsource-variable/jetbrains-mono (fuente monoespaciada).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Rediseño hecho en sesión aparte con el skill impeccable. Se registran
las especificaciones y ajustes visuales al sistema ya en producción.
Añade:
- BrandMark.astro con el escudo/logo del laboratorio.
- Favicon actualizado (svg + ico).
- Páginas propias 403 y 404 consistentes con el sistema visual.
- DESIGN.md y PRODUCT.md documentando decisiones.
- .impeccable/design.json con el design system tokenizado.
Ajusta componentes existentes (modales, autocomplete, layout, login,
solicitudes, mis-préstamos, middleware) para alinearse a los tokens
del design system.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
El flow OAuth de Supabase (@supabase/ssr) es PKCE por default: requiere
guardar un code_verifier en cookies del cliente ANTES de mandar al user
a Google. El login.astro anterior linkeaba directo a
supabase.buglabs.dev/auth/v1/authorize saltándose ese paso, así que el
exchangeCodeForSession del callback fallaba sin cookies válidas.
Ahora el botón "Continuar con Google" apunta a /api/auth/signin, que
usa supabase.auth.signInWithOAuth() — este método sí setea el
code_verifier en las cookies del dominio de la app, y después el
callback lo recupera para completar el intercambio.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Vite hornea import.meta.env.PUBLIC_* en build time, pero el Dockerfile
no tiene .env.production disponible durante `docker build` (correcto,
por seguridad). Cambia el server client y la página de login para leer
las vars desde process.env, que sí llega vía env_file en runtime.
El browserClient no lo usa ningún island — se mantiene con
import.meta.env para el día que se necesite.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sistema web para gestión de préstamos de material del Laboratorio de
Sistemas Computacionales de la UABC.
- Backend: Supabase self-hosted, schema aislado `prestamos` con RLS,
triggers de stock y audit log (supabase/migrations/0001_init.sql).
- Auth: Google OAuth restringido a @uabc.edu.mx, verificado en
middleware y como segunda línea en trigger de DB.
- Frontend: Astro 7 (SSR con adapter Node) + React islands + Tailwind
v4 con paleta UABC (primary #00723F, secondary #DD971A) bajo regla
60/30/10.
- Interfaz alumno mobile-first: catálogo con filtro por categorías,
solicitud de préstamos, historial personal.
- Interfaz admin desktop-first: panel con KPIs, bandeja de solicitudes
(aprobar/rechazar/devolver), CRUD de inventario y categorías,
reportes filtrables con export CSV nativo.
- Modales con `<dialog>` nativo, cero librerías de UI adicionales.
- Deploy: Dockerfile multi-stage node:22-alpine + docker-compose para
publicar bajo prestamos.buglabs.dev vía Cloudflare Tunnel.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>