Commit graph

129 commits

Author SHA1 Message Date
hacklab
b277f8e1cf pruebas en la APK: huecos dobles de las barras, contraste y zonas tactiles
Probado con la APK instalada en el emulador de Android Studio (Pixel 9, Android 16):

- La barra de arriba llevaba 65px de mas y la de abajo 24: el contenedor de la app
  del dev ya se aparta de las barras del sistema y nuestro CSS volvia a sumar
  safe-area-inset. Ahora --inset-top y --inset-bottom, a 0, en mobile_base.css.
- Borrar en una tarjeta: la barra de confirmar se metia en la fila de botones y
  'Si, borrar' salia letra a letra. La fila ya puede saltar de linea.
- Acampada: .time-chip y .pref-pill del dev quedaban en negro sobre gris oscuro, y la
  pildora elegida con texto claro sobre el resalte en las paletas oscuras.
- Zonas tactiles a 44px: barra de arriba, fichas, pasos de la bienvenida, aviso de
  bienvenida, pie, casillas con su etiqueta, botones del buzon; enlaces en el texto
  a 24px.
- Acceso a un bloque de Ajustes: el titulo ya no queda bajo la barra de arriba.

En la guia y en ARQUITECTURA_APK.md: no usar env(safe-area-inset-*), los tamaños
minimos y el fallo del boton atras de la app del dev (la tecla retrocede dos pasos).
2026-10-20 13:50:46 +02:00
hacklab
f75fbf7c4a guia: la estrategia de capa encima, sus reglas y donde va cada cosa
Seccion nueva al principio: por que capa encima y no fork, app propia ni reescribir
respuestas; siete reglas; tabla de que va en cada fichero y los pasos para seguir
modificando. En version nueva del dev, repasar la APK con REA. Cifras de lo que
cambiamos del dev rehechas contra la APK 1.3.3 (15 ficheros, 516 lineas).
2026-10-20 13:11:40 +02:00
hacklab
188bd74195 capa encima: fuera lo que miraba las respuestas del dev
Se quita wrapUpstream de fork_routes.js: el aviso de seccion apagada en Modulos,
?saved=1 al guardar y la vuelta a Ajustes tras guardar perfil o saludo. Dependian de
las redirecciones del dev y cualquier cambio suyo los rompia sin avisar.

Ajustes: Identidad enseña nombre y avatar y lleva a /profile/edit; Saludo lleva a
/feed/create, las dos pantallas del dev. Modulos guarda con /save-modules y vuelve a
donde decide el dev. mobile_layer.js refresca nombre y avatar al abrir Ajustes en vez
de vigilar los POST.
2026-10-20 13:11:40 +02:00
hacklab
150f6faf82 docs: el backend del dev por dentro, del grafo de imports de REA 2026-10-20 12:59:29 +02:00
hacklab
4a6c99ee59 docs: como esta hecha la APK del dev, sacado con REA
Arranque, cuando se descomprime nodejs-project.zip (solo si cambia
versionName.versionCode; los configs se conservan), la WebView sin cache y lo que
cambia sobre_oficial.sh. Con los comandos para repetirlo en cada version.
2026-10-20 12:55:29 +02:00
hacklab
30ef2bd270 guia y android: el proyecto Gradle vuelve a como estaba; el icono en android/icono
La guia dice que el resto de android/ queda sin tocar. El icono adaptativo pasa a
android/icono/, de donde lo copia sobre_oficial.sh. En la guia, mobile_settings.js,
android/icono y por que la APK lleva una huella del codigo en el versionName.
2026-10-20 12:38:43 +02:00
hacklab
e861b05946 ajustes: los seis accesos arriba y colores configurables
Arriba de Ajustes, una rejilla con lo que se elige en la bienvenida (identidad,
perfil de uso, portada, comunidad y saludo) y Colores. Cada acceso baja a su
bloque y cada bloque guarda al tocar.

Colores: ocho paletas de un toque y fondo, texto y resalte a mano. Se guardan en
la config (mobileColors) y van en /mobile-colors.css, la ultima hoja (la CSP no
deja estilos en linea). Solo con el aspecto Acampada; elegir colores pasa a el. Si
el texto no se lee sobre el fondo se cambia por negro o blanco y se avisa.

En la bienvenida, Colores es un paso mas, despues del tipo de portada.

