Next.js full-stack analytics dashboard for new-api. - Direct PostgreSQL readonly queries on logs table - 5 pages: Dashboard, Rankings, Aggregation, Logs, Detail - Dark/Light/System theme with CSS variables - Chinese/English i18n (default Chinese) - Recharts with dual Y-axis for input/output tokens - Lucide icons + Motion animations - Docker + docker-compose with external sinobridge network, port 8019
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { Outfit, JetBrains_Mono } from "next/font/google";
|
|
import "./globals.css";
|
|
import { ClientProviders } from "@/components/ClientProviders";
|
|
|
|
const outfit = Outfit({
|
|
variable: "--font-geist-sans",
|
|
subsets: ["latin"],
|
|
weight: ["300", "400", "500", "600", "700", "800"],
|
|
});
|
|
|
|
const jetbrains = JetBrains_Mono({
|
|
variable: "--font-geist-mono",
|
|
subsets: ["latin"],
|
|
weight: ["400", "500", "600"],
|
|
});
|
|
|
|
export const metadata: Metadata = {
|
|
title: "API Analytics — Neural Pulse",
|
|
description: "Real-time API usage analytics dashboard",
|
|
};
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode;
|
|
}>) {
|
|
return (
|
|
<html lang="zh" className={`${outfit.variable} ${jetbrains.variable} h-full antialiased dark`} suppressHydrationWarning>
|
|
<head>
|
|
<script dangerouslySetInnerHTML={{ __html: `
|
|
(function(){
|
|
var t=localStorage.getItem('theme')||'system';
|
|
var r=t==='system'?window.matchMedia('(prefers-color-scheme:dark)').matches?'dark':'light':t;
|
|
document.documentElement.classList.add(r);
|
|
document.documentElement.setAttribute('data-theme',r);
|
|
})();
|
|
`}} />
|
|
</head>
|
|
<body className="min-h-full">
|
|
<ClientProviders>{children}</ClientProviders>
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|