Bygga
Type the product name from the box. Bygga shows every assembly step in 3D, with the parts, screws and tools for each one, and reads it out loud.
翻譯準備中
尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
Ríos y Clima del Chaco: alertas del SMN, lluvia, ríos Paraná, Paraguay y Bermejo y El Niño para los 70 municipios del Chaco
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Sitio que junta en un solo lugar las alertas oficiales del SMN, la lluvia (prevista y medida en estaciones), la altura y el pronóstico de los ríos Paraná (Barranqueras), Paraguay (Puerto Bermejo; pronóstico en Formosa y Puerto Pilcomayo) y Bermejo (El Colorado) y el estado de El Niño, explicados en lenguaje sencillo para los 70 municipios del Chaco.
Sitio publicado: https://panel-alertas-chaco.netlify.app/
Antes se llamó "Alerta Niño Chaco" y "Tiempo y Ríos del Chaco".
Es un sitio informativo. No reemplaza los alertas oficiales del Servicio Meteorológico Nacional ni de Defensa Civil.
SMN (canal CAP) ─┐
INA (ríos, Yacyretá, pronósticos y lluvia medida) ─┤
├─> Script de Google (cada hora) ──> dirección pública (JSON) ─┐ (respaldo)
NOAA (índice ONI) ─┘ │ │ copia ├─> index.html
└─ lanza ─> Robot en GitHub ─> rama "datos" ─────────┘
Open-Meteo (lluvia) ────────────────────────┘ (lluvia.json, grilla.json, servidor.json, pacifico.json y .jpg)
NASA GIBS (Pacífico, cada 7 días) ──> Robot ──┘
NASA GIBS (satélite GOES-East) ──────────────────────────────────────────────────> index.html (mapa animado)
Script de Google (apps-script/): cada hora lee las alertas del SMN, se queda con las que tocan al Chaco y guarda además una copia de los ríos (Paraná, Paraguay y Bermejo), los pronósticos del INA para el Paraná y el Paraguay, la lluvia medida en estaciones, lo que suelta la represa de Yacyretá y el ONI. Publica todo como JSON.
Robot de la lluvia (robot/lluvia.js, tarea .github/workflows/lluvia.yml): Open-Meteo rechaza muchos de los pedidos que salen de Google (contesta "HTTP 429": demasiados pedidos), así que la lluvia la pide GitHub y la deja en lluvia.json, en la rama datos. Desde el 23/10/2026, en la misma consulta pide también la temperatura máxima y mínima y el tipo de tiempo de cada día (tmax, tmin, cod en lluvia.json; urlTiempo suma esas variables a la dirección del script, que no cambia). La copia del script (servidor.json) no los trae. El script de Google lo lanza en cada renovación; el horario propio de GitHub queda de respaldo. El script igual sigue pidiendo la lluvia a Open-Meteo: algunas horas le contesta, y esa copia queda en servidor.json como respaldo (la página la usa solo si la del robot falta o tiene más de 2 horas, o si es la más nueva que hay: copia, copiaVieja). Los "HTTP 429" que aparecen en errores son normales.
Copia del script (robot/servidor.js, en la misma tarea): baja la respuesta del script de Google y la deja tal cual en servidor.json, en la rama datos. Solo la guarda si está completa y es más nueva que la anterior; si no, queda la anterior. El script lanza el robot después de guardar, así la copia sale con lo recién leído. GitHub entrega esa copia a muchas visitas a la vez: así ni el script ni las fuentes reciben un pedido por cada visita. Si la copia que queda tiene más de 6 horas (AVISO_H), el script de Google puede haberse detenido: después de guardar, la corrida termina con error ("Avisar si el script de Google lleva más de 6 horas sin renovar") y GitHub manda el aviso de corrida fallida por correo. Sin esto nadie se enteraba: el robot copiaba lo mismo y terminaba bien, y el correo de la lluvia lo manda el propio script.
Grilla del mapa animado (robot/grilla.js, en la misma tarea, después de la lluvia): lluvia, nubosidad y tormentas previstas hora por hora para ayer, hoy y mañana, en 208 puntos cada 0,5° (el Chaco y unos 100 km alrededor). Se renueva cada 3 horas como mucho, para cuidar el límite gratuito de Open-Meteo. Si falla, no insiste, queda la anterior y la lluvia se guarda igual.
Imagen del Pacífico (robot/pacifico.js, en la misma tarea): cada 7 días (CADA_D) baja de la NASA (GIBS) la temperatura del mar comparada con lo normal (GHRSST MUR, 870 × 390, unos 90 KB), la misma que pedía antes cada navegador, y la deja en pacifico.jpg con su fecha en pacifico.json. Como la NASA publica con 1 o 2 días de atraso y un día sin publicar devuelve una imagen transparente, primero pide un pedacito de 4 × 2 puntos en medio del Pacífico y mira si tiene algo (ayer, anteayer… hasta 4 días; lee el PNG con zlib, sin librerías). Si la NASA falla, queda la imagen anterior con error e intento, y reintenta a las 6 horas. La tarea baja los dos archivos anteriores antes de correrlo, porque la rama datos se rehace en cada corrida.
Sitio (index.html): una sola página, sin nada que compilar. Lee primero las copias de la rama datos (servidor.json y lluvia.json); el script de Google queda de respaldo, solo si servidor.json falta o tiene más de 2 horas (leerCopias). La página nunca consulta las fuentes (INA, SMN, Open-Meteo, NOAA): con muchas visitas a la vez podrían bloquear o caerse. La imagen del Pacífico (El Niño) se lee de la copia del robot (pacifico.json y pacifico.jpg?d=<fecha>); solo si falta, no carga o tiene más de 21 días (PAC_MAX_D: el robot se detuvo) se pide a la NASA como antes. Todo eso se busca recién cuando la página terminó de cargar, para que una NASA lenta no deje la pestaña "cargando" (iniciarPacifico). Si la copia es vieja, se muestra igual con su hora y los avisos de siempre (franja "Datos del . Todavía no llegaron más nuevos." o, con más de 36 horas, "Atención: estos datos no son de hoy", y entonces la lluvia no se usa para el color; aviso del SMN sin renovar a las 3 horas). Recién pasada la medianoche, la copia de lluvia del día anterior con menos de 2 horas no muestra la franja (cambioDia): el semáforo se calcula con su día hasta la corrida siguiente, cerca de la 1. Solo las imágenes del satélite (y la del Pacífico si falta su copia) se piden a la NASA desde cada navegador. Lo último que funcionó queda guardado en el dispositivo. Seis secciones se pueden cerrar tocando el título (plegable; todas empiezan cerradas, con data-cerrada: Paraguay y Bermejo, Lluvias, Lluvia hora por hora, El Niño, De dónde salen los datos y Acerca); el botón "Mostrar" va relleno con el degradado violeta-rosa del portal ("Ocultar", con borde, cuando está abierta) y, cerrada, una línea debajo del título dice qué hay adentro (data-pista) y se ve el comienzo del contenido, que se desvanece, con "Mostrar todo" debajo (.vista, contenido inert; tocar la sección la abre); lo que cierra cada persona queda en su navegador (anc-plegadas). El mapa, las alertas, "Qué hacer", el riesgo por localidad y el Paraná no se pueden cerrar. Con su sección cerrada no se bajan la imagen del Pacífico ni las del satélite. El pronóstico por hora (grilla.json, unos 11 KB) se pide recién cuando "Lluvia hora por hora" está a unos 2500 px de la pantalla, cuando se abre o cuando un enlace lleva a ella (iniciarGrilla, desde el 24/10/2026; dentro del portal, con lo que el portal avisa de su pantalla, A.cercaPortal); con la sección cerrada, su vista previa se dibuja cuando el teléfono queda libre (pintarAnimPronto) y no al mismo tiempo que los demás datos. Quien mira solo lo de arriba no lo baja ni lo dibuja. La conexión con GitHub, donde están las copias de los datos, se abre mientras baja la página (), así los datos llegan antes.
Detalle de un municipio en el mapa (pintarInfo, desde el 23/10/2026; desde el 4/11/2026 es una tarjeta azul marino, #mInfo.tarj): nombre en grande; el color del mapa ("Rojo en el mapa") y, en cuadritos, de dónde sale (porQue: la lluvia, la alerta del SMN cuando sube el color y, en los municipios de la costa, el Paraná con el techo de cada uno; los mismos datos que colorDe); el renglón del SMN; tarjetas de hoy y los 2 días siguientes (DIAS_TARJ, los días de las alertas del SMN) con el día, el ícono y la palabra del tiempo, la máxima, la mínima y los mm de lluvia (diasInfo, con la misma lluvia que usa el color; ícono icoDia: con 1 mm o más manda la lluvia, ⛈️ tormenta, 🌦️ 1 a 9 mm, 🌧️ 10 o más; con menos, el cielo de Open-Meteo: ☀️, 🌤️, ⛅, ☁️, 🌫️; el ícono, el fenómeno y el nivel de la alerta del SMN si la hay ese día, con su color; si la copia no trae temperaturas, solo la lluvia); debajo, el enlace "¿A qué hora llueve? ↓" (desde el 4/11/2026; antes "Ver a qué hora llueve hoy y mañana ↓") a "Lluvia hora por hora" (a.aHora; en las 6 localidades y el Gran Resistencia deja elegida la localidad en "Lluvia en"; en los demás municipios, "Todo el Chaco"); después el color con su explicación, el río y la lluvia medida, cortados con un desvanecido y el botón "Seguir leyendo" (.mDet). Hoy va en una tarjeta ancha y los 2 días siguientes debajo, cada uno en un renglón (ícono, día, máxima / mínima, mm). Los cuadritos son píldoras; sin alertas confirmadas del SMN va la píldora "SMN: Sin alertas" en lugar del renglón del SMN, y la superficie va dentro de "Seguir leyendo". La lista del filtro de color y el aviso al tocar un río quedan como antes, sin tarjeta azul. La sección del SMN también enlaza a "Lluvia hora por hora" cuando hay alerta por tormentas o lluvias.
Informar sin alarmar (revisión del 15/10/2026): cuando el Paraná sale del verde, la franja del río, el renglón del semáforo, la tarjeta "Crecida del río" y el detalle de Barranqueras, Puerto Vilelas y Resistencia agregan que dentro de las defensas del Gran Resistencia el agua del río queda afuera y que igual valen los avisos oficiales (DEFENSAS; hasta el 17/10 decía "no hace falta hacer nada"; en la franja del río va en corto, DEFENSAS_CORTA; desde el 20/10, pedido de Mariano, ya no se repite en "Ahora en el Chaco"); los renglones de los ríos llevan un ícono de agua (≈) en lugar de signos de exclamación; el cartel "Este sitio es informativo" va en violeta claro (.aviso.info), no en un color del semáforo; El Niño aclara que es una tendencia de la temporada, no un aviso. En el gráfico del Paraná, las defensas (NIVEL.defensa, 9,50 m) van como una marca arriba del gráfico mientras el río y el pronóstico están debajo de 8 m, para no aplastar la escala; desde 8 m pasan a ser una línea dentro del gráfico, con su renglón en la leyenda.
"Qué hacer ante una alerta": arriba, "Ahora en el Chaco" (hacerHoy, pintarHacer) junta lo que rige —alertas del SMN de hoy en adelante y Paraná o Paraguay fuera del verde— con un botón "Qué hacer" que abre su tarjeta. Desde el 20/10/2026 (pedido de Mariano) el renglón de cada alerta del SMN es corto, solo el fenómeno y el día ("Tormentas, mañana"), porque la sección del SMN, justo arriba, ya dice el color, el granizo o las ráfagas y los municipios; el recuadro lleva el color más alto y la tarjeta, su etiqueta ("Alerta amarilla"). Los renglones van uno al lado del otro cuando entran (cada uno pide unos 340 px: en la computadora, también dentro del portal) y uno debajo del otro en el celular. Sin informe del SMN al día no dice que no hay alertas, y el naranja del Paraná se nombra "según el pronóstico del INA". Teléfonos como botones tel: (911, 100, 107, Defensa Civil y SECHEEP 0800-7777-589), más un botón al WhatsApp oficial de SECHEEP (wa.me/5493644377044, 364-4377044, publicado en secheep.gob.ar; ícono de globito verde, clase hWa); en el celular van de a tres y los largos ocupan el renglón entero, desde 600 px en dos filas de tres; el de Defensa Civil llama solo al número principal y el texto pide el interno 103, porque agregar el interno al enlace no funciona en los celulares. Nueve tarjetas <details name="hacer"> (una abierta por vez; todas empiezan cerradas, las que rigen marcadas con su color y etiqueta, y ninguna se abre sola): tormenta, viento y granizo, lluvia fuerte, crecida del río, cuando baja el agua, calor, frío, niebla/humo/polvo y mochila; la del río (a la que llevan el Paraná y el Paraguay fuera del verde) empieza diciendo que dentro de las defensas el agua del río queda afuera y que igual valen los avisos oficiales; cada fenómeno del SMN tiene su tarjeta (HACER_EV, una prueba lo controla). La mochila se tilda y queda en el navegador (anc-mochila). Textos resumidos del SINAGIR, el Ministerio de Salud y la Agencia Nacional de Seguridad Vial, con enlaces al pie de la sección, escritos para la gente de la costa y de los barrios: palabras de todos los días, cosas que hay en cualquier casa (sin compras especiales) y situaciones del Chaco (moto, pesca, animales, brasero, garrafa, pozo ciego).
Instalar app (instalarApp, manifest.webmanifest): el sitio se puede poner como una app más en la pantalla del celular o de la computadora, con su ícono (degradado del portal, semáforo, sol con nube y el río en celeste) y el nombre "Ríos y Clima". En el encabezado aparece el botón "Instalar app" solo cuando el navegador lo ofrece (Android y computadora con Chrome o Edge); en iPhone y iPad Apple no deja que una página se instale sola, así que el mismo botón "Instalar app" abre (y cierra) los pasos: tocar Compartir del navegador (en Safari, en su barra o dentro de "⋯"; en Chrome, arriba al lado de la dirección), elegir "Agregar a pantalla de inicio" o "Agregar a inicio" y tocar "Agregar" (pasosIos; con Chrome, Edge o Firefox en un iOS anterior a 16.4 agrega primero "Abrí esta página en Safari"). Una línea aclara que es el Compartir del navegador, no el del sitio. No se ve dentro del portal, al imprimir, ni si el sitio ya se abrió desde el ícono; desde el 20/10, tampoco en la computadora (pantalla con mouse: @media (hover:hover) and (pointer:fine)), solo en celulares y tablets. Dentro del portal el teléfono no deja instalar desde el marco (instalaría el portal), así que en celulares y tablets el enlace del encabezado dice "Instalar app" (con el ícono) y abre el sitio en una pestaña nueva con ?instalar=1; en la computadora no hay enlace (desde el 20/10/2026). Al llegar así (instalarApp), la dirección se limpia sola; en iPhone y iPad los pasos ya aparecen abiertos; en Android el botón "Instalar app" queda resaltado y con un toque pregunta el teléfono (el navegador no deja que la pregunta salga sin un toque en la misma página), y si en 5 segundos el navegador no lo ofrece (ya instalada, o un navegador que no avisa), una línea explica dónde buscar el ícono o cómo instalar desde el menú ⋮ (#instAviso). No guarda el sitio en el celular (no hay service worker): la app abre siempre la página publicada, con sus datos y avisos de siempre. Sin señal, el teléfono muestra su aviso de que no hay conexión, igual que el navegador; con señal, si una fuente no responde, se muestra lo último guardado de esa fuente. En la app de Google Play (ver "App en Google Play") el botón "Instalar app" no aparece (desdePlay). Con la página a la vista, los datos se renuevan cada 30 minutos (renovar); al volver a la app o a la pestaña, si pasaron más de 10 minutos se renuevan los datos, y si estuvo guardada más de 6 horas o cambió el día se vuelve a abrir entera, con la última versión del sitio (alVolver, desde el 20/10/2026; también al volver con Atrás, pageshow). Dentro del portal no se recarga. No manda avisos ni pide permisos.
Compartir (compartirSitio, cajaCab): botón "Compartir" en el encabezado, al lado de "Instalar app", para pasar la dirección del sitio con la frase "Ríos y Clima del Chaco: alertas del SMN, lluvia y altura de los ríos." En el celular (pantalla táctil con navigator.share) abre el menú de compartir del teléfono, que ya trae WhatsApp, Facebook, mensajes, etc. En la computadora muestra "Enviar por WhatsApp" (enlace https://wa.me/?text=…) y "Copiar enlace". No manda nada solo: elige la persona. La dirección es la del sitio donde se abrió (dirSitio), así sigue sirviendo si cambia el dominio. Se ve también en la app instalada (no tiene barra de dirección); no se ve dentro del portal, al imprimir ni, desde el 20/10, en la computadora (igual que "Instalar app"). No necesita cambios en la regla del navegador. La vista previa que muestran las redes es compartir.png (1200 × 630, aspecto del portal), dibujada por herramientas/compartir.py.
Contador de visitas (contador, contarVisita): solo cuenta, en GoatCounter (https://riosyclimachaco.goatcounter.com, cuenta de Mariano), un contador de código abierto sin cookies que no guarda la dirección de internet. No se carga su código: la página pide una imagen de 1 píxel a …/count con lo único que hace falta para contar, qué se abrió (p), más un número al azar para que no quede en caché; sin título, sin de dónde se llegó y sin tamaño de pantalla. En el tablero, cuatro páginas: / (navegador), /desde-la-app (abierto desde el ícono), /desde-play (la app de Google Play, desde el 24/10/2026: Chrome la abre con el nombre de la app como origen, android-app://…, desdePlay) y /en-el-portal (dentro de Gobierno Abierto); y cuatro eventos: instalar-app-boton (tocó "Instalar app"), instalar-desde-portal (tocó "Instalar app" dentro del portal), app-instalada y compartir (tocó "Compartir"; no se sabe por dónde compartió). Solo cuenta en el sitio publicado (https); los navegadores automáticos van marcados como robot. La visita se cuenta cuando la página terminó de cargar (desde el 24/10/2026): antes la imagen del contador demoraba el fin de la carga y el navegador seguía mostrando que cargaba hasta que respondía GoatCounter. Lo que el navegador manda siempre (dirección de internet y tipo de navegador) GoatCounter lo usa en memoria para no contar dos veces la misma visita; en su configuración se apaga lo que no hace falta guardar (navegador, sistema, país, idioma, pantalla, de dónde se llegó).
Avisos al celular (desde el 5/11/2026, en prueba: el botón se ve solo en la app de Google Play o con el enlace ?avisos=1, AVISOS_TODOS=false): en la ventana "Tu localidad" (#dLoc, avPintar) se puede pedir un aviso al celular cuando el SMN pone una alerta naranja o roja para esa localidad, con una casilla: "También las alertas amarillas". Solo en celulares y tablets, nunca en la computadora ni dentro del portal; en iPhone, solo con el sitio agregado a inicio (iOS 16.4 o más). Los manda Firebase Cloud Messaging (proyecto rios-y-clima-chaco) con temas: cada celular queda en uno solo, m<n> (naranja y roja) o m<n>a (también amarillas), con n = número del municipio. La página carga la biblioteca de Firebase (copia fija en firebase/, versión 12.19.0) solo al tocar "Avisarme" o "Dejar de avisarme", registra avisos-sw.js (un service worker solo para mostrar avisos: alcance propio /avisos-sw/, sin fetch, no guarda páginas), pide el identificador a Firebase y se lo pasa al script de Google (doPost), que lo anota en el tema con la API nueva de Firebase (registrations/…/topicSubscriptions; nunca Instance ID, que cierra el 29/9/2027). En el celular queda solo la localidad y las opciones (anc-avisos), no el identificador; una vez por semana la página confirma la anotación (avRenovar). En cada renovación, el script compara las alertas (las mismas que el mapa, hoy y los 2 días siguientes) con lo ya avisado y avisa lo nuevo o lo que sube de nivel (decidirAvisos). De noche (22 a 7 h) salen en el momento solo las alertas que rigen hoy o empiezan a la mañana siguiente antes del mediodía (franjas de 0 a 6 y de 6 a 12 h); las demás, a las 7. Es igual para todos: no hay casilla "de noche" (decisión del 5/11/2026). La primera vez solo marca lo que ya estaba. Tocar el aviso abre el sitio (o la app) con ?loc=<n>: queda como tu localidad, se elige en el mapa y la página baja directo a su ficha (avDesdeAviso, verSec($('mInfo'))). La página aclara que los avisos pueden demorar hasta una hora y que no reemplazan al SMN ni a Defensa Civil. Cómo se ve el aviso (textoAviso): el título empieza con un circulito del color del SMN (🟡 🟠 🔴) y el dibujito del fenómeno, los mismos del sitio (EV_ICO = SMN_ICO): "🟠⛈️ Alerta naranja por tormentas en Barranqueras"; con varias alertas, "🔴 Alertas del SMN en …" y un renglón con su dibujito por alerta. Ícono grande: el de la app; en la barra de arriba, . Cada aviso queda aparte en la lista del teléfono (sin , decisión del 5/11/2026): uno nuevo no tapa a uno anterior que sigue vigente. El color es solo el nivel de la alerta del SMN, no el del mapa (que suma lluvia y río).
Si una fuente falla, las demás siguen y se muestra el último dato bueno con su fecha y hora.
| Archivo | Para qué sirve |
|---|---|
index.html | El sitio completo: estilos, mapa y reglas. |
apps-script/alertas-smn-apps-script.gs | Script de Google. También define los centros de los municipios, que el robot reutiliza. |
apps-script/appsscript.json | Permisos del script de Google, escritos uno por uno (internet, correo, disparadores, el correo de la cuenta y Firebase Cloud Messaging). Se pega en el editor (Configuración del proyecto > Mostrar el archivo de manifiesto). |
avisos-sw.js | Service worker de los avisos al celular: muestra el aviso y, al tocarlo, abre la localidad. No intercepta pedidos ni guarda páginas. |
firebase/ | Copia fija de la biblioteca de Firebase (versión 12.19.0, licencia Apache 2.0) que usa la página para anotarse a los avisos. Ver firebase/LEEME.md. |
robot/lluvia.js | Robot de la lluvia. |
robot/grilla.js | Grilla de lluvia por hora para el mapa animado. |
robot/pacifico.js | Imagen del Pacífico (El Niño) bajada de la NASA cada 7 días (pacifico.jpg y pacifico.json). |
robot/servidor.js | Copia de la respuesta del script de Google en la rama datos (servidor.json). |
herramientas/csp.js | Pone en netlify.toml la huella del código de la página (regla del navegador). Correrlo después de cada cambio en index.html. |
herramientas/iconos.py | Dibuja los íconos de la app (iconos/) con Python y Pillow: python3 herramientas/iconos.py. Mismo dibujo que icono.svg; si se cambia uno, cambiar el otro. |
herramientas/compartir.py | Dibuja compartir.png, la vista previa del enlace en WhatsApp y otras redes (1200 × 630), con el ícono de la app y las letras de fuentes/: python3 herramientas/compartir.py (necesita Pillow, fontTools y brotli: pip install pillow fonttools brotli). Al cambiarla, subir el ?v= de og:image en index.html para que las redes no muestren la vieja. |
Hace falta Node 22 o más nuevo. No hay nada que instalar.
node pruebas/reglas.test.js
No consultan ninguna fuente. GitHub las corre solas en cada subida a main, y Netlify las corre antes de publicar (command en netlify.toml, con Node 22): si alguna falla, no publica y queda la versión anterior. Una publicación fallida no gasta créditos.
Después de cambiar index.html, correr antes node herramientas/csp.js: actualiza la huella del código en netlify.toml. Si se olvida, una prueba falla y Netlify no publica (con la huella vieja, el navegador no correría el código de la página).
Netlify publica la rama main tal cual está, después de correr las pruebas. Cada subida a main es una publicación (15 créditos), salvo que el último commit diga [skip netlify]: si una subida trae varios commits, Netlify mira solo el último. La rama datos no publica nada.
#0b3158, degradado violeta-rosa (--degrade: #5059bc → #8d58e8 → #f26df9) en el encabezado y los botones, fondo lavanda-rosado muy suave (--fondo) y tarjetas blancas redondeadas. --water (azul) queda solo para el agua: ríos del mapa y gráficos; botones y enlaces usan --acento (violeta). Los colores del semáforo y del mapa no cambian. Siempre claro (sin modo oscuro, como el portal; desde el 17/10 declara "solo claro" —<meta name="color-scheme" content="only light"> y :root{color-scheme:only light}— para que el modo oscuro automático de Chrome en Android no oscurezca los colores; Samsung Internet con su modo oscuro prendido puede oscurecerlo igual, eso lo decide el navegador): encabezado blanco con la franja del degradado arriba, texto casi negro #1d2333 con peso 500, marino solo en los títulos; lo que se toca lleva borde violeta (--borde-boton), fondo blanco que baja a lila (--fondo-boton), sombra (--sombra-boton) y un pequeño salto al tocarlo; teléfonos con ícono, tarjetas de "Qué hacer" con el dibujo en un círculo. Los íconos son SVG dentro del estilo (data:, permitido por img-src). Las etiquetas "alerta amarilla", "naranja" y "roja" (en la franja, en "Alertas oficiales del SMN" y en las tarjetas de los días) llevan el texto en un tono más oscuro del mismo color (--amarillo-txt, --naranja-txt, --rojo-txt, desde el 24/10/2026), para que se lean al sol: el amarillo de antes sobre blanco no llegaba al contraste mínimo de las pautas de accesibilidad; el borde sigue con el color de siempre. En el celular, esas etiquetas pasan "con posible granizo" y el nivel al renglón de abajo en vez de apretarlos en una columna angosta.hyphens:auto, la página es lang="es") para que en el celular no queden huecos grandes. Quedan alineados a la izquierda las franjas de arriba, los renglones de "Ahora en el Chaco" (.hHoy), el del correo de contacto y, desde el 24/10/2026, el título de cada renglón de "Riesgo por localidad" (quedaban huecos grandes, como "Resistencia y Gran"); su explicación sigue justificada.El sitio se puede mostrar dentro de una página de https://gobiernoabierto.chaco.gob.ar, en un marco. Solo el propio sitio y ese portal pueden hacerlo (frame-ancestors en netlify.toml); cualquier otra página que lo intente ve el marco vacío. Dentro del portal la página se da cuenta sola: siempre en claro, con su fondo de siempre, sin los botones "Instalar app" y "Compartir" propios; en el celular, en su lugar, un enlace "Instalar app" que abre el sitio en una pestaña nueva listo para instalar (ver "Instalar app"), y en la computadora ningún enlace. Se comunica con el portal solo para que el marco tome el alto entero (sin barra propia), para bajar a una sección y, en la computadora, para verse como el sitio original: ahí el marco ocupa la pantalla debajo del encabezado del portal y el sitio se desplaza por dentro, con el menú de la izquierda fijo; mientras el marco no llegó arriba, la rueda del mouse mueve la página del portal (PORTAL, CANAL, avisarAlto, verSec, recibirVista, ponerFijo, pasarAlPortal en index.html). Si el portal no avisa que sabe hacerlo, una columna con el alto entero, como en el celular. Esos avisos van y vienen solo con el portal. Los detalles de la instalación en el portal no se publican aquí: los tiene el responsable del sitio.
La app de Google Play es el mismo sitio, abierto por Chrome a pantalla completa (una "aplicación web de confianza", TWA). Se arma con PWABuilder (https://www.pwabuilder.com, que usa la herramienta Bubblewrap de Google) a partir de manifest.webmanifest, sin escribir código de Android. Lo que cambia en el sitio se ve en la app sin subir versiones nuevas a Play.
manifest.webmanifest, con íconos de 192 y 512 px y el "maskable"), HTTPS, política de privacidad propia (privacidad.html, que también se abre desde "Acerca de este sitio", como pide Play) y la detección de la app (desdePlay: no ofrece "Instalar app" y cuenta /desde-play).com.marianoavalos.riosyclimachaco (no se puede cambiar), creada en Play Console el 26/10/2026 con una cuenta personal..well-known/assetlinks.json (desde el 26/10/2026): une la app con el sitio. Tiene dos huellas SHA-256: la de la clave con la que Google firma la app que entrega ("Firma de apps de Play") y la de la clave de carga (la de PWABuilder, con la que se suben las versiones). Se arma con node herramientas/assetlinks.js com.marianoavalos.riosyclimachaco <huella1> <huella2>; las huellas están en Play Console → la app → Integridad de la app → Firma de apps. Sin este archivo la app funciona, pero muestra arriba la barra de dirección de Chrome. Las huellas son públicas a propósito; la clave y sus contraseñas no van nunca en el repositorio.privado/, que git no sube) y con copia.assetlinks.json tiene que estar en la dirección nueva y hay que armar y subir una versión nueva de la app con esa dirección.apps-script/alertas-smn-apps-script.gs.instalar(): hace la primera lectura y programa la renovación cada hora.SMN_URL, dentro de index.html.Cada vez que cambia el archivo .gs hay que pegarlo de nuevo en Google y crear una nueva versión de la implementación.
Sin la clave el script no lanza el robot y el resto funciona igual.
GITHUB_TOKEN.probarRobot(): tiene que decir bien.La clave tiene vencimiento. Cuando vence, la lluvia deja de renovarse cada hora: hay que crear una nueva y reemplazarla.
El script manda los avisos con su propio permiso, sin claves guardadas: está vinculado al proyecto de Google Cloud de Firebase.
Hecho el 5/11/2026 (implementación web Versión 7). Google guarda el manifiesto sin el salto de línea final: la copia del repositorio va igual, así coincide el SHA-256. Los pasos quedan para rehacerlo si hiciera falta:
rios-y-clima-chaco). En ese proyecto, la pantalla de consentimiento de OAuth tiene que estar "En producción" (en "Prueba" los permisos vencen a los 7 días y el script deja de correr solo; el cartel de "app no verificada" es normal para uso propio).apps-script/appsscript.json (todos los permisos escritos).diagnostico(), probarRobot(), probarCorreo() y probarAviso() (manda un aviso que dice "prueba" a quienes estén anotados en Resistencia).doPost queda en la misma dirección que lee el sitio).Para apagar los avisos sin tocar el código: propiedad del script AVISOS = no. Lo ya avisado queda en las propiedades av0, av1… (avn, la cantidad); los pedidos del día, en pedidos (tope TOPE_PEDIDOS, 3.000 por día, para cuidar la cuota de 20.000 pedidos diarios del script). Si Firebase rechaza los avisos, llega un correo (uno por caída) y el script reintenta en la hora siguiente.
Si la lluvia lleva más de 24 horas sin renovarse, el script manda un correo a la cuenta de Google dueña del script, una sola vez por caída, y el sitio muestra un aviso en la sección de lluvias. Para dar el permiso de enviar correo hay que ejecutar una vez probarCorreo(): Google pide autorización y llega un correo de prueba. Las horas se cambian en HORAS_AVISO.
Respuesta del script de Google:
{
"emitido": hora de emisión de la alerta más nueva,
"capturado": hora de la última lectura del canal,
"fechas": ["AAAA-MM-DD", ...] hoy y los tres días siguientes,
"areas": [0, 1, ... 69] un lugar por municipio, en el orden de GEO.mun,
"alertas": { "0": [fila, ...], ... },
"leidas": n, "fallas": n,
"ajuste": { "alineadas": n, "corridas": n, "horas": 3 | 0 } corrección de horas que se usó en esta lectura,
"robot": { "t": hora de la corrida, "estado": "bien" | "sin clave" | "GitHub respondió <número>" | "error al lanzar" },
"datos": { "rio", "paraguay", "bermejo", "prono", "pronoPy", "medida", "yacy", "oni", "errores" }
}
Cada fila de alerta es [día, fenómeno, madrugada, mañana, tarde, noche, extra]:
Cada río (rio = Paraná, paraguay, bermejo) trae obs (lista de [día, altura en m], una lectura por día: la última de ese día), hora (hora de la última lectura; en el Paraná y el Paraguay el INA pone la medianoche, que no es la hora de la medición, y el sitio muestra solo el día: debajo del número grande, "Medido ayer, jueves 22/10.", con la hora solo si es real, lecturaCorta/medidoTxt; en la letra chica, "El INA la cargó el…", lecturaTxt). Los cuadritos de cada río muestran el cambio en 1 y en 7 días, y el máximo del período solo si no es la lectura de hoy, act (cuándo la cargó el INA) y t (hora de la consulta). prono es el del Paraná en Barranqueras: emitido y p (lista de [día, mínimo, más probable, máximo]). En el gráfico del Paraná, las fechas del pronóstico posteriores a la última lectura van punteadas, con su rango como barra; llevan número el último punto y, si es más alto que hoy y no es el último, el pico previsto (rioPico).
yacy es lo que suelta la represa de Yacyretá (serie 937 del INA, en m³/s): obs (lista de [día, caudal], una lectura por día, redondeada), hora y t. El sitio muestra solo el último valor, en una cajita al costado del gráfico del Paraná (lineaYacy, .yacy, desde el 23/10; desde el 4/11, dentro de un desplegable cerrado, d-rio-yacy, cuyo título ya dice cuánto sale: "Yacyretá: sale 29.300 m³ de agua por segundo", después de los otros dos del río), en tono neutro (Mariano): título "Yacyretá", dos cuadritos (lo que sale de la represa y lo normal del mes), la fecha y que esa agua tarda unos 3 días en llegar y el INA la incluye en su pronóstico; sin gráfico propio (Mariano, 19/10). Desde 25.000 m³/s suma una frase, sin la palabra "evacuación", con que el INA considera alto ese caudal para el río junto a la represa (YACY_NIVEL: alerta 25.000, evacuación 30.000; "Yacyretá efluente" en el informe diario del INA, confirmado el 16/10/2026; la serie 937 no los trae, por eso están fijos en el código): solo dice que el INA considera alto el caudal desde 25.000 y que para la costa del Chaco valen los niveles de Barranqueras. No cambia colores. Lo normal del mes (YACY_NORMAL en index.html: mediana de las lecturas diarias de 2011 a 2025; entre 11.000 en septiembre y 13.600 en noviembre) y con la lectura de una semana antes. Que esa agua tarde unos 3 días en llegar a Barranqueras salió de comparar, de 2010 a 2026, los cambios diarios de la descarga con los del caudal en Corrientes (serie 868) y la altura en Barranqueras: la relación más fuerte se da a los 3 días. Solo informativo.
pronoPy es el pronóstico del INA para el Paraguay (calibrado 312): emitido y una lista con la misma forma que p para cada puerto que venga, formosa (serie 3127) y pilcomayo (serie 1525). Solo informativo.
medida es la lluvia medida: e, lista de [nombre, lat, lon, última lectura, mm en 24 h, mm en 3 días, avisos], una por estación con una lectura de las últimas 24 horas, de norte a sur; dudosas, lista de [nombre, motivo] de las que se descartaron; y t. Cada lectura del INA es la lluvia caída desde la lectura anterior (casi todas cada hora; algunas cada 4, 6 o 12 horas); las 24 horas y los 3 días se cuentan hacia atrás desde la última lectura de cada estación. La lista de estaciones está en MEDIDA (script de Google): las de la red SAT (sat2) con lluvia a intervalo nativo (var_id 27) en el Chaco y alrededores, sacadas de https://alerta.ina.gob.ar/a5/obs/puntual/series?var_id=27&geom=-63.7,-28.2,-58.2,-24. Se piden todas juntas en un solo pedido (observaciones?tipo=puntual&series_id=…, unos 500 KB). Comparadas el 13/10/2026 con la lluvia diaria del INA de cada estación, coincidieron en 223 de 274 días.
Controles de la lluvia medida (normMedida; "vecinas" son las estaciones a menos de 50 km, MEDIDA_VECINAS, con lecturas hasta la misma hora y que no fueron descartadas):
| Control | Qué pasa |
|---|---|
Lectura suelta mayor a 150 mm (MEDIDA_MAX), negativa o vacía | Se ignora esa lectura. |
| Marcó 0 en 3 días y al menos dos vecinas midieron 10 mm o más | Se descarta la estación (pluviómetro trabado) y va a dudosas; el sitio usa la siguiente más cercana. |
| Faltan lecturas en las últimas 24 horas (menos de 3/4 de las que suele mandar) | Aviso 1: "puede haber llovido más". |
| Midió 20 mm o más en 24 horas y todas las vecinas (al menos dos) menos de la quinta parte | Aviso 2: "puede ser una tormenta muy local o un error". No se descarta, porque las tormentas locales son reales. |
Se calibraron con enero a marzo de 2026 (unos 2.200 días-estación): la regla del 0 encontró sobre todo pluviómetros que estuvieron trabados todo el verano (Colonia Benítez midió 1 mm en el trimestre, el pluviómetro 10 de los Bajos Submeridionales, 3 mm), y el aviso 2 salió en 11 de 97 días con 20 mm o más. diagnosticoDatos() lista las estaciones con aviso y las descartadas.
lluvia.json (rama datos): { "datos": { "lluvia", "municipios", "errores" } }. Cada uno trae dias (14 fechas: 7 pasadas y 7 por venir), mm (una lista por punto) y t (hora de la consulta).
grilla.json (rama datos): { "datos": { lat0, lon0, paso, nlat, nlon, h0, n, p, nube, torm, t }, "error" }. Los puntos van fila por fila desde el norte (lat0) y de oeste a este (lon0), cada paso grados. h0 es la primera hora (hora argentina) y n la cantidad de horas (72). p[punto][hora] es la lluvia en décimas de mm, nube[punto][hora] la nubosidad en decenas de % (0 a 10) y torm la lista de [hora, punto] con tormenta prevista (código de tiempo 95 a 99). error dice por qué no se pudo renovar, si pasó.
pacifico.json (rama datos): { "fuente", "dia", "t", "img", "error", "intento" }. dia es la fecha de la imagen de la NASA (AAAA-MM-DD), t cuándo se bajó, img siempre pacifico.jpg; error e intento, solo si el último intento falló (queda la imagen anterior).
Mapa animado: las nubes de las horas pasadas son imágenes del satélite GOES-East (capa GOES-East_ABI_GeoColor del servicio GIBS de la NASA), pedidas por el navegador del visitante. La NASA tarda casi una hora en publicarlas; mientras tanto devuelve una imagen negra, que el sitio descarta (se usa la nubosidad prevista).
Desde el 20/10/2026 (pedido de Mariano):
ESCALA, también en la leyenda): débil #bfe6ff, 1 a 3 mm #6cb8f0, 3 a 7 mm #2f7fe0, 7 a 15 mm #2b3fb0, 15 mm o más #9b1fa8, más separados entre sí que antes y un poco más firmes.colorNube): el mismo gris, con la mitad de fuerza, y sin dibujar las nubes muy finitas (menos de 30 %). Las nubes del satélite de las horas pasadas no cambian.#aTira, tiraValores, pintarTira, marcarTira) debajo del mapa: una por hora, alta y del color de la escala según la lluvia más fuerte prevista en alguno de los 70 municipios (en su centro, enLugar); separa los días, marca "ahora" y la hora que muestra el mapa. Tocar una barrita lleva el mapa a esa hora. Cada barrita tiene su texto al pasar el mouse.#aLocs, #aLocTxt, elegirLoc, resumenLoc): desde el 21/10 una lista desplegable "Lluvia en" (antes, botones) con las 6 localidades; también se pueden tocar en el mapa. Dice, de la hora actual hasta la última de la grilla, en qué horas se prevé lluvia ahí (desde 0,2 mm en la hora; "de 12 a 19 h" si es seguido, "a ratos entre las 5 h y las 19 h" si no), lo más fuerte (cuánto y a qué hora) y si hay tormentas previstas en los 4 puntos de la grilla de alrededor ("Con tormentas previstas en la zona"). El mapa salta a la hora más fuerte. Tocar de nuevo la misma localidad la deselecciona.#d-anim, recordado por navegador como los otros); a la vista quedaba "No es un radar: es lo que calcula el modelo de pronóstico." (desde el 21/10 esa frase va adentro del desplegable, al principio).#aEtq) y el mapa; debajo, en un renglón, el botón ▶ redondo (aria-label "Reproducir"/"Pausa") y los días ("Ayer", "Hoy", "Mañana", sin la fecha, que ya está arriba del mapa; el botón la dice al lector de pantalla). Las barritas son el deslizador: el control de hora (#aHora) va encima de la tira, invisible (.aBarra), así que se toca o se arrastra sobre las barritas y con el teclado anda con las flechas (borde violeta al enfocarlo). Sin la aclaración de las barritas a la vista (pasa al desplegable). Leyenda de colores (ver abajo, "Barritas y leyenda"), localidades más chicas y la hora sin cero adelante ("5 h", ). En la computadora (desde 1100 px), el mapa a la izquierda y los controles a la derecha (, , ). (más tarde el 20/10, pedido de Mariano): arriba de la barrita elegida va una cajita con un reloj (aguja de la hora) y el número ("10 h"), con una puntita justo sobre la barrita; sigue a la hora mientras se reproduce o se arrastra (, , variable ), no se sale de los bordes del gráfico y se mueve sin animación si la persona pidió menos movimiento. El lector de pantalla no lo lee: la hora ya está arriba del mapa. Tocar o arrastrar sobre el reloj también cambia la hora.Lluvia (nivelLluvia, igual para las 6 localidades y los 70 municipios). "Cayó" son los 7 días anteriores a hoy; "viene" es hoy y los 6 días siguientes. Desde el 17/10/2026, el rojo mira solo hoy y los 2 días siguientes (viene3 y max3 de sumarLluvia; pedido de Mariano, porque un pronóstico a 4 o más días cambia mucho: el 17/10 La Leonesa salía en rojo por 115 mm previstos para el 23/10). El amarillo sigue mirando los 7 días. Si con los 7 días sería rojo pero lo fuerte llega en más de 3 días, el texto lo dice (ROJO_LEJOS): "por ahora queda en amarillo, y pasa a rojo si el pronóstico se mantiene cuando se acerque".
| Color | Viene (rojo: en 3 días; amarillo: en 7) | En un solo día (rojo: dentro de los 3 días) | Con lo ya caído |
|---|---|---|---|
| Rojo | 120 mm o más | 80 mm o más | cayeron 100 y vienen 70 |
| Amarillo | 70 mm o más | 45 mm o más | cayó + viene suman 120 |
Alerta del SMN: es un piso. Amarilla o naranja → al menos amarillo; roja → rojo.
Amarillo del mapa (desde el 17/10/2026; pedido de Mariano): los municipios, los puntos de las localidades y la muestra de la leyenda usan --amarillo-mapa (#f0c419), más claro que el --amarillo del resto del sitio (#d99a00), porque con la transparencia del mapa el amarillo oscuro se parecía al naranja. Letras, bordes y el semáforo siguen con --amarillo, que se lee mejor sobre blanco.
Cómo se muestra el semáforo (pintarSemaforo): primero los renglones en rojo, naranja (solo el Paraná), amarillo y gris, con su explicación; las localidades y zonas ribereñas en verde van juntas en un solo renglón, con un botón por nombre que abre su detalle. Si todo está en verde, ese renglón dice "Todo en verde". Los renglones de color llevan el botón "Ver en el mapa" (localidades) o "Ver el río" (zonas ribereñas), desde el 20/10/2026 con la misma forma que los nombres de "En verde": redondeado, con borde, ícono (📍, 🌊, 🏞️) y 40 px de alto (.vermapa). Todo el renglón se puede tocar.
Franja del río arriba de todo (pintarRioBanda, #rioBanda; desde el 18/10/2026, pedido de Mariano): cuando el renglón del Paraná o del Paraguay sale del verde (desde amarillo), debajo del cartel "Este sitio es informativo" y antes del mapa aparece una franja con el color del renglón, con el mismo aspecto que la del SMN. Dice el título como en "Ahora en el Chaco" (rioTit: "Río Paraná en rojo", "Río Paraná: naranja según el pronóstico del INA"…), la zona (RIO_ZONA), el mismo texto del renglón y, en el Paraná, lo que prevé el INA si está más alto que hoy y el renglón no lo dice, más la frase de las defensas en corto (DEFENSAS_CORTA: "Dentro de las defensas del Gran Resistencia el agua del río queda afuera. Seguí los avisos oficiales."). Lleva "Qué hacer" (abre la tarjeta de la crecida) y "Ver el río". No dice "alerta": los colores salen del INA y las alertas del río las declaran la APA y el Gobierno. Si también está la franja del SMN, va primero la más grave (ordenBandas; si son iguales, la del SMN). Como la del SMN, aparece cuando corre el código o llegan los datos, así que mientras está, la página baja un poco al cargar. Desde el 19/10/2026 es más corta, en tres renglones: "≈ Río Paraná en rojo · 6,80 m en Barranqueras (evacuación: 6,50 m)" (rioDato: altura de hoy con el nivel que importa y, solo si el color sale del pronóstico, lo que prevé el INA), la zona con DEFENSAS_CORTA ("Dentro de las defensas el agua queda afuera; seguí los avisos oficiales.") y los botones; el texto completo del renglón ya no se repite en la franja. Desde el 24/10/2026 la altura de hoy va destacada: más grande y en negrita, sin color de alarma (.rbAlt, en rioDato; también la del Paraguay). El texto no cambia, así el menú de la computadora la sigue leyendo (marcasLado).
Solo informativos (no cambian ningún color): la lluvia medida en estaciones (detalle de cada municipio: la estación más cercana a su centro, o a la ciudad en las 6 localidades del semáforo, a menos de 50 km y con datos de las últimas 24 horas; MEDIDA_KM, MEDIDA_H) y el pronóstico del Paraguay en Formosa y Puerto Pilcomayo (aviso si el máximo del rango llega a menos de 50 cm de su nivel de alerta, o lo supera; no se usa si tiene más de 7 días).
Teléfonos dentro del portal (desde el 21/10/2026): con el marco del portal, abrir tel: desde adentro no anda en todos los celulares, aun con allow-top-navigation-to-custom-protocols. telDesdePortal (solo con EMB) pone target="_blank" en el enlace tel: tocado, para que se abra como ventana nueva (allow-popups-to-escape-sandbox).
Teléfonos por municipio: se probaron el 21/10/2026 (Resistencia y Barranqueras en el detalle del municipio) y se sacaron el mismo día a pedido de Mariano. Solo quedan los teléfonos de toda la provincia en "Teléfonos".
Tu localidad (desde el 21/10/2026, pedido de Mariano): elegir guarda el nombre del último municipio elegido en localStorage (anc-mi-localidad, guardarMiLoc). Al abrir, pintarMiLoc (desde colorearMapa) muestra #miLoc arriba del índice: "📍 Tu localidad: X", su color (colorDe), "Ver en el mapa" y ✕ (olvidar). Si al abrir no había ninguna guardada (MILOC=false), no aparece en esa visita. Se ve también en el portal; no al imprimir. No usa el GPS ni manda nada.
Secciones de arriba más cortas (desde el 19/10/2026, pedido de Mariano): lo principal a la vista y el detalle en desplegables (details.det). El cartel informativo va en una línea (.aviso[data-corto]: "Sitio informativo: no reemplaza las alertas del SMN ni los avisos oficiales. Emergencias: 911 · Más teléfonos · Alertas oficiales del SMN") y nunca se esconde. En el mapa, la leyenda son botones cortos, pegados debajo del mapa y antes del detalle (desde el 21/10: así una lista larga de municipios de un color no los empuja hacia abajo); los significados y el párrafo de la costa del Paraná están en "¿Qué significa cada color?" (#d-colores). En el celular (menos de 600 px, desde el 24/10/2026) los botones van chicos y en un renglón, y "Sin datos" se esconde si ningún municipio está en gris (.leyenda.sinGris); la etiqueta del SMN del detalle (#mInfo .smnChip) también va más chica, para que al tocar un municipio se vean las tarjetas del clima. En las alertas del SMN, cada fenómeno muestra su color más alto, los días y cuántos municipios; los horarios y la lista de municipios, en "Ver horarios y municipios" (lo abre "Ver días y horarios" de la franja; SMN_ABIERTOS los mantiene abiertos al repintar). En "Qué hacer", los colores del SMN y las fuentes están en "Más información" (#d-hacer-mas). Cada navegador recuerda qué abrió (anc-desplegables, iniciarDesplegables); al imprimir se abren todos.
Portada del celular (desde el 4/11/2026, pedido de Mariano: llegar rápido a cada sección): en pantallas de menos de 600 px, fuera del portal y sin imprimir, arriba de todo va una grilla de 3 por renglón (#portada, pintarPortada, pT) con un recuadro chico por sección: ícono, nombre y un solo dato del momento; tocarlo lleva a la sección (y la abre si está cerrada). Entra en una pantalla (unos 430 px a 360 px de ancho). Ahí reemplaza la franja del río, "Tu localidad" y el índice "Ir a:" (los esconde el CSS; la franja del SMN y el resto de la página siguen igual). Recuadros, con los mismos destinos del índice más tu localidad: Río Paraná (altura y flecha si cambió más de 5 cm en 3 días), Mapa (cuántos municipios hay del color más alto), Alertas del SMN (ninguna o el nivel más alto; "Sin confirmar", "Sin renovar" o "Sin informe" con los criterios de la sección), tu localidad (la guardada o Resistencia, con la lluvia de hoy de la misma fuente que el detalle del mapa; tocarla la elige en el mapa), Qué hacer, Teléfonos, Riesgo en 6 ciudades (un puntito por ciudad con su color del semáforo), Lluvias (lo más que se espera en 7 días entre las 6 localidades), Lluvia por hora, Paraguay y Bermejo (altura del Paraguay), El Niño (dice "Datos", pedido de Mariano) y Datos y Acerca. Arriba, "El Chaco hoy" con el día. Cada ícono va en un cuadradito de color suave (celeste en los ríos); Teléfonos lleva el teléfono en un cuadradito verde (fondo blanco como los demás; antes azul marino, que no resaltaba). Al tocar un recuadro se achica, se abre un brillo desde el centro y el ícono salta; al abrir, los recuadros entran uno detrás de otro solo la primera vez (pQuieta); sin movimientos con prefers-reduced-motion. Transiciones leves (4/11/2026): deslizar(el,h0) anima el alto de los desplegables (abrirSec con un toque) y de "Seguir leyendo"; .cambia hace un fundido de la tarjeta del municipio al elegir otro; los enlaces de la portada bajan con verSec (deslizando) y dejan el # en la dirección; :active achica todos los botones; abreSuave en los details abiertos. Todo apagado con conMov() falso o prefers-reduced-motion. Mejoras del 4/11/2026: hora de los datos debajo del día (pAct, con D.lluvia.t; más de 3 h en naranja); barrita de carga pCargando en lugar de "…"; botón "Letra" (#btnLetra, clase grande en <html>: font-size:112.5%, guardado en anc-letra y aplicado antes de dibujar); botón "Actualizar" solo en la app (#btnActualizar, llama a renovar); el recuadro de tu localidad abre (ventana con "Ver en el mapa" y lista con buscador que guarda la localidad; sin , va al mapa como antes. Desde el 5/11/2026 el título y la ✕ quedan fijos arriba, abre siempre desde arriba y lo de abajo se corre dentro de ; la lista tiene borde y sombras que muestran que sigue, y se corre sola hasta la localidad elegida sin mover la ventana. Con el bloque de avisos visible (clase ), va en dos partes: mapa, avisos y "Elegir otra localidad ›"; ese botón pasa al buscador con la lista a todo lo alto (clase , título "Otra localidad", botón "‹" para volver)). muestra los botones (no en el portal) y los cuenta. Fuera del verde, el recuadro lleva borde, fondo e ícono de ese color (y el color dicho para lectores de pantalla). Al elegir otra localidad en el mapa, la portada la muestra. Íconos y textos centrados. Con una alerta del SMN, el recuadro dice "Alerta del SMN" con el nivel ("Amarilla", "Naranja", "Roja") y toma ese color. Todos los recuadros tienen el mismo alto () y el dato va en un renglón. En el celular, el cartel de arriba queda en una frase ("Sitio informativo: no reemplaza las alertas del SMN ni los avisos oficiales."): los teléfonos y el enlace al SMN () se esconden porque ya están en la portada. El Paraná va primero si salió del verde; si no, el mapa. No calcula nada propio. "↑ Índice" sube hasta la portada cuando es la que se ve.
Navegación (desde el 19/10/2026; pedido de Mariano tras la revisión de navegabilidad): en el celular la página mide unas 10 pantallas, así que debajo de las franjas y arriba del mapa hay un índice (#indice, "Ir a:" con botones a Mapa, Alertas del SMN, Qué hacer, Teléfonos (#t-tel, el bloque de los números dentro de "Qué hacer"), Por localidad, Río Paraná, Otros ríos, Lluvias, Lluvia por hora (#t-anim, desde el 20/10), El Niño y Datos y Acerca (lleva a "De dónde salen los datos", #t-fuentes, que está justo antes de Acerca; desde el 20/10); abren la sección si está cerrada). Cuando el índice quedó arriba fuera de la pantalla aparece en la esquina el botón "↑ Índice" (#aIndice, botonIndice); desde el 24/10/2026, para que no tape lo que se está leyendo, se esconde mientras se baja y vuelve al subir un poco (24 px), después de un salto (enlaces, botones que llevan a una sección, Atrás; SALTO, que termina en cuanto la persona toca la pantalla, gira la rueda o usa el teclado) y al llegar al final de la página. Los saltos con botón ("↑ Volver al mapa", "Ver en el mapa" del semáforo, las etiquetas de los ríos, "Qué hacer") dejan una marca en el historial (marcarSalto), como los enlaces: el botón Atrás del celular vuelve adonde estaba la persona en lugar de salir del sitio. Al buscar un municipio, la página baja hasta el mapa y se cierra el teclado, para que se vea el resultado. Las acciones de las franjas ("Qué hacer", "Ver el río", "Ver días y horarios") son botones de 44 px (.bBtn). En el portal no se ven el índice ni "↑ Índice" ni se tocan el historial; al imprimir tampoco.
Disposición en el celular (desde el 24/10/2026, pedido de Mariano; menos de 600 px de ancho): encabezado más bajo, con el nombre en un renglón (205 → 142 px en un teléfono de 360 px); índice más apretado (botones de 36 px; 224 → 159 px); tarjetas de "¿Qué está pasando?" en renglones, con el dibujo a la izquierda y el nombre al lado (desde 360 px: en pantallas más angostas no entran y quedan como antes; abiertas, igual que antes; 659 → 406 px); vista previa de las secciones cerradas de 5 rem en lugar de 7,5 (1.670 → 1.430 px). Al tocar un municipio con el dedo, si las tarjetas del clima quedaron debajo de la pantalla, la página baja lo justo para verlas enteras, sin tapar más de un tercio del mapa (asomarTarjetas, solo al elegir, no al quitar). En el portal se lo pide al portal (pasarAlPortal, con lo que el portal avisa de su pantalla: VISTA); con el mouse, o en la computadora dentro del portal (FIJO), no se mueve. En total, de unos 8.200 a 7.580 px en un teléfono de 360 px. En la tablet y la computadora no cambia nada.
Computadora (desde 1100 px de ancho, desde el 19/10/2026): una columna fija a la izquierda (el encabezado .cab, de 236 px) junta el nombre del sitio y el índice lateral (#lado, "En esta página", los mismos 11 destinos; "Teléfonos" se marca desde donde empiezan los números), que marca en violeta la sección que está en la pantalla (indiceLateral, aria-current) y lleva un punto de color al lado de "Alertas del SMN", "Río Paraná" y "Otros ríos" cuando sus franjas están a la vista (marcasLado, con el mismo color de la franja) y un renglón corto con el estado (.ladoSub: "Alerta amarilla · miércoles 21/10", "En rojo · 6,80 m"). La columna ocupa el alto de la pantalla: ícono por destino (.ladoIco), la sección actual con el degradé, barrita de avance (#ladoProg) y al pie "↑ Arriba" (desde el 20/10 sin el botón del 911, que está en el cartel de arriba y en "Teléfonos", al que también llevan el menú y "Más teléfonos": #t-tel) (.ladoPie, #ladoArriba); en pantallas bajas se achica (hasta 740 px de alto, renglones de 2 px de margen: con 11 destinos entra entero desde 560 px, y en el portal desde 480). En esa pantalla no se ven el índice de arriba ni "↑ Índice". La página llega a 1.320 px (contenido de unos 1.030): las dos franjas de arriba (SMN y río) van una al lado de la otra; el mapa a la izquierda y su detalle, la leyenda y "¿Qué significa cada color?" a la derecha; el gráfico del río a la izquierda (640 px) y a su derecha Yacyretá, Hidroalerta Vilelas y las fuentes (.rioCuerpo, .rioGraf, .rioLado, que en el celular no cambian nada: display:contents); los teléfonos y las tarjetas de "¿Qué está pasando?" en 5 columnas (las tarjetas en dos filas); las secciones cerradas van de a dos y la que se abre pasa a lo ancho (acomodarPlegables; una que quedaría sola también va a lo ancho, y al abrir o cerrar con un toque la pantalla sigue a la sección); los párrafos quedan en unos 88 caracteres por renglón. En el celular, la tablet, el portal y al imprimir no cambia nada.
Tocar un río en el mapa (desde el 17/10/2026; pedido de Mariano): la página no salta sola a la sección del río. En el celular, si a menos de unos 8 píxeles del toque hay un municipio, se elige el municipio (munCerca); si no, el río queda marcado y el cuadro de abajo del mapa dice cuál es, con el botón "Ver el río … ↓" para ir a su altura (verRio). Con el mouse, tocar la franja del río muestra ese mismo cuadro. Para ir al río a propósito hay etiquetas azules afuera de la provincia ("Río Paraná ↓", "Río Paraguay ↓", "Río Bermejo ↓"; .rioChip, del tamaño de los nombres de los municipios, con zona de toque más grande; lugar en RCHIP): tocarlas lleva directo a la sección del río. Las secciones del Paraná y de "Ríos Paraguay y Bermejo" tienen arriba a la derecha el botón "↑ Volver al mapa" (data-volver; en la del Paraguay, debajo del botón Ocultar, y solo con la sección abierta: cerrada quedaba en la vista previa, donde no se puede tocar). Para que entren, el mapa es un poco más alto (BASE.h 496 en lugar de 474). El lugar del mapa queda reservado desde el principio con aspect-ratio:530/496 en #mapa, para que la página no salte cuando se dibuja; si cambia BASE, cambiarlo también (una prueba lo controla).
Ríos (renglones propios en el semáforo; el del Paraná también pinta la costa en el mapa, ver abajo):
| Río | Estación (serie INA) | Amarillo | Naranja | Rojo |
|---|---|---|---|---|
| Paraná | Barranqueras (20) | 6,00 m, a menos de 50 cm y creciendo, o el máximo del rango del pronóstico del INA llega a 6,00 | el valor más probable del pronóstico del INA llega a 6,50 m y el río todavía no llegó a 6,00 m | 6,50 m medidos, o el río ya pasó 6,00 m y el valor más probable del INA llega a 6,50 m |
| Paraguay | Puerto Bermejo (58) | 6,50 m, o a menos de 50 cm y creciendo | — (sin pronóstico) | 7,00 m |
| Bermejo | El Colorado (6697) | sin color: el INA no publica niveles | — | — |
Explicación del Paraná (desde el 19/10/2026, pedido de Mariano): la frase de situación dice cuánto falta o cuánto pasó en centímetros (rioSit, también para el Paraguay: "Está 48 cm arriba del nivel de evacuación (6,50 m)."). Desde el 20/10, el renglón del río en "Riesgo por localidad" usa las mismas palabras (pasoNivel: "El Paraná está en 7,13 m en Barranqueras: 63 cm arriba del nivel de evacuación (6,50 m)."; antes decía "superó el nivel de evacuación"). En el gráfico, cada fecha prevista por el INA lleva escrita su altura más probable y, debajo, su rango (rioPrev, rioRango; el margen derecho pasa de 46 a 62 cuando hay pronóstico). Al costado (debajo en el celular) van dos desplegables cerrados: "¿Cómo leer estos números?" (d-rio-numeros, RIO_LEER: la altura es la marca de la regla del puerto, alerta, evacuación y defensas) y, si hay pronóstico, "¿Cómo calcula el INA la altura de los próximos días?" (d-rio-prono, RIO_PRONO: sigue el agua que ya viene bajando; uno de los datos principales es lo que suelta Yacyretá, que llega en unos 3 días; también el Iguazú, el río Paraguay y la lluvia prevista; altura más probable y rango; lo renueva martes y viernes; el sitio no calcula nada propio). Cada navegador recuerda si los abrió aunque la sección se vuelva a pintar (detAbierto).
Regla del puerto (desde el 4/11/2026, pedido de Mariano: más visual y menos para leer): arriba de la sección del Paraná, la escala de Barranqueras dibujada (reglaRio) con el agua a la altura de la última lectura, las marcas de alerta (6,00 m), evacuación (6,50 m) y defensas de la ciudad (unos 9,50 m) y, si el río pasó la alerta, un corchete amarillo o rojo que muestra cuánto. Va de 4 m (o menos, si el río está más bajo) hasta pasar las defensas. Al lado, el número grande, la fecha, la frase de rioSit y la tendencia; debajo, "Las marcas valen para la zona ribereña…". Dice lo mismo que las frases: no agrega nada propio. Tiene su texto para lectores de pantalla. Solo el gráfico se lee con el dedo (leerRio mira .rioGraf svg). El pronóstico del INA va en tarjetas ("Lo que prevé el INA": fecha, altura más probable y rango; hasta 3) cuando no hay aviso; los avisos de evacuación o de "puede llegar" quedan como estaban.
Naranja del Paraná (desde el 13/10/2026, casoProno): cubre el hueco entre "puede llegar a la alerta" y "ya pasó la evacuación". Sale solo del pronóstico oficial del INA (valor más probable, la fila p[2] más alta entre las fechas que faltan) y del nivel oficial de evacuación; no usa Yacyretá ni cálculos propios. Rojo por pronóstico (desde el 17/10/2026; pedido de Mariano, para coincidir con el comunicado oficial del Gobierno del Chaco de ese día, que declaró alerta roja con el río en 6,08 m y el INA previendo 7,23 m): si el río ya pasó la alerta (6,00 m) y el valor más probable del INA llega a la evacuación (6,50 m), el renglón queda en rojo (pr en riesgoRio); "Ahora en el Chaco" dice "rojo según la altura de hoy y el pronóstico del INA". Con el río debajo de la alerta, el mismo pronóstico da naranja. Usa solo los dos niveles oficiales, sin números propios. Los textos dicen "según el pronóstico del INA" y nunca "alerta naranja", porque no es una alerta oficial (las del río las declara la APA). El Paraguay no tiene naranja porque en Puerto Bermejo el INA no publica pronóstico. Con el río arriba de la alerta y el valor más probable debajo de la evacuación, el pronóstico solo agrega texto si el máximo de su rango llega a la evacuación.
Gráfico de lluvia día por día (desde el 20/10/2026, pedido de Mariano): en la sección de Lluvias, debajo de la tabla, un gráfico grande para una de las 6 localidades (botones para elegirla; empieza en Resistencia; grafLluvia, pintarGrafLluvia, LLU_SEL): una barra por día con los milímetros arriba (desde 0,5 mm) y abajo el día de la semana y la fecha ("mié 21/10"; hoy dice "Hoy"; en pantallas de menos de 520 px solo el número del día). Grises, los 7 días anteriores ("Llovió"); azules, desde hoy ("Se espera"). Para el lector de pantalla lleva la lista completa de días y milímetros. Las barritas de la tabla quedan en 102 × 28 px también en la computadora. No cambia ningún color.
Costa del Paraná en el mapa (desde el 14/10/2026, RIBERA y colorDe; Isla del Cerrito hasta el 17/10): Barranqueras y Puerto Vilelas toman el color más alto entre el suyo (lluvia con el piso del SMN) y el renglón del Paraná (amarillo, naranja o rojo; el gris y el verde del río no cambian nada). El naranja del mapa sale solo del Paraná (en estos dos municipios y en los que lo siguen hasta un techo naranja o rojo, ver abajo); la leyenda lo aclara ("Naranja: solo en la costa del Paraná, por la altura del río y el pronóstico del INA. No es una alerta del SMN"). Desde el 18/10/2026 la leyenda también nombra al río en el amarillo ("o el Paraná alto en la costa y zonas bajas") y en el rojo ("o el Paraná muy alto en la costa"), porque con el río alto hay municipios en esos colores sin lluvia ni alerta del SMN. El detalle del municipio explica que el color sigue al río. Fontana no se pinta; Resistencia, desde el 17/10, hasta naranja (ver abajo). El Paraguay no pinta el mapa.
Municipios que siguen al Paraná hasta un techo (desde el 17/10/2026, RIBERA_PISO y colorDe; pedido de Mariano, para coincidir con el comunicado oficial del Gobierno del Chaco y del Comité de Emergencia del 17/10, alerta roja por la crecida del Paraná): con el renglón del Paraná en amarillo, naranja o rojo, estos municipios toman el color del río, pero por el río no pasan de su techo (t): Colonia Benítez e Isla del Cerrito hasta rojo; Resistencia y Margarita Belén hasta naranja; La Leonesa, Las Palmas, Puerto Bermejo, General Vedia y Basail hasta amarillo (los colores del comunicado). Revisado el 17/10 a la tarde con el texto completo del comunicado que publicaron los diarios: Isla del Cerrito figura en naranja (en la placa de Instagram estaba en amarillo) y la alerta roja fuera del cordón de defensa incluye San Pedro Pescador y Puerto Antequeras, que son de Colonia Benítez. Se sube el techo cuando las versiones difieren, para no mostrar menos que lo oficial. La lluvia o el SMN sí pueden subirlos más. RIBERA_PISO es una lista nombre → {t, x}: x es la aclaración del detalle (qué zona es: costa fuera de las defensas, bajos cerca del Paraguay, zona rural…), que agrega que las alertas oficiales por la crecida incluyen zonas del municipio y que valen los avisos del Gobierno, del municipio y de Defensa Civil; Resistencia suma lo de las defensas. El sitio no copia el comunicado: los colores siguen saliendo solo del INA. Isla del Cerrito salió de RIBERA (antes seguía al río sin techo). Desde el 21/10/2026 su techo es rojo: el comunicado del Comité Provincial de Emergencia del 18/10 la pone en alerta roja fuera del cordón de defensa.
Colonia Benítez y el Paraná (desde el 16/10/2026; pedido de Mariano; desde el 17/10 está en RIBERA_PISO; techo rojo desde la revisión del 17/10 a la tarde, ver arriba): con el renglón del Paraná fuera del verde sigue al río; del 16 al 17/10 el techo era amarillo y el 17/10 a la mañana, naranja. La lluvia o el SMN pueden subirla más. Motivo: su costa (San Pedro Pescador y Puerto Antequeras, fuera del cordón de defensa, y la ruta provincial 63) se inunda con la crecida, pero el pueblo está en zona más alta. El detalle dice " por el río Paraná, no por la lluvia", nombra esos lugares y remite a los avisos del municipio y de Defensa Civil. Sin la frase de las defensas: Colonia Benítez no está dentro de ellas.
Una lectura de 4 días o más deja el renglón en gris.
El pronóstico del Paraná no se usa si tiene más de 7 días (ni para el amarillo ni para el naranja). Si tiene 3 días o más, el detalle del río agrega "Es del dd/m: no incluye lo que pasó río arriba después" (pronoAtraso); no cambia el color.
Para sumar otro río: agregarlo en OTROS (index.html), en fuentesExtra (script de Google, misma dirección: lo controla una prueba) y en las listas de cargar y pintar. El catálogo de series está en https://alerta.ina.gob.ar/a5/obs/puntual/series?var_id=2&format=json (los niveles oficiales vienen en estacion.nivel_alerta y estacion.nivel_evacuacion).
| Qué se ve | Dónde mirar |
|---|---|
| Alertas del SMN sin renovar | Registro de ejecuciones del script de Google. Ejecutar diagnostico(). Si el script anda, mirar en GitHub, pestaña Actions, tarea "Lluvia", el paso "Copiar el resultado del script de Google". |
| Página en blanco o sin nada que funcione | La huella de netlify.toml no coincide con el código: correr node herramientas/csp.js y publicar. |
| Correo o aviso "La lluvia está sin renovar", o mapa en gris | GitHub, pestaña Actions, tarea "Lluvia". Ejecutar probarRobot() en Google: si no dice bien, revisar la clave. |
| Algún río, un pronóstico, Yacyretá, El Niño o la lluvia medida sin dato | Ejecutar diagnosticoDatos() en Google: dice qué fuente no responde. |
| Imagen del Pacífico (El Niño) vieja o que no aparece | https://raw.githubusercontent.com/marianoavalostech-arch/alertas-smn-chaco/datos/pacifico.json: dia es la fecha de la imagen y error dice qué falló. Si el robot no la renueva por más de 21 días, la página vuelve a pedirla a la NASA sola. |
| Mapa animado viejo o "No disponible" | https://raw.githubusercontent.com/marianoavalostech-arch/alertas-smn-chaco/datos/grilla.json: el campo error dice qué falló. |
| Las pruebas fallan en GitHub, o Netlify marca la publicación como fallida ("Failed") | Correrlas en la computadora con node pruebas/reglas.test.js. Mientras fallen, Netlify sigue mostrando la versión anterior. |
| Correo de GitHub de corrida fallida de "Lluvia" que dice "La copia del script de Google tiene más de 6 horas" | script.google.com, proyecto "Alertas SMN Chaco": en Activadores, que siga el de actualizar cada hora; en Ejecuciones, si hay errores. Ejecutar diagnostico(). |
AJUSTE_H), verificado contra el mapa del SMN el 6/10/2026. En cada lectura controla que el comienzo de las alertas caiga en las franjas del SMN (0, 6, 12 y 18 h); si la mayoría cae 3 horas antes, el SMN arregló su canal y el script deja de corregir solo (ajuste.horas pasa a 0). Necesita al menos 3 alertas en el país para decidir; con menos, sigue con lo que venía usando.Servicio Meteorológico Nacional (alertas), Instituto Nacional del Agua y Prefectura Naval Argentina (ríos y pronósticos), Entidad Binacional Yacyretá, vía INA (agua que suelta la represa), Red Hidrológica Nacional de la Secretaría de Recursos Hídricos, vía INA (lluvia medida), Open-Meteo (lluvia), NASA GIBS y NOAA (satélite GOES-East), NOAA (ONI), NASA GIBS (mapa del Pacífico: temperatura del mar comparada con lo normal, GHRSST MUR), Instituto Geográfico Nacional y OpenStreetMap (límites).
En el sitio, "Acerca de este sitio" da el correo [email protected] y el enlace a los issues de GitHub. El correo no está escrito en el HTML: lo arma armarCorreo() al cargar la página (hay una prueba que controla que no aparezca escrito tal cual). Para cambiarlo, editar esa función y la prueba, y también privacidad.html (ahí va escrito con códigos HTML, @ en lugar de la arroba, para que los robots que buscan direcciones no lo lean tan fácil).
El código está bajo licencia MIT (ver LICENSE), © 2026 Mariano Avalos. Los datos que muestra el sitio pertenecen a cada fuente y siguen sus propias condiciones de uso. Las letras Kanit y Manrope (fuentes/) son de The Kanit Project Authors y The Manrope Project Authors, con licencia SIL Open Font License 1.1 (fuentes/OFL.txt).
<link rel="preconnect">iconos/badge-96.pngtagcompartir.png | Imagen que muestran WhatsApp, Facebook y otras redes al compartir el enlace. |
herramientas/puntos.js | Genera los puntos interiores de cada municipio (PUNTOS en el script). Solo hace falta si cambia el mapa. |
pruebas/reglas.test.js | Pruebas de las reglas del sitio, del script y del robot. |
.github/workflows/ | Tareas de GitHub: pruebas.yml (en cada subida) y lluvia.yml (robot). |
netlify.toml | Publicación y cabeceras de seguridad (regla del navegador con la huella del código, Permissions-Policy, quién puede mostrar el sitio dentro de su página). |
fuentes/kanit-700.woff2 y fuentes/manrope-wght.woff2 | Letras del portal nuevo de Gobierno Abierto, guardadas en el sitio: Kanit en los títulos y Manrope en el texto. Licencias en fuentes/OFL.txt. |
icono.svg | Ícono de la pestaña del navegador y del botón "Instalar app" (el mismo dibujo que los íconos de la app, en 1 KB). |
iconos/ | Íconos de la app: 192 y 512 px con esquinas redondeadas, 512 px "maskable" (fondo hasta el borde, para que Android le dé su forma) y 180 px para iPhone. badge-96.png: silueta blanca del ícono (semáforo, nube y río) para la barra de arriba del teléfono en los avisos. |
manifest.webmanifest | Datos para instalar el sitio como app: nombre, colores, íconos y categoría (weather). PWABuilder lo usa para armar la app de Google Play. |
privacidad.html | Política de privacidad (página sola, sin código), para la ficha de Google Play y enlazada desde "Acerca de este sitio". |
herramientas/assetlinks.js | Arma .well-known/assetlinks.json (el archivo que une la app de Google Play con el sitio) con el nombre del paquete y las huellas de la firma: node herramientas/assetlinks.js <paquete> <huella> [otra huella]. |
.well-known/assetlinks.json | Le dice a Android que la app y el sitio son del mismo dueño: sin él, la app muestra arriba la barra de dirección de Chrome. Una prueba controla su forma. |
CAMBIOS.md | Historial de cambios. |
LICENSE | Licencia MIT del código. |
Content-Security-Policy en netlify.toml) solo deja correr el <script> de la página (por su huella) y la copia de la biblioteca de Firebase guardada en el propio sitio ('self', desde el 5/11/2026, para los avisos), y solo deja conectarse a raw.githubusercontent.com, script.google.com, script.googleusercontent.com, gibs.earthdata.nasa.gov y, para los avisos, fcmregistrations.googleapis.com y firebaseinstallations.googleapis.com; worker-src 'self' deja registrar avisos-sw.js; manifest-src 'self' deja leer el archivo para instalar la app. Las visitas se cuentan con una imagen de GoatCounter (img-src https://riosyclimachaco.goatcounter.com), sin cargar su código. Sin formularios ni cookies. La app instalada no agrega permisos ni guarda código aparte: es la misma página. La conexión anticipada con GitHub (preconnect) no necesita nada en la regla. La política de privacidad (privacidad.html) no tiene código: la misma regla le sirve. Los íconos (iconos/, icono.svg) se guardan una semana en el navegador (Cache-Control en netlify.toml): si se cambia el dibujo, se ve el nuevo a más tardar en una semana, o enseguida si se le cambia el nombre al archivo. El fondo de la página no usa background-attachment: fixed (desde el 24/10/2026): el degradado es de costado y se ve igual, y así el celular desplaza la página sin repintar el fondo. Las tablas que se desplazan de costado se pueden recorrer con el teclado (tabindex="0"). Solo el propio sitio y el portal de Gobierno Abierto lo pueden mostrar dentro de su página (frame-ancestors).FORMA, smnVale, copiaVale); los textos de afuera se escriben con esc.GITHUB_TOKEN) queda en las propiedades del script de Google; la dirección pública no la devuelve, y si GitHub rechaza la clave solo se publica el número de error (el detalle queda en el registro del script).actions/checkout v7.0.1 y actions/setup-node v7.1.0, que corren con Node 24; una prueba controla la huella y la versión); pruebas.yml solo puede leer.claude/revision-seguridad-oficial-14-10.md).hDe.animCuerpo.animMapa.animLado#aRelojmarcarTira--x.aPanel, recuadro de fondo suave): ▶ redondo, los días como selector unido (#aDias, el elegido con el degradado del sitio), la lista "Lluvia en" (#aLocs, <select id="aLoc">: "Todo el Chaco" (-1) y las 6 localidades; reemplaza a los 7 botones), el relojito, las barritas y la leyenda. Las barritas muestran un solo día (el de la hora elegida, A.ver; ventanaDia(g,d) da su primera y última hora, A.k0, A.nv): 24 barritas casi 3 veces más anchas, con marcas finas y lisas a las 0, 6, 12 y 18 h y esas horas debajo; el control de la hora (#aHora) va de la primera a la última hora del día; al pasar a otro día (botones, reproducir o elegir una localidad, que salta a su hora más fuerte) mostrar vuelve a dibujarlas. La frase de la localidad (#aLocTxt) va destacada con borde de color, sin justificar; la casilla del satélite y la fuente, en letra chica debajo de una línea (.aPie).pintarTira): las horas sin lluvia no se dibujan (queda la línea de abajo, fina y lisa); la hora elegida lleva una franja violeta suave detrás (sin borde: la marca el relojito); "ahora" es una línea fina y lisa, y su nombre va en el renglón de los días cuando no choca con uno (ubicarAhora, que mide en la pantalla; si choca, o con la sección cerrada, va en el renglón de abajo); arriba de la barrita más alta va cuánto llueve ahí ("4 mm", desde 1 mm; .tMax). La tira mide 100 px desde el 21/10 (antes 66; H=96 en pintarTira, y el control invisible de la hora, 130 px, cubre el relojito y la tira). Qué muestran (tiraValores(g,loc), desde el 21/10): con "Todo el Chaco" (-1, primera opción de la lista "Lluvia en", elegida al abrir), la lluvia más fuerte de cada hora en alguno de los 70 municipios; con una localidad elegida, la lluvia de esa localidad (la misma de su frase, enLugar); elegirLoc redibuja la tira. Leyenda (.escLeg, siempre a la vista; desde el 21/10 la frase "No es un radar" va al principio de "¿Qué muestra este mapa?", #d-anim): título "Lluvia en una hora"; la escala en 5 tramos con los mismos colores del mapa (ESCALA), separados por 2 px, con "finita" y "fuerte" en las puntas y los cortes debajo ("1", "3", "7", "15 mm"); después, "tormenta prevista" (punto amarillo, como en el mapa) y "nubes" (gris sobre el color de la tierra). El lector de pantalla lee la leyenda entera en una frase (aria-label). La sección pasó de unos 1.230 a 910 px de alto en el celular y de 1.540 a 610 en la computadora.abrirLoc<dialog id="dLoc">showModal#dLocCuerpoconAvbuscandoherramientas()cajaCabgrid-auto-rows:1fr.avMas