
3 changed files with 152 additions and 3 deletions
@ -0,0 +1,80 @@ |
|||
/*! |
|||
* Color mode toggler for Bootstrap's docs (https://getbootstrap.com/)
|
|||
* Copyright 2011-2024 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') { |
|||
document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light')) |
|||
} 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}"]`) |
|||
const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href') |
|||
|
|||
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') |
|||
activeThemeIcon.setAttribute('href', svgOfActiveBtn) |
|||
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) |
|||
}) |
|||
}) |
|||
}) |
|||
})() |
@ -0,0 +1,33 @@ |
|||
// Funkce pro přepnutí tématu
|
|||
document.addEventListener('DOMContentLoaded', function () { |
|||
const themeToggle = document.getElementById('bd-theme'); |
|||
const themeButtons = document.querySelectorAll('[data-bs-theme-value]'); |
|||
const root = document.documentElement; |
|||
|
|||
// Nastavení aktuálního tématu
|
|||
function setTheme(theme) { |
|||
root.setAttribute('data-bs-theme', theme); |
|||
localStorage.setItem('theme', theme); // Uloží výběr do localStorage
|
|||
updateActiveButton(theme); |
|||
} |
|||
|
|||
// Aktualizace aktivního tlačítka
|
|||
function updateActiveButton(theme) { |
|||
themeButtons.forEach(button => { |
|||
const isActive = button.getAttribute('data-bs-theme-value') === theme; |
|||
button.setAttribute('aria-pressed', isActive); |
|||
}); |
|||
} |
|||
|
|||
// Načtení uloženého tématu (pokud existuje)
|
|||
const storedTheme = localStorage.getItem('theme') || 'auto'; |
|||
setTheme(storedTheme); |
|||
|
|||
// Přidání události pro kliknutí na tlačítka
|
|||
themeButtons.forEach(button => { |
|||
button.addEventListener('click', function () { |
|||
const theme = this.getAttribute('data-bs-theme-value'); |
|||
setTheme(theme); |
|||
}); |
|||
}); |
|||
}); |
Loading…
Reference in new issue