feat(publications,standardization,ui): harmonize typography, active category border, and 5 representative highlights

- Refine Publications overview & category detail pages with clean typography and spacing
- Add active border line (border-2 border-cobalt-dark) on active CategoryNav card
- Replace 10 highlights with 5 designated representative publications
- Add Patent subtitle '(IoT Architecture & Protocols, etc ...)'
- Update Footer link label from 'College of IT Engineering' to 'CITE'
- Clean up Standardization & Lectures page header kickers and spacing
This commit is contained in:
2026-08-24 15:55:59 +09:00
parent a2b626b192
commit b1640cdac4
13 changed files with 223 additions and 196 deletions
@@ -55,34 +55,29 @@ export default function PublicationCategoryPage({ params }: PageProps) {
}
return (
<div className="container-content space-y-8 md:space-y-12 pt-10 md:pt-16 pb-16 md:pb-24">
{/* Header */}
<section className="space-y-3">
<div className="flex items-center gap-3">
<span className="h-px w-8 bg-cobalt-dark"></span>
<span className="font-mono text-xs tracking-widest uppercase text-cobalt-dark font-bold">
Publications Category
</span>
</div>
<h1 className="font-serif text-4xl sm:text-5xl font-normal text-ink">
<div className="container-content py-8 sm:py-12 space-y-10 sm:space-y-14">
{/* Page Header */}
<section className="space-y-1">
<h1 className="font-serif text-4xl sm:text-5xl font-normal text-ink tracking-tight">
{currentCat.label}
</h1>
<p className="text-ink-mute text-base max-w-2xl">
{currentCat.desc} {records.length} .
</p>
{currentCat.subtitle && (
<p className="font-mono text-sm text-ink-mute">
{currentCat.subtitle}
</p>
)}
</section>
{/* Category Nav */}
<CategoryNav currentCategory={slug} />
{/* Category Nav Cards */}
<section className="pt-6 md:pt-8 border-t border-line">
<CategoryNav currentCategory={slug} />
</section>
{/* Record List Section */}
<section className="space-y-6">
<section className="space-y-6 pt-6 md:pt-8 border-t border-line">
<div className="flex justify-between items-center border-b border-line pb-3">
<span className="font-mono text-xs text-ink-mute uppercase">
Showing {records.length} Pre-rendered Records
</span>
<span className="font-mono text-xs text-vermillion-dark font-bold">
SSG Static HTML
{records.length} Records
</span>
</div>
@@ -116,13 +111,13 @@ export default function PublicationCategoryPage({ params }: PageProps) {
{rec.isPatent ? (
<div className="space-y-1 text-xs text-ink-mute font-mono">
<p className="text-ink">: {rec.inventors}</p>
<p className="text-ink">Inventors: {rec.inventors}</p>
<p>
: {rec.appNo} ({rec.country}, {rec.appDate})
App No: {rec.appNo} ({rec.country}, {rec.appDate})
</p>
{rec.regNo && (
<p className="text-cobalt-dark font-bold">
: {rec.regNo} ({rec.regDate})
Reg No: {rec.regNo} ({rec.regDate})
</p>
)}
</div>
@@ -133,7 +128,7 @@ export default function PublicationCategoryPage({ params }: PageProps) {
<span>{rec.volume}</span>
{rec.kci && (
<span className="bg-cobalt-dark text-ivory text-[0.65rem] px-1.5 py-0.5 rounded font-bold">
KCI
KCI Indexed
</span>
)}
</div>
@@ -1,6 +1,7 @@
import React from "react";
import Link from "next/link";
import { PUB_CATEGORIES } from "../../../content/categories";
import { publications, patents } from "../../../content/publications";
import { PubCategory } from "../../../content/types";
interface CategoryNavProps {
@@ -8,23 +9,93 @@ interface CategoryNavProps {
}
export function CategoryNav({ currentCategory }: CategoryNavProps) {
const getCount = (slug: string) => {
if (slug === "patent") return patents.length;
return publications.filter((p) => p.category === slug).length;
};
return (
<div className="space-y-4">
<div className="flex flex-wrap items-center gap-2 border-b border-line pb-4">
<div className="flex justify-between items-center">
<h2 className="font-serif text-2xl sm:text-3xl font-normal text-cobalt-dark">
Categories
</h2>
{currentCategory && (
<Link
href="/publications"
className="font-mono text-xs text-ink-mute hover:text-ink hover:underline transition-colors"
>
&larr; Overview
</Link>
)}
</div>
<div className="grid gap-5 sm:gap-6 md:grid-cols-3">
{PUB_CATEGORIES.map((cat) => {
const count = getCount(cat.slug);
const isActive = currentCategory === cat.slug;
return (
<Link
<div
key={cat.slug}
href={`/publications/${cat.slug}`}
className={`px-4 py-2 rounded text-xs font-mono tracking-wider transition-colors ${
className={`flex flex-col justify-between bg-paper p-5 sm:p-6 rounded-lg transition-all ${
isActive
? "bg-cobalt-dark text-white dark:text-ivory font-bold"
: "bg-paper text-ink border border-line hover:border-cobalt-dark"
? "border-2 border-cobalt-dark shadow-md"
: "border border-line shadow-sm hover:border-cobalt-dark/40"
}`}
>
{cat.label}
</Link>
<div className="space-y-3">
<div className="flex justify-between items-center">
<span
className={`font-mono text-xs font-bold uppercase tracking-wider ${
isActive ? "text-cobalt-dark" : "text-ink-mute"
}`}
>
Category
</span>
{isActive && (
<span className="font-mono text-[0.65rem] font-bold px-2 py-0.5 rounded bg-cobalt-dark/10 text-cobalt-dark uppercase">
Current
</span>
)}
</div>
<h3
className={`font-serif text-xl ${
isActive ? "text-cobalt-dark font-normal" : "text-ink font-normal"
}`}
>
{cat.label}
{cat.subtitle && (
<span className="block text-xs font-mono text-ink-mute mt-1 font-normal">
{cat.subtitle}
</span>
)}
</h3>
</div>
<div className="mt-6 pt-4 border-t border-line flex items-baseline justify-between">
<span className="font-display text-3xl font-bold text-ink">
{count}
<span className="text-xs font-mono text-ink-mute ml-1 font-normal">
{cat.slug === "patent" ? "Patents" : "Papers"}
</span>
</span>
{isActive ? (
<span className="inline-flex items-center text-xs font-bold text-cobalt-dark font-mono">
Active View
</span>
) : (
<Link
href={`/publications/${cat.slug}`}
className="inline-flex items-center text-xs font-bold text-vermillion-dark hover:underline"
>
View All &rarr;
</Link>
)}
</div>
</div>
);
})}
</div>
+36 -84
View File
@@ -1,100 +1,52 @@
import Link from "next/link";
import { CategoryNav } from "./_components/CategoryNav";
import { PUB_CATEGORIES } from "../../content/categories";
import { publications, patents } from "../../content/publications";
import { publications } from "../../content/publications";
export const metadata = {
title: "Publications Overview | ANL",
description: "AI 에이전트 네트워크 연구실(ANL) 연구 실적 개요 및 카테고리별 집계",
title: "Publications | ANL",
description: "AI Agent Networking Lab (ANL) research publications and patents overview",
};
const REPRESENTATIVE_HIGHLIGHT_TITLES = [
"Globally Integrated Trust Authority (GITA) for Resource-Constrained Edge Devices in IoT and 6G",
"Application Level Trust Authority (APPLETA) for Resource-Constrained Edge Devices in IoT and 6G",
"mQUIC: Use of QUIC for Handover Support with Connection Migration in Wireless/Mobile Networks",
"Use of QUIC for CoAP Transport in IoT Networks",
"Use of QUIC for Mobile-Oriented Future Internet (Q-MOFI)",
];
export default function PublicationsIndexPage() {
const totalPubCount = publications.length + patents.length;
// Sort publication records by publishedAt descending to select top 10 highlights
const top10Highlights = [...publications]
.sort((a, b) => (b.publishedAt || "").localeCompare(a.publishedAt || ""))
.slice(0, 10);
const getCount = (slug: string) => {
if (slug === "patent") return patents.length;
return publications.filter((p) => p.category === slug).length;
};
// Selected 5 representative publications
const highlights = REPRESENTATIVE_HIGHLIGHT_TITLES.map((title) =>
publications.find(
(p) => p.title.trim().toLowerCase() === title.trim().toLowerCase()
)
).filter((p): p is (typeof publications)[0] => Boolean(p));
return (
<main className="container-content space-y-8 md:space-y-12 pt-10 md:pt-16 pb-16 md:pb-24">
{/* Header section */}
<section className="space-y-4">
<div className="flex items-center gap-3">
<span className="h-px w-8 bg-cobalt-dark" />
<span className="font-mono text-xs font-bold uppercase tracking-widest text-cobalt-dark">
BIBLIOGRAPHY &amp; INTELLECTUAL PROPERTY
</span>
</div>
<h1 className="headline-ko text-3xl sm:text-4xl text-ink font-bold">
<main className="container-content py-8 sm:py-12 space-y-10 sm:space-y-14">
{/* Page Header */}
<section>
<h1 className="font-serif text-4xl sm:text-5xl font-normal text-ink tracking-tight">
PUBLICATIONS
</h1>
<p className="text-sm sm:text-base text-ink-mute max-w-3xl leading-relaxed">
AI (ANL) ({publications.length}) ({patents.length}) {totalPubCount} .
</p>
</section>
{/* Category Navigation */}
<CategoryNav />
{/* Category Summary Cards */}
<section className="grid gap-6 md:grid-cols-3">
{PUB_CATEGORIES.map((cat) => {
const count = getCount(cat.slug);
return (
<div
key={cat.slug}
className="flex flex-col justify-between border border-line bg-paper p-6 rounded-lg transition-colors hover:border-cobalt-dark group"
>
<div className="space-y-3">
<span className="font-mono text-xs text-ink-mute uppercase tracking-wider">
Category
</span>
<h2 className="headline-ko text-xl text-ink font-bold group-hover:text-cobalt-dark transition-colors">
{cat.label}
</h2>
<p className="text-xs text-ink-mute leading-relaxed">
{cat.desc}
</p>
</div>
<div className="mt-6 pt-4 border-t border-line flex items-baseline justify-between">
<span className="font-display text-3xl font-bold text-ink">
{count}
<span className="text-xs font-sans text-ink-mute ml-1 font-normal"></span>
</span>
<Link
href={`/publications/${cat.slug}`}
className="inline-flex items-center text-xs font-bold text-vermillion-dark hover:underline"
>
&rarr;
</Link>
</div>
</div>
);
})}
<section className="pt-6 md:pt-8 border-t border-line">
<CategoryNav />
</section>
{/* Top 10 Highlights Section */}
<section className="space-y-6 pt-6 border-t border-line">
<div className="flex items-center justify-between">
<h2 className="headline-ko text-2xl font-bold text-ink">
(Top 10 Highlights)
</h2>
<span className="font-mono text-xs text-ink-mute">
RECENT HIGHLIGHTS
</span>
</div>
{/* Highlights Section */}
<section className="space-y-6 pt-6 md:pt-8 border-t border-line">
<h2 className="font-serif text-2xl sm:text-3xl font-normal text-cobalt-dark">
Highlights
</h2>
<div className="divide-y divide-line border border-line bg-ivory rounded-lg overflow-hidden">
{top10Highlights.map((pub, idx) => (
<article key={`${pub.category}-${idx}`} className="p-5 hover:bg-paper/50 transition-colors space-y-2">
<div className="divide-y divide-line border border-line bg-paper rounded-lg overflow-hidden shadow-sm">
{highlights.map((pub, idx) => (
<article key={`${pub.category}-${idx}`} className="p-5 hover:bg-ivory/60 transition-colors space-y-2">
<div className="flex flex-wrap items-center gap-2 text-xs font-mono text-ink-mute">
<span className="px-2 py-0.5 rounded bg-paper border border-line text-ink font-bold">
<span className="px-2 py-0.5 rounded bg-ivory border border-line text-ink font-bold">
{pub.publishedAt?.substring(0, 7) || "Recent"}
</span>
<span>·</span>
@@ -102,11 +54,11 @@ export default function PublicationsIndexPage() {
{pub.doi && (
<>
<span>·</span>
<span className="text-vermillion">DOI: {pub.doi}</span>
<span className="text-vermillion-dark">DOI: {pub.doi}</span>
</>
)}
</div>
<h3 className="font-semibold text-base text-ink leading-snug">
<h3 className="font-serif text-base font-normal text-ink leading-snug">
{pub.title}
</h3>
{pub.authors && (
@@ -115,7 +67,7 @@ export default function PublicationsIndexPage() {
</p>
)}
{pub.venue && (
<p className="text-xs italic text-ink-soft">
<p className="text-xs italic text-ink-mute">
{pub.venue}
</p>
)}