/* NotificationBell Component Styles */ .notificationBell { position: relative; display: inline-flex; align-items: center; } /* Bell Button */ .bellButton { position: relative; background: transparent; border: none; cursor: pointer; padding: 8px; border-radius: 8px; color: var(--text-secondary, #6c757d); transition: all 0.2s ease; } .bellButton:hover { background: var(--hover-bg, rgba(0, 0, 0, 0.05)); color: var(--text-primary, #333); } .bellIcon { font-size: 18px; } /* Badge */ .badge { position: absolute; top: 2px; right: 2px; min-width: 18px; height: 18px; padding: 0 5px; font-size: 11px; font-weight: 600; line-height: 18px; text-align: center; color: white; background: var(--danger-color, #dc3545); border-radius: 10px; animation: pulse 2s infinite; } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } /* Dropdown */ .dropdown { position: fixed; bottom: 80px; left: 290px; width: 360px; max-height: 480px; background: var(--card-bg, white); border-radius: 12px; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); overflow: hidden; z-index: 9999; animation: slideIn 0.2s ease; } @keyframes slideIn { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } } /* Header */ .header { display: flex; justify-content: space-between; align-items: center; padding: 16px; border-bottom: 1px solid var(--border-color, #eee); } .header h3 { margin: 0; font-size: 16px; font-weight: 600; color: var(--text-primary, #333); } .markAllRead { background: none; border: none; color: var(--primary-color, #007bff); font-size: 12px; cursor: pointer; padding: 4px 8px; border-radius: 4px; transition: background 0.2s; } .markAllRead:hover { background: var(--primary-light, rgba(0, 123, 255, 0.1)); } /* Content */ .content { max-height: 400px; overflow-y: auto; } .loading, .error, .empty { padding: 32px; text-align: center; color: var(--text-secondary, #6c757d); } .error { color: var(--danger-color, #dc3545); } .empty { display: flex; flex-direction: column; align-items: center; gap: 8px; } .emptyIcon { font-size: 32px; opacity: 0.3; } /* Notification Item */ .notification { position: relative; display: flex; gap: 12px; padding: 14px 16px; border-bottom: 1px solid var(--border-color, #eee); cursor: pointer; transition: background 0.2s; } .notification:hover { background: var(--hover-bg, rgba(0, 0, 0, 0.02)); } .notification:last-child { border-bottom: none; } .notification.unread { background: var(--primary-light, rgba(0, 123, 255, 0.05)); } .notification.unread::before { content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 3px; background: var(--primary-color, #007bff); } .notification.success { background: var(--success-light, rgba(40, 167, 69, 0.1)); } /* Success Overlay */ .successOverlay { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; gap: 8px; background: var(--success-light, rgba(40, 167, 69, 0.95)); color: var(--success-color, #28a745); font-weight: 500; animation: fadeIn 0.3s ease; z-index: 1; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* Icon */ .icon { flex-shrink: 0; width: 36px; height: 36px; display: flex; align-items: center; justify-content: center; border-radius: 50%; background: var(--bg-secondary, #f5f5f5); color: var(--text-secondary, #6c757d); font-size: 14px; } .icon_invitation { background: var(--primary-light, rgba(0, 123, 255, 0.1)); color: var(--primary-color, #007bff); } .icon_system { background: var(--info-light, rgba(23, 162, 184, 0.1)); color: var(--info-color, #17a2b8); } .icon_workflow { background: var(--warning-light, rgba(255, 193, 7, 0.1)); color: var(--warning-color, #ffc107); } .icon_mention { background: var(--purple-light, rgba(111, 66, 193, 0.1)); color: var(--purple-color, #6f42c1); } /* Notification Content */ .notificationContent { flex: 1; min-width: 0; } .title { font-weight: 600; font-size: 14px; color: var(--text-primary, #333); margin-bottom: 2px; } .message { font-size: 13px; color: var(--text-secondary, #6c757d); line-height: 1.4; margin-bottom: 4px; /* Truncate long messages */ display: -webkit-box; -webkit-line-clamp: 2; line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .time { font-size: 11px; color: var(--text-muted, #999); } /* Actions */ .actions { display: flex; gap: 8px; margin-top: 10px; } .actionButton { display: inline-flex; align-items: center; gap: 4px; padding: 6px 12px; font-size: 12px; font-weight: 500; border: none; border-radius: 6px; cursor: pointer; transition: all 0.2s; } .actionButton:disabled { opacity: 0.6; cursor: not-allowed; } .action_primary { background: var(--primary-color, #007bff); color: white; } .action_primary:hover:not(:disabled) { background: var(--primary-dark, #0056b3); } .action_danger { background: transparent; color: var(--danger-color, #dc3545); border: 1px solid var(--danger-color, #dc3545); } .action_danger:hover:not(:disabled) { background: var(--danger-light, rgba(220, 53, 69, 0.1)); } .action_default { background: var(--bg-secondary, #f5f5f5); color: var(--text-primary, #333); } .action_default:hover:not(:disabled) { background: var(--bg-tertiary, #e9e9e9); } /* Action Result */ .actionResult { margin-top: 8px; padding: 8px; font-size: 12px; background: var(--success-light, rgba(40, 167, 69, 0.1)); color: var(--success-color, #28a745); border-radius: 4px; } /* Dismiss Button */ .dismissButton { flex-shrink: 0; width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; background: transparent; border: none; color: var(--text-muted, #999); cursor: pointer; border-radius: 4px; opacity: 0; transition: all 0.2s; } .notification:hover .dismissButton { opacity: 1; } .dismissButton:hover { background: var(--danger-light, rgba(220, 53, 69, 0.1)); color: var(--danger-color, #dc3545); } /* Scrollbar */ .content::-webkit-scrollbar { width: 6px; } .content::-webkit-scrollbar-track { background: transparent; } .content::-webkit-scrollbar-thumb { background: var(--border-color, #ddd); border-radius: 3px; } .content::-webkit-scrollbar-thumb:hover { background: var(--text-muted, #999); } @media (max-width: 1024px) { .dropdown { left: 0.75rem; right: 0.75rem; width: auto; bottom: calc(76px + env(safe-area-inset-bottom)); max-height: min(70dvh, 520px); } }