:root { /* Color System */ --primary-color: #6B7280; --success-color: #10B981; --warning-color: #F59E0B; --danger-color: #EF4444; --white: #FFFFFF; /* Grayscale System */ --gray-50: #F9FAFB; --gray-100: #F3F4F6; --gray-200: #E5E7EB; --gray-300: #D1D5DB; --gray-400: #6B7280; --gray-500: #4B5563; --gray-600: #374151; --gray-700: #1F2937; --gray-800: #111827; --gray-900: #000000; /* Layout */ --bg-primary: #FFFFFF; --bg-secondary: #F9FAFB; --bg-card: #FFFFFF; --text-primary: #111827; --text-secondary: #374151; --text-muted: #6B7280; --border-color: #E5E7EB; --shadow-color: rgba(0, 0, 0, 0.1); /* Glass button styles */ --glass-bg: rgba(255,255,255,0.2); --glass-border: rgba(255,255,255,0.3); --glass-hover-bg: rgba(255,255,255,0.3); --glass-shadow: 0 4px 8px rgba(0,0,0,0.2); } /* Base Styles */ html, body { margin: 0; padding: 0; } body { background: radial-gradient(circle at 20% 80%, rgba(135, 206, 235, 0.1) 0%, transparent 50%), radial-gradient(circle at 80% 20%, rgba(152, 251, 152, 0.1) 0%, transparent 50%), radial-gradient(circle at 40% 40%, rgba(255, 218, 185, 0.1) 0%, transparent 50%), linear-gradient(135deg, #fef7f0 0%, #f0f4f8 100%); min-height: 100vh; font-family: 'Inter', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; color: var(--text-primary); position: relative; overflow-x: hidden; } .container-fluid { background: transparent; border-radius: 24px; margin: 0 20px 20px 0; padding: 0; position: relative; overflow: hidden; } /* Full height container for login/register pages */ .container-fluid.min-vh-100 { min-height: 100vh; margin: 0; border-radius: 0; } /* Header */ header { background: var(--gray-400); color: #FFFFFF; border-radius: 16px; margin: 0 0 1.5rem 0; padding: 1.5rem 2rem; position: relative; overflow: hidden; } header h1, header .display-4, header .text-primary { color: #F3F4F6 !important; text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); margin: 0; font-weight: 700; letter-spacing: -0.025em; font-size: 2.2rem; position: relative; z-index: 1; } /* Hide unused elements */ header button, header .btn, header [class*="toggle"], header [class*="theme"], header [id*="toggle"], header [id*="theme"], .fa-moon, .fa-sun, [class*="dark-mode"], [class*="theme-toggle"] { display: none; visibility: hidden; } header p, header .lead { display: none; } /* Cards */ .card { border: 1px solid var(--border-color); border-radius: 20px; transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); background: var(--bg-card); box-shadow: 0 8px 32px var(--shadow-color), 0 2px 8px rgba(0, 0, 0, 0.04); position: relative; overflow: hidden; margin-bottom: 2rem; } .card::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.6s ease; } .card:hover { transform: translateY(-2px) scale(1.01); box-shadow: 0 8px 25px rgba(168, 200, 236, 0.15), 0 4px 16px rgba(0, 0, 0, 0.05); } .card:hover::before { left: 100%; } .card-header { border-radius: 20px 20px 0 0 !important; border: none; padding: 1.5rem; background: var(--gray-400); border-bottom: 1px solid rgba(0, 0, 0, 0.1); color: #FFFFFF; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); font-weight: 600; } .card-body { padding: 1.5rem; } /* Forms */ .form-control { border-radius: 8px; border: 1px solid var(--gray-300); padding: 0.75rem 1rem; font-size: 0.9rem; transition: all 0.2s ease; background: var(--white); color: var(--gray-900); position: relative; box-shadow: 0 2px 8px rgba(168, 200, 236, 0.05); min-height: 45px; width: 100%; } /* Form Layout */ #feedbackForm { display: flex; flex-direction: column; gap: 0.75rem; } #feedbackForm .d-grid { margin-bottom: 0.5rem; } .form-control:focus { border-color: var(--primary-color); box-shadow: 0 0 0 2px rgba(168, 200, 236, 0.1), 0 2px 8px rgba(168, 200, 236, 0.1); background: var(--white); outline: none; transform: none; } .form-control:focus + .form-label, .form-control:not(:placeholder-shown) + .form-label { transform: translateY(-8px) scale(0.85); color: var(--primary-color); } .form-label { color: var(--gray-900) !important; font-size: 1rem; font-weight: 600; margin-bottom: 0.5rem; } .form-text { color: var(--gray-700) !important; font-size: 0.875rem; margin-top: 0.25rem !important; margin-bottom: 0 !important; } /* Buttons */ .btn { border-radius: 12px; padding: 0.875rem 1.75rem; font-weight: 600; text-transform: none; letter-spacing: 0; transition: all 0.3s ease; border: 1px solid transparent; font-size: 1rem; } .btn-primary { background: var(--gray-400); border: 1px solid var(--gray-400); color: var(--white); font-weight: 600; box-shadow: 0 4px 12px rgba(107, 114, 128, 0.3); position: relative; overflow: hidden; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .btn-primary::before, .btn.btn-primary::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 ease; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active, .show > .btn-primary.dropdown-toggle { background: var(--gray-500) !important; border-color: var(--gray-500) !important; color: var(--white) !important; box-shadow: 0 0 0 3px rgba(75, 85, 99, 0.25) !important; } /* Specific override for analyze button */ #analyzeBtn:hover, #analyzeBtn:focus, #analyzeBtn:active { background: var(--gray-500) !important; border-color: var(--gray-500) !important; color: var(--white) !important; } .btn-outline-secondary { border-color: var(--gray-500); color: var(--gray-700); font-weight: 600; transition: all 0.3s ease; } .btn-outline-secondary:hover { border-color: var(--gray-600); color: var(--white); background: var(--gray-500); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } .btn-outline-info { border-color: var(--gray-500); color: var(--gray-700); font-weight: 600; transition: all 0.3s ease; } .btn-outline-info:hover { background: var(--gray-500); border-color: var(--gray-500); color: var(--white); transform: translateY(-2px); box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); } /* Results - Removed duplicate rule */ #sentimentIcon i, #topicIcon i { transition: transform 0.3s ease; } #sentimentIcon:hover i, #topicIcon:hover i { transform: scale(1.1); } /* Sentiment Colors - Consistent with card headers */ .sentiment-positive { color: var(--success-color) !important; font-weight: 600; } .sentiment-neutral { color: var(--warning-color) !important; font-weight: 600; } .sentiment-negative { color: var(--danger-color) !important; font-weight: 600; } /* Topic Colors - Consistent with card headers */ .topic-lecturer { color: var(--gray-800) !important; font-weight: 600; } .topic-training_program { color: var(--gray-700) !important; font-weight: 600; } .topic-facility { color: var(--gray-600) !important; font-weight: 600; } .topic-others { color: var(--gray-500) !important; font-weight: 600; } /* Cards - Unified Gray Color Scheme */ .card-header { background: var(--gray-400); color: #F3F4F6; border-bottom: 1px solid var(--gray-300); } .card-header.bg-primary { background: var(--gray-400) !important; color: #F3F4F6 !important; } .card-header h1, .card-header h2, .card-header h3, .card-header h4, .card-header h5, .card-header h6, .card-header .card-title { color: #F3F4F6 !important; } /* Button Container Spacing */ .d-flex.gap-2 { gap: 0.5rem; margin-top: 0.75rem; } .d-flex.gap-2 .btn { padding: 0.5rem 1rem; font-size: 0.9rem; } /* Header Buttons */ header .btn-outline-light { border-color: rgba(255, 255, 255, 0.5); color: #FFFFFF; font-weight: 600; transition: all 0.3s ease; } header .btn-outline-light:hover { background-color: rgba(255, 255, 255, 0.1); border-color: #FFFFFF; color: #FFFFFF; transform: translateY(-2px); } header .btn-light { background-color: rgba(255, 255, 255, 0.9); color: var(--gray-700); font-weight: 600; transition: all 0.3s ease; } header .btn-light:hover { background-color: #FFFFFF; color: var(--gray-800); transform: translateY(-2px); } /* Dropdown Menu */ .dropdown-menu { border-radius: 12px; border: 1px solid var(--gray-200); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); margin-top: 0.5rem; } .dropdown-item { padding: 0.75rem 1rem; font-weight: 500; transition: all 0.2s ease; } .dropdown-item:hover { background-color: var(--gray-100); color: var(--gray-800); } /* Components */ .spinner-border { width: 3rem; height: 3rem; } .alert { border-radius: 4px; border: 1px solid var(--gray-200); padding: 0.5rem 0.75rem; background: var(--white); transition: opacity 0.5s ease-out, transform 0.5s ease-out; font-size: 0.875rem; margin-bottom: 0.5rem; max-width: 100%; line-height: 1.4; display: flex; align-items: center; justify-content: space-between; min-height: 2.5rem; } .alert.fade-out { opacity: 0; transform: translateY(-10px); } /* Compact alert styles */ .alert .btn-close { padding: 0; margin: 0; width: 1rem; height: 1rem; font-size: 0.75rem; line-height: 1; position: relative; top: 0; right: 0; display: flex; align-items: center; justify-content: center; border: none; background: transparent; opacity: 0.5; transition: opacity 0.15s ease-in-out; } .alert .btn-close:hover { opacity: 1; } .alert .btn-close::before { content: "×"; font-size: 1.2rem; font-weight: bold; line-height: 1; } .alert i { margin-right: 0.5rem; font-size: 0.875rem; display: inline-flex; align-items: center; flex-shrink: 0; } .alert .alert-content { flex: 1; display: flex; align-items: center; } /* Alert positioning */ .alert-success { background-color: rgba(16, 185, 129, 0.1); border-color: rgba(16, 185, 129, 0.2); color: #065f46; } .alert-info { background-color: rgba(107, 114, 128, 0.1); border-color: rgba(107, 114, 128, 0.2); color: #374151; } .alert-warning { background-color: rgba(245, 158, 11, 0.1); border-color: rgba(245, 158, 11, 0.2); color: #92400e; } .alert-danger { background-color: rgba(239, 68, 68, 0.1); border-color: rgba(239, 68, 68, 0.2); color: #991b1b; } /* Specific positioning for main page alerts */ .row.justify-content-center.mb-2 { margin-top: 0.5rem; } /* Compact spacing for alerts */ .alert + .alert { margin-top: 0.25rem; } blockquote { border-left: 4px solid var(--primary-color); padding-left: 1.5rem; font-style: italic; color: var(--gray-900); background: var(--gray-50); border-radius: 0 8px 8px 0; margin: 0; } footer { background: var(--gray-50); border-radius: 0 0 16px 16px; margin: 0; border-top: 1px solid var(--gray-200); color: var(--gray-800); } /* Bootstrap Overrides */ .bg-primary { background: var(--gray-400); } .text-primary { color: #F3F4F6 !important; } .spinner-border.text-primary { color: #F3F4F6 !important; } .border-primary { border-color: var(--primary-color); } /* Ensure all Bootstrap primary elements use gray */ .btn-primary, .card-header.bg-primary, .alert-primary { background: var(--gray-400); border-color: var(--gray-400); color: #F3F4F6; } /* Force all primary buttons to never use blue */ .btn-primary, .btn-primary:link, .btn-primary:visited, .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary:not(:disabled):not(.disabled):active, .btn-primary:not(:disabled):not(.disabled).active { background: var(--gray-400) !important; border-color: var(--gray-400) !important; color: #F3F4F6 !important; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active { background: var(--gray-500) !important; border-color: var(--gray-500) !important; } /* Force all text-primary to use light gray */ .text-primary, h1.text-primary, h2.text-primary, h3.text-primary, h4.text-primary, h5.text-primary, h6.text-primary, .display-4.text-primary, .fw-bold.text-primary { color: #F3F4F6 !important; } /* Force all icons to use light gray */ .text-primary i, .text-primary .fas, .text-primary .fa { color: #F3F4F6 !important; } /* Badge styling - ensure proper background */ .badge { display: inline-block !important; padding: 0.375rem 0.75rem !important; font-size: 0.875rem !important; font-weight: 500 !important; line-height: 1 !important; text-align: center !important; white-space: nowrap !important; vertical-align: baseline !important; border-radius: 0.375rem !important; } .badge.bg-light { background-color: #f8f9fa !important; color: #212529 !important; } .badge.bg-secondary { background-color: #6c757d !important; color: #fff !important; } .badge.bg-dark { background-color: #212529 !important; color: #fff !important; } /* CSV Results table styling */ #csvResultsTable td { vertical-align: middle !important; text-align: center !important; } #csvResultsTable td:nth-child(2) { text-align: left !important; } #csvResultsTable td:nth-child(3) { text-align: left !important; } #csvResultsTable td:nth-child(4) { text-align: left !important; } #csvResultsTable td:last-child { text-align: left !important; } /* Feedback count badge specific styling */ #feedbackCount { font-weight: 700 !important; font-size: 1rem !important; vertical-align: middle !important; display: inline-flex !important; align-items: center !important; justify-content: center !important; min-width: 2.5rem !important; height: 1.75rem !important; line-height: 1 !important; margin-left: 0.5rem !important; } /* Animations */ @keyframes fadeIn { from { opacity: 0; transform: translateY(30px) scale(0.95); } to { opacity: 1; transform: translateY(0) scale(1); } } @keyframes slideInUp { from { opacity: 0; transform: translateY(50px) rotateX(10deg); } to { opacity: 1; transform: translateY(0) rotateX(0deg); } } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.1); } } @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } .fade-in { animation: fadeIn 0.8s cubic-bezier(0.4, 0, 0.2, 1); } #results .card { animation: slideInUp 0.6s cubic-bezier(0.4, 0, 0.2, 1); } #sentimentIcon i { animation: pulse 2s ease-in-out infinite; } #topicIcon i { animation: bounce 1.5s ease-in-out infinite; } /* Custom Scrollbar */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: var(--gray-100); border-radius: 10px; } ::-webkit-scrollbar-thumb { background: rgba(135, 206, 235, 0.6); border-radius: 10px; border: 1px solid rgba(255, 255, 255, 0.3); } ::-webkit-scrollbar-thumb:hover { background: rgba(135, 206, 235, 0.8); } /* Pagination Styles - Gray Theme */ .pagination { margin: 0; padding: 0; display: flex; list-style: none; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); border: 1px solid var(--gray-200); } .pagination .page-item { margin: 0; border-right: 1px solid var(--gray-200); } .pagination .page-item:last-child { border-right: none; } .pagination .page-item:first-child .page-link { border-top-left-radius: 8px; border-bottom-left-radius: 8px; } .pagination .page-item:last-child .page-link { border-top-right-radius: 8px; border-bottom-right-radius: 8px; } .pagination .page-link { display: block; padding: 0.5rem 0.75rem; text-decoration: none; color: var(--gray-700); background-color: var(--white); border: none; font-weight: 500; font-size: 0.9rem; transition: all 0.2s ease; min-width: 40px; text-align: center; } .pagination .page-link:hover { color: var(--white); background-color: var(--gray-500); text-decoration: none; } .pagination .page-item.active .page-link { color: var(--white); background-color: var(--gray-400); font-weight: 600; } .pagination .page-item.active .page-link:hover { background-color: var(--gray-500); } .pagination .page-item.disabled .page-link { color: var(--gray-400); background-color: var(--gray-100); cursor: not-allowed; } .pagination .page-item.disabled .page-link:hover { color: var(--gray-400); background-color: var(--gray-100); } /* Navigation Links */ a[href*="login"]:hover, a[href*="register"]:hover { color: var(--gray-300); text-decoration: underline; transform: translateY(-1px); transition: all 0.3s ease; } /* Responsive Design */ @media (max-width: 768px) { .container-fluid { margin: 0 10px 10px 0; } header { border-radius: 12px; padding: 1rem; margin: 0 0 1rem 0; } header h1 { font-size: 1.8rem; } .card-body { padding: 1.25rem; } .btn { padding: 0.75rem 1.5rem; font-size: 0.95rem; } .card-header { border-radius: 12px 12px 0 0; padding: 1rem; } .form-control { padding: 0.875rem 1rem; min-height: 100px; } .d-flex.gap-2 .btn { padding: 0.4rem 0.8rem; font-size: 0.85rem; } .pagination .page-link { padding: 0.4rem 0.6rem; font-size: 0.85rem; min-width: 35px; } } /* Glass Button Component */ .btn-glass { background-color: var(--glass-bg); border: 1px solid var(--glass-border); color: #fff; padding: 8px; border-radius: 6px; text-decoration: none; font-weight: 600; display: inline-flex; align-items: center; justify-content: center; font-size: 13px; gap: 6px; backdrop-filter: blur(10px); transition: all 0.3s ease; } .btn-glass:hover { background-color: var(--glass-hover-bg); transform: translateY(-2px); box-shadow: var(--glass-shadow); color: #fff; } /* Link hover effects for login/register pages */ a.text-secondary.fw-bold:hover { color: #3B82F6 !important; transition: color 0.3s ease; } .btn-glass:active { transform: translateY(0); box-shadow: none; } .custom-alert-left { justify-content: flex-start !important; /* ép icon + text về trái */ text-align: left !important; width: 100% !important; margin-left: 0 !important; } .custom-alert-left i { margin-left: 0 !important; /* icon sát trái */ } /* Multiple Topics Display Styles */ .multiple-topics-container { display: flex; flex-direction: column; gap: 1rem; } .topic-sentiment-item { background: var(--gray-100); border-radius: 12px; padding: 1rem; border-left: 4px solid var(--gray-400); transition: all 0.3s ease; } .topic-sentiment-item:hover { background: var(--gray-200); transform: translateX(4px); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .topic-sentiment-item .fw-semibold { color: var(--text-primary); font-size: 1.05rem; }