feat(login): 스플릿 레이아웃 + 로고 리디자인 (좌 브랜드 히어로 / 우 폼)

This commit is contained in:
chpark
2026-04-25 03:06:41 +09:00
parent 4f55f36bcd
commit b925af0a90
4 changed files with 198 additions and 120 deletions
+7 -5
View File
@@ -2,12 +2,14 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
<defs>
<linearGradient id="fg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#2E8B57"/>
<stop offset="0%" stop-color="#1b5e3a"/>
<stop offset="100%" stop-color="#3CB371"/>
</linearGradient>
</defs>
<rect width="64" height="64" rx="14" fill="url(#fg)"/>
<text x="32" y="42" font-family="Helvetica, Arial, sans-serif" font-size="20" font-weight="900" fill="#ffffff" text-anchor="middle" letter-spacing="-1">MOMO</text>
<circle cx="52" cy="12" r="1.8" fill="#ffffff" opacity="0.9"/>
<circle cx="56" cy="18" r="1.2" fill="#ffffff" opacity="0.7"/>
<rect width="64" height="64" rx="16" fill="url(#fg)"/>
<!-- Stylized M with sparkle -->
<text x="32" y="43" font-family="'Segoe UI', 'Helvetica Neue', Arial, sans-serif" font-size="32" font-weight="900" fill="#ffffff" text-anchor="middle" letter-spacing="-2">M</text>
<circle cx="51" cy="14" r="2" fill="#ffffff" opacity="0.95"/>
<circle cx="56" cy="20" r="1.2" fill="#ffffff" opacity="0.7"/>
<circle cx="47" cy="9" r="1.1" fill="#ffffff" opacity="0.6"/>
</svg>

Before

Width:  |  Height:  |  Size: 685 B

After

Width:  |  Height:  |  Size: 799 B

+41 -32
View File
@@ -1,43 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 420 140" width="420" height="140">
<style>
.momo-text { font-family: 'Helvetica Neue', Arial, sans-serif; font-weight: 900; font-size: 110px; fill: #2E8B57; letter-spacing: -4px; }
</style>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 480 160" width="480" height="160">
<defs>
<linearGradient id="momoG" x1="0" y1="0" x2="1" y2="1">
<stop offset="0%" stop-color="#1b5e3a"/>
<stop offset="55%" stop-color="#2E8B57"/>
<stop offset="100%" stop-color="#3CB371"/>
</linearGradient>
<linearGradient id="sparkleG" x1="0" y1="0" x2="1" y2="0">
<stop offset="0%" stop-color="#7ED9A7" stop-opacity="0"/>
<stop offset="50%" stop-color="#7ED9A7" stop-opacity="0.9"/>
<stop offset="100%" stop-color="#7ED9A7" stop-opacity="0"/>
</linearGradient>
</defs>
<!-- MOMO 텍스트 -->
<text x="0" y="108" class="momo-text">MOMO</text>
<!-- Magical trail sweeping across the letters -->
<path d="M 10 118 Q 120 98 240 118 T 470 108"
fill="none" stroke="url(#sparkleG)" stroke-width="3" stroke-linecap="round"/>
<!-- 요정 (stylized figure) above last O -->
<g fill="#2E8B57" transform="translate(352 12)">
<!-- MOMO wordmark -->
<g fill="url(#momoG)" font-family="'Segoe UI', 'Helvetica Neue', Arial, sans-serif" font-weight="900">
<text x="0" y="120" font-size="128" letter-spacing="-6">MOMO</text>
</g>
<!-- Fairy silhouette above the second O -->
<g fill="url(#momoG)" transform="translate(395 6)">
<!-- hair -->
<path d="M 12 2 Q 6 -2 3 5 Q 8 3 14 5 Z"/>
<!-- head -->
<circle cx="10" cy="6" r="3.8"/>
<!-- hair flair -->
<path d="M 7 3 Q 4 0 2 4 Q 6 3 8 4 Z"/>
<!-- body / dress -->
<path d="M 10 10 L 5 30 L 8 30 L 10 18 L 12 30 L 15 30 Z"/>
<!-- left arm (holding wand) -->
<path d="M 10 12 L 20 6 L 22 8 L 12 14 Z"/>
<circle cx="13" cy="9" r="4.2"/>
<!-- body / dress flowing -->
<path d="M 13 13 Q 7 22 6 34 L 20 34 Q 19 22 13 13 Z"/>
<!-- arm with wand -->
<path d="M 14 15 L 29 7 L 31 10 L 16 18 Z"/>
<!-- wand star -->
<g transform="translate(22 3)">
<path d="M 2 0 L 2.6 1.8 L 4.4 1.8 L 3 2.9 L 3.6 4.6 L 2 3.5 L 0.4 4.6 L 1 2.9 L -0.4 1.8 L 1.4 1.8 Z"/>
<g transform="translate(30 3) scale(0.7)">
<path d="M 3 0 L 4 2.5 L 7 2.8 L 4.7 4.7 L 5.5 7.5 L 3 6 L 0.5 7.5 L 1.3 4.7 L -1 2.8 L 2 2.5 Z"/>
</g>
<!-- wings -->
<path d="M 5 14 Q -3 10 -2 22 Q 3 20 7 18 Z" opacity="0.55"/>
<path d="M 15 14 Q 23 10 22 22 Q 17 20 13 18 Z" opacity="0.55"/>
<!-- legs -->
<path d="M 7 30 L 6 38 L 8 38 L 9 30 Z"/>
<path d="M 13 30 L 14 38 L 12 38 L 11 30 Z"/>
<path d="M 7 18 Q -2 14 -1 28 Q 4 25 9 23 Z" opacity="0.5"/>
<path d="M 19 18 Q 28 14 27 28 Q 22 25 17 23 Z" opacity="0.5"/>
</g>
<!-- Magical swoosh trail from upper right arcing down -->
<path d="M 385 18 C 410 8 418 28 408 48 C 414 40 416 28 405 24 C 400 22 392 22 385 26 Z" fill="#2E8B57" opacity="0.9"/>
<path d="M 395 58 C 408 56 414 48 412 40 C 410 46 404 50 395 52 Z" fill="#2E8B57" opacity="0.7"/>
<!-- Sparkles -->
<circle cx="392" cy="8" r="2.2" fill="#2E8B57"/>
<circle cx="408" cy="14" r="1.4" fill="#2E8B57"/>
<circle cx="378" cy="24" r="1.6" fill="#2E8B57"/>
<g fill="#2E8B57">
<path d="M 400 72 L 401.2 75 L 404.2 75 L 401.7 77 L 402.8 80 L 400 78.2 L 397.2 80 L 398.3 77 L 395.8 75 L 398.8 75 Z"/>
<!-- Sparkles scattered -->
<g fill="#3CB371">
<circle cx="450" cy="18" r="2.4"/>
<circle cx="438" cy="32" r="1.4"/>
<circle cx="460" cy="42" r="1.8"/>
<circle cx="430" cy="10" r="1.2" opacity="0.7"/>
<path d="M 455 62 L 456.5 65.5 L 460 66 L 457.5 68.5 L 458.5 72 L 455 70 L 451.5 72 L 452.5 68.5 L 450 66 L 453.5 65.5 Z" opacity="0.85"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

+145 -80
View File
@@ -2,14 +2,14 @@
import { useState, FormEvent } from "react";
import { useRouter } from "next/navigation";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { User, Lock, Eye, EyeOff, ArrowRight, Phone, Mail, MapPin } from "lucide-react";
import Swal from "sweetalert2";
export default function LoginPage() {
const router = useRouter();
const [userId, setUserId] = useState("");
const [password, setPassword] = useState("");
const [showPw, setShowPw] = useState(false);
const [loading, setLoading] = useState(false);
const handleSubmit = async (e: FormEvent) => {
@@ -47,94 +47,159 @@ export default function LoginPage() {
};
return (
<div className="min-h-screen flex flex-col bg-gradient-to-br from-[#0d3b24] via-[#1b5e3a] to-[#0f4a2a] relative overflow-hidden">
<div className="flex-1 flex items-center justify-center px-4">
<div className="w-full max-w-sm">
<div className="text-center mb-8">
<img
src="/momo-logo.svg"
alt="MOMO"
width={180}
height={68}
className="mx-auto mb-3 drop-shadow-[0_4px_12px_rgba(0,0,0,0.3)]"
/>
<h1 className="text-2xl font-bold text-white tracking-tight">
</h1>
<p className="text-emerald-100/70 text-sm mt-1 tracking-wide">
ERP
</p>
<div className="min-h-screen flex flex-col lg:flex-row bg-white">
{/* 좌측: 브랜드 히어로 패널 */}
<div className="relative lg:flex-1 lg:min-h-screen overflow-hidden bg-gradient-to-br from-[#0d3b24] via-[#1b5e3a] to-[#0f4a2a] px-10 py-16 lg:py-0 flex flex-col justify-between">
{/* 배경 패턴 */}
<div
className="absolute inset-0 pointer-events-none opacity-30"
style={{
backgroundImage:
"radial-gradient(circle at 20% 30%, rgba(126,217,167,0.25) 0, transparent 40%), radial-gradient(circle at 80% 70%, rgba(46,139,87,0.3) 0, transparent 45%), radial-gradient(circle at 50% 50%, rgba(60,179,113,0.18) 0, transparent 55%)",
}}
/>
<div
className="absolute inset-0 pointer-events-none"
style={{
backgroundImage:
"linear-gradient(rgba(255,255,255,0.04) 1px, transparent 0), linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 0)",
backgroundSize: "48px 48px",
}}
/>
{/* 반짝이 파티클 */}
<div className="absolute inset-0 pointer-events-none">
<div className="absolute top-[12%] left-[18%] w-1 h-1 rounded-full bg-emerald-200/80 animate-pulse" />
<div className="absolute top-[25%] right-[22%] w-2 h-2 rounded-full bg-emerald-300/60 animate-pulse" style={{ animationDelay: "1s" }} />
<div className="absolute bottom-[28%] left-[35%] w-1.5 h-1.5 rounded-full bg-emerald-200/70 animate-pulse" style={{ animationDelay: "2s" }} />
<div className="absolute top-[60%] right-[15%] w-1 h-1 rounded-full bg-emerald-100/80 animate-pulse" style={{ animationDelay: "0.5s" }} />
</div>
<div className="relative z-10">
<div className="flex items-center gap-3">
<img src="/momo-icon.svg" alt="MOMO" className="w-11 h-11" />
<span className="text-white/95 text-sm font-semibold tracking-widest">
MOMO DISTRIBUTION
</span>
</div>
</div>
<form
onSubmit={handleSubmit}
className="bg-white rounded-xl shadow-2xl p-8 space-y-5"
>
<div>
<label className="block text-xs font-medium text-gray-500 mb-1.5">
</label>
<Input
type="text"
value={userId}
onChange={(e) => setUserId(e.target.value)}
placeholder="사용자 아이디를 입력하세요"
autoFocus
autoComplete="username"
/>
</div>
<div>
<label className="block text-xs font-medium text-gray-500 mb-1.5">
</label>
<Input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="비밀번호를 입력하세요"
autoComplete="current-password"
/>
</div>
<Button
type="submit"
disabled={loading}
className="w-full h-11 text-sm font-semibold bg-emerald-700 hover:bg-emerald-800"
>
{loading ? "로그인 중..." : "로그인"}
</Button>
</form>
<p className="text-center text-emerald-100/50 text-xs mt-6">
&copy; 2026 MOMO DISTRIBUTION. All rights reserved.
<div className="relative z-10 flex-1 flex flex-col justify-center py-12 lg:py-0">
<img src="/momo-logo.svg" alt="MOMO" className="w-[280px] lg:w-[360px] mb-6 drop-shadow-[0_8px_24px_rgba(0,0,0,0.35)]" />
<h2 className="text-white text-3xl lg:text-4xl font-bold mb-3 tracking-tight">
<span className="text-emerald-200"> ERP</span>
</h2>
<p className="text-emerald-100/80 text-base lg:text-lg leading-relaxed max-w-lg">
· · · <br />
.
</p>
</div>
<div className="relative z-10 text-emerald-100/70 text-[12px] space-y-1.5">
<div className="flex items-center gap-2">
<MapPin size={13} className="shrink-0" />
<span><span className="text-emerald-200 font-semibold mr-2"></span> 46 B동</span>
</div>
<div className="flex items-center gap-2">
<MapPin size={13} className="shrink-0" />
<span><span className="text-emerald-200 font-semibold mr-2"></span> 451 210</span>
</div>
<div className="flex items-center gap-4 pt-1 text-emerald-100/60">
<span className="flex items-center gap-1.5"><Phone size={12} />010-6624-5315</span>
<span className="flex items-center gap-1.5"><Mail size={12} />momo8443@daum.net</span>
</div>
</div>
</div>
<footer className="bg-white/95 border-t border-emerald-100 px-6 py-4">
<div className="max-w-5xl mx-auto flex flex-wrap items-center gap-6">
<div className="flex items-center gap-3">
<img src="/momo-logo.svg" alt="MOMO" width={90} height={34} />
<span className="text-xs font-bold text-emerald-700 tracking-widest">
</span>
{/* 우측: 로그인 폼 */}
<div className="lg:flex-1 flex items-center justify-center px-6 py-16 lg:py-0 bg-slate-50">
<div className="w-full max-w-md">
<div className="mb-10">
<div className="inline-flex items-center gap-2 text-emerald-700 text-xs font-bold tracking-widest mb-3">
<span className="w-6 h-[2px] bg-emerald-600" />
WELCOME BACK
</div>
<h1 className="text-3xl font-bold text-slate-900 mb-2"></h1>
<p className="text-slate-500 text-sm">
ERP에 .
</p>
</div>
<div className="text-[11px] text-gray-600 leading-relaxed flex-1 min-w-[280px]">
<p>
<span className="font-bold text-emerald-700 mr-2"></span>
46 B동
</p>
<p>
<span className="font-bold text-emerald-700 mr-2"></span>
451 210
</p>
<p className="mt-0.5 text-gray-500">
T 010-6624-5315 &nbsp;·&nbsp; E momo8443@daum.net
<form onSubmit={handleSubmit} className="space-y-5">
<div>
<label className="block text-[12px] font-semibold text-slate-600 mb-2 tracking-wide">
</label>
<div className="relative group">
<User
size={16}
className="absolute left-4 top-1/2 -translate-y-1/2 text-slate-400 group-focus-within:text-emerald-600 transition-colors"
/>
<input
type="text"
value={userId}
onChange={(e) => setUserId(e.target.value)}
placeholder="아이디를 입력하세요"
autoFocus
autoComplete="username"
className="w-full h-12 pl-11 pr-4 rounded-xl border border-slate-200 bg-white text-sm text-slate-900 placeholder-slate-400 shadow-sm focus:outline-none focus:border-emerald-500 focus:ring-4 focus:ring-emerald-500/10 transition"
/>
</div>
</div>
<div>
<label className="block text-[12px] font-semibold text-slate-600 mb-2 tracking-wide">
</label>
<div className="relative group">
<Lock
size={16}
className="absolute left-4 top-1/2 -translate-y-1/2 text-slate-400 group-focus-within:text-emerald-600 transition-colors"
/>
<input
type={showPw ? "text" : "password"}
value={password}
onChange={(e) => setPassword(e.target.value)}
placeholder="비밀번호를 입력하세요"
autoComplete="current-password"
className="w-full h-12 pl-11 pr-12 rounded-xl border border-slate-200 bg-white text-sm text-slate-900 placeholder-slate-400 shadow-sm focus:outline-none focus:border-emerald-500 focus:ring-4 focus:ring-emerald-500/10 transition"
/>
<button
type="button"
onClick={() => setShowPw((v) => !v)}
className="absolute right-3 top-1/2 -translate-y-1/2 p-1.5 text-slate-400 hover:text-slate-700 transition-colors"
tabIndex={-1}
>
{showPw ? <EyeOff size={16} /> : <Eye size={16} />}
</button>
</div>
</div>
<button
type="submit"
disabled={loading}
className="group relative w-full h-12 rounded-xl bg-gradient-to-r from-emerald-700 to-emerald-600 text-white text-sm font-bold tracking-wide shadow-lg shadow-emerald-600/25 hover:shadow-emerald-600/40 hover:-translate-y-0.5 active:translate-y-0 transition-all disabled:opacity-60 disabled:cursor-not-allowed disabled:translate-y-0 flex items-center justify-center gap-2"
>
{loading ? (
<>
<span className="w-4 h-4 border-2 border-white/40 border-t-white rounded-full animate-spin" />
...
</>
) : (
<>
<ArrowRight size={16} className="group-hover:translate-x-0.5 transition-transform" />
</>
)}
</button>
</form>
<div className="mt-12 pt-6 border-t border-slate-200 text-center">
<p className="text-[11px] text-slate-400 tracking-wide">
&copy; 2026 MOMO DISTRIBUTION. All rights reserved.
</p>
</div>
</div>
</footer>
</div>
</div>
);
}
+5 -3
View File
@@ -2,10 +2,12 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64">
<defs>
<linearGradient id="fg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#2E8B57"/>
<stop offset="0%" stop-color="#1b5e3a"/>
<stop offset="100%" stop-color="#3CB371"/>
</linearGradient>
</defs>
<rect width="64" height="64" rx="14" fill="url(#fg)"/>
<text x="32" y="42" font-family="Helvetica, Arial, sans-serif" font-size="20" font-weight="900" fill="#ffffff" text-anchor="middle" letter-spacing="-1">MOMO</text>
<rect width="64" height="64" rx="16" fill="url(#fg)"/>
<text x="32" y="43" font-family="'Segoe UI', 'Helvetica Neue', Arial, sans-serif" font-size="32" font-weight="900" fill="#ffffff" text-anchor="middle" letter-spacing="-2">M</text>
<circle cx="51" cy="14" r="2" fill="#ffffff" opacity="0.95"/>
<circle cx="56" cy="20" r="1.2" fill="#ffffff" opacity="0.7"/>
</svg>

Before

Width:  |  Height:  |  Size: 555 B

After

Width:  |  Height:  |  Size: 700 B