diff --git a/public/images/member_banner.png b/public/images/member_banner.png
new file mode 100644
index 0000000..e78d848
Binary files /dev/null and b/public/images/member_banner.png differ
diff --git a/public/images/members/lead.png b/public/images/members/lead.png
new file mode 100644
index 0000000..510c879
Binary files /dev/null and b/public/images/members/lead.png differ
diff --git a/public/svg/icons/member/futureCircle.svg b/public/svg/icons/member/futureCircle.svg
new file mode 100644
index 0000000..0dadf87
--- /dev/null
+++ b/public/svg/icons/member/futureCircle.svg
@@ -0,0 +1,18 @@
+
diff --git a/public/svg/icons/member/futureDotLine.svg b/public/svg/icons/member/futureDotLine.svg
new file mode 100644
index 0000000..0510743
--- /dev/null
+++ b/public/svg/icons/member/futureDotLine.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/svg/icons/member/shortDotLine.svg b/public/svg/icons/member/shortDotLine.svg
new file mode 100644
index 0000000..b477eb8
--- /dev/null
+++ b/public/svg/icons/member/shortDotLine.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/svg/member_header.svg b/public/svg/member_header.svg
new file mode 100644
index 0000000..205017a
--- /dev/null
+++ b/public/svg/member_header.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/app/member/page.tsx b/src/app/member/page.tsx
index bade14e..fbfc452 100644
--- a/src/app/member/page.tsx
+++ b/src/app/member/page.tsx
@@ -1,11 +1,25 @@
import React from 'react';
+import MemberHeader from '@/components/member/header/MemberHeader';
+
+import GenerationPage from '@/components/member/generation/GenerationPage';
export const metadata = {
title: 'Member',
};
const MemberPage = () => {
- return
Member 페이지입니당
;
+ return (
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- 배너 --------------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* ----------- 타임라인 및 GDSC세대별 페이지-------------*/}
+ {/* -----------------------------------------------*/}
+
+
+ );
};
export default MemberPage;
diff --git a/src/components/member/generation/GenerationPage.tsx b/src/components/member/generation/GenerationPage.tsx
new file mode 100644
index 0000000..c0cde02
--- /dev/null
+++ b/src/components/member/generation/GenerationPage.tsx
@@ -0,0 +1,53 @@
+'use client';
+import LeadIntro from '@/components/member/introduce/LeadIntro';
+import MemberIntro from '@/components/member/introduce/MemberIntro';
+import TimeLine from '@/components/member/timeline/TimeLine';
+import { useState } from 'react';
+import RecruitHeader from '@/components/recruit/header/RecruitHeader';
+
+const GenerationPage = () => {
+ const [selectedTimelineIndex, setSelectedTimelineIndex] = useState(1);
+
+ return (
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- 타임라인 --------------------*/}
+ {/* -----------------------------------------------*/}
+
+
+ {selectedTimelineIndex === 2 ? (
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- 모집 페이지 --------------------*/}
+ {/* -----------------------------------------------*/}
+
+
+ ) : (
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- 리드 소개 --------------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- DevRel --------------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- Web/App --------------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- Server/Cloud --------------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- Al/ML --------------------*/}
+ {/* -----------------------------------------------*/}
+
+
+ )}
+
+ );
+};
+
+export default GenerationPage;
diff --git a/src/components/member/header/MemberHeader.tsx b/src/components/member/header/MemberHeader.tsx
new file mode 100644
index 0000000..c371948
--- /dev/null
+++ b/src/components/member/header/MemberHeader.tsx
@@ -0,0 +1,47 @@
+import BannerSvg from 'public/svg/member_header.svg';
+import BannerPng from 'public/images/member_banner.png';
+import Image from 'next/image';
+
+/**
+ * @description
+ * 멤버 페이지 헤더 컴포넌트
+ * @component MemberHeader
+ * @returns {JSX.Element} MemberHeader
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the member section.
+ * @returns The rendered header component.
+ */
+const MemberHeader = () => {
+ return (
+
+ );
+};
+
+export default MemberHeader;
diff --git a/src/components/member/introduce/LeadIntro.tsx b/src/components/member/introduce/LeadIntro.tsx
new file mode 100644
index 0000000..14f979d
--- /dev/null
+++ b/src/components/member/introduce/LeadIntro.tsx
@@ -0,0 +1,43 @@
+import Image from 'next/image';
+
+const LeadIntro = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
Lead
+
+
+
+
+ 안녕하세요! GDSC DGU Lead 서희찬입니다.
+
+ GDSC DGU는 많은 학우분들과 함께 성장하고 싶습니다.
+ 많은 관심 부탁드립니다! 감사합니다.
+
+
+
+
+
+
+
+ );
+};
+
+export default LeadIntro;
\ No newline at end of file
diff --git a/src/components/member/introduce/MemberIntro.tsx b/src/components/member/introduce/MemberIntro.tsx
new file mode 100644
index 0000000..2451df4
--- /dev/null
+++ b/src/components/member/introduce/MemberIntro.tsx
@@ -0,0 +1,58 @@
+import ProfileBox from '@/components/member/profilebox/ProfileBox';
+import { DEVREL_MEMBERS } from '@/constants/member/devRel';
+import { WEBAPP_MEMBERS } from '@/constants/member/webApp';
+import { AIML_MEMBERS } from '@/constants/member/AIML';
+import { SERVER_MEMBERS } from '@/constants/member/serverCloud';
+
+/**
+ * @description
+ * 팀 멤버들을 소개하는 컴포넌트로, 사용자가 선택한 팀 카테고리에 따라 다른 팀 멤버 정보를 보여줍니다.
+ * 각 팀 카테고리에 해당하는 멤버 정보는 상수로 정의된 배열에서 가져옵니다.
+ * @component MemberIntro
+ * @param {string} title - 선택된 팀 카테고리의 이름 (예: 'Web/App', 'Server/Cloud', 'AI/ML', 'DevRel')
+ * @returns {JSX.Element} 각 팀 멤버의 프로필을 나타내는 ProfileBox 컴포넌트가 포함된 시각적 인터페이스
+ * @since 2024.04.18
+ */
+const MemberIntro = ({ title }: { title: string }) => {
+ interface Member {
+ id: number;
+ name: string;
+ role: string;
+ department: string;
+ description: string;
+ image: string;
+ }
+
+ let memberType: Member[] | undefined;
+
+ if (title === 'Web/App') memberType = WEBAPP_MEMBERS;
+ else if (title === 'Server/Cloud') memberType = SERVER_MEMBERS;
+ else if (title === 'AI/ML') memberType = AIML_MEMBERS;
+ else if (title === 'DevRel') memberType = DEVREL_MEMBERS;
+
+ return (
+
+
+
+
+
+
+ {memberType &&
+ memberType.map((member, index) => (
+
+ ))}
+
+
+
+
+ );
+};
+export default MemberIntro;
diff --git a/src/components/member/profilebox/ProfileBox.tsx b/src/components/member/profilebox/ProfileBox.tsx
new file mode 100644
index 0000000..ccab8c7
--- /dev/null
+++ b/src/components/member/profilebox/ProfileBox.tsx
@@ -0,0 +1,30 @@
+import Image from 'next/image';
+
+const ProfileBox = ({ member }: { member: any }) => {
+ return (
+
+
+
+
+
+
+
{member.name}
+
{member.role}
+
+
{member.department}
+
+
+
{member.description}
+
+
+ );
+};
+
+export default ProfileBox;
diff --git a/src/components/member/timeline/TimeLine.tsx b/src/components/member/timeline/TimeLine.tsx
new file mode 100644
index 0000000..b0056e9
--- /dev/null
+++ b/src/components/member/timeline/TimeLine.tsx
@@ -0,0 +1,87 @@
+'use client';
+import React, { useState, useRef, useEffect } from 'react';
+import Circle from 'public/svg/icons/member/futureCircle.svg';
+import FutureDotLine from 'public/svg/icons/member/futureDotLine.svg';
+import ShortDotLine from 'public/svg/icons/member/shortDotLine.svg';
+import { TIME_LINE } from '@/constants/member/timeLine';
+
+/**
+ * @description
+ * 타임라인 인터랙티브 컴포넌트로, 사용자는 타임라인의 각 지점을 클릭하여 선택할 수 있습니다.
+ * 선택된 지점의 정보를 부모 컴포넌트에 전달합니다.
+ * @component TimeLine
+ * @param {function} onSelectIndex - 선택된 인덱스를 부모 컴포넌트로 전달하는 함수.
+ * @returns {JSX.Element} The TimeLine interactive component.
+ * @since 2024.04.18
+ */
+const TimeLine = ({
+ onSelectIndex,
+}: {
+ onSelectIndex: (index: number) => void;
+}) => {
+ const [selected, setSelected] = useState(1);
+
+ const handleCircleClick = (index: any) => {
+ if (index === 0) return;
+ setSelected(index);
+ onSelectIndex(index); // Pass the selected index up to the parent component
+ };
+
+ const scrollContainer = useRef(null);
+
+ const getCircleColor = (index: any) => {
+ if (index === selected) return '#FB8C00';
+ if (index < selected) return '#FFCC80';
+ return '#9FA4A8';
+ };
+
+ const getTextColor = (index: any) => {
+ if (index === selected) return '#FFFFFF';
+ return '#9FA4A8';
+ };
+
+ return (
+
+
+
+ {TIME_LINE.map((item, index) => (
+
+
+
+
+ {item.generate}
+
+
+ {item.date}
+
+
+ {index < TIME_LINE.length - 1 && (
+
+ )}
+
+ ))}
+
+
+
+
+ );
+};
+
+export default TimeLine;
diff --git a/src/constants/member/.keep b/src/constants/member/.keep
deleted file mode 100644
index e69de29..0000000
diff --git a/src/constants/member/AIML.ts b/src/constants/member/AIML.ts
new file mode 100644
index 0000000..bf527ae
--- /dev/null
+++ b/src/constants/member/AIML.ts
@@ -0,0 +1,95 @@
+export const AIML_MEMBERS = [
+ {
+ id: 1,
+ name: '이선호',
+ role: 'Core',
+ department: 'AI/ML',
+ description: 'Focused on core system architecture and backend development.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 2,
+ name: '김윤지',
+ role: 'Core',
+ department: 'AI/ML',
+ description:
+ 'Leads the core development team with a focus on innovation and performance.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 3,
+ name: '김현진',
+ role: 'General',
+ department: '산업시스템공학과',
+ description:
+ 'Works on user interface design and user experience optimization.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 4,
+ name: '남경현',
+ role: 'General',
+ department: '산업시스템공학과',
+ description:
+ 'Implements digital marketing strategies to enhance product visibility.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 5,
+ name: '양나은',
+ role: 'General',
+ department: '융합소프트웨어, 화공생물공학과',
+ description: 'Provides customer support and technical assistance.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 6,
+ name: '이다원',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description: 'Ensures software quality through rigorous testing.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 7,
+ name: '이윤주',
+ role: 'General',
+ department: '인공지능학과',
+ description:
+ 'Conducts research to keep the team updated with the latest tech trends.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 8,
+ name: '한상훈',
+ role: 'General',
+ department: '멀티미디어공학과',
+ description:
+ 'Manages recruitment and ensures a healthy workplace environment.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 9,
+ name: '한종원',
+ role: 'General',
+ department: '산업시스템공학과',
+ description: 'Oversees financial operations and budget planning.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 10,
+ name: '홍민기',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description: 'Coordinates day-to-day operational activities.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 11,
+ name: '이재윤',
+ role: 'General',
+ department: '멀티미디어공학과',
+ description: 'Coordinates day-to-day operational activities.',
+ image: '/images/members/lead.png',
+ },
+];
diff --git a/src/constants/member/devRel.ts b/src/constants/member/devRel.ts
new file mode 100644
index 0000000..89ed245
--- /dev/null
+++ b/src/constants/member/devRel.ts
@@ -0,0 +1,29 @@
+export const DEVREL_MEMBERS = [
+ {
+ id: 1,
+ name: '심서현',
+ role: 'Core',
+ department: '학과',
+ description:
+ 'GDSC DGU는 많은 학우분들과 함께 성장하고 싶습니다.많은 관심 부탁드립니다! 감사합니다.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 2,
+ name: '이승현',
+ role: 'Core',
+ department: '학과',
+ description:
+ 'GDSC DGU는 많은 학우분들과 함께 성장하고 싶습니다.많은 관심 부탁드립니다! 감사합니다.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 3,
+ name: '이다연',
+ role: 'Core',
+ department: '학과',
+ description:
+ 'GDSC DGU는 많은 학우분들과 함께 성장하고 싶습니다.많은 관심 부탁드립니다! 감사합니다.',
+ image: '/images/members/lead.png',
+ },
+];
diff --git a/src/constants/member/serverCloud.ts b/src/constants/member/serverCloud.ts
new file mode 100644
index 0000000..37e81bf
--- /dev/null
+++ b/src/constants/member/serverCloud.ts
@@ -0,0 +1,95 @@
+export const SERVER_MEMBERS = [
+ {
+ id: 1,
+ name: '박상준',
+ role: 'Core',
+ department: 'Server/Cloud',
+ description: 'Focused on core system architecture and backend development.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 2,
+ name: '손형준',
+ role: 'Core',
+ department: 'Server/Cloud',
+ description:
+ 'Leads the core development team with a focus on innovation and performance.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 3,
+ name: '강산아',
+ role: 'General',
+ department: '스포츠문화학과',
+ description:
+ 'Works on user interface design and user experience optimization.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 4,
+ name: '강승준',
+ role: 'General',
+ department: '멀티미디어공학과',
+ description:
+ 'Implements digital marketing strategies to enhance product visibility.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 5,
+ name: '고나연',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description: 'Provides customer support and technical assistance.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 6,
+ name: '김재니',
+ role: 'General',
+ department: '정보통신공학과',
+ description: 'Ensures software quality through rigorous testing.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 7,
+ name: '윤창섭',
+ role: 'General',
+ department: '정보통신공학과',
+ description:
+ 'Conducts research to keep the team updated with the latest tech trends.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 8,
+ name: '장동겸',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description:
+ 'Manages recruitment and ensures a healthy workplace environment.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 9,
+ name: '임은서',
+ role: 'General',
+ department: '정보통신공학과',
+ description: 'Oversees financial operations and budget planning.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 10,
+ name: '정구연',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description: 'Coordinates day-to-day operational activities.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 11,
+ name: '임정우',
+ role: 'General',
+ department: '정보통신공학과',
+ description: 'Coordinates day-to-day operational activities.',
+ image: '/images/members/lead.png',
+ },
+];
diff --git a/src/constants/member/timeLine.ts b/src/constants/member/timeLine.ts
new file mode 100644
index 0000000..c318b4e
--- /dev/null
+++ b/src/constants/member/timeLine.ts
@@ -0,0 +1,14 @@
+export const TIME_LINE = [
+ {
+ generate: 'start',
+ date: '2023.7',
+ },
+ {
+ generate: '1st',
+ date: '2023.9',
+ },
+ {
+ generate: '2nd',
+ date: '2024.9',
+ },
+];
diff --git a/src/constants/member/webApp.ts b/src/constants/member/webApp.ts
new file mode 100644
index 0000000..166b298
--- /dev/null
+++ b/src/constants/member/webApp.ts
@@ -0,0 +1,95 @@
+export const WEBAPP_MEMBERS = [
+ {
+ id: 1,
+ name: '정원호',
+ role: 'Core',
+ department: 'Web/App',
+ description: 'Focused on core system architecture and backend development.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 2,
+ name: '이상돈',
+ role: 'Core',
+ department: 'Web/App',
+ description:
+ 'Leads the core development team with a focus on innovation and performance.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 3,
+ name: '김민성',
+ role: 'General',
+ department: '멀티미디어소프트웨어공학전공',
+ description:
+ 'Works on user interface design and user experience optimization.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 4,
+ name: '박정민',
+ role: 'General',
+ department: '산업시스템공학과',
+ description:
+ 'Implements digital marketing strategies to enhance product visibility.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 5,
+ name: '유다현',
+ role: 'General',
+ department: '경영정보학과',
+ description: 'Provides customer support and technical assistance.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 6,
+ name: '이나경',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description: 'Ensures software quality through rigorous testing.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 7,
+ name: '이다은',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description:
+ 'Conducts research to keep the team updated with the latest tech trends.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 8,
+ name: '이도형',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description:
+ 'Manages recruitment and ensures a healthy workplace environment.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 9,
+ name: '이창준',
+ role: 'General',
+ department: '불교학부, 컴퓨터공학전공',
+ description: 'Oversees financial operations and budget planning.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 10,
+ name: '정은지',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description: 'Coordinates day-to-day operational activities.',
+ image: '/images/members/lead.png',
+ },
+ {
+ id: 11,
+ name: '황현정',
+ role: 'General',
+ department: '컴퓨터공학전공',
+ description: 'Coordinates day-to-day operational activities.',
+ image: '/images/members/lead.png',
+ },
+];
diff --git a/tailwind.config.ts b/tailwind.config.ts
index 31ace5d..7a5c3d0 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -1,6 +1,7 @@
import type { Config } from 'tailwindcss';
const config: Config = {
+
content: [
'./src/pages/**/*.{js,ts,jsx,tsx,mdx}',
'./src/components/**/*.{js,ts,jsx,tsx,mdx}',
@@ -34,6 +35,12 @@ const config: Config = {
animation: {
fadeIn: 'fadeIn 1s forwards',
},
+ spacing: {
+ '4.75': '19px' // 19px를 나타내는 키를 추가합니다.
+ },
+ width: {
+ '70rem': '70rem', // '70rem'이라는 key로 70rem 너비를 설정
+ },
},
},
plugins: [],