diff --git a/public/images/project_img.png b/public/images/project_img.png
new file mode 100644
index 0000000..17bd67d
Binary files /dev/null and b/public/images/project_img.png differ
diff --git a/public/images/seminar/presenter/seohuichan.png b/public/images/seminar/presenter/seohuichan.png
new file mode 100644
index 0000000..970d859
Binary files /dev/null and b/public/images/seminar/presenter/seohuichan.png differ
diff --git a/public/images/solution_challenge_banner.png b/public/images/solution_challenge_banner.png
new file mode 100644
index 0000000..4b24ae2
Binary files /dev/null and b/public/images/solution_challenge_banner.png differ
diff --git a/public/svg/icons/project/fileIcon.svg b/public/svg/icons/project/fileIcon.svg
new file mode 100644
index 0000000..a1b5628
--- /dev/null
+++ b/public/svg/icons/project/fileIcon.svg
@@ -0,0 +1,4 @@
+
diff --git a/public/svg/icons/project/githubIcon.svg b/public/svg/icons/project/githubIcon.svg
new file mode 100644
index 0000000..1364872
--- /dev/null
+++ b/public/svg/icons/project/githubIcon.svg
@@ -0,0 +1,4 @@
+
diff --git a/public/svg/icons/project/toggleIcon.svg b/public/svg/icons/project/toggleIcon.svg
new file mode 100644
index 0000000..5c11431
--- /dev/null
+++ b/public/svg/icons/project/toggleIcon.svg
@@ -0,0 +1,10 @@
+
diff --git a/public/svg/icons/project/youtubeIcon.svg b/public/svg/icons/project/youtubeIcon.svg
new file mode 100644
index 0000000..81598b4
--- /dev/null
+++ b/public/svg/icons/project/youtubeIcon.svg
@@ -0,0 +1,4 @@
+
diff --git a/public/svg/icons/solutionChallenge/lightIcon.svg b/public/svg/icons/solutionChallenge/lightIcon.svg
new file mode 100644
index 0000000..fa468b8
--- /dev/null
+++ b/public/svg/icons/solutionChallenge/lightIcon.svg
@@ -0,0 +1,10 @@
+
diff --git a/public/svg/icons/solutionChallenge/solution_challenge_banner2.svg b/public/svg/icons/solutionChallenge/solution_challenge_banner2.svg
new file mode 100644
index 0000000..c1f1529
--- /dev/null
+++ b/public/svg/icons/solutionChallenge/solution_challenge_banner2.svg
@@ -0,0 +1,4 @@
+
diff --git a/public/svg/seminar/gdsc_logo.svg b/public/svg/seminar/gdsc_logo.svg
new file mode 100644
index 0000000..2b559a5
--- /dev/null
+++ b/public/svg/seminar/gdsc_logo.svg
@@ -0,0 +1,9 @@
+
diff --git a/public/svg/seminar/pin.svg b/public/svg/seminar/pin.svg
new file mode 100644
index 0000000..385b112
--- /dev/null
+++ b/public/svg/seminar/pin.svg
@@ -0,0 +1,3 @@
+
diff --git a/public/svg/seminar/seminar_banner.svg b/public/svg/seminar/seminar_banner.svg
new file mode 100644
index 0000000..ce5c8d2
--- /dev/null
+++ b/public/svg/seminar/seminar_banner.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/app/project/[id]/page.tsx b/src/app/project/[id]/page.tsx
new file mode 100644
index 0000000..2d0824a
--- /dev/null
+++ b/src/app/project/[id]/page.tsx
@@ -0,0 +1,24 @@
+import ProjectContent from '@/components/project/content/ProjectContent';
+import ProjectIntroduction from '@/components/project/introduction/ProjectIntroduction';
+import React from 'react';
+
+export const metadata = {
+ title: 'Project Detail',
+};
+
+const ProjectDetailPage = () => {
+ return (
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- 프로젝트 소개 ---------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* ------------------ 프로젝트 내용 ----------------*/}
+ {/* -----------------------------------------------*/}
+
+
+ );
+};
+
+export default ProjectDetailPage;
diff --git a/src/app/project/page.tsx b/src/app/project/page.tsx
index 3ac0745..cae9c2b 100644
--- a/src/app/project/page.tsx
+++ b/src/app/project/page.tsx
@@ -1,3 +1,6 @@
+import ProjectHeader from '@/components/project/header/ProjectHeader';
+import ProjectList from '@/components/project/list/ProjectList';
+import ProjectPagination from '@/components/project/pagination/ProjectPagination';
import React from 'react';
export const metadata = {
@@ -5,7 +8,22 @@ export const metadata = {
};
const ProjectPage = () => {
- return
Project 페이지입니당
;
+ return (
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- 제목 ----------------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* ------------------ 프로젝트 리스트 ----------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* ------------------ 페이지네이션 ----------------*/}
+ {/* -----------------------------------------------*/}
+
+
+ );
};
export default ProjectPage;
diff --git a/src/app/seminar/[id]/page.tsx b/src/app/seminar/[id]/page.tsx
index c431b77..4874a2d 100644
--- a/src/app/seminar/[id]/page.tsx
+++ b/src/app/seminar/[id]/page.tsx
@@ -1,7 +1,40 @@
+'use client';
+
import React from 'react';
+import { useRouter } from 'next/navigation';
+import SeminarDetailHeader from '@/components/seminar/seminarDetail/header/SeminarDetailHeader';
+import SeminarDetailBanner from '@/components/seminar/seminarDetail/banner/SeminarDetailBanner';
+import { SEMINAR_DATA } from '@/constants/seminar/seminarData';
+import SeminarDetailPdf from '@/components/seminar/seminarDetail/pdf/SeminarDetailPdf';
+import NotFoundPage from '@/app/not-found';
+import SeminarDetailReview from '@/components/seminar/seminarDetail/review/SeminarDetailReview';
+
+const SeminarDetailPage = () => {
+ const router = useRouter();
+ console.log(router);
+
+ // 객체 찾기
+ const seminar = SEMINAR_DATA.find(seminar => Number(seminar.id) === 1);
+
+ if (!seminar) {
+ // 세미나를 찾지 못한 경우
+ return ;
+ }
+
+
+ return
+ {/* header */}
+
+
+ {/* banner */}
+
+
+ {/* pdf file */}
+
-const CommunityDetailPage = () => {
- return CommunityDetail 페이지입니당
;
+ {/* review */}
+
+ ;
};
-export default CommunityDetailPage;
+export default SeminarDetailPage;
diff --git a/src/app/seminar/page.tsx b/src/app/seminar/page.tsx
index 971d2ae..df2dacd 100644
--- a/src/app/seminar/page.tsx
+++ b/src/app/seminar/page.tsx
@@ -1,12 +1,27 @@
-import React from 'react';
+'use client';
-// metadata
-export const metadata = {
- title: 'Seminar',
-};
+import SeminarHeader from '@/components/seminar/header/SeminarHeader';
+import SeminarMenuBar from '@/components/seminar/menubar/SeminarMenuBar';
+import SeminarThumbnailList from '@/components/seminar/thumbnail/SeminarThumbnailList';
+import SeminarToggle from '@/components/seminar/toggle/SeminarToggle';
+import React, { useState } from 'react';
const SeminarPage = () => {
- return Seminar 페이지입니당
;
+ const [selectedCategory, setSelectedCategory] = useState('all');
+
+ return
+{/* header */}
+
+
+{/* toggle */}
+
+
+{/* select button */}
+
+
+{/* seminar list */}
+
+
;
};
export default SeminarPage;
diff --git a/src/app/solutionChallenge/page.tsx b/src/app/solutionChallenge/page.tsx
new file mode 100644
index 0000000..78d3c61
--- /dev/null
+++ b/src/app/solutionChallenge/page.tsx
@@ -0,0 +1,29 @@
+import ProjectList from '@/components/project/list/ProjectList';
+import SolutionChallengeHeader from '@/components/sollutionChallenge/header/SolutionChallengeHeader';
+import SolutionChallengeTab from '@/components/sollutionChallenge/tab/SolutionChallengeTab';
+import React from 'react';
+
+export const metadata = {
+ title: 'SolutionChallenge',
+};
+
+const SolutionChallengePage = () => {
+ return (
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- 배너 ----------------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* -------------------- 상단 탭 --------------------*/}
+ {/* -----------------------------------------------*/}
+
+ {/* -----------------------------------------------*/}
+ {/* ------------------ 프로젝트 리스트 ----------------*/}
+ {/* -----------------------------------------------*/}
+
+
+ );
+};
+
+export default SolutionChallengePage;
diff --git a/src/components/project/card/ProjectCard.tsx b/src/components/project/card/ProjectCard.tsx
new file mode 100644
index 0000000..5f0676d
--- /dev/null
+++ b/src/components/project/card/ProjectCard.tsx
@@ -0,0 +1,42 @@
+import ProjectImg from '@/images/project_img.png';
+import Link from 'next/link';
+
+/**
+ * @description
+ * 프로젝트 페이지 프로젝트 카드 컴포넌트
+ * @component ProjectCard
+ * @returns {JSX.Element} ProjectCard
+ * @since 2024.04.16
+ */
+/**
+ * Renders the card component for the project section.
+ * @returns The rendered card component.
+ */
+
+const ProjectCard = () => {
+ return (
+
+
+
+
+
제목
+
+ 서비스 소개! 두줄까지 적어주세요.
+
+
+ 특이 사항
+
+
+
+
+ );
+};
+
+export default ProjectCard;
diff --git a/src/components/project/content/ProjectContent.tsx b/src/components/project/content/ProjectContent.tsx
new file mode 100644
index 0000000..22a7037
--- /dev/null
+++ b/src/components/project/content/ProjectContent.tsx
@@ -0,0 +1,41 @@
+import ProjectMember from './ProjectMember';
+import ToggleIcon from '@/svg/icons/project/toggleIcon.svg';
+
+/**
+ * @description
+ * 프로젝트 상세 페이지 프로젝트 내용 컴포넌트
+ * @component ProjectContent
+ * @returns {JSX.Element} ProjectContent
+ * @since 2024.04.16
+ */
+/**
+ * Renders the prject content component for the project section.
+ * @returns The rendered project content component.
+ */
+
+const ProjectContent = () => {
+ return (
+
+
+
+ 노션 내용 크롤링
CONG(콩) : 축하 아카이빙 서비스
CONG은 왜
+ 필요할까?
{' '}
+
+
+ );
+};
+
+export default ProjectContent;
diff --git a/src/components/project/content/ProjectMember.tsx b/src/components/project/content/ProjectMember.tsx
new file mode 100644
index 0000000..5643d6b
--- /dev/null
+++ b/src/components/project/content/ProjectMember.tsx
@@ -0,0 +1,36 @@
+import ProfileImg from '@/images/project_img.png';
+
+/**
+ * @description
+ * 프로젝트 상세 페이지 프로젝트 멤버 컴포넌트
+ * @component ProjectMember
+ * @returns {JSX.Element} ProjectMember
+ * @since 2024.04.18
+ */
+/**
+ * Renders the project Member component for the project section.
+ * @returns The rendered project Member component.
+ */
+
+import Image from 'next/image';
+
+const ProjectMember = () => {
+ return (
+
+ );
+};
+
+export default ProjectMember;
diff --git a/src/components/project/header/ProjectHeader.tsx b/src/components/project/header/ProjectHeader.tsx
new file mode 100644
index 0000000..e516a85
--- /dev/null
+++ b/src/components/project/header/ProjectHeader.tsx
@@ -0,0 +1,23 @@
+/**
+ * @description
+ * 프로젝트 페이지 헤더 컴포넌트
+ * @component ProjectHeader
+ * @returns {JSX.Element} ProjectHeader
+ * @since 2024.04.16
+ */
+/**
+ * Renders the header component for the project section.
+ * @returns The rendered header component.
+ */
+
+const ProjectHeader = () => {
+ return (
+
+ Project
+ GDSC DGU의 프로젝트
+
+
+ );
+};
+
+export default ProjectHeader;
diff --git a/src/components/project/introduction/ProjectIntroduction.tsx b/src/components/project/introduction/ProjectIntroduction.tsx
new file mode 100644
index 0000000..3b7997e
--- /dev/null
+++ b/src/components/project/introduction/ProjectIntroduction.tsx
@@ -0,0 +1,56 @@
+import GithubIcon from '@/svg/icons/project/githubIcon.svg';
+import YoutubeIcon from '@/svg/icons/project/youtubeIcon.svg';
+import FileIcon from '@/svg/icons/project/fileIcon.svg';
+import ProjectImg from '@/images/project_img.png';
+import Image from 'next/image';
+
+/**
+ * @description
+ * 프로젝트 상세 페이지 프로젝트 소개 컴포넌트
+ * @component ProjectIntroduction
+ * @returns {JSX.Element} ProjectIntroduction
+ * @since 2024.04.16
+ */
+/**
+ * Renders the prject introduction component for the project section.
+ * @returns The rendered project introduction component.
+ */
+
+const ProjectIntroduction = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
서비스명
+
+ 서비스의 캐치프라이즈, 컨셉을 잘 나타낼 수 있는 말을 간결하게
+ 적고자합니다.
+
+
+
+
+
+
+ 서비스가 어디서 시작됐는지, 서비스의 띠지
+
+
추가적인 성과
+
+
+
+ );
+};
+
+export default ProjectIntroduction;
diff --git a/src/components/project/list/ProjectList.tsx b/src/components/project/list/ProjectList.tsx
new file mode 100644
index 0000000..f0134e7
--- /dev/null
+++ b/src/components/project/list/ProjectList.tsx
@@ -0,0 +1,29 @@
+import ProjectCard from '../card/ProjectCard';
+
+/**
+ * @description
+ * 프로젝트 페이지 프로젝트 리스트 컴포넌트
+ * @component ProjectList
+ * @returns {JSX.Element} ProjectList
+ * @since 2024.04.16
+ */
+/**
+ * Renders the list component for the project section.
+ * @returns The rendered list component.
+ */
+
+const ProjectList = () => {
+ return (
+
+ );
+};
+
+export default ProjectList;
diff --git a/src/components/project/pagination/ProjectPagination.tsx b/src/components/project/pagination/ProjectPagination.tsx
new file mode 100644
index 0000000..0c58bb7
--- /dev/null
+++ b/src/components/project/pagination/ProjectPagination.tsx
@@ -0,0 +1,34 @@
+import ProjectCard from '../card/ProjectCard';
+
+/**
+ * @description
+ * 프로젝트 페이지 프로젝트 페이지네이션 컴포넌트
+ * @component ProjectPagination
+ * @returns {JSX.Element} ProjectPagination
+ * @since 2024.04.16
+ */
+/**
+ * Renders the pagination component for the project section.
+ * @returns The rendered pagination component.
+ */
+
+const ProjectPagination = () => {
+ return (
+
+
+
+
+
+
+ );
+};
+
+export default ProjectPagination;
diff --git a/src/components/seminar/header/SeminarHeader.tsx b/src/components/seminar/header/SeminarHeader.tsx
new file mode 100644
index 0000000..7e0bf46
--- /dev/null
+++ b/src/components/seminar/header/SeminarHeader.tsx
@@ -0,0 +1,29 @@
+import BannerImg from '@/svg/seminar/seminar_banner.svg';
+
+/**
+ * @description
+ * 세미나 페이지 헤더 컴포넌트
+ * @component SeminarHeader
+ * @returns {JSX.Element} SeminarHeader
+ * @since 2024.04.12
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarHeader = () => {
+
+ return (
+
+
+ Seminar
+
+
+ 여러분과 함께 나누고싶은 이야기
+
+
+
+
+ );
+};
+export default SeminarHeader;
diff --git a/src/components/seminar/menubar/SeminarMenuBar.tsx b/src/components/seminar/menubar/SeminarMenuBar.tsx
new file mode 100644
index 0000000..666c18d
--- /dev/null
+++ b/src/components/seminar/menubar/SeminarMenuBar.tsx
@@ -0,0 +1,44 @@
+'use client';
+
+import { SEMINAR_CATEGORYS } from '@/constants/seminar/seminarCategory';
+import React, { useState } from 'react';
+
+/**
+ * @description
+ * 세미나 페이지 오픈 세미나 토클 메뉴
+ * @component SeminarMenuBar
+ * @returns {JSX.Element} SeminarMenuBar
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarMenuBar = ({
+ selectedCategory,
+ setSelectedCategory,
+}: { selectedCategory: string; setSelectedCategory: (value: string) => void }) => {
+
+ const handleCategoryChange = (value: string) => {
+ setSelectedCategory(value);
+ };
+
+ return (
+
+ {SEMINAR_CATEGORYS.map((category) => (
+
+ ))}
+
+ );
+};
+
+ export default SeminarMenuBar;
+
\ No newline at end of file
diff --git a/src/components/seminar/seminarDetail/banner/SeminarDetailBanner.tsx b/src/components/seminar/seminarDetail/banner/SeminarDetailBanner.tsx
new file mode 100644
index 0000000..874f5ae
--- /dev/null
+++ b/src/components/seminar/seminarDetail/banner/SeminarDetailBanner.tsx
@@ -0,0 +1,68 @@
+import React from 'react';
+import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail';
+import SeminarDetailBannerThumbnail from './SeminarDetailBannerThumbnail';
+
+
+/**
+ * @description
+ * 세미나 상세 페이지 배너 컴포넌트
+ * @component SeminarDetailBanner
+ * @returns {JSX.Element} SeminarDetailBanner
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarDetailBanner = ({ data }: { data: SeminarThumnail }) => {
+ return (
+
+ {/* 왼쪽 컨텐츠 */}
+
+ {/* 오른쪽 컨텐츠 */}
+
+
+
+
+ {data.presenter}
+
+
+ {data.flag}st {data.role}
+
+
+
+
+
+
+ Date
+
+
+ {data.date}
+
+
+ Location
+
+
+ {data.location}
+
+
+ Speaker
+
+
+ {data.presenter}
+
+
+
+ );
+};
+export default SeminarDetailBanner;
diff --git a/src/components/seminar/seminarDetail/banner/SeminarDetailBannerThumbnail.tsx b/src/components/seminar/seminarDetail/banner/SeminarDetailBannerThumbnail.tsx
new file mode 100644
index 0000000..d0f737f
--- /dev/null
+++ b/src/components/seminar/seminarDetail/banner/SeminarDetailBannerThumbnail.tsx
@@ -0,0 +1,34 @@
+import React from 'react';
+import GDSCLOGO from '@/svg/seminar/gdsc_logo.svg';
+import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail';
+
+
+/**
+ * @description
+ * 세미나 상세 페이지 배너 썸네일 컴포넌트
+ * @component SeminarDetailBannerThumbnail
+ * @returns {JSX.Element} SeminarDetailBanner
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+
+const SeminarDetailBannerThumbnail = ({ data }: { data: SeminarThumnail }) => {
+ return (
+
+
+
+
GDSC DGU {data.flag}st
+
{data.type}
+
{data.date}
+
+
{data.title}
+
{data.description}
+
+
+ );
+ };
+ export default SeminarDetailBannerThumbnail;
+
\ No newline at end of file
diff --git a/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx b/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx
new file mode 100644
index 0000000..8a9fbde
--- /dev/null
+++ b/src/components/seminar/seminarDetail/header/SeminarDetailHeader.tsx
@@ -0,0 +1,41 @@
+'use client';
+
+import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail';
+import React, { useState } from 'react';
+
+/**
+ * @description
+ * 세미나 상세 페이지 헤더 컴포넌트
+ * @component SeminarDetailHeader
+ * @returns {JSX.Element} SeminarDetailHeader
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarDetailHeader = ({ data }: { data: SeminarThumnail }) => {
+ const [categoryData, setCategoryData] = useState([data.type, `${data.flag}st`, data.topic]);
+
+ return (
+
+
+ {categoryData.map((category, index) => (
+
+ ))}
+
+
+ {data.title}
+
+
+ {data.description}
+
+
+ );
+};
+export default SeminarDetailHeader;
diff --git a/src/components/seminar/seminarDetail/pdf/SeminarDetailPdf.tsx b/src/components/seminar/seminarDetail/pdf/SeminarDetailPdf.tsx
new file mode 100644
index 0000000..c25c176
--- /dev/null
+++ b/src/components/seminar/seminarDetail/pdf/SeminarDetailPdf.tsx
@@ -0,0 +1,24 @@
+import React from 'react';
+import PinImg from '@/svg/seminar/pin.svg';
+
+/**
+ * @description
+ * 세미나 상세 페이지 pdf 다운로드 컴포넌트
+ * @component SeminarDetailPdf
+ * @returns {JSX.Element} SeminarDetailPdf
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarDetailPdf = () => {
+
+ return (
+
+ );
+};
+export default SeminarDetailPdf;
diff --git a/src/components/seminar/seminarDetail/review/SeminalDetailReviewDetail.tsx b/src/components/seminar/seminarDetail/review/SeminalDetailReviewDetail.tsx
new file mode 100644
index 0000000..e6d36bf
--- /dev/null
+++ b/src/components/seminar/seminarDetail/review/SeminalDetailReviewDetail.tsx
@@ -0,0 +1,24 @@
+import { SeminarReview } from '@/interfaces/seminar/seminarReview';
+import React from 'react';
+
+/**
+ * @description
+ * 세미나 상세 페이지 리뷰 디테일 컴포넌트
+ * @component SeminarDetailReviewDetail
+ * @returns {JSX.Element} SeminarDetailReviewDetail
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarDetailReviewDetail = ({ data }: { data: SeminarReview }) => {
+
+ return (
+
+ );
+};
+export default SeminarDetailReviewDetail;
diff --git a/src/components/seminar/seminarDetail/review/SeminarDetailReview.tsx b/src/components/seminar/seminarDetail/review/SeminarDetailReview.tsx
new file mode 100644
index 0000000..8fdda8f
--- /dev/null
+++ b/src/components/seminar/seminarDetail/review/SeminarDetailReview.tsx
@@ -0,0 +1,32 @@
+import { SEMINAR_REVIEW } from '@/constants/seminar/seminarReviewData';
+import React from 'react';
+import SeminarDetailReviewDetail from './SeminalDetailReviewDetail';
+
+/**
+ * @description
+ * 세미나 상세 페이지 리뷰 컴포넌트
+ * @component SeminarDetailReview
+ * @returns {JSX.Element} SeminarDetailReivew
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarDetailReview = () => {
+
+ return (
+
+
+ Review
+
+
+ {SEMINAR_REVIEW.map((review) => (
+
+ ))}
+
+ );
+};
+export default SeminarDetailReview;
diff --git a/src/components/seminar/thumbnail/SeminarThumbnail.tsx b/src/components/seminar/thumbnail/SeminarThumbnail.tsx
new file mode 100644
index 0000000..a716ee8
--- /dev/null
+++ b/src/components/seminar/thumbnail/SeminarThumbnail.tsx
@@ -0,0 +1,58 @@
+import React, { useState } from 'react';
+import GDSCLOGO from '@/svg/seminar/gdsc_logo.svg';
+import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail';
+
+/**
+ * @description
+ * 세미나 페이지 세미나 썸네일 디테일
+ * @component SeminarThumbnail
+ * @returns {JSX.Element} SeminarThumbnail
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarThumbnail = ({ data }: { data: SeminarThumnail }) => {
+ return (
+
+ {/* 왼쪽 컨텐츠 */}
+
+
+
GDSC DGU {data.flag}st
+
{data.type}
+
{data.date}
+
+
{data.title}
+
{data.description}
+
+ {/* 오른쪽 컨텐츠 */}
+
+
+ {data.topic}
+
+
+
+
+ {data.presenter}
+
+
+ {data.flag}st {data.role}
+
+
+
+
+
+ );
+};
+export default SeminarThumbnail;
diff --git a/src/components/seminar/thumbnail/SeminarThumbnailList.tsx b/src/components/seminar/thumbnail/SeminarThumbnailList.tsx
new file mode 100644
index 0000000..5e09964
--- /dev/null
+++ b/src/components/seminar/thumbnail/SeminarThumbnailList.tsx
@@ -0,0 +1,83 @@
+'use client';
+
+import React, { useState } from 'react';
+import { useRouter } from 'next/navigation';
+import SeminarThumbnail from "./SeminarThumbnail";
+import { SEMINAR_DATA } from '@/constants/seminar/seminarData';
+import Link from 'next/link'
+
+/**
+ * @description
+ * 세미나 페이지 세미나 리스트
+ * @component SeminarThumbnailList
+ * @returns {JSX.Element} SeminarThumbnailList
+ * @since 2024.04.18
+ */
+
+
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+
+const SeminarThumbnailList = ({ selectedCategory }: { selectedCategory: string }) => {
+ const router = useRouter();
+ const [currentPage, setCurrentPage] = useState(1);
+ const itemsPerPage = 12; // 한 페이지당 표시할 항목 수
+
+ // topic으로 데이터 필터링
+ const filteredData = selectedCategory !== "all" ? SEMINAR_DATA.filter(seminar => seminar.topic === selectedCategory) : SEMINAR_DATA;
+
+ // 페이지네이션
+ const indexOfLastItem = currentPage * itemsPerPage;
+ const indexOfFirstItem = indexOfLastItem - itemsPerPage;
+ const currentItems = filteredData.slice(indexOfFirstItem, indexOfLastItem);
+
+ // 페이지 번호 계산
+ const pageNumbers = [];
+ for (let i = 1; i <= Math.ceil(SEMINAR_DATA.length / itemsPerPage); i++) {
+ pageNumbers.push(i);
+ }
+
+ // 세미나 리스트 페이지네이션 함수
+ const paginate = (pageNumber: number) => {
+ setCurrentPage(pageNumber);
+ // /seminar/${seminar.id}/page
+ };
+
+
+ return (
+
+ {/* 썸네일 레스트 */}
+
+ {currentItems.map((seminar) => (
+
+
+
+ ))}
+
+ {/* 페이지네이션 버튼 */}
+
+ {pageNumbers.map(number => (
+
+ ))}
+
+
+ );
+ };
+ export default SeminarThumbnailList;
+
\ No newline at end of file
diff --git a/src/components/seminar/toggle/SeminarToggle.tsx b/src/components/seminar/toggle/SeminarToggle.tsx
new file mode 100644
index 0000000..8c83584
--- /dev/null
+++ b/src/components/seminar/toggle/SeminarToggle.tsx
@@ -0,0 +1,48 @@
+'use client';
+
+import React, { useState } from 'react';
+import SeminarToggleMenu from './SeminarToggleMenu';
+import ChervonDownIcon from '@/svg/icons/common/chervon_down.svg';
+import { OPEN_SEMINAR_DATA } from '@/constants/seminar/openSeminarData';
+
+/**
+ * @description
+ * 세미나 페이지 오픈 세미나 토클 버튼
+ * @component SeminarToggle
+ * @returns {JSX.Element} SeminarToggle
+ * @since 2024.04.18
+ */
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarToggle = () => {
+ const [isMenuVisible, setIsMenuVisible] = useState(false); // 오픈 세미나 목록 토클 버튼
+ const toggleMenuVisibility = () => {
+ setIsMenuVisible(!isMenuVisible);
+ };
+
+ return (
+
+
+
+
+
+ {isMenuVisible && (
+
+ {OPEN_SEMINAR_DATA.map((openSeminar) => (
+
+ ))}
+
+ )}
+
+
+ );
+};
+export default SeminarToggle;
diff --git a/src/components/seminar/toggle/SeminarToggleMenu.tsx b/src/components/seminar/toggle/SeminarToggleMenu.tsx
new file mode 100644
index 0000000..39b0d44
--- /dev/null
+++ b/src/components/seminar/toggle/SeminarToggleMenu.tsx
@@ -0,0 +1,32 @@
+/**
+ * @description
+ * 세미나 페이지 오픈 세미나 토클 메뉴
+ * @component SeminarToggleMenu
+ * @returns {JSX.Element} SeminarToggleMenu
+ * @since 2024.04.18
+ */
+
+import { OpenSeminar } from "@/interfaces/seminar/openSeminar";
+
+/**
+ * Renders the header component for the recruitment section.
+ * @returns The rendered header component.
+ */
+const SeminarToggleMenu = ({data}: {data:OpenSeminar}) => {
+ return (
+
+
+
+
{data.opening_date}{" "}{data.type}
+
{data.seminar_date}
+
+
+ {data.status === false ? "종료" : "진행중"}
+
+
+
+
+ );
+};
+export default SeminarToggleMenu;
diff --git a/src/components/sollutionChallenge/header/SolutionChallengeHeader.tsx b/src/components/sollutionChallenge/header/SolutionChallengeHeader.tsx
new file mode 100644
index 0000000..bff4c18
--- /dev/null
+++ b/src/components/sollutionChallenge/header/SolutionChallengeHeader.tsx
@@ -0,0 +1,55 @@
+import BannerImg from '@/images/solution_challenge_banner.png';
+import BannerImg2 from '@/svg/icons/solutionChallenge/solution_challenge_banner2.svg';
+import Link from 'next/link';
+
+/**
+ * @description
+ * 솔루션 챌린지 페이지 헤더 컴포넌트
+ * @component SollutionChallengeHeader
+ * @returns {JSX.Element} SollutionChallengeHeader
+ * @since 2024.04.13
+ */
+/**
+ * Renders the header component for the SollutionChallenge section.
+ * @returns The rendered header component.
+ */
+
+const SolutionChallengeHeader = () => {
+ return (
+
+ {/* */}
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default SolutionChallengeHeader;
diff --git a/src/components/sollutionChallenge/tab/SolutionChallengeTab.tsx b/src/components/sollutionChallenge/tab/SolutionChallengeTab.tsx
new file mode 100644
index 0000000..2e5cc75
--- /dev/null
+++ b/src/components/sollutionChallenge/tab/SolutionChallengeTab.tsx
@@ -0,0 +1,45 @@
+import LightIcon from '@/svg/icons/solutionChallenge/lightIcon.svg';
+
+/**
+ * @description
+ * 솔루션 챌린지 페이지 상단 탭 컴포넌트
+ * @component SollutionChallengeTab
+ * @returns {JSX.Element} SollutionChallengeTab
+ * @since 2024.04.13
+ */
+/**
+ * Renders the Tab component for the SollutionChallenge section.
+ * @returns The rendered Tab component.
+ */
+
+const SolutionChallengeTab = () => {
+ return (
+
+
+
+
+ 2024 Solution Challenge 에서 GDSC DGU의 2팀이 TOP100에 진출했습니다.
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default SolutionChallengeTab;
diff --git a/src/constants/seminar/openSeminarData.ts b/src/constants/seminar/openSeminarData.ts
new file mode 100644
index 0000000..b3c10a3
--- /dev/null
+++ b/src/constants/seminar/openSeminarData.ts
@@ -0,0 +1,26 @@
+import SeoHuiChan from '@/images/seminar/presenter/seohuichan.png';
+import { OpenSeminar } from '@/interfaces/seminar/openSeminar';
+
+export const OPEN_SEMINAR_DATA: OpenSeminar[] = [
+ {
+ id: 1,
+ flag: 1,
+ type: 'Open Seminar',
+ topic: 'DevTalk',
+ opening_date: '2023/5',
+ seminar_date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: `
+ 휴, 하마터면
+ 의사 될 뻔...
+ `,
+ description: `
+ 의사를 목표로 공부를 하다가,
+ 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들
+ `,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ status: false
+ },
+]
\ No newline at end of file
diff --git a/src/constants/seminar/seminarCategory.ts b/src/constants/seminar/seminarCategory.ts
new file mode 100644
index 0000000..7f7305b
--- /dev/null
+++ b/src/constants/seminar/seminarCategory.ts
@@ -0,0 +1,9 @@
+import { SeminarCategory } from "@/interfaces/seminar/seminarCategory";
+
+export const SEMINAR_CATEGORYS: SeminarCategory[] = [
+ { label: 'ALL', value: 'all' },
+ { label: 'DevTalk', value: 'DevTalk' },
+ { label: 'Web/App', value: 'Web/App' },
+ { label: 'Server/Cloud', value: 'Server/Cloud' },
+ { label: 'AI/ML', value: 'AI/ML' },
+ ];
\ No newline at end of file
diff --git a/src/constants/seminar/seminarData.ts b/src/constants/seminar/seminarData.ts
new file mode 100644
index 0000000..38f4c31
--- /dev/null
+++ b/src/constants/seminar/seminarData.ts
@@ -0,0 +1,193 @@
+import SeoHuiChan from '@/images/seminar/presenter/seohuichan.png';
+import { SeminarThumnail } from '@/interfaces/seminar/seminarThumbnail';
+
+export const SEMINAR_DATA: SeminarThumnail[] = [
+ {
+ id: 1,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: `
+ 휴, 하마터면
+ 의사 될 뻔...
+ `,
+ description: `
+ 의사를 목표로 공부를 하다가,
+ 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들
+ `,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 2,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 3,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 4,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 5,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 6,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 7,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 8,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 9,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 10,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 11,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 12,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 13,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+ {
+ id: 14,
+ flag: 1,
+ type: 'Camping Seminar',
+ topic: 'DevTalk',
+ date: '2023.09.22 (FRI) 19:30',
+ location: '동국대학교 원흥관 PBL',
+ title: '휴, 하마터면\n의사 될 뻔...',
+ description: `의사를 목표로 공부를 하다가, 프로그래밍을 시작한 과정들을 토대로 개발 공부를 하며 깨달은 것들`,
+ presenter: '서희찬',
+ role: 'Lead',
+ profile_image_url: SeoHuiChan.src,
+ },
+]
\ No newline at end of file
diff --git a/src/constants/seminar/seminarReviewData.ts b/src/constants/seminar/seminarReviewData.ts
new file mode 100644
index 0000000..c2d0397
--- /dev/null
+++ b/src/constants/seminar/seminarReviewData.ts
@@ -0,0 +1,59 @@
+import { SeminarReview } from "@/interfaces/seminar/seminarReview";
+
+export const SEMINAR_REVIEW: SeminarReview[] = [
+ {
+ id: 1,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 2,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 3,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 4,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 5,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 6,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 7,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 8,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 9,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 10,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ {
+ id: 11,
+ author: '사람 이름',
+ content: '리뷰 내용~ \n 리뷰 내용~'
+ },
+ ];
\ No newline at end of file
diff --git a/src/interfaces/seminar/openSeminar.ts b/src/interfaces/seminar/openSeminar.ts
new file mode 100644
index 0000000..e619caa
--- /dev/null
+++ b/src/interfaces/seminar/openSeminar.ts
@@ -0,0 +1,16 @@
+export interface OpenSeminar {
+ id: number;
+ flag: number;
+ type: string;
+ topic: string;
+ opening_date: string;
+ seminar_date: string;
+ location: string;
+ title: string;
+ description: string;
+ presenter: string;
+ role: string;
+ profile_image_url: string;
+ status: boolean;
+}
+
\ No newline at end of file
diff --git a/src/interfaces/seminar/seminarCategory.ts b/src/interfaces/seminar/seminarCategory.ts
new file mode 100644
index 0000000..b595693
--- /dev/null
+++ b/src/interfaces/seminar/seminarCategory.ts
@@ -0,0 +1,5 @@
+export interface SeminarCategory {
+ label: string;
+ value: string;
+}
+
\ No newline at end of file
diff --git a/src/interfaces/seminar/seminarReview.ts b/src/interfaces/seminar/seminarReview.ts
new file mode 100644
index 0000000..191cc5f
--- /dev/null
+++ b/src/interfaces/seminar/seminarReview.ts
@@ -0,0 +1,6 @@
+export interface SeminarReview {
+ id: number;
+ author: string;
+ content: string;
+}
+
\ No newline at end of file
diff --git a/src/interfaces/seminar/seminarThumbnail.ts b/src/interfaces/seminar/seminarThumbnail.ts
new file mode 100644
index 0000000..7160158
--- /dev/null
+++ b/src/interfaces/seminar/seminarThumbnail.ts
@@ -0,0 +1,14 @@
+export interface SeminarThumnail {
+ id: number;
+ flag: number;
+ type: string;
+ topic: string;
+ date: string;
+ location: string;
+ title: string;
+ description: string;
+ presenter: string;
+ role: string;
+ profile_image_url: string;
+}
+
\ No newline at end of file