+ {/* Cards Container */}
+
+ {supportCards.map((card, index) => (
+
+ ))}
+
+
+ {/* Application Card */}
+
+
+
+
+ 후원 신청하기
+
+
+ 아래 구글폼을 통해 후원에 필요한 정보를 입력해 주세요.
+
+ 제출하신 정보는 내부 검토 후, 후원 방법에 대해 안내드리겠습니다.
+
+
+
+
+
+
+
+ );
+};
+
+export default SupportCards;
\ No newline at end of file
diff --git a/src/components/Timeline/Timeline.tsx b/src/components/Timeline/Timeline.tsx
new file mode 100644
index 0000000..a6c1e7a
--- /dev/null
+++ b/src/components/Timeline/Timeline.tsx
@@ -0,0 +1,155 @@
+import React, { useState, useEffect } from 'react';
+import { IoIosArrowBack, IoIosArrowForward } from 'react-icons/io';
+import { AboutSectionTitle } from '../AboutSection';
+
+const Timeline = () => {
+ const [currentSlide, setCurrentSlide] = useState(0);
+ const [slidesToShow, setSlidesToShow] = useState(1);
+
+ const events = [
+ {
+ year: 24,
+ month: 'SEP',
+ title: 'HelloPY 탄생',
+ description: '파이몬 생일\nDiscord, Instagram, Youtube 개설',
+ position: 'right'
+ },
+
+ {
+ year: 24,
+ month: 'OCT',
+ title: '컨퍼런스 & 파이콘',
+ description: 'HelloPY 컨퍼런스 VOL.1\n파이콘 한국 2024 부스 운영\nDiscord User 100명 달성',
+ position: 'left'
+ },
+ {
+ year: 24,
+ month: 'NOV',
+ title: '제1회 OnOFF 모각클',
+ description: "'모여서 각자 작업하는 모임'\n매주 2회 대면/비대면 활동 개최",
+ position: 'right'
+ },
+ {
+ year: 24,
+ month: 'DEC',
+ title: '파이콘 공유회',
+ description: '월드와이드 파이콘 공유회\nLinkedIn 개설',
+ position: 'left'
+ },
+ {
+ year: 25,
+ month: 'MAR',
+ title: '홈페이지 리뉴얼',
+ description: 'HelloPY 공식 홈페이지 제작',
+ position: 'right'
+ },
+ ];
+
+ useEffect(() => {
+ const handleResize = () => {
+ if (window.innerWidth >= 1024) { // lg breakpoint
+ setSlidesToShow(3);
+ } else if (window.innerWidth >= 768) { // md breakpoint
+ setSlidesToShow(2);
+ } else {
+ setSlidesToShow(1);
+ }
+ };
+
+ handleResize(); // 초기 설정
+ window.addEventListener('resize', handleResize);
+ return () => window.removeEventListener('resize', handleResize);
+ }, []);
+
+ const handlePrevSlide = () => {
+ setCurrentSlide((prev) => (prev > 0 ? prev - 1 : events.length - slidesToShow));
+ };
+
+ const handleNextSlide = () => {
+ setCurrentSlide((prev) => (prev < events.length - slidesToShow ? prev + 1 : 0));
+ };
+
+ const isFirstSlide = currentSlide === 0;
+ const isLastSlide = currentSlide >= events.length - slidesToShow;
+
+ return (
+