Restore the descriptive lead-in and swap the rhetorical question to
focus on both building AND commercializing — sharper framing of the
'investigation' angle.
- ca: "Creuem dades oficials d'habitatge semi-buit amb lloguer turístic
a les Illes Balears. De veritat cal construir i comercialitzar més?"
- es: "Cruzamos datos oficiales de vivienda semi-vacía con alquiler
turístico en las Islas Baleares. ¿De verdad hay que construir y
comercializar más?"
Replace descriptive site.description with a short rhetorical question
that fits the investigative tone. Used by og:description, meta
description, and twitter:description on home, /mapa, and /404.
- ca: "Cases tancades. Cal construir-ne més?"
- es: "Casas cerradas. ¿Hay que construir más?"
GitHub URL is no longer in use after migration to self-hosted Gitea.
Removes the "codi font" footer link, GitHub button on /qui-som, the
repoUrl constants, and the entire "Reproduir l'anàlisi" reproduction
guide on /dades. Cleans 6 orphaned i18n keys in ca.json and es.json.
The project is repositioned as a personal research project on a
self-hosted VPS — no longer framed as open for contribution.
Removes the contribution call-to-action from /qui-som and the
7 i18n keys that became orphaned as a result.
- Replace default Astro favicon with minimal "CT" SVG (orange brand color)
- Delete unused favicon.ico
- Add carbon footprint disclosure to footer with Ecograder data (A+,
0,001 g CO₂/visita, 10,7 kB, 100% green hosting)
- Add explicit "personal research project, not official" disclosure
- Update site URL to casesbuides.itziarzameza.dev across astro.config.mjs
and Base.astro fallback
Swap @astrojs/vercel adapter for @astrojs/node standalone (Vercel adapter
emits serverless functions; Coolify runs a long-lived Node container).
Add web/nixpacks.toml with explicit install/build/start phases.
Fix web/pnpm-workspace.yaml: scaffolded without the packages field, which
broke pnpm install on any environment that validates workspaces strictly
(this was the root cause of the original Coolify build error).
- Mark consumo fields with asterisk in popup (INE 59532 refreshes with next Censo de Viviendas)
- Add footnote in map header explaining the pending update
- Collapse variables panel on mobile behind a toggle button
- Move legend below the map on mobile (out of overlay)
Acaba d'arribar a 0 la manca de transparència que l'usuaria va
senyalar: el mapa mostra Mallorca groc i Eivissa blau sense
explicar per què, i això podia semblar una tria editorial.
1. Strip de fonts persistent sota el mapa a /mapa:
'Per què cada illa té una capa diferent?' — targetes per a
Mallorca/Menorca (Airbnb Inside), Eivissa (HUT Consell) i
Formentera (IBESTAT 2019 única font pública).
2. Línia 'Font:' al popup que canvia segons el context:
- Capa Possibles vacants / Habitatges totals → INE 59531
- Capa Pressio turística + click M/Mn → Inside Airbnb
- Capa Pressio turística + click Eivissa → HUT
- Capa Pressio turística + click Formentera → IBESTAT 2019
Texts dins T (no pas t(): el client-side script ja té T com a
única font d'estrings del navegador).
astro-check: 0 errors.
El report d'astro-check passava de 8 errors → 0 errors + 1 hint.
1. /informe no compilava:
- Substituir t(...).map(...) per tArray<T>(...) al frontmatter
(no es pot posar el generic <T> dins expressions JSX d'Astro).
- Ara cifras i fuentes es declaren a la capçalera TS i es
reusen al template.
2. /premsa: tArray<Quoteable> al frontmatter en lloc de
t():Quoteable[] (que TypeScript rebutjava).
3. /premsa fora del menu:
- Eliminat l'<a href='/premsa'> de Header.astro.
- Premsa queda inaccessible des de la UI per ordre de l'usuaria
(la plana en si continua reachable si s'entra la URL).
4. Base.astro: ampliar el type union d'active de 4 a 8 valors
(home|map|methodology|islands|data|press|about|informe) perquè
coincideixi amb Header.astro. Resol 4 errors residuals:
/premsa (active=press), /qui-som (active=about),
/illes (active=islands), /dades (active=data).
5. /404: afegit active=home que faltava per complir Props.
6. i18n actualitzat (ca+es):
- variable_pressio_turistica_desc explicita per illa
(M+Mn→Airbnb, Eivissa→HUT, Formentera→IBESTAT)
- popup_source_{ine,airbnb,hut_eivissa,ibestat_formentera}
per posar una línia 'Font:' al popup
- sources_strip_{title,intro,pm,eivissa,formentera}_*
per afegir un strip persistent de fonts sota el mapa (TODO)
Abans el popup mostrava el camp actiu DUES vegades quan coincidia
amb una fila auxiliar (ex. 'Possibles vacants' = consumo_p10_kwh
es pintava al requadre destacat i a la fila 'Consum p10 (kWh)').
Ara:
- 1 SOLA fila destacada a la part superior del popup (caixa negra
amb el valor més gran + label + hint).
- Filas sota amb camps relacionats però DIFERENTS del cfgField
(skip silencios si coincideix).
- Cada camp porta unit (kWh/any, €) + hint de 1 línia explicant
què és. P.ex. 'Ratio p10/p50: 0,38 · <0,3=quasi-vacant'.
Mapa d'un camp = {label{ca,es}, unit?, hint{ca,es}} inline al
component per mantenir-ho tot al mateix lloc (no inflar i18n).
astro-check: 0 errors nous a Mapa.astro.
- Extract ConsumoDistribucion.astro (panel abans inline a mapa.astro).
Aquest panell (105.632 vacants, 13.466 testimonial, etc.) ara apareix
TANT a /mapa com a /. A /, va entre la taula per illa i les story cards.
- mapa.astro ja no té markup propi: <Mapa /> + <ConsumoDistribucion />.
- Capçalera del mapa més petita (py-8 → py-2/3, text-2xl/3xl → text-lg/xl,
lead més curt) perquè el mapa sigui la peça dominant.
- Alçada del mapa adaptable:
height: calc(100vh - 60px); min-height: 480px;
↓
height: clamp(420px, 62vh, 640px);
Així el mapa s'adapta a la finestra sense cobrir la pantalla en monitors
grans, i no obliga a fer scroll horitzontal en mòbils.
- Llegenda (bottom-right) i panell de capes (top-left) ara amb
max-h-[calc(100%-1.5rem)] overflow-y-auto — el desbordament es controla
dins la caixa en lloc de quedar tallat per la vora del mapa.
astro-check: 0 errors nous.
L'usuaria no entenia el mapa: 15 variables, 2 capes redundants
(consumo_p10_muy_bajo + consumo_p10_bajo pintaven el MATEIX camp), i
noms quasi-iguals ('Cua de baix consum' vs 'Cua de consum baix').
Decidim tornar a 0.
3 capes simples, 3 botons grans (no dropdown):
1. 'Habitatges totals' (capa original)
2. 'Possibles vacants' (renova 4 capes consumo + viviendas_vacantes,
pintant consumo_p10_kwh amb semafor vermell)
3. 'Pressio turistica' (capa composta nova: airbnb_listings a
Mallorca/Menorca + hut_plazas a Eivissa,
pintades simultaniament)
Treu:
- 14 entrades de variableOptions
- 13 entrades de LAYERS
- 18 claus i18n obsoletes (group_consumo/presion/hut/avanzado +
variables buides)
- El format dropdown + optgroup
AFEGEIX:
- HTML <button> amb aria-pressed (estil actiu automatic via <style>)
- Listener click en lloc de change event
- Llegenda custom per 'pressio_turistica' amb 2 mini-barres
(groc-taronya Airbnb, blau HUT) perque la capa composta no
es pot representar amb un sol degradat
- formatTick especial per a possibles_vacants (kWh)
Net: -404 linies a Mapa.astro, -42 a cada i18n (-488 total).
astro-check: 0 errors nous a Mapa.astro.
El usuario veia en el popup TODA la informacion de golpe (INE + Airbnb + HUT)
independientemente de la variable seleccionada. Eso es ruido innecesario.
Popup ahora contextual segun el scope de la variable activa:
- scope 'airbnb' (variables Airbnb): muestra Airbnb data
- scope 'hut' (variables HUT): muestra HUT data
- scope 'all' (INE vivienda/consumo): muestra INE data
Ademas, el valor de la variable activa aparece destacado arriba de la seccion
para que el usuario vea inmediatamente 'lo que pinta el mapa'.
Dropdown reagrupado en 5 optgroups:
- Habitatge (INE Cens 2021): viviendas totales + viviendas vacantes
- Consum electric: 4 tramos (p10_muy_bajo, p10_bajo, p50_medio, p90_alto)
- Presio Airbnb: listings, enteros, ingresos, por_1000
- Habitatge turistic legal HUT: registros, plazas
- Avanzado: con_licencia, ratio, mediana_kWh
CA: 'Habitatge (INE Cens 2021)' / 'Consum electric (Cens 2021)' / etc.
ES: 'Vivienda (INE Censo 2021)' / 'Consumo electrico (Censo 2021)' / etc.
Resultado:
- Dropdown mas escaneable (5 grupos vs lista plana de 15)
- Popup focal en lo que importa (no mas ruido)
- Valor de la variable activa destacado arriba
El usuario queria ver claramente dónde hay viviendas vacantes y cuántas.
Hasta ahora solo teníamos el choropleth de consumo_p50, que era
abstracto y los numeros de Airbnb en circulos confundian.
Nueva variable 'viviendas_vacantes_estimadas' en el dataset:
- Viviendas_totales (municipio) * 0.162 (tasa CCAA INE 2021)
- Asume distribucion uniforme del 16,2% (proxy: en realidad varia
por municipio, mas alta en zonas turisticas)
- Replicada a todas las secciones del mismo municipio
Capa nueva en el mapa con escala de rojos:
< 100 vacants (claro)
100-500
500-1500
1500-5000
> 5000 vacants (oscuro, Palma)
Total Balears = 105.632 vacantes (proxy)
- Palma: 30.210
- Calvia: 5.912
- Manacor: 4.629
- Inca: 2.570
- Llucmajor: 3.776
- Eivissa: 3.878
i18n: nueva key 'variable_viviendas_vacantes' en ca.json y es.json
Cuando el usuario seleccionaba una variable de consumo (p10, p50, ratio,
viviendas_totales), los circulos de los clusters de Airbnb seguian
mostrando el mismo dato (count de listings, p.ej. 212, 76, 15),
creando confusion porque el usuario pensaba que esos numeros eran
el valor de la variable de consumo elegida.
Ahora applyVariable auto-oculta los 3 layers de airbnb-clusters
cuando la variable no es de scope 'airbnb'. El toggle manual
'Punts Airbnb (clusters)' se sincroniza automaticamente con el estado
real: solo se muestra cuando la variable es Airbnb.
Antes: una sola variable 'consumo_p50_kwh' continua, dificil de leer
y los numeros del cluster de Airbnb (212, 76, 15) se confundian con
los valores del coroplético.
Ahora: 4 variables categoricas claras, todas pintando distritos
censales con escala de color semaforo (rojo = mal, verde = bien):
1. Cola de bajo consumo (p10) [ROJO = sospecha semi-vacios]
p10 < 800 kWh: hay casas con consumo testimonial
2. Cola de consumo bajo (p10) [NARANJA = posible uso estacional]
p10 entre 800-2500 kWh
3. Consumo medio (p50) [AMARILLO = residencial estandar]
p50 entre 2500-4000 kWh (mediana 2869 kWh)
4. Cola de consumo alto (p90) [VERDE = sin cola de bajo consumo]
p90 > 4500 kWh
El dropdown ahora muestra:
- Habitatges totals
- 4 variables de consumo (las nuevas)
- Ratio p10/p50
- Mediana consumo kWh (avanzado, al final)
i18n: 4 keys nuevas en ca.json y es.json con label + desc claros
que explican el significado politico (semi-vacio, uso estacional,
residencial estable).
La función t() está tipada como string, por lo que al pedir
'map.consumo_distribucion_buckets' devolvía la clave literal
en vez del array, y buckets.reduce fallaba con TypeError.
Solución: nueva función tArray<T>(lang, key) que resuelve la clave
y devuelve el array tipado (o [] si no es array).
Bajo el mapa interactivo, un panel con la distribución de las 652.123
viviendas de Balears por tramo de consumo eléctrico (Cens 2021, Holm 2025):
- Consumo 0 (vacantes): 105.632 (16,2%)
- < 250 kWh/año (testimonial): 13.466 (2,1%)
- 251-1.000 kWh (esporádico): 67.202 (10,3%)
- 1.001-4.000 kWh (consumo medio): 298.871 (45,8%) ← mediana 2.869 kWh
- > 4.000 kWh (consumo alto): 166.952 (25,6%)
Visualización: barras horizontales con porcentaje y valor absoluto,
con interpretación textual por tramo.
Limitación documentada: los datos son a nivel CCAA (no municipio),
por lo que aparecen como contexto al lado del mapa, no como capa pintable
(motivo explicado en el intro de la sección).
Total viviendas = suma de los 5 tramos = 652.123 (verificado).
- Nuevo resumen_p6 que cita los datos del observatorio semestral del COAIB
(julio 2025): +34,68% viviendas nueva creacion, -33,87% protegidas.
La conclusion del propio COAIB ('no podrá solucionar la escasez')
refuerza el argumentario del informe Holm 2025.
- 2 cifras nuevas del COAIB en la tabla:
+34,68% aumento interanual viviendas nueva creacion (1S 2025)
-33,87% caida interanual viviendas protegidas (1S 2025)
- COAIB añadido como fuente externa (observatorio semestral julio 2025)
- informe.astro renderiza resumen_p6
Estas cifras NO actualizan las del informe (datos del Censo 2021
siguen siendo la fuente de las 105.632 vacantes), sino que aportan
contexto ACTUALIZADO (2025) sobre la tendencia de nueva construccion
que valida el argumentario: 'se construye más, pero no para residentes'.
Pagina nueva /informe con:
- Resumen ejecutivo (5 parrafos) con atribucion inline (Holm, 2025)
- Tabla de 10 cifras clave del informe
- Tabla de 7 fuentes (INE, Ministerios, 4 busquedas VPN)
- Bio breve de la autora + nota de revision pendiente
- CTAs a /mapa y /metodologia
Modificaciones en paginas existentes:
- /premsa: 4 quoteables nuevos del informe (102.597, 4.9bn€, 1.18bn€, 208.470)
i18n-ificados los 10 quoteables (CA+ES) para consistencia bilingue
- / (home): narrative_p3 reescrito con conclusion clave del informe
- /metodologia: parrafo contextual citando Holm 2025
- /Header: nav link 'Informe' entre Mapa y Per illa
- /Base.astro: type 'informe' añadido a active
- /Footer: atribucion al informe de Holm 2025
i18n:
- ca.json y es.json: nuevo bloque 'informe' (22 strings)
- methodology.report_context añadido a ambos
- home.narrative_p3 actualizado en ambos
- press.quoteables movido de hardcoded a i18n (10 entries)
- nav.informe y footer.based_on añadidos
Atribucion:
- Todas las cifras del informe llevan '(Holm, 2025)' o similar
- Footer con 'Analisi basat en l'informe de Lic. Emma C. Holm (2025)'
- NO se copia el PDF a web/public/ (pendiente publicacion por la autora)
Origen: usuario pidió comparar demanda invierno vs verano. API REE rota para
geo_limit=baleares (devuelve 400 en todos los endpoints). Alternativa: analizar
los percentiles de consumo electrico del Censo 2021 (tabla 59532) como proxy
de heterogeneidad de uso.
Logica:
- p10 muy bajo en relacion a p50 (ratio <0.3) = hay casas con consumo muy bajo
(posibles vacantes, segundas residencias estacionales, personas mayores)
- p10/p50 alto (~0.6+) = distribucion mas homogenea = uso residencial estable
Limitaciones documentadas en data/output/vivienda_vacia_analysis.md:
- Es un snapshot del 2011, NO serie temporal
- Ratio NO distingue invierno de verano, solo colas de bajo consumo
- Para invierno vs verano real, hace falta REE funcionando o Govern Balear
Outputs:
- scripts/07_vivienda_vacia_analysis.py: nuevo script de analisis
- data/output/vivienda_vacia_por_distrito.csv: 116 distritos con ratios + Airbnb
- data/output/vivienda_vacia_analysis.md: reporte markdown con top-10, correlacion, etc
- web/public/vivienda_vacia_*: copies para acceso publico
- ratio_p10_p50_consumo: nueva variable en dataset y mapa (color naranja-rojo)
Invertido: naranja = mucha cola de bajo consumo (potencial vacio), verde = estable
- HUT Eivissa 2026: 2.369 registros, 18.184 plazas (CSV limpio desde HTML-as-xls)
- IBESTAT Formentera 2019: 1.375 establecimientos, 14.935 plazas (JSON desde OLE .xls)
- Insight clave del usuario: legal != realidad, la diferencia ES la denuncia
- Cobertura 4/4 islas con calidad desigual documentada en VALIDACION.md
- PLAN.md y FASE-0-setup.md actualizados con el estado real