Skip to content

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í.

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:

  1. Más usuario-amigable — mejora la usabilidad real en un dispositivo táctil (área de toque ≥48dp, afordancia más clara, menos pasos).
  2. 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.
  3. 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).

  • 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:45 como 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: IconButton M3 (~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 #003D99 existe 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/IconButton de 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.6 y 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:60 a 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 #FFFFFF con 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:80 a 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 (M3 ModalBottomSheet).
  • 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:66 para 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 (brandColor por marca).
  • Acción en Figma: actualizar el nodo 48:63 a 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 en RE-AUDIT-2026-08-05.md. Decisión pendiente de PO.

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:53 y 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 M06 300:4317, M11 67:303, M13 300:4196, M24 83:647, M25 85: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:45 sigue vigente para pantallas secundarias/auth.
  • Acción en Figma: quitar la top bar de los 5 frames; documentar notificaciones en el FAB; conservar 40:45 para 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 + M13 300:4196 (+ FAB M35 300: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/home web.
  • 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:4317 con 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: —

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-DD

MerchantVerification (#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/ (artboards MobileBanner*, 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 un node-id.

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álogo AlertDialog del DS, pantalla con filas + badges + step markers + InlineAlert por estado.
  • App hace: reutiliza la anatomía del DS (OfflineBanner, AlertDialog con tokens, StatusBadge, InlineAlert, TerminalesButton, TerminalesTopBar) ligada a TerminalesColors.
  • 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 fila aml no se renderiza mientras el contrato envía not_required y 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 ofrece Actualizar 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/ y docs/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, selected real 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 — ReceiptActionsLayoutTest mide 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:439 como 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
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

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:63 a la variante con color de marca.
  • Aceptada por: usuario/PO · Fecha: 2026-07-26