Este documento resume como esta construida la aplicacion y donde vive cada responsabilidad. Para arrancar el proyecto, ver el README. Para la relacion con los requisitos de evaluacion, ver la justificacion de requisitos.
Vantastic! es una aplicacion React que simula una plataforma de alquiler de vans camper vintage. No usa backend real: MirageJS crea una API local para que la app pueda hacer fetch como si consumiera un servicio externo.
El foco tecnico esta en:
- Rutas con React Router.
- Componentes reutilizables.
- Estado local y global.
- Custom hooks.
- Formulario con validacion.
- Datos desde API mock.
- Interfaz responsive con Tailwind CSS y CSS organizado por secciones.
src/main.jsximporta estilos globales, arranca la API MirageJS y monta React.BrowserRouterpermite usar rutas y enlaces internos.FavoritesContextProviderenvuelve la app para que favoritos este disponible en catalogo, tarjetas y detalle.App.jsxdefine la tabla de rutas.Layout.jsxrenderiza Header, contenido principal conOutlety Footer.
Las rutas principales estan en src/App.jsx:
/: Home./home: alias de Home./vans: catalogo./vans/:id: detalle de una van./vans/:id/specs: specs dentro del detalle./vans/:id/ratings: valoraciones dentro del detalle.*: pagina 404.
VanDetail usa rutas anidadas para que el layout principal de la van no cambie mientras se alterna el contenido secundario. En desktop, specs y ratings tambien se muestran en dos paneles directos para aprovechar mejor el espacio.
src/api/server.js crea un servidor MirageJS con dos modelos:
vanlocation
Endpoints activos:
GET /api/vans: devuelve todas las vans.GET /api/vans/:id: devuelve una van por id.GET /api/locations: devuelve ciudades para el formulario.
Los datos de cada van incluyen informacion principal, tipo, precio, imagen, especificaciones y valoraciones.
src/hooks/useFetch.jsx
- Recibe una URL.
- Ejecuta
fetchen unuseEffect. - Devuelve
{ data, loading, error }. - Reinicia
loadingyerrorcuando cambia la URL. - Ignora resultados obsoletos si el componente se desmonta durante la peticion.
src/context/FavoritesContext.jsx
- Guarda el array global de ids favoritas.
- Expone
toggleFavorite(id). - Expone
useFavorites()para que los componentes no importen el contexto directamente.
src/pages/Vans.jsx
- Usa
useSearchParamspara que los filtros vivan en la URL. - Esto hace que
/vans?type=viajera&favs=truesea compartible y recuperable al refrescar.
Layout
- Une Header, contenido y Footer.
- Controla scroll al inicio al cambiar de ruta.
- Si la URL incluye hash, hace scroll a la seccion correspondiente.
Header
- Logo principal.
- CTA hacia el catalogo.
Footer
- Texto de marca.
- Iconos sociales placeholder.
- Links a secciones de Home mediante hash.
- Links legales placeholder.
VanCard
- Tarjeta reutilizable del catalogo.
- La imagen y el cuerpo de la tarjeta enlazan al detalle.
- El corazon de favoritos actua como boton independiente con estado accesible.
BookingForm
- Usa React Hook Form.
- Carga ciudades desde
/api/locations. - Valida nombre, email, telefono, fechas, ciudades y comentarios.
- Usa
useWatchpara impedir que la fecha de entrega sea anterior a la recogida. - Al enviar, muestra una modal accesible de confirmacion.
- La modal enfoca el boton de cierre, permite cerrar con Escape y devuelve el foco al boton de envio.
Heart
- Icono reutilizable para favoritos.
- Recibe
filledpara cambiar el estado visual.
La home esta dividida en secciones pequenas dentro de src/pages/sections/:
HomeHero: entrada visual y CTA principal.HomeFleetPreview: tres categorias de vans con una imagen aleatoria por tipo.HomeGaleria: galeria social/feed con imagenes locales.HomeNewsletterSignup: newsletter con input y CTA.HomeAboutUs: historia de marca con imagen decorativa.HomeTestimonialsSocial: reseñas de clientes.
Los iconos de Lucide en secciones son decorativos y usan aria-hidden="true".
src/index.css funciona como inventario y punto de entrada de estilos. Importa:
base.css: reset, fuentes y estilos globales.layout.css: wrappers generales.header.cssyfooter.css.home.cssy los modulos de secciones Home:home-hero.css,home-fleet-preview.css,home-newsletter.css,home-about.css,home-testimonials.cssyhome-galeria.css.vans.css,van-card.css,van-detail.css,booking.cssynot-found.css.buttons.css: botones y chips compartidos.
La paleta vintage vive en tailwind.config.js como colores retro-*.
Durante el desarrollo hubo una etapa de confusion con Tailwind CSS: se mezclaron patrones y configuraciones de distintas versiones, y el CSS termino siendo dificil de seguir. Use Codex para revisar esa situacion, corregir la configuracion activa y dividir el CSS base en modulos mas pequenos por responsabilidad. Una vez ordenada esa base, implemente encima los cambios del estilo vintage final.
Detalles ya implementados:
- Iconos decorativos con
aria-hidden. - Botones de favoritos con
aria-labelyaria-pressed. - Modal de reserva con
role="dialog",aria-modal,aria-labelledbyyaria-describedby. - Clase
sr-onlypara texto solo de lector de pantalla. - Labels conectados a inputs en formulario.
- Navegacion por rutas y hash con scroll controlado.