File name
Commit message
Commit date
File name
Commit message
Commit date
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import { ViewTransition } from "react";
import { FeedbackHost } from "@/app/_components/feedback-host";
import { FeedbackProvider } from "@/app/_components/feedback-provider";
import "./globals.css";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
// 관리자 사이트 전체(로그인 포함)의 검색엔진 색인을 차단한다 — 하위 라우트는 별도 설정이
// 없는 한 이 값을 그대로 상속한다. robots.txt(app/robots.ts), next.config.ts의
// X-Robots-Tag 헤더와 함께 SEO 차단 3층 구조를 이룬다.
export const metadata: Metadata = {
title: "에듀페이 관리자",
robots: {
index: false,
follow: false,
nocache: true,
googleBot: {
index: false,
follow: false,
noimageindex: true,
"max-image-preview": "none",
"max-snippet": 0,
"max-video-preview": 0,
},
},
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html
lang="ko"
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
>
<body className="min-h-full flex flex-col">
<FeedbackProvider>
{/* 라우트 그룹 간 이동을 포함한 모든 전환에 크로스페이드를 적용한다. 클래스명(layout-transition)에
대한 `::view-transition-old/new` 규칙은 design 레인이 app/globals.css에 제공한다 — 합류
전에는 브라우저 기본 크로스페이드로 동작한다. */}
<ViewTransition default="layout-transition">{children}</ViewTransition>
{/* 피드백 오버레이는 전환 크로스페이드 대상이 아니므로 ViewTransition 바깥에 둔다. */}
<FeedbackHost />
</FeedbackProvider>
</body>
</html>
);
}