Skip to content

Sistema visual unificado primitivas UI, onboarding por pasos, tarjetas convergentes - #189

Open
trbureiyan wants to merge 22 commits into
devfrom
refactor/ui-ux-system
Open

trbureiyan wants to merge 22 commits into
devfrom
refactor/ui-ux-system

Conversation

@trbureiyan

@trbureiyan trbureiyan commented Aug 9, 2026 •

Copy link
Copy Markdown
Owner

Contrato de API y validación de semestres

Important

El rango de semestres válidos en el frontend era 1-10. El backend acepta hasta 13. Esto producía rechazos silenciosos en registros de semestres superiores. La forma del error de API tampoco era consistente entre rutas.

  • lib/error.ts. Contrato de error unificado: { error: string } en todas las rutas. Elimina variantes de forma que rompían el manejo de errores en el cliente.
  • lib/auth/register-validation.ts. Rango corregido a 1-13. Función pura sin dependencias externas, consumida tanto por el wizard frontend como por los tests.

Button, LinkButton, StatusModal

Important

Los botones y links de acción usaban clases ad hoc dispersas en cada componente. No había token compartido de variante ni tamaño. El modal de estado no tenía focus trap ni restauraba el foco al disparador.

  • components/ui/button-styles.ts. Mapa de tokens (variant, size) como fuente única de verdad para Button y LinkButton.
  • components/ui/Button.tsx. <button> semántico con estado loading y disabled, consume button-styles.ts.
  • components/ui/LinkButton.tsx. <a> / next/link con los mismos tokens visuales que Button.
  • components/ui/StatusModal.tsx. Modal con role="dialog", aria-modal, focus trap, cierre con Escape y restauración del foco al elemento disparador al cerrar.

AuthCarousel y registro en 3 pasos

Important

El formulario de registro era monolítico: un solo paso sin guía visual, sin validación por etapa y sin contexto institucional. Un usuario podía llegar al submit con 10 errores acumulados sin ninguna indicación previa.

  • components/auth/AuthCarousel.tsx. Carrusel accesible con aria-live, aria-roledescription, pausa en hover y soporte de prefers-reduced-motion. Visible en ambas páginas de autenticación.
  • components/auth/ValidationStepIndicator.tsx. Barra de progreso de 3 pasos con estado activo / completado / pendiente.
  • app/auth/register/page.tsx. Reconstruido como wizard: paso 1 datos personales → paso 2 credenciales → paso 3 información académica. Valida por etapa antes de avanzar.
  • app/auth/register/[tokenRegister]/page.tsx. Mismo wizard adaptado al flujo de invitación con token.
  • app/auth/login/page.tsx. Migrado a Button y LinkButton; estructura visual unificada con el wizard.

Card y layout chrome declarativo

Note

Las tarjetas de "Últimas Noticias" y "Portafolio" compartían sección en la landing pero diferían en fondo, borde y hover. El Navbar y el Footer se controlaban con un useEffect que mutaba el DOM según el pathname, patrón frágil y difícil de mantener.

  • components/ui/Card.tsx. Primitiva de composición con subcomponentes Card.Header, Card.Body, Card.Footer. Token de fondo, borde y hover definidos una vez.
  • components/landing/EventsSection.tsx. Refactorizado a Card. Agrega estado vacío explícito cuando no hay eventos.
  • components/landing/ProjectsPreviewSection.tsx. Refactorizado a Card. Mismo comportamiento de hover y borde que la sección de eventos.
  • components/layouts/FooterConditional.tsx. Wrapper declarativo que oculta el Footer en rutas (protected) y auth. Espeja NavbarConditional.
  • app/layout.tsx. Simplificado — delega visibilidad a NavbarConditional + FooterConditional. Elimina el useEffect de control de visibilidad.
  • components/layouts/Footer.tsx. Array de links estáticos movido a scope de módulo (evita re-alocación por render).
  • components/ui/LoginButton.tsx. Migrado a primitiva Button.

Key Architectural & UX Decisions

Note

  • Wizard Submit Guard: handleSubmit evalúa currentStep < 2 y avanza al siguiente paso sin validar o disparar los campos del paso final de acceso.
  • Conditional Layout Chrome: NavbarConditional y FooterConditional usan coincidencia estricta o de subruta con / para evitar ocultar el chrome en rutas que solo comparten prefijo textual.
  • Error Contract Consistency: errorRequest en omite el separador cuando field está vacío, preservando la compatibilidad de data.Error legacy.
  • Centralized Safe Redirect Guard: getSafeInternalRedirect evalúa de forma estricta el inicio de ruta y parsea relativo a http://localhost asegurando que no existan desvíos de origen o bypass de contrabarras.
  • Error Field Map Extension: BACKEND_ERROR_FIELD_MAP unifica los campos tanto del wizard por pasos como del formulario de solicitud inicial en /auth/register.

Checklist

  • Build limpio (pnpm build)
  • Tests automáticos pasan (pnpm test)
  • Typecheck sin errores (npx tsc --noEmit)
  • Lint limpio (pnpm lint — lint-staged en cada commit)
  • Flujo de registro — validación por pasos, sin avanzar con errores
  • Modal — focus trap activo, Escape cierra y restaura foco
  • Tarjetas de landing — mismo fondo, borde y hover en Eventos y Proyectos
  • Rutas de auth — Navbar y Footer no visibles
  • Pruebas manuales y screenshots
