From c7ce9e2f6e2165551b218d40e5b5d7b0c729062f Mon Sep 17 00:00:00 2001 From: koreacomp5 Date: Sun, 16 Nov 2025 18:29:54 +0900 Subject: [PATCH] =?UTF-8?q?login=20page=20=EA=B8=B0=EB=B3=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/login/page.tsx | 176 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 176 insertions(+) create mode 100644 src/app/login/page.tsx diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx new file mode 100644 index 0000000..34facd4 --- /dev/null +++ b/src/app/login/page.tsx @@ -0,0 +1,176 @@ +"use client"; + +import { useState } from "react"; +import Link from "next/link"; + +export default function LoginPage() { + const [userId, setUserId] = useState(""); + const [password, setPassword] = useState(""); + const [rememberId, setRememberId] = useState(false); + const [autoLogin, setAutoLogin] = useState(false); + + function handleSubmit(e: React.FormEvent) { + e.preventDefault(); + // TODO: 실제 인증 연동 시 이곳에서 처리 + // 현재는 UI만 구현 + console.log({ userId, password, rememberId, autoLogin }); + } + + return ( +
+ {/* 카드 컨테이너 */} +
+ {/* 로고 영역 */} +
+
+
+ XR LMS +
+
+ + {/* 폼 */} +
+
+ {/* 아이디 */} +
+ + setUserId(e.target.value)} + placeholder="아이디" + className="h-14 w-full rounded-lg border px-4 text-[15px] outline-none transition-shadow" + style={{ + borderColor: "var(--color-input-border)", + color: "var(--color-basic-text)", + // placeholder 색상 + // Tailwind v4 arbitrary 적용이 번거로워 인라인 사용 + }} + onFocus={(e) => { + e.currentTarget.style.boxShadow = + "0 0 0 2px rgba(51,60,71,0.15)"; + e.currentTarget.style.borderColor = + "var(--color-input-border-select)"; + }} + onBlur={(e) => { + e.currentTarget.style.boxShadow = "none"; + e.currentTarget.style.borderColor = + "var(--color-input-border)"; + }} + /> +
+ {/* 비밀번호 */} +
+ + setPassword(e.target.value)} + placeholder="비밀번호" + className="h-14 w-full rounded-lg border px-4 text-[15px] outline-none transition-shadow" + style={{ + borderColor: "var(--color-input-border)", + color: "var(--color-basic-text)", + }} + onFocus={(e) => { + e.currentTarget.style.boxShadow = + "0 0 0 2px rgba(51,60,71,0.15)"; + e.currentTarget.style.borderColor = + "var(--color-input-border-select)"; + }} + onBlur={(e) => { + e.currentTarget.style.boxShadow = "none"; + e.currentTarget.style.borderColor = + "var(--color-input-border)"; + }} + /> +
+
+ + {/* 체크박스들 */} +
+ + +
+ + {/* 로그인 버튼 */} + + + {/* 하단 링크들 */} +
+ + 회원가입 + +
+ + 아이디 찾기 + + + + 비밀번호 재설정 + +
+
+
+
+ + {/* 카피라이트 */} +

+ Copyright ⓒ 2025 XL LMS. All rights reserved +

+
+ ); +} + \ No newline at end of file