Ir al contenido
andres@andresclavijo.comCurrículum (PDF) ↗LinkedIn ↗

El Sistema de Diseño de Hourly

El input en código en Storybook, enmarcado en una ventana de navegador sobre un degradado de naranja a magenta: su matriz completa de estados, neutral, hover, foco, error y deshabilitado, vacío y lleno, en dos tamaños, con 0 violaciones de accesibilidad y 15 revisiones aprobadas.
  • 3librerías por plataforma, web, iOS y Android, sobre una sola base
  • 40–50componentes web, cada uno con sus tamaños, estados y variantes
  • 1:1cada componente de Figma tiene su gemelo en código con las mismas especificaciones

De los componentes genéricos de Material e iOS a un solo sistema que lleva la marca a web, iOS y Android, desde las bases en Figma hasta una librería en código en Storybook.

Sobre Hourly

Hourly es una plataforma de nómina y gestión de personal para pymes con trabajadores por horas. Entré como su primer diseñador de producto en 2018, cuando ingeniería construía sobre librerías de componentes genéricas, y armé el sistema de diseño sobre el que funciona el producto hoy.

Rol
Director de Diseño de Producto · Sistemas y gobernanza
Periodo
2018 – hoy
Ubicación
Remoto

El Problema

Cuando llegué a Hourly, ingeniería construía con lo que venía de fábrica: Material Design en web y Android, componentes nativos en iOS. Eso funcionó mientras el producto era pequeño. A medida que la marca tomó forma y el producto creció, esas librerías empezaron a quedarse cortas de dos maneras. No podían llevar la marca, y no cubrían los casos que de verdad necesita un producto de nómina y gestión de personal.

Sin una base compartida, el mismo patrón se veía distinto en distintos lugares. Cada pantalla nueva era una oportunidad para que el producto se alejara un poco más de sí mismo.

El Análisis

Hourly compite en un espacio lleno de productos que hacen cosas parecidas. Acordamos desde temprano que una buena experiencia de usuario sería uno de nuestros diferenciadores: lo que hace que la app se sienta intuitiva y no solo completa. Eso es difícil de proteger pantalla por pantalla. Necesita un sistema.

Se lo propuse al CEO y al líder de ingeniería. No fue difícil convencerlos. Ya confiaban en la gobernanza de diseño, y el beneficio de un sistema reutilizable era fácil de ver. Lo difícil vino después. Un sistema le cuesta tiempo a ingeniería la primera vez que se construye, y una startup en etapa temprana necesita lanzar rápido. Cada componente era un equilibrio entre construirlo bien y entregar lo que el negocio necesitaba ese mes. El argumento para pagar ese costo al inicio era la velocidad después: una vez que un componente existe, diseñar y mantener se vuelve mucho más rápido.

La Solución

Hice la investigación y definí la estructura que seguiría el sistema: tokens en tres niveles. Los primitivos fueron lo primero, porque todo lo demás hereda de ellos. Los primitivos guardan los valores base: color, tipografía, espaciado. Construí los colores como escalas de tonos en OKLCH, un espacio de color perceptualmente uniforme, para que las escalas aguanten a largo plazo, las capas semántica y de componente puedan flexionarse sin perder consistencia, y el contraste cumpla WCAG desde la base, antes de que exista un solo componente. Los tokens semánticos les dan un propósito a esos valores. Los tokens de componente van un paso más allá: el padding, la tipografía y el borde de un botón apuntan cada uno a un token con nombre, no a un valor suelto. Los componentes se construyen solo con esos tokens.

Variables de Figma, la capa de primitivos: las escalas de color de la colección hourly-tokens, valores hex de naranja a verde.
Nivel uno, primitivos: los valores base. Cada color, tamaño y espacio que el sistema puede usar, y nada más.
La capa semántica: tokens de acción como primary default, hover, disabled y subtle, cada uno apuntando a un color primitivo.
Nivel dos, tokens semánticos: cada valor tiene un propósito. Primary hover apunta a un azul primitivo, así un cambio de marca cambia una referencia, no cada pantalla.
La capa de componente: la tipografía, el padding, el gap y el radio del botón, cada uno apuntando a un token primitivo o de espaciado.
Nivel tres, tokens de componente: la tipografía, el padding, el gap y el radio del botón son tokens con nombre, así el componente de Figma y su gemelo en código leen los mismos valores.

Con esa base lista, trabajé muy de cerca con una persona de diseño senior de mi equipo, y construimos los componentes juntos. La librería web se volvió la referencia para mobile: les enseñamos el proceso a los otros diseñadores, y lo siguieron para construir las librerías de iOS y Android sobre las mismas capas, con componentes nativos que heredan de la misma fuente. La guía para diseñadores vive en Figma junto a los componentes: cuándo usar cada uno, sus variantes y sus estados.

