El diseño de juego inspirado en Duolingo es un caso maestro de cómo la visión visual puede aumentar significativamente la experiencia del usuario. El sistema de diseño utilizado por Duolingo se centra en elementos como el verde olivo brillante, sombras gruesas y tipografías confiantes. Este artículo explora cómo replicar estos elementos utilizando el repositorio open-design, proporcionando una guía paso a paso para implementar un estilo de juego similar a Duolingo.
1. Temática Visual y Ambiente: Juego como Lenguaje Visual
El documento de diseño menciona que la interfaz de Duolingo es "brillante sin ocultarse". Utiliza el verde olivo brillante (#58cc02) como el color principal, añadiendo sombras gruesas de 4 píxeles debajo de cada elemento interactivo, lo que da al usuario la sensación de estar presionando un botón tridimensional. El fondo es blanco (#ffffff) con bordes gruesos de 2-3 píxeles (#e5e5e5). Todo esto resalta al diseño como algo similar a las aplicaciones de iOS de 2015 revividas.
1.1 Lista de Características Clave
El documento identifica siete características clave que deben estar presentes simultáneamente:
- Verde Olivo Brillante (
#58cc02) como el color principal, ocupando más del 30% del área de la pantalla; - Sombras gruesas de 4 píxeles debajo de los elementos interactivos, simbolizando una sensación táctil de presión;
- Bordes gruesos de 2-3 píxeles, no usando líneas finas de 1 píxel;
- Fuente Feather Bold (sans-serif redondeada) + Fuente Mona Sans (para el texto general);
- Tamaño de fuente grande y confiado - comenzando desde el tamaño de fuente 48px y escalando hacia arriba;
- Personajes o吉祥物 - un cuervo llamado Duo aparece en escenarios como el proceso de introducción, errores y cumplimiento continuo (streak);
- Colores secundarios - naranja dorado (
#ff9600) y rosa turquesa (#ce82ff).
1.2 Lenguaje de Formas
El lenguaje de formas es una parte importante de la sensación amigable de este sistema: los bordes redondeados de las tarjetas son de 16-20 píxeles, los botones de 12 píxeles, y los chips y barras de progreso son de 9999 píxeles (pill-shaped). Los iconos son diseñados para ser llenados y redondeados, codificados según habilidades o temas.
Es importante notar que estas características están completamente codificadas en el archivo tokens.css del repositorio. Al abrir la cabecera del archivo, se pueden ver las decisiones de diseño resumidas:
/* Decisiones de diseño clave codificadas aquí:
* - Verde olivo brillante (#58cc02) — color principal, CTA principal y respuesta correcta
* - Blanco puro (#ffffff) — nunca tonificado; claridad óptica es la base
* - Sombra gruesa de 4 píxeles (#d7d7d7) — la "sensación de presión táctil"
* - Fuente Feather Bold + Mona Sans — tipografía redondeada y fuente corporativa suiza
* - Tamaño de fuente inicial de 56px — Duolingo no susurra; el tamaño es la identidad
* - Bordes pill-shape — tarjetas de 16px, botones de entrada de 12px, chispas de 9999px
* - Aceleración de spring (back-out, con sobrecompensación leve) — alegría juguetona en la animación
* - Anillo de foco de eel blue (#1cb0f6 tonificado) — contraste juguetón con el color verde de la marca
*/
2. Sistema de Colores y Asignación de Roles
El documento divide los colores en cinco capas, cada una con un propósito específico. El nombre de cada color sigue un sistema memorizable basado en nombres de animales y roles semánticos.
2.1 Colores Principales (Primarios)
| Rol | Valor | Uso |
|---|---|---|
| Verde Olivo Brillante Owl Green | #58cc02 |
Color principal, CTA principal, respuesta correcta |
| Verde Olivo Oscuro Owl Green Deep | #58a700 |
Color de presión/sombra para botones |
| Verde Olivo Suave Owl Green Light | #89e219 |
Estado de suspenso, relleno suave |
| Verde Olivo Deslumbrante Owl Green Pale | #dbf8c5 |
Superficie suave, banner de éxito |
2.2 Acentos Secundarios (Secundarios)
| Rol | Valor | Uso |
|---|---|---|
| Naranja Dorado Continua Streak Orange | #ff9600 |
Contador de cumplimiento continuo, ícono de llama, energía avanzada |
| Naranja Dorado Oscuro Continua Streak Orange Deep | #cc7a00 |
Estado de presión para el naranja |
| Rosa Turquesa Esmeralda Gem Pink | #ce82ff |
Moneda de esmeralda, Super Duolingo |
| Azul Mariposa Eel Blue | #1cb0f6 |
Botón de indicación, enlace informativo |
| Rojo Preliminar Cardinal Red | #ff4b4b |
Respuesta incorrecta, pérdida de vida |
| Amarillo Abeja Bee Yellow | #ffc800 |
Medalla profesional, logro |
2.3 Colores de Superficie (Superficies)
| Rol | Valor | Uso |
|---|---|---|
| Nieve Snow | #ffffff |
Fondo principal |
| Eel Pez | #f7f7f7 |
Separadores de zona, superficie secundaria |
| Águila Swan | #e5e5e5 |
Fondo deshabilitado, bloque embebido |
| Lobezno Wolf | #777777 |
Línea de separación oscura, texto secundario |
2.4 Mátteos y Texto (Mátteos y Texto)
| Rol | Valor | Uso |
|---|---|---|
| Eel Negro Pez | #3c3c3c |
Texto principle |
| Lobezno Wolf | #777777 |
Texto secundario, texto explicativo |
| Conejo Hare | #afafaf |
Deshabilitado, marcador de posición |
2.5 Colores de Borde (Colores de Borde)
| Rol | Valor | Uso |
|---|---|---|
| Águila Swan | #e5e5e5 |
Borde estándar de 2 píxeles |
| Conejo Hare | #afafaf |
Borde destacado en estado de suspenso |
2.6 Mapeo Semántico: El éxito es el mismo que la marca
Un aspecto fácilmente olvidado pero crucial en el diseño es que "la respuesta correcta" y el "color principal de la marca" son el mismo color. En tokens.css, se puede ver que esta asignación semántica está codificada explícitamente:
--success: #58cc02; /* Verde olivo brillante — "respuesta correcta" es la marca */
--warn: #ffc800; /* Amarillo abeja — medalla profesional, relámpago de logro */
--danger: #ff4b4b; /* Rojo preliminar — respuesta incorrecta, pérdida de vida */
Esta es la genialidad de los productos gamificados: la retroalimentación positiva de la respuesta correcta se asocia con la identidad de la marca, fortaleciendo la marca con cada "acierto".
3. Reglas de Tipografía
3.1 Familias de Tipografía
| Propósito | Fuente Preferida | Fuente de Retorno |
|---|---|---|
| Presentación / Interfaz / Encabezados | Feather Bold | 'DIN Round Pro', 'Helvetica Neue', sans-serif |
| Texto / Longitud de Texto | Mona Sans | 'Helvetica Neue', system-ui, sans-serif |
| Código (raro, administración escolar/administrativa) | JetBrains Mono | ui-monospace, Menlo, monospace |
3.2 Escala Completa de Tamaños
El documento proporciona una tabla completa de escalas de tamaños, que es lo que necesitas copiar y pegar durante la implementación:
| Rol | Fuente | Tamaño | Peso | Línea Alta | Espacio entre Letras | Notas |
|---|---|---|---|---|---|---|
| Presentación | Feather Bold | 56px (3.5rem) | 800 | 1.05 | -0.01em | Encabezado principal de la página de bienvenida |
| H1 | Feather Bold | 32px (2rem) | 800 | 1.15 | -0.005em | Encabezado de la página |
| H2 | Feather Bold | 24px (1.5rem) | 800 | 1.2 | normal | Encabezado de capítulo |
| H3 | Feather Bold | 18px (1.125rem) | 700 | 1.25 | normal | Título de tarjeta, fila de cursos |
| Texto Grande | Mona Sans | 17px (1.0625rem) | 500 | 1.5 | normal | Instrucciones de curso, indicaciones |
| Texto | Mona Sans | 15px (0.9375rem) | 400 | 1.5 | normal | Ensayo estándar |
| Texto Explicativo | Mona Sans | 13px (0.8125rem) | 600 | 1.4 | 0.01em | Cuenta de XP, metadatos |
| Botón | Feather Bold | 16px (1rem) | 800 | 1.2 | 0.02em | Etiquetas de botón estándar |
| Cumplimiento Continuo | Feather Bold | 14px (0.875rem) | 800 | 1.2 | normal | Número de cumplimiento continuo, llama encima |
3.3 Tres Principios de Diseño de Tipografía
- 800 es el valor predeterminado: Feather Bold se usa en encabezados y botones con un peso de 800, mientras que 700 parece débil en este sistema;
- Tamaños grandes: los encabezados son 25-40% más grandes que los típicos productos de marca—la confianza misma es la identidad;
- Tipografía redondeada: cada letra tiene una terminación suave, las fuentes con bordes agudos romperían el contrato amigable.
En el nivel de los tokens, esta escalada se mapea a una cadena completa de variables de tamaños desde --text-xs (12px) hasta --text-4xl (56px), acompañadas por variables de línea alta y espaciado entre letras como --leading-body, --leading-tight, --tracking-display. Se nota que el comentario especializado en tokens.css que indica --text-4xl: 56px es "hero de bienvenida, nunca temeroso"—el coraje del tamaño se considera una gestión de activos de la marca.
4. Normas de Estilo de Componentes
4.1 Sistema de Botones
Los botones son el núcleo de este sistema de diseño, compartiendo un lenguaje de interacción consistente basado en "sombras gruesas de 4 píxeles debajo + efecto de presión".
Botón Principal (verde olivo)
- Fondo:
#58cc02 - Texto:
#ffffff - Padding: 14px 24px
- Radio de borde: 16px
- Borde inferior: 4px sólido
#58a700(la "sombra gruesa") - Estado de suspenso: fondo
#89e219 - Estado activo: translada 4 píxeles hacia abajo, borde inferior regresa a cero (botón "presionado")
- Propósito: "Continuar", "Comprobar", CTA principal
Botón Secundario (blanco + sombra gruesa)
- Fondo:
#ffffff - Texto:
#777777 - Borde: 2px sólido
#e5e5e5 - Borde inferior: 4px sólido
#e5e5e5 - Radio de borde: 16px
- Padding: 14px 24px
- Estado de suspenso: texto cambia a
#3c3c3c, borde cambia a#afafaf
Botón de Cumplimiento Continuo (naranja dorado)
- Fondo:
#ff9600 - Texto:
#ffffff - Borde inferior: 4px sólido
#cc7a00 - Propósito: meta de cumplimiento continuo, "Empezar el cumplimiento"
Botón de Error (rojo preliminar)
- Fondo:
#ff4b4b - Texto:
#ffffff - Borde inferior: 4px sólido
#cc3b3b - Propósito: retroalimentación de respuesta incorrecta
En la implementación real en components.html, este lenguaje de interacción de presión se resume en tres reglas simples:
.btn-primary {
background: var(--accent);
color: var(--accent-on);
box-shadow: 0 4px 0 var(--accent-active);
}
.btn-primary:hover { background: var(--accent-hover); }
.btn-primary:active {
transform: translateY(4px);
box-shadow: 0 0 0 var(--accent-active);
}
Nota que los botones tienen text-transform: uppercase y letter-spacing: 0.04em por defecto, lo cual es un detalle implícito en los CTAs del juego: etiquetas de botones en mayúsculas suenan más como "botones de juego". El estado de foco se maneja a través de --focus-ring (0 0 0 3px rgba(28, 176, 246, 0.2)), que proporciona un contraste ligero con el color verde de la marca.
4.2 Tarjetas / Bloques de Curso
- Fondo:
#ffffff - Borde: 2px sólido
#e5e5e5 - Borde inferior: 4px sólido
#e5e5e5 - Radio de borde: 16px
- Padding: 16px
- Estado de suspenso: flota 2 píxeles hacia arriba, sombra
0 4px 0 #d7d7d7
4.3 Nodos del Árbol de Habilidades (Burbujas de Curso)
- Tamaño: 80×72px
- Fondo: tono claro del color de habilidad (activo como verde, bloqueado como gris)
- Borde inferior: 6px sólido variante más profunda
- Radio de borde: 50% (círculo completo)
- Estado activo: oscila entre 1.0 y 1.05 a una frecuencia de 1.6 segundos
4.4 Campos de Entrada
- Fondo:
#ffffff - Borde: 2px sólido
#e5e5e5 - Radio de borde: 12px
- Padding: 12px 16px
- Estado de foco: borde
#1cb0f6(eel blue), halo0 0 0 3px rgba(28, 176, 246, 0.2)
4.5 Barras de Progreso
- Trayectoria:
#e5e5e5 - Relleno:
#58cc02(en el contexto del cumplimiento continuo se usa#ff9600) - Radio de borde: 9999px
- Altura: 16px
- Animación incremental: 320ms ease-out
En components.html, la implementación de la barra de progreso también incluye un detalle refinado: el relleno tiene una sombra interna box-shadow: inset 0 -4px 0 var(--accent-active)—esto simula que el bloque relleno también tiene una sombra gruesa de 4 píxeles, manteniéndose coherente con la estética global del sistema.
5. Espacios y Diseño de Layout
- Unidad Base: 4 píxeles, escalado completo de 4, 8, 12, 16, 24, 32, 48, 64;
- Contenedor: ancho máximo de 1080 píxeles, margen de giro (gutter) de 24 píxeles en pantallas de escritorio;
- Columna del Árbol de Habilidades: ancho de 320 píxeles, centrada en pantallas de escritorio.
Este enfoque filosófico de diseño se desarrolla completamente en tokens.css, con una cadena completa de variables de espacio desde --space-1 (4 píxeles) hasta --space-12 (48 píxeles), así como un conjunto distinto de variables de ritmo vertical por punto de ruptura de diseño (--section-y-desktop, --section-y-tablet, --section-y-phone), y tres escalas de margen de giro para pantallas de escritorio, tablet y móvil (--container-gutter-desktop/tablet/phone). Las notas de los comentarios explican la lógica detrás del producto:"pantallas de escritorio espaciosas, pantallas móviles compactas, haciendo que la columna del árbol de habilidades lea como fluída en lugar de bloques paginados".
6. Diseño de Animaciones
- Duración: Presión de botón: 180 ms; desbloqueo de nodo de habilidad: 320 ms; pulsación de nodo activo: 1.6 s;
- Función de Tiempo: Desbloqueo de animación:
cubic-bezier(0.34, 1.56, 0.64, 1)(back-out, con sobrecorrimiento leve)—esta es la expresión matemática de la "alegría juguetona"; - Personajes: Duo parpadea cada 4-6 segundos, saltando en hitos de cumplimiento continuo (spring outwards con una duración de 480 ms y curva de tiempo ease-out).
Las duraciones de las animaciones se nombran en tokens como --motion-fast: 180ms y --motion-base: 320ms, mientras que la función de tiempo se denomina --ease-standard. Todas las transiciones de todos los componentes (botones, tarjetas, campos de entrada) utilizan estas tres variables, asegurando un ritmo de animación uniforme a nivel del sitio web.
7. Límites de Uso (Límites de Uso)
El documento de diseño concluye con tres "guardrails" para evitar que el estilo se distorsione:
- Usar juntos el verde olivo brillante, sombras gruesas y geometría redondeada de los cursos—un solo botón plano de verde olivo no será reconocido como Duolingo;
- Reservar tipos de letra superiores para momentos de curso, cumplimiento continuo y progreso—escenarios donde el producto necesita incentivar o dar retroalimentación, no usarlos en todo el texto;
- Restringir el uso de animaciones vibrantes cuando haya cambios en el progreso—evitar una acumulación de animaciones generales en cada control.
Estos tres guardrails corresponden a una lista detallada de "Hacer / Evitar" en USAGE.md, que garantiza la portabilidad cruz-marca de la hoja de estilos: mantener el nombre del esquema de tokens para asegurar la compatibilidad en el cambio de marcas; priorizar la reutilización de los grupos de componentes definidos en components.manifest.json; evitar el uso de valores hexadecimales directos fuera de los bloques :root; y evitar redefinir valores de tokens de diseño de Tailwind o de otras herramientas de diseño fuera del archivo tokens.css.
8. Implementación en open-design: De la norma a la ejecución de contrato
El documento de diseño no es solo texto plano, sino que forma parte de una cadena completa de procesos dentro del repositorio open-design, que incluye una serie de archivos como DESIGN.md, tokens.css, preview/colors.html, preview/typography.html, preview/spacing.html, components.html, components.manifest.json, etc. Esta estructura permite una implementación sistemática y automatizada del diseño, lo que diferencia el sistema de diseño de un simple documento de diseño tradicional.
8.1 Vista General de la Estructura del Paquete
El directorio design-systems/duolingo/ contiene los siguientes archivos y carpetas:
- Capa de Normas: DESIGN.md (inglés) y varias versiones multilingües como DESIGN-pl.md, DESIGN-zh.md, que contienen el contenido completo;
- Capa de Tokens: tokens.css (fuente única), design-tokens.json (archivo derivado), tailwind-v4.css (mapeo a Tailwind v4);
- Capa de Componentes: components.html (contiene 66 selectores, 36 clases y 9 grupos de referencias de componentes), components.manifest.json (lista de componentes);
- Capa de Previsualización: preview/colors.html, preview/typography.html, preview/spacing.html;
- Capa de Sistema: system/tokens.default.json, system/kit.html, system/kit.dark.html;
- Capa de Auditoría: source/evidence.md (declara el alcance de la evidencia), source/token-contract.report.json (informe de contrato de tokens).
El archivo manifest.json declara que el paquete sigue el esquema od-design-system-project/v1, es de tipo bundled (paquete elegido por open-design), y sugiere aplicar las normas color y accessibility-baseline.
8.2 Validación de la Lista de Componentes
El archivo components.manifest.json realiza una validación maquinaria para verificar que los componentes siguen correctamente el formato: declara 66 selectores, 36 clases y 26 elementos, agrupados en 9 categorías como botones, entradas, tarjetas, etc. Cada categoría lista los tokens que utiliza, como los botones que usan --accent, --accent-active, --accent-on, --motion-fast, --radius-md, etc., y los campos de entrada que usan --focus-ring, --font-display, etc. La valicación automática es útil porque permite comprobar si cada descripción en el documento de diseño se ha implementado correctamente.
8.3 Sistema de Contrato de Tokens
La estructura de nombres de los tokens no es arbitraria, sino que sigue un contrato global definido en token-schema.ts. Este contrato clasifica cada token en cinco capas:
- A1-identity (obligatorio): el token es parte de la propia marca, sin reemplazo (por ejemplo, --bg, --fg, --accent, tipografías);
- A1-structure (obligatorio): decisiones estructurales (escalas de tamaños, grillas de diseño, ritmos verticales), que cada marca debe escribir;
- A2 (obligatorio pero con reemplazo): tiene un valor por defecto, y el script derive obtendrá un valor de fallback de _schema/defaults.css;
- B-slot (opcional): existe para la consistencia cruz-marca, sin una jerarquía adicional de capas, se puede usar para referirse a otros tokens (por ejemplo, --fg-2 puede referirse a --fg);
- C-extension (específico de la marca): declarado explícitamente por la marca, no se puede referirse en componentes generales, se requieren al menos dos marcas para elevarlo a B-slot.
El paquete Duolingo es un ejemplo práctico de este contrato: en components.manifest.json, los tokens como --border-soft, --elev-flat, --elev-ring, --fg-2, --surface-warm están marcados como unusedDeclared (declarados pero no utilizados), y undeclaredReferenced está vacío—lo que significa que todos los tokens que los componentes utilizan han sido declarados, cerrando así el contrato. Esto se verifica con la norma de USAGE.md que dice "evitar el uso de valores hexadecimales directos fuera de los bloques :root".
8.4 Dos Caminos de Consumo
Hay dos caminos para utilizar este sistema de diseño sin modificar el contenido del repositorio:
- Pegar directamente: siguiendo el orden de lectura de USAGE.md, primero entender la intención visual en DESIGN.md, luego pegar tokens.css en el primer bloque de tu producto, y finalmente escribir el CSS de los componentes usando las clases definidas en components.html;
- Mapeo a Tailwind v4: mediante tailwind-v4.css, conectar los tokens a los temas de Tailwind, el bloque @theme de tailwind-v4.css mapeará
--color-accent,--font-display,--shadow-raised,--duration-fast,--spacing-section-desktop, etc., abg-accent,font-display,shadow-raised,duration-fast, etc., como clases de utilidad. El archivo head de tailwind-v4.css especifica "Derivado de tokens.css. Mantén tokens.css como la fuente única de verdad" —el único lugar verdadero de verdad donde los tokens están almacenados es tokens.css, no se deben modificar los archivos derivados.
9. De la Norma a la Evaluación: ¿Qué significa "Duolingo"?
Juntando el documento de diseño y la implementación del repositorio, se pueden extraer tres criterios rígidos para determinar si una interfaz es "con estilo Duolingo":
- La sombra no es solo decorativa, sino semántica:
--elev-raised(0 4px 0 #d7d7d7) es el "señal de presión",translateY(4px)junto con la eliminación de la sombra cuando se activa forman un ciclo de feedback de presión completo—sin esta pareja, un botón verde simplemente sería un botón verde; - El verde cumple dos funciones:
--accenty--successson el mismo valor, lo que une la identidad de la marca con la retroalimentación positiva; - El tamaño de la fuente expresa el tono: Display comienza a partir de 56px, el peso es 800 y el espaciado es
-0.01em—estos números combinados definen la característica distintiva de Duolingo de "no susurrar".
Para los diseñadores y desarrolladores que quieran reproducir este lenguaje en sus propias aplicaciones SaaS, herramientas de adquisición de hábitos o cualquier otro producto que requiera "incentivos positivos", los tokens de diseño, recetas de componentes y mecanismos de contrato descritos en este artículo pueden actuar como plantilla reutilizable.
Explorar más profundamente se puede hacer leyendo el documento original DESIGN.md, las definiciones completas de los tokens en tokens.css, y la implementación de los 9 grupos de componentes en components.html.
[Descarga gratuita] open-design 🎨 Mejor complemento de diseño local para Claude. Alternativa abierta a Claude Design. 🖥️ Aplicación de escritorio local. 🖼️ Tu agente de código se convierte en el motor de diseño: prototipos, páginas de aterrizaje, paneles, diapositivas, imágenes y video — archivos reales, HTML/PDF/PPTX/MP4 exportables. 🤖 Claude Code / Codex / Cursor / DeepSeek Harness / OpenCode & 20+ CLI por medio de BYOK. Repositorio del proyecto: https://gitcode.net/gh_mirrors/opend/open-design