1. Détection automatique du thème système
Si aucune préférence utilisateur n’est encore définie, le composant détecte automatiquement le thème préféré du système via la règle CSS :
@media (prefers-color-scheme: dark)
BrowserUX Theme Switcher est un Web Component léger et accessible permettant de basculer facilement entre les thèmes clair et sombre, avec détection système, persistance et personnalisation CSS.
Le composant browserux-theme-switcher
applique dynamiquement un thème
clair ou sombre sur un élément de votre page (html
par défaut ou un autre via
l’attribut target
).
Il suit une logique en trois étapes :
Si aucune préférence utilisateur n’est encore définie, le composant détecte automatiquement le thème préféré du système via la règle CSS :
@media (prefers-color-scheme: dark)
Lorsque l’utilisateur clique sur le bouton pour basculer de thème, sa préférence
(light
ou dark
) est enregistrée dans localStorage
.
Cette préférence sera :
Le composant applique ou met à jour dynamiquement l’attribut data-theme
sur
l’élément ciblé, par exemple :
<html data-theme="dark">...</html>
Cela permet de :
.has-dark
)theme-change
)
npm install browserux-theme-switcher
Ou via CDN:
<script type="module" src="https://unpkg.com/browserux-theme-switcher/dist/browserux-theme-switcher.min.js"></script>
Utilisez la version .esm.js si vous intégrez ce composant via bundler (React, Vue, etc.), et la version .min.js pour une intégration HTML directe via CDN.
browserux-theme-switcher
1. Importez simplement le composant dans votre code :
import 'browserux-theme-switcher';
2. Puis utilisez-le dans votre HTML :
<browserux-theme-switcher></browserux-theme-switcher>
1. Ajoutez dans votre composant React (souvent dans un useEffect) :
import { useEffect } from 'react';
useEffect(() => {
import('browserux-theme-switcher');
}, []);
2. Et dans votre JSX
<browserux-theme-switcher></browserux-theme-switcher>
Ajoutez le fichier types/browserux-theme-switcher.d.ts
pour un meilleur
support TypeScript avec JSX.
1. Ajoutez dans main.js ou main.ts :
import 'browserux-theme-switcher';
2. Utilisez-le comme un composant natif :
<browserux-theme-switcher></browserux-theme-switcher>
1. Importez dans main.ts
:
import 'browserux-theme-switcher';
2. Ajoutez le CUSTOM_ELEMENTS_SCHEMA
dans AppModule
:
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
@NgModule({
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AppModule {}
1. Ajoutez directement le composant via un CDN :
<script type="module" src="https://unpkg.com/browserux-theme-switcher/dist/browserux-theme-switcher.min.js"></script>
2. Puis :
<browserux-theme-switcher></browserux-theme-switcher>
Pour que le thème clair ou sombre s’applique à votre page, vous devez définir vos couleurs
via des variables CSS. Le composant <browserux-theme-switcher>
applique automatiquement un
attributdata-theme="dark"
ou "light"
à l’élément ciblé (par défaut html
), ce
qui permet de styliser dynamiquement votre interface.
:root {
--bux-page-bg: #eaeaea;
--bux-page-color: #121212;
--bux-color-primary: #f05e0e;
--bux-color-secondary: #0e93f0;
--bux-white: #fff;
}
/** Mode sombre automatique selon les préférences système */
@media (prefers-color-scheme: dark) {
:root {
--bux-page-bg: #333;
--bux-page-color: #eaeaea;
--bux-color-primary: #eb8a55;
--bux-color-secondary: #58aae3;
--bux-white: #444;
}
}
/** Mode sombre forcé via browserux-theme-switcher */
[data-theme="dark"] {
--bux-page-bg: #333;
--bux-page-color: #eaeaea;
--bux-color-primary: #eb8a55;
--bux-color-secondary: #58aae3;
--bux-white: #444;
}
:root
définit les couleurs par défaut (mode clair).@media (prefers-color-scheme: dark)
permet de prendre en compte les préférences système si l’utilisateur n’a pas encore choisi de thème.[data-theme="dark"]
permet de forcer le mode sombre lorsque l’utilisateur clique sur le bouton du browserux-theme-switcher.Le switcher applique data-theme="dark"
ou data-theme="light"
sur l’élément ciblé (html
par défaut, ou un conteneur via l’attribut target
). Vous devez donc appliquer les variables CSS sur
le même élément ou un parent commun.
Le composant browserux-theme-switcher
prend en charge automatiquement l’affichage d’images adaptées au thème (clair ou sombre), grâce à la classe spéciale has-dark
.
Lorsque vous ajoutez la classe has-dark
à une image dans votre HTML :
<img src="logo.png" class="has-dark" alt="Logo">
Le composant remplacera automatiquement l’attribut src
par une version -dark
lorsque le thème
sombre est actif, et reviendra à l’image initiale si le thème redevient clair.
nom.ex
(ex. logo.png
).nom-dark.ext
(ex. logo-dark.png
).
<img src="logo.png" class="has-dark">
→ Affiche logo.png
→ Remplacée automatiquement par logo-dark.png
Le changement est réversible et instantané à chaque bascule de thème, sans rechargement de page ni JavaScript supplémentaire.
browserux-theme-switcher
browserux-theme-switcher
offre de nombreuses possibilités de personnalisation :
Paramètre | Type | Nom | Description |
---|---|---|---|
Ciblage personnalisé | Attribut | target |
Applique le thème sur un élément spécifique |
Internationalisation | Attribut | lang |
Choix de la langue |
Accessibilité ARIA | Attribut | data-label-* |
Libellés accessibles modifiables |
Shadow DOM optionnel | Attribut | no-shadow |
Encapsulation désactivable |
Personnalisation CSS | Attribut | Style |
Personnalisation via variables CSS |
Événement personnalisable | Événement | theme-change |
Événement émis sur chaque changement de thème |
Slots icônes | Slot | *-icon |
Personnalisation des icônes |
target
)
Par défaut, le composant browserux-theme-switcher
applique le thème
(data-theme="light"
ou "dark"
) sur l’élément html
.
Mais vous pouvez personnaliser cette cible grâce à l’attribut target
.
target
string
(sélecteur CSS valide)html
data-theme
sur l’élément correspondant
<browserux-theme-switcher
target="#app"
></browserux-theme-switcher>
<div id="app">
<!-- Le thème s'applique ici -->
</div>
Dans cet exemple, c’est l’élément #app
(et non html
) qui recevra l’attribut data-theme
.
Cela permet de limiter le thème à un conteneur spécifique de votre application (utile dans des
micro-frontends, app-shells ou widgets embarqués).
Assurez-vous que vos styles CSS dépendent bien de [data-theme="dark"]
ou
[data-theme="light"]
sur le bon sélecteur :
#app[data-theme="dark"] {
--page-bg: #333;
/* etc. */
}
Si le sélecteur passé dans target ne correspond à aucun élément au moment du rendu, le fallback sera html
.
lang
)
Le composant browserux-theme-switcher
prend en charge plusieurs langues pour ses
libellés accessibles (par exemple : Activer sombre, Switch to light mode, etc.).
lang
string
("en
", "fr
", "es
", "de
",
"ja
", "ru
", "pt
", "it
", "nl
")aria-label
) du switch
<browserux-theme-switcher
lang="fr"
></browserux-theme-switcher>
Le libellé ARIA du bouton sera automatiquement en français :
aria-label="Activer le mode sombre"
ou aria-label="Activer le mode clair"
Si vous n'indiquez pas lang
, le composant suit cette logique :
browserux-theme-switcher
html lang="..."
en
" (anglais)Le composant prend en charge les langues suivantes pour les libellés accessibles (`aria-label`) :
data-label-light
/ data-label-dark
)Le composant browserux-theme-switcher
est conçu pour être accessible aux lecteurs d’écran,
grâce à des libellés dynamiques (aria-label
) qui décrivent l’action du bouton (activer le mode clair ou sombre).
Par défaut, ces libellés sont générés automatiquement en fonction de la langue (via l’attribut lang
).
Mais vous pouvez surcharger ces textes avec vos propres libellés personnalisés grâce à deux attributs :
Attribut | Rôle |
---|---|
data-label-light |
Libellé lorsque le thème actif est sombre et que le bouton permet d’activer le mode clair |
data-label-dark |
Libellé lorsque le thème actif est clair et que le bouton permet d’activer le mode sombre |
<browserux-theme-switcher
data-label-light="Activer le thème clair"
data-label-dark="Passer en mode sombre"
></browserux-theme-switcher>
Résultat :
aria-label="Passer en mode sombre"
aria-label="Activer le thème clair"
Ces attributs sont prioritaires sur la détection automatique de langue (`lang`).
no-shadow
)Par défaut, le composant browserux-theme-switcher
utilise le Shadow DOM pour encapsuler son HTML et son CSS.
Cela garantit que ses styles internes ne perturbent pas ceux de la page, et inversement.
Mais dans certains cas, notamment pour appliquer des styles globaux ou pour des contraintes spécifiques de framework, il peut être utile de désactiver cette encapsulation.
no-shadow
boolean
(présence seule)
<browserux-theme-switcher no-shadow></browserux-theme-switcher>
Ce composant :
Attention : sans Shadow DOM, le composant est plus sensible aux conflits de styles globaux. À utiliser avec précaution dans les grandes applications.
style
)
Le composant browserux-theme-switcher
expose plusieurs variables CSS personnalisables
permettant de modifier son apparence sans avoir à surcharger son style interne.
Variable | Default | Description |
---|---|---|
--bux-switch-width | 40px |
Largeur du bouton toggle |
--bux-switch-height | 24px |
Hauteur du bouton toggle |
--bux-switch-bg-color | #888 |
Couleur de fond du switch |
--bux-switch-thumb-color | #fff |
Couleur du thumb |
--bux-switch-emoji-size | inherit |
Taille des icônes emoji |
<browserux-theme-switcher
style="
--bux-switch-width: 60px;
--bux-switch-height: 32px;
--bux-switch-bg-color: #222;
--bux-switch-thumb-color: orange;
--bux-switch-emoji-size: 1.5rem;"
></browserux-theme-switcher>
[data-theme="dark"]
) ou les breakpoints (media queries).Shadow DOM
est activé, grâce à l’usage des CSS custom properties
.theme-change
)
Le composant browserux-theme-switcher
déclenche un événement personnalisé nommé
theme-change
à chaque changement de thème (suite à un clic utilisateur,
un chargement initial avec localStorage
, etc.).
Cet événement permet à votre application de réagir dynamiquement aux changements de thème (mise à jour du layout, analytics, etc.).
theme-change
CustomEvent
dont e.detail.theme
contient la nouvelle valeur de thème ("light
" ou "dark
").
const switcher = document.querySelector('browserux-theme-switcher');
switcher?.addEventListener('theme-change', (e) => {
console.log('Thème sélectionné :', e.detail.theme);
});
body
L’événement est disponible dès l'initialisation du composant et fonctionne dans tous les contextes (framework ou HTML pur).
light-icon
/ dark-icon
)
Le composant browserux-theme-switcher
permet de personnaliser l’apparence de son bouton en
remplaçant les icônes par défaut grâce à l’usage des slots HTML.
Slot | Affiché quand le thème est... | Exemple d’usage |
---|---|---|
light-icon |
actif = sombre (icône du mode clair à activer) | ☀️, soleil, light.svg |
dark-icon |
actif = clair (icône du mode sombre à activer) | 🌙, lune, moon.svg |
<browserux-theme-switcher>
<span slot="light-icon">🔆</span>
<span slot="dark-icon">🌑</span>
</browserux-theme-switcher>
Ou avec des images :
<browserux-theme-switcher>
<img slot="light-icon" src="sun.svg" width="20" height="20" alt="Theme clair">
<img slot="dark-icon" src="moon.svg" width="20" height="20" alt="Theme sombre">
</browserux-theme-switcher>
Si aucun slot n’est fourni, des icônes par défaut sont utilisées (☀️ / 🌙).
npm install
npm run build
Utilisez TypeScript + Rollup pour build :
dist/browserux-theme-switcher.esm.js
dist/browserux-theme-switcher.umd.js
dist/browserux-theme-switcher.d.ts
Licence MIT, Libre d’utilisation, de modification et de distribution.