fix: disable CSS transitions during dark/light theme toggle

Add a `[data-no-transitions]` CSS rule that suppresses all transitions.
The theme toggle in all three dev targets (hiccup, replicant, squint)
sets this attribute before switching, then removes it on the next
animation frame, preventing the jarring animated color shift.
This commit is contained in:
Florian Schroedl
2026-03-05 13:16:07 +01:00
parent cd49da661d
commit 425d00529e
5 changed files with 16 additions and 4 deletions

View File

@@ -362,7 +362,7 @@
(sidebar/sidebar-menu {} (sidebar/sidebar-menu {}
(sidebar/sidebar-menu-item (sidebar/sidebar-menu-item
{:icon-name :sun {:icon-name :sun
:attrs {:onclick "document.documentElement.dataset.theme = document.documentElement.dataset.theme === 'dark' ? 'light' : 'dark'"}} :attrs {:onclick "document.documentElement.dataset.noTransitions = ''; document.documentElement.dataset.theme = document.documentElement.dataset.theme === 'dark' ? 'light' : 'dark'; requestAnimationFrame(() => { delete document.documentElement.dataset.noTransitions; })"}}
"Toggle Dark Mode")))) "Toggle Dark Mode"))))
(sidebar/sidebar-footer {} (sidebar/sidebar-footer {}
(sidebar/sidebar-user {:user-name "Dev Mode" :email (str "hiccup · port " own-port) :avatar "bb"})))) (sidebar/sidebar-user {:user-name "Dev Mode" :email (str "hiccup · port " own-port) :avatar "bb"}))))

View File

@@ -338,8 +338,11 @@
(defn toggle-theme! [_e] (defn toggle-theme! [_e]
(let [el (.-documentElement js/document) (let [el (.-documentElement js/document)
current (.. el -dataset -theme)] current (.. el -dataset -theme)]
(set! (.. el -dataset -noTransitions) "")
(set! (.. el -dataset -theme) (set! (.. el -dataset -theme)
(if (= current "dark") "light" "dark")))) (if (= current "dark") "light" "dark"))
(js/requestAnimationFrame
#(js-delete (.-dataset el) "noTransitions"))))
;; ── App Shell ─────────────────────────────────────────────────────── ;; ── App Shell ───────────────────────────────────────────────────────

View File

@@ -27,8 +27,11 @@
(defn toggle-theme! [_e] (defn toggle-theme! [_e]
(let [el (.-documentElement js/document) (let [el (.-documentElement js/document)
current (.. el -dataset -theme)] current (.. el -dataset -theme)]
(set! (.. el -dataset -noTransitions) "")
(set! (.. el -dataset -theme) (set! (.. el -dataset -theme)
(if (= current "dark") "light" "dark")))) (if (= current "dark") "light" "dark"))
(js/requestAnimationFrame
#(js-delete (.-dataset el) "noTransitions"))))
(defn section [title & children] (defn section [title & children]
[:section {:style {"margin-bottom" "2.5rem"}} [:section {:style {"margin-bottom" "2.5rem"}}

View File

@@ -74,6 +74,12 @@
:focus:not(:focus-visible) { :focus:not(:focus-visible) {
outline: none; outline: none;
box-shadow: none; box-shadow: none;
}
[data-no-transitions] *,
[data-no-transitions] *::before,
[data-no-transitions] *::after {
transition: none !important;
}") }")
(defn collect-component-css (defn collect-component-css

View File

@@ -6,7 +6,7 @@
max-height: 85vh; max-height: 85vh;
margin: auto; margin: auto;
padding: 0; padding: 0;
background: var(--bg-1); background: var(--bg-0);
color: var(--fg-0); color: var(--fg-0);
border: var(--border-0); border: var(--border-0);
border-radius: var(--radius-lg); border-radius: var(--radius-lg);