/* 작업 현황 캘린더 스타일 */ /* 월 네비게이션 */ .month-navigation { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-6); padding: var(--space-4); background: var(--white); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); } .month-nav-btn { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-3) var(--space-4); background: var(--primary-50); border: 1px solid var(--primary-200); border-radius: var(--radius-md); color: var(--primary-700); font-weight: 500; cursor: pointer; transition: var(--transition-normal); } .month-nav-btn:hover { background: var(--primary-100); border-color: var(--primary-300); transform: translateY(-1px); } .month-info { display: flex; align-items: center; gap: var(--space-4); } .month-info h2 { margin: 0; font-size: var(--text-2xl); font-weight: 700; color: var(--gray-900); } .today-btn { padding: var(--space-2) var(--space-4); background: var(--success-500); border: none; border-radius: var(--radius-md); color: var(--white); font-weight: 500; cursor: pointer; transition: var(--transition-normal); } .today-btn:hover { background: var(--success-600); transform: translateY(-1px); } /* 캘린더 범례 */ .calendar-legend { display: flex; align-items: center; justify-content: center; gap: var(--space-6); margin-bottom: var(--space-6); padding: var(--space-4); background: var(--gray-50); border-radius: var(--radius-lg); } .legend-item { display: flex; align-items: center; gap: var(--space-2); font-size: var(--text-sm); font-weight: 500; color: var(--gray-700); } .legend-dot { width: 12px; height: 12px; border-radius: 50%; flex-shrink: 0; } .legend-dot.normal { background: var(--gray-300); } .legend-dot.issues { background: var(--warning-500); } .legend-dot.errors { background: var(--error-500); } /* 캘린더 컨테이너 */ .calendar-container { background: var(--white); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); overflow: hidden; } .calendar-grid { display: flex; flex-direction: column; } .calendar-header { display: grid; grid-template-columns: repeat(7, 1fr); background: var(--gray-100); border-bottom: 1px solid var(--gray-200); } .day-header { padding: var(--space-4); text-align: center; font-weight: 600; font-size: var(--text-sm); color: var(--gray-700); border-right: 1px solid var(--gray-200); } .day-header:last-child { border-right: none; } .day-header:first-child, .day-header:last-child { color: var(--red-600); /* 일요일, 토요일 */ } .calendar-days { display: grid; grid-template-columns: repeat(7, 1fr); } /* 캘린더 날짜 셀 */ .calendar-day { position: relative; min-height: 140px; padding: var(--space-3); border-right: 1px solid var(--gray-200); border-bottom: 1px solid var(--gray-200); cursor: pointer; transition: all 0.2s ease; background: var(--white); display: flex; flex-direction: column; } .calendar-day:last-child { border-right: none; } .calendar-day:hover { background: var(--gray-50); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0,0,0,0.1); } .calendar-day.other-month { background: var(--gray-50); color: var(--gray-400); } .calendar-day.other-month:hover { background: var(--gray-100); } .calendar-day.today { background: linear-gradient(135deg, var(--primary-50), var(--primary-100)); border: 2px solid var(--primary-500); box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .calendar-day.has-issues { background: linear-gradient(135deg, var(--orange-100), var(--red-100)); border: 2px solid var(--orange-400); box-shadow: 0 0 0 3px rgba(251, 146, 60, 0.2); animation: pulse-warning 2s infinite; } .calendar-day.has-errors { background: linear-gradient(135deg, var(--red-100), var(--red-200)); border: 2px solid var(--red-500); box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.3); animation: pulse-error 2s infinite; } @keyframes pulse-warning { 0%, 100% { box-shadow: 0 0 0 3px rgba(251, 146, 60, 0.2); } 50% { box-shadow: 0 0 0 6px rgba(251, 146, 60, 0.1); } } @keyframes pulse-error { 0%, 100% { box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.3); } 50% { box-shadow: 0 0 0 6px rgba(239, 68, 68, 0.1); } } .calendar-day.weekend { background: var(--blue-50); } .calendar-day.weekend.has-issues { background: linear-gradient(135deg, var(--blue-50), var(--warning-100)); } .calendar-day.weekend.has-errors { background: linear-gradient(135deg, var(--blue-50), var(--error-100)); } /* 날짜 번호 */ .day-number { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; margin-bottom: var(--space-2); font-weight: 700; font-size: var(--text-base); border-radius: 50%; transition: all 0.2s ease; } .calendar-day.today .day-number { background: var(--primary-500); color: var(--white); box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3); transform: scale(1.1); } .calendar-day.sunday .day-number, .calendar-day.saturday .day-number { color: var(--red-600); font-weight: 800; } .calendar-day:hover .day-number { background: var(--gray-200); transform: scale(1.05); } .calendar-day.today:hover .day-number { background: var(--primary-600); transform: scale(1.15); } /* 문제 표시 아이콘 */ .problem-indicator { position: absolute; bottom: var(--space-2); left: 50%; transform: translateX(-50%); width: 20px; height: 20px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: bold; color: var(--white); box-shadow: 0 2px 4px rgba(0,0,0,0.2); } .problem-indicator.issues { background: var(--warning-500); } .problem-indicator.errors { background: var(--error-500); animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.7; } } /* 작업 입력 모달 스타일 - 대시보드와 동일한 디자인 */ #workEntryModal .modal-container { width: 90%; max-width: 600px; max-height: 90vh; background: white; border-radius: 1rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; border: 1px solid #e5e7eb; } #workEntryModal .modal-header { background: linear-gradient(135deg, #1e40af 0%, #1d4ed8 50%, #2563eb 100%); color: white; padding: 1.5rem; position: relative; } #workEntryModal .modal-header::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: url('data:image/svg+xml,'); opacity: 0.3; } #workEntryModal .modal-header h2 { margin: 0; font-size: 1.25rem; font-weight: 700; position: relative; z-index: 1; } #workEntryModal .modal-close-btn { position: absolute; top: 1rem; right: 1rem; background: rgba(255, 255, 255, 0.2); border: 1px solid rgba(255, 255, 255, 0.3); color: white; width: 32px; height: 32px; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s ease; z-index: 2; } #workEntryModal .modal-close-btn:hover { background: rgba(255, 255, 255, 0.3); transform: scale(1.1); } #workEntryModal .modal-body { padding: 1.5rem; max-height: 60vh; overflow-y: auto; } .form-section { margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 2px solid #f3f4f6; } .form-section:last-child { border-bottom: none; margin-bottom: 0; } .form-section h3 { margin-bottom: 1rem; font-size: 1.125rem; font-weight: 700; color: #111827; display: flex; align-items: center; gap: 0.5rem; } .form-section h3::before { content: '📝'; font-size: 1rem; } .form-section:nth-child(1) h3::before { content: '👤'; } .form-section:nth-child(2) h3::before { content: '📋'; } .form-section:nth-child(3) h3::before { content: '🏖️'; } .form-group { margin-bottom: 1rem; } .form-label { display: block; font-weight: 600; margin-bottom: 0.5rem; color: #374151; font-size: 0.875rem; } .form-control { width: 100%; padding: 0.75rem; border: 2px solid #e5e7eb; border-radius: 0.5rem; font-size: 0.875rem; transition: all 0.2s ease; background: white; } .form-control:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .form-control:read-only { background: #f9fafb; color: #6b7280; } .vacation-buttons { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.75rem; } .btn-vacation { padding: 0.75rem 1rem; background: linear-gradient(135deg, #fef3c7, #fde68a); color: #92400e; border: 2px solid #fcd34d; border-radius: 0.5rem; font-size: 0.875rem; font-weight: 600; cursor: pointer; transition: all 0.2s ease; position: relative; overflow: hidden; } .btn-vacation::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4), transparent); transition: left 0.5s; } .btn-vacation:hover::before { left: 100%; } .btn-vacation:hover { background: linear-gradient(135deg, #fde68a, #fcd34d); border-color: #f59e0b; transform: translateY(-2px); box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); } .modal-footer { display: flex; justify-content: flex-end; gap: 0.75rem; padding: 1.5rem; border-top: 2px solid #f3f4f6; background: linear-gradient(135deg, #f9fafb, white); } .btn { padding: 0.75rem 1.5rem; border-radius: 0.5rem; font-size: 0.875rem; font-weight: 600; cursor: pointer; transition: all 0.2s ease; border: 2px solid transparent; position: relative; overflow: hidden; } .btn::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent); transition: left 0.5s; } .btn:hover::before { left: 100%; } .btn-primary { background: linear-gradient(135deg, #2563eb, #1d4ed8); color: white; border-color: #3b82f6; } .btn-primary:hover { background: linear-gradient(135deg, #1d4ed8, #1e40af); transform: translateY(-2px); box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); } .btn-secondary { background: linear-gradient(135deg, #6b7280, #4b5563); color: white; border-color: #9ca3af; } .btn-secondary:hover { background: linear-gradient(135deg, #4b5563, #374151); transform: translateY(-2px); box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1); } /* 작업자 카드 스타일 (대시보드 스타일) */ .worker-card { background: white; border-radius: 1rem; padding: 1.5rem; margin-bottom: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); border: 2px solid transparent; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; gap: 1rem; } .worker-card:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.15); } .worker-card.complete { border-color: #10b981; background: linear-gradient(135deg, #ecfdf5, #f0fdf4); } .worker-card.overtime { border-color: #06b6d4; background: linear-gradient(135deg, #ecfeff, #f0fdff); } .worker-card.incomplete { border-color: #ef4444; background: linear-gradient(135deg, #fef2f2, #fef7f7); } .worker-card.partial { border-color: #f59e0b; background: linear-gradient(135deg, #fffbeb, #fefce8); } .worker-card.vacation-full, .worker-card.vacation-half, .worker-card.vacation-quarter, .worker-card.vacation-half-half { border-color: #eab308; background: linear-gradient(135deg, #fefce8, #fffbeb); } .worker-avatar { flex-shrink: 0; } .avatar-circle { width: 60px; height: 60px; border-radius: 50%; background: linear-gradient(135deg, #667eea, #764ba2); display: flex; align-items: center; justify-content: center; color: white; font-weight: 700; font-size: 1.25rem; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .worker-info { flex: 1; min-width: 0; } .worker-name { font-size: 1.125rem; font-weight: 700; color: #111827; margin-bottom: 0.25rem; } .worker-job { font-size: 0.875rem; color: #6b7280; font-weight: 500; } .worker-status { flex-shrink: 0; margin-right: 1rem; } .worker-stats { flex-shrink: 0; text-align: right; margin-right: 1rem; } .stat-row { display: flex; justify-content: space-between; align-items: center; gap: 1rem; margin-bottom: 0.25rem; } .stat-row:last-child { margin-bottom: 0; } .stat-label { font-size: 0.75rem; color: #6b7280; font-weight: 500; } .stat-value { font-size: 0.875rem; font-weight: 600; color: #111827; } .stat-value.error { color: #dc2626; } .worker-actions { flex-shrink: 0; } .btn-work-entry { background: linear-gradient(135deg, #3b82f6, #2563eb); color: white; border: none; padding: 0.5rem 1rem; border-radius: 0.5rem; font-size: 0.875rem; font-weight: 600; cursor: pointer; transition: all 0.2s ease; } .btn-work-entry:hover { background: linear-gradient(135deg, #2563eb, #1d4ed8); transform: scale(1.05); } /* 캘린더 페이지 컨테이너 */ .calendar-page-container { max-width: 1000px; margin: 0 auto; padding: 2rem; } /* 페이지 제목 */ .page-title-section { text-align: center; margin-bottom: 2rem; } .page-title { font-size: 2rem; font-weight: 700; color: #111827; margin-bottom: 0.5rem; } .page-subtitle { font-size: 1rem; color: #6b7280; margin: 0; } /* 캘린더 카드 */ .calendar-card { background: white; border-radius: 1rem; padding: 2rem; box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1); border: 1px solid #e5e7eb; } /* 캘린더 네비게이션 */ .calendar-nav { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 2px solid #f3f4f6; } .nav-btn { display: flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1rem; background: linear-gradient(135deg, #3b82f6, #2563eb); color: white; border: none; border-radius: 0.5rem; font-size: 0.875rem; font-weight: 600; cursor: pointer; transition: all 0.2s ease; } .nav-btn:hover { background: linear-gradient(135deg, #2563eb, #1d4ed8); transform: translateY(-1px); box-shadow: 0 4px 12px rgba(59, 130, 246, 0.4); } .nav-icon { font-size: 1.25rem; font-weight: bold; } .nav-text { font-size: 0.875rem; } .calendar-title { text-align: center; display: flex; flex-direction: column; align-items: center; gap: 0.5rem; } .calendar-title h3 { font-size: 1.5rem; font-weight: 700; color: #111827; margin: 0; } .today-btn { padding: 0.25rem 0.75rem; background: #f3f4f6; color: #6b7280; border: 1px solid #d1d5db; border-radius: 0.375rem; font-size: 0.75rem; cursor: pointer; transition: all 0.2s ease; } .today-btn:hover { background: #e5e7eb; color: #374151; } /* 범례 */ .calendar-legend { display: flex; justify-content: center; gap: 2rem; margin-bottom: 1.5rem; padding: 1rem; background: #f9fafb; border-radius: 0.5rem; } .legend-item { display: flex; align-items: center; gap: 0.5rem; font-size: 0.875rem; color: #374151; } .legend-dot { width: 12px; height: 12px; border-radius: 50%; } .legend-dot.has-overtime-warning { background: #8b5cf6; box-shadow: 0 0 0 2px rgba(139, 92, 246, 0.2); } .legend-dot.has-normal { background: #10b981; box-shadow: 0 0 0 2px rgba(16, 185, 129, 0.2); } .legend-dot.has-issues { background: #f59e0b; box-shadow: 0 0 0 2px rgba(245, 158, 11, 0.2); } .legend-dot.has-errors { background: #ef4444; box-shadow: 0 0 0 2px rgba(239, 68, 68, 0.2); } /* 캘린더 그리드 */ .calendar-grid { max-width: 800px; margin: 0 auto; } /* 캘린더 헤더 */ .calendar-header { display: grid; grid-template-columns: repeat(7, 1fr); gap: 1px; margin-bottom: 1px; background: #e5e7eb; border-radius: 0.5rem 0.5rem 0 0; overflow: hidden; } .day-header { background: #f9fafb; padding: 1rem 0.5rem; text-align: center; font-weight: 600; font-size: 0.875rem; color: #374151; } .day-header.sunday { color: #dc2626; } .day-header.saturday { color: #2563eb; } /* 캘린더 날짜 */ .calendar-days { display: grid; grid-template-columns: repeat(7, 1fr); gap: 1px; background: #e5e7eb; border-radius: 0 0 0.5rem 0.5rem; overflow: hidden; } .calendar-day { background: white; min-height: 80px; padding: 0.5rem; cursor: pointer; transition: all 0.2s ease; position: relative; display: flex; flex-direction: column; justify-content: space-between; } .calendar-day:hover { background: #f3f4f6; transform: scale(1.02); z-index: 1; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .calendar-day.today { background: linear-gradient(135deg, #dbeafe, #bfdbfe); border: 2px solid #3b82f6; } .calendar-day.other-month { background: #f9fafb; color: #9ca3af; } .calendar-day.sunday { color: #dc2626; } .calendar-day.saturday { color: #2563eb; } .calendar-day.weekend { background: #fefefe; } /* 기본 정상 상태 (초록색) */ .calendar-day.has-normal { border-left: 4px solid #10b981; background: linear-gradient(135deg, #ecfdf5, #f0fdf4); } /* 문제 상태들 - 혼재 가능하므로 테두리를 여러 색으로 표시 */ .calendar-day.has-overtime-warning { border-left: 4px solid #8b5cf6; background: linear-gradient(135deg, #f3e8ff, #faf5ff); } .calendar-day.has-issues { border-left: 4px solid #f59e0b; background: linear-gradient(135deg, #fffbeb, #fefce8); } .calendar-day.has-errors { border-left: 4px solid #ef4444; background: linear-gradient(135deg, #fef2f2, #fef7f7); } /* 혼재 상태 - 여러 문제가 동시에 있을 때 */ .calendar-day.has-overtime-warning.has-errors { border-left: 4px solid; border-image: linear-gradient(to bottom, #8b5cf6 50%, #ef4444 50%) 1; background: linear-gradient(135deg, #f3e8ff, #fef2f2); } .calendar-day.has-overtime-warning.has-issues { border-left: 4px solid; border-image: linear-gradient(to bottom, #8b5cf6 50%, #f59e0b 50%) 1; background: linear-gradient(135deg, #f3e8ff, #fffbeb); } .calendar-day.has-errors.has-issues { border-left: 4px solid; border-image: linear-gradient(to bottom, #ef4444 50%, #f59e0b 50%) 1; background: linear-gradient(135deg, #fef2f2, #fffbeb); } .calendar-day.has-overtime-warning.has-errors.has-issues { border-left: 4px solid; border-image: linear-gradient(to bottom, #8b5cf6 33%, #ef4444 33%, #ef4444 66%, #f59e0b 66%) 1; background: linear-gradient(135deg, #f3e8ff, #fef2f2, #fffbeb); } .day-number { font-weight: 600; font-size: 1rem; } .worker-count { position: absolute; top: 0.5rem; right: 0.5rem; background: #6b7280; color: white; font-size: 0.75rem; padding: 0.125rem 0.375rem; border-radius: 0.25rem; font-weight: 500; } .status-indicator { position: absolute; bottom: 0.5rem; width: 18px; height: 18px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 0.7rem; font-weight: bold; color: white; margin-left: 2px; } /* 첫 번째 아이콘 */ .status-indicator:first-of-type { right: 0.5rem; } /* 두 번째 아이콘 */ .status-indicator:nth-of-type(2) { right: 1.75rem; } /* 세 번째 아이콘 */ .status-indicator:nth-of-type(3) { right: 3rem; } /* 범례와 동일한 아이콘 스타일 */ .legend-icon { position: absolute; bottom: 0.5rem; width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; font-size: 1rem; font-weight: bold; margin-left: 2px; } /* 첫 번째 아이콘 */ .legend-icon:first-of-type { left: 0.5rem; } /* 두 번째 아이콘 */ .legend-icon:nth-of-type(2) { left: 1.25rem; } /* 세 번째 아이콘 */ .legend-icon:nth-of-type(3) { left: 2rem; } .legend-icon.purple { color: #8b5cf6; } .legend-icon.red { color: #ef4444; } .legend-icon.orange { color: #f59e0b; } .legend-icon.green { color: #10b981; } /* 헤더 액션 영역 스타일 (navbar 스타일과 통일) */ .header-actions { display: flex; align-items: center; gap: 0.75rem; margin-right: 1.5rem; } .dashboard-btn { display: flex; align-items: center; gap: 0.375rem; padding: 0.5rem 1rem; background: rgba(255, 255, 255, 0.15); color: white; text-decoration: none; border-radius: 1.25rem; font-size: 0.85rem; font-weight: 500; transition: all 0.3s ease; border: 1px solid rgba(255, 255, 255, 0.3); backdrop-filter: blur(10px); font-family: inherit; } .dashboard-btn:hover { background: rgba(255, 255, 255, 0.25); transform: translateY(-1px); text-decoration: none; color: white; } .dashboard-btn:active { transform: translateY(0); background: rgba(255, 255, 255, 0.2); } .dashboard-btn .btn-icon { font-size: 1rem; } .dashboard-btn .btn-text { font-size: 0.85rem; font-weight: 500; } /* 반응형 디자인 */ @media (max-width: 768px) { .dashboard-btn .btn-text { display: none; } .dashboard-btn { padding: 0.5rem; min-width: 2.5rem; justify-content: center; } .header-actions { margin-right: 1rem; } } @media (max-width: 480px) { .dashboard-btn { display: none; } } /* 작업 입력 모달 탭 스타일 */ .modal-tabs { display: flex; border-bottom: 2px solid #e5e7eb; margin-bottom: 1.5rem; gap: 0.5rem; } .tab-btn { flex: 1; padding: 0.75rem 1rem; background: none; border: none; font-size: 0.875rem; font-weight: 500; color: #6b7280; cursor: pointer; transition: all 0.2s ease-in-out; border-radius: 0.5rem 0.5rem 0 0; position: relative; } .tab-btn:hover { background: #f3f4f6; color: #374151; } .tab-btn.active { background: #3b82f6; color: white; box-shadow: 0 2px 4px rgba(59, 130, 246, 0.2); } .tab-content { display: none; } .tab-content.active { display: block; } /* 기존 작업 목록 스타일 */ .existing-work-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 1rem; padding-bottom: 0.75rem; border-bottom: 1px solid #e5e7eb; } .existing-work-header h3 { margin: 0; color: #1f2937; font-size: 1.125rem; } .work-summary { font-size: 0.875rem; color: #6b7280; font-weight: 500; } .work-summary span { color: #3b82f6; font-weight: 600; } .existing-work-list { max-height: 400px; overflow-y: auto; padding-right: 0.5rem; } .work-item { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 0.5rem; padding: 1rem; margin-bottom: 0.75rem; transition: all 0.2s ease-in-out; } .work-item:hover { background: #f1f5f9; border-color: #cbd5e1; transform: translateY(-1px); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .work-item-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 0.75rem; } .work-item-info { flex: 1; } .work-item-title { font-weight: 600; color: #1f2937; margin-bottom: 0.25rem; font-size: 1rem; } .work-item-meta { display: flex; gap: 1rem; font-size: 0.8125rem; color: #6b7280; } .work-item-actions { display: flex; gap: 0.5rem; } .btn-edit, .btn-delete { padding: 0.375rem 0.75rem; border: none; border-radius: 0.375rem; font-size: 0.8125rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease-in-out; } .btn-edit { background: #3b82f6; color: white; } .btn-edit:hover { background: #2563eb; transform: translateY(-1px); } .btn-delete { background: #ef4444; color: white; } .btn-delete:hover { background: #dc2626; transform: translateY(-1px); } .work-item-description { margin-top: 0.5rem; padding-top: 0.5rem; border-top: 1px solid #e2e8f0; font-size: 0.875rem; color: #4b5563; line-height: 1.5; } /* 모달 푸터 개선 */ .modal-footer { display: flex; justify-content: space-between; align-items: center; gap: 1rem; } .footer-actions { display: flex; gap: 0.75rem; } /* Empty State 스타일 */ .empty-state { text-align: center; padding: 3rem 2rem; color: #6b7280; } .empty-state .empty-icon { font-size: 3rem; margin-bottom: 1rem; opacity: 0.5; } .empty-state h3 { margin: 0 0 0.5rem 0; color: #374151; font-size: 1.125rem; } .empty-state p { margin: 0; font-size: 0.875rem; } /* 모달 스타일 */ .modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1000; padding: var(--space-4); } .modal-container.large-modal { width: 90vw; max-width: 1200px; max-height: 90vh; background: #ffffff; border-radius: 0.75rem; box-shadow: 0 20px 25px rgba(0, 0, 0, 0.1); overflow: hidden; display: flex; flex-direction: column; } .modal-header { display: flex; align-items: center; justify-content: space-between; padding: var(--space-6) var(--space-8); border-bottom: 1px solid var(--gray-200); background: linear-gradient(135deg, var(--blue-600), var(--indigo-600)); position: relative; overflow: hidden; } .modal-header::before { content: ''; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: url("data:image/svg+xml,%3Csvg width='60' height='60' viewBox='0 0 60 60' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='none' fill-rule='evenodd'%3E%3Cg fill='%23ffffff' fill-opacity='0.05'%3E%3Ccircle cx='30' cy='30' r='4'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E") repeat; opacity: 0.3; } .modal-header h2 { margin: 0; font-size: var(--text-xl); font-weight: 700; color: var(--white); display: flex; align-items: center; gap: var(--space-3); position: relative; z-index: 1; } .modal-header h2::before { content: '📊'; font-size: var(--text-2xl); } .modal-close-btn { width: 40px; height: 40px; border: none; background: var(--gray-200); border-radius: 50%; font-size: var(--text-xl); font-weight: bold; color: var(--gray-600); cursor: pointer; transition: var(--transition-normal); } .modal-close-btn:hover { background: var(--gray-300); color: var(--gray-800); } .modal-body { flex: 1; padding: var(--space-6); overflow-y: auto; } /* 일일 요약 - 기존 HTML 구조에 맞춘 스타일 */ .daily-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: var(--space-4); margin-bottom: var(--space-6); padding: var(--space-4); background: #f8fafc; border-radius: var(--radius-lg); border: 1px solid #e2e8f0; } .summary-card { background: white; padding: var(--space-4); border-radius: var(--radius-md); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); border: 1px solid #e5e7eb; display: flex; align-items: center; gap: var(--space-3); transition: all 0.2s ease; } .summary-card:hover { box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); transform: translateY(-1px); } .summary-icon { width: 40px; height: 40px; border-radius: var(--radius-md); display: flex; align-items: center; justify-content: center; font-size: var(--text-lg); flex-shrink: 0; } .summary-icon.success { background: #d1fae5; color: #065f46; } .summary-icon.primary { background: #dbeafe; color: #1e40af; } .summary-icon.warning { background: #fef3c7; color: #92400e; } .summary-icon.error { background: #fecaca; color: #991b1b; } .summary-content { flex: 1; } .summary-label { font-size: var(--text-sm); font-weight: 500; color: #6b7280; margin-bottom: var(--space-1); } .summary-value { font-size: var(--text-lg); font-weight: 700; color: #111827; } .summary-value.error { color: #dc2626; } /* 작업자 현황 */ .modal-work-status { background: white; border-radius: var(--radius-lg); padding: var(--space-5); border: 1px solid #e5e7eb; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } .work-status-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-4); padding-bottom: var(--space-3); border-bottom: 1px solid #e5e7eb; } .work-status-header h3 { margin: 0; font-size: var(--text-base); font-weight: 600; color: #111827; } .status-filter select { padding: var(--space-2) var(--space-3); border: 1px solid #d1d5db; border-radius: var(--radius-md); background: white; font-size: var(--text-sm); } /* 작업자 리스트 - 대시보드와 동일한 스타일 */ .worker-status-list { display: flex; flex-direction: column; gap: var(--space-3); } /* 한 줄 작업자 카드 - 대시보드와 동일 */ .worker-status-row { background: #ffffff; border: 1px solid #e5e7eb; border-radius: var(--radius-lg); padding: var(--space-5) var(--space-6); transition: all 0.2s ease; box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1); position: relative; overflow: hidden; display: flex; align-items: center; gap: var(--space-6); min-height: 85px; } .worker-status-row::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--primary-500); opacity: 0; transition: opacity 0.3s ease; } .worker-status-row:hover { border-color: #d1d5db; box-shadow: 0 4px 12px 0 rgba(0, 0, 0, 0.15); transform: translateY(-1px); } .worker-status-row:hover::before { opacity: 1; } /* 한 줄 레이아웃 요소들 */ .worker-basic-info { display: flex; align-items: center; gap: var(--space-3); flex: 0 0 200px; } .worker-name { font-size: var(--text-base); font-weight: 600; color: var(--gray-900); margin: 0; } .worker-job { font-size: var(--text-sm); color: var(--gray-500); font-weight: 500; margin: 0; } .worker-stats-inline { display: flex; gap: var(--space-4); flex: 1; justify-content: center; } .worker-stats-inline .stat-item { text-align: center; padding: var(--space-2) var(--space-3); background: #f9fafb; border-radius: var(--radius-md); border: 1px solid #f3f4f6; min-width: 70px; } .stat-label { display: block; font-size: var(--text-xs); color: #6b7280; font-weight: 500; margin-bottom: var(--space-1); } .stat-value { display: block; font-size: var(--text-sm); font-weight: 700; color: #111827; } .stat-value.error { color: #dc2626; } .worker-actions-inline { display: flex; align-items: center; gap: var(--space-3); flex: 0 0 auto; } .btn-edit { width: 32px; height: 32px; border: none; background: #f3f4f6; border-radius: var(--radius-md); cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: var(--text-sm); transition: all 0.2s ease; } .btn-edit:hover { background: #e5e7eb; transform: scale(1.05); } .worker-status-row { cursor: pointer; } .worker-status-row:hover { background: #f9fafb; } .status-badge { padding: var(--space-2) var(--space-4); border-radius: var(--radius-full); font-size: var(--text-sm); font-weight: 600; text-align: center; min-width: 90px; border: 1px solid transparent; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } /* 상태별 색상 - 대시보드와 동일 */ .worker-status-row.complete::before { background: #059669; } /* 정시근로 - 초록색 */ .worker-status-row.overtime::before { background: #0891b2; } /* 연장근로 - 청록색 */ .worker-status-row.vacation-full::before { background: #f59e0b; } /* 연차 - 주황색 */ .worker-status-row.vacation-half::before { background: #fbbf24; } /* 반차 - 밝은 주황색 */ .worker-status-row.vacation-half-half::before { background: #fcd34d; } /* 조퇴 - 노란색 */ .worker-status-row.vacation-quarter::before { background: #fde047; } /* 반반차 - 밝은 노란색 */ .worker-status-row.partial::before { background: #f97316; } /* 부분입력 - 주황색 */ .worker-status-row.incomplete::before { background: #ef4444; } /* 미입력 - 빨간색 */ .worker-status-row.error::before { background: #dc2626; } /* 오류 - 진한 빨간색 */ .worker-status-row.overtime-warning::before { background: #dc2626; } /* 확인필요 - 진한 빨간색 */ /* 상태 배지 색상 - 대시보드와 동일 */ .status-badge.complete { background: #d1fae5; color: #065f46; border: 1px solid #6ee7b7; } .status-badge.overtime { background: #cffafe; color: #164e63; border: 1px solid #67e8f9; } .status-badge.vacation-full { background: #fef3c7; color: #92400e; border: 1px solid #fcd34d; } .status-badge.vacation-half { background: #fef3c7; color: #9a3412; border: 1px solid #fdba74; } .status-badge.vacation-half-half { background: #fefce8; color: #a16207; border: 1px solid #fde047; } .status-badge.vacation-quarter { background: #fefce8; color: #a16207; border: 1px solid #facc15; } .status-badge.partial { background: #fed7aa; color: #9a3412; border: 1px solid #fb923c; } .status-badge.incomplete { background: #fecaca; color: #991b1b; border: 1px solid #f87171; } .status-badge.error { background: #fecaca; color: #7f1d1d; border: 1px solid #ef4444; } .status-badge.overtime-warning { background: #fecaca; color: #7f1d1d; border: 1px solid #dc2626; animation: pulse 2s infinite; } /* 빈 상태 */ .empty-state { text-align: center; padding: var(--space-12); color: var(--gray-500); } .empty-state::before { content: '📭'; display: block; font-size: 4rem; margin-bottom: var(--space-4); opacity: 0.5; } .work-status-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--space-4); } .work-status-header h3 { margin: 0; font-size: var(--text-lg); font-weight: 600; color: var(--gray-900); } .status-filter select { padding: var(--space-2) var(--space-3); border: 1px solid var(--gray-300); border-radius: var(--radius-md); background: var(--white); font-size: var(--text-sm); } /* 반응형 디자인 */ @media (max-width: 768px) { .month-navigation { flex-direction: column; gap: var(--space-4); } .month-info { flex-direction: column; gap: var(--space-2); } .calendar-legend { flex-wrap: wrap; gap: var(--space-3); } .calendar-day { min-height: 80px; padding: var(--space-2); } .modal-container.large-modal { width: 95vw; max-height: 95vh; } .modal-body { padding: var(--space-4); } .daily-summary { grid-template-columns: repeat(2, 1fr); } .work-status-header { flex-direction: column; align-items: stretch; gap: var(--space-3); } } @media (max-width: 480px) { .calendar-days { font-size: var(--text-xs); } .calendar-day { min-height: 60px; padding: var(--space-1); } .day-number { width: 24px; height: 24px; font-size: var(--text-xs); } .daily-summary { grid-template-columns: 1fr; } }