From 42567ab6e48a21b77b6e2d1b602e2b0321d02fd9 Mon Sep 17 00:00:00 2001 From: tolelom <98kimsungmin@naver.com> Date: Wed, 18 Mar 2026 10:52:17 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=8F=BC=20=EC=9C=A0=ED=9A=A8=EC=84=B1?= =?UTF-8?q?=20=ED=94=BC=EB=93=9C=EB=B0=B1=20+=20=EB=AA=A8=EB=B0=94?= =?UTF-8?q?=EC=9D=BC=20=EB=B0=98=EC=9D=91=ED=98=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 폼 검증: - RegisterPage: 아이디 실시간 검증, 비밀번호 강도, 확인 일치 - LoginPage: aria-describedby 접근성 개선 반응형: - 768px 이하 레이아웃 최적화, 터치 타겟 44px Co-Authored-By: Claude Opus 4.6 (1M context) --- src/components/admin/AdminCommon.css | 54 ++++++++++++++++++++++++ src/pages/AdminPage.css | 40 ++++++++++++++++++ src/pages/AuthPage.css | 63 +++++++++++++++++++++++++--- src/pages/HomePage.css | 40 ++++++++++++++++++ src/pages/LoginPage.jsx | 4 +- src/pages/RegisterPage.jsx | 51 ++++++++++++++-------- 6 files changed, 229 insertions(+), 23 deletions(-) diff --git a/src/components/admin/AdminCommon.css b/src/components/admin/AdminCommon.css index de48832..51e45e5 100644 --- a/src/components/admin/AdminCommon.css +++ b/src/components/admin/AdminCommon.css @@ -305,3 +305,57 @@ background: rgba(255, 255, 255, 0.08); color: rgba(255, 255, 255, 0.45); } + +/* Mobile responsive */ +@media (max-width: 768px) { + .admin-form { + padding: 16px 12px; + } + + .admin-input, + .admin-textarea { + width: 100%; + box-sizing: border-box; + } + + .admin-list-item { + flex-direction: column; + align-items: flex-start; + gap: 8px; + padding: 10px 12px; + } + + .admin-list-info { + width: 100%; + } + + .admin-list-actions { + width: 100%; + justify-content: flex-end; + } + + .admin-form-actions { + flex-direction: column; + } + + .admin-form-actions button { + width: 100%; + min-height: 44px; + } + + .btn-admin-primary, + .btn-admin-secondary, + .btn-admin-edit, + .btn-admin-delete { + min-height: 44px; + } + + .admin-meta-row { + flex-direction: column; + } + + .admin-deploy-header { + flex-direction: column; + align-items: flex-start; + } +} diff --git a/src/pages/AdminPage.css b/src/pages/AdminPage.css index 59fb36e..c8c060d 100644 --- a/src/pages/AdminPage.css +++ b/src/pages/AdminPage.css @@ -95,3 +95,43 @@ margin: 0 auto; padding: 32px 24px 80px; } + +/* Mobile responsive */ +@media (max-width: 768px) { + .admin-header { + flex-direction: column; + gap: 12px; + padding: 12px 16px; + } + + .admin-header-left { + width: 100%; + justify-content: center; + } + + .admin-header-right { + width: 100%; + justify-content: center; + } + + .admin-tabs { + padding: 12px 16px 0; + overflow-x: auto; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; + } + + .admin-tabs::-webkit-scrollbar { + display: none; + } + + .admin-tab { + white-space: nowrap; + flex-shrink: 0; + min-height: 44px; + } + + .admin-main { + padding: 20px 12px 60px; + } +} diff --git a/src/pages/AuthPage.css b/src/pages/AuthPage.css index 1a00ba8..a16860b 100644 --- a/src/pages/AuthPage.css +++ b/src/pages/AuthPage.css @@ -165,12 +165,65 @@ color: rgba(255, 255, 255, 0.7); } -.password-strength { - font-size: 0.8rem; - color: rgba(186, 205, 176, 0.7); - margin: -12px 0 0; +/* Validation feedback */ +.input-hint { + font-size: 0.75rem; + color: #888; + margin-top: 2px; } -.password-strength.strength-weak { +.input-hint-error { color: #e57373; } + +.input-hint-success { + color: #bacdb0; +} + +.input-group input.input-valid { + border-color: #bacdb0 !important; +} + +.input-group input.input-invalid { + border-color: #e57373 !important; +} + +.password-strength { + font-size: 0.75rem; + margin-top: 2px; +} + +.strength-weak { + color: #e57373; +} + +.strength-medium { + color: #ffd54f; +} + +.strength-strong { + color: #bacdb0; +} + +/* Mobile responsive */ +@media (max-width: 768px) { + .login-panel { + max-width: 100%; + padding: 32px 20px; + margin: 0 12px; + border-radius: 8px; + } + + .game-title { + font-size: 2.2rem; + } + + .login-header { + margin-bottom: 28px; + } + + .btn-login, + .btn-ssafy { + min-height: 44px; + } +} diff --git a/src/pages/HomePage.css b/src/pages/HomePage.css index 885fd4b..efd630e 100644 --- a/src/pages/HomePage.css +++ b/src/pages/HomePage.css @@ -124,3 +124,43 @@ margin: 0 auto; padding: 40px 24px 80px; } + +/* Mobile responsive */ +@media (max-width: 768px) { + .home-header { + flex-direction: column; + gap: 12px; + padding: 12px 16px; + text-align: center; + } + + .home-user { + width: 100%; + justify-content: center; + } + + .hero-banner { + height: 180px; + } + + .hero-title { + font-size: 1.8rem; + } + + .hero-desc { + font-size: 0.85rem; + } + + .home-main { + padding: 24px 16px 60px; + } + + .btn-logout, + .btn-admin-link, + .btn-header-login { + min-height: 44px; + display: inline-flex; + align-items: center; + justify-content: center; + } +} diff --git a/src/pages/LoginPage.jsx b/src/pages/LoginPage.jsx index de17398..8d4316a 100644 --- a/src/pages/LoginPage.jsx +++ b/src/pages/LoginPage.jsx @@ -51,6 +51,7 @@ export default function LoginPage() { placeholder="아이디를 입력하세요" autoComplete="username" maxLength={50} + aria-describedby={error ? 'login-error' : undefined} /> @@ -64,11 +65,12 @@ export default function LoginPage() { placeholder="비밀번호를 입력하세요" autoComplete="current-password" maxLength={72} + aria-describedby={error ? 'login-error' : undefined} /> {justRegistered &&

회원가입이 완료되었습니다. 로그인해주세요.

} - {error &&

{error}

} + {error && }