Desviaciones intencionales — Móvil (App mejor que Figma)
Propósito. El objetivo de la paridad de diseño es que la app coincida con el diseño en Figma. Pero no toda diferencia es un defecto: a veces la implementación actual es deliberadamente mejor que el frame de Figma — más usable, más eficiente, o más consistente con el design system / la plataforma Android. Cuando ese es el caso, conservamos la implementación y la registramos aquí con su razón, en lugar de degradarla para igualar el pixel del diseño.
Esto complementa la galería
README.md: una entrada aquí convierte un ❌/⚠️ de la galería en un ✅ (desviación aceptada) — la nota de la galería debe enlazar a la entrada de aquí.
Cómo se decide una desviación
Section titled “Cómo se decide una desviación”Una diferencia se registra como desviación intencional (no como bug) solo si cumple al menos una de estas y ninguna regla de negocio/accesibilidad la contradice:
- Más usuario-amigable — mejora la usabilidad real en un dispositivo táctil (área de toque ≥48dp, afordancia más clara, menos pasos).
- Más eficiente / consistente con el design system — usa un token, un componente Material 3 o un patrón ya establecido en la app, evitando un valor único del frame.
- Más consistente con la plataforma — respeta convenciones de Android/Material (ripple, back gesture, insets, teclado) que el frame —pensado de forma genérica— no refleja.
Requisitos de la entrada: evidencia medida (no “se ve mejor”), el archivo Kotlin, y —si aplica— una nota para que el diseño en Figma se actualice a la implementación (para que el frame deje de ser la “verdad” divergente).
Estado
Section titled “Estado”- Abierto 2026-07-25. Auditados átomos (10), moléculas (9) y organismos (4). Veredicto galería acumulado: ✅ 23 · ⚠️ 0 · ❌ 0 (23 componentes) — capa de componentes en verde. Correcciones: Top App Bar (azul→blanco), Button (Tonal → primary-soft), Inline Alert (radio sm), Summary Row (TOTAL primary), List Row (contenedor círculo+primary-soft), Cart Bar (icono carrito), Quantity Stepper (FilledTonal), Provider Tile (label visible), Icon Button (glifo azul), y Search/Text Field verificados con foco real. Cada ✅ o iguala el frame o lleva una desviación documentada.
- 9 candidatas de desviación: 1 aceptada (Provider Tile — badge de marca, 2026-07-26) y 8 propuestas pendientes de visto bueno. Se listan con la regla que cumplen, la evidencia medida y una recomendación.
Candidatas propuestas (pendientes de aceptación)
Section titled “Candidatas propuestas (pendientes de aceptación)”Estas surgieron de la comparación Figma↔App. Cada una es un caso donde la app difiere del frame de forma potencialmente mejor. Decisión pendiente: aceptar (conservar la app + actualizar Figma) o rechazar (igualar el frame).
Keypad Key — press con ripple de Material + target táctil ≥48dp (en vez del fill lavanda estático)
Section titled “Keypad Key — press con ripple de Material + target táctil ≥48dp (en vez del fill lavanda estático)”- Capa / nodo Figma: atom ·
37:45 - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/atoms/KeypadKey.kt - Diseño dice: estado Pressed = fill lavanda estático
#E0E0F0+ dígito azul. - App hace: tecla 72×48dp (aspectRatio 1.5) con ripple de Material animado sobre
.clickable(). - Por qué se conserva: reglas 1 (usabilidad) y 3 (plataforma) — cumple el mínimo táctil de 48dp de Material y comunica el press con feedback animado, práctica idiomática de Compose.
- Acción en Figma: documentar el Pressed del nodo
37:45como ripple/overlay + anotar target ≥48dp. - Recomendación: aceptar. · Aceptada por: (pendiente) · Fecha: —
Search Field — botón limpiar (✕) de ~48dp cuando hay texto (ausente en el frame)
Section titled “Search Field — botón limpiar (✕) de ~48dp cuando hay texto (ausente en el frame)”- Capa / nodo Figma: atom ·
37:35 - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/atoms/TerminalesSearchField.kt - Diseño dice: el variant Active solo muestra el placeholder, sin affordance de limpiar.
- App hace:
IconButtonM3 (~48dp) con ✕ (TextSecondary #6F7684) para limpiar en un toque (issue #217 AC2). - Por qué se conserva: reglas 1 (usabilidad) y 2 (DS/consistencia) — convención estándar de búsqueda; limpiar en un toque.
- Acción en Figma: agregar un icono trailing ✕ al variant Active del nodo
37:35. - Recomendación: aceptar. · Aceptada por: (pendiente) · Fecha: —
Button (Filled) — Pressed vía state-layer/ripple de M3 (no intercambia a #003D99)
Section titled “Button (Filled) — Pressed vía state-layer/ripple de M3 (no intercambia a #003D99)”- Capa / nodo Figma: atom ·
21:50 - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/atoms/TerminalesButton.kt - Diseño dice: Pressed = relleno
#003D99(primary-strong). - App hace: el relleno se mantiene en
#0052CC; el press se comunica con ripple/state-layer de M3. - Por qué se conserva (parcial): regla 3 (plataforma) — M3 usa overlay de ripple. Pero el
token
ButtonPrimaryPressed #003D99existe y está sin cablear, y el frame sí muestra el color; un state-layer sobre el token oscuro daría lo mejor de ambos. - Acción en Figma: n/a (plataforma) — o mejor: cablear el token y dejar el ripple encima.
- Recomendación: decisión pendiente (se inclina a arreglar: cablear
#003D99+ conservar ripple).
Icon Button (Outlined/Ghost) — forma circular de M3 (no squircle como Standard/Figma)
Section titled “Icon Button (Outlined/Ghost) — forma circular de M3 (no squircle como Standard/Figma)”- Capa / nodo Figma: atom ·
34:73 - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/atoms/TerminalesIconButton.kt - Diseño dice: las 3 variantes son squircles (radio md) con glifo azul
#0052CC. - App hace: Standard = squircle azul ✓; Outlined/Ghost = círculo de M3 con glifo
TextPrimary #1F2933. - Por qué se conserva (parcial): regla 3 (plataforma) — el
OutlinedIconButton/IconButtonde M3 es circular por convención. Pero rompe la consistencia interna con Standard (squircle) y el color del glifo ya se corrigió (ahora azul primary en las tres variantes). - Acción en Figma: n/a para la forma (circular = convención M3); el glifo ya iguala el frame (azul).
- Recomendación: decisión pendiente solo para la forma (aceptar circular M3, o unificar Standard a circular en el frame). El color del glifo ya está corregido → gallery ✅.
Product Card — estado “Agotado” atenúa la tarjeta a 60% y la vuelve no-interactiva
Section titled “Product Card — estado “Agotado” atenúa la tarjeta a 60% y la vuelve no-interactiva”- Capa / nodo Figma: molecule ·
44:50 - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/molecules/ProductCard.kt - Diseño dice: la tarjeta agotada mantiene opacidad plena (nombre
#1F2933, precio#0052CC). - App hace: baja toda la tarjeta a
alpha 0.6y deshabilita el toque. - Por qué se conserva: regla 1 (usabilidad) — atenuar + bloquear el toque de un producto no disponible evita agregar al carrito un artículo agotado; convención de e-commerce.
- Acción en Figma: añadir un estado OutOfStock al 60% (aspecto no-interactivo) al componente
44:50. - Recomendación: aceptar. · Aceptada por: (pendiente) · Fecha: —
List Row — chevron de navegación gris (text-tertiary) en vez del azul de Figma
Section titled “List Row — chevron de navegación gris (text-tertiary) en vez del azul de Figma”- Capa / nodo Figma: molecule ·
41:60 - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/molecules/ListRow.kt - Diseño dice: chevron azul primary
#0052CC. - App hace: chevron gris
TextTertiary #9CA3AF. - Por qué se conserva: regla 3 (plataforma) — el indicador de disclosure gris/neutro
(
onSurfaceVariant) es la convención de Material en Android; el azul se reserva para acciones. - Acción en Figma: re-tintar el chevron del frame
41:60a text-tertiary gris. - Recomendación: aceptar. · Aceptada por: (pendiente) · Fecha: —
- Nota: el contenedor del icono guía (antes cuadrado+SurfaceVariant) ya se corrigió a círculo+primary-soft, igualando el frame; solo el chevron gris se conserva como esta desviación.
Cart Bar — CTA “Ver carrito” como píldora blanca (no texto plano)
Section titled “Cart Bar — CTA “Ver carrito” como píldora blanca (no texto plano)”- Capa / nodo Figma: molecule ·
44:80 - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/molecules/CartBar.kt - Diseño dice: “Ver carrito” es texto blanco plano sobre la barra azul.
- App hace: lo envuelve en una píldora blanca
#FFFFFFcon chevron azul#0052CC. - Por qué se conserva (parcial): regla 1 (usabilidad) — la píldora da un blanco de toque mayor y una afordancia de botón más clara para la acción primaria de la barra de carrito.
- Acción en Figma: actualizar
44:80a botón/píldora, o confirmar el texto plano como canónico. - Recomendación: decisión pendiente (afordancia mejor, pero conviene confirmar con diseño).
Bottom Sheet — convenciones M3 (scrim oscuro, drag handle, cierre por gesto)
Section titled “Bottom Sheet — convenciones M3 (scrim oscuro, drag handle, cierre por gesto)”- Capa / nodo Figma: organism ·
48:66 - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/organisms/BottomSheetHost.kt - Diseño dice: frame aislado sobre fondo plano
#F5F5F5, sin scrim. - App hace: scrim oscuro medido
#626364, drag handle visible y cierre por gesto (M3ModalBottomSheet). - Por qué se conserva: regla 3 (plataforma) — scrim + drag handle + gesto son la anatomía estándar de una hoja modal de Material; mejoran afordancia y accesibilidad.
- Acción en Figma: actualizar el prototipo
48:66para mostrar scrim + handle representativo. - Recomendación: aceptar. · Aceptada por: (pendiente) · Fecha: —
- Nota sobre el tono: el gris muy claro de Figma (handle
#E3E6E9, ✕#A6ACB7) es de bajo contraste; los tonos M3 por defecto (más oscuros/visibles) mejoran afordancia y accesibilidad, así que el tono también se conserva como parte de esta desviación (no se degrada al gris claro).
Provider Tile — badge con color de marca sólido (no el gris/soft genérico del frame)
Section titled “Provider Tile — badge con color de marca sólido (no el gris/soft genérico del frame)”- Capa / nodo Figma: molecule ·
48:63 - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/molecules/ProviderTile.kt - Diseño dice: badge gris neutro (default) / primary-soft (selected) con icono de teléfono.
- App hace: badge con el color de marca del proveedor (Telcel azul, AT&T azul, Movistar verde) y la inicial de la marca; el aro de selección va en el badge.
- Por qué se conserva: regla 2 (DS/consistencia) — el color de marca ayuda al reconocimiento rápido
del proveedor en la cuadrícula; es una decisión deliberada del componente (
brandColorpor marca). - Acción en Figma: actualizar el nodo
48:63a la variante con color de marca. - ✅ ACEPTADA — Aceptada por: usuario/PO · Fecha: 2026-07-26 · el color de marca se conserva.
- Nota: el label seleccionado invisible (blanco sobre blanco) ya fue corregido → ahora Primary azul.
Rediseño de navegación — re-auditoría 2026-08-05 (nivel pantalla/navegación)
Section titled “Rediseño de navegación — re-auditoría 2026-08-05 (nivel pantalla/navegación)”Estas surgieron de la re-auditoría del rediseño de navegación de esta iteración (FAB de navegación global en vez de bottom-nav, remoción de top bars en las 5 pantallas principales, modo kiosco en POS, y el nuevo hub «Más opciones»). A diferencia de las candidatas de arriba (nivel componente), estas son a nivel de pantalla/navegación. Capturas:
audit/re-audit-2026-08-05/y resumen enRE-AUDIT-2026-08-05.md. Decisión pendiente de PO.
Navegación — FAB speed-dial global reemplaza la bottom-nav bar
Section titled “Navegación — FAB speed-dial global reemplaza la bottom-nav bar”- Capa / nodo Figma: organism ·
45:56(Bottom Nav Bar) +45:53(Bottom Nav Item) - Código:
app/src/main/java/com/axios/terminales/ui/components/terminales/organisms/NavFab.kt,.../templates/AppShell.kt(bottomBar removido),MainActivity.kt(montaje del FAB) - Diseño dice: barra de pestañas inferior con 5 destinos (Inicio/Vender/Carrito/Reportes/Cuenta).
- App hace: un FAB de navegación global abajo-izquierda (speed-dial) con 7 entradas (Inicio/Vender/Carrito/Reportes/Cuenta/Más…/Notificaciones); el destino activo se muestra colapsado y las no-leídas como badge.
- Por qué se conserva: rediseño de navegación aprobado en producto — un FAB global unifica navegación y notificaciones, libera la franja inferior y habilita el modo kiosco en POS.
- Acción en Figma: deprecar el bottom-nav
45:56/45:53y crear el componente «FAB de navegación (speed-dial)» con estado colapsado=destino activo + badge de no-leídas. - Recomendación: aceptar (cambio intencional de esta iteración). · Aceptada por: (pendiente) · Fecha: —
Top App Bar — removida de las 5 pantallas principales del shell
Section titled “Top App Bar — removida de las 5 pantallas principales del shell”- Capa / nodo Figma: organism ·
40:45(en M06300:4317, M1167:303, M13300:4196, M2483:647, M2585:699) - Código:
TerminalesTopBars.kt,HomeScreen.kt,CatalogScreen.kt,CartScreen.kt,ReportsScreen.kt,MyAccountScreen.kt - Diseño dice: cada pantalla principal lleva una top bar con título (y campana de notificaciones).
- App hace: sin top bar en las 5 pantallas; el encabezado es inline (Inicio: «Hola, {nombre}»; Cuenta: ProfileCard) o ausente (Vender/Carrito/Reportes); la campana pasó al FAB de navegación.
- Por qué se conserva: libera altura vertical (relevante en N86) y unifica navegación/notificaciones
en el FAB. El componente
40:45sigue vigente para pantallas secundarias/auth. - Acción en Figma: quitar la top bar de los 5 frames; documentar notificaciones en el FAB; conservar
40:45para secundarias. - Recomendación: aceptar — con seguimiento del hallazgo de polish #3 (encabezados inconsistentes en Vender/Carrito/Reportes). · Aceptada por: (pendiente) · Fecha: —
- Actualización (NavShell #441): el rediseño de navegación restituye la top bar por nivel en los
roots de área del drawer: Reportes, Cuenta, Clientes y Saldo ahora llevan la barra
root (
TerminalesMainTopBar-style: hamburguesa que abre el drawer + título, sin flecha atrás). Se conserva el encabezado inline solo en Inicio (M06, propiedad del ticket Home-extras) y el modo kiosco (Vender/Carrito) sigue sin top bar. Notificaciones queda pendiente (mantiene su flecha atrás porque es también el destino de la campana desde toda la app y su back-stack unwinding está fijado por un test de navegación) — a resolver con diseño.
POS en modo kiosco — FAB de operaciones de caja, sin navegación global
Section titled “POS en modo kiosco — FAB de operaciones de caja, sin navegación global”- Capa / nodo Figma: screen · M11
67:303+ M13300:4196(+ FAB M35300:4289) - Código:
app/src/main/java/com/axios/terminales/ui/screens/pos/(PosQuickActionsScaffold, Fab.kt) - Diseño dice: catálogo/carrito con top bar y navegación estándar.
- App hace: modo kiosco — sin top bar, sin FAB de navegación, y un FAB de operaciones de
caja (Nueva venta · En espera · Mov. de caja · Asignar cliente · Cerrar turno · Anular venta), espejo
del
terminal/homeweb. - Por qué se conserva: paridad con el kiosco web; el cajero opera la venta sin navegación global, evitando salidas accidentales durante el cobro.
- Acción en Figma: actualizar M11/M13 a layout kiosco y reconciliar el set de acciones del FAB de
caja con M35
300:4289(definir cuál es canónico). - Recomendación: aceptar — con seguimiento del polish #2 (el FAB colapsado se solapa con la barra CTA). · Aceptada por: (pendiente) · Fecha: —
Dashboard — encabezado inline «Hola, {nombre}» en vez de top bar
Section titled “Dashboard — encabezado inline «Hola, {nombre}» en vez de top bar”- Capa / nodo Figma: screen · M06
300:4317 - Código:
app/src/main/java/com/axios/terminales/ui/screens/home/HomeScreen.kt - Diseño dice: dashboard con top bar (azul en la implementación previa).
- App hace: sin top bar; saludo inline «Hola, {nombre}» + fecha como encabezado; FAB de navegación presente.
- Por qué se conserva: encabezado inline más cálido/personal y consistente con la remoción de top bars.
- Acción en Figma: rehacer M06
300:4317con encabezado inline (sin top bar) y el FAB de navegación. - Recomendación: aceptar. · Aceptada por: (pendiente) · Fecha: —
Notificaciones — entrada dentro del FAB de navegación (antes campana en top bar)
Section titled “Notificaciones — entrada dentro del FAB de navegación (antes campana en top bar)”- Capa / nodo Figma: organism ·
40:45(campana de la top bar) - Código:
MainActivity.kt(onNotificationsClick→ drawer),.../organisms/NavFab.kt(entrada + badge) - Diseño dice: campana de notificaciones en la top bar de cada pantalla.
- App hace: entrada «Notificaciones» dentro del FAB de navegación, con badge de no-leídas; abre el drawer.
- Por qué se conserva: al remover las top bars, el FAB es el punto único de navegación/estado; el badge conserva la señal de no-leídas.
- Acción en Figma: reflejar el nuevo punto de entrada (Notificaciones en el FAB) en el sistema de navegación del diseño.
- Recomendación: aceptar. · Aceptada por: (pendiente) · Fecha: —
«Más opciones» — nuevo hub de navegación (sucesor del action-hub), sin nodo en Figma
Section titled “«Más opciones» — nuevo hub de navegación (sucesor del action-hub), sin nodo en Figma”- Capa / nodo Figma: screen · (sin nodo — pantalla nueva)
- Código:
app/src/main/java/com/axios/terminales/ui/screens/more/MoreScreen.kt - Diseño dice: no existe.
- App hace: hub «Más opciones» con secciones (Turno de caja / Cobros y pagos / Clientes / Terminal / Reportes / Otros) y filas flag-gated que se ocultan; alcanzable desde el FAB → «Más…».
- Por qué se conserva: alberga los destinos que no caben en el FAB de navegación; sucede al action-hub al remover la bottom-nav.
- Acción en Figma: crear un frame nuevo para el hub «Más opciones» con sus secciones y filas.
- Recomendación: aceptar — con seguimiento del polish #5 (densidad de lista holgada). · Aceptada por: (pendiente) · Fecha: —
Registro de desviaciones
Section titled “Registro de desviaciones”Plantilla — copiar por cada desviación aceptada:
### Componente — resumen de la desviación en una línea
- **Capa / nodo Figma:** atom · `NN:NN`- **Código:** `app/src/main/java/.../Foo.kt`- **Diseño dice:** lo que muestra el frame, medido: hex/dp/estructura- **App hace:** lo que hace la app, medido- **Por qué se conserva:** regla 1/2/3 + evidencia- **Acción en Figma:** actualizar el frame `NN:NN` a la implementación · o · n/a (plataforma)- **Aceptada por:** PO/diseño · **Fecha:** YYYY-MM-DDMerchantVerification (#418) — diseñado en canvas, sin frame de Figma
Section titled “MerchantVerification (#418) — diseñado en canvas, sin frame de Figma”Las tres superficies de verificación de comercio (banner de estado, diálogo de acción bloqueada y pantalla de progreso) no tienen frames de Figma (spec D2 / survey §3): su diseño canónico es el canvas aprobado
docs/design/canvases/merchant-verification-ux/(artboardsMobileBanner*,MobileBlockedDialog*,MobileProgress*, PO 2026-09-02). Se registra aquí como desviación intencional siguiendo el precedente del gap #55: la “verdad” de diseño es el canvas, no un nodo de Figma, por lo que la auditoría de paridad debe citar los nombres de artboard, nunca unnode-id.
Banner / Diálogo / Progreso de verificación — anatomía del design system sobre canvas
Section titled “Banner / Diálogo / Progreso de verificación — anatomía del design system sobre canvas”- Capa / nodo Figma: (sin nodo — diseñado en canvas, artboards
MobileBanner*/MobileBlockedDialog*/MobileProgress*) - Código:
app/src/main/java/com/axios/terminales/ui/components/verification/{MerchantVerificationBanner,MerchantVerificationBlockedDialog}.kt,app/src/main/java/com/axios/terminales/ui/screens/verification/MerchantVerificationScreen.kt - Diseño dice: canvas (no Figma) — banner tipo
OfflineBanner, diálogoAlertDialogdel DS, pantalla con filas + badges + step markers + InlineAlert por estado. - App hace: reutiliza la anatomía del DS (
OfflineBanner,AlertDialogcon tokens,StatusBadge,InlineAlert,TerminalesButton,TerminalesTopBar) ligada aTerminalesColors. - Por qué se conserva: regla 2 (DS/consistencia) — no hay frame que igualar; el canvas define la intención y el DS provee la anatomía shippeada.
- Acción en Figma: n/a — si se crean frames, deben derivarse del canvas aprobado.
- Nota — copy fuera de Appendix A: el badge por-fila del estado “Completado”
(
merchant_verification_check_completed) no aparece en la tabla Appendix A (que solo lista labels de estado global); se agregó como único label de fila-completada porque el canvas muestra un badge en cada fila (AC4). La filaamlno se renderiza mientras el contrato envíanot_requiredy Appendix A no trae su copy (AC4). El retorno por deep-link del Custom Tab está diferido (spec §15): la pantalla refresca en foreground y ofreceActualizar estado. - Recomendación: aceptar (diseñado en canvas, sin frame). · Aceptada por: (pendiente) · Fecha: —
S13 “N86 fit” — desviaciones deliberadas para el Nexgo N86 (360×640 dp)
Section titled “S13 “N86 fit” — desviaciones deliberadas para el Nexgo N86 (360×640 dp)”Sesión del PO en dispositivo (2026-09-09, evidencia
docs/ui-evidence/n86-s4-2026-09-09/ydocs/ui-evidence/s13-n86-fit/). Los frames de Figma están dibujados a 390×844; en el handheld de 640dp de alto varios CTAs quedaban bajo el pliegue. Se registran aquí las diferencias que la app conserva a propósito frente al frame; todas cumplen la regla 1 (usabilidad) y no contradicen ninguna regla de negocio.
M27d Pago en efectivo — chips enteros en UNA fila, teclado compacto y CTA fijo (UX-2 / UX-4)
Section titled “M27d Pago en efectivo — chips enteros en UNA fila, teclado compacto y CTA fijo (UX-2 / UX-4)”- Capa / nodo Figma: screen · M27d (Cobro efectivo) · Código:
app/src/main/java/com/axios/terminales/ui/screens/pos/CheckoutScreens.kt(CashSheetContent,QuickAmountRow),.../atoms/AmountChipButton.kt(AmountChipStyle.Quick),.../atoms/KeypadKey.kt+.../molecules/NumericKeypad.kt(compact). - Diseño dice: chips de monto de 100dp con dos líneas (“$50.00”), teclado 1.5:1, botones Confirmar + Cancelar al final de una columna que scrollea.
- App hace: 4 chips de 48dp en una sola fila con etiqueta entera (“$50”, “$100”, “$200”) y
“Exacto” con el monto exacto como línea secundaria pequeña; el chip cuyo valor coincide con el monto
recibido se marca (PrimarySubtle + texto primary + anillo 1.5dp,
selectedreal en a11y); teclado compacto de teclas 44dp; encabezado de hoja con × (reemplaza el botón “Cancelar”); CTA Confirmar fijo al pie sobre la barra de navegación (medido: todo cabe en los 520dp de contenido de la hoja sin scroll —CashSheetLayoutTest). - Por qué se conserva: regla 1 — en el N86 las etiquetas “$50.00” partían a mitad de palabra (“Exac / to”, “$50. / 00”) y el CTA quedaba fuera de pantalla (D4-01); ahora el cobro se completa sin scroll.
- Acción en Figma: actualizar M27d a chips de una fila con enteros y CTA anclado.
- Aceptada por: PO (ask directo 2026-09-09) · Fecha: 2026-09-10
M17 Venta exitosa — Imprimir / Compartir / Nueva venta fijos al pie (UX-3)
Section titled “M17 Venta exitosa — Imprimir / Compartir / Nueva venta fijos al pie (UX-3)”- Capa / nodo Figma: screen ·
73:439· Código:app/src/main/java/com/axios/terminales/ui/screens/pos/PosCheckoutFlowContent.kt(CheckoutReceiptContent). - Diseño dice: una sola columna: medallón, tarjeta de recibo y las acciones al final.
- App hace: la tarjeta scrollea en su propia banda (
RECEIPT_SCROLL_TAG) y las tres acciones son un pie fijo (RECEIPT_ACTIONS_TAG) sobre la barra de navegación —ReceiptActionsLayoutTestmide que con 14 líneas “Nueva venta” sigue visible sin scroll. - Por qué se conserva: regla 1 — en D4-02 había que scrollear para llegar a “Nueva venta”.
- Acción en Figma: anotar las acciones de
73:439como footer fijo. - Aceptada por: PO · Fecha: 2026-09-10
M27b Autorización de supervisor — abre totalmente expandida, teclas compactas (UX-6 / UX-7)
Section titled “M27b Autorización de supervisor — abre totalmente expandida, teclas compactas (UX-6 / UX-7)”- Capa / nodo Figma: organism · Approval Sheet · Código:
app/src/main/java/com/axios/terminales/approvals/ApprovalSheetHost.kt(rememberApprovalSheetState,skipPartiallyExpanded = true),.../organisms/pos/ApprovalSheet.kt(compact = true). - Diseño dice: hoja modal M3 estándar (parada a media altura).
- App hace: sin parada parcial — teclado y fila [Cancelar | Autorizar] visibles al abrir (D5-06 los
ocultaba hasta arrastrar); teclas 44dp para que el cuerpo mida ≤520dp; se conserva el × y el cierre
por scrim/gesto/back. Copy: “Ingresa el PIN de supervisor” (rol aprobador según
roles-permissions-and-labels), ya no “gerente”. - Por qué se conserva: reglas 1 y 3.
- Aceptada por: PO · Fecha: 2026-09-10
Banner global “Sin conexión” — se colapsa a 28dp cuando la pantalla ya muestra su alerta (UX-8)
Section titled “Banner global “Sin conexión” — se colapsa a 28dp cuando la pantalla ya muestra su alerta (UX-8)”- Capa / nodo Figma: organism · Offline banner · Código:
app/src/main/java/com/axios/terminales/ui/components/network/OfflineBanner.kt(compact),OfflineBannerPolicy.kt(offlineBannerPresentation,RegisterScreenOfflineAlert),MainActivity.kt. - Diseño dice: banner rojo de 56dp siempre que no hay red.
- App hace: si la pantalla actual monta su propia alerta accionable (carrito: InlineAlert + Reintentar; selector de tender), el banner global baja a una franja de una línea de 28dp; la alerta de pantalla conserva la acción. Los dos ya no apilan ~170dp en el N86 (D7-01).
- Por qué se conserva: regla 1.
- Aceptada por: PO · Fecha: 2026-09-10
Provider Tile — seleccionado = fondo PrimarySubtle + anillo 2dp + check (UX-10)
Section titled “Provider Tile — seleccionado = fondo PrimarySubtle + anillo 2dp + check (UX-10)”- Capa / nodo Figma: molecule ·
48:63· Código:.../molecules/ProviderTile.kt. - Diseño dice: el frame marca la selección solo con el label acentuado.
- App hace: relleno PrimarySubtle en todo el tile, anillo primary 2dp, check pequeño arriba a la
derecha (
PROVIDER_TILE_SELECTED_CD), label primary; el badge de color de marca se conserva (desviación aceptada 2026-07-26). - Por qué se conserva: regla 1 — en D9-01 la selección pasaba desapercibida.
- Aceptada por: PO · Fecha: 2026-09-10
M28 Detalle de notificación — claves del payload localizadas + “Ver más” (UX-12)
Section titled “M28 Detalle de notificación — claves del payload localizadas + “Ver más” (UX-12)”- Código:
app/src/main/java/com/axios/terminales/notifications/NotificationPayloadPresentation.kt,NotificationDetailScreen.kt. - App hace:
productName→Producto,onHand/quantity→Existencia,threshold/minStock→Mínimo,folio→Folio,amount→Monto (formateado como dinero desde unidades menores canónicas); las claves desconocidas se ocultan tras “Ver más”. Antes imprimía las claves crudas (D11-02). - Aceptada por: PO · Fecha: 2026-09-10
M12 Placeholder de producto — glifo neutro de mercancía (UX-13)
Section titled “M12 Placeholder de producto — glifo neutro de mercancía (UX-13)”- Código:
app/src/main/java/com/axios/terminales/ui/screens/pos/PosImages.kt,TerminalesIcons.Product(BoxOpen). - App hace: el producto sin imagen usa una caja abierta, no el regalo de Pines (D11-04).
- Aceptada por: PO · Fecha: 2026-09-10
Registro de desviaciones aceptadas
Section titled “Registro de desviaciones aceptadas”Provider Tile — badge con color de marca del proveedor (2026-07-26)
Section titled “Provider Tile — badge con color de marca del proveedor (2026-07-26)”- Capa / nodo Figma: molecule ·
48:63· Código:.../molecules/ProviderTile.kt - Qué se conserva: el badge usa el color de marca del proveedor (Telcel azul, AT&T, Movistar) con la inicial, en vez del badge gris/soft genérico del frame.
- Por qué: regla 2 — el color de marca ayuda al reconocimiento rápido del proveedor en la cuadrícula.
- Acción en Figma: actualizar el nodo
48:63a la variante con color de marca. - Aceptada por: usuario/PO · Fecha: 2026-07-26