Product Craft Bible
Design Systems
Inicio Design Systems Design Systems
Design Systems

Design Systems

10 reglas brad frost · atomic design
17

Design Systems

10 reglas · Frost
184

Construir sistemas, no páginas

El objetivo no es diseñar páginas individuales sino un sistema de componentes que genera páginas. Cada vez que construyas algo, pregunta "como funciona este patrón en otros contextos?", no solo "como se ve aquí?". Un sistema bien construido escala porque las piezas son independientes del contexto donde se usan: un Button funciona igual en el checkout que en el onboarding.

brad frost · atomic design
Preferir
components/
Button/
Card/
Input/
tokens/
colors
spacing
Un Button sirve en todas las páginas: consistencia por construcción
Evitar
pages/
home.css .btn-home
about.css .btn-about
contact.css .btn-contact
pricing.css .btn-pricing
Un botón diferente por página: inconsistencia y duplicación
185

Jerarquía: atoms > molecules > organisms > templates > pages

Los atomos (input, label, botón) forman moleculas (search form). Las moleculas forman organismos (header). Los organismos forman templates (layout). Los templates con contenido real son pages. Atomic Design no es un proceso lineal: se trabajan los 5 niveles simultaneamente, pero la composición siempre fluye de lo simple a lo complejo. Sin esta jerarquía, los equipos terminan con listas planas de componentes donde nadie sabe que compone que, duplicando lógica y rompiendo consistencia.

brad frost · atomic design
Preferir
Atoms Button, Input, Label
Molecules SearchBar = Input + Button
Organisms Header = Logo + SearchBar + Nav
Templates Layout con placeholders
Pages Template + contenido real
Cada nivel compone el anterior: escalable y predecible
Evitar
Button
SearchBar
Header
ProductCard
CheckoutPage
Input
Label
Nav
Footer
Sin jerarquía: no se sabe que compone que
186

Nombres agnosticos al contenido

Nombrar componentes por estructura, no por contenido ni ubicación. Cuando el nombre refleja el contenido actual ("HeroHomepage", "PricingCard"), cualquier cambio de contexto lo vuelve obsoleto y obliga a renombrar o duplicar. Un nombre que describe la forma ("MediaBlock", "Card", "Grid") permite reutilizar el componente en cualquier página sin fricción. La portabilidad del nombre es la portabilidad del componente.

brad frost · atomic design
Preferir
MediaBlock.tsx
cualquier página
Card.tsx
cualquier página
Sidebar.tsx
cualquier página
Grid.tsx
cualquier página
Nombre describe estructura, no contenido: reutilizable en cualquier contexto
Evitar
HeroHomepage.tsx
solo /home
PricingCard.tsx
solo /pricing
BlogSidebar.tsx
solo /blog
AboutTeamGrid.tsx
solo /about
Si el contenido cambia, el nombre queda obsoleto
187

Reuse-first: buscar existente antes de crear nuevo

Antes de crear un componente nuevo, buscar en el sistema de diseño si ya existe uno que resuelva la necesidad. Si no encaja al 100%, evaluar si se puede extender con una prop o variante. Esta restricción saludable previene la proliferación de componentes duplicados que divergen silenciosamente, generan inconsistencias visuales y multiplican el costo de mantenimiento. Agregar al sistema solo cuando se confirma que servira a multiples contextos.

brad frost · atomic design
Preferir
Button size, variant
size: sm
size: md
size: lg
variant: primary
variant: secondary
variant: ghost
Buscar primero, crear solo si no existe
Evitar
ButtonPrimary original
SubmitBtn duplicado
CTAButton duplicado
ActionButton duplicado
MainButton duplicado
5 botones que hacen lo mismo: duplicación
188

Interface inventory antes de sistematizar

Antes de construir un design system, auditar lo que ya existe en el producto. Capturar cada patrón UI único, categorizar por tipo (botones, cards, forms, navs) y documentar las variantes reales. Este inventario expone inconsistencias, duplicados y nombramientos divergentes que informan las decisiones del sistema. Sin el, se inventa un DS arbitrario que no refleja la realidad del producto y multiplica la deuda visual.

brad frost · atomic design
Preferir
Interface Inventory
Botones
12
variantes encontradas
Grises
4
tonos en uso
Fonts
3
tipografias
Consolidar 12 botones en 1 componente con props
Reducir 4 grises a escala semántica de 3
Elegir 1 sans + 1 mono del inventario
Inventariar primero, sistematizar después
Evitar
Design System v1
Tokens inventados
--color-primary: #3B82F6
--color-secondary: #10B981
--radius-md: 8px
--spacing-lg: 24px
Componentes
Button (3 variantes arbitrarias)
Card (2 layouts inventados)
Sistema inventado, no derivado del producto real
189

Diseñar para el mejor caso, el peor y el intermedio

Nunca diseñar solo para el contenido ideal. Un componente debe funcionar con datos perfectos, datos ausentes y datos extremos. Probar los tres escenarios revela fragilidades que el "happy path" del mockup oculta: nombres que desbordan, avatares que no cargan, campos vacios sin fallback. Documentar cada variación como pseudo-pattern garantiza que el componente no se rompa en producción.

