Skip to content

Commit 3935d04

Browse files
committed
feat: improve public page metadata and semantics
1 parent e967e87 commit 3935d04

20 files changed

Lines changed: 224 additions & 76 deletions

src/app/layout.tsx

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,50 @@
11
import type { Metadata } from 'next';
2+
import Image from 'next/image';
3+
import localFont from 'next/font/local';
24
import './globals.css';
3-
import FooterCharacter from '@/assets/svg/footer/character-icon.svg';
45
import FacebookIcon from '@/assets/svg/footer/facebook-icon.svg';
56
import InstagramIcon from '@/assets/svg/footer/instagram-icon.svg';
67
import YoutubeIcon from '@/assets/svg/footer/youtube-icon.svg';
78
import Link from 'next/link';
89
import { URLS } from '@/constants/urls';
910

11+
const pretendard = localFont({
12+
src: [
13+
{
14+
path: '../assets/fonts/Pretendard-Regular.woff2',
15+
weight: '400',
16+
style: 'normal',
17+
},
18+
{
19+
path: '../assets/fonts/Pretendard-Bold.woff2',
20+
weight: '700',
21+
style: 'normal',
22+
},
23+
],
24+
variable: '--font-pretendard',
25+
display: 'swap',
26+
fallback: ['system-ui', 'Segoe UI', 'Roboto', 'Helvetica', 'Arial', 'sans-serif'],
27+
});
28+
29+
const organizationStructuredData = {
30+
'@context': 'https://schema.org',
31+
'@type': 'Organization',
32+
name: 'BCSD',
33+
url: 'https://bcsdlab.com',
34+
description: '코리아텍 IT 동아리 BCSD',
35+
email: 'bcsdlab@gmail.com',
36+
sameAs: [URLS.SOCIAL.FACEBOOK, URLS.SOCIAL.INSTAGRAM, URLS.SOCIAL.YOUTUBE],
37+
};
38+
1039
export const metadata: Metadata = {
1140
metadataBase: new URL('https://bcsdlab.com'),
1241
title: {
1342
default: 'BCSD - Build Communities, Share Dreams',
1443
template: '%s | BCSD',
1544
},
45+
alternates: {
46+
canonical: '/',
47+
},
1648
icons: {
1749
icon: '/favicon.ico',
1850
},
@@ -73,16 +105,26 @@ export const metadata: Metadata = {
73105
};
74106

75107
export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) {
76-
const currentYear = new Date().getFullYear();
77-
78108
return (
79109
<html lang="ko">
80-
<body>
110+
<body className={pretendard.variable}>
111+
<script
112+
type="application/ld+json"
113+
dangerouslySetInnerHTML={{ __html: JSON.stringify(organizationStructuredData) }}
114+
/>
81115
{children}
82116
<footer className="flex justify-between bg-[#555] px-13.5">
83117
<div className="flex flex-col justify-center py-10">
84-
<FooterCharacter />
85-
<p className="text-xs font-normal text-[#C4C4C4]">© {currentYear} BCSD. ALL RIGHTS RESERVED.</p>
118+
<Image
119+
src="/images/footer/character-icon.svg"
120+
alt=""
121+
aria-hidden="true"
122+
width="181"
123+
height="65"
124+
loading="lazy"
125+
unoptimized
126+
/>
127+
<p className="text-xs font-normal text-[#C4C4C4]">© 2025 BCSD. ALL RIGHTS RESERVED.</p>
86128
</div>
87129
<div className="flex items-center justify-center gap-4">
88130
<Link href={URLS.SOCIAL.FACEBOOK}>

src/app/page.tsx

Lines changed: 81 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,146 @@
11
import Image from 'next/image';
2-
import MainImage from '@/assets/svg/main/main-image.svg';
3-
import MainIconPipe from '@/assets/svg/main/main-icon-pipe.svg';
4-
import MainCharacter from '@/assets/svg/main/main-character.svg';
5-
import MainIconArrow from '@/assets/svg/main/main-icon-arrow.svg';
6-
import MainIconPartner from '@/assets/svg/main/main-icon-partner.svg';
7-
import QnADropdown from '@/components/QnADropdown';
8-
import MentorSlider from '@/components/MentorSlider';
2+
import dynamic from 'next/dynamic';
3+
import { QnAData } from '@/static/main/QnA';
94
import GlobalNavigationBar from '@/components/GlobalNavigationBar';
105
import ApplyButton from '@/components/ApplyButton';
116

7+
const MentorSlider = dynamic(() => import('@/components/MentorSlider'));
8+
const QnADropdown = dynamic(() => import('@/components/QnADropdown'));
9+
1210
export default function Home() {
11+
const faqStructuredData = {
12+
'@context': 'https://schema.org',
13+
'@type': 'FAQPage',
14+
mainEntity: QnAData.map((item) => ({
15+
'@type': 'Question',
16+
name: item.question,
17+
acceptedAnswer: {
18+
'@type': 'Answer',
19+
text: item.answer,
20+
},
21+
})),
22+
};
23+
1324
return (
14-
<div className="hide-scrollbar w-full overflow-x-auto">
25+
<main className="hide-scrollbar w-full overflow-x-auto">
26+
<script type="application/ld+json" dangerouslySetInnerHTML={{ __html: JSON.stringify(faqStructuredData) }} />
1527
<div className="min-w-360">
16-
<div className="relative aspect-1440/800 w-full">
28+
<header className="relative aspect-1440/800 w-full">
1729
<Image
1830
src="https://image.bcsdlab.com/bcsd_main_page_image.png"
19-
alt="main Image"
31+
alt="BCSD 메인 대표 이미지"
2032
fill
2133
sizes="100vw"
2234
className="object-cover"
2335
priority
2436
/>
2537
<div className="absolute inset-0">
2638
<div className="font-inter absolute top-75 left-30 m-4 -translate-y-1/2 text-white min-[1440px]:top-75 min-[1440px]:left-35 min-[1440px]:translate-y-0">
27-
<p className="text-[40px] leading-[120%] font-semibold">
39+
<h1 className="text-[40px] leading-[120%] font-semibold">
2840
각자의 궤도를 그리며
2941
<br />
3042
BCSD와 함께 성장하세요.
31-
</p>
43+
</h1>
3244
<ApplyButton className="mt-6 rounded-[10px] bg-[#C360F3] px-5 py-3.25 text-white" />
3345
</div>
3446
</div>
35-
</div>
47+
</header>
3648
<GlobalNavigationBar location="Main" />
3749

3850
<div className="min-h-screen gap-16">
3951
<div className="space-y-20">
40-
<div className="flex justify-between px-30 pt-30">
52+
<section className="flex justify-between px-30 pt-30">
4153
<div>
42-
<p className="text-[34px] leading-[120%] font-medium text-neutral-100">열린 공간 BCSD</p>
54+
<h2 className="text-[34px] leading-[120%] font-medium text-neutral-100">열린 공간 BCSD</h2>
4355
<p className="mt-3.25">
4456
마치 은하계가 외부의 다른 천체들과 상호작용하듯,
4557
<br /> BCSD는 구성원들 간의 교류뿐만 아니라 외부의 다양한
4658
<br /> 사람들과도 소통하고 지식을 공유할 수 있는 열린 공간입니다.
4759
</p>
4860
</div>
49-
<MainImage />
50-
</div>
51-
<div className="relative flex h-150 items-center justify-center bg-[linear-gradient(180deg,rgba(255,255,255,0.00)_-9.38%,#FEF2FF_67.06%,rgba(255,255,255,0.00)_90.62%)]">
61+
<Image
62+
src="/images/main/main-image.svg"
63+
alt="BCSD 열린 공간 일러스트"
64+
width="540"
65+
height="237"
66+
loading="lazy"
67+
unoptimized
68+
/>
69+
</section>
70+
<section className="relative flex h-150 items-center justify-center bg-[linear-gradient(180deg,rgba(255,255,255,0.00)_-9.38%,#FEF2FF_67.06%,rgba(255,255,255,0.00)_90.62%)]">
5271
<div className="space-y-4 text-center">
53-
<p className="text-[34px] leading-[120%] font-medium text-neutral-100">함께 성장하는 BCSD</p>
72+
<h2 className="text-[34px] leading-[120%] font-medium text-neutral-100">함께 성장하는 BCSD</h2>
5473
<p>
5574
행성들은 고유한 궤도를 따라 움직이며 하나의 체계를 유지하듯이,
5675
<br /> BCSD 내에서 각자가 자신의 목표를 향해 나아가면서도,
5776
<br /> 협력과 교류를 통해 함께 더 큰 성장을 이뤄나갑니다.
5877
</p>
5978
</div>
6079
<div className="absolute top-0 left-100">
61-
<MainIconPartner />
80+
<Image
81+
src="/images/main/main-icon-partner.svg"
82+
alt=""
83+
aria-hidden="true"
84+
width="242"
85+
height="242"
86+
loading="lazy"
87+
unoptimized
88+
/>
6289
</div>
6390
<div className="absolute top-16 left-0">
64-
<MainIconPipe />
91+
<Image
92+
src="/images/main/main-icon-pipe.svg"
93+
alt=""
94+
aria-hidden="true"
95+
width="326"
96+
height="500"
97+
loading="lazy"
98+
unoptimized
99+
/>
65100
</div>
66101
<div className="absolute top-32 right-32">
67-
<MainIconArrow />
102+
<Image
103+
src="/images/main/main-icon-arrow.svg"
104+
alt=""
105+
aria-hidden="true"
106+
width="475"
107+
height="478"
108+
loading="lazy"
109+
unoptimized
110+
/>
68111
</div>
69-
</div>
112+
</section>
70113
<MentorSlider />
71114
</div>
72-
<div className="relative flex h-245 flex-col items-center justify-center bg-linear-to-b from-white to-[#F5DBFF]">
115+
<section className="relative flex h-245 flex-col items-center justify-center bg-linear-to-b from-white to-[#F5DBFF]">
73116
<div className="text-center">
74-
<p className="title">중력과 유대, BCSD에서의 원동력.</p>
117+
<h2 className="title">중력과 유대, BCSD에서의 원동력.</h2>
75118
<p className="mt-3.5 text-center text-[17px]">
76119
행성들이 중력을 통해 서로 영향을 주고 받으며 균형을 유지하듯이,
77120
<br /> BCSD에서는 비기너, 레귤러, 멘토가 각자의 위치에서 상호작용하며
78121
<br /> 서로를 성장시키는 원동력이 되어줍니다.
79122
</p>
80123
</div>
81124
<div className="mt-16">
82-
<p className="text-center text-[34px] leading-[120%] font-medium">또 하나의 행성 할 사람?</p>
125+
<h2 className="text-center text-[34px] leading-[120%] font-medium">또 하나의 행성 할 사람?</h2>
83126
<div className="text-center">
84127
<ApplyButton className="mt-6 rounded-[10px] bg-[#D365FD] p-2.5 text-[17px] text-[#FFF]" label="저요!" />
85128
</div>
86129
</div>
87-
<MainCharacter className="absolute bottom-0 left-0" />
88-
</div>
130+
<Image
131+
src="/images/main/main-character.svg"
132+
alt=""
133+
aria-hidden="true"
134+
width="528"
135+
height="297"
136+
loading="lazy"
137+
unoptimized
138+
className="absolute bottom-0 left-0"
139+
/>
140+
</section>
89141
<QnADropdown />
90142
</div>
91143
</div>
92-
</div>
144+
</main>
93145
);
94146
}

src/app/recruit/components/BenefitCards.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,17 @@ function BenefitCard({ title, descriptions, Icon, offset }: Benefit) {
2121

2222
export default function BenefitCards() {
2323
return (
24-
<div className="mt-70 place-items-center">
25-
<div className="title">
24+
<section className="mt-70 place-items-center">
25+
<h2 className="title">
2626
<span className="font-bold">궤도</span>에 오르면
2727
<div>얻을 수 있는 것들</div>
28-
</div>
28+
</h2>
2929

3030
<div className="mt-21 flex content-center justify-center gap-4.5">
3131
{BENEFITS.map((benefit) => (
3232
<BenefitCard key={benefit.title} {...benefit} />
3333
))}
3434
</div>
35-
</div>
35+
</section>
3636
);
3737
}

src/app/recruit/components/Timeline.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@ import { STEPS } from '@/static/recruit/timeLine';
33
export default function BeginnerTimeLine() {
44
return (
55
<>
6-
<div className="title">
6+
<h2 className="title">
77
비기너에서 <span className="font-bold">레귤러</span>
8-
</div>
8+
</h2>
99
<div className="relative mt-28 h-42.5 w-full">
1010
<div className="relative flex h-full w-full justify-center gap-17">
1111
{STEPS.map((s) => (

0 commit comments

Comments
 (0)