refactor(web-ui): 전체 UI 반응형 디자인 개선

모든 화면 크기에서 일관되고 안정적인 사용자 경험을 제공하도록
UI 컴포넌트를 전면 개선했습니다.

주요 변경사항:
- 네비게이션 바: flex-wrap, rem 단위, sticky positioning 적용
- 사용자 정보 영역: max-width로 크기 제한, 텍스트 overflow 처리
- 공통 헤더: clamp()로 반응형 폰트, 반응형 패딩 적용
- 모든 관리 페이지: ES6 모듈 로딩 통일 (type="module")
- 반응형 breakpoint: 1200px, 768px, 640px, 480px

개선 효과:
 모든 페이지에서 일관된 헤더 표시
 사용자 정보 영역 늘어나는 문제 해결
 모든 화면 크기에서 최적화된 레이아웃
 rem 단위 사용으로 접근성 개선

수정된 파일:
- web-ui/components/navbar.html: 전면 리팩토링
- web-ui/css/common.css: 반응형 스타일 추가
- web-ui/pages/**/*.html: 모듈 로딩 및 버전 업데이트 (13개 파일)
- web-ui/js/*.js: 모듈 시스템 개선

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Hyungi Ahn
2026-01-19 08:54:44 +09:00
parent 344ad35651
commit d810a8b339
14 changed files with 645 additions and 131 deletions

View File

@@ -66,65 +66,85 @@
<style>
.navbar {
background: linear-gradient(135deg, #1976d2 0%, #1565c0 100%);
padding: 12px 24px;
padding: 0.75rem 1.5rem;
color: white;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
gap: 1rem;
box-shadow: 0 0.25rem 0.75rem rgba(0,0,0,0.15);
font-family: 'Malgun Gothic', sans-serif;
position: relative;
position: sticky;
top: 0;
z-index: 1000;
min-height: 4rem;
}
.navbar-brand {
display: flex;
align-items: center;
gap: 12px;
gap: 0.75rem;
min-width: 0;
flex-shrink: 0;
}
.logo-small {
height: 40px;
height: 2.5rem;
width: auto;
border-radius: 6px;
border-radius: 0.375rem;
flex-shrink: 0;
}
.brand-content {
display: flex;
flex-direction: column;
min-width: 0;
}
.brand-text {
font-size: 1.2rem;
font-size: 1.125rem;
font-weight: 700;
line-height: 1.2;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.brand-subtitle {
font-size: 0.8rem;
font-size: 0.75rem;
opacity: 0.9;
font-weight: 400;
white-space: nowrap;
}
.navbar-center {
display: flex;
align-items: center;
flex: 0 1 auto;
justify-content: center;
min-width: 0;
}
.current-time {
font-size: 0.9rem;
font-size: 0.875rem;
font-weight: 500;
padding: 8px 16px;
padding: 0.5rem 1rem;
background: rgba(255,255,255,0.1);
border-radius: 20px;
border-radius: 1.25rem;
backdrop-filter: blur(10px);
border: 1px solid rgba(255,255,255,0.2);
white-space: nowrap;
}
.navbar-menu {
display: flex;
align-items: center;
gap: 20px;
gap: 1.25rem;
flex-shrink: 1;
flex-wrap: nowrap;
justify-content: flex-end;
min-width: 0;
}
/* 프로필 드롭다운 스타일 */
@@ -135,29 +155,34 @@
.user-info {
display: flex;
align-items: center;
gap: 12px;
padding: 8px 16px;
gap: 0.75rem;
padding: 0.5rem 1rem;
background: rgba(255,255,255,0.1);
border-radius: 25px;
border-radius: 1.5625rem;
backdrop-filter: blur(10px);
border: 1px solid rgba(255,255,255,0.2);
cursor: pointer;
transition: all 0.3s ease;
min-width: 0;
max-width: 15rem;
flex-shrink: 0;
}
.user-info:hover {
background: rgba(255,255,255,0.2);
transform: translateY(-1px);
}
.user-info.active {
background: rgba(255,255,255,0.25);
box-shadow: 0 0 0 3px rgba(255,255,255,0.2);
box-shadow: 0 0 0 0.1875rem rgba(255,255,255,0.2);
}
.dropdown-arrow {
font-size: 0.7rem;
margin-left: 4px;
font-size: 0.625rem;
margin-left: 0.25rem;
transition: transform 0.3s ease;
flex-shrink: 0;
}
.user-info.active .dropdown-arrow {
@@ -165,47 +190,55 @@
}
.user-avatar {
width: 36px;
height: 36px;
width: 2.25rem;
height: 2.25rem;
background: rgba(255,255,255,0.2);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
font-size: 1.125rem;
flex-shrink: 0;
}
.user-details {
display: flex;
flex-direction: column;
align-items: flex-start;
min-width: 0;
}
.user-name {
font-weight: 600;
font-size: 0.9rem;
font-size: 0.875rem;
line-height: 1.2;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
}
.user-role {
font-size: 0.7rem;
font-size: 0.6875rem;
opacity: 0.8;
font-weight: 400;
white-space: nowrap;
}
/* 드롭다운 메뉴 */
.dropdown-menu {
position: absolute;
top: calc(100% + 8px);
top: calc(100% + 0.5rem);
right: 0;
background: white;
border-radius: 12px;
box-shadow: 0 8px 24px rgba(0,0,0,0.15);
min-width: 240px;
border-radius: 0.75rem;
box-shadow: 0 0.5rem 1.5rem rgba(0,0,0,0.15);
min-width: 15rem;
max-width: 20rem;
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: all 0.3s ease;
transform: translateY(-0.625rem);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
overflow: hidden;
}
@@ -278,24 +311,26 @@
background: #ffebee;
}
/* 기존 버튼 스타일 */
/* 버튼 스타일 */
.navbar-buttons {
display: flex;
gap: 12px;
gap: 0.75rem;
flex-wrap: wrap;
}
.nav-btn {
padding: 8px 16px;
padding: 0.5rem 1rem;
border: none;
border-radius: 20px;
font-size: 0.85rem;
border-radius: 1.25rem;
font-size: 0.8125rem;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
align-items: center;
gap: 6px;
gap: 0.375rem;
font-family: inherit;
white-space: nowrap;
}
.dashboard-btn {
@@ -306,29 +341,29 @@
.dashboard-btn:hover {
background: rgba(255,255,255,0.25);
transform: translateY(-1px);
transform: translateY(-0.0625rem);
box-shadow: 0 0.25rem 0.5rem rgba(0,0,0,0.1);
}
.system-btn {
background: linear-gradient(135deg, #9c27b0 0%, #673ab7 100%);
color: white;
border: 1px solid rgba(255,255,255,0.3);
box-shadow: 0 2px 8px rgba(156,39,176,0.3);
box-shadow: 0 0.125rem 0.5rem rgba(156,39,176,0.3);
}
.system-btn:hover {
background: linear-gradient(135deg, #8e24aa 0%, #5e35b1 100%);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(156,39,176,0.4);
transform: translateY(-0.0625rem);
box-shadow: 0 0.25rem 0.75rem rgba(156,39,176,0.4);
}
/* 반응형 */
@media (max-width: 1024px) {
/* 반응형 디자인 */
@media (max-width: 1200px) {
.navbar {
padding: 12px 20px;
justify-content: space-between;
}
.navbar-center {
display: none;
}
@@ -336,33 +371,96 @@
@media (max-width: 768px) {
.navbar {
padding: 12px 16px;
padding: 0.625rem 1rem;
gap: 0.75rem;
}
.navbar-brand {
gap: 0.5rem;
flex: 0 0 auto;
}
.brand-text {
font-size: 1rem;
}
.brand-subtitle {
font-size: 0.6875rem;
}
.navbar-menu {
gap: 0.75rem;
flex-wrap: wrap;
}
.navbar-buttons {
gap: 0.5rem;
}
.nav-btn {
padding: 0.4rem 0.75rem;
font-size: 0.75rem;
}
.user-info {
max-width: 12rem;
}
.dropdown-menu {
right: 0;
min-width: 12rem;
}
}
@media (max-width: 640px) {
.brand-content {
display: none;
}
.navbar-menu {
gap: 12px;
.navbar-center {
display: none;
}
.dropdown-menu {
right: -16px;
.navbar-buttons .nav-btn {
font-size: 0;
padding: 0.5rem;
gap: 0;
}
.navbar-buttons .nav-btn::before {
content: attr(title);
font-size: 1.125rem;
}
.user-details {
display: none;
}
.dropdown-arrow {
display: none;
}
.user-info {
padding: 0.5rem;
}
}
@media (max-width: 480px) {
.dashboard-btn, .admin-btn, .system-btn {
display: none;
.navbar {
padding: 0.5rem 0.75rem;
}
.user-details {
display: none;
.logo-small {
height: 2rem;
}
.dropdown-arrow {
display: none;
.navbar-buttons {
gap: 0.375rem;
}
.dropdown-menu {
right: -0.5rem;
min-width: 10rem;
}
}
</style>