Color Scheme Preference Detector

blazor wasm

Le Color Scheme Preference Detector est une librairie Nuget que j’ai récemment développé pour permettre de facilement savoir si un utilisateur préfère les thèmes sombres ou clairs, que je voyais pouvant être utilisé avec Blazor. Voici donc un petit article pour en expliquer l’origine et le fonctionnement.

L’origine de l’idée de la librairie

L’idée de cette librairie m’est venue lors de ma lecture d’un article de Scott Hanselman. Dans son article, que je vous recommande de lire, Scott mentionnait comment il avait fait pour vérifier les préférences de l’utilisateur concernant le thème (sombre ou clair) grâce à quelques lignes de JavaScript. Après lui avoir répondu sur Twitter que cela ferait une bonne librairie à utiliser avec Blazor via interop, il m’a simplement répondu par un gif qui disait « Do it ». Peu de temps après dans la soirée, la librairie était disponible sur Github et Nuget !

Le fonctionnement

Pour vérifier les préférences de l’utilisateur, nous pouvons utiliser la media query « prefers-color-scheme« , qui permet de savoir si l’utilisateur préfère un thème « dark » ou « light ». Toujours inspiré de l’article de Scott, j’ai donc créé une Razor Class Library avec ce simple fichier JavaScript qui s’occupe de faire la vérification:

Le fonctionnement est donc plutôt simple, on commence par vérifier si le navigateur support la fonction matchMedia, sans quoi on retourne une valeur par défaut pour un thème clair. S’il le supporte, ce qui est le cas pour les navigateurs récents, on vérifie la préférence de la media query pour retourner true/false selon la préférence envers le thème sombre.

Interop pour utiliser avec Blazor

La prochaine étape était d’avoir une interface, qui serait injectée aux endroits nécessaires, avec la classe qui s’occupe d’appeler la méthode du module JavaScript. Au final, on se retrouve avec cette classe pour faire ce travail:

On peut voir ici que j’ai utilisé l’isolation JavaScript avec un module, ce qui fait que la fonction JavaScript prefersDarkMode n’est pas une méthode globale disponible partout. Et donc avec ceci en place, tout ce qu’il faut faire pour consommer cette fonction est d’injecter l’interface IColorSchemePreferenceDetector aux endroits où on en a besoin.

Conclusion

Comme vous avez pu remarquer, c’est très simple développer une classe qui fait de l’interop avec JavaScript, qui nous permet au final de cacher cette couche lors de l’utilisation avec Blazor. Je vous laisse les liens vers la librairie Nuget, les sources sur Github, si jamais vous voulez les consulter ou utiliser. Si vous avez d’autres idées intéressantes de librairies comme ceci qui pourraient être utiles, n’hésitez pas à me laisser savoir, cela pourrait bien être la prochaine librairie que je développe!

Nuget: https://www.nuget.org/packages/BracketShow.ColorSchemePreferenceDetector/

Github: https://github.com/BracketShow/ColorSchemePreferenceDetector

Bruno

Auteur : Bruno

De jour, je suis développeur, chef d'équipe et le co-animateur du Bracket Show. De soir, je suis un mari et le père de deux magnifiques enfants. Le temps qu'il me reste après tout cela, je le passe à tenter de bouger, à jouer et écrire des critiques de jeux vidéos, ainsi qu'à préparer du matériel pour les enregistrements du Bracket Show et pour ce blog. Au travers tout cela, je suis aussi passionné de musique et de microbrasseries.