diff --git a/src/app/(marketing)/page.tsx b/src/app/(marketing)/page.tsx index 603c4c1..3e575a2 100644 --- a/src/app/(marketing)/page.tsx +++ b/src/app/(marketing)/page.tsx @@ -1,142 +1,11 @@ -"use client"; +import { LandingHeroSection } from "@/components/landing/LandingHeroSection"; -import { SignupGroupButton } from "@/components/SiginupGroupButton"; -import { BackButton } from "@/shared/BackButton"; -import { Button } from "@/shared/button"; -import { FeatureButton } from "@/shared/FeatureButton"; -import { Icon } from "@/shared/Icon"; -import { Input } from "@/shared/input"; -import { SelectModuleCard } from "@/shared/SelectModuleCard"; -import { SpecialFeatureCard } from "@/shared/SpecialFeatureCard"; -import { InputStatus } from "@/types/input"; -import { useState } from "react"; +export const revalidate = 21600; export default function Home() { - const [email, setEmail] = useState(""); - const [status, setStatus] = useState("default"); - const [isReady, setIsReady] = useState(false); - return ( -
- {/* Hero CTA */} -
- - - -
- - } - title="일간" - description="오늘의 일정과 할 일을 한눈에" - /> - - } - title="스마트 스케줄링" - description="AI가 추천하는 최적의 일정 배치로 효율성을 극대화하세요." - /> - - - -
-

에러 상태

-
- - - {/** status: "default" | "error" */} - setEmail(e.target.value)} - status={status} // ✅ cva와 1:1 - placeholder="이메일을 입력하세요" - aria-describedby={status === "error" ? "email-error" : undefined} - onFocus={() => setStatus("default")} - /> - - {status === "error" && ( -

- 이메일 형식을 확인하세요. -

- )} - -
- - -
-
-
- - - - 이전 - - - - - - console.log("일간 플래너 클릭")} - /> - - console.log("일간 플래너 클릭")} - /> -
+ <> + + ); } diff --git a/src/components/landing/LandingFooter.tsx b/src/components/landing/LandingFooter.tsx index 7fecc5b..d55070b 100644 --- a/src/components/landing/LandingFooter.tsx +++ b/src/components/landing/LandingFooter.tsx @@ -32,16 +32,26 @@ export function LandingFooter() {
{/* 제품 컬럼 */} -
+
{/* 로고 블록*/} -
+
{/* 지원 컬럼 */} -
+
diff --git a/src/components/landing/LandingHeroAnimation.tsx b/src/components/landing/LandingHeroAnimation.tsx new file mode 100644 index 0000000..826e116 --- /dev/null +++ b/src/components/landing/LandingHeroAnimation.tsx @@ -0,0 +1,27 @@ +"use client"; + +import { cn } from "@/lib/utils"; + +export function LandingHeroAnimation() { + return ( +
+
+
+
+ ); +} diff --git a/src/components/landing/LandingHeroCtas.tsx b/src/components/landing/LandingHeroCtas.tsx new file mode 100644 index 0000000..8ab3220 --- /dev/null +++ b/src/components/landing/LandingHeroCtas.tsx @@ -0,0 +1,35 @@ +import { cn } from "@/lib/utils"; +import { Button } from "@/shared/button"; +import { Icon } from "@/shared/Icon"; +import Link from "next/link"; + +export function LandingHeroCtas() { + return ( +
+ + + + + + + + + +
+ ); +} diff --git a/src/components/landing/LandingHeroSection.tsx b/src/components/landing/LandingHeroSection.tsx new file mode 100644 index 0000000..8b7df69 --- /dev/null +++ b/src/components/landing/LandingHeroSection.tsx @@ -0,0 +1,25 @@ +import { LandingHeroAnimation } from "@/components/landing/LandingHeroAnimation"; +import { LandingHeroCtas } from "@/components/landing/LandingHeroCtas"; +import { LandingHeroTitle } from "@/components/landing/LandingHeroTitle"; +import { cn } from "@/lib/utils"; +import { LandingHeroSectionProps } from "@/types/landing"; + +export function LandingHeroSection({ className }: LandingHeroSectionProps) { + return ( +
+
+ + +
+ +
+ ); +} diff --git a/src/components/landing/LandingHeroTitle.tsx b/src/components/landing/LandingHeroTitle.tsx new file mode 100644 index 0000000..a3e2ec1 --- /dev/null +++ b/src/components/landing/LandingHeroTitle.tsx @@ -0,0 +1,19 @@ +import { cn } from "@/lib/utils"; + +export function LandingHeroTitle() { + return ( +
+

+ 나만의 데일리 플래너 +
+ PlanMate +

+

+ 원하는 기능만 골라 쓰는 맞춤형 일정 관리 서비스입니다. +

+
+ ); +} diff --git a/src/components/landing/LandingMainSection.tsx b/src/components/landing/LandingMainSection.tsx index a6a4db3..7069e84 100644 --- a/src/components/landing/LandingMainSection.tsx +++ b/src/components/landing/LandingMainSection.tsx @@ -5,7 +5,7 @@ export function LandingMainSection({ children, className }: LandingMainSectionPr return (
{children}
diff --git a/src/components/landing/LandingNavBar.tsx b/src/components/landing/LandingNavBar.tsx index c8a114b..a053e64 100644 --- a/src/components/landing/LandingNavBar.tsx +++ b/src/components/landing/LandingNavBar.tsx @@ -29,7 +29,7 @@ export function LandingNavBar() { type="button" className={cn( "cursor-pointer t-14-m text-[var(--color-gray-600)] hover:text-[var(--color-gray-900)]", - "md: t-16-m", + "md:t-16-m", )} aria-label="언어 전환" > @@ -39,7 +39,7 @@ export function LandingNavBar() { href="/login" className={cn( "t-14-m text-[var(--color-gray-600)] hover:text-[var(--color-gray-900)]", - "md: t-16-m", + "md:t-16-m", )} aria-label="로그인페이지로 이동" > diff --git a/src/styles/globals.css b/src/styles/globals.css index a6061ac..edf1940 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -388,3 +388,235 @@ line-height: 140%; } } + +/* ------------------------------------------------- + 3-1) 타이포그래피 유틸 — md 브레이크포인트 전용 + ------------------------------------------------- */ +@layer utilities { + @media (min-width: 768px) { + /* 8~32px */ + .md\:t-8-m { + font-size: 0.8rem; + font-weight: 500; + } + .md\:t-8-b { + font-size: 0.8rem; + font-weight: 700; + } + + .md\:t-10-m { + font-size: 1rem; + font-weight: 500; + } + .md\:t-10-b { + font-size: 1rem; + font-weight: 700; + } + + .md\:t-12-m { + font-size: 1.2rem; + font-weight: 500; + } + .md\:t-12-b { + font-size: 1.2rem; + font-weight: 700; + } + + .md\:t-14-m { + font-size: 1.4rem; + font-weight: 500; + } + .md\:t-14-b { + font-size: 1.4rem; + font-weight: 700; + } + + .md\:t-16-m { + font-size: 1.6rem; + font-weight: 500; + } + .md\:t-16-b { + font-size: 1.6rem; + font-weight: 700; + } + + .md\:t-18-m { + font-size: 1.8rem; + font-weight: 500; + } + .md\:t-18-b { + font-size: 1.8rem; + font-weight: 700; + } + + .md\:t-20-m { + font-size: 2rem; + font-weight: 500; + } + .md\:t-20-b { + font-size: 2rem; + font-weight: 700; + } + + .md\:t-22-m { + font-size: 2.2rem; + font-weight: 500; + } + .md\:t-22-b { + font-size: 2.2rem; + font-weight: 700; + } + + .md\:t-24-m { + font-size: 2.4rem; + font-weight: 500; + } + .md\:t-24-b { + font-size: 2.4rem; + font-weight: 700; + } + + .md\:t-26-m { + font-size: 2.6rem; + font-weight: 500; + } + .md\:t-26-b { + font-size: 2.6rem; + font-weight: 700; + } + + .md\:t-28-m { + font-size: 2.8rem; + font-weight: 500; + } + .md\:t-28-b { + font-size: 2.8rem; + font-weight: 700; + } + + .md\:t-30-m { + font-size: 3rem; + font-weight: 500; + } + .md\:t-30-b { + font-size: 3rem; + font-weight: 700; + } + + .md\:t-32-m { + font-size: 3.2rem; + font-weight: 500; + } + .md\:t-32-b { + font-size: 3.2rem; + font-weight: 700; + } + + /* 40~60px */ + .md\:t-40-m { + font-size: 4rem; + font-weight: 500; + } + .md\:t-40-b { + font-size: 4rem; + font-weight: 700; + } + + .md\:t-44-m { + font-size: 4.4rem; + font-weight: 500; + } + .md\:t-44-b { + font-size: 4.4rem; + font-weight: 700; + } + + .md\:t-48-m { + font-size: 4.8rem; + font-weight: 500; + } + .md\:t-48-b { + font-size: 4.8rem; + font-weight: 700; + } + + .md\:t-50-m { + font-size: 5rem; + font-weight: 500; + } + .md\:t-50-b { + font-size: 5rem; + font-weight: 700; + } + + .md\:t-54-m { + font-size: 5.4rem; + font-weight: 500; + } + .md\:t-54-b { + font-size: 5.4rem; + font-weight: 700; + } + + .md\:t-58-m { + font-size: 5.8rem; + font-weight: 500; + } + .md\:t-58-b { + font-size: 5.8rem; + font-weight: 700; + } + + .md\:t-60-m { + font-size: 6rem; + font-weight: 500; + } + .md\:t-60-b { + font-size: 6rem; + font-weight: 700; + } + + /* Body scale (+ line-height) */ + .md\:tb-12-m { + font-size: 1.2rem; + font-weight: 500; + line-height: 160%; + } + + .md\:tb-14-m { + font-size: 1.4rem; + font-weight: 500; + line-height: 180%; + } + + .md\:tb-16-m { + font-size: 1.6rem; + font-weight: 500; + line-height: 180%; + } + + .md\:tb-18-b { + font-size: 1.8rem; + font-weight: 700; + line-height: 140%; + } + + .md\:tb-20-b { + font-size: 2rem; + font-weight: 700; + line-height: 160%; + } + + .md\:tb-24-m { + font-size: 2.4rem; + font-weight: 500; + line-height: 160%; + } + + .md\:tb-32-b { + font-size: 3.2rem; + font-weight: 700; + line-height: 140%; + } + } +} diff --git a/src/types/landing.ts b/src/types/landing.ts index 9d99971..cde48ee 100644 --- a/src/types/landing.ts +++ b/src/types/landing.ts @@ -17,3 +17,7 @@ export type LandingMainSectionProps = { children: React.ReactNode; className?: string; }; + +export type LandingHeroSectionProps = { + className?: string; +};