v1 声称完成的下游工作经核查实际未完成: - api-gateway: /api/admin/graphql 路由未注册,go vet 编译失败 - teacher-bff: resolver 已完成但 schema 未同步(命名空间 vs 扁平) - iam: proto 缺 BatchGetUsers rpc 声明 v2 记录详细核查证据和修复要求
70 lines
1.9 KiB
TypeScript
70 lines
1.9 KiB
TypeScript
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: swap(FOUT,优先文本可见性)
|
||
* - 首屏字体 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>
|
||
);
|
||
}
|