44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import type React from "react"
|
|
import type { Metadata } from "next"
|
|
import { Inter } from "next/font/google"
|
|
import "./globals.css"
|
|
import { ThemeProvider } from "@/components/theme-provider"
|
|
import { Toaster } from "@/components/ui/toaster"
|
|
import { AuthProvider } from "@/context/auth-context"
|
|
import { CartProvider } from "@/context/cart-context"
|
|
import { NotificationProvider } from "@/components/notification-provider"
|
|
import { Analytics } from "@vercel/analytics/react"
|
|
import { Suspense } from "react"
|
|
|
|
const inter = Inter({ subsets: ["latin"] })
|
|
|
|
export const metadata: Metadata = {
|
|
title: "图书管理系统",
|
|
description: "一个现代化的图书管理系统",
|
|
}
|
|
|
|
export default function RootLayout({
|
|
children,
|
|
}: Readonly<{
|
|
children: React.ReactNode
|
|
}>) {
|
|
return (
|
|
<html lang="zh" suppressHydrationWarning>
|
|
<body className={inter.className}>
|
|
<ThemeProvider attribute="class" defaultTheme="system" enableSystem disableTransitionOnChange>
|
|
<AuthProvider>
|
|
<CartProvider>
|
|
<Suspense fallback={null}>
|
|
{children}
|
|
<Toaster />
|
|
<NotificationProvider />
|
|
<Analytics />
|
|
</Suspense>
|
|
</CartProvider>
|
|
</AuthProvider>
|
|
</ThemeProvider>
|
|
</body>
|
|
</html>
|
|
)
|
|
}
|