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
69
docs/ESTUDIO_NAVEGACION.md
Normal 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.
|
||||
|
Before Width: | Height: | Size: 280 KiB After Width: | Height: | Size: 305 KiB |
|
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 92 KiB |
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 64 KiB After Width: | Height: | Size: 61 KiB |
|
|
@ -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))]
|
||||
|
|
|
|||