- Dark mode: class-based theme toggle with localStorage persistence and flash prevention - Trade History (/trades): paginated table, stats cards, equity curve chart with DB API endpoints - Backtest Viewer (/backtests): log parser for 35 backtest results, sidebar + detail + comparison tabs - Model Insights: dashboard card + dialog showing feature importance, regime distribution, training history - Alert/Signal Log (/alerts): signal stats, filterable table with execution tracking - API: 8 new endpoints with psycopg2 DB connection pool - Dark mode sweep across books page, about dialog, and all dashboard components - Architecture docs rewritten with Mermaid diagrams (23 docs) - README and FEATURES.md rewritten bilingual (Indonesian + English) - main_live.py: write model_metrics.json on startup and retrain Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
54 lines
1.3 KiB
TypeScript
54 lines
1.3 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { IBM_Plex_Sans, IBM_Plex_Mono } from "next/font/google";
|
|
import "./globals.css";
|
|
|
|
const ibmPlexSans = IBM_Plex_Sans({
|
|
subsets: ["latin"],
|
|
weight: ["400", "500", "600", "700"],
|
|
variable: "--font-ibm-plex-sans",
|
|
display: "swap",
|
|
});
|
|
|
|
const ibmPlexMono = IBM_Plex_Mono({
|
|
subsets: ["latin"],
|
|
weight: ["400", "700"],
|
|
variable: "--font-ibm-plex-mono",
|
|
display: "swap",
|
|
});
|
|
|
|
export const metadata: Metadata = {
|
|
title: "XAUBOT AI — Trading Monitor",
|
|
description: "Real-time monitoring dashboard for XAUBOT AI Trading Bot",
|
|
};
|
|
|
|
// Inline script to prevent flash of wrong theme
|
|
const themeScript = `
|
|
(function() {
|
|
try {
|
|
var t = localStorage.getItem('theme');
|
|
if (t === 'dark' || (!t && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
|
|
document.documentElement.classList.add('dark');
|
|
}
|
|
} catch(e) {}
|
|
})();
|
|
`;
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode;
|
|
}>) {
|
|
return (
|
|
<html lang="en" suppressHydrationWarning>
|
|
<head>
|
|
<script dangerouslySetInnerHTML={{ __html: themeScript }} />
|
|
</head>
|
|
<body
|
|
className={`${ibmPlexSans.variable} ${ibmPlexMono.variable} antialiased bg-background text-foreground`}
|
|
>
|
|
{children}
|
|
</body>
|
|
</html>
|
|
);
|
|
}
|