diff --git a/assets/controllers/dark_theme_controller.js b/assets/controllers/dark_theme_controller.js new file mode 100644 index 000000000..e19b364ea --- /dev/null +++ b/assets/controllers/dark_theme_controller.js @@ -0,0 +1,39 @@ +import { Controller } from '@hotwired/stimulus'; + +export default class extends Controller { + connect() { + this.#choose(); + + this.mql = window.matchMedia('(prefers-color-scheme: dark)'); + this.mql.addEventListener('change', this.#choose.bind(this)); + } + + useLight() { + this.element.classList.remove('dark-theme'); + document.cookie = 'theme=light;samesite=Lax;path=/;max-age=31536000'; + } + + useDark() { + this.element.classList.add('dark-theme'); + document.cookie = 'theme=dark;samesite=Lax;path=/;max-age=31536000'; + } + + useAuto() { + document.cookie = 'theme=auto;samesite=Lax;path=/;max-age=0'; + this.#choose(); + } + + #choose() { + const themeCookieExists = document.cookie.split(';').some((cookie) => cookie.trim().startsWith('theme=')); + + if (themeCookieExists) { + return; + } + + if (this.mql.matches) { + this.element.classList.add('dark-theme'); + } else { + this.element.classList.remove('dark-theme'); + } + } +} diff --git a/assets/index.js b/assets/index.js index a87fdb7ef..706667eec 100755 --- a/assets/index.js +++ b/assets/index.js @@ -1,7 +1,5 @@ import './bootstrap'; -import $ from 'jquery'; - /* Materialize imports */ import '@materializecss/materialize/dist/css/materialize.css'; import '@materializecss/materialize/dist/js/materialize'; @@ -23,108 +21,3 @@ import './js/shortcuts/entry'; /* Theme style */ import './scss/index.scss'; - -(function darkTheme() { - const rootEl = document.querySelector('html'); - const themeDom = { - darkClass: 'dark-theme', - - toggleClass(el) { - return el.classList.toggle(this.darkClass); - }, - - addClass(el) { - return el.classList.add(this.darkClass); - }, - - removeClass(el) { - return el.classList.remove(this.darkClass); - }, - }; - const themeCookie = { - values: { - light: 'light', - dark: 'dark', - }, - - name: 'theme', - - getValue(isDarkTheme) { - return isDarkTheme ? this.values.dark : this.values.light; - }, - - setCookie(isDarkTheme) { - const value = this.getValue(isDarkTheme); - document.cookie = `${this.name}=${value};samesite=Lax;path=/;max-age=31536000`; - }, - - removeCookie() { - document.cookie = `${this.name}=auto;samesite=Lax;path=/;max-age=0`; - }, - - exists() { - return document.cookie.split(';').some((cookie) => cookie.trim().startsWith(`${this.name}=`)); - }, - }; - const preferedColorScheme = { - choose() { - const themeCookieExists = themeCookie.exists(); - if (this.isAvailable() && !themeCookieExists) { - const isPreferedColorSchemeDark = window.matchMedia('(prefers-color-scheme: dark)').matches === true; - if (!themeCookieExists) { - themeDom[isPreferedColorSchemeDark ? 'addClass' : 'removeClass'](rootEl); - } - } - }, - - isAvailable() { - return typeof window.matchMedia === 'function'; - }, - - init() { - if (!this.isAvailable()) { - return false; - } - this.choose(); - window.matchMedia('(prefers-color-scheme: dark)').addListener(() => { - this.choose(); - }); - return true; - }, - }; - - const addDarkThemeListeners = () => { - $(document).ready(() => { - const lightThemeButtons = document.querySelectorAll('.js-theme-toggle[data-theme="light"]'); - [...lightThemeButtons].map((lightThemeButton) => { - lightThemeButton.addEventListener('click', (e) => { - e.preventDefault(); - themeDom.removeClass(rootEl); - themeCookie.setCookie(false); - }); - return true; - }); - const darkThemeButtons = document.querySelectorAll('.js-theme-toggle[data-theme="dark"]'); - [...darkThemeButtons].map((darkThemeButton) => { - darkThemeButton.addEventListener('click', (e) => { - e.preventDefault(); - themeDom.addClass(rootEl); - themeCookie.setCookie(true); - }); - return true; - }); - const autoThemeButtons = document.querySelectorAll('.js-theme-toggle[data-theme="auto"]'); - [...autoThemeButtons].map((autoThemeButton) => { - autoThemeButton.addEventListener('click', (e) => { - e.preventDefault(); - themeCookie.removeCookie(); - preferedColorScheme.choose(); - }); - return true; - }); - }); - }; - - preferedColorScheme.init(); - addDarkThemeListeners(); -}()); diff --git a/templates/Entry/entry.html.twig b/templates/Entry/entry.html.twig index 189e4c336..b1c969097 100644 --- a/templates/Entry/entry.html.twig +++ b/templates/Entry/entry.html.twig @@ -119,19 +119,19 @@