/* CSS Reset and Base Styles */ * { margin: 0; padding: 0; box-sizing: border-box; } :root { /* Color Palette */ --primary-color: #2563eb; --primary-hover: #1d4ed8; --secondary-color: #64748b; --success-color: #10b981; --danger-color: #ef4444; --warning-color: #f59e0b; --info-color: #3b82f6; /* Neutral Colors */ --white: #ffffff; --gray-50: #f8fafc; --gray-100: #f1f5f9; --gray-200: #e2e8f0; --gray-300: #cbd5e1; --gray-400: #94a3b8; --gray-500: #64748b; --gray-600: #475569; --gray-700: #334155; --gray-800: #1e293b; --gray-900: #0f172a; /* Typography */ --font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; --font-size-xs: 0.75rem; --font-size-sm: 0.875rem; --font-size-base: 1rem; --font-size-lg: 1.125rem; --font-size-xl: 1.25rem; --font-size-2xl: 1.5rem; --font-size-3xl: 1.875rem; /* Spacing */ --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem; --space-4: 1rem; --space-5: 1.25rem; --space-6: 1.5rem; --space-8: 2rem; --space-10: 2.5rem; --space-12: 3rem; /* Border Radius */ --radius-sm: 0.375rem; --radius: 0.5rem; --radius-lg: 0.75rem; --radius-xl: 1rem; /* Shadows */ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05); --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); /* Transitions */ --transition: all 0.2s ease-in-out; } body { font-family: var(--font-family); font-size: var(--font-size-base); line-height: 1.6; color: var(--gray-800); background-color: var(--gray-50); min-height: 100vh; } /* Login Page */ .login-page { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: var(--space-4); } .login-container { background: var(--white); border-radius: var(--radius-xl); box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); padding: var(--space-10); width: 100%; max-width: 450px; animation: fadeInUp 0.5s ease-out; } @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .login-header { text-align: center; margin-bottom: var(--space-8); } .login-logo { width: 80px; height: 80px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto var(--space-4); box-shadow: 0 10px 30px rgba(102, 126, 234, 0.3); } .login-logo i { font-size: var(--font-size-3xl); color: var(--white); } .login-header h1 { font-size: var(--font-size-2xl); font-weight: 700; color: var(--gray-900); margin-bottom: var(--space-2); } .login-header p { color: var(--gray-600); font-size: var(--font-size-base); } .login-form { margin-bottom: var(--space-6); } .login-error { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-4); background: #fef2f2; border: 2px solid #fecaca; border-radius: var(--radius-lg); color: #991b1b; margin-bottom: var(--space-5); animation: shake 0.5s ease-in-out; } .login-error i { font-size: var(--font-size-lg); color: #ef4444; } .login-error span { font-weight: 500; font-size: var(--font-size-sm); } @keyframes shake { 0%, 100% { transform: translateX(0); } 10%, 30%, 50%, 70%, 90% { transform: translateX(-10px); } 20%, 40%, 60%, 80% { transform: translateX(10px); } } .login-form .form-group { margin-bottom: var(--space-5); } .login-form label { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); font-weight: 600; color: var(--gray-700); font-size: var(--font-size-sm); } .login-form label i { color: #667eea; font-size: var(--font-size-base); } .login-form input { width: 100%; padding: var(--space-4); border: 2px solid var(--gray-200); border-radius: var(--radius-lg); font-size: var(--font-size-base); transition: var(--transition); background: var(--white); } .login-form input:focus { outline: none; border-color: #667eea; box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1); } .login-form input.error { border-color: #ef4444; background: #fef2f2; } .login-form input.error:focus { border-color: #ef4444; box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.1); } .login-form input::placeholder { color: var(--gray-400); } .btn-block { width: 100%; justify-content: center; padding: var(--space-4); font-size: var(--font-size-base); font-weight: 600; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border: none; margin-top: var(--space-6); position: relative; overflow: hidden; } .btn-block::before { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.2); transition: left 0.5s ease; } .btn-block:hover::before { left: 100%; } .btn-block:hover:not(:disabled) { background: linear-gradient(135deg, #5568d3 0%, #6a3f8f 100%); transform: translateY(-2px); box-shadow: 0 10px 25px rgba(102, 126, 234, 0.3); } .btn-block:active:not(:disabled) { transform: translateY(0); } .login-footer { text-align: center; padding-top: var(--space-4); border-top: 1px solid var(--gray-200); } .login-footer p { display: flex; align-items: center; justify-content: center; gap: var(--space-2); margin: 0; } .login-footer i { color: var(--success-color); } .container { max-width: 1200px; margin: 0 auto; padding: 0 var(--space-4); } /* Header */ /* Menu Bar Header */ .menu-bar { background: var(--white); border-bottom: 1px solid var(--gray-200); box-shadow: var(--shadow-sm); position: sticky; top: 0; z-index: 100; } .menu-bar-content { display: flex; align-items: center; justify-content: space-between; padding: var(--space-2) var(--space-4); min-height: 56px; } .app-title { display: flex; align-items: center; gap: var(--space-2); font-size: var(--font-size-lg); font-weight: 600; color: var(--primary-color); } .app-title i { font-size: var(--font-size-xl); } .menu-spacer { flex: 1; } /* Authentication */ .auth-section { display: flex; align-items: center; gap: var(--space-4); } .auth-controls { display: flex; align-items: center; gap: var(--space-3); } .token-input { padding: var(--space-2) var(--space-3); border: 1px solid var(--gray-300); border-radius: var(--radius); font-size: var(--font-size-sm); min-width: 200px; transition: var(--transition); } .token-input:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgb(37 99 235 / 0.1); } /* User Dropdown - Menu Bar Style */ .user-dropdown { position: relative; } .user-dropdown-trigger { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-3); background: transparent; border: 1px solid var(--gray-200); border-radius: var(--radius); cursor: pointer; transition: var(--transition); font-size: var(--font-size-sm); height: 40px; position: relative; z-index: 10; pointer-events: auto; } .user-dropdown-trigger:hover { background: var(--gray-50); border-color: var(--gray-300); } .user-dropdown-trigger.active { background: var(--gray-50); border-color: var(--primary-color); box-shadow: 0 0 0 3px rgb(37 99 235 / 0.1); } .user-avatar { width: 24px; height: 24px; background: var(--primary-color); color: var(--white); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: var(--font-size-xs); flex-shrink: 0; } .user-details { display: flex; flex-direction: column; align-items: flex-start; gap: 1px; min-width: 0; } .user-name { font-weight: 500; font-size: var(--font-size-xs); color: var(--gray-900); line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100px; } .user-role { font-size: 10px; color: var(--gray-500); text-transform: capitalize; line-height: 1; white-space: nowrap; } .dropdown-arrow { color: var(--gray-400); font-size: 10px; transition: var(--transition); flex-shrink: 0; } .user-dropdown-trigger.active .dropdown-arrow { transform: rotate(180deg); } .user-dropdown-menu { position: absolute; top: 100%; right: 0; min-width: 220px; background: var(--white); border: 1px solid var(--gray-200); border-radius: var(--radius); box-shadow: var(--shadow-lg); z-index: 1000; opacity: 0; visibility: hidden; transform: translateY(-8px); transition: all 0.2s ease; margin-top: var(--space-1); } .user-dropdown.active .user-dropdown-menu { opacity: 1; visibility: visible; transform: translateY(0); } .dropdown-header { padding: var(--space-3); border-bottom: 1px solid var(--gray-100); } .dropdown-user-info { display: flex; align-items: center; gap: var(--space-3); } .dropdown-avatar { width: 40px; height: 40px; background: var(--primary-color); color: var(--white); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: var(--font-size-base); } .dropdown-details { display: flex; flex-direction: column; gap: var(--space-1); } .dropdown-name { font-weight: 600; font-size: var(--font-size-sm); color: var(--gray-900); } .dropdown-role { font-size: var(--font-size-xs); color: var(--gray-500); text-transform: capitalize; } .dropdown-divider { height: 1px; background: var(--gray-100); margin: 0; } .dropdown-item { display: flex; align-items: center; gap: var(--space-3); width: 100%; padding: var(--space-3); background: transparent; border: none; text-align: left; font-size: var(--font-size-sm); color: var(--gray-700); cursor: pointer; transition: var(--transition); } .dropdown-item:hover { background: var(--gray-50); color: var(--gray-900); } .dropdown-item i { width: 16px; color: var(--gray-400); } .status-indicator { display: flex; align-items: center; gap: var(--space-2); color: var(--success-color); font-size: var(--font-size-sm); font-weight: 500; } /* Buttons */ .btn { display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); font-size: var(--font-size-sm); font-weight: 500; border: 1px solid transparent; border-radius: var(--radius); cursor: pointer; transition: var(--transition); text-decoration: none; white-space: nowrap; } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn-primary { background: var(--primary-color); color: var(--white); border-color: var(--primary-color); } .btn-primary:hover:not(:disabled) { background: var(--primary-hover); border-color: var(--primary-hover); } .btn-secondary { background: var(--white); color: var(--gray-700); border-color: var(--gray-300); } .btn-secondary:hover:not(:disabled) { background: var(--gray-50); border-color: var(--gray-400); } .btn-danger { background: var(--danger-color); color: var(--white); border-color: var(--danger-color); } .btn-danger:hover:not(:disabled) { background: #dc2626; border-color: #dc2626; } .btn-sm { padding: var(--space-1) var(--space-2); font-size: var(--font-size-xs); } /* Main Content */ .main-content { padding: var(--space-6) 0; } /* Tab Navigation */ .tab-nav { display: flex; gap: var(--space-1); background: var(--white); border-radius: var(--radius-lg); padding: var(--space-1); box-shadow: var(--shadow-sm); margin-bottom: var(--space-8); } .tab-btn { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-3) var(--space-4); background: transparent; border: none; border-radius: var(--radius); font-size: var(--font-size-sm); font-weight: 500; color: var(--gray-600); cursor: pointer; transition: var(--transition); flex: 1; justify-content: center; } .tab-btn:hover { background: var(--gray-100); color: var(--gray-800); } .tab-btn.active { background: var(--primary-color); color: var(--white); } /* Tab Content */ .tab-content { display: none; } .tab-content.active { display: block; } /* Section Header */ .section-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-6); } .section-header h2 { font-size: var(--font-size-2xl); font-weight: 700; color: var(--gray-900); } .header-content { display: flex; flex-direction: column; gap: var(--space-2); } .header-help { display: flex; align-items: center; gap: var(--space-2); color: var(--gray-600); font-size: var(--font-size-sm); background: var(--gray-50); padding: var(--space-2) var(--space-3); border-radius: var(--radius); border: 1px solid var(--gray-200); } .header-help i { color: var(--info-color); } /* Notifications */ .notification { display: flex; align-items: center; justify-content: space-between; padding: var(--space-4); margin-bottom: var(--space-6); border-radius: var(--radius); font-weight: 500; } .notification.success { background: #dcfce7; color: #166534; border: 1px solid #bbf7d0; } .notification.error { background: #fef2f2; color: #991b1b; border: 1px solid #fecaca; } .notification.info { background: #dbeafe; color: #1e40af; border: 1px solid #bfdbfe; } .notification-close { background: none; border: none; cursor: pointer; padding: var(--space-1); border-radius: var(--radius-sm); opacity: 0.7; transition: var(--transition); } .notification-close:hover { opacity: 1; } /* Tables */ .data-table { background: var(--white); border-radius: var(--radius-lg); box-shadow: var(--shadow); overflow: hidden; } .table { width: 100%; border-collapse: collapse; } .table th { background: var(--gray-50); padding: var(--space-4); text-align: left; font-weight: 600; color: var(--gray-700); border-bottom: 1px solid var(--gray-200); font-size: var(--font-size-sm); } .table td { padding: var(--space-4); border-bottom: 1px solid var(--gray-100); font-size: var(--font-size-sm); } .table tbody tr:hover { background: var(--gray-50); } .table tbody tr:last-child td { border-bottom: none; } /* Status badges */ .status-badge { display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); font-size: var(--font-size-xs); font-weight: 500; } .status-badge.active { background: #dcfce7; color: #166534; } .status-badge.inactive { background: var(--gray-100); color: var(--gray-600); } /* Bounce badges */ .bounce-badge { display: inline-flex; align-items: center; gap: var(--space-1); padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); font-size: var(--font-size-xs); font-weight: 500; } .bounce-badge.bounce-hard { background: #fee2e2; color: #991b1b; } .bounce-badge.bounce-soft { background: #fef3c7; color: #92400e; } .bounce-badge.bounce-warning { background: #fef9c3; color: #854d0e; } /* Role badges */ .role-badge { display: inline-flex; align-items: center; padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); font-size: var(--font-size-xs); font-weight: 500; text-transform: capitalize; } .role-badge.role-administrator { background: #fef3c7; color: #92400e; } .role-badge.role-operator { background: #dbeafe; color: #1e40af; } .role-badge.role-read-only { background: var(--gray-100); color: var(--gray-600); } /* Action buttons in tables */ .action-buttons { display: flex; gap: var(--space-1); flex-wrap: nowrap; align-items: center; min-width: 200px; } .action-buttons .btn { padding: var(--space-1) var(--space-2); font-size: var(--font-size-sm); white-space: nowrap; } /* Ensure actions column is wide enough */ .table th:last-child, .table td:last-child { min-width: 200px; width: 200px; } /* Subscriptions Grid */ .subscriptions-grid { display: grid; gap: var(--space-6); } .subscription-list { background: var(--white); border-radius: var(--radius-lg); box-shadow: var(--shadow); overflow: hidden; } .subscription-header { background: var(--gray-50); padding: var(--space-4); border-bottom: 1px solid var(--gray-200); } .subscription-header h3 { font-size: var(--font-size-lg); font-weight: 600; color: var(--gray-900); margin-bottom: var(--space-1); } .subscription-header p { color: var(--gray-600); font-size: var(--font-size-sm); } .subscription-members { padding: var(--space-4); } .member-item { display: flex; justify-content: space-between; align-items: center; padding: var(--space-3) 0; border-bottom: 1px solid var(--gray-100); } .member-item:last-child { border-bottom: none; } .member-info { flex: 1; } .member-name { font-weight: 500; color: var(--gray-900); margin-bottom: var(--space-1); } .member-email { color: var(--gray-600); font-size: var(--font-size-sm); } /* Modals */ .modal { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); z-index: 1000; align-items: center; justify-content: center; padding: var(--space-4); } .modal.active { display: flex; } .modal-content { background: var(--white); border-radius: var(--radius-xl); box-shadow: var(--shadow-xl); width: 100%; max-width: 500px; max-height: 90vh; overflow-y: auto; } .modal-header { display: flex; justify-content: space-between; align-items: center; padding: var(--space-6) var(--space-6) var(--space-4); border-bottom: 1px solid var(--gray-200); } .modal-header h3 { font-size: var(--font-size-xl); font-weight: 600; color: var(--gray-900); } .modal-close { background: none; border: none; cursor: pointer; padding: var(--space-2); border-radius: var(--radius); color: var(--gray-400); transition: var(--transition); } .modal-close:hover { background: var(--gray-100); color: var(--gray-600); } .modal-body { padding: var(--space-4) var(--space-6); } .modal-actions { display: flex; gap: var(--space-3); justify-content: flex-end; padding: var(--space-4) var(--space-6) var(--space-6); } /* Forms inside modals need proper padding */ .modal form { padding: var(--space-4) var(--space-6) 0; } /* Forms */ .form-group { margin-bottom: var(--space-5); } .form-group label { display: block; margin-bottom: var(--space-2); font-weight: 500; color: var(--gray-700); font-size: var(--font-size-sm); } .form-group input, .form-group select, .form-group textarea { width: 100%; padding: var(--space-3); border: 1px solid var(--gray-300); border-radius: var(--radius); font-size: var(--font-size-sm); transition: var(--transition); } .form-group input:focus, .form-group select:focus, .form-group textarea:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgb(37 99 235 / 0.1); } .form-group textarea { resize: vertical; min-height: 80px; } /* Checkbox */ .checkbox-label { display: flex !important; align-items: center; gap: var(--space-2); cursor: pointer; font-weight: 400 !important; } .checkbox-label input[type="checkbox"] { width: auto !important; margin: 0; } .checkmark { font-size: var(--font-size-sm); } /* Loading Overlay */ .loading-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(255, 255, 255, 0.9); z-index: 2000; align-items: center; justify-content: center; } .loading-overlay.active { display: flex; } .loading-spinner { text-align: center; color: var(--primary-color); } .loading-spinner i { font-size: var(--font-size-3xl); margin-bottom: var(--space-4); } .loading-spinner p { font-weight: 500; color: var(--gray-600); } /* Responsive Design */ @media (max-width: 768px) { .login-container { padding: var(--space-6); max-width: 100%; } .login-logo { width: 60px; height: 60px; } .login-logo i { font-size: var(--font-size-2xl); } .login-header h1 { font-size: var(--font-size-xl); } .container { padding: 0 var(--space-3); } .menu-bar-content { flex-direction: column; gap: var(--space-2); padding: var(--space-2) var(--space-3); align-items: stretch; } .app-title { order: 1; justify-content: center; font-size: var(--font-size-base); } .user-dropdown { order: 2; align-self: flex-end; width: auto; } .menu-spacer { display: none; } .user-dropdown-menu { right: 0; left: auto; width: auto; min-width: 200px; } .auth-controls { flex-direction: column; gap: var(--space-2); } .token-input { min-width: auto; } .tab-nav { flex-direction: column; } .section-header { flex-direction: column; gap: var(--space-4); align-items: stretch; } .table-responsive { overflow-x: auto; } .table { min-width: 600px; } .modal-content { margin: var(--space-4); max-width: calc(100vw - 2rem); } .modal-actions { flex-direction: column; } .action-buttons { gap: var(--space-1); min-width: auto; } .action-buttons .btn { padding: var(--space-1) var(--space-2); font-size: var(--font-size-xs); } .table th:last-child, .table td:last-child { min-width: 180px; width: 180px; } } /* Member Subscriptions Modal */ .member-info-banner { display: flex; align-items: center; gap: var(--space-4); padding: var(--space-4); background: var(--gray-50); border-radius: var(--radius); margin-bottom: var(--space-6); } .member-avatar { width: 60px; height: 60px; background: var(--primary-color); border-radius: 50%; display: flex; align-items: center; justify-content: center; color: var(--white); font-size: var(--font-size-xl); } .member-details h4 { margin: 0 0 var(--space-1) 0; font-size: var(--font-size-lg); font-weight: 600; color: var(--gray-900); } .member-details p { margin: 0; color: var(--gray-600); font-size: var(--font-size-sm); } .subscriptions-section h5 { font-size: var(--font-size-base); font-weight: 600; color: var(--gray-900); margin-bottom: var(--space-2); } .subscription-list { display: flex; flex-direction: column; gap: var(--space-3); max-height: 300px; overflow-y: auto; padding: var(--space-2); border: 1px solid var(--gray-200); border-radius: var(--radius); background: var(--white); } .subscription-item { display: flex; align-items: center; justify-content: space-between; padding: var(--space-3); border-radius: var(--radius); transition: var(--transition); cursor: pointer; } .subscription-item:hover { background: var(--gray-50); } .subscription-item.subscribed { background: rgba(16, 185, 129, 0.1); border: 1px solid rgba(16, 185, 129, 0.2); } .list-info { flex: 1; display: flex; flex-direction: column; gap: var(--space-1); } .list-name { font-weight: 500; color: var(--gray-900); font-size: var(--font-size-sm); } .list-email { color: var(--gray-600); font-size: var(--font-size-xs); } .subscription-toggle { display: flex; align-items: center; gap: var(--space-2); } .toggle-switch { position: relative; width: 44px; height: 24px; background: var(--gray-300); border-radius: 12px; transition: var(--transition); cursor: pointer; } .toggle-switch.active { background: var(--success-color); } .toggle-switch::before { content: ''; position: absolute; top: 2px; left: 2px; width: 20px; height: 20px; background: var(--white); border-radius: 50%; transition: var(--transition); box-shadow: var(--shadow-sm); } .toggle-switch.active::before { transform: translateX(20px); } .subscription-status { font-size: var(--font-size-xs); font-weight: 500; min-width: 80px; text-align: right; } .subscription-status.subscribed { color: var(--success-color); } .subscription-status.not-subscribed { color: var(--gray-500); } /* Utility Classes */ .text-center { text-align: center; } .text-right { text-align: right; } .text-muted { color: var(--gray-600); } .text-sm { font-size: var(--font-size-sm); } .font-medium { font-weight: 500; } .font-semibold { font-weight: 600; } .font-bold { font-weight: 700; } .mb-0 { margin-bottom: 0; } .mb-4 { margin-bottom: var(--space-4); } .mt-4 { margin-top: var(--space-4); } .hidden { display: none; } /* Bulk Import Styles */ .modal-large .modal-content { max-width: 800px; width: 90vw; } .import-step { margin-bottom: var(--space-6); } .import-step h4 { color: var(--gray-800); font-size: var(--font-size-lg); font-weight: 600; margin-bottom: var(--space-4); display: flex; align-items: center; gap: var(--space-2); } .file-upload-area { border: 2px dashed var(--gray-300); border-radius: var(--border-radius); padding: var(--space-8); text-align: center; transition: var(--transition); cursor: pointer; background: var(--gray-50); } .file-upload-area:hover { border-color: var(--primary-color); background: rgba(37, 99, 235, 0.05); } .file-upload-area.dragover { border-color: var(--primary-color); background: rgba(37, 99, 235, 0.05); } .file-upload-content i { font-size: var(--font-size-3xl); color: var(--gray-400); margin-bottom: var(--space-3); } .file-upload-content p { color: var(--gray-600); font-weight: 500; } .file-info { display: flex; align-items: center; justify-content: space-between; padding: var(--space-4); background: var(--gray-50); border-radius: var(--border-radius); margin-top: var(--space-4); } .file-details { display: flex; align-items: center; gap: var(--space-3); } .file-details i { color: var(--success-color); font-size: var(--font-size-lg); } .csv-format-help { margin-top: var(--space-6); padding: var(--space-4); background: var(--gray-50); border-radius: var(--border-radius); } .csv-format-help h5 { color: var(--gray-800); margin-bottom: var(--space-3); display: flex; align-items: center; gap: var(--space-2); } .code-example { background: var(--gray-800); color: var(--gray-100); padding: var(--space-4); border-radius: var(--border-radius); font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: var(--font-size-sm); margin: var(--space-3) 0; overflow-x: auto; } .preview-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: var(--space-4); margin-bottom: var(--space-6); } .stat-item { text-align: center; padding: var(--space-4); background: var(--gray-50); border-radius: var(--border-radius); } .stat-value { display: block; font-size: var(--font-size-2xl); font-weight: 700; color: var(--primary-color); margin-bottom: var(--space-1); } .stat-label { color: var(--gray-600); font-size: var(--font-size-sm); font-weight: 500; } .preview-table-container { max-height: 300px; overflow-y: auto; border: 1px solid var(--gray-200); border-radius: var(--border-radius); margin-bottom: var(--space-4); } .preview-table-container .table { margin-bottom: 0; } .preview-table-container .table th { position: sticky; top: 0; background: var(--gray-50); z-index: 1; } .error-list { background: rgba(239, 68, 68, 0.1); border: 1px solid rgba(239, 68, 68, 0.2); border-radius: var(--border-radius); padding: var(--space-4); } .error-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-3); } .error-list h5 { color: var(--danger-color); margin-bottom: 0; display: flex; align-items: center; gap: var(--space-2); } .error-list ul { color: var(--danger-color); margin-left: var(--space-5); } .error-summary { color: var(--danger-color); font-size: var(--font-size-sm); margin-bottom: var(--space-3); } .error-table-container { max-height: 300px; overflow-y: auto; border: 1px solid rgba(239, 68, 68, 0.2); border-radius: var(--border-radius); margin-top: var(--space-3); } .error-table-container .table { margin-bottom: 0; font-size: var(--font-size-sm); } .error-table-container .table th { position: sticky; top: 0; background: rgba(239, 68, 68, 0.1); color: var(--danger-color); border-bottom: 2px solid rgba(239, 68, 68, 0.2); z-index: 1; } .error-table-container .table td { border-color: rgba(239, 68, 68, 0.1); color: var(--danger-color); } .raw-data-cell { font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: var(--font-size-xs); max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .raw-data-cell:hover { overflow: visible; white-space: normal; word-break: break-all; } .list-selection { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: var(--space-3); margin-bottom: var(--space-4); } .list-checkbox { display: flex; align-items: center; padding: var(--space-3); background: var(--gray-50); border-radius: var(--border-radius); cursor: pointer; transition: var(--transition); } .list-checkbox:hover { background: var(--gray-100); } .list-checkbox input[type="checkbox"] { margin-right: var(--space-3); transform: scale(1.2); } .list-checkbox-label { display: flex; flex-direction: column; gap: var(--space-1); } .list-checkbox-name { font-weight: 500; color: var(--gray-800); } .list-checkbox-email { font-size: var(--font-size-sm); color: var(--gray-600); } .selection-info { padding: var(--space-4); background: rgba(59, 130, 246, 0.1); border-radius: var(--border-radius); } .import-results { text-align: center; } .result-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: var(--space-4); margin-bottom: var(--space-6); } .result-stats .stat-item { background: rgba(16, 185, 129, 0.1); border: 1px solid rgba(16, 185, 129, 0.2); } .result-stats .stat-value { color: var(--success-color); } .result-errors { text-align: left; background: rgba(239, 68, 68, 0.1); border: 1px solid rgba(239, 68, 68, 0.2); border-radius: var(--border-radius); padding: var(--space-4); } .result-errors h5 { color: var(--danger-color); margin-bottom: var(--space-3); display: flex; align-items: center; gap: var(--space-2); } .result-errors ul { color: var(--danger-color); margin-left: var(--space-5); } .button-group { display: flex; gap: var(--space-3); } /* Row status indicators for preview table */ .row-status { font-size: var(--font-size-xs); padding: var(--space-1) var(--space-2); border-radius: 12px; font-weight: 500; text-transform: uppercase; } .row-status.valid { background: rgba(16, 185, 129, 0.1); color: var(--success-color); } .row-status.error { background: rgba(239, 68, 68, 0.1); color: var(--danger-color); } /* Animations */ @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 0.3s ease-out; } /* Bounce History Modal Styles */ .bounce-summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--space-4); margin: var(--space-6) 0; padding: var(--space-4); background: var(--gray-50); border-radius: var(--radius); } .bounce-stat { display: flex; align-items: center; gap: var(--space-3); } .bounce-stat i { font-size: 1.5rem; color: var(--primary-color); } .bounce-stat-label { font-size: var(--font-size-xs); color: var(--gray-500); text-transform: uppercase; letter-spacing: 0.5px; } .bounce-stat-value { font-size: var(--font-size-lg); font-weight: 600; color: var(--gray-800); } .bounce-stat-value.text-danger { color: var(--danger-color); } .bounce-stat-value.text-warning { color: var(--warning-color); } .bounce-stat-value.text-success { color: var(--success-color); } .bounce-history-section { margin-top: var(--space-6); } .bounce-history-section h5 { margin-bottom: var(--space-4); color: var(--gray-700); } .bounce-history-list { max-height: 400px; overflow-y: auto; padding: var(--space-2); } .bounce-history-item { background: var(--white); border: 1px solid var(--gray-200); border-radius: var(--radius); padding: var(--space-4); margin-bottom: var(--space-3); } .bounce-history-item:last-child { margin-bottom: 0; } .bounce-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: var(--space-2); } .bounce-type { display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-1) var(--space-3); border-radius: var(--radius-sm); font-size: var(--font-size-sm); font-weight: 600; } .bounce-type.bounce-type-permanent { background: #fee2e2; color: #991b1b; } .bounce-type.bounce-type-transient { background: #fef3c7; color: #92400e; } .bounce-type.bounce-type-undetermined { background: var(--gray-100); color: var(--gray-600); } .bounce-date { font-size: var(--font-size-sm); color: var(--gray-500); } .bounce-subtype { font-size: var(--font-size-sm); color: var(--gray-600); margin-top: var(--space-2); font-weight: 500; } .bounce-diagnostic { font-size: var(--font-size-sm); color: var(--gray-500); margin-top: var(--space-2); padding: var(--space-2); background: var(--gray-50); border-radius: var(--radius-sm); border-left: 3px solid var(--warning-color); font-family: 'Courier New', monospace; } .empty-state { text-align: center; padding: var(--space-8); color: var(--gray-400); } .empty-state i { font-size: 3rem; margin-bottom: var(--space-4); color: var(--success-color); } .empty-state p { font-size: var(--font-size-sm); }