- globals.css: split theme tokens into :root (light default) + .dark overrides; switch @theme inline → @theme so utilities reference var(--color-*) and a runtime class swap actually re-skins the UI (inline inlines literal values and ignores .dark overrides) - layout.tsx: drop the beforeInteractive inline theme script (it caused hydration instability); theme is applied client-side only - top-nav: apply persisted theme on mount, default light, toggle updates <html> class + localStorage - glass-intense: light variant (white card on light canvas); chart grid line uses var(--color-border); attachment chip uses bg-glass-bg - Verified in static export: toggle dark↔light both directions, chatbot panel renders clean in both themes
39 lines
947 B
TypeScript
39 lines
947 B
TypeScript
import type { Metadata } from "next";
|
|
import { Inter, JetBrains_Mono } from "next/font/google";
|
|
import { Toaster } from "@/components/ui/sonner";
|
|
import "./globals.css";
|
|
|
|
const inter = Inter({
|
|
subsets: ["latin"],
|
|
variable: "--font-inter",
|
|
});
|
|
|
|
const jetbrainsMono = JetBrains_Mono({
|
|
subsets: ["latin"],
|
|
variable: "--font-jetbrains-mono",
|
|
});
|
|
|
|
export const metadata: Metadata = {
|
|
title: "Discord Automod — Moderation Dashboard",
|
|
description: "AI-powered Discord moderation and voice monitoring dashboard",
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode;
|
|
}>) {
|
|
return (
|
|
<html
|
|
lang="en"
|
|
className={`${inter.variable} ${jetbrainsMono.variable} h-full antialiased`}
|
|
suppressHydrationWarning
|
|
>
|
|
<body className="min-h-full flex flex-col">
|
|
{children}
|
|
<Toaster position="bottom-right" richColors closeButton />
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|