
6 changed files with 173 additions and 117 deletions
@ -1,80 +1,34 @@ |
|||||
/*! |
|
||||
* 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') { |
|
||||
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) |
|
||||
}) |
|
||||
}) |
|
||||
}) |
|
||||
})() |
|
||||
|
// 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