Identidad y saludo envian a las rutas del dev de la bienvenida; fork_routes.js
cambia su vuelta a /welcome por la vuelta a Ajustes. Todo en mobile_settings.js;
en las vistas del dev solo hay llamadas a mobile_ui. Miniaturas de los skins
rehechas (salia Karvan).
2026-10-20 12:23:25 +02:00
hacklab
18098dd38e acampada: el texto sobre el resalte y los tonos claros salen de variables
--a26-on-neon (texto sobre el color de resalte), --a26-tint y --a26-line en vez de
#000, #e5fcff y #ccc fijos. Con los colores de siempre no cambia nada; con un fondo
oscuro o un resalte oscuro el texto sigue leyendose.
2026-10-20 12:23:25 +02:00
hacklab
e3fcf2455d android: icono adaptativo con el logo de Oasis y nueva extraccion del backend en cada APK distinta
El icono es la isla de la app oficial; antes el lanzador la encogia dentro de un
circulo blanco (la oficial solo trae el PNG cuadrado) y el wrapper Gradle usaba un
hexagono amarillo. Ahora capa de fondo y capa delante, en Gradle y en sobre_oficial.sh.

La app oficial solo vuelve a extraer nodejs-project.zip si cambia
versionName.versionCode. Con el mismo commit, o con cambios sin commitear, la APK
nueva arrancaba con el backend anterior. El versionName lleva ahora una huella del
codigo.
2026-10-20 12:22:57 +02:00
hacklab
d267d2befe bienvenida: paso Perfil (workflow) de un toque, Activismo primero; Ajustes con la misma lista; fuera Personal/Social de la barra de arriba 2026-10-19 16:00:31 +02:00
hacklab
92a8dc3853 docs: tipo de portada de un toque, en el pad 2026-10-19 15:39:58 +02:00
hacklab
3238520891 bienvenida y Ajustes: el tipo de portada se guarda al tocarlo, sin boton de guardar; en Ajustes va justo despues del idioma 2026-10-19 15:39:01 +02:00
hacklab
05027031ef docs: fuente del PDF de la guia para el dev 2026-10-19 15:06:58 +02:00
hacklab
d3e799e592 docs: pruebas en tamaños y sistemas (Android 9, 11 y 16), y WebView viejos en la guia 2026-10-19 15:06:09 +02:00
hacklab
9f8317baa3 menu: al ir a un modulo desde la hoja se quita antes su entrada del historial; volver atras ya no reabre la hoja 2026-10-19 15:04:38 +02:00
hacklab
9e2716f69b WebView viejos (Android 9-11): fichas sin gap, hoja del menu sin inset ni dvh, cabecera sin sticky y No molestar debajo de la hoja 2026-10-19 14:52:50 +02:00
hacklab
3f8839d9a8 tabletas: el limite de ancho no ganaba a otra regla; ahora si 2026-10-19 14:35:46 +02:00
hacklab
0a8935fe16 tamaños: tabletas centradas y el boton de No molestar fuera del menu
Probado en el emulador a 360x540, 412 (Pixel 9), 800dp (tableta) y con la
letra al 130%: sin desbordes. Arreglos:
- en pantallas de 700dp o mas, el contenido y la hoja del menu a 720/640px
  centrados; a 800dp todo se estiraba
- con el menu abierto se esconde el boton de No molestar, que se montaba
  encima de la X de la hoja
2026-10-19 14:34:26 +02:00
hacklab
1beb53568c menu: el boton atras de Android cierra la hoja
En el emulador, con la hoja abierta, atras cambiaba de pagina. Un script
minimo (public/js/mobile_menu.js, servido desde /js como permite la CSP)
apunta una entrada en el historial al abrirla y la quita al cerrarla; sin
el script el menu funciona igual. El estudio de navegacion recoge lo que
salio en la prueba.
2026-10-19 14:29:07 +02:00
hacklab
062d49c367 menu: todos los modulos caben en la hoja sin deslizar
En el emulador la hoja dejaba ver 690px y la rejilla medía 1.200: Tribus
quedaba fuera y hacia falta deslizar. Dentro de la hoja: cinco iconos por
fila y mas pequeños, y los grupos de uno o dos modulos de dos en dos. Ahora
caben los 20 del workflow acampada a 412 y a 360px. Con el menu abierto solo
la pestaña Menu lleva la pastilla.
2026-10-19 14:26:02 +02:00
hacklab
382d903bc5 navegacion: al abrir, la actividad; los modulos en la pestaña Menu
docs/ESTUDIO_NAVEGACION.md compara cuatro formas de moverse por la app
(lanzador en portada, boton de menu arriba, pestaña Menu abajo, hamburguesa)
y se queda con la pestaña de abajo, el patron Mas de Android y de las apps
grandes: al alcance del pulgar y en todas las pantallas.

