Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/app/(marketing)/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { LandingFeaturesSection2 } from "@/components/landing/LandingFeatureSection2";
import { LandingFeaturesSection1 } from "@/components/landing/LandingFeaturesSection1";
import { LandingHeroSection } from "@/components/landing/LandingHeroSection";
import { LandingSpecialFeaturesSection } from "@/components/landing/LandingSpecialFeaturesSection";

export const revalidate = 21600;

Expand All @@ -10,6 +11,7 @@ export default function Home() {
<LandingHeroSection />
<LandingFeaturesSection1 />
<LandingFeaturesSection2 />
<LandingSpecialFeaturesSection />
</>
);
}
20 changes: 4 additions & 16 deletions src/components/landing/LandingFooter.tsx
Original file line number Diff line number Diff line change
@@ -1,27 +1,15 @@
import { PRODUCTLINKS, SUPPORTLINKS } from "@/lib/constants";
import { cn } from "@/lib/utils";
import { FooterLink } from "@/types/landing";
import Image from "next/image";
import Link from "next/link";
import { LandingCopyright } from "./LandingCopyright";
import { LandingFooterColumn } from "./LandingFooterColumn";

export function LandingFooter() {
const productLinks: FooterLink[] = [
{ label: "๊ธฐ๋Šฅ ์†Œ๊ฐœ", href: "/features" },
{ label: "์š”๊ธˆ์ œ", href: "/pricing" },
{ label: "์—…๋ฐ์ดํŠธ", href: "/changelog" },
];

const supportLinks: FooterLink[] = [
{ label: "FAQ", href: "/faq" },
{ label: "๋ฌธ์˜ํ•˜๊ธฐ", href: "/support" },
{ label: "๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ", href: "/privacy" },
];

return (
<footer
role="contentinfo"
className="border-t border-[var(--color-gray-100)] bg-[var(--color-gray-50)] text-[var(--color-gray-600)]"
className="border-t border-[var(--color-gray-100)] bg-[var(--color-gray-50)] text-[var(--color-gray-600)] mt-30"
>
<div
className={cn(
Expand All @@ -42,7 +30,7 @@ export function LandingFooter() {
"md:row-auto md:justify-self-start",
)}
>
<LandingFooterColumn title="์ œํ’ˆ" links={productLinks} />
<LandingFooterColumn title="์ œํ’ˆ" links={PRODUCTLINKS} />
</div>

{/* ๋กœ๊ณ  ๋ธ”๋ก*/}
Expand Down Expand Up @@ -78,7 +66,7 @@ export function LandingFooter() {
"md:row-auto md:justify-self-end",
)}
>
<LandingFooterColumn title="์ง€์›" links={supportLinks} />
<LandingFooterColumn title="์ง€์›" links={SUPPORTLINKS} />
</div>
</div>

Expand Down
4 changes: 2 additions & 2 deletions src/components/landing/LandingMainSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ export function LandingMainSection({ children, className }: LandingMainSectionPr
id="landing-main"
className={cn(
"mx-auto w-full max-w-[128rem] px-6 mt-30",
"space-y-[35rem]",
"md:mt-45 lg:mt-70",
"space-y-[25rem]",
"md:mt-45 lg:mt-70 md:space-y-[35rem]",
className,
)}
>
Expand Down
28 changes: 28 additions & 0 deletions src/components/landing/LandingSpecialFeatureGrid.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
"use client";

import { SPECIAL_FEATURES } from "@/lib/constants";
import { cn } from "@/lib/utils";
import { Icon } from "@/shared/Icon";
import { SpecialFeatureCard } from "@/shared/SpecialFeatureCard";
import type { LandingSpecialFeatureGridProps } from "@/types/landing";

export function LandingSpecialFeatureGrid({ className }: LandingSpecialFeatureGridProps) {
return (
<div
className={cn(
"flex flex-col items-center gap-10",
"md:flex md:flex-row md:justify-center md:gap-8",
className,
)}
>
{SPECIAL_FEATURES.map((feature) => (
<SpecialFeatureCard
key={feature.title}
icon={<Icon name={feature.iconName} size={28} />}
title={feature.title}
description={feature.description}
/>
))}
</div>
);
}
33 changes: 33 additions & 0 deletions src/components/landing/LandingSpecialFeaturesSection.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"use client";

import { LandingSpecialFeatureGrid } from "@/components/landing/LandingSpecialFeatureGrid";
import { cn } from "@/lib/utils";
import type { LandingSpecialFeaturesSectionProps } from "@/types/landing";

export function LandingSpecialFeaturesSection({ className }: LandingSpecialFeaturesSectionProps) {
return (
<section
id="landing-special-features"
aria-labelledby="landing-special-features-title"
className={cn("bg-[var(--color-gray-50)] py-24 md:py-32", className)}
>
<div className="container space-y-12 md:space-y-16">
{/* ์„น์…˜ ์ธํŠธ๋กœ: ์ œ๋ชฉ + ๋ถ€์ œ */}
<header className="space-y-4 text-center">
<h2
id="landing-special-features-title"
className="t-30-b md:t-40-b text-[var(--color-gray-900)]"
>
PlanMate์˜ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ๋“ค
</h2>
<p className="t-14-m md:t-16-m text-[var(--color-gray-600)]">
๋‹น์‹ ์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋Š” ์Šค๋งˆํŠธํ•œ ๋„๊ตฌ๋“ค
</p>
</header>

{/* ํ•˜๋‹จ ์นด๋“œ ๊ทธ๋ฆฌ๋“œ */}
<LandingSpecialFeatureGrid />
</div>
</section>
);
}
42 changes: 41 additions & 1 deletion src/lib/constants.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FeatureItem } from "@/types/landing";
import { FeatureItem, FooterLink, SpecialFeatureItem } from "@/types/landing";

/* -------------------------------------------------
๐Ÿ“ฆ ํ”„๋กœ์ ํŠธ ๊ณตํ†ต ์ƒ์ˆ˜ (Global Constants)
Expand Down Expand Up @@ -56,6 +56,23 @@ export const SIGNUP_BTNS = [

export type SignupButtonKey = (typeof SIGNUP_BTNS)[number]["key"];

/* -------------------------------------------------
๐Ÿงฉ Layout - Footer
- LandingFooter์—์„œ ์‚ฌ์šฉ
------------------------------------------------- */

export const PRODUCTLINKS: FooterLink[] = [
{ label: "๊ธฐ๋Šฅ ์†Œ๊ฐœ", href: "/features" },
{ label: "์š”๊ธˆ์ œ", href: "/pricing" },
{ label: "์—…๋ฐ์ดํŠธ", href: "/changelog" },
];

export const SUPPORTLINKS: FooterLink[] = [
{ label: "FAQ", href: "/faq" },
{ label: "๋ฌธ์˜ํ•˜๊ธฐ", href: "/support" },
{ label: "๊ฐœ์ธ์ •๋ณด์ฒ˜๋ฆฌ๋ฐฉ์นจ", href: "/privacy" },
];

/* -------------------------------------------------
๐Ÿงฉ ๋žœ๋”ฉ ํŽ˜์ด์ง€ โ€” ๊ธฐ๋Šฅ ์†Œ๊ฐœ ์„น์…˜ 1
- LandingFeatureGrid / LandingFeaturesSection1์—์„œ ์‚ฌ์šฉ
Expand Down Expand Up @@ -100,3 +117,26 @@ export const FEATURES: FeatureItem[] = [
previewImageSrc: "/images/feature-memo.png",
},
];

/* -------------------------------------------------
๐Ÿงฉ ๋žœ๋”ฉ ํŽ˜์ด์ง€ โ€” ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ ์†Œ๊ฐœ ์„น์…˜
- LandingSpecialFeatureGrid ์‚ฌ์šฉ
------------------------------------------------- */

export const SPECIAL_FEATURES: SpecialFeatureItem[] = [
{
title: "์Šค๋งˆํŠธ ์Šค์ผ€์ค„๋ง",
description: "AI๊ฐ€ ์ถ”์ฒœํ•˜๋Š” ์ตœ์ ์˜ ์ผ์ • ๋ฐฐ์น˜๋กœ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜์„ธ์š”.",
iconName: "calendar",
},
{
title: "ํŒ€ ํ˜‘์—…",
description: "ํŒ€์›๋“ค๊ณผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ผ์ •์„ ๊ณต์œ ํ•˜๊ณ  ํ•จ๊ป˜ ์ž‘์—…ํ•˜์„ธ์š”.",
iconName: "users",
},
{
title: "์Šค๋งˆํŠธ ์•Œ๋ฆผ",
description: "์ค‘์š”ํ•œ ์ผ์ •์„ ๋†“์น˜์ง€ ์•Š๋„๋ก ๋งž์ถคํ˜• ์•Œ๋ฆผ์„ ๋ฐ›์•„๋ณด์„ธ์š”.",
iconName: "bellRing",
},
];
2 changes: 1 addition & 1 deletion src/lib/variants/card.specialFeatureCard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export const specialFeatureCardVariants = cva(
size: {
sm: "w-[30rem] h-[20rem] p-5 gap-4",
md: "w-[35rem] h-[22rem] p-6 gap-4",
lg: "w-[40rem] h-[25rem] p-7 gap-5",
lg: "max-w-[40rem] h-[25rem] p-7 gap-5",
xl: "w-[45rem] h-[28rem] p-8 gap-6",
},
},
Expand Down
19 changes: 19 additions & 0 deletions src/types/landing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,3 +74,22 @@ export type LandingFeaturesSection2Props = WithClassName;
export type LandingLayoutPreviewProps = WithClassName;

export type LandingFeatureTextProps = WithClassName;

/* -------------------------------------------------
ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ ์„น์…˜
------------------------------------------------- */
export type LandingSpecialFeaturesSectionProps = WithClassName;

export type LandingSpecialFeatureGridProps = WithClassName;

/* -------------------------------------------------
ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ ์„น์…˜ โ€” Feature ๋ฆฌ์ŠคํŠธ
------------------------------------------------- */

export type SpecialFeatureIconName = "calendar" | "users" | "bellRing";

export interface SpecialFeatureItem {
title: string;
description: string;
iconName: SpecialFeatureIconName;
}