MF-03 · shell · sep 2026

Mobile · shell, navegación y dashboard

Un orbe marino con la aurora alrededor, y todo lo que cuelga de él.

El esqueleto de la app autenticada. Cuatro pestañas y, entre la segunda y la tercera, el orbe: un núcleo marino con un anillo de --grad-marca, mordido por una muesca de la barra. Al tocarlo, el + gira a ×, el orbe vuela y aterriza como roundel en la cabecera noche del sheet de crear. Arriba, el wordmark, el chip de ruta con su punto vivo y la campana con contador. Detrás, los sheets de ruta, notificaciones e idioma, la pantalla Más, el centro de notificaciones, el home con sus widgets y los tres avisos que la web ya tiene. Veintitrés pantallas a 390 × 844, contrato .phone > .scr de MF-01.

Firma
orbe 60 · anillo aurora 5
Coreografía
vuelo 420 + aterrizaje · 640 ms
Tabs
4 + orbe · muesca r34
Más
pantalla /account/mas
Sheets
crear · ruta · campana · idioma
Nativo
Moti + Reanimated
Pantallas
23 · 390 × 844

01El esqueleto

mobile-shell/index.tsx · mobile-top-bar.tsx · mobile-bottom-tabs.tsx · mobile-tab-items.ts

La web ya diseñó el shell móvil: top bar de 56 con wordmark, chip de ruta, campana y avatar; barra de 64 con cuatro pestañas y un FAB entre la segunda y la tercera; el <main> como único scroll. La app lo replica con safe areas de verdad —el notch arriba, el indicador de inicio abajo— y lo supera en dos sitios: el orbe y su muesca, y la campana que dice cuántas.

9:41●●●
🇨🇳China
3FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito2En almacén1Listos para retiro1
🇨🇳Desde ChinaEn tránsito
12 sep 2026
Fecha estimada de entrega · llega en 7 días
Número de trackingSF1502 3341 88CN
Fecha de creación18 ago 2026
Ver detalle
🇺🇸Desde USAEn revisión
Por confirmar
Fecha estimada de entrega
Número de tracking1Z 999 AA1 01 2345 6784
Fecha de creación2 sep 2026
Ver detalle
Pagos pendientes
Ver todos
$1.250,00🇨🇳Desde China
Pagar
  1. Top bar de 56 bajo la barra de estado

    useSafeAreaInsets().top como padding real, no el --mobile-safe-area-top condicional de la PWA. Fondo blanco al 72 % con expo-blur (intensidad 20, saturate), línea border/40 y la sombra del 4 % tintada a marino. Rejilla 1fr auto 1fr: wordmark a la izquierda, chip centrado, campana y avatar a la derecha, todos de 44 de zona táctil.

  2. El wordmark es el mismo vector de la puerta

    MogosWordmark de MF-02 (cinco paths + punto) a 74 px, tinta marino. Un solo logo en todo el cliente: puertas, sidebar web, top bar. Toca y vuelve a /account.

  3. El chip de ruta: punto vivo, bandera, nombre corto

    32 de alto, píldora, 10 px Geist medium. El punto de 6 lleva el ping de la web (escala 2,4 y fade, 1 s, cubic-bezier(0,0,.2,1)) en success-500 del producto —la web usa emerald-500 de Tailwind, que no está en la paleta— y la bandera de CountryFlag. «China» / «USA» por getCorridorShortName; «Todas las rutas» con el globo y el punto apagado.

  4. La campana cuenta

    La web muestra un punto marino y esconde la cifra en sr-only. En el teléfono la cifra es lo útil: píldora marino de 16 con el número de notifications/unread-count, anillo blanco de 2. Marino y no rojo, por la misma razón que la web anotó: el azul es el idioma de esta zona; el rojo, de los errores. Polling de 60 s como use-unread-count.

  5. Cuatro pestañas y un hueco de 64

    MOBILE_TAB_ITEMS tal cual: Inicio (activo solo en /account exacto), Fletes, Almacén, Más. Icono 18 + etiqueta 10; inactivo muted-foreground, activo brand-700. Almacén lee nav-feature-flags: comingSoon → chip «Pronto» (brand-500, 8 px bold) y el tap abre el modal, nunca navega. Más lleva el punto error-500 cuando sidebar-counts.pendingPayments > 0.

  6. La muesca

    La barra no es un rectángulo: una máscara radial la muerde alrededor del orbe (radio 34 = 30 del orbe + 4 de aire) y un anillo de 71 dibuja el borde de la muesca con la misma línea de la barra. En RN: react-native-svg con un Path de la barra + BlurView enmascarado (MaskedView). Es lo que hace que el orbe «se escape» de la barra sin el anillo blanco de 3 px de la web.

  7. Safe area abajo: 64 + 34

    La barra mide 64; debajo, el inset del indicador de inicio (34 en iPhone con Face ID, 0 en Android con gestos de tres botones). El fondo de la barra cubre las dos alturas; las pestañas ocupan solo las 64 de arriba. En Android con barra de navegación de botones el shell la pinta del mismo blanco al 72 %.

  8. Un solo scroll

    <main> es el único contenedor que se mueve (ScrollView/FlashList por pantalla con contentInset inferior de 98 + 12). Top bar y tabs no viajan con el teclado: KeyboardAvoidingView vive dentro del main, como el useKeyboardInset de la web.

