/* 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; } .container { max-width: 1200px; margin: 0 auto; padding: 0 var(--space-4); } /* Header */ .header { background: var(--white); border-bottom: 1px solid var(--gray-200); box-shadow: var(--shadow-sm); position: sticky; top: 0; z-index: 100; } .header-content { display: flex; justify-content: space-between; align-items: center; padding: var(--space-4) 0; } .logo { font-size: var(--font-size-xl); font-weight: 700; color: var(--primary-color); display: flex; align-items: center; gap: var(--space-2); } .logo i { font-size: var(--font-size-2xl); } /* 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-info { display: flex; align-items: center; gap: var(--space-3); } .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); } /* 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); } /* Action buttons in tables */ .action-buttons { display: flex; gap: var(--space-2); } /* 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 */ .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) { .container { padding: 0 var(--space-3); } .header-content { flex-direction: column; gap: var(--space-4); align-items: stretch; } .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 { flex-direction: column; } } /* 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; } /* Animations */ @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn 0.3s ease-out; }