feat: 웹 클라이언트 비주얼 오버홀 — 게임 에셋 적용
- 홈페이지: 드래곤 히어로 배경(bg_loading), fixed 헤더, 로고, 마을 배경 다운로드 섹션 - 로그인/회원가입: 고딕 성문 배경(bg_login), 카드 프레임, 게임 버튼 - 공통: btn-game, card-game, divider-game CSS 클래스 추가 - 게임 에셋 PNG → WebP 변환 (6MB → 80~234KB) - 관리자 페이지: 로고/divider 추가 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1
.gitignore
vendored
@@ -23,3 +23,4 @@ dist-ssr
|
|||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
.superpowers/
|
||||||
|
|||||||
BIN
public/images/bg_loading.webp
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
public/images/bg_login.webp
Normal file
|
After Width: | Height: | Size: 218 KiB |
BIN
public/images/bg_main.webp
Normal file
|
After Width: | Height: | Size: 234 KiB |
BIN
public/images/btn_normal.webp
Normal file
|
After Width: | Height: | Size: 43 KiB |
BIN
public/images/btn_pressed.webp
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/images/card_frame.webp
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
public/images/divider.webp
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
public/images/logo.webp
Normal file
|
After Width: | Height: | Size: 126 KiB |
@@ -1,5 +1,6 @@
|
|||||||
.announcement-board {
|
.announcement-board {
|
||||||
margin-top: 32px;
|
margin-top: 32px;
|
||||||
|
padding: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.announcement-heading {
|
.announcement-heading {
|
||||||
@@ -7,8 +8,9 @@
|
|||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
color: rgba(255, 255, 255, 0.9);
|
color: rgba(255, 255, 255, 0.9);
|
||||||
margin: 0 0 16px;
|
margin: 0 0 16px;
|
||||||
padding-bottom: 12px;
|
padding-bottom: 0;
|
||||||
border-bottom: 1px solid rgba(186, 205, 176, 0.15);
|
border-bottom: none;
|
||||||
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.announcement-list {
|
.announcement-list {
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
.download-section {
|
.download-section {
|
||||||
background: rgba(186, 205, 176, 0.06);
|
position: relative;
|
||||||
border: 1px solid rgba(186, 205, 176, 0.12);
|
background:
|
||||||
|
linear-gradient(to bottom, rgba(0,0,0,0.7), rgba(0,0,0,0.6)),
|
||||||
|
url('/images/bg_main.webp') center/cover no-repeat;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 48px 40px;
|
padding: 60px 40px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.download-title {
|
.download-title {
|
||||||
|
|||||||
@@ -30,4 +30,52 @@ a {
|
|||||||
|
|
||||||
a:hover {
|
a:hover {
|
||||||
opacity: 0.85;
|
opacity: 0.85;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ── Game asset common classes ───────────────────── */
|
||||||
|
|
||||||
|
.btn-game {
|
||||||
|
position: relative;
|
||||||
|
border: none;
|
||||||
|
color: #fff;
|
||||||
|
padding: 14px 40px;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
font-weight: 700;
|
||||||
|
cursor: pointer;
|
||||||
|
background: url('/images/btn_normal.webp') center/100% 100% no-repeat;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
overflow: hidden;
|
||||||
|
transition: transform 0.15s, brightness 0.15s;
|
||||||
|
}
|
||||||
|
.btn-game:hover { transform: translateY(-1px); filter: brightness(1.2); }
|
||||||
|
.btn-game:disabled { opacity: 0.5; cursor: not-allowed; transform: none; }
|
||||||
|
.btn-game > * { position: relative; z-index: 1; }
|
||||||
|
|
||||||
|
.card-game {
|
||||||
|
position: relative;
|
||||||
|
background: rgba(0, 0, 0, 0.6);
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.card-game::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
inset: -8px;
|
||||||
|
background: url('/images/card_frame.webp') center/100% 100% no-repeat;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
.card-game > * { position: relative; z-index: 1; }
|
||||||
|
|
||||||
|
.divider-game {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 400px;
|
||||||
|
height: 20px;
|
||||||
|
background: url('/images/divider.webp') center/contain no-repeat;
|
||||||
|
margin: 2rem auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.card-game::before { display: none; }
|
||||||
|
.card-game { border: 1px solid rgba(186, 205, 176, 0.3); }
|
||||||
}
|
}
|
||||||
@@ -96,6 +96,19 @@
|
|||||||
padding: 32px 24px 80px;
|
padding: 32px 24px 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.admin-logo {
|
||||||
|
height: 32px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.admin-tabs-divider {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 300px;
|
||||||
|
height: 16px;
|
||||||
|
background: url('/images/divider.webp') center/contain no-repeat;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
/* Mobile responsive */
|
/* Mobile responsive */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.admin-header {
|
.admin-header {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export default function AdminPage() {
|
|||||||
<header className="admin-header">
|
<header className="admin-header">
|
||||||
<div className="admin-header-left">
|
<div className="admin-header-left">
|
||||||
<Link to="/" className="admin-home-link">← 메인으로</Link>
|
<Link to="/" className="admin-home-link">← 메인으로</Link>
|
||||||
|
<img src="/images/logo.webp" alt="" className="admin-logo" />
|
||||||
<h1 className="admin-title">관리자 페이지</h1>
|
<h1 className="admin-title">관리자 페이지</h1>
|
||||||
</div>
|
</div>
|
||||||
<div className="admin-header-right">
|
<div className="admin-header-right">
|
||||||
@@ -44,6 +45,7 @@ export default function AdminPage() {
|
|||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
<div className="admin-tabs-divider"></div>
|
||||||
|
|
||||||
{/* Tabs are conditionally rendered (not hidden) to avoid stale data. Each panel re-fetches on mount. */}
|
{/* Tabs are conditionally rendered (not hidden) to avoid stale data. Each panel re-fetches on mount. */}
|
||||||
<main className="admin-main" role="tabpanel" id={`tabpanel-${tab}`} aria-labelledby={`tab-${tab}`}>
|
<main className="admin-main" role="tabpanel" id={`tabpanel-${tab}`} aria-labelledby={`tab-${tab}`}>
|
||||||
|
|||||||
@@ -3,20 +3,36 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
background-color: #2E2C2F;
|
background:
|
||||||
background-image:
|
radial-gradient(ellipse at center, rgba(0,0,0,0.3) 0%, rgba(0,0,0,0.8) 100%),
|
||||||
radial-gradient(ellipse at 20% 50%, rgba(186, 205, 176, 0.08) 0%, transparent 50%),
|
url('/images/bg_login.webp') center/cover no-repeat;
|
||||||
radial-gradient(ellipse at 80% 50%, rgba(186, 205, 176, 0.05) 0%, transparent 50%);
|
background-color: #1a1a1a;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-panel {
|
.login-panel {
|
||||||
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 400px;
|
max-width: 420px;
|
||||||
padding: 48px 40px;
|
padding: 48px 40px;
|
||||||
background: rgba(255, 255, 255, 0.04);
|
background: rgba(0, 0, 0, 0.6);
|
||||||
border: 1px solid rgba(186, 205, 176, 0.15);
|
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
backdrop-filter: blur(10px);
|
backdrop-filter: blur(12px);
|
||||||
|
overflow: hidden;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-panel::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
inset: -8px;
|
||||||
|
background: url('/images/card_frame.webp') center/100% 100% no-repeat;
|
||||||
|
pointer-events: none;
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-panel > * {
|
||||||
|
position: relative;
|
||||||
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-header {
|
.login-header {
|
||||||
@@ -116,21 +132,15 @@
|
|||||||
.login-divider {
|
.login-divider {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 16px;
|
justify-content: center;
|
||||||
margin: 24px 0;
|
margin: 24px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-divider::before,
|
.login-divider-img {
|
||||||
.login-divider::after {
|
width: 100%;
|
||||||
content: '';
|
max-width: 250px;
|
||||||
flex: 1;
|
height: 16px;
|
||||||
height: 1px;
|
background: url('/images/divider.webp') center/contain no-repeat;
|
||||||
background: rgba(255, 255, 255, 0.1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.login-divider span {
|
|
||||||
font-size: 0.8rem;
|
|
||||||
color: rgba(255, 255, 255, 0.35);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-ssafy {
|
.btn-ssafy {
|
||||||
@@ -212,6 +222,11 @@
|
|||||||
padding: 32px 20px;
|
padding: 32px 20px;
|
||||||
margin: 0 12px;
|
margin: 0 12px;
|
||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
|
border: 1px solid rgba(186, 205, 176, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-panel::before {
|
||||||
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.game-title {
|
.game-title {
|
||||||
|
|||||||
@@ -3,21 +3,44 @@
|
|||||||
background-color: #2E2C2F;
|
background-color: #2E2C2F;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Header */
|
/* Header - fixed with scroll effect */
|
||||||
.home-header {
|
.home-header {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 100;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
padding: 16px 32px;
|
padding: 16px 32px;
|
||||||
|
background: transparent;
|
||||||
|
transition: background 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.home-header.scrolled {
|
||||||
|
background: rgba(46, 44, 47, 0.85);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
border-bottom: 1px solid rgba(186, 205, 176, 0.1);
|
border-bottom: 1px solid rgba(186, 205, 176, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.home-logo {
|
.home-logo {
|
||||||
font-size: 1.5rem;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.home-logo img {
|
||||||
|
height: 40px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.home-logo-text {
|
||||||
|
font-size: 1.2rem;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
color: #BACDB0;
|
color: #BACDB0;
|
||||||
letter-spacing: 0.1em;
|
letter-spacing: 0.1em;
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.home-user {
|
.home-user {
|
||||||
@@ -77,13 +100,11 @@
|
|||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hero banner */
|
/* Hero banner - fullscreen with game background */
|
||||||
.hero-banner {
|
.hero-banner {
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 280px;
|
min-height: 100vh;
|
||||||
background:
|
background: url('/images/bg_loading.webp') center/cover no-repeat;
|
||||||
linear-gradient(135deg, rgba(46, 44, 47, 0.85), rgba(46, 44, 47, 0.6)),
|
|
||||||
linear-gradient(135deg, #2E2C2F 0%, #3a3a3a 50%, #2E2C2F 100%);
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
@@ -94,28 +115,62 @@
|
|||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
inset: 0;
|
inset: 0;
|
||||||
background:
|
background: linear-gradient(
|
||||||
radial-gradient(ellipse at 30% 40%, rgba(186, 205, 176, 0.12) 0%, transparent 60%),
|
to bottom,
|
||||||
radial-gradient(ellipse at 70% 60%, rgba(186, 205, 176, 0.06) 0%, transparent 50%);
|
rgba(0, 0, 0, 0.7) 0%,
|
||||||
|
rgba(0, 0, 0, 0.3) 50%,
|
||||||
|
rgba(0, 0, 0, 0.8) 100%
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-overlay {
|
.hero-overlay {
|
||||||
position: relative;
|
position: relative;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-logo {
|
||||||
|
width: 200px;
|
||||||
|
height: auto;
|
||||||
|
margin-bottom: 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-title {
|
.hero-title {
|
||||||
font-size: 2.8rem;
|
font-size: 3rem;
|
||||||
font-weight: 800;
|
font-weight: 800;
|
||||||
color: #BACDB0;
|
color: #BACDB0;
|
||||||
letter-spacing: 0.12em;
|
letter-spacing: 0.15em;
|
||||||
|
text-shadow: 0 2px 20px rgba(0, 0, 0, 0.5);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-desc {
|
.hero-desc {
|
||||||
font-size: 1rem;
|
font-size: 1.1rem;
|
||||||
color: rgba(255, 255, 255, 0.5);
|
color: rgba(255, 255, 255, 0.6);
|
||||||
|
letter-spacing: 0.3em;
|
||||||
margin: 12px 0 0;
|
margin: 12px 0 0;
|
||||||
|
text-shadow: 0 1px 10px rgba(0, 0, 0, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-cta {
|
||||||
|
margin-top: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-scroll-hint {
|
||||||
|
position: absolute;
|
||||||
|
bottom: 32px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
color: rgba(255, 255, 255, 0.4);
|
||||||
|
font-size: 0.8rem;
|
||||||
|
animation: bounce 2s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes bounce {
|
||||||
|
0%, 100% { transform: translateX(-50%) translateY(0); }
|
||||||
|
50% { transform: translateX(-50%) translateY(-8px); }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Main content */
|
/* Main content */
|
||||||
@@ -128,19 +183,23 @@
|
|||||||
/* Mobile responsive */
|
/* Mobile responsive */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.home-header {
|
.home-header {
|
||||||
flex-direction: column;
|
|
||||||
gap: 12px;
|
|
||||||
padding: 12px 16px;
|
padding: 12px 16px;
|
||||||
text-align: center;
|
}
|
||||||
|
|
||||||
|
.home-header.scrolled {
|
||||||
|
padding: 8px 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.home-user {
|
.home-user {
|
||||||
width: 100%;
|
gap: 8px;
|
||||||
justify-content: center;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-banner {
|
.hero-banner {
|
||||||
height: 180px;
|
min-height: 80vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-logo {
|
||||||
|
width: 120px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hero-title {
|
.hero-title {
|
||||||
@@ -149,6 +208,7 @@
|
|||||||
|
|
||||||
.hero-desc {
|
.hero-desc {
|
||||||
font-size: 0.85rem;
|
font-size: 0.85rem;
|
||||||
|
letter-spacing: 0.15em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.home-main {
|
.home-main {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { useState, useEffect } from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { useAuth } from '../context/useAuth';
|
import { useAuth } from '../context/useAuth';
|
||||||
import DownloadSection from '../components/DownloadSection';
|
import DownloadSection from '../components/DownloadSection';
|
||||||
@@ -7,11 +8,21 @@ import './HomePage.css';
|
|||||||
|
|
||||||
export default function HomePage() {
|
export default function HomePage() {
|
||||||
const { user, logout } = useAuth();
|
const { user, logout } = useAuth();
|
||||||
|
const [scrolled, setScrolled] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const onScroll = () => setScrolled(window.scrollY > 50);
|
||||||
|
window.addEventListener('scroll', onScroll);
|
||||||
|
return () => window.removeEventListener('scroll', onScroll);
|
||||||
|
}, []);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="home-page">
|
<div className="home-page">
|
||||||
<header className="home-header">
|
<header className={`home-header${scrolled ? ' scrolled' : ''}`}>
|
||||||
<h1 className="home-logo">One of the plans</h1>
|
<Link to="/" className="home-logo">
|
||||||
|
<img src="/images/logo.webp" alt="One of the Plans" />
|
||||||
|
<span className="home-logo-text">One of the Plans</span>
|
||||||
|
</Link>
|
||||||
<div className="home-user">
|
<div className="home-user">
|
||||||
{user ? (
|
{user ? (
|
||||||
<>
|
<>
|
||||||
@@ -30,14 +41,29 @@ export default function HomePage() {
|
|||||||
|
|
||||||
<section className="hero-banner">
|
<section className="hero-banner">
|
||||||
<div className="hero-overlay">
|
<div className="hero-overlay">
|
||||||
<h2 className="hero-title">One of the plans</h2>
|
<img src="/images/logo.webp" alt="" className="hero-logo" />
|
||||||
<p className="hero-desc">Unity 3D 멀티플레이어 테스트에 참여하세요</p>
|
<h2 className="hero-title">One of the Plans</h2>
|
||||||
|
<p className="hero-desc">MULTIPLAYER BOSS RAID</p>
|
||||||
|
<div className="hero-cta">
|
||||||
|
{user ? (
|
||||||
|
<a href="#download" className="btn-game" style={{display: 'inline-block', textDecoration: 'none'}}>
|
||||||
|
<span>게임 시작</span>
|
||||||
|
</a>
|
||||||
|
) : (
|
||||||
|
<Link to="/login" className="btn-game" style={{display: 'inline-block', textDecoration: 'none'}}>
|
||||||
|
<span>로그인</span>
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div className="hero-scroll-hint">▼ 스크롤</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<main className="home-main">
|
<main className="home-main" id="download">
|
||||||
|
<div className="divider-game"></div>
|
||||||
{user && <WalletSummary />}
|
{user && <WalletSummary />}
|
||||||
<DownloadSection />
|
<DownloadSection />
|
||||||
|
<div className="divider-game"></div>
|
||||||
<AnnouncementBoard />
|
<AnnouncementBoard />
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ export default function LoginPage() {
|
|||||||
<div className="login-page">
|
<div className="login-page">
|
||||||
<div className="login-panel">
|
<div className="login-panel">
|
||||||
<div className="login-header">
|
<div className="login-header">
|
||||||
|
<img src="/images/logo.webp" alt="One of the Plans" style={{maxWidth: 120, height: 'auto', margin: '0 auto 16px', display: 'block'}} />
|
||||||
<h1 className="game-title">One of the plans</h1>
|
<h1 className="game-title">One of the plans</h1>
|
||||||
<p className="game-subtitle">MULTIPLAYER</p>
|
<p className="game-subtitle">MULTIPLAYER</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -72,13 +73,13 @@ export default function LoginPage() {
|
|||||||
{justRegistered && <p className="login-success">회원가입이 완료되었습니다. 로그인해주세요.</p>}
|
{justRegistered && <p className="login-success">회원가입이 완료되었습니다. 로그인해주세요.</p>}
|
||||||
{error && <p id="login-error" className="login-error" role="alert">{error}</p>}
|
{error && <p id="login-error" className="login-error" role="alert">{error}</p>}
|
||||||
|
|
||||||
<button type="submit" className="btn-login" disabled={loading}>
|
<button type="submit" className="btn-login btn-game" disabled={loading}>
|
||||||
{loading ? '로그인 중...' : '로그인'}
|
{loading ? '로그인 중...' : '로그인'}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<div className="login-divider">
|
<div className="login-divider">
|
||||||
<span>또는</span>
|
<div className="login-divider-img"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ export default function RegisterPage() {
|
|||||||
<div className="login-page">
|
<div className="login-page">
|
||||||
<div className="login-panel">
|
<div className="login-panel">
|
||||||
<div className="login-header">
|
<div className="login-header">
|
||||||
|
<img src="/images/logo.webp" alt="One of the Plans" style={{maxWidth: 120, height: 'auto', margin: '0 auto 16px', display: 'block'}} />
|
||||||
<h1 className="game-title">One of the plans</h1>
|
<h1 className="game-title">One of the plans</h1>
|
||||||
<p className="game-subtitle">MULTIPLAYER</p>
|
<p className="game-subtitle">MULTIPLAYER</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -137,7 +138,7 @@ export default function RegisterPage() {
|
|||||||
|
|
||||||
{error && <p className="login-error" role="alert">{error}</p>}
|
{error && <p className="login-error" role="alert">{error}</p>}
|
||||||
|
|
||||||
<button type="submit" className="btn-login" disabled={loading}>
|
<button type="submit" className="btn-login btn-game" disabled={loading}>
|
||||||
{loading ? '처리 중...' : '회원가입'}
|
{loading ? '처리 중...' : '회원가입'}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -413,6 +413,19 @@
|
|||||||
color: rgba(255, 255, 255, 0.8);
|
color: rgba(255, 255, 255, 0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wallet-logo {
|
||||||
|
height: 32px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wallet-tabs-divider {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 300px;
|
||||||
|
height: 16px;
|
||||||
|
background: url('/images/divider.webp') center/contain no-repeat;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
/* Mobile responsive */
|
/* Mobile responsive */
|
||||||
@media (max-width: 768px) {
|
@media (max-width: 768px) {
|
||||||
.wallet-header {
|
.wallet-header {
|
||||||
|
|||||||