Análisis automático de CodeRabbit

Cambios principales

  • Unifica el contrato de errores de API con field, message y code.
  • Corrige la validación del semestre para aceptar valores del 1 al 13.
  • Añade validación centralizada del registro y compatibilidad con errores legacy.
  • Incorpora las primitivas Button, LinkButton, StatusModal y Card.
  • Añade AuthCarousel accesible y ValidationStepIndicator.
  • Reconstruye el registro con token como wizard de tres pasos.
  • Unifica las páginas de autenticación y mejora sus estados de error, carga y accesibilidad.
  • Migra las tarjetas de eventos y proyectos a componentes compartidos.
  • Sustituye la visibilidad imperativa del layout por NavbarConditional y FooterConditional.
  • Centraliza la normalización, los alias, las redirecciones y las sugerencias de rutas públicas.
  • Mejora la página 404 con sugerencias de rutas cercanas.
  • Añade pruebas para la validación del registro y las rutas públicas.

Validación

  • Build, tests, typecheck y lint completados.
  • Pruebas manuales y screenshots pendientes.

…nse structure

Corregido codigo de estado HTTP de 500 a 422 en la validacion de motivacion del backend. Modificado errorRequest en lib/error.ts para retornar un contrato de error estable con los campos 'field', 'code' y 'message'. Creado modulo puro lib/auth/register-validation.ts conteniendo las reglas de negocio academicas y logica de mapeo. Añadidos tests unitarios en tests/registration-validation.node-test.ts cubriendo las reglas del formulario.
…-styles token map

Button and LinkButton share button-styles.ts as single source of truth for
variant and size tokens. StatusModal uses focus trap and restores focus to
the trigger element on close, covering keyboard-only users.
AuthCarousel: accessible auto-rotating carousel with pause-on-hover.
ValidationStepIndicator: visual progress for multi-step register flow.
register/page and tokenRegister/page rebuilt as step-by-step wizards
with per-step client validation via lib/auth/register-validation.ts.
login/page updated to consume Button and LinkButton primitives.
… primitives

Card.tsx: root/Header/Body/Footer compound component with shared visual tokens.
EventsSection and ProjectsPreviewSection refactored to consume Card — both
sections now share border, background and hover behavior.
FooterConditional mirrors NavbarConditional for declarative layout chrome.
Footer static links array hoisted to module scope (React Doctor — avoid
re-allocation per render). LoginButton updated to consume Button primitive.
- Hacemos que la página 404 sea client-side para leer la ruta actual y mostrar “tal vez buscabas” con sugerencias cercanas (sin entrar a rutas protegidas)
- Centralizamos la lógica de rutas públicas/aliases en `public-routes` y la usamos tanto en `middleware` (redirects) como en el 404 (sugerencias)
- Agregamos tests unitarios para cubrir normalización de slash, redirects por alias y el comportamiento de sugerencias evitando prefijos restringidos
@vercel

vercel Bot commented Aug 9, 2026 •

Copy link
Copy Markdown
Contributor

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
devurity-web Ready Ready Preview Aug 9, 2026 4:14am

@gitguardian

This comment was marked as resolved.

@coderabbitai

This comment was marked as resolved.

@trbureiyan trbureiyan added enhancement New feature or request refactor Reestructuración de código existente sin cambiar funcionalidad labels Aug 9, 2026
Add components/auth to repo map. Add FooterConditional to layouts.
Add Button, LinkButton, Card, StatusModal to ui primitives list and
component conventions reuse list. Add register-validation.ts to
lib/auth map. Add registration-validation to tests list.
coderabbitai[bot]

This comment was marked as resolved.

- Añade `permissions: contents: read` en el workflow para seguir el principio de mínimo privilegio y reducir el riesgo de accesos innecesarios durante CI
- Agrega un límite (254) antes de validar el formato para rechazar correos demasiado largos y evitar entradas inválidas en la API.
- Devuelve 422 con un error de campo cuando el correo excede el tamaño permitido.
…ueba

- Cambié `assert` por utilidades de `node:assert/strict` (`ok`, `match`, `strictEqual`) para mantener aserciones más consistentes y claras.
- Centralicé casos de contraseñas en constantes (válidas y no válidas) para reutilizarlas en los tests y evitar duplicación/errores al ajustar reglas.
- Amplié los JSDoc de `Card` y `LinkButton` para dejar claro el propósito/decisiones de composición y el contrato de cada subcomponente
- Actualicé el comentario de `ProjectsPreviewSection` para describir su comportamiento esperado al renderizar hasta 3 proyectos
- Quité el warning de formato agregando el salto de línea final del archivo
@trbureiyan trbureiyan added bug Something isn't working invalid This doesn't seem right labels Aug 9, 2026
@trbureiyan

Copy link
Copy Markdown
Owner Author

(Aun no está listo para mergear)

This branch was successfully deployed

1 active deployment
Preview — a392c807 Deployed Aug 9, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request invalid This doesn't seem right refactor Reestructuración de código existente sin cambiar funcionalidad

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant