4 Commits
Author SHA1 Message Date
opencode 97ebcdfe03 fix(map): arreglar 3 bugs criticos que impedian ver el mapa
Bug 1: Content-Type vacio para .pmtiles
- Vite/Astro sirven .pmtiles sin Content-Type (extension desconocida)
- pmtiles del cliente falla al parsear el header del archivo
- Solucion: plugin Vite inline 'assetMimePlugin' en astro.config.mjs que
  setea application/octet-stream para .pmtiles, application/geo+json
  para .geojson, application/json para /data/*.json

Bug 2: MapLibre override de 'position: absolute'
- El <div id='map' class='absolute inset-0'> era override por la clase
  '.maplibregl-map { position: relative }' que MapLibre anade al container
  en runtime. Resultado: #map con 0px de alto, canvas de 300x1280
  (default) en lugar de 660x1280
- Solucion: cambiar a inline style 'position: absolute; inset: 0;' que
  no es override por clases externas

Bug 3: evento 'load' se dispara antes del handler
- Los <script> de Astro 7 se cargan como modulo defer, asi que el
  evento 'load' del map puede dispararse ANTES de que registremos el
  handler. El loading overlay se queda visible encima del mapa
- Solucion: patron seguro que chequea isStyleLoaded() y si ya paso
  ejecuta el callback inmediatamente, si no registra once('load', ...).
  Tambien setTimeout(3000) como safety net

Bug 4: zoom 8 demasiado bajo para ver secciones censales
- A zoom 8 las 674 secciones censales de las Balears son 1-2px cada
  una: aparecen como ruido gris plano
- Solucion: zoom inicial 9.5 centrado en Mallorca (lat 39.6, lon 2.85)
  para que las secciones se vean como poligonos de 3-6px

Cambios adicionales:
- URL del source pmtiles con window.location.origin (protocolo pmtiles
  requiere URL absoluta, no funciona con path relativo)
- Data del source airbnb con window.location.origin
- Sintaxis del style arreglada (faltaba { de apertura de la primera layer
  tras un edit anterior)
- TypeScript 5.9.3 mantiene typecheck 0/0/0
2026-07-14 13:02:20 +02:00
opencode ba9f353263 docs(plan): cerrar fase 2 y crear handoff para fase 3
- FASE-2-web-mvp.md: documentadas las 8 decisiones tomadas (idioma,
  stack, choropleth mixto, granularidad Eivissa/Formentera, clusters,
  SSR via prerender=false, fix dataset_web.json, bug secundario) y los
  5 problemas encontrados (Node 22 vs 20, TS 7 incompatible, cookie
  via Astro.cookies, output static pre-renderiza, GeoJSON pesado)
- PLAN.md: marcar Fase 2 como completada y anadir nota de iteracion
- HANDOFF-FASE-3.md: nuevo handoff para sesion de fase 3 con
  estructura, paginas funcionales, decisiones tomadas, traps,
  preguntas abiertas
- data/output/.gitkeep: confirmar sentinel
2026-07-14 12:27:42 +02:00
opencode a06bda2107 feat(web): scaffold Astro 7 con Tailwind 4, MapLibre 5 y PMTiles 4
Stack (Node 22.13.1 + pnpm 11.9.0):
- Astro 7.0.9 (output: static, prerender=false por pagina para SSR del i18n)
- Tailwind CSS 4.3.2 via @tailwindcss/vite
- maplibre-gl 5.24.0
- pmtiles 4.4.1
- @types/node, typescript 5.9.3 (no 7.x, incompatible con @astrojs/check)
- @astrojs/check 0.9.9

Estructura:
- web/src/{components,layouts,pages,i18n,data,styles}/
- web/public/tiles/dataset.pmtiles (copia de data/output/)
- web/public/data/dataset_web.json (copia de data/output/)
- web/public/data/airbnb_listings.geojson (generado en 05_)

TypeScript strict. astro check: 0 errors, 0 warnings, 0 hints.

assets servidos:
- /tiles/dataset.pmtiles -> 200
- /data/dataset_web.json -> 200
- /data/airbnb_listings.geojson -> 200
2026-07-14 12:27:23 +02:00
opencode 404fd30ac3 fix(data): regenerar dataset_web.json con sumas correctas a nivel isla
El script 02_build_dataset.py hacia SUM de hut_registros/hut_plazas por
seccion censal, multiplicando los valores de Eivissa (76 secciones) y
Formentera (6 secciones) por el numero de secciones del municipio.

Creado scripts/04_regenerate_web_json.py que:
- Lee el CSV raw de HUT Eivissa y agrega por municipio (total real: 2.364
  registros / 18.184 plazas)
- Lee el JSON raw de IBESTAT Formentera (1.375 / 14.935)
- Para Mallorca/Menorca mantiene SUM por seccion del parquet (correcto,
  granularidad seccion censal)

Bug secundario corregido: Mallorca y Menorca tenian los mismos totales
porque se agregaba el dict combinado. Ahora se agrega por isla individual.

Nuevo scripts/05_export_airbnb_geojson.py genera el GeoJSON de listings
individuales para los clusters del mapa (18.391 puntos, 2.97MB).
2026-07-14 12:27:17 +02:00