Fletes tab activo · sub-nav de MF-01 · el contenido lo pone MF-06
9:41●●●
🇨🇳China
3FS
Fletes
Almacén tap sobre «Pronto» → ComingSoonFeatureModal · no navega
9:41●●●
🇨🇳China
3FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito2En almacén1Listos para retiro1
🇨🇳Desde ChinaEn tránsito
12 sep 2026
Fecha estimada de entrega · llega en 7 días
Próximamente

Servicio de Almacenaje

Pronto podrás guardar tu mercancía en nuestros almacenes y pagar solo por el volumen que uses. Reserva, controla tu inventario y haz seguimiento desde un mismo lugar.

  • Reserva espacio por CBMToma el espacio que necesitas en metros cúbicos.
  • Gestiona tu inventarioRegistra y controla tus productos almacenados.
  • Paga por lo que usasSolo pagas el volumen ocupado, sin costos fijos.
Entendido
Todas las rutas chip sin filtro · globo · punto apagado · Más sin pendientes
9:41●●●
Todas las rutas
FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito3En almacén2Listos para retiro1
🇨🇳Desde ChinaEn tránsito
12 sep 2026
Fecha estimada de entrega · llega en 7 días
Número de trackingSF1502 3341 88CN
Fecha de creación18 ago 2026
Ver detalle
🇺🇸Desde USAEn tránsito
9 sep 2026
Fecha estimada de entrega · llega en 4 días
Número de tracking1Z 999 AA1 01 2345 6784
Fecha de creación2 sep 2026
Ver detalle
Pagos pendientes

Tab activo con pop (escala 1 → 1,18 → 1 en 260 ms ease-spring + haptic light) y press a .95. Un Pressable que abre un modal (Almacén) se marca accessibilityRole="button" y accessibilityHint="Próximamente"; los otros tres son tab con selected. Las banderas salen de CountryFlag (SVG local), no del emoji del SO.

02El orbe que aterriza

mobile-fab.tsx · mobile-create-sheet.tsx · create-items.ts · use-profile-gate.ts

La firma visual de la app. La web tiene un disco de 48 en brand-700 con un anillo blanco; aurora-familia ya había decidido que el FAB móvil es una de las tres apariciones exactas de --grad-marca. El problema de un disco entero en degradado es que el + blanco cae sobre celeste-deep y lima y no contrasta. Solución: el núcleo es marino (el + blanco mide 15:1) y la aurora es el anillo de 5 px que lo rodea. Al tocar, el + gira a ×, el orbe vuela en diagonal y aterriza como roundel en la cabecera noche del sheet, que sube debajo. Una sola coreografía de 640 ms.

9:41●●●
🇨🇳China
3FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito2En almacén1Listos para retiro1
🇨🇳Desde ChinaEn tránsito
12 sep 2026
Fecha estimada de entrega · llega en 7 días
Número de trackingSF1502 3341 88CN
Fecha de creación18 ago 2026
Ver detalle
🇺🇸Desde USAEn revisión
Por confirmar
Fecha estimada de entrega
Crear
Iniciar un nuevo flujo desde aquí
Nuevo
Nuevo envío
Nueva cotización
Otros
Calcular costo
Reportar problema
  1. 60 de orbe, 5 de aurora, 26 de +

    El disco sube 22 px por encima de la barra y la muesca lo rodea con 4 px de aire. Anillo --grad-marca a 120°, núcleo marino con un brillo interior blanco al 18 %, sombra 0 8px 22px rgba(2,27,84,.28) —la que aurora-familia dio al FAB, tintada a marino. El + va a trazo 2,5 (la web usa 2 sobre 20 px; a 26 px y sobre marino, 2 se ve fino).

  2. La coreografía · 640 ms, tres actos

    0–160 press: escala .92 + Haptics.impactAsync(Medium). 160–580 vuelo: el orbe viaja translate(−147, −281) y escala a .66 con ease-in-out mientras el + gira 45° con ease-spring; el velo marino al 70 % entra en 260 y el sheet sube en 420 ease-in-out (la curva de sheet de MF-01). 560–700 aterrizaje: el roundel aparece con pop de 160 y los ítems entran con rise y stagger de 40 ms. Cerrar es el camino inverso a 260.

  3. Cabecera noche, cuerpo de día

    La cabecera es la banda noche de MF-01 (--mogos-grad-rail + glow celeste), la misma de DialogHeader tone="noche" y del modal Próximamente: la promesa la hace la marca. Asa blanca al 28 %, título Lemon Milk 16/600, descripción Poppins 12 en on-marino-soft. El radio del sheet es 20 —el del modal Próximamente— y no el 10 del resto de sheets: es la única superficie con permiso.

  4. «Nuevo» son tiles, «Otros» son filas

    NEW_CREATE_ITEMS crea entidades: dos tiles con plate de 40 en celeste-soft (envío) y lima-soft (cotización), tinta marino, etiqueta Poppins 14/500. OTHER_CREATE_ITEMS son herramientas: filas de 44 con el plate brand-500/10 de la web. Marca para lo que crea, producto para lo que ayuda. «Reservar storage» no aparece: create-items.ts lo filtra por nav-feature-flags; cuando el flag cambie a visible entra como tercer tile con plate celeste.

  5. El gate que la web móvil olvida

    En web el sheet enlaza directo a /account/create-shipment; la página /account sí pasa por useProfileGate. La app corrige la asimetría: los dos tiles llaman requireCompleteProfile(() => router.push(…)). Con el perfil a medias, el sheet lo avisa antes (siguiente maqueta) y el tap abre el ProfileGateModal con el callback retenido: si el perfil se completa con el modal abierto, la navegación ocurre sola.

  6. Reduced motion

    Con useReducedMotion(): sin vuelo, sin giro, sin stagger. El velo y el sheet aparecen con fade de 80 ms y el roundel ya está. El orbe sigue siendo el orbe: la firma es la forma, no el movimiento.

