diff --git a/components/common/Header/index.tsx b/components/common/Header/index.tsx index eb46d49..69652e6 100644 --- a/components/common/Header/index.tsx +++ b/components/common/Header/index.tsx @@ -10,6 +10,8 @@ import { Hamburger, YappLogo } from 'public/assets/icons'; import { ReactElement, useEffect, useRef } from 'react'; import styled from 'styled-components'; import media from 'styles/media'; +import Button from '../Button'; +import { NEXT_GENERATION_RECRUIT_LINK } from 'database/recruit'; function Header(): ReactElement { const { asPath } = useRouter(); @@ -46,6 +48,17 @@ function Header(): ReactElement { {name} ))} + @@ -109,5 +122,9 @@ const MobileHeaderMenu = styled(Hamburger)` cursor: pointer; } `; +const ButtonText = styled.span` + color: white; + font-size: 1.6rem; +`; export default Header; diff --git a/components/home/Dday/index.tsx b/components/home/Dday/index.tsx new file mode 100644 index 0000000..ee1a3f6 --- /dev/null +++ b/components/home/Dday/index.tsx @@ -0,0 +1,138 @@ +import { Box } from 'components/common'; +import { ReactElement, useEffect, useState } from 'react'; +import styled from 'styled-components'; +import media from 'styles/media'; + +function Dday(): ReactElement { + const [timeLeft, setTimeLeft] = useState({ + days: 0, + hours: 0, + mins: 0, + secs: 0, + }); + useEffect(() => { + const interval = setInterval(() => { + const today = new Date(); + const targetDate = new Date('2025-04-10'); // 채용 시작 날짜 + const diffTime = targetDate.getTime() - today.getTime(); + + const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24)); + const diffHours = Math.floor( + (diffTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60), + ); + const diffMinutes = Math.floor( + (diffTime % (1000 * 60 * 60)) / (1000 * 60), + ); + const diffSeconds = Math.floor((diffTime % (1000 * 60)) / 1000); + + setTimeLeft({ + days: diffDays, + hours: diffHours, + mins: diffMinutes, + secs: diffSeconds, + }); + + if (diffTime <= 0) { + clearInterval(interval); + } + }, 1000); + + return () => clearInterval(interval); + }, []); + + return ( + + + {timeLeft.days} + DAYS + + : + + + {timeLeft.hours} + HOURS + + : + + + {timeLeft.mins} + MINS + + : + + {timeLeft.secs} + SECS + + + ); +} + +const DdayContainer = styled.div` + position: relative; + display: flex; + gap: 12px; +`; +const StyledBox = styled(Box)` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + ${media.tablet} { + width: 151.75px; + height: 147px; + } + ${media.mobile} { + width: 64.75px; + height: 81px; + } +`; +const TimeSpan = styled.span` + color: ${({ theme }) => theme.palette.blue_100}; + font-weight: 700; + font-size: 6rem; + ${media.mobile} { + font-size: 2.4rem; + } +`; +const TimeText = styled.span` + color: ${({ theme }) => theme.palette.grey_400}; + font-weight: 600; + font-size: 2.6rem; + ${media.mobile} { + font-size: 1.5rem; + } +`; +const Dot = styled.div` + width: 17px; + color: ${({ theme }) => theme.palette.white}; + font-size: 6rem; + font-weight: 600; + line-height: 160%; + display: flex; + align-items: center; + margin: 0 0.4rem; + ${media.mobile} { + font-size: 2.4rem; + } +`; +export default Dday; diff --git a/components/home/IntroSection/Banner26th.tsx b/components/home/IntroSection/Banner26th.tsx new file mode 100644 index 0000000..58e414f --- /dev/null +++ b/components/home/IntroSection/Banner26th.tsx @@ -0,0 +1,172 @@ +import { Box, Button } from 'components/common'; +import { useEffect, useState } from 'react'; +import styled from 'styled-components'; +import media from 'styles/media'; +import Dday from '../Dday'; +import YappuLogo from 'public/assets/images/26th/illust_mini.svg'; +import { NEXT_GENERATION_RECRUIT_LINK } from 'database/recruit'; + +const Banner26th = () => { + const [mounted, setMounted] = useState(false); + useEffect(() => { + setMounted(true); + }, []); + + return ( + <> + + + + 탐색을 넘어 세상을 넓혀가는 +

+ 26기의 주인공이 +
+ 되어주세요 +

+ 4.10 (목) - 4.20 (일) +
+ + (window.location.href = NEXT_GENERATION_RECRUIT_LINK)} + > + ⏰ 26기 모집 알림 신청하기 + +
+ ; + + ); +}; +export default Banner26th; + +const BannerBackgroundInner = styled.div` + width: 100%; + height: 100%; + margin: 0 auto; + display: flex; + justify-content: center; + align-items: center; + background: url('/assets/images/26th/banner-pc.png'), + linear-gradient(#bdeaff, #67b2ff); + transform: scale(0.8); + opacity: 0; + transition: transform 2s ease, opacity 2s ease; + + &.appear { + transform: scale(1); + opacity: 1; + } + + background-size: cover; + background-repeat: no-repeat; + background-position: center center; + + ${media.mobile} { + background: url('/assets/images/26th/banner-tablet.png'), + linear-gradient(#bdeaff, #67b2ff); + background-size: cover; + background-repeat: no-repeat; + background-position: center center; + } + + ${media.small} { + background: url('/assets/images/26th/banner-mobile.png'), + linear-gradient(#bdeaff, #67b2ff); + background-size: cover; + background-repeat: no-repeat; + background-position: center center; + } +`; + +const Banner25thTextContentBox = styled.div` + position: absolute; + top: 10%; + left: 50%; + z-index: 20; + flex: 1; + display: flex; + height: fit-content; + flex-direction: column; + justify-content: center; + align-items: center; + white-space: nowrap; + gap: 8rem; + transition: transform 2s ease, opacity 2s ease; + transform: translate3d(-50%, -2rem, 0); + opacity: 0; + + &.appear { + transform: translate3d(-50%, 0, 0); + opacity: 1; + } +`; + +const BannerTitleBox = styled.div` + display: flex; + gap: 1rem; + height: fit-content; + flex-direction: column; + justify-content: center; + align-items: center; + + & > h3 { + margin: 0; + text-align: center; + font-size: 6.8rem; + font-weight: 700; + line-height: 125%; + letter-spacing: -0.07rem; + color: ${({ theme }) => theme.palette.black}; + } + ${media.mobile} { + & > h3 { + font-size: 3.6rem; + letter-spacing: -0.032rem; + } + } + ${media.small} { + top: 20%; + gap: 1rem; + + & > h3 { + font-size: 2rem; + letter-spacing: -0.032rem; + } + } + + ${media.small} { + gap: 0.8rem; + } +`; +const BannerTitleSpan = styled.span` + color: ${({ theme }) => theme.palette.blue_100}; + font-weight: 600; +`; +const BannerRecruitDateBox = styled.div` + color: ${({ theme }) => theme.palette.grey_700}; + font-weight: 600; + font-size: 2.6rem; + margin-top: 4rem; +`; + +const YappuLogoBox = styled(YappuLogo)``; + +const YappSubTitleBox = styled.div` + font-size: 2.8rem; + color: ${({ theme }) => theme.palette.grey_700}; + margin-top: 1.4rem; + + ${media.small} { + } +`; + +const StyledButton = styled(Button)` + ${media.mobile} { + width: 229px; + height: 59px; + } +`; diff --git a/components/home/IntroSection/index.tsx b/components/home/IntroSection/index.tsx index 53aed5a..cf0c6c3 100644 --- a/components/home/IntroSection/index.tsx +++ b/components/home/IntroSection/index.tsx @@ -3,7 +3,7 @@ import type { MouseEvent, ReactElement } from 'react'; import { useState } from 'react'; import styled from 'styled-components'; import media from 'styles/media'; -import Banner25th from './Banner25th'; +import Banner26th from './Banner26th'; function IntroSection(): ReactElement { const [isHover, setIsHover] = useState(false); @@ -24,14 +24,14 @@ function IntroSection(): ReactElement { onMouseLeave={handleEnter} onMouseMove={handleMove} > - + ); } const IntroSectionContainer = styled.div` - background-color: black; + background: linear-gradient(#bdeaff, #67b2ff); position: relative; display: flex; flex-direction: column; @@ -39,6 +39,9 @@ const IntroSectionContainer = styled.div` align-items: center; width: 100%; height: calc(100vh - 70px); + @media (max-height: 874px) { + height: 110vh; + } ${media.mobile} { height: calc(100vh - 64px); } diff --git a/components/recruit/RecruitBanner/index.tsx b/components/recruit/RecruitBanner/index.tsx index 22b0a9d..382f9e5 100644 --- a/components/recruit/RecruitBanner/index.tsx +++ b/components/recruit/RecruitBanner/index.tsx @@ -4,15 +4,15 @@ import Yapp from 'constants/yapp'; import { IS_RECRUITING, NEXT_GENERATION_RECRUIT_LINK, - RECRUIT_BANNER, - RECRUIT_BANNER_ACTIVE, + RECRUIT_BANNER_PRE, } from 'database/recruit'; import DOMPurify from 'isomorphic-dompurify'; import styled from 'styled-components'; import media from 'styles/media'; function RecruitBanner() { - const BannerInfo = IS_RECRUITING ? RECRUIT_BANNER_ACTIVE : RECRUIT_BANNER; + // const BannerInfo = IS_RECRUITING ? RECRUIT_BANNER_ACTIVE : RECRUIT_BANNER; + const BannerInfo = RECRUIT_BANNER_PRE; const { title, description } = BannerInfo; return ( @@ -38,7 +38,8 @@ function RecruitBanner() { buttonColor="grey_850" borderColor="lightGrey" > - {IS_RECRUITING ? '모든 공고 보기' : '지원마감'} + {/* {IS_RECRUITING ? '모든 공고 보기' : '지원마감'} */} + 모집 알림 신청하기 diff --git a/database/recruit.ts b/database/recruit.ts index eaab5e3..ca9e8a7 100644 --- a/database/recruit.ts +++ b/database/recruit.ts @@ -17,6 +17,11 @@ export const RECRUIT_BANNER = { description: `${Yapp.YAPP_GENERATION}기 모집이 완료되었습니다!
다음 기수는 2025년 4월에 예정되어 있습니다.`, buttonName: `${Number(Yapp.YAPP_GENERATION) + 1}기에서 만나요!`, }; +export const RECRUIT_BANNER_PRE = { + title: 'YAPP 26기 모집 준비 중 🚧', + description: `YAPP 26기에서 6개월간 활동할 기획자(PM)/디자이너/개발자 신입 회원을 모집합니다.
IT 분야에 대한 열정과 의지가 넘쳐나고, 동아리에서 많은 사람들과 즐겁게 활동하고 싶은 분들의 많은 지원 바랍니다!`, + buttonName: '모집 알림 신청하기', +}; export const RECRUIT_BANNER_ACTIVE = { title: `YAPP
${Yapp.YAPP_GENERATION}기 모집`, @@ -26,7 +31,7 @@ export const RECRUIT_BANNER_ACTIVE = { }; export const NEXT_GENERATION_RECRUIT_LINK = - 'https://docs.google.com/forms/d/1Pz_bPLk7olNj45XnakQIB6LNGE9MnaZenzowIQ-mPQ8/viewform?pli=1&pli=1&pli=1&edit_requested=true'; + 'https://forms.gle/Ag7ZHViSHX8m6R3V8'; /** 모집 개요 */ export const RECRUIT_OVERVIEW = { diff --git a/public/assets/images/26th/banner-mobile.png b/public/assets/images/26th/banner-mobile.png new file mode 100644 index 0000000..58a1028 Binary files /dev/null and b/public/assets/images/26th/banner-mobile.png differ diff --git a/public/assets/images/26th/banner-pc.png b/public/assets/images/26th/banner-pc.png new file mode 100644 index 0000000..0cc1fa7 Binary files /dev/null and b/public/assets/images/26th/banner-pc.png differ diff --git a/public/assets/images/26th/banner-tablet.png b/public/assets/images/26th/banner-tablet.png new file mode 100644 index 0000000..53d6e88 Binary files /dev/null and b/public/assets/images/26th/banner-tablet.png differ diff --git a/public/assets/images/26th/illust_mini.svg b/public/assets/images/26th/illust_mini.svg new file mode 100644 index 0000000..22c3606 --- /dev/null +++ b/public/assets/images/26th/illust_mini.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + +