diff --git a/priceybot2/sass/dark-mode.scss b/priceybot2/sass/dark-mode.scss index 3f64502..577c59f 100644 --- a/priceybot2/sass/dark-mode.scss +++ b/priceybot2/sass/dark-mode.scss @@ -21,15 +21,19 @@ transform: scale(0.75); color: hsl(40, 100%, 50%); box-shadow: - inset 0 0 0 var(--size), - calc(var(--offset-orthogonal) * -1) 0 0 var(--ray-size), - var(--offset-orthogonal) 0 0 var(--ray-size), - 0 calc(var(--offset-orthogonal) * -1) 0 var(--ray-size), - 0 var(--offset-orthogonal) 0 var(--ray-size), - calc(var(--offset-diagonal) * -1) calc(var(--offset-diagonal) * -1) 0 var(--ray-size), - var(--offset-diagonal) var(--offset-diagonal) 0 var(--ray-size), - calc(var(--offset-diagonal) * -1) var(--offset-diagonal) 0 var(--ray-size), - var(--offset-diagonal) calc(var(--offset-diagonal) * -1) 0 var(--ray-size), + inset 0 0 0 var(--size), + calc(var(--offset-orthogonal) * -1) 0 0 var(--ray-size), + var(--offset-orthogonal) 0 0 var(--ray-size), + 0 calc(var(--offset-orthogonal) * -1) 0 var(--ray-size), + 0 var(--offset-orthogonal) 0 var(--ray-size), + calc(var(--offset-diagonal) * -1) calc(var(--offset-diagonal) * -1) 0 var(--ray-size), + var(--offset-diagonal) var(--offset-diagonal) 0 var(--ray-size), + calc(var(--offset-diagonal) * -1) var(--offset-diagonal) 0 var(--ray-size), + var(--offset-diagonal) calc(var(--offset-diagonal) * -1) 0 var(--ray-size), ; } +} + +.dark-toggle-animation { + transition: background 500ms; } \ No newline at end of file diff --git a/priceybot2/static/css/main.css b/priceybot2/static/css/main.css index 2793353..310ae82 100644 --- a/priceybot2/static/css/main.css +++ b/priceybot2/static/css/main.css @@ -17,6 +17,9 @@ color: #ffaa00; box-shadow: inset 0 0 0 var(--size), calc(var(--offset-orthogonal) * -1) 0 0 var(--ray-size), var(--offset-orthogonal) 0 0 var(--ray-size), 0 calc(var(--offset-orthogonal) * -1) 0 var(--ray-size), 0 var(--offset-orthogonal) 0 var(--ray-size), calc(var(--offset-diagonal) * -1) calc(var(--offset-diagonal) * -1) 0 var(--ray-size), var(--offset-diagonal) var(--offset-diagonal) 0 var(--ray-size), calc(var(--offset-diagonal) * -1) var(--offset-diagonal) 0 var(--ray-size), var(--offset-diagonal) calc(var(--offset-diagonal) * -1) 0 var(--ray-size); } +.dark-toggle-animation { + transition: background 500ms; } + /*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */ /* Bulma Utilities */ .button, .input, .textarea, .select select, .file-cta, diff --git a/priceybot2/static/scripts/dark-mode.js b/priceybot2/static/scripts/dark-mode.js new file mode 100644 index 0000000..65a235a --- /dev/null +++ b/priceybot2/static/scripts/dark-mode.js @@ -0,0 +1,72 @@ +// Set theme on load. +function init() { + // Default to light theme. + let theme = 'light' + + // Check media query prefer and set it as dark. + if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) { + theme = 'dark'; + } + + // Add event handler so if they change media query it'll update. overkill? yes. + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => { + let theme = event.matches ? "dark" : "light"; + + applyTheme(theme); + }); + + // If they have manually changed it use that theme instead. + theme = localStorage.getItem("theme") ?? theme + + // Set it on body. + document.body.dataset.theme = theme; + + // If dark-mode was toggle above we need to fix the icon. + let toggle = document.getElementsByName("dark-mode-toggle")[0]; + + // if it's already dark check it. + toggle.checked = theme === 'dark'; + + applyTheme(theme); +} + +// Toggle the theme. +function darkLight() { + // Get current theme. + let element = document.body; + + // Invert it. + switch (element.dataset.theme) { + case "light": + element.dataset.theme = "dark"; + break; + case "dark": + element.dataset.theme = "light"; + break; + } + localStorage.setItem("theme", element.dataset.theme); + + applyTheme(element.dataset.theme); +} + +// Apply theme +function applyTheme(theme) { + let primaryElements + // Find elements and update class. + switch (theme) { + case 'dark': + primaryElements = Array.from(document.querySelectorAll('.is-primary-invert')); + primaryElements.forEach((element) => { + element.classList.remove('is-primary-invert'); + element.classList.add('is-primary'); + }); + break; + case 'light': + primaryElements = Array.from(document.querySelectorAll('.is-primary')); + primaryElements.forEach((element) => { + element.classList.remove('is-primary'); + element.classList.add('is-primary-invert'); + }); + break; + } +} \ No newline at end of file diff --git a/priceybot2/templates/base.html b/priceybot2/templates/base.html index b7dcb82..9a960b2 100644 --- a/priceybot2/templates/base.html +++ b/priceybot2/templates/base.html @@ -1,16 +1,16 @@ -
-