TasteEngine / static /css /style.css
Abdallah4z's picture
Refactor recommendation page and templates
a3cafd5
:root {
--primary: #6C63FF;
--primary-light: #8B85FF;
--primary-dark: #4D44E8;
--primary-rgb: 108, 99, 255;
--secondary: #FF6584;
--secondary-light: #FF8DA3;
--secondary-rgb: 255, 101, 132;
--bg-deep: #0f0c29;
--bg-mid: #302b63;
--bg-light: #24243e;
--bg-gradient: linear-gradient(135deg, var(--bg-deep), var(--bg-mid), var(--bg-light));
--glass-bg: rgba(255, 255, 255, 0.06);
--glass-border: rgba(255, 255, 255, 0.1);
--glass-hover-bg: rgba(255, 255, 255, 0.1);
--glass-blur: 20px;
--card-bg: rgba(255, 255, 255, 0.04);
--card-border: rgba(255, 255, 255, 0.08);
--card-hover-bg: rgba(255, 255, 255, 0.07);
--card-hover-border: rgba(var(--primary-rgb), 0.3);
--text-primary: #ffffff;
--text-body: #e0e0e0;
--text-muted: rgba(255, 255, 255, 0.6);
--text-dim: rgba(255, 255, 255, 0.4);
--star: #FFD700;
--tag-text: #a99bff;
--tag-bg: rgba(var(--primary-rgb), 0.2);
--tag-border: rgba(var(--primary-rgb), 0.3);
--tag-brand-text: #ff9eb2;
--tag-brand-bg: rgba(var(--secondary-rgb), 0.15);
--tag-brand-border: rgba(var(--secondary-rgb), 0.3);
--success: #22C55E;
--error: #EF4444;
--warning: #F59E0B;
--space-xs: 0.25rem;
--space-sm: 0.5rem;
--space-md: 1rem;
--space-lg: 1.5rem;
--space-xl: 2rem;
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 16px;
--transition-fast: 0.2s ease;
--transition-normal: 0.3s ease;
--transition-slow: 0.5s ease;
--shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.2);
--shadow-md: 0 8px 25px rgba(0, 0, 0, 0.3);
--shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.3);
--shadow-glow: 0 8px 25px rgba(var(--primary-rgb), 0.4);
--container-max: 1200px;
}
[data-theme="light"] {
--bg-deep: #f0f2f5;
--bg-mid: #e2e6ed;
--bg-light: #ffffff;
--bg-gradient: linear-gradient(135deg, #f0f2f5, #e2e6ed, #ffffff);
--glass-bg: rgba(255, 255, 255, 0.75);
--glass-border: rgba(0, 0, 0, 0.08);
--glass-hover-bg: rgba(255, 255, 255, 0.9);
--card-bg: rgba(255, 255, 255, 0.6);
--card-border: rgba(0, 0, 0, 0.06);
--card-hover-bg: rgba(255, 255, 255, 0.85);
--card-hover-border: rgba(var(--primary-rgb), 0.2);
--text-primary: #1a1a2e;
--text-body: #333333;
--text-muted: rgba(0, 0, 0, 0.55);
--text-dim: rgba(0, 0, 0, 0.35);
--shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.06);
--shadow-md: 0 8px 25px rgba(0, 0, 0, 0.08);
--shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.1);
--shadow-glow: 0 8px 25px rgba(var(--primary-rgb), 0.25);
--tag-text: var(--primary);
--tag-brand-text: var(--secondary);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
background: var(--bg-gradient);
min-height: 100vh;
color: var(--text-body);
transition: background var(--transition-slow), color var(--transition-normal);
}
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: rgba(var(--primary-rgb), 0.3);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(var(--primary-rgb), 0.5);
}
::selection {
background: rgba(var(--primary-rgb), 0.3);
color: var(--text-primary);
}
/* ===== AMBIENT BACKGROUND ===== */
.ambient-bg {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
overflow: hidden;
pointer-events: none;
}
.ambient-blob {
position: absolute;
border-radius: 50%;
filter: blur(80px);
opacity: 0.12;
will-change: transform;
}
.ambient-blob-1 {
width: 600px;
height: 600px;
background: var(--primary);
top: -15%;
left: -10%;
animation: floatA 25s ease-in-out infinite;
}
.ambient-blob-2 {
width: 500px;
height: 500px;
background: var(--secondary);
bottom: -15%;
right: -10%;
animation: floatB 25s ease-in-out infinite;
animation-delay: -8s;
}
.ambient-blob-3 {
width: 400px;
height: 400px;
background: var(--primary-light);
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
animation: floatC 30s ease-in-out infinite;
animation-delay: -16s;
opacity: 0.06;
}
@keyframes floatA {
0%, 100% { transform: translate(0, 0) scale(1); }
25% { transform: translate(40px, -40px) scale(1.1); }
50% { transform: translate(-20px, 20px) scale(0.95); }
75% { transform: translate(30px, 30px) scale(1.05); }
}
@keyframes floatB {
0%, 100% { transform: translate(0, 0) scale(1); }
25% { transform: translate(-30px, 30px) scale(1.08); }
50% { transform: translate(20px, -30px) scale(0.92); }
75% { transform: translate(-40px, -20px) scale(1.02); }
}
@keyframes floatC {
0%, 100% { transform: translate(-50%, -50%) scale(1); }
33% { transform: translate(-40%, -60%) scale(1.15); }
66% { transform: translate(-60%, -40%) scale(0.9); }
}
/* ===== NAVIGATION ===== */
.nav {
background: rgba(255, 255, 255, 0.05);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border-bottom: 1px solid var(--glass-border);
padding: var(--space-md) var(--space-xl);
display: flex;
align-items: center;
justify-content: space-between;
position: sticky;
top: 0;
z-index: 100;
transition: background var(--transition-normal);
}
.nav-brand {
font-size: 1.3rem;
font-weight: 700;
color: var(--text-primary);
text-decoration: none;
letter-spacing: -0.5px;
display: flex;
align-items: center;
gap: var(--space-sm);
}
.nav-brand span {
color: var(--primary);
}
.nav-brand svg {
width: 24px;
height: 24px;
stroke: var(--primary);
}
.nav-center {
display: flex;
gap: var(--space-lg);
}
.nav-links {
display: flex;
gap: var(--space-lg);
}
.nav-links a {
color: var(--text-muted);
text-decoration: none;
font-size: 0.9rem;
font-weight: 500;
transition: color var(--transition-fast);
padding: var(--space-sm) 0;
position: relative;
}
.nav-links a::after {
content: '';
position: absolute;
bottom: -1px;
left: 0;
width: 100%;
height: 2px;
background: var(--primary);
transform: scaleX(0);
transition: transform var(--transition-fast);
}
.nav-links a:hover {
color: var(--text-primary);
}
.nav-links a.active {
color: var(--text-primary);
}
.nav-links a.active::after {
transform: scaleX(1);
}
.nav-actions {
display: flex;
align-items: center;
gap: var(--space-md);
}
.theme-toggle {
background: rgba(255, 255, 255, 0.08);
border: 1px solid var(--glass-border);
border-radius: 50%;
width: 36px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
color: var(--text-muted);
transition: all var(--transition-fast);
font-size: 1rem;
}
.theme-toggle:hover {
background: rgba(255, 255, 255, 0.15);
color: var(--text-primary);
}
/* ===== LAYOUT ===== */
.container {
max-width: var(--container-max);
margin: 0 auto;
padding: var(--space-xl);
animation: pageIn 0.4s ease;
}
@keyframes pageIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
/* ===== GLASS PANEL ===== */
.glass {
background: var(--glass-bg);
backdrop-filter: blur(var(--glass-blur));
-webkit-backdrop-filter: blur(var(--glass-blur));
border: 1px solid var(--glass-border);
border-radius: var(--radius-xl);
padding: var(--space-lg);
margin-bottom: var(--space-lg);
transition: all var(--transition-normal);
}
.glass:hover {
border-color: rgba(var(--primary-rgb), 0.15);
}
.glass-header {
font-size: 1.1rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: var(--space-md);
}
/* ===== FORM ELEMENTS ===== */
select, input[type="number"], input[type="text"], input[type="range"] {
background: rgba(255, 255, 255, 0.08);
border: 1px solid var(--glass-border);
border-radius: var(--radius-md);
padding: 0.65rem 1rem;
color: var(--text-primary);
font-size: 0.9rem;
width: 100%;
outline: none;
transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
appearance: none;
-webkit-appearance: none;
font-family: inherit;
}
select:hover, input:hover {
border-color: rgba(var(--primary-rgb), 0.5);
}
select:focus, input:focus {
border-color: var(--primary);
box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.15);
}
select {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='rgba(255,255,255,0.5)' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 0.75rem center;
padding-right: 2.5rem;
}
select option {
background: var(--bg-light);
color: var(--text-primary);
}
input[type="range"] {
padding: 0;
border: none;
background: none;
height: 6px;
accent-color: var(--primary);
}
.form-group {
margin-bottom: var(--space-md);
}
.form-label {
display: block;
font-size: 0.8rem;
font-weight: 500;
color: var(--text-muted);
margin-bottom: 0.3rem;
}
.form-hint {
font-size: 0.75rem;
color: var(--text-dim);
margin-top: 0.25rem;
}
.form-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-md);
}
/* ===== BUTTONS ===== */
.btn {
padding: 0.7rem 1.5rem;
border: none;
border-radius: var(--radius-md);
font-size: 0.9rem;
font-weight: 600;
cursor: pointer;
transition: all var(--transition-normal);
font-family: inherit;
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.4rem;
position: relative;
overflow: hidden;
}
.btn:active {
transform: scale(0.97);
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none !important;
}
.btn-primary {
background: linear-gradient(135deg, var(--primary), var(--secondary));
color: #fff;
}
.btn-primary:hover:not(:disabled) {
transform: translateY(-2px);
box-shadow: var(--shadow-glow);
}
.btn-secondary {
background: rgba(255, 255, 255, 0.1);
color: var(--text-primary);
border: 1px solid var(--glass-border);
}
.btn-secondary:hover:not(:disabled) {
background: rgba(255, 255, 255, 0.15);
transform: translateY(-1px);
}
.btn-ghost {
background: transparent;
color: var(--text-muted);
border: 1px solid transparent;
}
.btn-ghost:hover:not(:disabled) {
background: rgba(255, 255, 255, 0.06);
color: var(--text-primary);
}
.btn-sm {
padding: 0.4rem 0.8rem;
font-size: 0.8rem;
}
.btn-lg {
padding: 1rem 2rem;
font-size: 1rem;
}
.btn-group {
display: flex;
gap: var(--space-sm);
flex-wrap: wrap;
}
.btn-loading {
pointer-events: none;
}
.btn-loading .btn-text {
opacity: 0;
}
.btn-loading::after {
content: '';
position: absolute;
width: 16px;
height: 16px;
border: 2px solid rgba(255, 255, 255, 0.3);
border-top-color: #fff;
border-radius: 50%;
animation: spin 0.6s linear infinite;
}
.btn-approach {
background: rgba(255, 255, 255, 0.06);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: var(--radius-md);
padding: 0.75rem 1.2rem;
color: var(--text-muted);
cursor: pointer;
font-size: 0.85rem;
font-weight: 500;
transition: all var(--transition-normal);
font-family: inherit;
flex: 1;
min-width: 120px;
text-align: center;
}
.btn-approach:hover {
background: rgba(var(--primary-rgb), 0.15);
border-color: var(--primary);
color: var(--text-primary);
transform: translateY(-2px);
}
.btn-approach.active {
background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.3), rgba(var(--secondary-rgb), 0.2));
border-color: var(--primary);
color: var(--text-primary);
box-shadow: 0 4px 20px rgba(var(--primary-rgb), 0.2);
}
.btn-approach .icon {
font-size: 1.5rem;
display: block;
margin-bottom: 0.3rem;
}
.btn-method {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 6px;
padding: 0.4rem 0.8rem;
color: var(--text-muted);
cursor: pointer;
font-size: 0.8rem;
transition: all var(--transition-fast);
font-family: inherit;
}
.btn-method:hover {
background: rgba(255, 255, 255, 0.08);
color: var(--text-primary);
}
.btn-method.active {
background: rgba(var(--primary-rgb), 0.2);
border-color: var(--primary);
color: var(--text-primary);
}
/* ===== PROFILE CARD ===== */
.profile-card {
display: flex;
gap: var(--space-xl);
align-items: center;
flex-wrap: wrap;
}
.profile-avatar {
width: 64px;
height: 64px;
border-radius: 50%;
background: linear-gradient(135deg, var(--primary), var(--secondary));
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
font-weight: 700;
color: #fff;
flex-shrink: 0;
position: relative;
}
.profile-avatar::after {
content: '';
position: absolute;
inset: -3px;
border-radius: 50%;
background: linear-gradient(135deg, var(--primary), var(--secondary));
opacity: 0.3;
z-index: -1;
animation: pulse-ring 2s ease-in-out infinite;
}
@keyframes pulse-ring {
0%, 100% { transform: scale(1); opacity: 0.3; }
50% { transform: scale(1.08); opacity: 0.1; }
}
.profile-info {
flex: 1;
}
.profile-name {
font-size: 1.1rem;
font-weight: 600;
color: var(--text-primary);
}
.profile-detail {
font-size: 0.85rem;
color: var(--text-muted);
margin-top: 0.2rem;
}
.profile-tags {
display: flex;
gap: 0.4rem;
flex-wrap: wrap;
}
/* ===== TAGS ===== */
.tag {
background: var(--tag-bg);
border: 1px solid var(--tag-border);
border-radius: var(--radius-sm);
padding: 0.15rem 0.5rem;
font-size: 0.75rem;
color: var(--tag-text);
}
.tag-brand {
background: var(--tag-brand-bg);
border-color: var(--tag-brand-border);
color: var(--tag-brand-text);
}
/* ===== GRID ===== */
.row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-lg);
}
@media (max-width: 768px) {
.row {
grid-template-columns: 1fr;
}
}
/* ===== PRODUCT CARD ===== */
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: var(--space-md);
}
.product-card {
background: var(--card-bg);
border: 1px solid var(--card-border);
border-radius: var(--radius-lg);
padding: var(--space-md);
transition: all var(--transition-normal);
cursor: default;
position: relative;
overflow: hidden;
}
.product-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: linear-gradient(90deg, var(--primary), var(--secondary));
transform: scaleX(0);
transform-origin: left;
transition: transform var(--transition-normal);
}
.product-card:hover {
transform: translateY(-4px);
background: var(--card-hover-bg);
border-color: var(--card-hover-border);
box-shadow: var(--shadow-lg);
}
.product-card:hover::before {
transform: scaleX(1);
}
.product-card .score-badge-top {
position: absolute;
top: var(--space-sm);
right: var(--space-sm);
background: linear-gradient(135deg, var(--primary), var(--secondary));
color: #fff;
border-radius: var(--radius-sm);
padding: 0.15rem 0.5rem;
font-size: 0.7rem;
font-weight: 600;
}
.product-icon {
width: 48px;
height: 48px;
border-radius: 10px;
background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.2), rgba(var(--secondary-rgb), 0.1));
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
margin-bottom: 0.75rem;
}
.product-name {
font-size: 0.95rem;
font-weight: 600;
color: var(--text-primary);
margin-bottom: 0.3rem;
}
.product-meta {
font-size: 0.8rem;
color: var(--text-muted);
margin-bottom: 0.4rem;
}
.product-price {
font-size: 1rem;
font-weight: 700;
color: var(--primary);
}
.product-rating {
display: flex;
align-items: center;
gap: 0.3rem;
font-size: 0.85rem;
color: var(--star);
}
.product-explanation {
font-size: 0.78rem;
color: var(--text-muted);
border-top: 1px solid rgba(255, 255, 255, 0.06);
padding-top: 0.6rem;
margin-top: 0.6rem;
font-style: italic;
line-height: 1.4;
}
.compact-row {
display: flex;
gap: var(--space-md);
align-items: center;
flex-wrap: wrap;
}
/* ===== SCORE BADGE ===== */
.score-badge {
display: inline-block;
background: var(--tag-bg);
border-radius: var(--radius-sm);
padding: 0.1rem 0.4rem;
font-size: 0.7rem;
color: var(--tag-text);
}
/* ===== TABS ===== */
.tabs {
display: flex;
gap: var(--space-sm);
margin-bottom: var(--space-lg);
flex-wrap: wrap;
}
.tab {
padding: 0.6rem 1.2rem;
border-radius: var(--radius-md);
background: rgba(255, 255, 255, 0.05);
border: 1px solid rgba(255, 255, 255, 0.08);
color: var(--text-muted);
cursor: pointer;
font-size: 0.85rem;
font-weight: 500;
transition: all var(--transition-fast);
font-family: inherit;
display: flex;
align-items: center;
gap: 0.3rem;
}
.tab:hover {
background: rgba(255, 255, 255, 0.08);
color: var(--text-primary);
}
.tab.active {
background: rgba(var(--primary-rgb), 0.2);
border-color: var(--primary);
color: var(--text-primary);
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
animation: fadeIn 0.3s ease;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: translateY(0); }
}
/* ===== EVALUATION TABLE ===== */
.eval-table {
width: 100%;
border-collapse: collapse;
font-size: 0.85rem;
}
.eval-table th,
.eval-table td {
padding: 0.6rem 0.8rem;
text-align: left;
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.eval-table th {
color: var(--text-muted);
font-weight: 500;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.5px;
white-space: nowrap;
}
.eval-table td {
color: var(--text-body);
}
.eval-table tr:hover td {
background: rgba(255, 255, 255, 0.03);
}
.best-row {
background: rgba(var(--primary-rgb), 0.08) !important;
}
.eval-table .metric-improved {
color: var(--success);
}
.eval-table .metric-declined {
color: var(--error);
}
/* ===== LOADING STATES ===== */
.loading {
display: flex;
align-items: center;
justify-content: center;
padding: 3rem;
color: var(--text-muted);
gap: 0.75rem;
}
.spinner {
width: 24px;
height: 24px;
border: 3px solid rgba(255, 255, 255, 0.1);
border-top-color: var(--primary);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
.skeleton {
background: linear-gradient(
90deg,
rgba(255, 255, 255, 0.04) 25%,
rgba(255, 255, 255, 0.08) 50%,
rgba(255, 255, 255, 0.04) 75%
);
background-size: 200% 100%;
animation: shimmer 1.5s ease-in-out infinite;
border-radius: var(--radius-md);
}
@keyframes shimmer {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
.skeleton-card {
height: 180px;
padding: var(--space-md);
}
.skeleton-line {
height: 12px;
margin-bottom: 8px;
width: 80%;
}
.skeleton-line:last-child {
width: 60%;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* ===== EMPTY STATE ===== */
.empty-state {
text-align: center;
padding: 3rem;
color: var(--text-dim);
}
.empty-state .empty-icon {
font-size: 3rem;
margin-bottom: var(--space-md);
}
.empty-state .empty-title {
font-size: 1.1rem;
font-weight: 600;
color: var(--text-muted);
margin-bottom: var(--space-sm);
}
.empty-state .empty-desc {
font-size: 0.85rem;
color: var(--text-dim);
}
/* ===== CHART ===== */
.chart-container {
position: relative;
height: 300px;
width: 100%;
}
.chart-container canvas {
max-height: 100%;
max-width: 100%;
}
/* ===== ANALYSIS BLOCK ===== */
.analysis-block {
background: rgba(var(--primary-rgb), 0.06);
border: 1px solid rgba(var(--primary-rgb), 0.15);
border-radius: 10px;
padding: 1rem;
margin-top: var(--space-md);
}
.analysis-block h4 {
color: var(--tag-text);
margin-bottom: var(--space-sm);
font-size: 0.9rem;
}
.analysis-block p {
font-size: 0.85rem;
color: var(--text-muted);
line-height: 1.6;
}
.analysis-block ul {
list-style: none;
padding: 0;
}
.analysis-block li {
font-size: 0.85rem;
color: var(--text-muted);
padding: 0.25rem 0;
line-height: 1.5;
}
.analysis-block li::before {
content: '▸ ';
color: var(--primary);
}
/* ===== COMPARE VIEW ===== */
.compare-view {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: var(--space-md);
}
@media (max-width: 992px) {
.compare-view {
grid-template-columns: 1fr;
}
}
.compare-column {
background: rgba(255, 255, 255, 0.03);
border-radius: var(--radius-lg);
padding: var(--space-md);
border: 1px solid var(--card-border);
transition: all var(--transition-normal);
}
.compare-column:hover {
border-color: rgba(var(--primary-rgb), 0.2);
}
.compare-column h3 {
font-size: 0.9rem;
color: var(--text-primary);
margin-bottom: var(--space-md);
text-align: center;
padding-bottom: var(--space-sm);
border-bottom: 1px solid var(--card-border);
}
.compare-item {
padding: 0.5rem 0;
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
font-size: 0.8rem;
}
.compare-item:last-child {
border-bottom: none;
}
.compare-item-name {
font-weight: 500;
color: var(--text-primary);
}
.compare-item-meta {
color: var(--text-dim);
margin-top: 0.15rem;
}
/* ===== BADGE ===== */
.badge-best {
background: linear-gradient(135deg, var(--primary), var(--secondary));
color: #fff;
padding: 0.2rem 0.6rem;
border-radius: var(--radius-sm);
font-size: 0.7rem;
font-weight: 600;
display: inline-block;
}
/* ===== TOAST NOTIFICATIONS ===== */
.toast-container {
position: fixed;
bottom: var(--space-xl);
right: var(--space-xl);
z-index: 9999;
display: flex;
flex-direction: column;
gap: 0.5rem;
pointer-events: none;
}
.toast {
pointer-events: auto;
background: var(--glass-bg);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
border: 1px solid var(--glass-border);
border-radius: var(--radius-md);
padding: 0.75rem 1rem;
color: var(--text-primary);
font-size: 0.85rem;
display: flex;
align-items: center;
gap: 0.5rem;
box-shadow: var(--shadow-md);
min-width: 280px;
max-width: 400px;
animation: toastIn 0.35s ease, toastOut 0.35s ease 3s forwards;
}
.toast-success {
border-left: 3px solid var(--success);
}
.toast-error {
border-left: 3px solid var(--error);
}
.toast-info {
border-left: 3px solid var(--primary);
}
.toast-warning {
border-left: 3px solid var(--warning);
}
.toast-icon {
flex-shrink: 0;
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
}
.toast-success .toast-icon { color: var(--success); }
.toast-error .toast-icon { color: var(--error); }
.toast-info .toast-icon { color: var(--primary); }
.toast-warning .toast-icon { color: var(--warning); }
.toast-close {
margin-left: auto;
background: none;
border: none;
color: var(--text-dim);
cursor: pointer;
padding: 0.15rem;
font-size: 1rem;
line-height: 1;
}
@keyframes toastIn {
from { transform: translateX(100%); opacity: 0; }
to { transform: translateX(0); opacity: 1; }
}
@keyframes toastOut {
from { opacity: 1; }
to { opacity: 0; transform: translateY(-10px); }
}
/* ===== PREFERENCE EDITOR ===== */
.preference-slider {
display: flex;
align-items: center;
gap: var(--space-md);
padding: 0.5rem 0;
}
.preference-slider label {
min-width: 120px;
font-size: 0.85rem;
color: var(--text-muted);
}
.preference-slider input[type="range"] {
flex: 1;
}
.preference-slider .slider-value {
min-width: 40px;
text-align: right;
font-size: 0.85rem;
font-weight: 600;
color: var(--primary);
}
/* ===== FILTER CONTROLS ===== */
.filter-bar {
display: flex;
gap: var(--space-md);
flex-wrap: wrap;
align-items: end;
margin-bottom: var(--space-md);
}
.filter-bar .form-group {
margin-bottom: 0;
min-width: 160px;
}
.filter-bar .form-group select,
.filter-bar .form-group input {
width: auto;
min-width: 140px;
}
/* ===== RESPONSIVE ===== */
@media (max-width: 768px) {
.nav {
padding: var(--space-md);
flex-wrap: wrap;
gap: var(--space-sm);
}
.nav-links {
gap: var(--space-sm);
font-size: 0.8rem;
}
.container {
padding: var(--space-md);
}
.glass {
padding: var(--space-md);
}
.form-row {
grid-template-columns: 1fr;
}
.product-grid {
grid-template-columns: 1fr;
}
.toast-container {
bottom: var(--space-md);
right: var(--space-md);
left: var(--space-md);
}
.toast {
min-width: 0;
max-width: 100%;
}
.eval-table {
font-size: 0.75rem;
}
.eval-table th,
.eval-table td {
padding: 0.4rem 0.5rem;
}
.nav-center {
order: 3;
width: 100%;
justify-content: center;
}
}
@media (max-width: 992px) {
.profile-card {
flex-direction: column;
text-align: center;
}
.profile-tags {
justify-content: center;
}
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
.ambient-blob { display: none; }
html { scroll-behavior: auto; }
}
/* ===== CATEGORY ACCENT COLORS ===== */
:root {
--cat-electronics: #3B82F6;
--cat-clothing: #EC4899;
--cat-home-kitchen: #F59E0B;
--cat-books: #14B8A6;
--cat-sports: #22C55E;
--cat-beauty: #A855F7;
--cat-toys: #F97316;
--cat-automotive: #EF4444;
}
.product-card[data-category="Electronics"]::before { background: var(--cat-electronics); }
.product-card[data-category="Clothing"]::before { background: var(--cat-clothing); }
.product-card[data-category="Home & Kitchen"]::before { background: var(--cat-home-kitchen); }
.product-card[data-category="Books"]::before { background: var(--cat-books); }
.product-card[data-category="Sports"]::before { background: var(--cat-sports); }
.product-card[data-category="Beauty"]::before { background: var(--cat-beauty); }
.product-card[data-category="Toys"]::before { background: var(--cat-toys); }
.product-card[data-category="Automotive"]::before { background: var(--cat-automotive); }
.product-card[data-category="Electronics"]:hover { border-color: rgba(59, 130, 246, 0.3); }
.product-card[data-category="Clothing"]:hover { border-color: rgba(236, 72, 153, 0.3); }
.product-card[data-category="Home & Kitchen"]:hover { border-color: rgba(245, 158, 11, 0.3); }
.product-card[data-category="Books"]:hover { border-color: rgba(20, 184, 166, 0.3); }
.product-card[data-category="Sports"]:hover { border-color: rgba(34, 197, 94, 0.3); }
.product-card[data-category="Beauty"]:hover { border-color: rgba(168, 85, 247, 0.3); }
.product-card[data-category="Toys"]:hover { border-color: rgba(249, 115, 22, 0.3); }
.product-card[data-category="Automotive"]:hover { border-color: rgba(239, 68, 68, 0.3); }
/* ===== RELEVANCE PROGRESS BAR ===== */
.product-score-bar {
height: 3px;
border-radius: 2px;
margin-top: 0.5rem;
background: rgba(255, 255, 255, 0.06);
overflow: hidden;
}
.product-score-bar-fill {
height: 100%;
border-radius: 2px;
background: linear-gradient(90deg, var(--primary), var(--secondary));
transition: width 0.6s ease;
}
/* ===== STAGGERED CARD ENTRY ===== */
.product-card.stagger {
animation: cardIn 0.4s ease backwards;
}
@keyframes cardIn {
from { opacity: 0; transform: translateY(15px) scale(0.97); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
/* ===== TOOLTIP ===== */
.tooltip-trigger {
position: relative;
cursor: help;
border-bottom: 1px dashed var(--text-dim);
}
.tooltip-trigger .tooltip-content {
position: absolute;
bottom: calc(100% + 8px);
left: 50%;
transform: translateX(-50%) translateY(4px);
background: var(--bg-light);
border: 1px solid var(--glass-border);
border-radius: var(--radius-md);
padding: 0.5rem 0.75rem;
font-size: 0.75rem;
color: var(--text-body);
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: all var(--transition-fast);
z-index: 50;
box-shadow: var(--shadow-md);
line-height: 1.4;
font-style: normal;
font-weight: 400;
}
.tooltip-trigger:hover .tooltip-content {
opacity: 1;
transform: translateX(-50%) translateY(0);
}
.tooltip-trigger .tooltip-content::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border: 5px solid transparent;
border-top-color: var(--glass-border);
}
/* ===== BREADCRUMB ===== */
.breadcrumb {
display: flex;
align-items: center;
gap: 0.4rem;
font-size: 0.75rem;
color: var(--text-dim);
margin-bottom: var(--space-md);
padding: 0;
list-style: none;
}
.breadcrumb li { display: flex; align-items: center; gap: 0.4rem; }
.breadcrumb a {
color: var(--text-muted);
text-decoration: none;
transition: color var(--transition-fast);
}
.breadcrumb a:hover { color: var(--primary); }
.breadcrumb .sep { color: var(--text-dim); }
.breadcrumb .current { color: var(--text-primary); font-weight: 500; }
/* ===== KPI METRIC CARDS ===== */
.kpi-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: var(--space-md);
margin-bottom: var(--space-lg);
}
.kpi-card {
background: var(--card-bg);
border: 1px solid var(--card-border);
border-radius: var(--radius-lg);
padding: var(--space-md);
text-align: center;
transition: all var(--transition-normal);
}
.kpi-card:hover {
border-color: var(--card-hover-border);
transform: translateY(-2px);
}
.kpi-card .kpi-label {
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.5px;
color: var(--text-dim);
margin-bottom: 0.3rem;
}
.kpi-card .kpi-value {
font-size: 1.5rem;
font-weight: 700;
color: var(--text-primary);
}
.kpi-card .kpi-unit {
font-size: 0.75rem;
color: var(--text-muted);
margin-top: 0.15rem;
}
.kpi-card.kpi-primary .kpi-value { color: var(--primary); }
.kpi-card.kpi-secondary .kpi-value { color: var(--secondary); }
.kpi-card.kpi-success .kpi-value { color: var(--success); }
.kpi-card.kpi-warning .kpi-value { color: var(--warning); }
/* ===== COMPARE VIEW SYNCED SCROLL ===== */
.compare-view.synced-scroll .compare-column {
overflow-y: auto;
max-height: 500px;
}
/* ===== KEYBOARD SHORTCUT HINT ===== */
.kbd-hint {
position: fixed;
bottom: var(--space-md);
left: 50%;
transform: translateX(-50%);
background: var(--glass-bg);
backdrop-filter: blur(12px);
border: 1px solid var(--glass-border);
border-radius: var(--radius-md);
padding: 0.4rem 1rem;
font-size: 0.7rem;
color: var(--text-dim);
z-index: 50;
white-space: nowrap;
opacity: 0;
transition: opacity var(--transition-slow);
pointer-events: none;
}
.kbd-hint.visible { opacity: 1; }
.kbd-hint kbd {
display: inline-block;
background: rgba(255,255,255,0.1);
border-radius: 3px;
padding: 0 0.3rem;
font-family: inherit;
font-size: 0.65rem;
border: 1px solid var(--glass-border);
margin: 0 0.1rem;
}
[x-cloak] { display: none !important; }
/* ===== UTILITIES ===== */
.hidden {
display: none !important;
}
.mt-1 { margin-top: var(--space-sm); }
.mt-2 { margin-top: var(--space-md); }
.mt-3 { margin-top: var(--space-lg); }
.mb-1 { margin-bottom: var(--space-sm); }
.mb-2 { margin-bottom: var(--space-md); }
.mb-3 { margin-bottom: var(--space-lg); }
.text-center { text-align: center; }
.text-muted { color: var(--text-muted); }
.text-dim { color: var(--text-dim); }
.flex { display: flex; }
.flex-center { display: flex; align-items: center; justify-content: center; }
.flex-between { display: flex; align-items: center; justify-content: space-between; }
.gap-sm { gap: var(--space-sm); }
.gap-md { gap: var(--space-md); }
.w-full { width: 100%; }