- la portada es la actividad; el lanzador ya no se pinta alli
- quinta pestaña fija en la barra de abajo, Menu, que abre desde abajo una
  hoja con todos los modulos por secciones; se cierra con la X, tocando fuera
  o volviendo a tocar Menu. Sin JS: una casilla y CSS
- textos en los 11 idiomas; caben cinco pestañas a 360px
- capturas, portada y esquema de la interfaz al dia
2026-10-19 14:23:43 +02:00
hacklab
6eafe5ee18 coherencia con la guia: lo de movil del dev vuelve a ser suyo
Comparando con el nodejs-project de la APK oficial (la referencia buena para
el movil, no el git del dev) salia que parte de lo que se saco de backend.js
era codigo de movil del propio dev: apagar los modulos que no van, cortar
rutas, retocar el HTML, las descargas de la copia de seguridad y ocultar
tema y workflow en la bienvenida.

- backend.js vuelve a ser su version de movil mas dos lineas (montar nuestro
  router); modules_view.js, su version de movil
- mobile_layer.js se queda con lo nuestro: avatar, filtro y lanzador
- la guia lista las 17 diferencias que quedan con la APK oficial (561 lineas)
  y explica que hay que comparar con la APK, no con el git
2026-10-19 14:19:54 +02:00
hacklab
b65dde1263 salas: estando dentro, los controles arriba y en rejilla
Silenciar, camara, levantar la mano, salir... quedaban debajo de toda la
ficha de la sala, a 1.100px. Con la sala en directo el panel va primero, los
controles en rejilla de dos y Salir en rojo. Solo CSS.
2026-10-19 14:14:09 +02:00
hacklab
6bacafea64 android: la APK se monta sobre la oficial del dev
La app Android de epsylon trae desde la 1.3.x un puente nativo de audio y
camara (.audio_bridge) para el Telefono y las Salas, y no tiene el codigo
publicado. android/scripts/sobre_oficial.sh coge su APK de la misma version,
le cambia el backend por el de la rama (con su node_modules), le pone el
paquete net.laenre.oasis (y los authorities, el permiso propio y las acciones
de llamada) para que conviva con la oficial, y la monta y firma. apktool va
con version y huella fijas.

Probado en el emulador: el Telefono ofrece llamadas y en una sala el
microfono graba y se corta al salir. README, guia, android/README y los
esquemas lo cuentan; el proyecto Gradle propio queda sin uso.
2026-10-19 14:12:18 +02:00
hacklab
34265c2ed0 docs: tercera ronda de usabilidad, en un emulador limpio 2026-10-19 13:55:28 +02:00
hacklab
10e47f9bc1 llamadas: lo que hay de verdad; SSB_server.js como en la APK oficial
Revisado en el emulador: la APK oficial 1.3.3 del dev pide microfono y camara
y trae un puente nativo (.audio_bridge) que graba, reproduce, saca la camara y
emite. Nuestra app Android no lo tiene, asi que en esta APK el Telefono dice
que no hay llamadas.

- README, guia, android/README y los dos esquemas lo cuentan asi
- SSB_server.js queda identico al de la APK oficial (su version de movil
  enchufa ya phone_*_android.js); fuera el enganche duplicado de main.js
- el aviso de bienvenida va encima del lanzador: en el primer arranque
  quedaba a 1.300px y no se veia
2026-10-19 13:55:16 +02:00
hacklab
e6ea3f4b58 readme: capturas y dibujos nuevos, sin Karvan
- capturas de un nodo de prueba con contenido de acampada: lanzador, tribus,
  votacion de semaforo, modulos, ajustes, barra, salas y el tema del dev
- portada y esquema de la interfaz al dia; dos esquemas nuevos: como va la
  rama encima de Oasis y como funcionan las llamadas
- el README cuenta las novedades de esta version y explica la rama