Los desarrolladores necesitaban la misma claridad. Hago sesiones frecuentes con el equipo de ingeniería sobre lo nuevo en el sistema y cómo les ayuda a ellos y a nuestros clientes, con consistencia y buenas prácticas. Durante los últimos años, ingeniería construyó los componentes en Storybook, y diseño revisaba y aprobaba cada uno.

Desde el año pasado lidero la migración a una nueva librería en código, y esa parte la construyo yo, porque el código es donde me muevo con más soltura. Mantiene las mismas capas: CSS para los primitivos, Tailwind para los tokens semánticos y shadcn/ui para los componentes, todo documentado en Storybook. Cada componente de Figma tiene hoy su equivalente 1:1 en código, con las mismas especificaciones. Uso Claude para construir sobre esa base, y para leer las especificaciones de un diseño en Figma y armarlo con nuestros propios componentes.

El botón en código en Storybook: todas las variantes de primario a ghost, pequeño y grande, con su panel de controles abajo.
El mismo botón, ahora en código: cada variante documentada en Storybook, con controles para sus íconos y su estado de carga.
El panel Design de Storybook mostrando el set de botones de Figma de la Hourly Web Library debajo del componente en código.
La verificación 1:1: el panel Design de Storybook muestra el componente de Figma debajo del de código, para que cualquiera los compare lado a lado.

La accesibilidad es parte de la definición. Como ahora construyo y administro los componentes en Storybook, agregué validaciones que corren por componente: revisiones de WCAG y puntajes de accesibilidad, así que cada uno tiene que cumplir al menos AA antes de salir. Antes, los desarrolladores construían y probaban los componentes, y a veces la accesibilidad quedaba por fuera. Ahora viene incluida, y es responsabilidad de diseño.

El panel de accesibilidad de Storybook para el botón: 0 violaciones, 6 revisiones aprobadas, 0 inconclusas, con la revisión de nombre del botón abierta.
Las revisiones de accesibilidad corren en cada componente. El botón pasa las seis, incluido un nombre accesible en cada una de sus 18 instancias.

Impacto

El primer cambio fue la claridad. Con las bases en Figma, los desarrolladores podían ver exactamente qué esperaban los diseñadores, con guías escritas en lugar de interpretaciones. Diseñar también se volvió más rápido, porque ahora armamos las pantallas con el sistema. Esa velocidad fue el centro de la propuesta original. Nunca la medimos con cronómetro, pero se nota en el trabajo: ya nadie tiene que decidir cómo debe verse y comportarse un componente o uno de sus estados. Se usa, y todas sus variantes ya están aprobadas por la dirección de diseño.

La librería ya tiene entre 40 y 50 componentes solo en web. Cada uno se multiplica en sus tamaños, estados y variantes: pequeño y grande; normal, hover, deshabilitado y cargando; primario, secundario, terciario, destructivo y ghost, cada uno sólido o con borde. La librería web es la base que siguen las librerías de iOS y Android, y cada componente de Figma tiene su gemelo 1:1 en código.

El componente de botón de Hourly en Figma: nueve estilos de primario a ghost, cada uno en pequeño y grande, normal, hover, deshabilitado y cargando.
Un componente, todos sus estados: nueve estilos, dos tamaños y cuatro estados, cada uno aprobado por la dirección de diseño antes de que alguien lo use.

La librería en código cambió cómo trabajamos con los stakeholders. Podemos mostrar interacciones complejas y buen motion en un prototipo que funciona en lugar de describirlos, y probar flujos reales con usuarios. Cuando una funcionalidad es lo bastante grande para llevarla a la dirección, la presentamos juntos el director de gestión de producto, el director de ingeniería y yo. Los stakeholders que no son técnicos ahora recorren el flujo real en código, no una imagen. Las pruebas también se volvieron más rápidas. Con IA en el flujo de trabajo, validamos a nivel de componente mucho más rápido, un trabajo que antes estaba en manos de los desarrolladores y no siempre salía bien. Y como las revisiones de WCAG viven en cada componente, la accesibilidad es lo normal y no depende de quién construyó la pantalla.

Una pantalla de nómina semanal construida en código con la librería de componentes: totales, un botón de revisar y pagar, y la tabla de empleados.
Una pantalla real de nómina armada con la librería. Los stakeholders recorren flujos como este en código, no en una imagen.

Reflexiones

La lección más grande cambió cómo veo los sistemas de diseño. Un sistema nunca está terminado. Es un proyecto siempre vivo: tiene que seguir adaptándose a nuevas tecnologías, nuevos componentes y nuevos requisitos. Parte del trabajo es recordarles a los stakeholders y a los desarrolladores, una y otra vez, que construirlo una vez no significa que se sostiene solo.

Más casos de estudio