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
This commit is contained in:
hacklab 2026-10-19 14:23:43 +02:00
parent 6eafe5ee18
commit 382d903bc5
18 changed files with 192 additions and 34 deletions

View file

@ -0,0 +1,69 @@
# Cómo moverse por Oasis en el móvil
Estudio para decidir la navegación de la rama. 19/10/2026.
## La pregunta
Oasis tiene casi sesenta módulos. En un escritorio caben en un menú lateral; en un
móvil no. ¿Qué tiene que ver alguien al abrir la app, y cómo llega al resto?
## Lo que hay ahora
Medido en el emulador (Pixel 9, 412 px de ancho) con el workflow acampada (16 módulos):
- Al abrir, la portada es el lanzador: una rejilla de iconos por secciones que ocupa
unos 1.300 px, casi pantalla y media. La actividad, que es lo que ha pasado en la
red, empieza debajo y no se ve sin bajar.
- Abajo hay una barra de cuatro atajos que elige cada cual (Actividad, Chats,
Publicar, Buzón de serie).
- Para ir a un módulo que no está en la barra hay que volver a la portada y buscarlo
en la rejilla. Desde dentro de un módulo no hay acceso directo al resto.
O sea: la portada es un menú, no un sitio donde pase algo, y el menú solo está en la
portada.
## Cómo lo hacen otras
- Instagram, TikTok, X: el contenido es la portada. Abajo, cinco destinos fijos
(inicio, buscar, crear, vídeos, perfil). Lo demás vive en el perfil o en ajustes.
- WhatsApp, Signal, Telegram: pestañas con las tres o cuatro cosas que se usan
siempre. Lo demás, en un menú de tres puntos.
- Google Maps, Gmail y la guía de Material Design: una barra abajo con entre tres y
cinco destinos; si hay más, el último es "Más" y abre una hoja con el resto.
- El menú hamburguesa arriba a la izquierda (muy usado en 2012-2016) se ha ido
abandonando: lo que no se ve se usa menos, y arriba queda lejos del pulgar.
## Qué pedimos a la navegación
1. Al abrir, ver qué pasa (actividad), no un menú.
2. Llegar a cualquier módulo desde cualquier pantalla, en dos toques como mucho.
3. Que el sitio para hacerlo se vea sin explicarlo.
4. Que se alcance con el pulgar con el móvil en una mano.
5. No tapar contenido ni quitar sitio de pantalla.
## Opciones
| | Portada | Llegar a un módulo | Pulgar | Se ve | Comentario |
|---|---|---|---|---|---|
| A. Como ahora | Lanzador | Volver a portada y buscar | Medio | Sí, en portada | La actividad queda enterrada |
| B. Botón "Menú" bajo la barra de arriba | Actividad | 2 toques | Lejos (arriba) | Sí | La idea inicial; ocupa una fila arriba |
| C. "Menú" como quinta pestaña de abajo | Actividad | 2 toques | Cerca | Sí | Patrón "Más" de Android y de las apps grandes |
| D. Hamburguesa arriba | Actividad | 2 toques | Lejos | Poco | Lo que se esconde se usa menos |
## Recomendación
C: la portada pasa a ser la actividad, y la barra de abajo tiene siempre una quinta
pestaña, "Menú", que abre desde abajo una hoja con todos los módulos agrupados (el
mismo lanzador de ahora). Se cierra tocando fuera, con la X o volviendo a tocar Menú.
Es la idea de B, un botón que despliega las opciones, pero puesto donde llega el
pulgar y donde está el resto de la navegación. Funciona igual en todas las pantallas,
y se hace sin JavaScript, solo con HTML y CSS (una casilla que abre la hoja).
## Qué mirar en la prueba
- Desde la portada, cuántos toques hacen falta para llegar a Tribus, a Votaciones y a
Ajustes, y desde dentro de un foro.
- Si alguien que no conoce la app encuentra el menú sin que se lo digan.
- Si al volver atrás la hoja se queda abierta (no debería).
- Que la barra de cinco quepa a 360 px de ancho.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 280 KiB

After

Width:  |  Height:  |  Size: 305 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

After

Width:  |  Height:  |  Size: 160 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 93 KiB

After

Width:  |  Height:  |  Size: 94 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 133 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 92 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Before After
Before After

View file

