Last active
September 14, 2023 16:10
-
-
Save babeuloula/fefccf6e93a39aaa1caace459512038b to your computer and use it in GitHub Desktop.
Bootstrap color modes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- start theme selector --> | |
<div class="dropdown position-fixed bottom-0 end-0 mb-3 me-3 bd-mode-toggle" id="theme-switcher"> | |
<button class="btn btn-primary py-2 dropdown-toggle d-flex align-items-center" id="bd-theme" type="button" aria-expanded="false" data-bs-toggle="dropdown" aria-label="Toggle theme (auto)" spellcheck="false"> | |
<i class="bi bi-lightbulb"></i> | |
<span class="visually-hidden" id="bd-theme-text">Choix du thème</span> | |
</button> | |
<ul class="dropdown-menu dropdown-menu-end shadow" aria-labelledby="bd-theme-text" style=""> | |
<li> | |
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="light" aria-pressed="false" spellcheck="false"> | |
Thème clair | |
</button> | |
</li> | |
<li> | |
<button type="button" class="dropdown-item d-flex align-items-center" data-bs-theme-value="dark" aria-pressed="false" spellcheck="false"> | |
Thème sombre | |
</button> | |
</li> | |
<li> | |
<button type="button" class="dropdown-item d-flex align-items-center active" data-bs-theme-value="auto" aria-pressed="true" spellcheck="false"> | |
Automatique | |
</button> | |
</li> | |
</ul> | |
</div> | |
<!-- end theme selector --> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*! | |
* Color mode toggler for Bootstrap's docs (https://getbootstrap.com/) | |
* Copyright 2011-2023 The Bootstrap Authors | |
* Licensed under the Creative Commons Attribution 3.0 Unported License. | |
*/ | |
(() => { | |
'use strict' | |
const getStoredTheme = () => localStorage.getItem('theme') | |
const setStoredTheme = theme => localStorage.setItem('theme', theme) | |
const getPreferredTheme = () => { | |
const storedTheme = getStoredTheme() | |
if (storedTheme) { | |
return storedTheme | |
} | |
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' | |
} | |
const setTheme = theme => { | |
if (theme === 'auto' && window.matchMedia('(prefers-color-scheme: dark)').matches) { | |
document.documentElement.setAttribute('data-bs-theme', 'dark') | |
} else { | |
document.documentElement.setAttribute('data-bs-theme', theme) | |
} | |
} | |
setTheme(getPreferredTheme()) | |
const showActiveTheme = (theme, focus = false) => { | |
const themeSwitcher = document.querySelector('#bd-theme') | |
if (!themeSwitcher) { | |
return | |
} | |
const themeSwitcherText = document.querySelector('#bd-theme-text') | |
const activeThemeIcon = document.querySelector('.theme-icon-active use') | |
const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`) | |
document.querySelectorAll('[data-bs-theme-value]').forEach(element => { | |
element.classList.remove('active') | |
element.setAttribute('aria-pressed', 'false') | |
}) | |
btnToActive.classList.add('active') | |
btnToActive.setAttribute('aria-pressed', 'true') | |
const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})` | |
themeSwitcher.setAttribute('aria-label', themeSwitcherLabel) | |
if (focus) { | |
themeSwitcher.focus() | |
} | |
} | |
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => { | |
const storedTheme = getStoredTheme() | |
if (storedTheme !== 'light' && storedTheme !== 'dark') { | |
setTheme(getPreferredTheme()) | |
} | |
}) | |
window.addEventListener('DOMContentLoaded', () => { | |
showActiveTheme(getPreferredTheme()) | |
document.querySelectorAll('[data-bs-theme-value]') | |
.forEach(toggle => { | |
toggle.addEventListener('click', () => { | |
const theme = toggle.getAttribute('data-bs-theme-value') | |
setStoredTheme(theme) | |
setTheme(theme) | |
showActiveTheme(theme, true) | |
}) | |
}) | |
}) | |
})() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment