Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
12 commits
Select commit Hold shift + click to select a range
4a32163
CDP-210 featโœจ (signup): signup group button ์ปดํฌ๋„ŒํŠธ signup ํŽ˜์ด์ง€์— ์กฐ๋ฆฝ
leeunduck Nov 14, 2025
5a4cc57
CDP-206 refactor๐Ÿ”จ (title): title ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฆฌํŒฉํ† ๋ง
leeunduck Nov 15, 2025
f21854a
CDP-206 refactor๐Ÿ”จ (type): state type auth ํŒŒ์ผ๋กœ ์ด๋™
leeunduck Nov 15, 2025
c4ee805
CDP-206 refactor๐Ÿ”จ (button): auth ๋ฒ„ํŠผ white ์ƒ‰๊น” ์ถ”๊ฐ€
leeunduck Nov 15, 2025
783715a
CDP-206 refactor๐Ÿ”จ (link): ์ด๋™๊ฒฝ๋กœ ๋ณ€๊ฒฝ
leeunduck Nov 15, 2025
53b2b15
CDP-206 refactor๐Ÿ”จ (button): auth ๋ฒ„ํŠผ white ์ƒ‰๊น” ์ถ”๊ฐ€
leeunduck Nov 15, 2025
15b9f1b
CDP-210 featโœจ (signup): name ํŽ˜์ด์ง€ ์Šคํƒ€์ผ ์™„์„ฑ
leeunduck Nov 15, 2025
80e8faf
CDP-210 featโœจ (signup): email ํŽ˜์ด์ง€ ์Šคํƒ€์ผ ์™„์„ฑ
leeunduck Nov 15, 2025
1644eba
CDP-210 featโœจ (signup): password ํŽ˜์ด์ง€ ์Šคํƒ€์ผ ์™„์„ฑ
leeunduck Nov 15, 2025
0809bc9
CDP-214 featโœจ (signup): terms ํŽ˜์ด์ง€ ์Šคํƒ€์ผ ์™„์„ฑ
leeunduck Nov 15, 2025
532d696
CDP-210 featโœจ (signup): ์ผ๋ฐ˜ํšŒ์› ๊ฐ€์ž… ๊ณต๋™ form ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€
leeunduck Nov 15, 2025
82d73aa
CDP-215 featโœจ (signup): step indicator ์ปดํฌ๋„ŒํŠธ ์ถ”๊ฐ€
leeunduck Nov 15, 2025
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
7 changes: 3 additions & 4 deletions src/app/(auth)/login/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { AuthHeader } from "@/components/auth/AuthHeader";
import { AuthMain } from "@/components/auth/AuthMain";
import { SubTitle, Title } from "@/components/auth/AuthTitle";
import { LoginForm } from "@/components/auth/login/LoginForm";
import { LoginPageTitle } from "@/components/auth/login/LoginPageTitle";
import { LoginSubtitle } from "@/components/auth/login/LoginSubtitle";
import { makePageMetadata } from "@/seo/metadata";

export const metadata = {
Expand All @@ -18,8 +17,8 @@ export default function LoginPage() {
return (
<>
<AuthHeader>
<LoginPageTitle />
<LoginSubtitle />
<Title>๋กœ๊ทธ์ธ</Title>
<SubTitle>์˜ค๋Š˜๋„ ๋งŒ๋‚˜์„œ ๋ฐ˜๊ฐ€์›Œ์š”!</SubTitle>
</AuthHeader>

<AuthMain>
Expand Down
28 changes: 26 additions & 2 deletions src/app/(auth)/signup/email/page.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,38 @@
import { AuthHeader } from "@/components/auth/AuthHeader";
import { AuthMain } from "@/components/auth/AuthMain";
import { SubTitle, Title } from "@/components/auth/AuthTitle";
import { SignupForm } from "@/components/auth/signup/SignupForm";
import { makePageMetadata } from "@/seo/metadata";

export const metadata = {
...makePageMetadata({
title: "ํšŒ์›๊ฐ€์ž… โ€” ์ด๋ฉ”์ผ ์ž…๋ ฅ",
description: "PlanMate ํšŒ์›๊ฐ€์ž… 2๋‹จ๊ณ„: ์ด๋ฉ”์ผ ์ž…๋ ฅ ํŽ˜์ด์ง€",
description: "MyPlanMate ํšŒ์›๊ฐ€์ž… 2๋‹จ๊ณ„: ์ด๋ฉ”์ผ ์ž…๋ ฅ ํŽ˜์ด์ง€",
canonical: "/signup/email",
}),
robots: { index: false, follow: false },
};

export default function SignupEmailPage() {
return <div>ํšŒ์›๊ฐ€์ž… - ์ด๋ฉ”์ผ ์ž…๋ ฅ ํŽ˜์ด์ง€</div>;
return (
<>
<AuthHeader>
<Title>์ด๋ฉ”์ผ</Title>
<SubTitle>๊ณ„์ •์œผ๋กœ ์‚ฌ์šฉํ•  ์ด๋ฉ”์ผ์„ ์•Œ๋ ค์ฃผ์„ธ์š”.</SubTitle>
</AuthHeader>

<AuthMain>
<SignupForm
fieldId="signup-email"
fieldName="email"
label="์ด๋ฉ”์ผ"
type="email"
placeholder="[email protected]"
autoComplete="email"
nextHref="/signup/password"
prevHref="/signup/name"
/>
</AuthMain>
</>
);
}
26 changes: 24 additions & 2 deletions src/app/(auth)/signup/name/page.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,36 @@
import { AuthHeader } from "@/components/auth/AuthHeader";
import { AuthMain } from "@/components/auth/AuthMain";
import { SubTitle, Title } from "@/components/auth/AuthTitle";
import { SignupForm } from "@/components/auth/signup/SignupForm";
import { makePageMetadata } from "@/seo/metadata";

export const metadata = {
...makePageMetadata({
title: "ํšŒ์›๊ฐ€์ž… โ€” ์ด๋ฆ„ ์ž…๋ ฅ",
description: "PlanMate ํšŒ์›๊ฐ€์ž… 1๋‹จ๊ณ„: ์ด๋ฆ„ ์ž…๋ ฅ ํŽ˜์ด์ง€",
description: "MyPlanMate ํšŒ์›๊ฐ€์ž… 1๋‹จ๊ณ„: ์ด๋ฆ„ ์ž…๋ ฅ ํŽ˜์ด์ง€",
canonical: "/signup/name",
}),
robots: { index: false, follow: false },
};

export default function SignupNamePage() {
return <div>ํšŒ์›๊ฐ€์ž… - ์ด๋ฆ„ ์ž…๋ ฅ ํŽ˜์ด์ง€</div>;
return (
<>
<AuthHeader>
<Title>์ด๋ฆ„</Title>
<SubTitle>์ด๋ฆ„์„ ์•Œ๋ ค์ฃผ์„ธ์š”.</SubTitle>
</AuthHeader>

<AuthMain>
<SignupForm
fieldId="signup-name"
fieldName="name"
label="์ด๋ฆ„"
placeholder="์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"
autoComplete="name"
nextHref="/signup/email"
/>
</AuthMain>
</>
);
}
13 changes: 9 additions & 4 deletions src/app/(auth)/signup/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { AuthHeader } from "@/components/auth/AuthHeader";
import { SignupPageTitle } from "@/components/auth/signup/SignupPageTitle";
import { SignupSubtitle } from "@/components/auth/signup/SignupSubTitle";
import { AuthMain } from "@/components/auth/AuthMain";
import { SubTitle, Title } from "@/components/auth/AuthTitle";
import { SignupGroupButton } from "@/components/auth/signup/SignupGroupButton";
import { makePageMetadata } from "@/seo/metadata";

export const metadata = {
Expand All @@ -16,9 +17,13 @@ export default function SignupPage() {
return (
<>
<AuthHeader>
<SignupPageTitle />
<SignupSubtitle />
<Title>ํšŒ์›๊ฐ€์ž…</Title>
<SubTitle>์›ํ•˜์‹œ๋Š” ๊ฐ€์ž… ๋ฐฉ์‹์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.</SubTitle>
</AuthHeader>

<AuthMain>
<SignupGroupButton />
</AuthMain>
</>
);
}
26 changes: 25 additions & 1 deletion src/app/(auth)/signup/password/page.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import { AuthHeader } from "@/components/auth/AuthHeader";
import { AuthMain } from "@/components/auth/AuthMain";
import { SubTitle, Title } from "@/components/auth/AuthTitle";
import { SignupForm } from "@/components/auth/signup/SignupForm";
import { makePageMetadata } from "@/seo/metadata";

export const metadata = {
Expand All @@ -10,5 +14,25 @@ export const metadata = {
};

export default function SignupPasswordPage() {
return <div>ํšŒ์›๊ฐ€์ž… - ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • ํŽ˜์ด์ง€</div>;
return (
<>
<AuthHeader>
<Title>๋น„๋ฐ€๋ฒˆํ˜ธ</Title>
<SubTitle>8์ž ์ด์ƒ / ํŠน์ˆ˜๋ฌธ์ž ํฌํ•จ</SubTitle>
</AuthHeader>

<AuthMain>
<SignupForm
fieldId="signup-password"
fieldName="password"
label="๋น„๋ฐ€๋ฒˆํ˜ธ"
type="password"
placeholder="8์ž๋ฆฌ์ด์ƒ & ํŠน์ˆ˜๋ฌธ์ž"
autoComplete="password"
nextHref="/signup/terms"
prevHref="/signup/email"
/>
</AuthMain>
</>
);
}
26 changes: 25 additions & 1 deletion src/app/(auth)/signup/terms/page.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import { AuthHeader } from "@/components/auth/AuthHeader";
import { AuthMain } from "@/components/auth/AuthMain";
import { SubTitle, Title } from "@/components/auth/AuthTitle";
import { SignupForm } from "@/components/auth/signup/SignupForm";
import { makePageMetadata } from "@/seo/metadata";

export const metadata = {
Expand All @@ -10,5 +14,25 @@ export const metadata = {
};

export default function SignupTermsPage() {
return <div>ํšŒ์›๊ฐ€์ž… - ์•ฝ๊ด€ ๋™์˜ ํŽ˜์ด์ง€</div>;
return (
<>
<AuthHeader>
<Title>์•ฝ๊ด€๋™์˜</Title>
<SubTitle>์„œ๋น„์Šค ์ด์šฉ์„ ์œ„ํ•œ ํ•„์ˆ˜ ์•ฝ๊ด€์ž…๋‹ˆ๋‹ค.</SubTitle>
</AuthHeader>

<AuthMain>
<SignupForm
fieldId="signup-terms"
fieldName="text"
label="์•ฝ๊ด€๋™์˜"
type="text"
placeholder="๋ ์šฉ"
autoComplete="password"
nextHref="/signup/terms"
prevHref="/signup/password"
/>
</AuthMain>
</>
);
}
13 changes: 13 additions & 0 deletions src/components/auth/AuthTitle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { AuthCommonProps } from "@/types/auth";

export function Title({ children }: AuthCommonProps) {
return (
<h1 id="auth-signup-title" className="t-24-b text-[var(--color-gray-900)]">
{children}
</h1>
);
}

export function SubTitle({ children }: AuthCommonProps) {
return <p className="t-14-m text-[var(--color-gray-600)]">{children}</p>;
}
7 changes: 0 additions & 7 deletions src/components/auth/login/LoginPageTitle.tsx

This file was deleted.

3 changes: 0 additions & 3 deletions src/components/auth/login/LoginSubtitle.tsx

This file was deleted.

76 changes: 76 additions & 0 deletions src/components/auth/signup/SignupForm.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"use client";

import { cn } from "@/lib/utils";
import { Button } from "@/shared/button";
import { Input } from "@/shared/input";
import { SignupFormProps } from "@/types/auth";
import Link from "next/link";
import { SignupStepIndicator } from "./SignupStepIndicator";

export function SignupForm({
className,
fieldId,
fieldName,
label,
type = "text",
placeholder,
autoComplete,
nextHref,
prevHref,
}: SignupFormProps) {
return (
<form
noValidate
aria-label={`${label} ์ž…๋ ฅ ํผ`}
className={cn(
"flex flex-col items-center gap-10 rounded-2xl border border-[var(--color-gray-200)] bg-[var(--color-white)] px-4 py-6",
"md:px-6 md:py-8",
className,
)}
>
<SignupStepIndicator currentStep={2} className="mb-3" />
{/* ๋‹จ์ผ ํ•„๋“œ */}
<div className="flex w-full max-w-[36.6rem] flex-col gap-4 mx-auto">
<label htmlFor={fieldId} className="t-14-m text-[var(--color-gray-700)]">
{label}
</label>
<Input
id={fieldId}
name={fieldName}
type={type}
placeholder={placeholder}
status="default"
autoComplete={autoComplete}
/>
</div>

{/* ๋‹ค์Œ / ์ด์ „ ๋ฒ„ํŠผ (์ž„์‹œ: Link๋กœ ๋ผ์šฐํŒ…) */}
<div className="flex w-full max-w-[36.6rem] flex-col gap-4 mx-auto">
<Link href={nextHref}>
<Button type="button" preset="auth" bg="basic" className="w-full">
๋‹ค์Œ
</Button>
</Link>

{prevHref && (
<Link href={prevHref}>
<Button type="button" preset="auth" bg="white" className="w-full">
์ด์ „
</Button>
</Link>
)}
</div>

{/* ํ•˜๋‹จ ๋กœ๊ทธ์ธ ๋งํฌ */}
<p className="t-14-m text-center text-[var(--color-gray-600)]">
์ด๋ฏธ ํšŒ์›์ด์‹ ๊ฐ€์š”?{" "}
<Link
href="/login"
className="t-14-m text-[var(--color-gray-900)] underline-offset-2 hover:underline"
>
๋กœ๊ทธ์ธํ•˜๊ธฐ
</Link>
</p>
</form>
);
}
Loading