Micrositio en JavaScript + Vite con 3 pestañas:
Dashboard NacionalEstadísticas por EntidadCDMX por Alcaldía
El sitio consume datos JSON y renderiza mapas y gráficas interactivas.
ViteJavaScript(sin framework)d3-geo(proyecciones/cartografía)CSScustom
.
├── assets/
│ ├── css/styles.css # Estilos globales, responsive y componentes de charts
│ └── js/app.js # Lógica completa del dashboard
├── public/
│ └── data/ # Todos los JSON y GeoJSON usados por fetch()
├── index.html # Shell principal
├── package.json
└── vercel.json # Config de build para Vercel-
Edita fuente:
assets/js/app.jsassets/css/styles.cssindex.htmlpublic/data/...
-
No edites:
dist/...(se regenera en cada build)
assets/js/app.jsdefine las pestañas enconst TABS.- Cada sección tiene su archivo
file: "data/...json". loadTab()carga los JSON confetchJSON().renderSection()decide qué renderer usar segúnsection.type.- La sección se pinta en el
#dashboard.
Editar const TABS en assets/js/app.js.
Ejemplos de campos:
label: texto de la pestañatitleysubtitle: encabezado de la vistasections[]: bloques internos
En TABS.sections[].file, apunta al nuevo JSON dentro de public/data/....
Ejemplo:
file: "data/dashboard-nacional/participacion_economica_mujeres_por_pais.json"
- Agrega un objeto en
TABS[].sections. - Define
typeexistente (line,stacked-bars,world-map-ranking, etc.). - Si necesitas un nuevo tipo:
- agrega un bloque en
renderSection() - crea función render dedicada.
- agrega un bloque en
Puntos clave en assets/js/app.js:
COUNTRY_ALIASESSPANISH_DATASET_ALIASESresolveCountryMatch()
Si un país no cruza bien entre mapa y dataset, agrega alias ahí.
Puntos clave:
attachMexicoIndicatorMap()attachCdmxIndicatorMap()MEXICO_STATE_ALIASESALCALDIA_ALIASES
GeoJSON usados:
- Entidad: URL remota (
MEXICO_GEOJSON_URL) - CDMX:
public/data/cdmx-alcaldia/cdmx_alcaldias_real.geojson(local)
- Mapa mundial:
attachWorldMapTooltip() - Gráficas de línea:
attachLineChartTooltip() - Barras/segmentos:
attachBarChartTooltip()
En assets/css/styles.css:
@media (max-width: 760px).tab-nav,.tab-scroll-hint.vbars-scroll,.vbars-plot,.bars-scroll-hint
-
Carga principal:
init()loadTab()renderSection()
-
Renderers:
renderWorldMapRanking()renderLineChart()renderStackedBars()renderBarsStage()renderMexicoIndicatorMapShell()attachMexicoIndicatorMap()attachCdmxIndicatorMap()
-
Utilidades:
normalizeSectionData()normalizeCountry()fetchJSON()escapeHtml()
npm install
npm run devnpm run build
npm run previewSí, el proyecto ya quedó preparado para actualizar datos desde Google Sheets.
Archivos nuevos:
scripts/sync-data-from-sheets.mjsscripts/data-sources.config.json
Comandos:
# Simulación (no escribe archivos)
npm run data:sync:dry
# Sincronización real
npm run data:syncQué pasa cuando agregas/actualizas fuentes en el config:
npm run data:sync:dry- Lee
scripts/data-sources.config.json. - Descarga y valida cada fuente habilitada (
enabled: true). - Muestra cuántas filas procesaría.
- No escribe archivos.
- Lee
npm run data:sync- Descarga los CSV desde Google Sheets.
- Aplica la transformación configurada.
- Sobrescribe los JSON destino en
public/data/....
- El sitio se actualiza al recargar localmente (
npm run dev) o después de hacer commit + deploy. - Si una fuente falla (permisos,
gidincorrecto o columnas distintas), esa fuente no se actualiza.
Cómo funciona:
- Configuras cada fuente en
scripts/data-sources.config.json. - Marcas
enabled: trueen las fuentes que quieres actualizar. - El script descarga CSV de Google Sheets y transforma al formato esperado por cada sección.
- Escribe el JSON en
public/data/....
Requisitos de Google Sheets:
- La hoja debe estar compartida como “Cualquier persona con el enlace” (al menos lectura).
- Debes indicar en cada fuente:
spreadsheetIdgid- o
csvUrldirecto
Tipos de transformación soportados:
array: salida como arreglo JSON.sheet-wrapper: salida tipo{ source_file, sheets: { Hoja1: [...] } }.scope-data-wrapper: salida tipo{ source_file, scope, data: [...] }.entity-enriched: salida enriquecida para Entidad (entidades,variables,values,data).
Ejemplo mínimo de fuente:
{
"id": "participacion-global",
"enabled": true,
"source": {
"spreadsheetId": "TU_SPREADSHEET_ID",
"gid": "0"
},
"transform": {
"type": "array"
},
"output": "public/data/dashboard-nacional/participacion_economica_mujeres_por_pais.json"
}El proyecto ya incluye vercel.json:
buildCommand:npm run buildoutputDirectory:dist
Pasos:
- Push a GitHub.
- Importar repo en Vercel.
- Deploy (Vercel detecta Vite automáticamente).
npm run buildsin errores.- Verificar que los JSON estén en
public/data/.... - Confirmar cambios en
assets/js/app.jsyassets/css/styles.css. - No editar manualmente
dist/.