80 lines
2.6 KiB
TypeScript
80 lines
2.6 KiB
TypeScript
"use client";
|
|
|
|
import "tailwindcss/tailwind.css";
|
|
|
|
|
|
import Script from "next/script";
|
|
import React, { useEffect, useState } from "react";
|
|
import NightModeToggle from "@/components/NightModeToggle";
|
|
import Navbar from "@/components/NavigationBar";
|
|
import KofiWidget from "@/components/KofiWidget";
|
|
|
|
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
const [isDarkMode, setIsDarkMode] = useState(false);
|
|
|
|
useEffect(() => {
|
|
const savedTheme = localStorage.getItem("theme");
|
|
const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
|
|
const shouldEnableDark = savedTheme === "dark" || (!savedTheme && prefersDark);
|
|
setIsDarkMode(shouldEnableDark);
|
|
|
|
if (shouldEnableDark) {
|
|
document.documentElement.classList.add("dark");
|
|
} else {
|
|
document.documentElement.classList.remove("dark");
|
|
}
|
|
}, []);
|
|
|
|
const toggleDarkMode = () => {
|
|
const newTheme = isDarkMode ? "light" : "dark";
|
|
setIsDarkMode(!isDarkMode);
|
|
localStorage.setItem("theme", newTheme);
|
|
|
|
document.documentElement.classList.toggle("dark", !isDarkMode);
|
|
};
|
|
|
|
return (
|
|
<html lang="en" className={isDarkMode ? "dark" : ""} suppressHydrationWarning>
|
|
<head>
|
|
<script
|
|
dangerouslySetInnerHTML={{
|
|
__html: `
|
|
(function() {
|
|
const savedTheme = localStorage.getItem('theme');
|
|
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
if (savedTheme === 'dark' || (!savedTheme && prefersDark)) {
|
|
document.documentElement.classList.add('dark');
|
|
} else {
|
|
document.documentElement.classList.remove('dark');
|
|
}
|
|
})();
|
|
`,
|
|
}}
|
|
|
|
/>
|
|
<Script
|
|
src="https://www.googletagmanager.com/gtag/js?id=G-6SXB46RSDE"
|
|
strategy="afterInteractive"
|
|
/>
|
|
<Script id="google-analytics" strategy="afterInteractive">
|
|
{`
|
|
window.dataLayer = window.dataLayer || [];
|
|
function gtag(){dataLayer.push(arguments);}
|
|
gtag('js', new Date());
|
|
gtag('config', 'G-6SXB46RSDE');
|
|
`}
|
|
</Script>
|
|
</head>
|
|
<body className="bg-gray-100 dark:bg-gray-900 text-gray-900 dark:text-gray-100 min-h-screen">
|
|
<KofiWidget />
|
|
<Navbar />
|
|
<main className="relative">{children}</main>
|
|
<div className="fixed bottom-4 right-4">
|
|
<NightModeToggle isDarkMode={isDarkMode} toggleDarkMode={toggleDarkMode} />
|
|
</div>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|