o abrí la página con ?mid=380 para congelarla en ese milisegundo.
t = 0reposo
120 mspress .92 · haptic
330 msvuelo · velo · sheet sube
500 msel + ya es ×
720 msaterrizó · tiles entran

Tira de fotogramas: cinco clones de la misma maqueta congelados con --at. La coreografía se escribe una vez y los fotogramas salen solos, como el splash de MF-02.

Perfil incompleto el sheet avisa antes del tap · tiles siguen activos
9:41●●●
🇨🇳China
1MR
Tu perfil está incompleto (75%)Completa tus datos para una mejor experiencia. Falta: Verificar teléfono, Agregar dirección de envío
Completar
¡Hola María!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito0En almacén0Listos para retiro0

Sin envíos

No tienes envíos registrados todavía.

Crear envío
Crear
Iniciar un nuevo flujo desde aquí
Tu perfil está incompleto (75%)Falta: Verificar teléfono, Agregar dirección de envío
Completar
Nuevo
Nuevo envío
Nueva cotización
Otros
Calcular costo
Reportar problema
ProfileGateModal tras el tap en «Nuevo envío» · callback retenido
9:41●●●
🇨🇳China
1MR
Tu perfil está incompleto (75%)Completa tus datos para una mejor experiencia. Falta: Verificar teléfono, Agregar dirección de envío
Completar
¡Hola María!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito0En almacén0Listos para retiro0

Sin envíos

No tienes envíos registrados todavía.

Crear envío
Completa tu perfil
Para garantizarte un mejor servicio, necesitas completar tu perfil antes de continuar.
  • Verificar teléfono
  • Agregar dirección de envío
Ahora noCompletar perfil

Con el perfil a medias el sheet no bloquea: avisa con la banda de IncompleteProfileBanner (warning-soft, tinta warning-deep 5,03:1) y deja tocar. El tap abre el ProfileGateModal de la web —plate primary/10, título Lemon Milk 24, lista de faltantes con warning-500, botones apilados— y guarda el destino: «Completar perfil» lleva a /complete-profile; al volver con el perfil completo, la app navega sola a donde se iba.

03La ruta

mobile-corridor-sheet.tsx · corridor-context.tsx · corridor-storage.ts · corridor-portal-welcome.tsx · corridors/stats

El corredor filtra toda la app: envíos, pagos, salidas. El chip del top bar abre el sheet de ruta con las mismas filas del CorridorSwitcher de escritorio —«Todas las rutas» y una por corredor con bandera, punto vivo y las cifras de corridors/stats— y la elección persiste en MMKV (el corridor-storage.ts de la web sobre localStorage). Al abrir la app con una ruta activa, el toast de bienvenida de CorridorPortalWelcome lo recuerda una vez por sesión.

MobileCorridorSheet sube 420 · claro · radio 10 · filas con stats
9:41●●●
🇨🇳China
3FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito2En almacén1Listos para retiro1
🇨🇳Desde ChinaEn tránsito
12 sep 2026
Fecha estimada de entrega · llega en 7 días
Cambiar ruta
Por ruta
Todas las rutasPor ruta
🇨🇳
China 12 envíos · 2 en aduanas
🇺🇸
USA 4 envíos
CorridorPortalWelcome toast Sileo al abrir con ruta activa · una vez por sesión
9:41●●●
🇨🇳China
3FS
🇨🇳Seguimos mostrando China → Venezuela

Puedes cambiar la ruta cuando quieras desde el indicador en la parte superior.

¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito2En almacén1Listos para retiro1
🇨🇳Desde ChinaEn tránsito
12 sep 2026
Fecha estimada de entrega · llega en 7 días
Número de trackingSF1502 3341 88CN
Fecha de creación18 ago 2026
Ver detalle
🇨🇳Desde ChinaListo para recoger
Hoy
Fecha estimada de entrega
ConnectionPill sin red · pastilla Sileo bajo la barra de estado · versión mínima (resiliencia completa en MF-14)
9:41●●●
🇨🇳China
3FS
Sin conexiónReintentar
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito2En almacén1Listos para retiro1
🇨🇳Desde ChinaEn tránsito
12 sep 2026
Fecha estimada de entrega · llega en 7 días
Número de trackingSF1502 3341 88CN
Fecha de creación18 ago 2026
Ver detalle
  1. Las filas del escritorio, a 44

    Plate de 36 con la bandera (o el globo muted para «Todas»), nombre corto + punto vivo, meta en 12 muted con metaShipments y metaInCustoms de corridors/stats. Activa: bg-accent + check brand-700. Elegir cierra el sheet e invalida las queries filtradas: envíos, pagos, salidas y los contadores.

  2. Persistencia y saneo

    corridor-context.tsx hidrata desde MMKV al montar, sincroniza al cambiar y limpia sola si el corredor guardado ya no existe en corridors (desactivado). Sin sesión no hay corredor: el logout borra la clave.

  3. La bienvenida es un toast de Sileo

    El texto de corridor-portal-welcome.tsx (todavía sin i18n en web —deuda anotada) en la pastilla expandida de MF-01: bandera en el disco, título en sileo-info, descripción al 50 %. 5 s, resorte de 640 al entrar, sessionStorage → un flag en memoria por arranque de la app.

  4. ConnectionPill, la versión mínima

    La cantera (mobile-client/components/network) la dibuja como píldora gris #1f2937 con punto y «Reintentar». Aquí se redibuja con la pastilla Sileo de MF-01 para no tener dos toasts oscuros: punto rojo de 8, «Sin conexión», acción al 14 %. Detecta con NetInfo + /health; la resiliencia completa (cola, reintentos, estados por pantalla) es de MF-14.

