Vanta B2POS · Design system y handoff

¿Por qué elegir uno?

¿Por qué elegir uno?

La variación de marca se filtraba al código y frenaba cada release. Hoy sale como tokens, generados una vez y consumidos por web y Flutter.

Vista
Se ve mejor en una computadora
Back to search
Application No. 2387594
Actions
Application information
Type
Application No.
Client ID
Full name
Status
Amount
Created
Marketplace
2387594
1048372
Kuznetsov D. A.
Approved
108 740 ₽
18.09.2026 14:59
Data entry employee
Andrey Andreyevich Ivanov
Processing platform
Unified OFP platform
Store address
16 Tverskaya St., Moscow
Legal entity
TechnoLine LLC
Authorized by
Semyon Sergeyevich Sidorov
Signing method
SMS
Underwriting
ApprovedApplication approved for 108 740 ₽
Bank decisions
Red Bank
OFPAwaiting authorization
Term, mo.
8
Payment, ₽/mo.
14 797.20
Amount
108 740.00
Interest rate, %
23.12
Insurance
0
SMS notifications, ₽
0
Select
Decline
SMS signing
Specification
Blue Bank
SKPContract authorized
Term, mo.
12
Payment, ₽/mo.
10 067.87
Amount
108 740.00
Interest rate, %
19.90
Insurance
0
SMS notifications, ₽
0
Cancel authorization
Withdraw application
New application
Search applications
Reports
Training
Support
Cash collection
Andrey Ivanov
9:41
Issued (80)
Processing (10)
Declined (5)
₽216,740.00
Total loans issued in the last 7 days
Applications today (5)
No. 48291736
Aug 19, 202509:55
Cooling-off period
4:20
Customer name
Gorbachev D. E.
Customer ID
23456
Amount
₽324,580.00
No. 73920485
Aug 19, 202509:41
Issued
Customer name
Ivanov A. V.
Customer ID
23456
Amount
₽712,430.00
No. 55018237
Aug 19, 202509:12
Processing
Customer name
Petrov K. S.
Customer ID
23456
Amount
₽589,210.00
Home
Search
Form
Chat
Profile
Tema
Apariencia

Rol

Lead Product Designer, dueño del sistema

Equipo

7 diseñadores a mi cargo, trabajando directo con ingeniería web y Flutter

Período

2025 – hoy

Superficies

Plataforma web, app en Flutter, widget para partners

Alcance

4 marcas × claro y oscuro, una capa semántica

8

temas desde una sola capa semántica

2

plataformas generadas desde la misma fuente

0

colores crudos referenciados en el código

01

El problema

Todo caso de design system empieza con botones que no coinciden. Este no.

B2POS corre en varias marcas de retail, y cada despliegue venía acumulando sus propios overrides de color durante años. El costo no era que las pantallas se vieran distintas, sino que fueran distintas en el código. Cada feature se construía una vez y después se parchaba por marca, web y mobile se separaban, y nadie podía decir cómo se veía el texto secundario en el modo oscuro de una marca sin abrir un archivo.

Así que el sistema tenía una sola tarea: que la marca fuera un valor, no un fork.

02

La estructura

Primitivos

Las escalas crudas. Nada en el producto las referencia directamente.

Tokens semánticos

Lo que el producto realmente habla: superficie, texto primario, texto secundario, separador. Cada pantalla, componente y estado se construye solo sobre esta capa.

La regla

Un componente no sabe en qué marca está. Pide texto secundario y el tema responde. Ocho exports, una librería de componentes.

03

Dos plataformas, una fuente

Web

Un archivo de tokens con variables CSS y tres mecanismos de cambio: un data attribute, una clase de tema y la preferencia del sistema como respaldo. Cada variable lleva su ruta de Figma, así cualquiera puede rastrear un valor hasta el archivo de diseño.

Mobile

Una theme extension de Flutter junto al color scheme estándar, que entrega la capa semántica y solo los primitivos que usa. No es una traducción del archivo web: es la misma fuente, expresada como ya piensan los ingenieros de Flutter.

04

Generado con IA, revisado a mano

Las librerías de tokens se generan, no se tipean. Lo que importa es el paso siguiente: cada export se lee línea por línea con los ingenieros que lo usan, antes de salir.

En la última pasada, esa revisión detectó tres temas oscuros con el texto secundario y terciario un paso más claro de lo debido: invisible en un buen monitor, molesto en un dispositivo de tienda al final de un turno.

05

El naming como handoff

Las pantallas se nombran como las rutas de la app, las capas en camelCase, y las instancias conservan el nombre de su componente. Un diseñador y un desarrollador de Flutter señalan lo mismo cuando dicen home/new-loan-application. Es la diferencia entre una reunión de handoff y un link de handoff.

06

Dónde está hoy

El sistema sostiene la plataforma B2POS, la app en Flutter en test cerrado con 12.000 usuarios partners y el widget para partners. Una marca nueva es un export de tokens, no un proyecto. Funciona porque la capa semántica llegó antes que los temas, no después.

Siguiente caso