Product Craft Bible
Dark Mode Avanzado
Inicio Avanzado Dark Mode Avanzado
Avanzado

Dark Mode Avanzado

7 reglas refactoring ui · stripe · material designmaterial design · refactoring uirefactoring ui · material designrefactoring ui · smashing magazine
175

Dark Mode Avanzado

7 reglas
1524

Mapear colores con tokens semánticos, no invertir hex

Invertir los colores hex del light mode en dark mode produce paletas inconsistentes y difíciles de mantener. La solución es mapear tokens semánticos: --color-surface, --color-text, --color-border. Cada token toma un valor distinto según el tema. Un cambio de tema es solo redefinir los tokens, no tocar los componentes.

refactoring ui · stripe · material design
Preferir

Notificaciones

Tienes 3 mensajes nuevos pendientes de revisión.

Urgente
/* Semantic tokens */ :root { --bg: #fff; --text: #111; } [data-theme="dark"] { --bg: #1a1a1a; --text: #e5e5e5; } .card { background: var(--bg); color: var(--text); }
Tokens semánticos: un solo cambio de definición adapta todos los componentes
Evitar

Notificaciones

Tienes 3 mensajes nuevos pendientes de revisión.

Urgente
/* Naive: filter invert */ .dark-mode { filter: invert(1); } /* Colores rotos, tintes raros */
filter: invert(1) produce tintes incorrectos, colores neon y contraste impredecible
1525

Luminancia para elevación en dark mode, no sombras

En dark mode, las sombras oscuras sobre fondo oscuro son invisibles. La elevación se comunica con luminancia de superficie: los elementos más altos en la jerarquía visual son más claros. Base a #121212, card a #1e1e1e, modal a #2a2a2a, popover a #333333. Cada nivel sube ~8-10% de luminancia. Las sombras pueden coexistir como refuerzo sutil, pero la luminancia es el vehiculo principal de profundidad.

material design · refactoring ui
Preferir
Base
#121212
Card
#1e1e1e
Modal
#2a2a2a
Popover
#333333
Cada nivel de elevación es más claro. Jerarquía visible sin sombras.
Evitar
Card A
Card B
Card C
Sombras invisibles sobre fondo oscuro. Las tres cards lucen identicas.
1526

Negro y blanco nunca puros en dark mode

El negro puro #000000 como fondo y el blanco puro #ffffff como texto producen un ratio de contraste de 21:1 que, aunque tecnicamente perfecto, causa fatiga visual rápida y halación (smearing) en pantallas OLED. Los valores suavizados #121212 o #1a1a1a para fondo y #e5e5e5 o #ebebeb para texto mantienen un contraste de ~15:1, suficiente para WCAG AAA, sin la agresividad visual de los puros.

refactoring ui · material design
Preferir

Configuración de cuenta

Valores suavizados eliminan la halación en OLED y reducen la fatiga en sesiones largas. El contraste sigue siendo WCAG AAA sin la agresividad de los puros.

15:1 - confortable y AAA
#000
#121212
#1a1a1a
#fff
#e5e5e5
#ebebeb
Fondo #121212 + texto #e5e5e5: contraste ~15:1, WCAG AAA, sin halación
Evitar

Configuración de cuenta

El texto blanco puro sobre negro absoluto produce halación en OLED y fatiga visual rápida en lectura prolongada. Los bordes entre elementos desaparecen.

21:1 - demasiado
Negro #000000 + blanco #ffffff: contraste 21:1 causa fatiga y halación en OLED
1527

Incrementar saturación de acentos 10-20% en dark mode

Los colores de acento que funcionan en light mode parecen apagados sobre fondo oscuro. El fondo oscuro "absorbe" el color visualmente. Incrementar la saturación (no la luminosidad) entre 10 y 20% en dark mode para que el acento mantenga su impacto visual. Verificar que el contraste WCAG siga siendo adecuado.

refactoring ui · material design
Preferir
Light
hsl(220, 75%, 55%)
Dark
hsl(220, 90%, 60%)
/* Light */ --accent: hsl(220, 75%, 55%); /* Dark: +15% sat, +5% lum */ --accent: hsl(220, 90%, 60%);
Saturación incrementada +15% en dark mode: el acento luce igual de vibrante en ambos fondos
Evitar
Light
hsl(220, 75%, 55%)
Dark
hsl(220, 75%, 55%)
--accent: hsl(220, 75%, 55%); /* mismo valor en ambos temas */
Mismo hex en light y dark: el acento luce vibrante sobre blanco pero apagado sobre fondo oscuro
1528

Tratar imagenes con reducción de brillo y borde

Las imagenes fotograficas con fondos blancos o brillantes en dark mode se convierten en "faros" visuales que rompen la armonia. Aplicar filter: brightness(0.85) a imagenes no-iconos en dark mode y anadir un borde sutil de 1px solid rgba(255,255,255,0.1) para integrarlas al contexto oscuro. Sin este tratamiento, una imagen luminosa compite con el contenido y rompe la coherencia del tema oscuro.

refactoring ui · material design
Preferir
Misma imagen con brillo reducido y borde sutil. Se integra al contexto oscuro sin competir con el texto.
[data-theme="dark"] img:not([data-no-dim]) { filter: brightness(0.85); border: 1px solid rgba(255,255,255,0.1); }
brightness(0.85) + borde 1px rgba(255,255,255,0.1): la imagen se integra al dark mode sin destacar
Evitar
Imagen a brillo completo sin borde. Destaca como un faro sobre el fondo oscuro, compite con el contenido y rompe la armonia visual.
Imagen sin tratamiento: brillo al 100% y sin borde genera contraste agresivo contra el fondo oscuro
1529

Dark mode testing checklist

El dark mode no es solo cambiar backgrounds. Testear con un toggle rápido y un vistazo omite problemas criticos que solo emergen en revisión sistematica: texto que desaparece sobre fondos del mismo tono, bordes invisibles, sombras que no aportan profundidad, imagenes que deslumbran, focus rings que se pierden, y colores semánticos (error, success) que no cumplen contraste. Un checklist estructurado de 7 puntos cubre el 90% de los bugs recurrentes de dark mode.

refactoring ui · smashing magazine
Preferir

Dark mode checklist

Contraste verificado: 4.5:1 mínimo en texto, 3:1 en UI
Bordes visibles: rgba(255,255,255,0.1) mínimo
Elevación vía luminancia, no sombras oscuras
Imagenes tratadas: filter brightness(0.85)
Focus rings visibles: outline con offset y color claro
Error/success ajustados: rojo #f87171, verde #4ade80
Scrollbars estilizados con colores del tema
7 checks estructurados cubren el 90% de bugs recurrentes de dark mode
Evitar

QA: "se ve bien"

Texto gris #6b7280 sobre fondo #1a1a1a, ratio 2.8:1
Bordes 1px solid #1f1f1f invisibles sobre #1a1a1a
box-shadow negro sobre fondo negro, sin elevación
Imagenes sin brightness(), deslumbran como faros
Focus ring azul #3b82f6 invisible sobre fondo oscuro
Toggle rápido + vistazo: 5 categorías de bugs pasan desapercibidos sin revisión sistematica
1530

Jerarquía tipografica con peso y opacidad en dark mode

En dark mode, diferenciar niveles de texto solo con tamaño no basta: todo compite visualmente cuando el color es uniforme. La jerarquía efectiva combina peso tipografico y opacidad progresiva. Headings a font-weight: 600 con opacity: 0.95, cuerpo a 400 con opacity: 0.85, captions a 400 con opacity: 0.6. Esto crea capas de atención claras sin necesidad de cambiar tamaños drasticamente. Material Design y Apple HIG usan esta técnica como base de sus sistemas tipograficos en modo oscuro.

material design · apple hig
Preferir

Configuración de notificaciones

Administra como y cuando recibes alertas de tu equipo. Puedes personalizar cada canal de forma independiente.

Email Push

Última actualización hace 2 días

Heading 600/0.95, body 400/0.85, caption 400/0.6: jerarquía clara con peso y opacidad progresiva
Evitar

Configuración de notificaciones

Administra como y cuando recibes alertas de tu equipo. Puedes personalizar cada canal de forma independiente.

Email Push

Última actualización hace 2 días

Todo el texto a opacity 1 y weight 400: heading, body y caption compiten sin jerarquía visible