04La campana y el centro

mobile-notifications-sheet.tsx · notification-item.tsx · notification-card.tsx · notification-icons.ts · /account/notifications

Dos superficies, como en la web. La campana abre un sheet con las diez últimas y «Marcar todas»; «Ver todas las notificaciones» lleva a /account/notifications, el centro completo con la banda de día, las pestañas Todas / Sin leer / Leídas, los filtros de prioridad y tipo, y la lista —que en el teléfono no pagina: carga más al llegar al final. El icono y el plate de cada fila salen del mapa de los 38 tipos (notification-icons.ts): cinco categorías más las cuatro excepciones por tipo.

MobileNotificationsSheet 10 últimas · 3 sin leer · marcar todas
9:41●●●
🇨🇳China
3FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Notificaciones
3 sin leer
Marcar todas
Tu carga llegó a Puerto Cabello
hace 2 h
Tu flete FL-2026-0912 llegó a Puerto Cabello. Próxima parada: Caracas.
Parada en tránsito
Pago recibido
hace 5 h
Tu pago de $1.250,00 ha sido registrado exitosamente.
Pago recibido
Salida próxima a cerrar
ayer
La salida marítima Guangzhou → La Guaira cierra carga el 8 de septiembre.
Salida próxima a cerrar
Estado de orden actualizado
hace 2 días
Tu orden ORD-4471 ha cambiado a estado: En tránsito.
Estado de orden actualizado
Nueva cotización
hace 3 días
Se ha generado la cotización COT-0928 por $1.250,00.
Cotización creada
Nuevo anuncio
hace 4 días
Horario especial de recepción en Guangzhou durante la Feria de Cantón.
Nuevo anuncio
¡Perfil completado!
hace 1 semana
Tu perfil está completo. Ya puedes usar todos los servicios de Mogos.
Perfil completado
Ver todas las notificaciones
Sheet vacío NotificationEmpty · sin pie «Ver todas»
9:41●●●
🇨🇳China
FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Notificaciones

No tienes notificaciones

Cuando recibas notificaciones, aparecerán aquí

/account/notifications banda de día · tabs · filtros · cards · carga más
9:41●●●
🇨🇳China
3FS
Notificaciones
Gestiona todas tus notificaciones y alertas
24
3 sin leer
Marcar todas
TodasSin leer 3Leídas
Filtros:Prioridad Tipo

Tu carga llegó a Puerto Cabello

Tu flete FL-2026-0912 llegó a Puerto Cabello. Próxima parada: Caracas.
Parada en tránsito
hace 2 h

Salida próxima a cerrar

La salida marítima Guangzhou → La Guaira cierra carga el 8 de septiembre.
Salida próxima a cerrarAlta
ayer

Estado de orden actualizado

Tu orden ORD-4471 ha cambiado a estado: En tránsito.
Estado de orden actualizado
hace 2 días

Reserva de almacén creada

Tu reserva RSV-0311 de 4 CBM quedó registrada.
Reserva de almacén creada
hace 6 días
Cargando más…
Sin resultados filtros activos · «Limpiar filtros» · el otro vacío
9:41●●●
🇨🇳China
FS
Notificaciones
Gestiona todas tus notificaciones y alertas
24
Todas leídas
TodasSin leerLeídas
Filtros:Urgente Tipo Limpiar
No hay notificaciones con estos filtros
Intenta cambiar los filtros para ver más resultados
Limpiar filtros
  1. Sheet: la fila de 44 + 2 de canto

    NotificationItem tal cual: plate 36 radio 14 con el color de categoría, título 14 (ink/500 sin leer · ink-soft/400 leída) + punto marino de 6, hora en 11 tabular, mensaje 13 a dos líneas, badge de tipo con el tono de prioridad. El estado no-leída es la barra de 2 px en el canto, marino (rojo si es HIGH/URGENT), nunca el fondo. Las acciones que en web salen al hover, en el teléfono salen al swipe (marcar leída a la derecha, borrar a la izquierda) —la píldora flotante de la maqueta es la que aparece durante el gesto.

  2. Cinco plates y cuatro excepciones

    status celeste-soft/marino · payment success-soft/success-deep · storage lima-soft/marino · shipping marino/celeste (la noche de la marca) · system warning-soft/warning-deep. ACCOUNT_CREATED → user-plus, PROFILE_COMPLETED → circle-check (los dos con plate status), ANNOUNCEMENT_PUBLISHED → megáfono, NEW_CATALOG → libro. Es el mapa exacto de notification-icons.ts; los 38 tipos resuelven ahí.

  3. El centro: cards y carga infinita

    NotificationCard radio 14, plate 48, título Geist 14/600, barra de 4 en el canto para las no leídas, punto con pulso, menú ⋯ (marcar leída · ver detalles · eliminar) como action sheet. La paginación «Anterior / Siguiente» de la web se convierte en FlashList con onEndReached y el pie «Cargando más…»: notifications?page=n&limit=20 es la misma API, consumida en cursor.

  4. Filtros en sheet, no en popover

    Las pestañas Todas / Sin leer (con contador celeste) / Leídas son los Tabs pill de MF-01. Prioridad y Tipo son los Select del producto que en táctil abren un bottom sheet con sus opciones (MF-01 §5). Con un filtro activo aparece «Limpiar» y, si no hay resultados, el vacío con el plate celeste → lima de la web y el mismo CTA.

  5. Tocar navega al actionUrl, mapeado

    Cada notificación trae la ruta web (/account/my-shipments/123, /account/freights/…, /account/payments). La app la pasa por un mapa ruta web → ruta app (el mismo que MF-10 usará para el deep link del push) y marca leída al tocar. Los destinos que aún no existen (04, 06, 07) abren su tab con el detalle en cola.

  6. Marcar todas y los contadores

    «Marcar todas» llama notifications/mark-all-read, pone el contador de la campana en 0 al instante (optimistic) e invalida unread-count. El polling de 60 s de use-unread-count y use-sidebar-counts sigue igual que en web hasta que MF-10 traiga realtime.

