From c8c550a00b19a70e230eaa55e04ed997dea98ffe Mon Sep 17 00:00:00 2001 From: Richard Bergsma Date: Fri, 8 Aug 2025 23:26:13 +0200 Subject: [PATCH] feat: site-wide dark mode (Tailwind class strategy); ThemeToggle island in header; persist preference; adjust brand-surface for dark --- src/components/ThemeToggle.jsx | 42 ++++++++++++++++++++++++++++++++++ src/layouts/BaseLayout.astro | 6 ++++- src/styles/global.css | 5 ++++ src/styles/main.css | 5 ++++ tailwind.config.js | 1 + 5 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 src/components/ThemeToggle.jsx diff --git a/src/components/ThemeToggle.jsx b/src/components/ThemeToggle.jsx new file mode 100644 index 0000000..8f09305 --- /dev/null +++ b/src/components/ThemeToggle.jsx @@ -0,0 +1,42 @@ +import { useEffect, useState } from 'react'; + +export default function ThemeToggle() { + const [isDark, setIsDark] = useState(false); + + useEffect(() => { + const stored = localStorage.getItem('omoluabi_theme'); + const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + const initial = stored ? stored === 'dark' : prefersDark; + setIsDark(initial); + document.documentElement.classList.toggle('dark', initial); + }, []); + + const toggle = () => { + const next = !isDark; + setIsDark(next); + document.documentElement.classList.toggle('dark', next); + localStorage.setItem('omoluabi_theme', next ? 'dark' : 'light'); + }; + + return ( + + ); +} + + diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index 5937543..ef14f34 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -2,6 +2,7 @@ // src/layouts/BaseLayout.astro import '../styles/global.css'; import '../styles/main.css'; +import ThemeToggle from '../components/ThemeToggle.jsx'; export interface Props { title?: string; @@ -55,8 +56,11 @@ const { title = "Omoluabi Association Netherlands", description = "Preserving Ni Contact - +