Arreglos que salieron al hacer las capturas:
- el boton de No molestar del Telefono ocupaba una fila entera arriba de cada
  pagina; ahora va en la barra de arriba, junto al avatar
- Ajustes marcaba English aunque el idioma fuera otro (settings_view se queda
  con el idioma del arranque): el selector lo lee al pintar
- barras de la votacion juntas y con las etiquetas en el mismo tipo
- Personalizar la barra: una fila por atajo, sin sangria
2026-10-19 13:49:21 +02:00
hacklab
d4e6b6c8e8 gitignore: el enlace a node_modules y el estado de la llamada 2026-10-19 13:39:53 +02:00
hacklab
096a7d110b fuera Karvan: se usan el Telefono y las Salas del dev
El dev ya trae Telefono (llamadas uno a uno, buzon de voz) y Salas (hasta 50,
con video, grabacion y emision). La rama quita su modulo propio de salas y
llamadas: modelo, vista, JS de cliente, CSS, rutas, credenciales TURN, pruebas
y textos.

- el router propio pasa a llamarse fork_routes.js, sin Karvan
- el audio, la camara y la emision de Android se enchufan desde main.js con
  setAudioFactory/setVideoFactory/setStreamFactory, que exporta el propio dev;
  SSB_server.js vuelve a tener su linea original
- Clear-SNH.css y modules_view.js vuelven a ser identicos a los del dev
- el workflow acampada y la config de serie cambian Karvan por Telefono y Salas
- README y guia: las llamadas son las del dev; antes de hacer un modulo propio,
  mirar si el dev ya lo tiene
2026-10-19 13:39:41 +02:00
hacklab
3937ddab1e css: fuera los selectores que no apuntan a nada
153 selectores de mobile_base.css, hive_acampada.css y Acampada.css que
apuntaban a clases que ya no pinta ninguna vista (287 lineas). Comparadas 14
pantallas pixel a pixel antes y despues: identicas.
2026-10-19 13:34:26 +02:00
hacklab
ea35ca7ca1 docs: fase C en el informe de frontera 2026-10-19 13:31:39 +02:00
hacklab
1148e6a472 backend: lo del movil sale de backend.js a mobile_layer.js
De 20 trozos nuestros en backend.js quedan 9 (21 lineas). Pasan a
src/backend/mobile_layer.js, que monta el router propio delante de las rutas
del dev:
- blockexplorer, actualizar con git y presets de modulos, cortados en el movil
- los modulos que no van en el movil, apagados al arrancar y al guardar
- avatar de la barra de arriba, filtro y lanzador
- fotograma en los videos y pestaña actual marcada
- descargas de la copia de seguridad por GET
El cambio de tema del movil lo atiende karvan_routes.js.
2026-10-19 13:31:24 +02:00
hacklab
e7892c4bf9 workflows: activists vuelve a ser el del dev; karvan y acampada desde fork_workflows
- el workflow activists del dev queda como en la 1.3.3 (unos 45 modulos)
- karvan se anade a las listas del dev al arrancar, desde fork_workflows.js
- la config de serie del movil enciende tribus, parlamento, votaciones y
  eventos: coincide con acampada y sale marcado en Ajustes
