diff --git a/src/pages/LoginPage.tsx b/src/pages/LoginPage.tsx index 248bf0ca..c648c9b5 100644 --- a/src/pages/LoginPage.tsx +++ b/src/pages/LoginPage.tsx @@ -1,10 +1,11 @@ import { useNavigate } from "react-router-dom"; import EventeeButton from "../components/EventeeButton"; +import "../styles/login-animations.css"; const GOOGLE_CLIENT_ID = import.meta.env.VITE_GOOGLE_CLIENT_ID; const REDIRECT_URI = import.meta.env.VITE_GOOGLE_REDIRECT_URI; -const buildGoogleOAuthUrl = (target: string) => { +const buildGoogleOAuthUrl = (target) => { return ( `https://accounts.google.com/o/oauth2/v2/auth?` + `client_id=${GOOGLE_CLIENT_ID}` + @@ -20,7 +21,13 @@ const buildGoogleOAuthUrl = (target: string) => { export default function LoginPage() { const navigate = useNavigate(); - const handleGoogleLogin = () => { + const handleGoogleLogin = (e) => { + const rect = e.target.getBoundingClientRect(); + const x = e.clientX - rect.left; + const y = e.clientY - rect.top; + e.target.style.setProperty("--x", `${x}px`); + e.target.style.setProperty("--y", `${y}px`); + window.location.href = buildGoogleOAuthUrl("my-page"); }; @@ -29,54 +36,48 @@ export default function LoginPage() { }; return ( -
-
- {/* 브랜드 로고 영역 */} +
+
+ {/* 로고 영역 */}
-

+

EvenTee

-

+

쉽고 빠른 이벤트 관리 플랫폼

- {/* 카드 */} -
+ {/* 카드 박스 */} +

로그인 또는 회원가입

- {/* 구글 로그인 */} + {/* Google 로그인 */} - {/* 이벤트 참여 버튼 */} + {/* 이벤트 참여 */} {/* 하단 안내 */} -

+

본 서비스는 소셜 로그인 정보를 기반으로 안전하게 운영됩니다.

diff --git a/src/styles/login-animations.css b/src/styles/login-animations.css new file mode 100644 index 00000000..33fefe6e --- /dev/null +++ b/src/styles/login-animations.css @@ -0,0 +1,71 @@ + +.bg-animated { + background: linear-gradient(120deg, #f7f5f3, #ece7e1, #f3eee9); + background-size: 200% 200%; + animation: gradientMove 10s ease infinite; +} + +@keyframes gradientMove { + 0% { + background-position: 0% 50%; + } + 50% { + background-position: 100% 50%; + } + 100% { + background-position: 0% 50%; + } +} + + +.fade-up { + opacity: 0; + transform: translateY(10px); + animation: fadeUp 0.8s ease forwards; +} + +@keyframes fadeUp { + to { + opacity: 1; + transform: translateY(0); + } +} + + +.scale-in { + opacity: 0; + transform: scale(0.96); + animation: scaleIn 0.5s ease forwards; +} + +@keyframes scaleIn { + to { + opacity: 1; + transform: scale(1); + } +} + +.btn-ripple { + position: relative; + overflow: hidden; +} + +.btn-ripple:active::after { + content: ""; + position: absolute; + width: 12px; + height: 12px; + background: rgba(0, 0, 0, 0.1); + border-radius: 50%; + transform: scale(0); + animation: ripple 0.5s ease-out; + left: var(--x); + top: var(--y); +} + +@keyframes ripple { + to { + transform: scale(20); + opacity: 0; + } +}