feat: 모바일 UX 대폭 개선 + PWA 구현 + 로그인 루프 수정
- 모바일 하단 네비: 메뉴 제거, 4개 핵심 기능(홈/TBM/작업보고/출근) SVG 아이콘 - 모바일 사이드바 스킵: 768px 이하에서 사이드바 미로드, 레이아웃 오프셋 해결 - 모바일 헤더: 햄버거 메뉴 숨김, 본문 margin/overflow 정리 - TBM 모바일: 풀스크린 모달, 저장 버튼 하단 고정, 터치 UX 개선 - PWA: manifest.json, sw.js(network-first), 앱 아이콘, iOS 메타태그, 킬스위치 - 로그인 무한루프 수정: 토큰 만료 검증, 쿠키 정리, loginPage 경로 수정 - 신고 메뉴 tkreport 리다이렉트: navbar + sidebar cross-system-link 적용 - TBM API: 작업장별 안전점검 체크리스트 조회 엔드포인트 추가 - 안전점검 체크리스트 관리 UI 개선 - tkuser: 이슈유형 관리 기능 추가 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,6 +10,11 @@
|
||||
padding: 0 0.5rem !important;
|
||||
}
|
||||
|
||||
html, body {
|
||||
overflow-x: hidden !important;
|
||||
max-width: 100vw !important;
|
||||
}
|
||||
|
||||
body {
|
||||
padding-top: 52px !important;
|
||||
}
|
||||
@@ -81,6 +86,19 @@
|
||||
|
||||
/* ========== 공통 모바일 스타일 ========== */
|
||||
@media (max-width: 768px) {
|
||||
/* 사이드바 마진 완전 제거 */
|
||||
.dashboard-container,
|
||||
.dashboard-main,
|
||||
.page-container,
|
||||
.main-content,
|
||||
.work-report-container,
|
||||
.analysis-container {
|
||||
margin-left: 0 !important;
|
||||
margin-right: 0 !important;
|
||||
max-width: 100% !important;
|
||||
width: 100% !important;
|
||||
}
|
||||
|
||||
/* 기본 여백 조정 */
|
||||
.dashboard-main,
|
||||
.page-container,
|
||||
|
||||
@@ -1050,8 +1050,9 @@
|
||||
@media (max-width: 768px) {
|
||||
.dashboard-main {
|
||||
padding: 0.75rem;
|
||||
margin-left: 0;
|
||||
margin: 0;
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* 헤더는 항상 가로 배치 유지 (navbar.html에서 관리) */
|
||||
|
||||
@@ -496,10 +496,15 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
z-index: 1100;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
/* 모달 열릴 때 하단 네비게이션 숨기기 */
|
||||
body.tbm-modal-open .mobile-bottom-nav {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.tbm-modal {
|
||||
background: white;
|
||||
border-radius: 16px;
|
||||
@@ -1037,6 +1042,13 @@
|
||||
color: #92400e;
|
||||
}
|
||||
|
||||
/* ===== 태스크 그리드 ===== */
|
||||
.tbm-task-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
/* ===== 반응형 ===== */
|
||||
@media (max-width: 768px) {
|
||||
.tbm-container {
|
||||
@@ -1075,18 +1087,114 @@
|
||||
|
||||
.tbm-worker-select-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
max-height: 50vh;
|
||||
}
|
||||
|
||||
/* 모달 → 풀스크린 시트 */
|
||||
.tbm-modal-overlay {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.tbm-modal {
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
max-width: 100% !important;
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
height: 100dvh;
|
||||
max-height: none;
|
||||
border-radius: 0;
|
||||
overflow: hidden;
|
||||
animation: mobileSlideUp 0.25s ease-out;
|
||||
}
|
||||
|
||||
.tbm-modal-header {
|
||||
flex-shrink: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
.tbm-modal-header,
|
||||
.tbm-modal-footer {
|
||||
border-radius: 0;
|
||||
.tbm-modal-body {
|
||||
flex: 1;
|
||||
min-height: 0;
|
||||
overflow-y: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
overscroll-behavior: contain;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.tbm-modal-footer {
|
||||
flex-shrink: 0;
|
||||
border-radius: 0;
|
||||
padding: 0.75rem 1rem;
|
||||
padding-bottom: calc(0.75rem + env(safe-area-inset-bottom));
|
||||
box-shadow: 0 -2px 10px rgba(0,0,0,0.15);
|
||||
background: #f8fafc;
|
||||
border-top: 1px solid #e2e8f0;
|
||||
}
|
||||
|
||||
.tbm-modal-footer .tbm-btn {
|
||||
flex: 1;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/* 버튼 최소 터치 영역 44px */
|
||||
.tbm-btn { min-height: 44px; }
|
||||
.tbm-btn-sm { min-height: 40px; padding: 0.5rem 1rem; }
|
||||
|
||||
/* 셀렉트 버튼 확대 */
|
||||
.tbm-select-btn {
|
||||
min-height: 48px;
|
||||
font-size: 0.9rem;
|
||||
padding: 0.75rem 1rem;
|
||||
}
|
||||
|
||||
/* 작업자 카드 터치 영역 */
|
||||
.tbm-worker-select-card { padding: 1rem; }
|
||||
|
||||
/* 안전 체크 항목 */
|
||||
.tbm-safety-item { padding: 0.875rem; min-height: 48px; }
|
||||
|
||||
/* 항목 선택 리스트 */
|
||||
.tbm-item-option { padding: 1rem; min-height: 48px; }
|
||||
.tbm-item-list { max-height: 60vh; }
|
||||
|
||||
/* 삭제 버튼 확대 (28px → 36px) */
|
||||
.tbm-worker-remove { width: 36px; height: 36px; font-size: 1.25rem; }
|
||||
|
||||
/* 세션 카드 액션 버튼 */
|
||||
.tbm-card-footer {
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
padding: 0.75rem 1rem;
|
||||
}
|
||||
.tbm-card-footer .tbm-btn {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
/* 터치 피드백 */
|
||||
.tbm-btn:active,
|
||||
.tbm-select-btn:active,
|
||||
.tbm-worker-select-card:active,
|
||||
.tbm-safety-item:active,
|
||||
.tbm-item-option:active,
|
||||
.tbm-session-card:active {
|
||||
transform: scale(0.97);
|
||||
opacity: 0.85;
|
||||
transition: transform 0.1s, opacity 0.1s;
|
||||
}
|
||||
|
||||
/* 탭 하이라이트 제거 */
|
||||
.tbm-btn, .tbm-select-btn, .tbm-worker-select-card,
|
||||
.tbm-safety-item, .tbm-item-option, .tbm-session-card,
|
||||
.tbm-tab-btn, .tbm-modal-close {
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
touch-action: manipulation;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes mobileSlideUp {
|
||||
from { transform: translateY(30%); opacity: 0.5; }
|
||||
to { transform: translateY(0); opacity: 1; }
|
||||
}
|
||||
|
||||
@media (max-width: 480px) {
|
||||
@@ -1098,6 +1206,11 @@
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.tbm-task-grid {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 0.375rem;
|
||||
}
|
||||
|
||||
.tbm-section-header {
|
||||
flex-direction: column;
|
||||
align-items: stretch;
|
||||
|
||||
Reference in New Issue
Block a user