From 2d359fa23067a0eda489f21c16048c697399bd95 Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Wed, 10 Dec 2025 16:15:45 -0600 Subject: [PATCH] Clean-up styles and JS controller, use radios --- app/assets/stylesheets/theme-switcher.css | 15 +++----- .../controllers/theme_controller.js | 38 ++++--------------- app/views/users/_theme.html.erb | 15 +++++--- 3 files changed, 23 insertions(+), 45 deletions(-) diff --git a/app/assets/stylesheets/theme-switcher.css b/app/assets/stylesheets/theme-switcher.css index 8f25c31f9..4b3b1bae2 100644 --- a/app/assets/stylesheets/theme-switcher.css +++ b/app/assets/stylesheets/theme-switcher.css @@ -11,22 +11,19 @@ --btn-background: var(--color-ink-lightest); --btn-border-radius: 0.4em; --btn-border-size: 0; - --btn-gap: 0.3lh; + --btn-gap: 0.1lh; + --btn-padding: 1em; --icon-size: 2em; + column-gap: var(--inline-space); flex: 1; flex-direction: column; position: relative; white-space: nowrap; - &[aria-selected="true"] { - background-color: var(--color-selected); - - @media (any-hover: hover) { - &:hover { - background-color: var(--color-selected); - } - } + &:has(input:checked) { + --btn-background: var(--color-selected); + --btn-color: var(--color-ink); } @media (max-width: 479px) { diff --git a/app/javascript/controllers/theme_controller.js b/app/javascript/controllers/theme_controller.js index ce2d4695b..9c3c9841f 100644 --- a/app/javascript/controllers/theme_controller.js +++ b/app/javascript/controllers/theme_controller.js @@ -5,25 +5,18 @@ export default class extends Controller { connect() { this.#applyStoredTheme() - this.#updateButtons() } setLight() { this.#setTheme("light") - document.documentElement.setAttribute("data-theme", "light") - this.#updateButtons() } setDark() { this.#setTheme("dark") - document.documentElement.setAttribute("data-theme", "dark") - this.#updateButtons() } setAuto() { this.#setTheme("auto") - document.documentElement.removeAttribute("data-theme") - this.#updateButtons() } get #storedTheme() { @@ -32,36 +25,21 @@ export default class extends Controller { #setTheme(theme) { localStorage.setItem("theme", theme) + + theme === "auto" ? document.documentElement.removeAttribute("data-theme") : document.documentElement.setAttribute("data-theme", theme) + + this.#updateButtons() } #applyStoredTheme() { - const storedTheme = this.#storedTheme - - if (storedTheme === "light") { - document.documentElement.setAttribute("data-theme", "light") - } else if (storedTheme === "dark") { - document.documentElement.setAttribute("data-theme", "dark") - } else { - // auto - don't set data-theme, let CSS media query handle it - document.documentElement.removeAttribute("data-theme") - } + this.#setTheme(this.#storedTheme) } #updateButtons() { const storedTheme = this.#storedTheme - // Reset all buttons - if (this.hasLightBtnTarget) this.lightButtonTarget.removeAttribute("aria-selected") - if (this.hasDarkBtnTarget) this.darkButtonTarget.removeAttribute("aria-selected") - if (this.hasAutoBtnTarget) this.autoButtonTarget.removeAttribute("aria-selected") - - // Highlight active button - if (storedTheme === "light" && this.hasLightBtnTarget) { - this.lightButtonTarget.setAttribute("aria-selected", "true") - } else if (storedTheme === "dark" && this.hasDarkBtnTarget) { - this.darkButtonTarget.setAttribute("aria-selected", "true") - } else if (this.hasAutoBtnTarget) { - this.autoButtonTarget.setAttribute("aria-selected", "true") - } + if (this.lightButtonTarget) { this.lightButtonTarget.checked = (storedTheme === "light") } + if (this.darkButtonTarget) { this.darkButtonTarget.checked = (storedTheme === "dark") } + if (this.autoButtonTarget) { this.autoButtonTarget.checked = (storedTheme !== "light" && storedTheme !== "dark") } } } diff --git a/app/views/users/_theme.html.erb b/app/views/users/_theme.html.erb index 01d2c479e..0f7db9547 100644 --- a/app/views/users/_theme.html.erb +++ b/app/views/users/_theme.html.erb @@ -2,19 +2,22 @@ Appearance
- + + - + + - + +