Skip to content

Commit ee59ec1

Browse files
authored
Merge pull request #351 from KW-ClassLog/Feat/#339/home
✨ Feat/#339 홈 화면
2 parents 5663d63 + c235c0b commit ee59ec1

File tree

14 files changed

+2395
-140
lines changed

14 files changed

+2395
-140
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
"use client";
2+
3+
import React from "react";
4+
import Image from "next/image";
5+
import Link from "next/link";
6+
import styles from "../page.module.scss";
7+
import { IMAGES } from "@/constants/images";
8+
import { ROUTES } from "@/constants/routes";
9+
import { MoveDown } from "lucide-react";
10+
11+
interface HeroSectionProps {
12+
introSectionRef?: React.RefObject<HTMLElement | null>;
13+
}
14+
15+
export default function HeroSection({ introSectionRef }: HeroSectionProps) {
16+
const handleScrollToIntro = () => {
17+
if (introSectionRef?.current) {
18+
introSectionRef.current.scrollIntoView({
19+
behavior: "smooth",
20+
block: "start",
21+
});
22+
}
23+
};
24+
return (
25+
<section className={styles.heroSection}>
26+
<div className={styles.heroInner}>
27+
<div className={styles.heroLeft}>
28+
<div className={styles.textWrapper}>
29+
<Image
30+
src={IMAGES.logo4}
31+
alt="ClassLog Logo"
32+
width={500}
33+
height={120}
34+
className={styles.logo}
35+
/>
36+
<h2>당신의 강의를 더 스마트하게</h2>
37+
<p>수업 녹음, 실시간 소통, AI 기반 퀴즈 생성을 통해</p>
38+
<p>강의 준비부터 피드백까지 한 번에 해결하세요.</p>
39+
</div>
40+
<div className={styles.heroCtas}>
41+
<Link href={ROUTES.login} className={styles.primaryCta}>
42+
시작하기
43+
<span className={styles.arrow} aria-hidden>
44+
45+
</span>
46+
</Link>
47+
</div>
48+
</div>
49+
50+
<div className={styles.introImageWrapper}>
51+
<Image
52+
src={IMAGES.introImage}
53+
alt="소개 이미지"
54+
width={650}
55+
height={300}
56+
className={styles.heroImage}
57+
priority
58+
/>
59+
</div>
60+
</div>
61+
62+
<div className={styles.scrollIndicator} onClick={handleScrollToIntro}>
63+
<MoveDown className={styles.downArrow} size={30} strokeWidth={2.5} />
64+
</div>
65+
</section>
66+
);
67+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import React from "react";
2+
import styles from "../page.module.scss";
3+
import {
4+
MessageCircle,
5+
MessageCircleQuestion,
6+
PencilLine,
7+
Videotape,
8+
} from "lucide-react";
9+
10+
const FEATURES = [
11+
{
12+
icon: <MessageCircle />,
13+
title: "즉시 질문, 즉시 피드백",
14+
description:
15+
"수업 중 궁금한 점은 바로 질문하고 실시간으로 소통할 수 있어요.",
16+
},
17+
{
18+
icon: <MessageCircleQuestion />,
19+
title: "AI 기반 맞춤형 퀴즈",
20+
description:
21+
"강의자료와 녹음을 바탕으로 AI가 자동으로 퀴즈를 만들어요. 복습과 이해도 확인이 더 쉬워집니다.",
22+
},
23+
{
24+
icon: <PencilLine />,
25+
title: "강의자료 업로드 & 수업용 실시간 필기",
26+
description:
27+
"강의 중 자료에 바로 필기하며 핵심 내용을 학생들과 함께 나눌 수 있어요.",
28+
},
29+
{
30+
icon: <Videotape />,
31+
title: "언제든 다시 듣는 수업",
32+
description:
33+
"수업은 자동 녹음되며, 언제든 다시 듣거나 다운로드할 수 있어요.",
34+
},
35+
];
36+
37+
export default function IntroSection({
38+
ref,
39+
}: {
40+
ref: React.RefObject<HTMLElement | null>;
41+
}) {
42+
return (
43+
<section ref={ref} className={styles.introSection}>
44+
<div className={styles.introHeader}>
45+
<h2 className={styles.introTitle}>
46+
What You Can Do
47+
<br />
48+
with ClassLog
49+
</h2>
50+
<div className={styles.introDescription}>
51+
<p className={styles.introSubtitle}>
52+
ClassLog의 핵심 기능 4가지를 소개합니다!
53+
</p>
54+
<p className={styles.introText}>
55+
실시간 질문, AI 기반 퀴즈 생성, 강의자료 업로드 및 필기, 자동 수업
56+
녹음 등 <br />
57+
수업의 전 과정을 하나의 플랫폼에서 관리하고, 학습의 흐름을 놓치지
58+
않도록 도와줍니다.
59+
</p>
60+
</div>
61+
</div>
62+
<div className={styles.featuresContainer}>
63+
{FEATURES.map((feature) => (
64+
<div key={feature.title} className={styles.featureCard}>
65+
<div className={styles.featureIcon}>{feature.icon}</div>
66+
<div className={styles.featureContent}>
67+
<h3 className={styles.featureTitle}>{feature.title}</h3>
68+
<p className={styles.featureDescription}>{feature.description}</p>
69+
</div>
70+
</div>
71+
))}
72+
</div>
73+
</section>
74+
);
75+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"use client";
2+
3+
import Link from "next/link";
4+
import Image from "next/image";
5+
import { useEffect, useState } from "react";
6+
import styles from "../page.module.scss";
7+
import { ROUTES } from "@/constants/routes";
8+
import { IMAGES } from "@/constants/images";
9+
10+
export default function Navbar() {
11+
const [isScrolled, setIsScrolled] = useState(false);
12+
13+
useEffect(() => {
14+
const handleScroll = () => {
15+
const scrollTop = window.scrollY;
16+
setIsScrolled(scrollTop > 50);
17+
};
18+
19+
handleScroll();
20+
21+
window.addEventListener("scroll", handleScroll, { passive: true });
22+
23+
return () => {
24+
window.removeEventListener("scroll", handleScroll);
25+
};
26+
}, []);
27+
28+
return (
29+
<nav className={`${styles.navbar} ${isScrolled ? styles.scrolled : ""}`}>
30+
<Image
31+
src={isScrolled ? IMAGES.logo3 : IMAGES.logo5}
32+
alt="logo"
33+
width={200}
34+
height={100}
35+
className={styles.logo}
36+
/>
37+
<Link href={ROUTES.login} className={styles.login}>
38+
Login
39+
</Link>
40+
</nav>
41+
);
42+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import styles from "../page.module.scss";
2+
3+
const ROAD_MAP = [
4+
{
5+
title: "강사",
6+
steps: [
7+
"클래스 생성",
8+
"클래스별 강의 생성",
9+
"강의자료 업로드",
10+
"강의 시작 (필기 + 질문 뷰어 + 자동 녹음)",
11+
"강의 종료 후 AI 퀴즈 자동 생성 및 배포",
12+
"퀴즈 결과 기반 대시보드 제공",
13+
],
14+
},
15+
{
16+
title: "학생",
17+
steps: [
18+
"클래스 입장",
19+
"강의자료 다운로드",
20+
"실시간 질문 참여",
21+
"녹음 파일 다운로드 및 다시 듣기",
22+
"AI 퀴즈 풀기 + 결과 확인",
23+
],
24+
},
25+
];
26+
27+
export default function RoadMapSection() {
28+
return (
29+
<section className={styles.roadMapSection}>
30+
<div className={styles.roadMapHeader}>
31+
<h2 className={styles.roadMapTitle}>HOW IT WORKS?</h2>
32+
<div className={styles.roadMapDescription}>
33+
<div className={styles.roadMapText}>
34+
ClassLog, 어떻게 활용할 수 있을까요?
35+
<br />
36+
강사와 학생 각각의 흐름에 맞춰 스마트한 학습 경험을 제공합니다.
37+
<br />
38+
수업 전부터 수업 중, 수업 후까지 — 모든 과정을 ClassLog 하나로
39+
완성하세요.
40+
</div>
41+
<div className={styles.roadMapCta}>
42+
<p>
43+
Get to know More <br />
44+
about ClassLog
45+
</p>
46+
</div>
47+
</div>
48+
</div>
49+
<div className={styles.roadMapCards}>
50+
{ROAD_MAP.map((item) => (
51+
<div key={item.title} className={styles.roadMapCard}>
52+
<h3 className={styles.cardTitle}>{item.title}</h3>
53+
<ul className={styles.stepsList}>
54+
{item.steps.map((step, index) => (
55+
<li key={step} className={styles.stepItem}>
56+
<span className={styles.stepNumber}>{index + 1}</span>
57+
<span className={styles.stepText}>{step}</span>
58+
</li>
59+
))}
60+
</ul>
61+
</div>
62+
))}
63+
</div>
64+
</section>
65+
);
66+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { IMAGES } from "@/constants/images";
2+
import styles from "../page.module.scss";
3+
import { MoveRight } from "lucide-react";
4+
import Image from "next/image";
5+
import { ROUTES } from "@/constants/routes";
6+
import { useRouter } from "next/navigation";
7+
8+
export function StartButtonSection() {
9+
const router = useRouter();
10+
return (
11+
<section className={styles.startButtonSection}>
12+
<Image src={IMAGES.logo5} alt="ClassLog Logo" width={98} height={28} />
13+
<div>
14+
<h2>
15+
지금 바로 ClassLog를
16+
<br />
17+
시작해보세요!
18+
</h2>
19+
<p>
20+
수업의 시작부터 끝까지, 지금 ClassLog와 함께하세요.
21+
<br />
22+
기록하고, 공유하고, 더 깊이 있게 배우는 경험을 제공합니다.
23+
</p>
24+
<button
25+
onClick={() => {
26+
router.push(ROUTES.login);
27+
}}
28+
>
29+
<p>시작하기</p>
30+
<MoveRight />
31+
</button>
32+
</div>
33+
<Image src={IMAGES.logo6} alt="ClassLog Logo" width={293} height={320} />
34+
</section>
35+
);
36+
}

0 commit comments

Comments
 (0)