diff --git a/astro.config.mjs b/astro.config.mjs index 23a41a2..820afde 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,6 +1,7 @@ import { defineConfig } from 'astro/config'; import tailwind from '@astrojs/tailwind'; import node from '@astrojs/node'; +import preact from "@astrojs/preact"; export default defineConfig({ output: 'server', @@ -12,6 +13,7 @@ export default defineConfig({ port: parseInt(process.env.PORT || '4321'), }, integrations: [ + preact(), tailwind({ applyBaseStyles: true }) diff --git a/package.json b/package.json index d40fb73..982c1a6 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,11 @@ }, "dependencies": { "@astrojs/node": "^9.5.1", + "@astrojs/preact": "^4.1.3", + "@preact/signals": "^2.5.1", "astro": "^5.16.0", - "js-yaml": "^4.1.0" + "js-yaml": "^4.1.0", + "preact": "^10.27.2" }, "devDependencies": { "@astrojs/tailwind": "^5.0.0", diff --git a/src/islands/ThemeToggle.jsx b/src/islands/ThemeToggle.jsx new file mode 100644 index 0000000..62718f4 --- /dev/null +++ b/src/islands/ThemeToggle.jsx @@ -0,0 +1,42 @@ +import { useEffect, useState } from "preact/hooks"; + +export default function ThemeToggle() { + const [isDark, setIsDark] = useState(false); + const [mounted, setMounted] = useState(false); + + useEffect(() => { + // unikamy SSR, działamy dopiero po stronie klienta + if (typeof window === "undefined") return; + + const saved = localStorage.getItem("theme"); + const systemPrefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + + const dark = saved === "dark" || (!saved && systemPrefersDark); + + setIsDark(dark); + document.documentElement.classList.toggle("dark", dark); + + setMounted(true); + }, []); + + const toggleTheme = () => { + const newDark = !isDark; + setIsDark(newDark); + + document.documentElement.classList.toggle("dark", newDark); + localStorage.setItem("theme", newDark ? "dark" : "light"); + }; + + if (!mounted) return null; + + return ( + + ); +} diff --git a/src/layouts/DefaultLayout.astro b/src/layouts/DefaultLayout.astro index d3c1719..6ef7b7e 100644 --- a/src/layouts/DefaultLayout.astro +++ b/src/layouts/DefaultLayout.astro @@ -3,6 +3,8 @@ import "../styles/base.css"; import BaseHead from "./BaseHead.astro"; import Header from "../components/layout/Header.astro"; import Footer from "../components/layout/Footer.astro"; +import ThemeToggle from "../islands/ThemeToggle.jsx"; + const { seo } = Astro.props; --- @@ -18,5 +20,9 @@ const { seo } = Astro.props;