Files
Edu/apps/teacher-portal/src/app/layout.tsx
SpecialX 0b42302a64 docs(admin-portal): 新增 nextstep-v2.md 记录下游核查结果
v1 声称完成的下游工作经核查实际未完成:
- api-gateway: /api/admin/graphql 路由未注册,go vet 编译失败
- teacher-bff: resolver 已完成但 schema 未同步(命名空间 vs 扁平)
- iam: proto 缺 BatchGetUsers rpc 声明

v2 记录详细核查证据和修复要求
2026-07-14 08:26:27 +08:00

70 lines
1.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import "./globals.css";
import type { Metadata } from "next";
import { Inter, Fraunces, JetBrains_Mono } from "next/font/google";
import { NextIntlClientProvider } from "next-intl";
import { getLocale, getMessages } from "next-intl/server";
import { GraphQLProvider } from "./providers";
import { ErrorBoundary } from "@edu/ui-components";
import { ObservabilityProvider } from "@/components/observability-provider";
import { PerformanceDashboard } from "@/components/performance-dashboard";
/**
* 字体加载next/font/google self-host
*
* 通过 CSS 变量暴露字体族,业务代码用 var(--font-family-sans/serif/mono)
* 禁止字体名字面量project_rules §3.10
*
* 03-long-term-architecture.md §3.5 字体加载策略:
* - font-display: swapFOUT优先文本可见性
* - 首屏字体 preload次屏 lazy
*/
const inter = Inter({
subsets: ["latin"],
variable: "--font-inter",
display: "swap",
});
const fraunces = Fraunces({
subsets: ["latin"],
variable: "--font-fraunces",
display: "swap",
});
const mono = JetBrains_Mono({
subsets: ["latin"],
variable: "--font-jetbrains-mono",
display: "swap",
});
export const metadata: Metadata = {
title: "Edu Teacher Portal",
description: "K12 智慧教务平台 - 教师端",
};
export default async function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const locale = await getLocale();
const messages = await getMessages();
return (
<html
lang={locale}
className={`${inter.variable} ${fraunces.variable} ${mono.variable}`}
>
<body>
<NextIntlClientProvider locale={locale} messages={messages}>
<ObservabilityProvider>
<ErrorBoundary>
<GraphQLProvider>{children}</GraphQLProvider>
</ErrorBoundary>
</ObservabilityProvider>
<PerformanceDashboard />
</NextIntlClientProvider>
</body>
</html>
);
}