@ -48,8 +48,8 @@ def portada():
d.rectangle((80, bottom + 12, 420, bottom + 20), fill=FG)
d.text((80, 196), "Rama PRUEBAS del hacklab · base Oasis 1.3.3 · tema Acampada, pensado para el pulgar",
font=font(SANS, 27), fill=MUTED)
shots = [("01-portada.png", "Lanzador de módulos"), ("02-tribus.png", "Tribus en filas"),
("03-votacion.png", "Votar en semáforo"), ("07-oasismobile.png", "O el tema del dev")]
shots = [("01-portada.png", "Actividad al abrir"), ("02-tribus.png", "Tribus en filas"),
("03-votacion.png", "Votar en semáforo"), ("07-oasismobile.png", "El menú, tema del dev")]
pw, gap, top = 320, 50, 270
x = (W - (4 * (pw + 20) + 3 * gap)) // 2
cap = font(ANTON, 34)
@ -80,7 +80,7 @@ def esquema():
d.text((46, 26), "LA INTERFAZ DE MÓVIL, POR DENTRO", font=font(ANTON, 46), fill=FG)
bottom = d.textbbox((46, 26), "LA INTERFAZ DE MÓVIL, POR DENTRO", font=font(ANTON, 46))[3]
d.rectangle((46, bottom + 10, 260, bottom + 16), fill=FG)
d.text((46, bottom + 30), "Casi sesenta módulos no caben en una pantalla de teléfono. Se reparten en tres piezas.",
d.text((46, bottom + 30), "Casi sesenta módulos no caben en una pantalla de teléfono. Lo primero es lo que pasa; el resto, en el menú.",
font=font(SANS, 18), fill=MUTED)
# el movil esquematico
@ -89,21 +89,19 @@ def esquema():
d.rounded_rectangle((px0 + 16, py0 + 20, px1 - 16, py0 + 84), 14, fill=BG, outline=FG, width=3)
s = font(SANS, 15)
d.text((px0 + 46, py0 + 42), "logo · no molestar · avatar", font=s, fill=FG)
secciones = [("COMUNIDAD", 8), ("BIBLIOTECA", 2), ("GOBERNANZA", 2)]
# en medio, la actividad: lo que ha pasado en la red
y = py0 + 110
for nombre, n in secciones:
d.text((px0 + 40, y), nombre, font=font(ANTON, 17), fill=FG)
d.line((px0 + 40, y + 26, px1 - 40, y + 26), fill=FG, width=3)
y += 38
for i in range(n):
cx = px0 + 48 + (i % 4) * 76
if i and i % 4 == 0:
y += 62
d.rounded_rectangle((cx, y + 4, cx + 48, y + 52), 12, fill=FG)
d.rounded_rectangle((cx, y, cx + 48, y + 48), 12, fill=BG, outline=FG, width=3)
y += 72
d.text((px0 + 40, y), "ACTIVIDAD", font=font(ANTON, 22), fill=FG)
d.line((px0 + 40, y + 32, px1 - 40, y + 32), fill=FG, width=3)
y += 52
for i in range(4):
d.rounded_rectangle((px0 + 40, y, px1 - 40, y + 86), 12, fill=BG, outline=FG, width=3)
d.rectangle((px0 + 56, y + 18, px0 + 150, y + 30), fill=FG)
d.rectangle((px0 + 56, y + 44, px1 - 70, y + 52), fill=MUTED)
d.rectangle((px0 + 56, y + 62, px1 - 120, y + 70), fill=MUTED)
y += 104
d.rounded_rectangle((px0 + 16, py1 - 84, px1 - 16, py1 - 20), 14, fill=NEON, outline=FG, width=3)
d.text((px0 + 92, py1 - 62), "barra: 4 atajos que eliges tú", font=s, fill=FG)
d.text((px0 + 62, py1 - 62), "4 atajos que eliges tú · MENÚ", font=s, fill=FG)
bx0, bx1 = 560, 1320
cajas = [
@ -111,15 +109,14 @@ def esquema():
["El logo vuelve al inicio y el avatar abre tu perfil.",
"En medio, el botón de No molestar del Teléfono.",
"Con muchos módulos activos salen también los filtros Personal y Social."], BG),
((bx0, 375, bx1, 565), "EN MEDIO — EL LANZADOR",
["Los módulos activos en una rejilla de iconos, por secciones,",
"como el cajón de apps del móvil. Los nombres son los del Oasis",
"oficial: Comunidad, Biblioteca, Gobernanza…",
"Solo en la pantalla de inicio; dentro de cada módulo, filtros en fichas."], BG),
((bx0, 600, bx1, 750), "ABAJO — LOS ATAJOS",
["Cuatro módulos a tu elección: ni uno más, que es para el pulgar.",
"Se cambian en Herramientas → Tu barra. La elección se guarda",
"en tu nodo, así que sigue ahí después de cerrar la aplicación."], NEON),
((bx0, 375, bx1, 565), "EN MEDIO — LA ACTIVIDAD",
["Al abrir la app se ve lo que ha pasado en la red, no un menú.",
"Dentro de cada módulo, los filtros van en fichas pequeñas",
"y el botón principal (crear tribu, crear sala…) siempre igual."], BG),
((bx0, 600, bx1, 750), "ABAJO — LOS ATAJOS Y EL MENÚ",
["Cuatro atajos a tu elección y una quinta pestaña fija, Menú,",
"que abre desde abajo una hoja con todos los módulos por secciones",
"(Comunidad, Biblioteca, Gobernanza…). Está en todas las pantallas."], NEON),
]
flechas = [((px1 + 10, py0 + 52), (bx0 - 12, 262)), ((px1 + 10, 440), (bx0 - 12, 470)),
((px1 + 10, py1 - 52), (bx0 - 12, 675))]