mirror of
https://github.com/imfing/hextra.git
synced 2025-08-23 14:26:38 -04:00

* feat: add 'system' inside the theme toggle * chore: generate hugo_stats.json * fix: missing css * chore: reorganize code * feat: menu * chore: simplify * chore: some i18n * review * fix: remove replace
53 lines
1.8 KiB
JavaScript
53 lines
1.8 KiB
JavaScript
(function () {
|
|
const languageSwitchers = document.querySelectorAll('.hextra-language-switcher');
|
|
languageSwitchers.forEach((switcher) => {
|
|
switcher.addEventListener('click', (e) => {
|
|
e.preventDefault();
|
|
|
|
switcher.dataset.state = switcher.dataset.state === 'open' ? 'closed' : 'open';
|
|
|
|
const optionsElement = switcher.nextElementSibling;
|
|
|
|
optionsElement.classList.toggle('hx:hidden');
|
|
|
|
// Calculate the position of a language options element.
|
|
const switcherRect = switcher.getBoundingClientRect();
|
|
|
|
// Must be called before optionsElement.clientWidth.
|
|
optionsElement.style.minWidth = `${Math.max(switcherRect.width, 50)}px`;
|
|
|
|
const isOnTop = switcher.dataset.location === 'top';
|
|
const isRTL = document.body.dir === 'rtl'
|
|
|
|
// Stuck on the left side of the switcher.
|
|
let translateX = switcherRect.left;
|
|
|
|
if (isOnTop && !isRTL || !isOnTop && isRTL) {
|
|
// Stuck on the right side of the switcher.
|
|
translateX = switcherRect.right - optionsElement.clientWidth;
|
|
}
|
|
|
|
// Stuck on the top of the switcher.
|
|
let translateY = switcherRect.top - window.innerHeight - 15;
|
|
|
|
if (isOnTop) {
|
|
// Stuck on the bottom of the switcher.
|
|
translateY = switcherRect.top - window.innerHeight + 180;
|
|
}
|
|
|
|
optionsElement.style.transform = `translate3d(${translateX}px, ${translateY}px, 0)`;
|
|
});
|
|
});
|
|
|
|
// Dismiss language switcher when clicking outside
|
|
document.addEventListener('click', (e) => {
|
|
if (e.target.closest('.hextra-language-switcher') === null) {
|
|
languageSwitchers.forEach((switcher) => {
|
|
switcher.dataset.state = 'closed';
|
|
const optionsElement = switcher.nextElementSibling;
|
|
optionsElement.classList.add('hx:hidden');
|
|
});
|
|
}
|
|
});
|
|
})();
|