feat: initialize IoT Standards Lab website project with MAM skills & onboarding guide

This commit is contained in:
2026-07-29 23:43:59 +09:00
commit f3f53c1318
123 changed files with 19987 additions and 0 deletions
+68
View File
@@ -0,0 +1,68 @@
import type { Metadata } from "next";
import { Fraunces, Noto_Serif_KR, Inter } from "next/font/google";
import "./globals.css";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
/**
* CUSTOMIZATION HOOK — FONTS
* The editorial system pairs an English display serif (Fraunces) and a
* Korean serif (Noto Serif KR) for headlines, with a clean sans for body.
* Pretendard is preferred for body but is not served by Google Fonts, so
* Inter is loaded as the web fallback (see tailwind.config.ts sans stack).
*/
const fraunces = Fraunces({
subsets: ["latin"],
weight: ["300", "400", "500", "600"],
style: ["normal", "italic"],
variable: "--font-display",
display: "swap",
});
const notoSerifKr = Noto_Serif_KR({
subsets: ["latin"],
weight: ["400", "600", "700"],
variable: "--font-serif-ko",
display: "swap",
});
const inter = Inter({
subsets: ["latin"],
variable: "--font-sans",
display: "swap",
});
export const metadata: Metadata = {
title: {
default: "사물인터넷 표준 연구실 (IoT Standards Lab) · 경북대학교",
template: "%s · 사물인터넷 표준 연구실",
},
description:
"경북대학교 컴퓨터학부 사물인터넷 표준 연구실. 메타버스 상호운용성(MCM) 및 QUIC 기반 멀티에이전트 오케스트레이션 연구.",
};
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html
lang="ko"
className={`${fraunces.variable} ${notoSerifKr.variable} ${inter.variable}`}
>
<head>
{/* No-JS fallback for the .reveal scroll-reveal: without this, every
page is blank if hydration fails (e.g. Google Fonts request blocked). */}
<noscript>
<style>{`.reveal { opacity: 1 !important; transform: none !important; }`}</style>
</noscript>
</head>
<body className="flex min-h-screen flex-col">
<Header />
<main className="flex-1">{children}</main>
<Footer />
</body>
</html>
);
}