# Dark Mode

Aprendamos a crear temas oscuros para nuestros desarrollos web con CSS y Javascript.

# Requisitos

  1. VAR vs LET vs CONST
  2. Funciones de Flecha
  3. Template String
  4. Objetos
  5. Destructuring Objects
  6. Array de Objetos
  7. Fetch API
  8. Async & Await
  9. Map()
  10. Filter()

# Preguntas y Respuestas

# Recursos

# Tema oscuro

Hace un tiempo comenzaron a aparecer diferentes sitios web que ofrecían la posibilidad de cambiar el diseño a un tema oscuro, es por esto que nosotros trataremos de implementar nuestro propio Dark Mode a nuestro proyecto web.

Ejemplo:

# Requisitos

# HTML

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>DarkMode</title>
    <link rel="stylesheet" href="estilos.css">
</head>
<body class="dark-theme">
    <h1>Mi theme Dark</h1>
    <button id="boton">Cambiar</button>

    <script src="app.js"></script>
</body>
</html>

# Variables CSS

Creamos una clase "dark-theme" que en caso de ser utilizada, reemplazará nuestra variables globales del body.

body {
    --color-bg: #DDDDDD;
    --color-text: #EE6352;
}

body.dark-theme {
    --color-bg: rgb(53,53,53);
    --color-text: wheat;
}

body {
    background-color: var(--color-bg);
}

h1 {
    color: var(--color-text);
}

# Detectar Configuración

  1. Si por ejemplo en Windows no está activado el modo oscuro, esta configuración no se leerá.
  2. En caso de que exista la configuración de modo oscuro, se reescribirán las variables globales del body y tendremos una nueva clase llamada "light-theme".
@media (prefers-color-scheme: dark) {

    body {
        --color-bg: rgb(53,53,53);
        --color-text: wheat;
    }

    body.light-theme {
        --color-bg: #DDDDDD;
        --color-text: #EE6352;
    }
    
}

# Dark en Windows 10

  1. Configuración
  2. Colores
  3. Elige tu color: "Oscuro" || "Claro"

# Botón personalizado

const boton = document.querySelector('#boton');
const prefresDarkScheme = window.matchMedia('(prefers-color-scheme: dark)')

boton.addEventListener('click', () => {
    console.log('diste click')
    console.log(prefresDarkScheme)
    if (prefresDarkScheme.matches) {
        document.body.classList.toggle('light-theme')
    } else {
        document.body.classList.toggle('dark-theme')
    }
})

# LocalStorage

Paso 1:

const currentTheme = localStorage.getItem('theme');
if (currentTheme === 'dark') {
    document.body.classList.toggle('dark-theme');
} else if (currentTheme === 'light') {
    document.body.classList.toggle('light-theme');
}

Paso 2:

boton.addEventListener('click', () => {
    let theme;
    if (prefresDarkScheme.matches) {
        document.body.classList.toggle('light-theme')
        theme = document.body.classList.contains('light-theme') ? 'light' : 'dark'
    } else {
        document.body.classList.toggle('dark-theme')
        theme = document.body.classList.contains('dark-theme') ? 'dark' : 'light'
    }
    localStorage.setItem('theme', theme)
})

# Theme-color

No me funcionó 😦

  1. con-meta.netlify.app

  2. https://sin-meta-dark.netlify.app

  3. https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta/name/theme-color

<meta name="color-scheme" content="dark light">
:root {
  color-scheme: light dark; /* both supported */
}

# Imágenes

Una buena regla es disminuir un poco el brillo y el contraste de las imágenes. https://picsum.photos/

body {
    --color-bg: #DDDDDD;
    --color-text: #EE6352;
}

body.dark-theme {
    --color-bg: rgb(53,53,53);
    --color-text: wheat;
}

body.dark-theme img {
    filter: brightness(.8) contrast(1.2);
}

@media (prefers-color-scheme: dark) {

    img {
        filter: brightness(.8) contrast(1.2);
    }
    
}

# Más por aprender...

  1. https://css-tricks.com/a-complete-guide-to-dark-mode-on-the-web/#design
  2. https://alexandersandberg.com/theme-switcher/
  3. https://github.com/alexandersandberg/theme-switcher
  4. https://chrismorgan.info/blog/dark-theme-implementation/
  5. https://codepen.io/2kool2/pen/abzgPzJ