2026-10-19 13:28:44 +02:00
hacklab
35fef607d7 OasisMobile.css vuelve a ser la del dev; la maqueta pasa a mobile_base.css
themes/OasisMobile.css es un tema de epsylon que cambia en 21 de cada 39
versiones y nuestra copia diferia en 4.873 lineas. Ahora es identica a la
1.3.3 y nuestra maqueta vive en styles/mobile_base.css, que el movil carga
siempre antes del skin. Con Acampada se ve igual que antes; con OasisMobile,
el tema del dev encima de la maqueta.
2026-10-19 13:27:03 +02:00
SITO
5bce7d38ed docs: la guia escrita como notas, sin adornos 2026-10-19 13:17:28 +02:00
SITO
abae8132a4 docs: guia de desarrollo con lo que se toca y lo que no
GUIA_DE_DESARROLLO.md en la raiz: la regla de oro, el semaforo (rojo:
backend, middleware, modelos, server, CSP, traducciones y hojas del dev;
ambar: una linea de enganche en las vistas del dev; verde: hojas, vistas,
router, workflows y textos propios), como hacer cada tipo de cambio, lo que
hay que comprobar antes de cada commit, como integrar una version nueva del
dev, como probar y la deuda que queda. Enlazada al principio del README.
2026-10-19 13:16:27 +02:00
SITO
087b86a184 movil: botones de crear iguales, listas vacias, buzon y busqueda compactos
Todo en mobile_ux.css (mas un SVG propio para las listas vacias), sin tocar
vistas ni backend del dev:
- el boton principal de cada modulo, igual en todos
- listas vacias con icono y recuadro
- el pie abajo en paginas cortas
- buzon: remitente y fecha en una linea; fuera Para, Tasa ECO y Cifrado
- busqueda: el campo primero, los filtros despues
- nodos: acciones en rejilla
- fuera los selectores a clases que no existen
2026-10-19 13:08:46 +02:00
SITO
d04d99ece2 frontera con upstream: lo del movil sale de los ficheros del dev
docs/FRONTERA_UPSTREAM.md mide como cambia upstream (39 releases de la 1.0.1 a
la 1.3.3; backend.js en 34, main_views en 31, OasisMobile.css en 21) y fija que
se toca: backend, middleware, modelos, server y traducciones de upstream, no;
vistas de upstream, solo una linea de gancho; hojas, vistas, router y modelos
propios, si.

Fase A, lo del 19/10:
- backend.js, workflows_model.js y modules_view.js vuelven a como estaban
- seccion apagada, /modules/enable y ?saved=1: en el router propio, que envuelve
  las redirecciones de upstream en vez de cambiar checkMod
- Modulos del movil en views/mobile_modules_view.js, servida por el router propio
- workflow propio "acampada" registrado desde models/fork_workflows.js en vez de
  redefinir "activists"
- votaciones, tribus, ajustes, borrar, pie y bienvenida: la logica en
  views/mobile_ui.js; en cada vista de upstream queda la llamada
2026-10-19 13:04:38 +02:00
SITO
9b391cfc3d docs: lo arreglado y lo pendiente en la prueba de usabilidad 2026-10-19 12:44:44 +02:00
SITO
f29540e17e movil: barra de abajo marca la seccion abierta; llamada de voz sin video vacio
- la pestaña actual de la barra de abajo lleva la pastilla de color
- en una llamada solo de voz no se ensena el video propio (era un recuadro
  gris con el icono de play) y Llamar se atenua mientras dura
- la barra de confirmar borrado con su marco rojo
2026-10-19 12:43:28 +02:00
SITO
c1f4ba75de docs: prueba de usabilidad en el emulador (para el pad) 2026-10-19 12:37:58 +02:00
SITO
4dd573662c movil: usabilidad tras la prueba en el Pixel
Lo que salio de recorrer la app como alguien de la acampada:

- borrar (tribus y todo lo que usa renderContentActions) pide un segundo
  toque; la X va la ultima de la fila
- Karvan: Llamar empieza solo con voz (si se negaba la camara no arrancaba
  nada); botones con icono y nombre; textos traducidos; ayuda para invitar
- votaciones: tipo Si/No, semaforo o termometro (el servidor ya aceptaba
  options); resultados en barras; aviso a quien la crea de que no puede votar
- workflow activistas con tribus, parlamento, votaciones y eventos
- seccion apagada: /modules dice cual era y la activa de un toque
- Modulos en el movil: agrupados como el lanzador, interruptores y Guardar fijo
- tribus en filas compactas; secciones de una tribu en tira de fichas + Mas
- lanzador y barra con iconos SVG en vez de letras vai
- Ajustes: idioma y aspecto primero; idiomas de un toque
- aviso de bienvenida solo en la portada y en una linea; Ahora no al final
- pie de una linea con el estado de sincronizacion en claro
- mobile_ux.css para los dos skins: un margen de 14px (eran 74 por lado en
  las fichas), Anton solo en titulos y boton principal, buscador en una linea,
  la barra de abajo se esconde con el teclado
