-
Notifications
You must be signed in to change notification settings - Fork 1
Feat(landing): 랜딩페이지 디자인 업데이트 #325
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
64c45b7
f9ccbca
c8a4376
7d0aa4b
c8af1e6
fc4f72c
6283787
d9a9003
48fd655
590ad00
bfa8cca
7658a9a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
This file was deleted.
This file was deleted.
This file was deleted.
Large diffs are not rendered by default.
This file was deleted.
This file was deleted.
This file was deleted.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| import FeatureBookmarkSection from './FeatureBookmarkSection'; | ||
| import FeatureReminderSection from './FeatureReminderSection'; | ||
| import FeatureRewardSection from './FeatureRewardSection'; | ||
| import FinalCTASection from './FinalCTASection'; | ||
| import HeroSection from './HeroSection'; | ||
| import ShareBookmarkSection from './ShareBookmarkSection'; | ||
|
|
||
| const Contents = () => { | ||
| return ( | ||
| <> | ||
| <HeroSection /> | ||
| <ShareBookmarkSection /> | ||
| <FeatureBookmarkSection /> | ||
| <FeatureReminderSection /> | ||
| <FeatureRewardSection /> | ||
| <FinalCTASection /> | ||
| </> | ||
| ); | ||
| }; | ||
|
|
||
| export default Contents; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| import Bookmark from '../../assets/Bookmark.png'; | ||
|
|
||
| const FeatureBookmarkSection = () => { | ||
| return ( | ||
| <section className="flex h-dvh snap-start items-center justify-center bg-white"> | ||
| <div className="flex items-start gap-[7rem]"> | ||
| {/* 글씨 영역 */} | ||
| <div className="flex flex-col items-start gap-[2.4rem] pl-[3rem] pt-[14rem] text-left"> | ||
| <p className="head1">손쉽게 북마크하고 메모까지</p> | ||
| <p className="sub2-sb text-font-gray-3"> | ||
| 기억에 남기고 싶은 정보를 <br /> | ||
| 빠르게 북마크하세요. | ||
| </p> | ||
| </div> | ||
|
|
||
| {/* 이미지 영역 */} | ||
| <div className="flex items-center justify-center"> | ||
| <img | ||
| src={Bookmark} | ||
| alt="Bookmark 기능 이미지" | ||
| width={447} | ||
| height={490} | ||
| /> | ||
| </div> | ||
| </div> | ||
| </section> | ||
| ); | ||
| }; | ||
|
|
||
| export default FeatureBookmarkSection; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| import Remind from '../../assets/Remind.svg'; | ||
|
|
||
| const FeatureReminderSection = () => { | ||
| return ( | ||
| <section className="flex h-dvh snap-start items-center justify-center bg-white"> | ||
| <div className="flex items-start gap-[7rem]"> | ||
| {/* 이미지 영역 */} | ||
| <div className="flex items-center justify-center"> | ||
| <img src={Remind} alt="Remind 기능 이미지" /> | ||
| </div> | ||
| {/* 글씨 영역 */} | ||
| <div className="relative flex flex-1 flex-col items-end pr-[10rem] pt-[5rem] text-right"> | ||
| <h1 className="head1 text-font-black mb-[2.4rem]"> | ||
| 잊지 않도록 리마인드 | ||
| </h1> | ||
| <p className="sub2-sb text-font-gray-3"> | ||
| 첫 실행 시 리마인드 주기를 설정해 놓치지 않고 | ||
| <br /> | ||
| 읽을 수 있어요. | ||
| </p> | ||
| </div> | ||
| </div> | ||
| </section> | ||
| ); | ||
| }; | ||
|
|
||
| export default FeatureReminderSection; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,26 @@ | ||
| import Dotori from '../../assets/Dotori.svg'; | ||
|
|
||
| const FeatureRewardSection = () => { | ||
| return ( | ||
| <section className="flex h-dvh snap-start items-center justify-center bg-white"> | ||
| <div className="flex items-start gap-[24rem]"> | ||
| {/* 글씨 영역 */} | ||
| <div className="flex flex-col items-start gap-[2.4rem] pl-[3rem] pt-[14rem] text-left"> | ||
| <h1 className="head1">도토리 보상 루프</h1> | ||
| <p className="sub2-sb text-font-gray-3"> | ||
| 내가 저장했던 지식을 활용할 때마다 | ||
| <br /> | ||
| 도토리를 모아 성장해보세요. | ||
| </p> | ||
| </div> | ||
|
|
||
| {/* 이미지 영역 */} | ||
| <div className="flex items-center justify-center"> | ||
| <img src={Dotori} alt="도토리 수집 보상 이미지" /> | ||
| </div> | ||
| </div> | ||
| </section> | ||
| ); | ||
| }; | ||
|
|
||
| export default FeatureRewardSection; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,31 @@ | ||
| import JobBookmark from '../../assets/JobBookmark.svg'; | ||
|
|
||
| const ShareBookmarkSection = () => { | ||
| return ( | ||
| <section className="flex h-dvh snap-start items-center justify-center bg-white"> | ||
| <div className="flex items-start gap-[7rem]"> | ||
| {/* 이미지 영역 */} | ||
| <div className="flex items-center justify-center"> | ||
| <img src={JobBookmark} alt="북마크 공유 기능 이미지" /> | ||
| </div> | ||
| {/* 글씨 영역 */} | ||
| <div className="relative flex flex-1 flex-col items-end pr-[10rem] pt-[5rem] text-right"> | ||
| <div className="bg-main500 sub3-sb text-white-bg inline-flex items-center gap-[0.8rem] rounded-full px-[1.6rem] py-[0.8rem]"> | ||
| <span>새 기능이 출시됐어요!</span> | ||
| </div> | ||
|
|
||
| <h1 className="head1 text-font-black mb-[2.4rem] mt-[1.6rem]"> | ||
| 나와 같은 IT 분야 사람들이 | ||
| <br /> | ||
| 저장한 글을 확인해요 | ||
| </h1> | ||
| <p className="sub2-sb text-font-gray-3"> | ||
| 유용한 정보나 아티클을 쉽게 추천받을 수 있어요 | ||
| </p> | ||
| </div> | ||
| </div> | ||
| </section> | ||
| ); | ||
| }; | ||
|
|
||
| export default ShareBookmarkSection; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,41 @@ | ||
| import { RefObject, useEffect } from 'react'; | ||
|
|
||
| export const useKeyboardScroll = <T extends HTMLElement>( | ||
| scrollRef: RefObject<T | null> | ||
| ) => { | ||
| useEffect(() => { | ||
| const handleKeyDown = (e: KeyboardEvent) => { | ||
| const container = scrollRef.current; | ||
| if (!container) return; | ||
|
|
||
| const activeElement = document.activeElement as HTMLElement; | ||
| const isInputFocused = | ||
| ['INPUT', 'TEXTAREA', 'SELECT', 'BUTTON', 'A'].includes( | ||
| activeElement.tagName | ||
| ) || activeElement.isContentEditable; | ||
|
|
||
| if (isInputFocused) return; | ||
|
|
||
| const pageHeight = window.innerHeight; | ||
|
|
||
| switch (e.key) { | ||
| case 'ArrowDown': | ||
| case 'PageDown': | ||
| case ' ': | ||
| e.preventDefault(); | ||
| container.scrollBy({ top: pageHeight, behavior: 'smooth' }); | ||
| break; | ||
| case 'ArrowUp': | ||
| case 'PageUp': | ||
| e.preventDefault(); | ||
| container.scrollBy({ top: -pageHeight, behavior: 'smooth' }); | ||
| break; | ||
| default: | ||
| break; | ||
| } | ||
| }; | ||
|
|
||
| window.addEventListener('keydown', handleKeyDown); | ||
| return () => window.removeEventListener('keydown', handleKeyDown); | ||
| }, [scrollRef]); | ||
| }; | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shift+Space와 반복 입력을 처리하지 않아 페이지 전환이 과하게 발생할 수 있습니다.지금 구현은
Space를 항상 아래로만 보내서 기본 브라우저 동작인Shift+Space위로 이동을 깨고,keydown반복도 그대로 받아서 키를 길게 누르면 여러 섹션이 연속으로 넘어갑니다. PR 목표가 “브라우저 표준 동작 + 한 페이지씩 전환”이라면 여기서 방향과 반복을 같이 제어해야 합니다.🔧 제안 수정안
📝 Committable suggestion
🤖 Prompt for AI Agents