diff --git a/.gitignore b/.gitignore index 754490c..ef20aea 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ eggs/ lib/ !src/newsreader/scss/lib +!src/newsreader/js/lib lib64/ parts/ diff --git a/src/newsreader/js/index.js b/src/newsreader/js/index.js index 1ed14ed..ccb9553 100644 --- a/src/newsreader/js/index.js +++ b/src/newsreader/js/index.js @@ -1,3 +1,4 @@ +import './lib/index.js'; import './pages/homepage/index.js'; import './pages/categories/index.js'; import './pages/rules/index.js'; diff --git a/src/newsreader/js/lib/index.js b/src/newsreader/js/lib/index.js new file mode 100644 index 0000000..31b03f6 --- /dev/null +++ b/src/newsreader/js/lib/index.js @@ -0,0 +1 @@ +import './theme.js'; diff --git a/src/newsreader/js/lib/theme.js b/src/newsreader/js/lib/theme.js new file mode 100644 index 0000000..7ece9a3 --- /dev/null +++ b/src/newsreader/js/lib/theme.js @@ -0,0 +1,80 @@ +function isCSSVariablesSupported() { + return window.CSS && window.CSS.supports('color', 'var(--fake-color'); +} + +function changeTheme(e) { + const isDark = sessionStorage.getItem('t-dark') ? true : false; + + if (isDark) { + document.documentElement.classList.add('js-t-dark'); + } else { + document.documentElement.classList.remove('js-t-dark'); + } + + try { + console.log(`Setting storage to ${!isDark}`); + sessionStorage.setItem('t-dark', !isDark); + } catch (e) { + // do nothing. + } +} + +function prefersDarkTheme() { + try { + const currentPref = sessionStorage.getItem('t-dark'); + + if (currentPref === 'true') { + console.log('Current pref set'); + return true; + } else if ( + !currentPref && + window.matchMedia('(prefers-color-scheme: dark)').matches + ) { + console.log('Media query matches'); + return true; + } else { + console.log('Does not prefersDarkTheme'); + return false; + } + } catch (e) { + return false; + } +} + +function toggleDarkTheme(dark) { + if (dark) { + document.documentElement.classList.add('js-t-dark'); + } else { + document.documentElement.classList.remove('js-t-dark'); + } + + try { + sessionStorage.setItem('t-dark', dark); + } catch (e) { + // do nothing. + } +} + +function initThemeSelector() { + const themeButton = document.getElementsByClassName('theme-switcher')[0]; + const mqPrefersDarkTheme = window.matchMedia('(prefers-color-scheme: dark)'); + + if (prefersDarkTheme()) { + console.log('Prefers dark theme'); + toggleDarkTheme(true); + } + + themeButton.addEventListener('click', changeTheme); + + mqPrefersDarkTheme.addListener(mq => { + toggleDarkTheme(mq.matches); + }); +} + +function init() { + if (isCSSVariablesSupported()) { + initThemeSelector(); + } +} + +init(); diff --git a/src/newsreader/templates/base.html b/src/newsreader/templates/base.html index 57da011..66a80db 100644 --- a/src/newsreader/templates/base.html +++ b/src/newsreader/templates/base.html @@ -27,6 +27,8 @@ {% endif %} + + {% if messages %}