Crear un modo oscuro para tu sistema de diseño no debería ser un parche estético ni un experimento peligroso que rompa la identidad visual o deje de lado la accesibilidad. En mi trabajo con equipos y proyectos digitales he aprendido que un dark mode bien pensado puede reforzar la marca, mejorar la experiencia nocturna y reducir la fatiga visual—si se hace con reglas claras y variables semánticas. Aquí comparto el enfoque que uso: práctico, técnico y centrado en las personas.

Por qué el dark mode merece más que un esquema invertido

Lo primero que siempre digo es esto: no inviertas colores como atajo. El simple “fondo claro -> fondo oscuro” y “texto oscuro -> texto claro” suele producir contraste insuficiente, colores saturados que vibran, y elementos de marca que pierden su tono y legibilidad. Un buen dark mode exige replantear la jerarquía cromática y la tipografía visual, manteniendo coherencia con la identidad.

Principios que aplico desde el inicio

  • Usar tokens semánticos en lugar de tokens puramente cromáticos. Por ejemplo: background-primary, surface-muted, text-emphasis.
  • Mantener contrastes que cumplan WCAG 2.1 (mínimo 4.5:1 para texto normal y 3:1 para texto grande).
  • Preservar la personalidad de marca sin sacrificar legibilidad: ajustar saturación y brillo en lugar de cambiar matiz radicalmente.
  • Dar control al usuario: respetar la preferencia del sistema (prefers-color-scheme) y ofrecer un interruptor manual con estado persistente.
  • Cómo definir tu paleta dark sin perder la identidad

    Empiezo transformando la paleta con reglas predecibles, no con intuición. Una metodología que uso:

  • Identificar los roles: fondo, superficie, borde, texto primario, texto secundario, acento, éxito, error, aviso.
  • Para cada rol, crear una versión dark basada en luminancia y saturación. Por ejemplo: reducir la luminancia de fondos, disminuir saturación de colores de marca en superficies grandes y usar versiones ligeramente más saturadas para elementos de interacción (botones, enlaces) para que destaquen sobre fondos oscuros.
  • Usar un color de fondo principal en torno a #0B0F14 o #121214 según la sensación que quieras (muy oscuro vs. oscuro suave). Evito el negro puro (#000000) salvo para acentos muy concretos, porque el contraste extremo cansa y genera “bloques planos”.
  • Ejemplo práctico de tokens (CSS custom properties)

    En lugar de fijar #hex directos en componentes, defino variables semánticas que luego mapeo por tema. Así:

    TokenLightDark
    --bg-primary#FFFFFF#0B0F14
    --surface-muted#F4F6F8#111418
    --text-primary#0B1A2B#E6EEF6
    --text-secondary#5B6B7A#A8B6C4
    --brand-accent#FF6B6B#FF8A8A

    Esta abstracción me permite ajustar solo el mapping por tema y mantener todos los componentes inalterados. Además facilita pruebas A/B y cambios iterativos.

    Contrastes y accesibilidad: reglas concretas

    No negocies con contrastes. Yo uso estas reglas mínimas:

  • Texto normal (<= 18px y peso normal): contraste >= 4.5:1.
  • Texto grande (>= 18px bold o >= 24px normal): contraste >= 3:1.
  • Elementos interactivos con texto (botones, inputs): cumplir 4.5:1 en su estado normal; en hover/focus mejorar visibilidad.
  • Hay herramientas que recomiendo: axe, Lighthouse, Contrast Checker de WebAIM y la extensión Colour Contrast Analyser. En el proceso, mido con estas herramientas y ajusto la luminancia sin tocar el matiz de marca, cuando es posible.

    Estrategias CSS que uso

  • Preferencias del sistema: utilizar @media (prefers-color-scheme: dark) para aplicar el tema automáticamente.
  • Tema manual: agregar una clase raíz como .theme-dark o usar el atributo data-theme="dark" para permitir conmutación manual y persistencia (localStorage).
  • Tokens dinámicos: usar custom properties en :root y en .theme-dark para hacer swapping eficiente y permitir transiciones suaves sin repintado masivo.
  • Ejemplo mínimo:

    :root { --bg-primary: #fff; --text-primary: #071826; } .theme-dark { --bg-primary: #0B0F14; --text-primary: #E6EEF6; }

    Más allá de colores: sombras, bordes y elevaciones

    En dark mode las sombras funcionan distinto: sombras oscuras sobre fondos oscuros desaparecen. Yo cambio las sombras por bordes sutiles o por glow invertido según el caso.

  • Elevaciones: en light uso sombras con opacidad baja; en dark sustituyo por bordes internos muy sutiles o variaciones del propio color de la superficie.
  • Bordes: los bordes claros sobre fondo oscuro deben tener opacidad adecuada (ej. rgba(255,255,255,0.06)) para evitar contraste agresivo.
  • Tratamiento de imágenes, ilustraciones y logos

    Este es un punto donde se rompen muchas implementaciones. Yo sigo estas reglas:

  • Logos: proporcionar versiones invertidas y monocromas del logo para dark mode. No uses la versión a color si el fondo la aplasta.
  • Imágenes fotográficas: evitar filtros globales que alteren tonos de piel. En lugar de eso, recuadro las imágenes en tarjetas con fondo neutral o añadir overlay semi-transparente para mejorar legibilidad del texto.
  • Ilustraciones e iconografía: crear una versión con colores adaptados o usar iconos en máscara que tomen el color de texto para cambiar según el tema.
  • Interacciones, animaciones y microcopias

    El modo oscuro puede afectar la percepción del movimiento. Para que las animaciones no resulten intrusivas:

  • Reducir la duración y la amplitud de animaciones en dark mode para evitar fatiga visual.
  • Asegurar estados de foco visibles (outline o box-shadow) con contraste fuerte en ambos temas.
  • Revisar microcopias que indiquen cambios (por ejemplo, “Activar modo oscuro” / “Desactivar modo oscuro”) y accesibles con lectores de pantalla.
  • Pruebas y checklist que uso antes de lanzar

  • Recorrer todas las páginas y componentes con la preferencia del sistema activada y con la clase manual para asegurar consistencia.
  • Comprobar contraste en textos y botones con herramientas automáticas y revisión visual manual.
  • Verificar logos, imágenes e iconos para cada estado.
  • Probar con usuarios reales o al menos con compañeros que usen modo oscuro habitualmente.
  • Probar en diferentes dispositivos y navegadores, y con asistentes como NVDA o VoiceOver para asegurarse de que el cambio de tema no rompe el DOM o el orden de lectura.
  • Errores comunes que debes evitar

  • No respetar el contraste por estética: sacrificar legibilidad por “look” siempre sale caro.
  • Usar colores saturados en superficies grandes: generan halos o fatiga visual.
  • No ofrecer persistencia: el usuario activa el modo oscuro y lo pierde al recargar o en otra sesión.
  • Ignorar imágenes y logos: fallas aquí dejan marcas poco profesionales.
  • Implementar dark mode es una oportunidad para mejorar tu sistema de diseño: obliga a pensar en roles, accesibilidad y consistencia. Si lo haces con tokens semánticos, pruebas rigurosas y respeto por la identidad de marca, el resultado será un tema oscuro que se siente natural, mejora la experiencia y mantiene la integridad visual del producto.