/* 메인 스타일 */ body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } /* 알림 애니메이션 */ .notification { animation: slideIn 0.3s ease-out; } @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } /* 로딩 스피너 */ .loading-spinner { animation: spin 1s linear infinite; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } /* 카드 호버 효과 */ .card-hover { transition: all 0.2s ease-in-out; } .card-hover:hover { transform: translateY(-2px); box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1); } /* 태그 스타일 */ .tag { display: inline-block; padding: 0.25rem 0.5rem; font-size: 0.75rem; font-weight: 500; border-radius: 9999px; background-color: #dbeafe; color: #1e40af; } /* 검색 입력 포커스 */ .search-input:focus { box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } /* 드롭다운 애니메이션 */ .dropdown-enter { opacity: 0; transform: scale(0.95); } .dropdown-enter-active { opacity: 1; transform: scale(1); transition: opacity 150ms ease-out, transform 150ms ease-out; } /* 모달 배경 */ .modal-backdrop { backdrop-filter: blur(4px); } /* 파일 드롭 영역 */ .file-drop-zone { border: 2px dashed #d1d5db; border-radius: 0.5rem; padding: 2rem; text-align: center; transition: all 0.2s ease-in-out; } .file-drop-zone.dragover { border-color: #3b82f6; background-color: #eff6ff; } .file-drop-zone:hover { border-color: #6b7280; } /* 반응형 그리드 */ @media (max-width: 768px) { .grid-responsive { grid-template-columns: 1fr; } } @media (min-width: 769px) and (max-width: 1024px) { .grid-responsive { grid-template-columns: repeat(2, 1fr); } } @media (min-width: 1025px) { .grid-responsive { grid-template-columns: repeat(3, 1fr); } } /* 스크롤바 스타일링 */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: #f1f5f9; } ::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: #94a3b8; } /* 텍스트 줄임표 */ .text-ellipsis { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* 라인 클램프 유틸리티 */ .line-clamp-1 { display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; } .line-clamp-2 { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .line-clamp-3 { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; } /* 포커스 링 제거 */ .focus-visible:focus { outline: 2px solid transparent; outline-offset: 2px; box-shadow: 0 0 0 2px #3b82f6; } /* 버튼 상태 */ .btn-primary { background-color: #3b82f6; color: white; padding: 0.5rem 1rem; border-radius: 0.375rem; font-weight: 500; transition: background-color 0.2s ease-in-out; } .btn-primary:hover { background-color: #2563eb; } .btn-primary:disabled { background-color: #9ca3af; cursor: not-allowed; } .btn-secondary { background-color: #6b7280; color: white; padding: 0.5rem 1rem; border-radius: 0.375rem; font-weight: 500; transition: background-color 0.2s ease-in-out; } .btn-secondary:hover { background-color: #4b5563; } /* 입력 필드 스타일 */ .input-field { width: 100%; padding: 0.5rem 0.75rem; border: 1px solid #d1d5db; border-radius: 0.375rem; font-size: 0.875rem; transition: border-color 0.2s ease-in-out, box-shadow 0.2s ease-in-out; } .input-field:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .input-field:invalid { border-color: #ef4444; } /* 에러 메시지 */ .error-message { color: #ef4444; font-size: 0.875rem; margin-top: 0.25rem; } /* 성공 메시지 */ .success-message { color: #10b981; font-size: 0.875rem; margin-top: 0.25rem; } /* 로딩 오버레이 */ .loading-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 9999; } /* 빈 상태 일러스트레이션 */ .empty-state { text-align: center; padding: 3rem 1rem; } .empty-state i { font-size: 4rem; color: #9ca3af; margin-bottom: 1rem; } .empty-state h3 { font-size: 1.25rem; font-weight: 600; color: #374151; margin-bottom: 0.5rem; } .empty-state p { color: #6b7280; margin-bottom: 1.5rem; }