05Más es una pantalla

/account/mas/page.tsx · user-avatar-menu.tsx · lib/i18n/config.ts · signOut

Decisión de Fabrizio en este estudio: el cuarto tab navega a /account/mas, como hace un tab nativo, y el MobileMoreSheet de la web no se porta. Una sola superficie: cabecera con avatar, nombre y correo sobre la aurora de día; Cuenta, Accesos, Preferencias y Cerrar sesión. El tab queda activo, la ruta es deep-linkeable y el gesto atrás funciona. Idioma abre un sheet con los tres locales; cambiar uno cambia la app entera sin reiniciar (i18next.changeLanguage + expo-localization solo para el default).

9:41●●●
🇨🇳China
3FS
FS
Fabrizio Spiotta
fabrizio@cresco.so

Cuenta

Pagos2
Cotizaciones3
Mis direcciones

Accesos

Catálogo
Sedes Mogos
Enviar sugerencia

Preferencias

IdiomaEspañol
Cerrar sesión
9:41●●●
🇨🇳China
3FS
FS
Fabrizio Spiotta
fabrizio@cresco.so

Cuenta

Pagos2
Cotizaciones3
Mis direcciones

Accesos

Catálogo
Sedes Mogos
Enviar sugerencia

Preferencias

IdiomaEspañol
Idioma
La app entera cambia al instante
Españoles
Englishen
中文zh
  1. Cabecera: aurora de día, no degradado brand

    La web pinta from-brand-500 to-brand-700 con texto blanco: el azul de producto que la serie aurora está retirando. Aquí va la banda de día (celeste-soft → lima-soft, la que la web ya usa en /account/notifications) con avatar de 48, nombre Poppins 14/600 y correo 12 ink-soft, ambos en marino (14,57:1). Tocarla lleva a /account/profile.

  2. Las filas, agrupadas y con sus cifras

    Tres grupos con cabecera versalita 11/600 muted y filas de 44: plate muted 36, etiqueta Poppins 14/500, chevron. Pagos lleva la píldora error-500 con sidebar-counts.pendingPayments; Cotizaciones, la cifra de pendingServiceQuotes en meta; Idioma muestra el locale activo con su nombre, no su código.

  3. Lo que no está, a propósito

    Recompensas y Tutoriales siguen ocultos por producto (2026-08-09, DECISIONS #12). Mi perfil no es una fila: es la cabecera. El correo del usuario vive solo aquí y en el menú de escritorio.

  4. Idioma en sheet: es · en · zh

    La página web de /account/mas solo alterna es ↔ zh; el sheet web y el menú de escritorio ofrecen los tres. La app ofrece los tres siempre: sheet claro de MF-01 con el nombre en su propia lengua (lang en cada fila), el código en versalita y el check brand-700. Elegir cierra el sheet, llama changeLanguage y persiste en MMKV; el copy de toda la app se re-renderiza sin reiniciar (DECISIONS #18).

  5. Cerrar sesión, sin confirmación

    Como en web: la fila roja llama supabase.auth.signOut(), borra expo-secure-store, el corredor y la caché de queries, y reemplaza el stack por /login. El tab «Más» pierde su punto porque ya no hay contadores.

  6. Tab activo + pop

    Al entrar, «Más» toma brand-700 con el pop de 260 ms y conserva el punto rojo si hay pagos pendientes: el punto es información, no una llamada al tab.

06El home, con sus tres widgets

(app)/account/page.tsx · my-shipments.tsx · pending-payments.tsx · departures-calendar.tsx · storage-pricing-dialog.tsx

/account compone cuatro bloques y la app los replica en una columna: la banda de bienvenida (aurora de día, la que la web ya usa en el centro de notificaciones y que aurora-home pidió para el saludo), Mis envíos con los KPI-chips que filtran y el carrusel de cards, Pagos pendientes con el monto en display y «Pagar», y Próximas salidas con el calendario codificado por corredor. Todo filtrado por la ruta del chip. Pull-to-refresh nativo, skeletons que heredan la superficie y vacíos que invitan.

Scroll Pagos pendientes y Próximas salidas · calendario con corredores
9:41●●●
Todas las rutas
3FS
Ver detalle
Pagos pendientes
Ver todos
$1.250,00🇨🇳Desde China
Pagar
Fecha límite10 sep 2026
CódigoCOT-0928
ReferenciaFL-2026-0912
EstatusParcial
$380,00🇺🇸Desde USA
Pagar
Fecha límite2 sep 2026
CódigoCOT-0901
EstatusVencido
Próximas salidas
Elige un día en el que se envíe un contenedor para obtener más información y establecer recordatorios.
LuMaMiJuViSáDo
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Origen del envíoDesde ChinaDesde USAAmbos
Skeleton primer aterrizaje · la banda ya sabe el nombre · el resto hereda la superficie
9:41●●●
🇨🇳China
FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
Pagos pendientes
Vacíos cuenta nueva · sin envíos, sin pagos, sin salidas · un solo CTA
9:41●●●
Todas las rutas
1MR
¡Hola María!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito0En almacén0Listos para retiro0

Sin envíos

No tienes envíos registrados todavía.

Crear envío
Pagos pendientes

Sin pagos pendientes

No tienes pagos pendientes en este momento.

Próximas salidas
No hay próximas salidas programadas.
Pull-to-refresh RefreshControl nativo en marino · refetch de los cuatro widgets
9:41●●●
🇨🇳China
3FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito2En almacén1Listos para retiro1
🇨🇳Desde ChinaEn tránsito
12 sep 2026
Fecha estimada de entrega · llega en 7 días
Número de trackingSF1502 3341 88CN
Fecha de creación18 ago 2026
Ver detalle
StoragePricingDialog «Ver tarifas» · tiers de storage/pricing · aviso de retiro
9:41●●●
🇨🇳China
3FS
¡Hola Fabrizio!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito2En almacén1Listos para retiro1
Tarifas de almacenamiento
Precios según el espacio reservado
0 - 5 CBMPor uso
$0,50/día/CBM
Solo pagas por los días que almacenas
5 - 20 CBMMensual fijo
$180,00/mes
20+ CBMNegociable
Precio negociable
Contáctanos para obtener una cotización personalizada
Tarifa de retiroCada solicitud de retiro tiene un costo de $20
Día con salidas diálogo del calendario · DepartureCard por corredor · recordatorio
9:41●●●
Todas las rutas
3FS
Próximas salidas
Elige un día en el que se envíe un contenedor para obtener más información y establecer recordatorios.
LuMaMiJuViSáDo
31
1
2
3
4
5
6
7
8
9
10
11
12
13
2 salidas este día
Marítimo🇨🇳Desde China
Abierto
2026-09-06Fecha límite de carga
2026-09-08Fecha de salida
OrigenGuangzhou
DestinoLa Guaira
Marítimo🇺🇸Desde USA
Cierre próximo
2026-09-07Fecha límite de carga
2026-09-08Fecha de salida
RecordatorioNinguno
CerrarGuardar recordatorio
  1. La bienvenida es la banda de día

    PageFrame pone hoy el título en Lemon Milk 24 marino sobre bg-secondary, sin banda; aurora-home (2026-08-07) decidió la banda y la web la estrenó en /account/notifications como .mogos-day-band. La app la lleva al saludo: celeste-soft → lima-soft con los dos glows a la deriva (26 s / 37 s), tinta marino (14,57:1 / 15,35:1). Título y subtítulo son los de account.dashboard.*, literales.

  2. «Crear envío» es el orbe

    En web showActionsOnMobile mete dos botones en la cabecera porque el teléfono no tenía otra forma de crear. La app sí: el orbe. La banda conserva solo «Ver tarifas» (secundario pequeño, abre StoragePricingDialog); «Crear envío» queda en el vacío de Mis envíos, donde sí es la siguiente acción. Los dos pasan por requireCompleteProfile.

  3. KPI-chips que filtran

    Verbatim de kpi.tsx: radio 14, borde mogos-line, Poppins 14; activo borde marino + marino/5 + tinta marino. Tocar filtra el carrusel (inTransit / inWarehouse / readyForPickup) y volver a tocar quita el filtro. Las cifras salen de los mismos 100 pedidos de orders?perPage=100 (deuda: pedir un agregado; MF-04 la hereda).

  4. ShipmentCard, 280 de ancho, en carrusel con snap

    Fondo gray-50, radio 14, barco/avión en brand-500, corredor «friendly» + badge de estatus (ORDER_STATUS_VARIANTS), ETA en Lemon Milk 24 extralight brand-700 (o «Por confirmar» en tinta), tracking del proveedor como cifra protagonista, «Ver detalle» terciario al detalle de MF-04. FlashList horizontal con snapToInterval 296 y el degradado de la máscara al borde.

  5. Pagos pendientes: el monto manda

    PendingPayment tal cual: monto en display 24 extralight tabular + corredor, «Pagar» primario, y las cuatro filas de AttributeField (fecha límite solo si viene, código, referencia, estatus con Badge error / warning / default). «Pagar» abre el portal en WebView (DECISIONS #15, forma en MF-07). «Ver todos» → /account/payments.

  6. El calendario habla la paleta

    Celdas de 46 con el número arriba y el barco/avión en marino (trazo 1,6) abajo; puntos por corredor: China --rojo, USA marino (el celeste desaparecía sobre su propia celda —nota de departures-calendar.tsx:758); tintes rojo/10, marino/8 y el degradado de ambos al 12 %; hoy con el número en disco marino. Leyenda con los tres swatches. Con ruta activa, puntos y tintes se apagan porque ya no discriminan nada.

  7. El día abre un diálogo

    Título «N salidas este día», una DepartureCard por salida (fondo rojo/10 o azul/10 según corredor, fechas en display, origen → destino, badge Abierto / Cierre próximo / Cerrado), el Select de recordatorio (que en la web todavía no guarda nada) y «Cerrar» / «Guardar recordatorio». El recordatorio real llega con MF-10.

  8. Cargar, refrescar, vaciar

    Skeleton: la banda ya conoce el nombre (viene de users/me persistido en MMKV), los widgets muestran su forma en accent con el pulso de 2 s. Pull-to-refresh: RefreshControl nativo en marino, invalida orders, payments/me/pending, departures y los contadores a la vez. Vacíos: los Empty punteados de MF-01, uno por widget, y un solo CTA en toda la pantalla.

07Los tres avisos

incomplete-profile-banner.tsx · profile-gate-modal.tsx · coming-soon-feature-modal.tsx · use-banner-dismiss.ts

La web ya tiene los tres y la app los trae tal cual: el banner de perfil incompleto entre el top bar y el main (se cierra 24 h), el ProfileGateModal que retiene la acción (§02) y el modal Próximamente del tab Almacén (§01). Aquí, el banner sobre el home completo, con lo que empuja y lo que no.

9:41●●●
🇺🇸USA
1MR
Tu perfil está incompleto (50%)Completa tus datos para una mejor experiencia. Falta: Verificar teléfono, Agregar cédula o pasaporte, Agregar dirección de envío
Completar
¡Hola María!
Aquí puedes ver un resumen de tus envíos, pagos pendientes y próximas salidas.
Ver tarifas
Mis envíos
En tránsito1En almacén0Listos para retiro0
🇺🇸Desde USAEn tránsito
9 sep 2026
Fecha estimada de entrega · llega en 4 días
Número de tracking1Z 999 AA1 01 2345 6784
Fecha de creación2 sep 2026
Ver detalle
Pagos pendientes
  1. El banner es parte del chrome, no del scroll

    Va entre el top bar y el <main>, como en mobile-shell/index.tsx: shrink-0, no viaja con el scroll ni con el teclado. Warning-soft, línea warning/28, triángulo y textos en warning-deep (5,03:1). Título con el porcentaje de useProfileCompletion, descripción truncada con la lista de faltantes, «Completar →» en outline y la × que lo esconde 24 h (use-banner-dismiss sobre MMKV).

  2. Los faltantes, con nombre

    MISSING_LABELS de profile-gate-modal.tsx: verificar correo, verificar teléfono, cédula o pasaporte, dirección de envío. Los mismos cuatro pasos del stepper de /complete-profile de MF-02, al que llevan tanto el banner como el modal.

  3. El gate y el banner no compiten

    El banner informa; el gate detiene. Si el banner está cerrado y el usuario toca «Nuevo envío», el gate aparece igual (lee isComplete, no el dismiss). Si el perfil se completa en otra pantalla, los dos desaparecen solos: la query users/me se invalida al volver de /complete-profile.

  4. Próximamente, con la marca

    El modal de Almacén (§01) es el de la web retintado en aurora: radio 20, cabecera noche con el wordmark blanco y su punto rojo, píldora lima con tinta marino (14,44:1), tres filas con plate celeste-soft, CTA .mogos-cta en píldora. coming-soon-context lo abre por feature key; hoy solo existe storage.

  5. Guardas de navegación

    Sin sesión → /login. Todo (app) protegido, incluidas /calculator, /catalog, /locations y /suggestions, que en web quedan fuera del middleware. Los actionUrl y deep links que apunten a una ruta protegida esperan la sesión y luego navegan.

08Lo que hay que escribir en Moti

Moti + Reanimated · escala de MF-01 · useReducedMotion

Cada coreografía de la pieza con su equivalente en nativo. La escala es la del estudio (80 / 160 / 260 / 420 / 640, ease-out, ease-in-out, ease-spring) que Fabrizio cerró en MF-01. Nada de aquí es obligatorio para usar la app: con «Reducir movimiento» activo todo se vuelve fade de 80 ms o nada.

MomentoQué se veDuración · curvaEn nativoReduced motion
Press del orbeescala .92 + haptic medium160 · ease-outPressable + withTiming; Haptics.impactAsync(Medium)haptic sí, escala no
Vuelo del orbetranslate(−147, −281) · scale .66 · + → ×420 · ease-in-out (giro: spring)Animated.View absoluto en el root del shell; useSharedValue de progreso 0→1 que mueve orbe, velo y sheet a la vezsin vuelo; el roundel ya está
Velomarino al 70 % entra260 · ease-outMotiView opacity sobre Modal transparentfade 80
Sheet sube / bajatranslateY 100 % → 0420 abre · 260 cierra · ease-in-outla librería de sheet sale de la tabla comparativa de goal-phases (gorhom / true-sheet); la curva es estafade 80
Aterrizajeroundel pop + tiles rise con stagger 40160 spring · 260 ease-outMotiView con delay por índicetodo visible de entrada
Tab activoicono 1 → 1,18 → 1 + color · haptic light260 · ease-springwithSequence(withSpring) en el icono del tabsolo color
Ping del chipdisco de 6 escala 2,4 y fade, en bucle1000 · cubic-bezier(0,0,.2,1)withRepeat(withTiming), −1; se detiene fuera de focopunto fijo
Campanaal subir el contador: vaivén ±12° + el número hace pop640 · ease-springwithSequence en rotateZ; se dispara cuando unread-count crecesolo el número
Banda de díados glows a la deriva26 s · 37 s · ease-in-outwithRepeat sobre translate + scale de dos View con blur; se pausa en backgroundbanda estática
Skeletonpulso2000 · cubic-bezier(.4,0,.6,1)withRepeat opacity 1 ↔ .5fijo
Toastcae con resorte640 · ease-springSileo de MF-01fade 80
Stack pushslide iOS · fade-through Androidnativoreact-native-screens, no se reimplementanativo

Fuente de verdad de la escala: proposal/mogos-mobile-componentes.html §10 y packages/mobile-ui/src/theme/motion.ts (MF-01). Los 640 ms totales de la coreografía del orbe son 160 de press + 420 de vuelo + 60 de solape con el aterrizaje.

09Lo que queda decidido

docs/specs/2026-09-05-mobile-shell.md
  • Firma

    Orbe: núcleo marino, aurora alrededor

    Elegido por Fabrizio (2026-09-05) sobre el abanico radial y el cuadro marino con punto rojo. El disco entero en degradado se descartó al medir: el + blanco sobre celeste-deep da 2,2:1. Anillo de 5 px con --grad-marca, núcleo marino, + blanco a 15:1. La muesca de la barra es parte de la firma.

  • Coreografía

    El orbe aterriza en el sheet

    Una sola coreografía de 640 ms: press, vuelo en diagonal con giro del +, aterrizaje como roundel en la cabecera noche. La cabecera noche es la banda de MF-01; el radio 20 del sheet de crear es el del modal Próximamente y es la única excepción al radio 10 de los sheets.

  • Gate

    Crear pasa por el perfil, también desde el sheet

    La web móvil enlaza directo y solo /account gatea. La app aplica requireCompleteProfile a los dos tiles y avisa dentro del sheet con la banda de IncompleteProfileBanner. El callback se retiene: completar el perfil termina la acción sola.

  • Más

    Pantalla, no sheet

    Elegido por Fabrizio (2026-09-05): el cuarto tab navega a /account/mas. MobileMoreSheet no se porta. Cabecera en banda de día en lugar del degradado brand; Idioma abre un sheet con es · en · zh (la página web solo alternaba es ↔ zh).

  • Campana

    Contador visible, en marino

    La web esconde la cifra en sr-only y muestra un punto. En el teléfono la píldora de 16 con el número es lo útil. Marino y no rojo, por la misma regla que la web anotó en mobile-top-bar.tsx.

  • Centro

    Scroll infinito, no paginación

    /account/notifications conserva banda, tabs y filtros; «Anterior / Siguiente» se vuelve FlashList + onEndReached sobre la misma API paginada. Las acciones por hover pasan a swipe en la fila y a action sheet en la card.

  • Home

    La bienvenida es la banda de día

    PageFrame web no la tiene; aurora-home la pidió y la web ya la estrenó en el centro de notificaciones. La app la usa en el saludo y en la cabecera de Más. «Crear envío» sale de la cabecera porque ahora existe el orbe; «Ver tarifas» se queda.

  • Verde

    success-500 del producto, no emerald de Tailwind

    El punto vivo del chip y de las filas de ruta usa emerald-500 en web, un color fuera de la paleta del producto. La app usa success-500 (#17b26a), que sí es token. Único cambio de color respecto a la web en toda la pieza; el resto de foráneos (red/blue del corridor-badge, blue-50 del aviso de tarifa) se replican y se anotan como deuda.

  • Sombras

    Tintadas a marino, también el chrome

    Top bar y tabs llevan en web sombras en slate-900; aquí el mismo 4 % / 6 % sobre marino, y el orbe la sombra del FAB de aurora-familia. Cierra la decisión 4 de MF-01 para el shell.

  • Fletes

    El tab existe; el contenido es de MF-06

    La pantalla Fletes se dibuja con su sub-nav (Fletes / Mis envíos) y skeleton para fijar el estado activo del tab y la cabecera; lo que va dentro lo decide el design-studio de MF-06.

  • Almacén

    Flag de la web, modal de la web

    nav-feature-flags se lee igual: comingSoon → chip «Pronto» y modal; hidden (Mi Locker) → no existe. «Reservar storage» entra al sheet de crear como tercer tile el día que el flag cambie (DECISIONS #6).

  • Red

    ConnectionPill = pastilla Sileo

    La píldora gris de la cantera se redibuja con el toast oscuro de MF-01 para no tener dos superficies negras. Versión mínima (NetInfo + /health); la resiliencia completa es de MF-14.

  • Pregunta · Figma

    ¿Hay capturas del Home del Figma viejo?

    El brief pedía pedirlas. En el repo no hay ninguna (design/assets/fotos solo tiene el README). Esta pieza sigue a la web tal como está (DECISIONS #3). Si las capturas existen y traen algo que la web perdió, se revisa antes de goal-phases.

Las dos decisiones de este estudio —el orbe y Más como pantalla— las tomó Fabrizio en la sesión del 2026-09-05 con AskUserQuestion, una a una, sobre tres direcciones cada una. El resto son consecuencias de leer el código de apps/client y de las tres piezas anteriores.