A medida que interfaces más atractivas y funcionales se convierten en la norma, la incorporación de características como el modo oscuro ha ganado popularidad. En Svelte, un framework para crear interfaces de usuario, podemos lograr esto de manera sencilla y efectiva a través del uso de condicionales. Aquí te explicamos paso a paso cómo implementar un modo oscuro y manipular condicionales para mostrar diferentes contenidos.
¿Cómo crear y manipular una variable en Svelte?
Para manejar el estado del modo oscuro en Svelte, primero crearemos una variable para almacenar este valor.
let styles ={darkMode:false};
Esta variable styles contendrá un objeto que, en este caso, comienza con darkMode en false. La idea es alternar este valor entre true y false para activar o desactivar el modo oscuro.
¿Cómo alternar el modo oscuro con una función?
Es esencial crear una función que permita alternar el valor de darkMode mediante un clic. Aquí es donde entra en juego la función toggle:
Esta función hace precisamente eso: cambia el estado de darkMode. Utiliza ! para negar el valor actual, y con document.body.classList.toggle adiciona o remueve la clase dark-mode al body del documento.
¿Cómo modificar el CSS para reflejar cambios visuales?
El siguiente paso es asegurarse de que los cambios de estado del modo oscuro se reflejen visualmente. Para esto, modificaremos las variables globales de CSS para que se activen al cambiar la clase dark-mode.
body.dark-mode{background-color:#121212;/* Cambia a un color de fondo oscuro */color:#ffffff;/* Cambia el color del texto a blanco */}
Al aplicar esta clase al body, el fondo de la aplicación cambiará a un color oscuro y el texto se volverá blanco, haciendo el contenido más amigable para la lectura en ambientes de poca luz.
¿Cómo activar el modo oscuro con un botón?
Dentro de tu componente Svelte, necesitas crear un botón que active el toggle cuando se haga clic:
<buttonon:click={toggle}>Toggle Dark Mode</button>
Este botón ejecutará la función toggle, alternando así el modo oscuro cada vez que el usuario lo presione.
¿Cómo usar condicionales para mostrar u ocultar contenido?
La estructura condicional if-else permite modificar el contenido basado en el estado de darkMode.
{#if !styles.darkMode}
<p>Modo claro activado</p>{:else}
<p>Hello Dark Mode</p>{/if}
Si darkMode es false (modo claro), mostrará "Modo claro activado".
Si darkMode es true, mostrará "Hello Dark Mode".
¿Qué sigue después de implementar el modo oscuro?
Ahora que entiendes cómo implementar una función básica de modo oscuro en Svelte, te animo a que sigas explorando. Personaliza los colores y añade más funcionalidades como transiciones para mejorar la experiencia del usuario. ¡El conocimiento es clave, y aplicar lo aprendido es fundamental para tu crecimiento profesional!
De la documentación 🚀, se le conoce a este ejercicio como Style class conditional 🎉
Dentro del archivo App.svelte, se generó una variable global y utilizando una nomenclatura campechana, de BEM y OOP, se modificaron para representar su estado:
🧐Nota. Es posible agregar más clases a la definición, en alguna respuesta a la condicional, al irlas separando con espacios.
...
<style>...
.text-UpSize p {
font-size: 30px;
}
</style>
Excelente, buen aporte.
Me encanto la opción de las variables globales para definir el color,
Por otro lado, en mi opinión no usaría clases como .text-darkMode porque agrega complejidad que considero innecesaria en este caso.
Explico: si sabes que nunca vas a tener combinaciones de textos en dark mode y en lightmode no sería necesario ser tan específicos teniendo una clase para cada texto ya que con styles.darkMode tendrías todo lo necesario para que eso pase y solo tener que especificarlo en el texto del css global.
Podría servir en el caso de aumentar el font-size pero no para el darkmode.
Toggle:
toggle es un método de classlist.
Recibe dos parámetros, el 1ero es la clase y el 2do es la condición a evaluar.
Si solo hay 1 parámetro: alterna el valor de la clase, si existe, la elimina (devuelve false), si no, la añade (devuelve true).
Si están los 2 parámetros: si la condición se evalúa como true, se añade la clase indicada, y si se evalúa como false, la elimina.
Muchas gracias, esto sin duda falto explicar en el video!
Reto cumplido!
Esta clase me compro jaja
aww!
Me encanta 😍
Me encantó esta clase :D
👌
Listo el modo lectura, pues puse el fondo amarillo y texto negro jaja primero organice esto para poder cambiar de dark a lectura, lectura a dark y así:
Quisiera saber si es lo mas optimo para cumplir el reto agregue las siguientes lineas.
:global(body.dark-mode p) {
color: #ff3e00;
}
La cuestión con ese código es que va a ser aplicada a todos los componentes de Svelte en el proyecto.
Entonces si por alguna razón se te ocurre poner un <p> dentro de una etiqueta con esa clase, también va a coger ese color y puede que no sea lo esperado.
Mi solución siguiente solamente agregue el span dentro del global
Para resolver el reto (que entendí era cambiar el texto de morado a uno más legible cuando estaba en dark mode) hice esto:
Agregué otras dos variables globales para cada tema, el luminoso y el oscuro, cada una con su prefijo respectivo, light y dark.
Y puse que el --theme-color por defecto fuera el valor de --light-theme-color.
// en App.svelte:global(:root){--light-theme-color: purple;--dark-theme-color:rgb(199,48,199);--theme-color:var(--light-theme-color);}
Despues, desde el componente DarkModeToggle en la función toggle agregué lo siguiente
functiontoggle(){ styles.darkMode=!styles.darkMode;window.document.body.classList.toggle("dark-mode");// Obtengo el nodo raíz del documento donde guardamos las variables del temalet root =window.document.documentElement;// Determino cual es el prefijo del nuevo tema activolet modePrefix = styles.darkMode?'dark':'light';// Cambio el valor de --theme-color con style.setProperty al valor de la variable del nuevo tema activo root.style.setProperty('--theme-color',`var(--${modePrefix}-theme-color)`);}
No se que tan buena solucion sea al escalar el proyecto en cuanto a performance y a organización del código, pero me gustó esta solución, para tener los cambios del tema en un solo componente, y no llenar de ifs el resto de componentes cuando haga falta.
body.dark-mode
body es el elemento, dark-mode es la clase
En mi caso emplie las Arrow Function, en el boton de darMode utiize un operador ternario para cuando lo pulsen cambie el emoji.
Y para el texto use la misma clase .dark-mode.
About.svelte