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
Binary file added public/images/Logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 5 additions & 1 deletion src/app/(marketing)/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { LandingFooter } from "@/components/landing/LandingFooter";
import { LandingHeader } from "@/components/landing/LandingHeader";
import { LandingWrapper } from "@/components/landing/LandingWrapper";
import { makePageMetadata } from "@/seo/metadata";

export const metadata = makePageMetadata({
title: "PlanMate โ€” ๋งž์ถคํ˜• ๋ฐ์ผ๋ฆฌ ํ”Œ๋ž˜๋„ˆ",
title: "MyPlanMate โ€” ๋งž์ถคํ˜• ๋ฐ์ผ๋ฆฌ ํ”Œ๋ž˜๋„ˆ",
description: "์›ํ•˜๋Š” ๋ชจ๋“ˆ์„ ์กฐํ•ฉํ•ด ๋‚˜๋งŒ์˜ ํ”Œ๋ž˜๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” PlanMate ๋žœ๋”ฉ ํŽ˜์ด์ง€",
canonical: "/",
});
Expand All @@ -12,7 +14,9 @@ export default function MarketingLayout({ children }: { children: React.ReactNod
<html lang="ko">
<body>
<LandingWrapper>
<LandingHeader />
<main className="flex-1">{children}</main>
<LandingFooter />
</LandingWrapper>
</body>
</html>
Expand Down
11 changes: 11 additions & 0 deletions src/components/landing/LandingCopyright.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { useCurrentYear } from "@/hooks/useCurrentYear";

export function LandingCopyright() {
const year = useCurrentYear();

return (
<p className="text-center text-sm text-[var(--color-gray-500)]">
ยฉ {year} MyPlanMate. All rights reserved.
</p>
);
}
64 changes: 64 additions & 0 deletions src/components/landing/LandingFooter.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
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)]"
>
<div className="mx-auto flex max-w-[128rem] flex-col gap-10 px-12 py-12">
{/* ์ƒ๋‹จ: ์ขŒ์šฐ ์ปฌ๋Ÿผ + ์ค‘์•™ ๋กœ๊ณ  */}
<div className="flex flex-row items-center gap-10 justify-between">
{/* ์ขŒ์ธก: ์ œํ’ˆ ๊ด€๋ จ ๋งํฌ */}
<LandingFooterColumn title="์ œํ’ˆ" links={productLinks} />

{/* ์ค‘์•™: ๋ธŒ๋žœ๋“œ ๋กœ๊ณ /๋ฌธ๊ตฌ */}
<div className="flex flex-col items-center gap-5">
<Link href="/" aria-label="MyPlanMate ํ™ˆ์œผ๋กœ ์ด๋™" className="flex items-center gap-2">
<Image
src="/images/logo.png"
alt="MyPlanMate ๋กœ๊ณ "
width={150}
Comment on lines +33 to +37

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Fix logo path casing in footer

The footer renders the same logo using src="/images/logo.png", but the only image committed is public/images/Logo.png. Because Next.js serves files case-sensitively in production, the footerโ€™s logo will fail to load and display as a broken image. Align the string casing or rename the asset so the served file matches the requested path.

Useful? React with ๐Ÿ‘ย / ๐Ÿ‘Ž.

height={150}
className="object-contain select-none"
draggable={false}
/>
</Link>
<p className="t-14-m text-[var(--color-gray-500)]">
ํ•˜๋ฃจ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋‚˜๋งŒ์˜ ํ”Œ๋ž˜๋„ˆ, MyPlanMate
</p>
</div>

{/* ์šฐ์ธก: ์ง€์›/์ •์ฑ… ๋งํฌ */}
<LandingFooterColumn title="์ง€์›" links={supportLinks} />
</div>

{/* ํ•˜๋‹จ: ๊ตฌ๋ถ„์„  + ์ €์ž‘๊ถŒ */}
<div className="mt-4 border-t border-[var(--color-gray-100)] pt-6">
<div className="flex flex-row items-center justify-between gap-4 ">
<LandingCopyright />
<p className="t-12-r text-[var(--color-gray-400)]">
์„œ๋น„์Šค ๊ด€๋ จ ์•ˆ๋‚ด ๋ฐ ๊ณต์ง€์‚ฌํ•ญ์€ ํ™ˆํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
</p>
</div>
</div>
</div>
</footer>
);
}
23 changes: 23 additions & 0 deletions src/components/landing/LandingFooterColumn.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { LandingFooterColumnProps } from "@/types/landing";
import Link from "next/link";

export function LandingFooterColumn({ title, links }: LandingFooterColumnProps) {
return (
<div className="flex flex-col gap-3">
<h3 className="t-16-m text-[var(--color-gray-900)] text-center">{title}</h3>
<ul className="flex flex-col gap-3 text-center">
{links.map((link) => (
<li key={link.label}>
<Link
href={link.href}
className="t-14-m text-[var(--color-gray-500)]
hover:text-[var(--color-gray-900)] hover:border-b hover:border-[var(--color-gray-900)]"
>
{link.label}
</Link>
</li>
))}
</ul>
</div>
);
}
10 changes: 10 additions & 0 deletions src/components/landing/LandingHeader.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { cn } from "@/lib/utils";
import { LandingNavBar } from "./LandingNavBar";

export function LandingHeader() {
return (
<header className={cn("w-full")} role="banner">
<LandingNavBar />
</header>
);
}
43 changes: 43 additions & 0 deletions src/components/landing/LandingNavBar.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// src/components/landing/LandingNavBar.tsx
import { cn } from "@/lib/utils";
import Image from "next/image";
import Link from "next/link";

export function LandingNavBar() {
return (
<nav
className={cn("mx-auto flex h-[9.6rem] max-w-[128rem] items-center justify-between px-12")}
aria-label="Global navigation"
>
{/* ์ขŒ์ธก: ๋กœ๊ณ  (์ด๋ฏธ์ง€) */}
<Link href="/" aria-label="MyPlanMate ํ™ˆ์œผ๋กœ ์ด๋™">
<Image
src="/images/logo.png"
alt="MyPlanMate ๋กœ๊ณ "
width={150}
Comment on lines +13 to +17

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Fix logo path casing in navbar

The new logo asset was added as public/images/Logo.png (capital L) but the navbar still references src="/images/logo.png". On case-sensitive deployments (Linux builds and Vercel), this mismatch will return a 404 so the brand logo will not render in the header. Update the reference to match the fileโ€™s casing or rename the asset to keep the path consistent.

Useful? React with ๐Ÿ‘ย / ๐Ÿ‘Ž.

height={150}
className="object-contain select-none"
draggable={false}
/>
</Link>

{/* ์šฐ์ธก: ์–ธ์–ด ํ† ๊ธ€ + ๋กœ๊ทธ์ธ */}
<div className="flex items-center gap-12">
<button
type="button"
className="t-16-m text-[var(--color-gray-600)] hover:text-[var(--color-gray-900)] cursor-pointer"
aria-label="์–ธ์–ด ์ „ํ™˜"
>
ํ•œ๊ตญ์–ด
</button>
<Link
href="/login"
className="t-16-m text-[var(--color-gray-600)] hover:text-[var(--color-gray-900)]"
aria-label="๋กœ๊ทธ์ธํŽ˜์ด์ง€๋กœ ์ด๋™"
>
๋กœ๊ทธ์ธ
</Link>
</div>
</nav>
);
}
3 changes: 3 additions & 0 deletions src/hooks/useCurrentYear.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function useCurrentYear(): number {
return new Date().getFullYear();
}
2 changes: 1 addition & 1 deletion src/lib/variants/button.hero.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const heroButtonVariants = cva(
"bg-[var(--color-white)] text-[var(--color-gray-900)] border border-[var(--color-gray-300)]",

// Hover invert (black/white/black)
"hover:bg-[var(--color-black)] hover:text-[var(--color-white)] hover:border-[var(--color-black)]]",
"hover:bg-[var(--color-black)] hover:text-[var(--color-white)] hover:border-[var(--color-black)]",
].join(" "),
{
variants: {
Expand Down
10 changes: 10 additions & 0 deletions src/types/landing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,13 @@ export type LandingWrapperProps = {
children: React.ReactNode;
className?: string;
};

export type FooterLink = {
label: string;
href: string;
};

export type LandingFooterColumnProps = {
title: string;
links: FooterLink[];
};