다크 모드
truloop-teaser-web은 truloop의 마케팅 랜딩 페이지입니다. 제품 소개, 기능 설명, FAQ, 앱 다운로드 CTA 등을 포함하는 프로모션 사이트로, 메인 도메인 truloop.app에서 서비스됩니다.
truloop-teaser-web
truloop.app
정보
Teaser는 의도적으로 최소한의 의존성만 사용합니다. Tailwind CSS, 상태 관리 라이브러리, UI 프레임워크 등을 사용하지 않으며, 순수 CSS로 스타일링합니다.
/
/our-story
/privacy
/terms
메인 페이지는 9개 섹션으로 구성된 풀스크린 스크롤 방식입니다.
truloop-teaser-web/ ├── src/ │ ├── app/ │ │ ├── layout.tsx # 루트 레이아웃 (GTM, 폰트) │ │ ├── globals.css # 최소 글로벌 스타일 (@font-face) │ │ ├── page.tsx # 메인 랜딩 (Client Component) │ │ ├── our-story/ │ │ │ ├── layout.tsx # Our Story 레이아웃 │ │ │ └── page.tsx # 브랜드 스토리 페이지 │ │ ├── privacy/page.tsx # 개인정보처리방침 │ │ └── terms/page.tsx # 이용약관 │ ├── components/ │ │ ├── gnb.tsx # 네비게이션 바 (햄버거 메뉴) │ │ └── footer.tsx # 페이지 푸터 │ ├── hooks/ │ │ ├── use-scroll-snap.ts # 풀페이지 스크롤 스냅 │ │ ├── use-feature-stepper.ts # 기능 스텝 탭 자동 재생 │ │ ├── use-gnb-section.ts # GNB 섹션별 색상 전환 │ │ └── use-faq-toggle.ts # FAQ 아코디언 토글 │ └── styles/ │ ├── main.css # 메인 페이지 (다크 테마, 풀페이지) │ ├── our-story.css # Our Story (스크롤 애니메이션) │ └── legal.css # Privacy/Terms (라이트 테마) ├── public/ │ ├── images/ │ │ ├── hero-flow/ # 14장의 Hero 플로잉 이미지 │ │ ├── feature1-4.PNG # 앱 기능 스크린샷 │ │ ├── story1-4.jpg # Our Story 페이지 사진 │ │ └── ... │ └── fonts/ # Oldschool Grotesk woff2 ├── next.config.ts # Rewrite 규칙 (/invite, /story) ├── jest.config.js # Jest 테스트 설정 └── package.json
Google Fonts(Inter, Merriweather, Space Grotesk)는 layout.tsx에서 CDN link 태그로 로드하고, Oldschool Grotesk는 globals.css에서 @font-face로 로컬 woff2 파일을 사용합니다.
Inter
Merriweather
Space Grotesk
layout.tsx
Oldschool Grotesk
globals.css
@font-face
use-gnb-section 훅이 현재 활성 섹션 인덱스에 따라 body에 CSS 클래스를 토글하여 GNB의 밝은/어두운 테마를 전환합니다. 밝은 배경 섹션(How It Works, AI Intelligence, Scheduling Partner, FAQ)에서는 어두운 텍스트/로고를 사용합니다.
use-gnb-section
body
메인 페이지는 CSS scroll-snap을 활용한 섹션별 스크롤을 구현합니다. use-scroll-snap 커스텀 훅이 IntersectionObserver로 현재 활성 섹션을 추적하고, URL 해시를 섹션 앵커와 동기화합니다.
scroll-snap
use-scroll-snap
IntersectionObserver
3개 행의 이미지가 CSS @keyframes(flowScroll, flowScrollReverse)로 연속 스크롤됩니다. 각 행의 이미지 트랙이 복제되어 끊김 없는 루핑 효과를 만듭니다.
@keyframes
flowScroll
flowScrollReverse
4단계 탭 인터페이스가 섹션 진입 시 자동 재생됩니다. use-feature-stepper 훅이 IntersectionObserver로 뷰포트 진입을 감지하고 타이머 기반으로 스텝을 전환합니다.
use-feature-stepper
next.config.ts에서 /invite와 /story(리캡) 경로를 별도 Vercel 배포로 rewrite합니다.
next.config.ts
/invite
/story
// next.config.ts async rewrites() { return [ { source: '/story', destination: 'https://truloop-web-story.vercel.app/story' }, { source: '/story/:path*', destination: 'https://truloop-web-story.vercel.app/story/:path*' }, { source: '/invite', destination: 'https://truloop-web-invite.vercel.app/invite' }, { source: '/invite/:path*', destination: 'https://truloop-web-invite.vercel.app/invite/:path*' }, ]; }
# 의존성 설치 npm install # 개발 서버 (Turbopack) npm run dev # 프로덕션 빌드 npm run build # ESLint npm run lint # 테스트 npm test
이 프로젝트는 환경 변수가 필요하지 않습니다. GTM ID는 코드에 하드코딩되어 있으며, 백엔드 의존성이 없는 완전 정적 사이트입니다.
사이트 콘텐츠는 영어 전용입니다. 다국어 지원이 필요한 경우 Invite 서비스와 동일하게 next-intl 도입을 검토합니다.