- FAB y aviso PWA flanquean la columna central (720px): right/left
max(16px, calc((100vw - 720px)/2 + 16px)) para acompañar al contenido
en pantallas anchas sin pegarse al borde de la ventana
- FAB de 64px en PC (54 en móvil); PWA abajo a la izquierda en PC y móvil
- Nuevo BotonProponerArriba (solo PC): píldora "Proponer local" arriba a
la derecha, alineada al cuerpo, que abre la misma pasarela
- Campo universal de ubicación (Google Maps/Waze/OSM/coordenadas/dirección)
sobre proveedores extensibles (src/utils/ubicacion) con resolver e inferencia
inversa Nominatim (nombre/provincia pre-rellenados, alias cooficiales)
- FAB flotante abajo a la derecha que abre la pasarela en un modal accesible
(Escape, foco contenido, responsive); sin descripción ni puntuación;
avisos de duplicado y filtro de palabras dentro del modal
- Aviso PWA reposicionado: tarjeta abajo a la izquierda en móvil,
botón compacto arriba a la izquierda en PC (no tapa el FAB)
- Suite de pruebas: 88 unitarias/componente (vitest + RTL, offline) y
10 de integración (supertest + SQLite :memory: y Nominatim real opt-in)
- CI: workflow de Gitea Actions con npm test + build en push/PR e
integración manual
- Añade sistema de avisos tipo snackbar (Toast.jsx + useToast.js) con
auto-cierre, animación de entrada y estilos info/éxito/error.
- LocalCard: feedback visual al añadir/quitar un local de favoritos.
- AdminPanel: sustituye los alert() por toasts al aprobar, rechazar,
eliminar locales, descartar avisos y guardar el filtro de palabras;
además saluda con un toast tras iniciar sesión o crear cuenta.
- App: el contenedor del mapa Leaflet queda siempre montado (oculto con
CSS) y se llama a invalidateSize() al volver a la pestaña de mapa;
así el mapa ya no se rompe al navegar entre vistas (antes obligaba
a recargar la página).
El objetivo de estos cambios es, por un lado, mantener los datos
actualizados y, por otro, mejorar la experiencia para quienes lo usan:
- Fiabilidad: los locales se pueden confirmar ("Sigue aquí") y
reportar (cerrado, datos incorrectos...), y se avisa de duplicados
antes de publicar, para que el contenido no se quede obsoleto ni
repetido.
- Usabilidad: autocompletado al proponer, favoritos, "cerca de mí",
compartir fichas, enlaces a Waze y una política de privacidad
visible, para que sea más sencillo aportar y encontrar locales.
- Extrae App.jsx en módulos reutilizables: constants/ (categorias,
provincias), utils/geo, styles/shared, hooks/usePwaInstall y
components/ (StarRating, LocalCard, CampoUbicacion, BannerMovil,
CategoriaBadge)
- AdminPanel reutiliza constantes y componentes compartidos y corrige
la limpieza de suscripciones de Firebase al desmontar
- Añade logos de marca (logo-localesp.png + @2x) y regenera los iconos
PWA con tamaños menores
- sw.js: sube la caché del shell a v2 e incluye los nuevos iconos y logos
- Mapeo campos en base de datos: ubicacion→provincia, telefono→subcategoria,
email→direccion, web→enlaceGoogleMaps y añadido puntuacion.
- Migración suave (ensureColumn) para añadir las nuevas columnas sin perder
datos existentes si la DB ya existía con el esquema antiguo.
- Actualización de rutas del servidor para guardar/leer los nuevos campos y
convertir el NULL a valor nulo por defecto en puntuacion.
- Soporte PWA: añadido meta tags (manifest, theme-color, apple-touch-icon) y
registro de service worker para instalación del app y shell offline.