Uses Tailwind v4 class-based dark mode with a Stimulus controller for toggling. Respects prefers-color-scheme as default, prevents FOUC with an inline script, and persists the user's choice in localStorage. All views updated with dark: variants for backgrounds, text, borders, badges, buttons, and form inputs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
28 lines
689 B
JavaScript
28 lines
689 B
JavaScript
import { Controller } from "@hotwired/stimulus"
|
|
|
|
export default class extends Controller {
|
|
static targets = ["icon"]
|
|
|
|
connect() {
|
|
this.updateIcon()
|
|
}
|
|
|
|
toggle() {
|
|
document.documentElement.classList.toggle("dark")
|
|
const isDark = document.documentElement.classList.contains("dark")
|
|
localStorage.setItem("theme", isDark ? "dark" : "light")
|
|
this.updateIcon()
|
|
}
|
|
|
|
updateIcon() {
|
|
const isDark = document.documentElement.classList.contains("dark")
|
|
this.iconTargets.forEach(icon => {
|
|
if (icon.dataset.mode === "dark") {
|
|
icon.classList.toggle("hidden", !isDark)
|
|
} else {
|
|
icon.classList.toggle("hidden", isDark)
|
|
}
|
|
})
|
|
}
|
|
}
|