diff --git a/next.config.ts b/next.config.ts index 26f5d74..fdc0334 100644 --- a/next.config.ts +++ b/next.config.ts @@ -10,6 +10,7 @@ const nextConfig: NextConfig = { ignoreBuildErrors: false, }, images: { + formats: ['image/avif', 'image/webp'], remotePatterns: [ { protocol: 'https', diff --git a/public/landing/landing-story-thumbnail.png b/public/landing/landing-story-thumbnail.png deleted file mode 100644 index 9de72a8..0000000 Binary files a/public/landing/landing-story-thumbnail.png and /dev/null differ diff --git a/public/landing/landing-story-thumbnail.webp b/public/landing/landing-story-thumbnail.webp new file mode 100644 index 0000000..d19f4a2 Binary files /dev/null and b/public/landing/landing-story-thumbnail.webp differ diff --git a/public/landing/opening-poster.webp b/public/landing/opening-poster.webp new file mode 100644 index 0000000..22ac4ff Binary files /dev/null and b/public/landing/opening-poster.webp differ diff --git a/src/app/head.tsx b/src/app/head.tsx new file mode 100644 index 0000000..6669ee7 --- /dev/null +++ b/src/app/head.tsx @@ -0,0 +1,7 @@ +export default function Head() { + return ( + <> + + + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 2fb4aba..f7c3aaa 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,16 +1,28 @@ +import dynamic from 'next/dynamic'; import { Header } from '@/shared/components/layout'; import { HeaderActions } from '@/composite/landing/headerAction'; import { IntroSection } from '@/composite/landing/intro'; -import { QuestioningSection } from '@/composite/landing/questioning'; -import { SuggestionSection } from '@/composite/landing/suggestion'; -import { StoryVideoSection } from '@/composite/landing/storyVideo'; -import { AddGoalFeatureSection } from '@/composite/landing/addGoal'; -import { ManageTodoFeatureSection } from '@/composite/landing/manageTodo'; -import { GoalAdviceFeatureSection } from '@/composite/landing/goalAdvice'; -import { CollectPlanetFeatureSection } from '@/composite/landing/collectPlanet'; -import { FundingDiscountSection } from '@/composite/landing/fundingDiscount'; -import { LaunchSection } from '@/composite/landing/launch'; -import DonationSection from '@/composite/landing/DonationSection'; + +const QuestioningSection = dynamic(() => import('@/composite/landing/questioning').then(mod => mod.QuestioningSection)); +const SuggestionSection = dynamic(() => import('@/composite/landing/suggestion').then(mod => mod.SuggestionSection)); +const StoryVideoSection = dynamic(() => import('@/composite/landing/storyVideo').then(mod => mod.StoryVideoSection)); +const AddGoalFeatureSection = dynamic(() => + import('@/composite/landing/addGoal').then(mod => mod.AddGoalFeatureSection) +); +const ManageTodoFeatureSection = dynamic(() => + import('@/composite/landing/manageTodo').then(mod => mod.ManageTodoFeatureSection) +); +const GoalAdviceFeatureSection = dynamic(() => + import('@/composite/landing/goalAdvice').then(mod => mod.GoalAdviceFeatureSection) +); +const CollectPlanetFeatureSection = dynamic(() => + import('@/composite/landing/collectPlanet').then(mod => mod.CollectPlanetFeatureSection) +); +const FundingDiscountSection = dynamic(() => + import('@/composite/landing/fundingDiscount').then(mod => mod.FundingDiscountSection) +); +const LaunchSection = dynamic(() => import('@/composite/landing/launch').then(mod => mod.LaunchSection)); +const DonationSection = dynamic(() => import('@/composite/landing/DonationSection').then(mod => mod.default)); export default function LandingPage() { return ( diff --git a/src/composite/landing/DonationSection/DonationImage.tsx b/src/composite/landing/DonationSection/DonationImage.tsx index 5cc0060..5fccc40 100644 --- a/src/composite/landing/DonationSection/DonationImage.tsx +++ b/src/composite/landing/DonationSection/DonationImage.tsx @@ -39,6 +39,7 @@ export const DonationImage = () => { sizes="(max-width: 768px) 200px, 350px" className="w-50 md:w-87.5 h-auto shrink-0" alt="donation-section-image" + loading="lazy" /> diff --git a/src/composite/landing/addGoal/index.tsx b/src/composite/landing/addGoal/index.tsx index 70000c9..6c8778d 100644 --- a/src/composite/landing/addGoal/index.tsx +++ b/src/composite/landing/addGoal/index.tsx @@ -35,6 +35,7 @@ export const AddGoalFeatureSection = () => { sizes="(max-width: 768px) 200px, 350px" className="w-50 md:w-87.5 h-auto shrink-0" alt="fifth-section-image" + loading="lazy" /> diff --git a/src/composite/landing/collectPlanet/index.tsx b/src/composite/landing/collectPlanet/index.tsx index 5459dc6..4727a08 100644 --- a/src/composite/landing/collectPlanet/index.tsx +++ b/src/composite/landing/collectPlanet/index.tsx @@ -34,6 +34,7 @@ export const CollectPlanetFeatureSection = () => { sizes="(max-width: 768px) 200px, 350px" className="w-50 md:w-87.5 h-auto shrink-0" alt="eighth-section-image" + loading="lazy" /> diff --git a/src/composite/landing/constants.ts b/src/composite/landing/constants.ts index 01d4c3f..8e5102c 100644 --- a/src/composite/landing/constants.ts +++ b/src/composite/landing/constants.ts @@ -9,7 +9,7 @@ const LandingPageCommonStyle = { transition: { duration: 0.8, ease: 'easeOut' }, }, left: { - initial: { opcity: 0, x: -40 }, + initial: { opacity: 0, x: -40 }, whileInView: { opacity: 1, x: 0 }, viewport: { once: true, amount: 0.3 }, transition: { duration: 0.8, ease: 'easeOut' }, diff --git a/src/composite/landing/fundingDiscount/index.tsx b/src/composite/landing/fundingDiscount/index.tsx index c6f661e..f5813ce 100644 --- a/src/composite/landing/fundingDiscount/index.tsx +++ b/src/composite/landing/fundingDiscount/index.tsx @@ -31,6 +31,8 @@ export const FundingDiscountSection = () => { height={400} sizes="(max-width: 768px) 300px 200px" alt="character-key-ring-image" + className="w-75 md:w-125 h-auto shrink-0" + loading="lazy" /> diff --git a/src/composite/landing/goalAdvice/index.tsx b/src/composite/landing/goalAdvice/index.tsx index c866753..22af359 100644 --- a/src/composite/landing/goalAdvice/index.tsx +++ b/src/composite/landing/goalAdvice/index.tsx @@ -35,6 +35,7 @@ export const GoalAdviceFeatureSection = () => { sizes="(max-width: 768px) 200px, 350px" className="w-50 md:w-87.5 h-auto shrink-0" alt="seventh-section-image" + loading="lazy" /> diff --git a/src/composite/landing/intro/index.tsx b/src/composite/landing/intro/index.tsx index 7df8c6b..1fc1bd5 100644 --- a/src/composite/landing/intro/index.tsx +++ b/src/composite/landing/intro/index.tsx @@ -13,7 +13,8 @@ export const IntroSection = () => { autoPlay muted loop - preload="auto" + preload="none" + poster="/landing/opening-poster.webp" className="w-full h-full object-cover" > @@ -21,7 +22,9 @@ export const IntroSection = () => { {/* 오버레이 (그라디언트) */}
-
+

그로잇으로 너의 인생이 바뀔거야 diff --git a/src/composite/landing/launch/index.tsx b/src/composite/landing/launch/index.tsx index 28b953f..e18db13 100644 --- a/src/composite/landing/launch/index.tsx +++ b/src/composite/landing/launch/index.tsx @@ -24,12 +24,14 @@ export const LaunchSection = () => {
{/* 배경 & 오버레이 */}
-
+
- app-logo + app-logo

2월 APP 런칭

diff --git a/src/composite/landing/manageTodo/index.tsx b/src/composite/landing/manageTodo/index.tsx index 66b9bac..99d48c0 100644 --- a/src/composite/landing/manageTodo/index.tsx +++ b/src/composite/landing/manageTodo/index.tsx @@ -35,6 +35,7 @@ export const ManageTodoFeatureSection = () => { sizes="(max-width: 768px) 200px, 350px" className="w-50 md:w-87.5 h-auto shrink-0" alt="sixth-section-image" + loading="lazy" />
diff --git a/src/composite/landing/questioning/index.tsx b/src/composite/landing/questioning/index.tsx index c5b0c2e..228c714 100644 --- a/src/composite/landing/questioning/index.tsx +++ b/src/composite/landing/questioning/index.tsx @@ -29,6 +29,7 @@ export const QuestioningSection = () => { sizes="(max-width: 768px) 230px, 260px" className="w-57.5 md:w-97.75 h-auto shrink-0" alt="second-section-image" + loading="lazy" />
diff --git a/src/composite/landing/storyVideo/StoryVideo.tsx b/src/composite/landing/storyVideo/StoryVideo.tsx index 003f22a..1718ebf 100644 --- a/src/composite/landing/storyVideo/StoryVideo.tsx +++ b/src/composite/landing/storyVideo/StoryVideo.tsx @@ -22,6 +22,7 @@ export const StoryVideo = () => { preload="metadata" playsInline muted + poster="/landing/landing-story-thumbnail.webp" className="aspect-video lg:block rounded-lg" /> diff --git a/src/composite/landing/suggestion/index.tsx b/src/composite/landing/suggestion/index.tsx index 1187b5c..94b662b 100644 --- a/src/composite/landing/suggestion/index.tsx +++ b/src/composite/landing/suggestion/index.tsx @@ -29,6 +29,7 @@ export const SuggestionSection = () => { sizes="(max-width: 768px) 205px, 356px" className="w-51.25 md:w-89 h-auto shrink-0" alt="third-section-image" + loading="lazy" />