/* * Neural Network Quantizer - Design System * Premium glassmorphism dark theme with smooth animations */ /* ============================================ CSS Variables - Design Tokens ============================================ */ /* Dark Theme (Default) */ :root { /* Colors - Dark Theme */ --color-bg-primary: #0a0a0f; --color-bg-secondary: #12121a; --color-bg-tertiary: #1a1a25; --color-bg-elevated: #22222f; /* Glass effect backgrounds */ --glass-bg: rgba(255, 255, 255, 0.03); --glass-bg-hover: rgba(255, 255, 255, 0.06); --glass-border: rgba(255, 255, 255, 0.08); --glass-border-hover: rgba(255, 255, 255, 0.15); /* Accent colors */ --color-accent-primary: #6366f1; --color-accent-secondary: #8b5cf6; --color-accent-tertiary: #a855f7; --color-accent-glow: rgba(99, 102, 241, 0.3); /* Status colors */ --color-success: #10b981; --color-success-bg: rgba(16, 185, 129, 0.1); --color-warning: #f59e0b; --color-warning-bg: rgba(245, 158, 11, 0.1); --color-error: #ef4444; --color-error-bg: rgba(239, 68, 68, 0.1); --color-info: #06b6d4; --color-info-bg: rgba(6, 182, 212, 0.1); /* Text colors */ --text-primary: #f8fafc; --text-secondary: #94a3b8; --text-tertiary: #64748b; --text-muted: #475569; /* Gradients */ --gradient-primary: linear-gradient(135deg, var(--color-accent-primary) 0%, var(--color-accent-secondary) 100%); --gradient-secondary: linear-gradient(135deg, var(--color-accent-secondary) 0%, var(--color-accent-tertiary) 100%); --gradient-glow: radial-gradient(ellipse at center, var(--color-accent-glow) 0%, transparent 70%); --gradient-mesh: radial-gradient(at 40% 20%, hsla(228, 100%, 74%, 0.15) 0px, transparent 50%), radial-gradient(at 80% 0%, hsla(189, 100%, 56%, 0.1) 0px, transparent 50%), radial-gradient(at 0% 50%, hsla(355, 100%, 93%, 0.05) 0px, transparent 50%), radial-gradient(at 80% 50%, hsla(340, 100%, 76%, 0.1) 0px, transparent 50%); /* Spacing */ --space-xs: 0.25rem; --space-sm: 0.5rem; --space-md: 1rem; --space-lg: 1.5rem; --space-xl: 2rem; --space-2xl: 3rem; --space-3xl: 4rem; /* Border radius */ --radius-sm: 0.375rem; --radius-md: 0.5rem; --radius-lg: 0.75rem; --radius-xl: 1rem; --radius-2xl: 1.5rem; --radius-full: 9999px; /* Shadows */ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3), 0 2px 4px -1px rgba(0, 0, 0, 0.2); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.4), 0 4px 6px -2px rgba(0, 0, 0, 0.3); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.5), 0 10px 10px -5px rgba(0, 0, 0, 0.3); --shadow-glow: 0 0 40px var(--color-accent-glow); /* Typography */ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; --font-mono: 'JetBrains Mono', 'Fira Code', Consolas, monospace; --text-xs: 0.75rem; --text-sm: 0.875rem; --text-base: 1rem; --text-lg: 1.125rem; --text-xl: 1.25rem; --text-2xl: 1.5rem; --text-3xl: 1.875rem; --text-4xl: 2.25rem; /* Transitions */ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1); --transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1); --transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1); --transition-spring: 500ms cubic-bezier(0.34, 1.56, 0.64, 1); /* Layout */ --sidebar-width: 280px; --header-height: 64px; --max-content-width: 1400px; } /* Light Theme */ [data-theme="light"] { /* Colors - Light Theme */ --color-bg-primary: #f8fafc; --color-bg-secondary: #ffffff; --color-bg-tertiary: #f1f5f9; --color-bg-elevated: #e2e8f0; /* Glass effect backgrounds - Frosty */ --glass-bg: rgba(255, 255, 255, 0.7); --glass-bg-hover: rgba(255, 255, 255, 0.85); --glass-border: rgba(0, 0, 0, 0.06); --glass-border-hover: rgba(0, 0, 0, 0.12); /* Text colors */ --text-primary: #0f172a; --text-secondary: #475569; --text-tertiary: #64748b; --text-muted: #94a3b8; /* Gradient tweaks for light mode */ --color-accent-glow: rgba(99, 102, 241, 0.15); --gradient-mesh: radial-gradient(at 40% 20%, hsla(228, 100%, 74%, 0.10) 0px, transparent 50%), radial-gradient(at 80% 0%, hsla(189, 100%, 56%, 0.08) 0px, transparent 50%), radial-gradient(at 0% 50%, hsla(355, 100%, 93%, 0.08) 0px, transparent 50%), radial-gradient(at 80% 50%, hsla(340, 100%, 76%, 0.05) 0px, transparent 50%); /* Adjust shadows for light mode */ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.03); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.05), 0 10px 10px -5px rgba(0, 0, 0, 0.03); } /* ============================================ Base Styles ============================================ */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } body { font-family: var(--font-sans); background: var(--color-bg-primary); color: var(--text-primary); line-height: 1.6; min-height: 100vh; overflow-x: hidden; } /* Background mesh gradient */ body::before { content: ''; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: var(--gradient-mesh); pointer-events: none; z-index: -1; } #root { min-height: 100vh; display: flex; flex-direction: column; } /* ============================================ Typography ============================================ */ h1, h2, h3, h4, h5, h6 { font-weight: 600; line-height: 1.3; color: var(--text-primary); } h1 { font-size: var(--text-4xl); } h2 { font-size: var(--text-3xl); } h3 { font-size: var(--text-2xl); } h4 { font-size: var(--text-xl); } h5 { font-size: var(--text-lg); } h6 { font-size: var(--text-base); } p { color: var(--text-secondary); margin-bottom: var(--space-md); } a { color: var(--color-accent-primary); text-decoration: none; transition: color var(--transition-fast); } a:hover { color: var(--color-accent-secondary); } code { font-family: var(--font-mono); background: var(--glass-bg); padding: 0.2em 0.4em; border-radius: var(--radius-sm); font-size: 0.9em; } /* ============================================ Glass Card Component ============================================ */ .glass-card { background: var(--glass-bg); border: 1px solid var(--glass-border); border-radius: var(--radius-xl); padding: var(--space-lg); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); transition: all var(--transition-base); } .glass-card:hover { background: var(--glass-bg-hover); border-color: var(--glass-border-hover); transform: translateY(-2px); box-shadow: var(--shadow-lg); } .glass-card.no-hover:hover { transform: none; box-shadow: none; } /* ============================================ Button Styles ============================================ */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-sm); padding: var(--space-sm) var(--space-lg); border: none; border-radius: var(--radius-lg); font-family: var(--font-sans); font-size: var(--text-sm); font-weight: 500; cursor: pointer; transition: all var(--transition-base); white-space: nowrap; } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn-primary { background: var(--gradient-primary); color: white; box-shadow: var(--shadow-md), 0 0 20px var(--color-accent-glow); } .btn-primary:hover:not(:disabled) { transform: translateY(-2px); box-shadow: var(--shadow-lg), 0 0 30px var(--color-accent-glow); } .btn-secondary { background: var(--glass-bg); color: var(--text-primary); border: 1px solid var(--glass-border); backdrop-filter: blur(10px); } .btn-secondary:hover:not(:disabled) { background: var(--glass-bg-hover); border-color: var(--glass-border-hover); } .btn-ghost { background: transparent; color: var(--text-secondary); } .btn-ghost:hover:not(:disabled) { background: var(--glass-bg); color: var(--text-primary); } .btn-success { background: var(--color-success); color: white; } .btn-danger { background: var(--color-error); color: white; } .btn-lg { padding: var(--space-md) var(--space-xl); font-size: var(--text-base); } .btn-sm { padding: var(--space-xs) var(--space-md); font-size: var(--text-xs); } .btn-icon { padding: var(--space-sm); aspect-ratio: 1; } /* ============================================ Input Styles ============================================ */ .input-group { display: flex; flex-direction: column; gap: var(--space-xs); } .input-label { font-size: var(--text-sm); font-weight: 500; color: var(--text-secondary); } .input { width: 100%; padding: var(--space-sm) var(--space-md); background: var(--glass-bg); border: 1px solid var(--glass-border); border-radius: var(--radius-md); color: var(--text-primary); font-family: var(--font-sans); font-size: var(--text-sm); transition: all var(--transition-fast); } .input:focus { outline: none; border-color: var(--color-accent-primary); box-shadow: 0 0 0 3px var(--color-accent-glow); } .input::placeholder { color: var(--text-muted); } .input-error { border-color: var(--color-error); } /* Select dropdown */ .select { appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right var(--space-sm) center; background-size: 16px; padding-right: var(--space-xl); } /* Slider */ .slider { width: 100%; height: 6px; background: var(--glass-bg); border-radius: var(--radius-full); appearance: none; cursor: pointer; } .slider::-webkit-slider-thumb { appearance: none; width: 18px; height: 18px; background: var(--gradient-primary); border-radius: 50%; cursor: pointer; box-shadow: var(--shadow-md); transition: transform var(--transition-fast); } .slider::-webkit-slider-thumb:hover { transform: scale(1.2); } /* ============================================ Status Badges ============================================ */ .badge { display: inline-flex; align-items: center; gap: var(--space-xs); padding: var(--space-xs) var(--space-sm); border-radius: var(--radius-full); font-size: var(--text-xs); font-weight: 500; } .badge-success { background: var(--color-success-bg); color: var(--color-success); } .badge-warning { background: var(--color-warning-bg); color: var(--color-warning); } .badge-error { background: var(--color-error-bg); color: var(--color-error); } .badge-info { background: var(--color-info-bg); color: var(--color-info); } /* ============================================ Layout Components ============================================ */ .app-layout { display: flex; min-height: 100vh; } .sidebar { width: var(--sidebar-width); background: var(--color-bg-secondary); border-right: 1px solid var(--glass-border); padding: var(--space-lg); display: flex; flex-direction: column; position: fixed; top: 0; left: 0; bottom: 0; z-index: 100; } .main-content { flex: 1; margin-left: var(--sidebar-width); padding: var(--space-xl); max-width: calc(100vw - var(--sidebar-width)); } .page-header { margin-bottom: var(--space-xl); } .page-title { font-size: var(--text-3xl); font-weight: 700; margin-bottom: var(--space-xs); } .page-subtitle { color: var(--text-secondary); font-size: var(--text-base); } /* Grid layout */ .grid { display: grid; gap: var(--space-lg); } .grid-2 { grid-template-columns: repeat(2, 1fr); } .grid-3 { grid-template-columns: repeat(3, 1fr); } .grid-4 { grid-template-columns: repeat(4, 1fr); } @media (max-width: 1024px) { .grid-3, .grid-4 { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 768px) { .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; } .sidebar { transform: translateX(-100%); transition: transform var(--transition-base); } .sidebar.open { transform: translateX(0); } .main-content { margin-left: 0; max-width: 100vw; } } /* ============================================ Stats Card ============================================ */ .stat-card { display: flex; flex-direction: column; gap: var(--space-sm); } .stat-value { font-size: var(--text-3xl); font-weight: 700; background: var(--gradient-primary); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .stat-label { font-size: var(--text-sm); color: var(--text-secondary); } .stat-change { font-size: var(--text-xs); display: flex; align-items: center; gap: var(--space-xs); } .stat-change.positive { color: var(--color-success); } .stat-change.negative { color: var(--color-error); } /* ============================================ Progress Bar ============================================ */ .progress-bar { width: 100%; height: 8px; background: var(--glass-bg); border-radius: var(--radius-full); overflow: hidden; } .progress-fill { height: 100%; background: var(--gradient-primary); border-radius: var(--radius-full); transition: width var(--transition-slow); } /* ============================================ Tabs ============================================ */ .tabs { display: flex; gap: var(--space-xs); padding: var(--space-xs); background: var(--glass-bg); border-radius: var(--radius-lg); margin-bottom: var(--space-lg); } .tab { flex: 1; padding: var(--space-sm) var(--space-md); background: transparent; border: none; border-radius: var(--radius-md); color: var(--text-secondary); font-size: var(--text-sm); font-weight: 500; cursor: pointer; transition: all var(--transition-fast); } .tab:hover { color: var(--text-primary); background: var(--glass-bg-hover); } .tab.active { background: var(--gradient-primary); color: white; } /* ============================================ Chart Container ============================================ */ .chart-container { background: var(--glass-bg); border: 1px solid var(--glass-border); border-radius: var(--radius-xl); padding: var(--space-md); min-height: 300px; } .chart-title { font-size: var(--text-sm); font-weight: 600; color: var(--text-primary); margin-bottom: var(--space-md); } /* ============================================ Loading States ============================================ */ .skeleton { background: linear-gradient(90deg, var(--glass-bg) 25%, var(--glass-bg-hover) 50%, var(--glass-bg) 75%); background-size: 200% 100%; animation: shimmer 1.5s infinite; border-radius: var(--radius-md); } @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } .spinner { width: 24px; height: 24px; border: 2px solid var(--glass-border); border-top-color: var(--color-accent-primary); border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* ============================================ Tooltips ============================================ */ .tooltip { position: relative; } .tooltip::after { content: attr(data-tooltip); position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); padding: var(--space-xs) var(--space-sm); background: var(--color-bg-elevated); border: 1px solid var(--glass-border); border-radius: var(--radius-md); font-size: var(--text-xs); white-space: nowrap; opacity: 0; visibility: hidden; transition: all var(--transition-fast); } .tooltip:hover::after { opacity: 1; visibility: visible; } /* ============================================ Animations ============================================ */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } @keyframes scaleIn { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } .animate-fade-in { animation: fadeIn var(--transition-slow) ease-out; } .animate-slide-up { animation: slideUp var(--transition-slow) ease-out; } .animate-scale-in { animation: scaleIn var(--transition-spring) ease-out; } /* Staggered animations */ .stagger>* { animation: slideUp var(--transition-slow) ease-out forwards; opacity: 0; } .stagger>*:nth-child(1) { animation-delay: 0ms; } .stagger>*:nth-child(2) { animation-delay: 50ms; } .stagger>*:nth-child(3) { animation-delay: 100ms; } .stagger>*:nth-child(4) { animation-delay: 150ms; } .stagger>*:nth-child(5) { animation-delay: 200ms; } .stagger>*:nth-child(6) { animation-delay: 250ms; } /* ============================================ Scrollbar Styles ============================================ */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: var(--color-bg-secondary); } ::-webkit-scrollbar-thumb { background: var(--glass-border); border-radius: var(--radius-full); } ::-webkit-scrollbar-thumb:hover { background: var(--glass-border-hover); } /* ============================================ Utility Classes ============================================ */ .text-center { text-align: center; } .text-right { text-align: right; } .text-sm { font-size: var(--text-sm); } .text-xs { font-size: var(--text-xs); } .text-muted { color: var(--text-secondary); } .text-accent { color: var(--color-accent-primary); } .flex { display: flex; } .flex-col { flex-direction: column; } .items-center { align-items: center; } .justify-between { justify-content: space-between; } .justify-center { justify-content: center; } .gap-sm { gap: var(--space-sm); } .gap-md { gap: var(--space-md); } .gap-lg { gap: var(--space-lg); } .mt-sm { margin-top: var(--space-sm); } .mt-md { margin-top: var(--space-md); } .mt-lg { margin-top: var(--space-lg); } .mb-sm { margin-bottom: var(--space-sm); } .mb-md { margin-bottom: var(--space-md); } .mb-lg { margin-bottom: var(--space-lg); } .w-full { width: 100%; } .h-full { height: 100%; } .overflow-hidden { overflow: hidden; } .overflow-auto { overflow: auto; } .relative { position: relative; } .absolute { position: absolute; } .rounded { border-radius: var(--radius-md); } .rounded-lg { border-radius: var(--radius-lg); } .rounded-xl { border-radius: var(--radius-xl); } .shadow { box-shadow: var(--shadow-md); } .shadow-lg { box-shadow: var(--shadow-lg); } .shadow-glow { box-shadow: var(--shadow-glow); }