2026-10-19 12:37:58 +02:00
oasis-bot
2e3ff1e79f tema Acampada: letra y botones mas grandes
Lanzador (iconos de 64px, etiquetas de 13px en negrita que solo parten entre
palabras), barra de abajo, fichas de filtro de 46px, iconos de las tarjetas
de 44px, reacciones del chat, formularios y textos de cabecera.
2026-10-19 02:17:12 +02:00
oasis-bot
0baf85faa9 skins: elegir el aspecto en el movil con tarjetas de un toque
En Ajustes del movil, Tema y Flujos de trabajo dejan de ser desplegables:
cada skin es una tarjeta con su miniatura y cada workflow un boton grande,
y se aplican al tocarlos. Solo se ofrecen los skins que tienen maqueta de
movil (Acampada y Oasis Mobile); el servidor rechaza un tema de escritorio,
que dejaba la app sin maqueta. La bienvenida tambien ofrece elegir skin.

Aplicar un workflow ya no cambia el skin: se queda el que haya elegido cada
cual.

OasisMobile.css se carga con su propio <link> versionado antes de
Acampada.css, en vez de con @import: el @import sin ?v= se quedaba en la
cache del WebView y tras actualizar se veia la maqueta vieja.
2026-10-19 02:17:12 +02:00
oasis-bot
ac921c9d56 readme: capturas con el tema Acampada
Las ocho capturas, la portada y el esquema de la interfaz rehechos sobre la
1.3.3 con el tema Acampada. generar_portada.py compone la portada a partir
de las capturas y dibuja el esquema; el texto vive en el script. Novedades:
tema, fotos que no se pueden limpiar y DNS.
2026-10-19 02:06:05 +02:00
oasis-bot
9a4ca6b2b3 tema Acampada: Karvan y respuestas del chat en blanco y negro
karvan.css trae su paleta amarilla sin !important: las salas activas salian
en negro con la letra oscura. Ahora tarjetas con marco negro, burbujas como
las del chat y los botones de llamada en blanco.
2026-10-19 02:06:05 +02:00
oasis-bot
b64dcf9b7a fotos: si no se pueden limpiar, no se suben
Si quitar los metadatos fallaba, blobHandler subia la foto original, con el
GPS. Ahora se para con un 400 y un aviso (imageMetadataUnsafe, en los 11
idiomas): HEIC/HEIF/AVIF y TIFF, que pueden llevar EXIF y aqui no se saben
limpiar, y JPEG/PNG/WebP que no se dejan recorrer. Un JPEG cortado ya no
sube como una imagen vacia. Formatos sin EXIF (BMP, SVG...) pasan igual.

Es el cambio del 10 de octubre, llevado a la copia de la limpieza que vive
ahora en blobHandler.js.
2026-10-19 02:02:16 +02:00
hacklab
ed77a13c85 dns: primero el resolutor del sistema, los publicos de respaldo
main.js preguntaba siempre a 8.8.8.8/1.1.1.1. Las VPN que evitan fugas de DNS
(Mullvad) y las redes que bloquean DNS externos los rechazan, y entonces no se
encontraba ningun pub por nombre: unirse a uno no hacia nada y no decia nada.

Ahora va primero getaddrinfo, que respeta la VPN y el DNS privado de Android;
a los 5 s, o si falla, tambien los publicos. Probado en Android 15 detras de
Mullvad: antes no resolvia hacklab.laenre.net y ahora si.
2026-10-19 02:00:56 +02:00
oasis-bot
b3172ed1c3 android: release --public, version de package.json y libnode comprimida
Lo del 10 de octubre que sigue valiendo sobre la base 1.3.3:
- con un tag v* el workflow publica la APK; a mano sigue en borrador
- el workflow trae el APK oficial de la misma version: de ahi salen
  node_modules y libnode.so (prepare.sh ya lo usaba, pero el runner no lo tenia)
- versionName sale de package.json en vez de ir escrito a mano
- libnode.so comprimida, como en la oficial (unos 35 MB menos por descarga)
- release.sh: JAVA_HOME en el PATH, no deja salir una release debuggable,
  exige CHANGE_WIFI_MULTICAST_STATE y avisa si la APK pasa de 80 MB

Se queda fuera la poda de prepare.sh y la sha256 de la APK 1.2.5: ahora el
node_modules viene ya podado del APK oficial.
2026-10-19 02:00:40 +02:00
hacklab
99e5d766e9 android: pantalla completa con margenes, teclado y descargas
El contenedor deja sitio a las barras del sistema y al teclado (Android 15
obliga con targetSdk 35). Las descargas van al gestor de Android. Fondo
blanco e iconos oscuros, como el tema Acampada.
2026-10-19 01:59:39 +02:00