brad frost · atomic design
Preferir
El mismo componente probado en 3 estados:
Ana Lopez
Disenadora UX en Fintech Labs. Amante del cafe y la tipografía.
best case
MG
Dr. Maria Alejandra Gutierrez de los Santos
Sin biografía disponible
worst case
Jose O'Brien-Munoz #42
Investigador senior en neurociencias computacionales con enfoque en interfaces cerebro-computadora, aprendizaje profundo aplicado a señales EEG y desarrollo de protesis neuronales de siguiente generación para pacientes con lesiones medulares.
edge case
Diseñar para los 3 casos: el componente no se rompe
Evitar
Tarjeta de perfil diseñada solo para el "happy path":
Ana Lopez
Disenadora UX en Fintech Labs. Amante del cafe y la tipografía.
Cuando llegan datos reales, se rompe:
Dr. Maria Alejandra Gutierrez de los Santos
(sin bio)
Solo diseñado para el caso ideal
190

Feedback loop: pages rompen, se arregla en atoms

Si un componente se rompe a nivel de página (con contenido real), el fix debe volver al atomo o molecula origen. El flujo es bidireccional: la página detecta el problema, el atomo lo corrige, y la corrección propaga automáticamente a todas las páginas que lo consumen. Parchar solo a nivel de página crea divergencia permanente entre el sistema y las instancias.

brad frost · atomic design
Preferir
Page: checkout
Bug: botón demasiado chico
fix propaga
Button atom (actualizado)
padding: var(--btn-pad, 16px);
/checkout
/dashboard
/perfil
Bug en page, fix en atom: todo el sistema mejora
Evitar
Checkout page CSS (parche)
.checkout-btn {
  padding: 16px;
}
Button atom (intacto)
padding: 8px; /* bug aquí */
Fix en la página, no en el atomo: divergencia permanente
191

Sistema vivo, no artefacto estático

Un design system no es un PDF que se exporta y se olvida. Es infraestructura viva: versionada en Git, validada por CI, con metricas de adopción reales. Cuando el sistema es un artefacto estático, diverge del producto en semanas y los desarrolladores lo ignoran porque saben que esta desactualizado. Cuando es un organismo vivo con pipeline, changelog y telemetria de uso, se convierte en la fuente de verdad que todo el equipo respeta.

brad frost · atomic design
Preferir
v4.12.0
Actualizado hace 2 horas
Button 847 instancias
Card 312 instancias
Tests passing 142 specs · 0 failures
Ver changelog completo
Sistema vivo: versionado, testeado, adoptado
Evitar
PDF
Design System v2.3
Última actualización: Marzo 2024
sin abrir
Abandonado hace 2 años
Documento estático: desactualizado en semanas
192

Componentes fluidos, no breakpoints fijos

Entre más fluido sea un componente, más resiliente y versatil. Diseñar solo para 3 breakpoints (mobile, tablet, desktop) deja "valles" entre cada salto donde el layout se rompe. Usar unidades relativas, clamp(), min(), max() y container queries permite que el componente se adapte a cualquier ancho sin necesidad de puntos de quiebre explicitos. Testear siempre en viewports aleatorios, no solo en los clasicos 320, 768 y 1024.

brad frost · atomic design
Preferir
200px
Título
Compacto y funcional.
400px
Título del card
Escala suave, sin saltos.
Acción
800px
Título del card
Espacioso y equilibrado a cualquier ancho.
Acción
width: clamp(200px, 100%, 480px);
Fluido: se adapta a cualquier ancho sin breakpoints.
Evitar
320px
Título
Texto corto
500px
Título del card
El texto no escala bien. El layout se siente raro, ni compacto ni amplio.
Acción
1024px
Título del card
Descripción del componente desktop.
Acción
3 breakpoints fijos: se rompe entre ellos. A 500px el card no sabe que layout usar.
193

Molecula = una sola responsabilidad

Cada molecula (grupo simple de atomos) debe hacer UNA cosa y hacerla bien. Un SearchInput busca, un FilterSelect filtra, un SortToggle ordena. Cuando una molecula acumula multiples responsabilidades se convierte en un god-component: imposible de testear en aislamiento, imposible de reusar parcialmente, y cualquier cambio en una responsabilidad arriesga romper las demas. La solución es descomponer en moleculas de responsabilidad única y componer en un organismo que las orqueste sin acoplarlas.

brad frost · atomic design
Preferir
SearchInput busca
Buscar...
FilterSelect filtra
Casa 3 recam.
SortToggle ordena
Precio: menor a mayor
ResultsCount cuenta
47 resultados
SearchToolbar organismo
<SearchInput />
<FilterSelect />
<SortToggle />
<ResultsCount />
Una responsabilidad por molecula: composición libre
Evitar
SearchBar 5 responsabilidades
Buscar propiedades...
Casa Dpto. 3 recam.
Ordenar:
47 resultados
1 2 3
Una molecula con 5 responsabilidades: imposible de reusar