Saltar a contenido

Sistema de diseño

Normas visuales y reglas de uso para la APK Android. Cuando entren nuevos componentes, deben pasar por las verificaciones listadas al final.

Principios

  1. Claridad operativa antes que decoración. El usuario debe entender qué pasará antes de tocar.
  2. Una acción primaria por pantalla. Las demás son secundarias o destructivas.
  3. Mostrar estado, causa y siguiente paso. Ninguna pantalla debe insinuar sin afirmar.
  4. No ocultar que un dato es demo, estimado o pendiente. Usar la banda global cuando aplique.
  5. Divulgación progresiva. Solo pedir datos cuando se necesitan.

Paleta observada

Token canónico Valor Uso
primary #001129 Botones primarios y texto destacado.
onPrimary #FFFFFF Texto sobre primary.
secondary #BB0016 Acentos y errores de marca.
onSecondary #FFFFFF Texto sobre secondary.
tertiary #0E1112 Texto casi-negro y soporte.
onTertiary #FFFFFF Texto sobre tertiary.
background #F8F9FF Fondo principal.
surface #F8F9FF Igual a background.
surfaceContainer #E5EEFF Cards.
error #BA1A1A Mensajes de error.
outline #74777E Bordes y campos inactivos.

Los hex listados son los observados en ui/theme/Color.kt. Cualquier cambio debe pasar por la migración a tokens semánticos descrita más abajo.

Tipografía observada

  • Familia: FontFamily.SansSerif como placeholder de Inter. Empaquetar res/font/Inter.ttf antes de release pública.
  • Estilo M3 completo. Tamaños funcionales:
Estilo Tamaño Uso
displayLarge 48 sp Hero numérico (precios).
headlineLarge 32 sp Héroes.
headlineMedium 24 sp Títulos de sección.
bodyLarge 18 sp Cuerpo destacado.
bodyMedium 16 sp Cuerpo por defecto.
bodySmall 14 sp Ayudas y notas.
labelLarge 12 sp Etiquetas uppercase.

Espaciado y radios (tokens)

Token Valor
xs 4 dp
base 8 dp
sm 12 dp
md 16 dp
lg 24 dp
xl 48 dp
radius.small 8 dp
radius.medium 12 dp
radius.large 16 dp

Reglas de uso

  • Sin valores literales Color(0x…) en pantallas de producto. Definir tokens semánticos y consumirlos desde el tema.
  • Tamaño mínimo para texto funcional: 14 sp. No usar 8–11 sp en controles primarios.
  • Touch targets ≥ 48×48 dp en controles interactivos.
  • Un campo por fila en formularios para pantallas < 600 dp de ancho.
  • Errores: texto + icono opcional; nunca depender sólo del color.
  • Glass / blur (ver LiquidGlassBackground): decorativo, evaluar rendimiento y contraste WCAG.
  • Modo oscuro: el prototipo actual lo declara pero su esquema replica el claro. Hasta corregirlo, solo tema claro en release.
  • Iconos: cualquier IconButton debe llevar contentDescription no nulo, salvo icono puramente decorativo (en ese caso, marcar explícitamente con null y role = ImageRole.Decorative).

Componentes obligatorios

Componente Propósito
DemoModeBanner Banda persistente cuando los datos son demo.
StatusBanner Severidad, mensaje y CTA explícito.
KycGateCard Bloqueo KYC con motivo, beneficio y próxima acción.
PriceBreakdown Desglose único con estimado | final.
AsyncStateContainer Loading / vacío / error / contenido.
ResultScreen Confirmación con entidad creada y próximo paso.
FormStepHeader Encabezado de paso con indicador de progreso.
InlineErrorSummary Resumen de errores con foco al primer campo.

Checklist de revisión visual (manual)

  • Sin Color(0x…) en pantallas nuevas.
  • Sin dp literales fuera del theme.
  • Tamaños ≥ 14 sp en texto funcional; 12 sp solo en uppercase de label.
  • Touch targets ≥ 48 dp.
  • Errores con texto y foco automático.
  • Estados UI (loading, vacío, error, éxito) presentes en cada pantalla de datos.
  • DemoModeBanner visible en builds sin backend.
  • Contraste mínimo AA en texto (≥ 4.5:1 en cuerpo, ≥ 3:1 en grande).
  • TalkBack: cada control interactivo anuncia su rol y estado.