@import "tailwindcss"; /* ============================================ LIQUID GLASS DESIGN SYSTEM Inspired by Apple's WWDC 2025 Liquid Glass ============================================ */ :root { /* ---- Base Colors ---- */ --background: #f5f5f7; --foreground: #1d1d1f; /* ---- Glass Material Properties ---- */ --glass-blur: 24px; --glass-saturation: 180%; --glass-brightness: 105%; /* Glass Backgrounds */ --glass-bg: rgba(255, 255, 255, 0.72); --glass-bg-elevated: rgba(255, 255, 255, 0.85); --glass-bg-muted: rgba(255, 255, 255, 0.45); --glass-bg-strong: rgba(255, 255, 255, 0.92); /* Glass Borders */ --glass-border: rgba(255, 255, 255, 0.5); --glass-border-subtle: rgba(255, 255, 255, 0.3); --glass-border-strong: rgba(255, 255, 255, 0.7); /* Specular Highlights */ --specular-light: rgba(255, 255, 255, 0.8); --specular-medium: rgba(255, 255, 255, 0.5); --specular-subtle: rgba(255, 255, 255, 0.25); /* Inner Shadows for Depth */ --inner-shadow-light: inset 0 1px 1px rgba(255, 255, 255, 0.6); --inner-shadow-dark: inset 0 -1px 1px rgba(0, 0, 0, 0.05); /* ---- Severity Colors ---- */ /* Critical (Red) */ --critical-bg: rgba(255, 59, 48, 0.12); --critical-bg-glass: rgba(255, 59, 48, 0.08); --critical-border: rgba(255, 59, 48, 0.3); --critical-text: #c41e3a; --critical-accent: #ff3b30; --critical-glow: rgba(255, 59, 48, 0.4); /* Warning (Amber) */ --warning-bg: rgba(255, 159, 10, 0.12); --warning-bg-glass: rgba(255, 159, 10, 0.08); --warning-border: rgba(255, 159, 10, 0.3); --warning-text: #996300; --warning-accent: #ff9f0a; --warning-glow: rgba(255, 159, 10, 0.4); /* Suggestion (Blue) */ --suggestion-bg: rgba(0, 122, 255, 0.12); --suggestion-bg-glass: rgba(0, 122, 255, 0.08); --suggestion-border: rgba(0, 122, 255, 0.3); --suggestion-text: #0066cc; --suggestion-accent: #007aff; --suggestion-glow: rgba(0, 122, 255, 0.4); /* Success (Green) */ --success-bg: rgba(52, 199, 89, 0.12); --success-bg-glass: rgba(52, 199, 89, 0.08); --success-border: rgba(52, 199, 89, 0.3); --success-text: #248a3d; --success-accent: #34c759; --success-glow: rgba(52, 199, 89, 0.4); /* ---- Surface Colors ---- */ --surface-base: linear-gradient(135deg, #f5f5f7 0%, #e8e8ed 50%, #f0f0f5 100%); --surface-elevated: rgba(255, 255, 255, 0.9); --surface-canvas: rgba(255, 255, 255, 0.6); /* Ambient Orbs for Background */ --ambient-blue: rgba(59, 130, 246, 0.15); --ambient-purple: rgba(139, 92, 246, 0.12); --ambient-pink: rgba(236, 72, 153, 0.1); --ambient-cyan: rgba(34, 211, 238, 0.1); /* ---- Typography ---- */ --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Display", "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --font-mono: "SF Mono", ui-monospace, Menlo, Monaco, "Cascadia Mono", "Consolas", monospace; /* ---- Shadows ---- */ --shadow-glass-sm: 0 2px 8px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.06); --shadow-glass-md: 0 4px 16px rgba(0, 0, 0, 0.06), 0 2px 4px rgba(0, 0, 0, 0.04); --shadow-glass-lg: 0 8px 32px rgba(0, 0, 0, 0.08), 0 4px 8px rgba(0, 0, 0, 0.04); --shadow-glass-xl: 0 16px 48px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.06); /* ---- Motion ---- */ --duration-fast: 150ms; --duration-normal: 250ms; --duration-slow: 400ms; --duration-slower: 600ms; --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1); --ease-bounce: cubic-bezier(0.34, 1.56, 0.64, 1); --ease-out: cubic-bezier(0, 0, 0.2, 1); /* Spring Presets */ --spring-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55); --spring-smooth: cubic-bezier(0.25, 0.46, 0.45, 0.94); /* ---- Radius ---- */ --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-xl: 20px; --radius-2xl: 24px; --radius-3xl: 32px; --radius-full: 9999px; /* ---- Spacing ---- */ --spacing-xs: 4px; --spacing-sm: 8px; --spacing-md: 12px; --spacing-lg: 16px; --spacing-xl: 24px; --spacing-2xl: 32px; --spacing-3xl: 48px; } /* ---- Dark Mode ---- */ /* Manual dark mode override */ .dark { --background: #0a0a0c; --foreground: #f5f5f7; /* Glass Backgrounds - Dark */ --glass-bg: rgba(30, 30, 35, 0.75); --glass-bg-elevated: rgba(45, 45, 50, 0.85); --glass-bg-muted: rgba(25, 25, 30, 0.6); --glass-bg-strong: rgba(40, 40, 45, 0.92); /* Glass Borders - Dark */ --glass-border: rgba(255, 255, 255, 0.12); --glass-border-subtle: rgba(255, 255, 255, 0.08); --glass-border-strong: rgba(255, 255, 255, 0.18); /* Specular Highlights - Dark (subtle luminosity) */ --specular-light: rgba(255, 255, 255, 0.15); --specular-medium: rgba(255, 255, 255, 0.1); --specular-subtle: rgba(255, 255, 255, 0.05); /* Inner Shadows - Dark */ --inner-shadow-light: inset 0 1px 1px rgba(255, 255, 255, 0.08); --inner-shadow-dark: inset 0 -1px 1px rgba(0, 0, 0, 0.2); /* Severity Colors - Dark Mode */ --critical-bg: rgba(255, 69, 58, 0.15); --critical-bg-glass: rgba(255, 69, 58, 0.1); --critical-border: rgba(255, 69, 58, 0.35); --critical-text: #ff6961; --critical-accent: #ff453a; --warning-bg: rgba(255, 159, 10, 0.15); --warning-bg-glass: rgba(255, 159, 10, 0.1); --warning-border: rgba(255, 159, 10, 0.35); --warning-text: #ffc04d; --warning-accent: #ff9f0a; --suggestion-bg: rgba(10, 132, 255, 0.15); --suggestion-bg-glass: rgba(10, 132, 255, 0.1); --suggestion-border: rgba(10, 132, 255, 0.35); --suggestion-text: #64b5f6; --suggestion-accent: #0a84ff; --success-bg: rgba(48, 209, 88, 0.15); --success-bg-glass: rgba(48, 209, 88, 0.1); --success-border: rgba(48, 209, 88, 0.35); --success-text: #6ee7a0; --success-accent: #30d158; /* Surface Colors - Dark */ --surface-base: linear-gradient(135deg, #0a0a0c 0%, #121216 50%, #0e0e12 100%); --surface-elevated: rgba(35, 35, 40, 0.9); --surface-canvas: rgba(20, 20, 25, 0.6); /* Ambient Orbs - Dark */ --ambient-blue: rgba(59, 130, 246, 0.1); --ambient-purple: rgba(139, 92, 246, 0.08); --ambient-pink: rgba(236, 72, 153, 0.06); --ambient-cyan: rgba(34, 211, 238, 0.06); /* Shadows - Dark */ --shadow-glass-sm: 0 2px 8px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.3); --shadow-glass-md: 0 4px 16px rgba(0, 0, 0, 0.25), 0 2px 4px rgba(0, 0, 0, 0.2); --shadow-glass-lg: 0 8px 32px rgba(0, 0, 0, 0.3), 0 4px 8px rgba(0, 0, 0, 0.2); --shadow-glass-xl: 0 16px 48px rgba(0, 0, 0, 0.4), 0 8px 16px rgba(0, 0, 0, 0.25); } /* Manual light mode override */ .light { --background: #f5f5f7; --foreground: #1d1d1f; /* Glass Backgrounds */ --glass-bg: rgba(255, 255, 255, 0.72); --glass-bg-elevated: rgba(255, 255, 255, 0.85); --glass-bg-muted: rgba(255, 255, 255, 0.45); --glass-bg-strong: rgba(255, 255, 255, 0.92); /* Glass Borders */ --glass-border: rgba(255, 255, 255, 0.5); --glass-border-subtle: rgba(255, 255, 255, 0.3); --glass-border-strong: rgba(255, 255, 255, 0.7); /* Specular Highlights */ --specular-light: rgba(255, 255, 255, 0.8); --specular-medium: rgba(255, 255, 255, 0.5); --specular-subtle: rgba(255, 255, 255, 0.25); /* Inner Shadows for Depth */ --inner-shadow-light: inset 0 1px 1px rgba(255, 255, 255, 0.6); --inner-shadow-dark: inset 0 -1px 1px rgba(0, 0, 0, 0.05); /* Severity Colors */ --critical-bg: rgba(255, 59, 48, 0.12); --critical-bg-glass: rgba(255, 59, 48, 0.08); --critical-border: rgba(255, 59, 48, 0.3); --critical-text: #c41e3a; --critical-accent: #ff3b30; --critical-glow: rgba(255, 59, 48, 0.4); --warning-bg: rgba(255, 159, 10, 0.12); --warning-bg-glass: rgba(255, 159, 10, 0.08); --warning-border: rgba(255, 159, 10, 0.3); --warning-text: #996300; --warning-accent: #ff9f0a; --warning-glow: rgba(255, 159, 10, 0.4); --suggestion-bg: rgba(0, 122, 255, 0.12); --suggestion-bg-glass: rgba(0, 122, 255, 0.08); --suggestion-border: rgba(0, 122, 255, 0.3); --suggestion-text: #0066cc; --suggestion-accent: #007aff; --suggestion-glow: rgba(0, 122, 255, 0.4); --success-bg: rgba(52, 199, 89, 0.12); --success-bg-glass: rgba(52, 199, 89, 0.08); --success-border: rgba(52, 199, 89, 0.3); --success-text: #248a3d; --success-accent: #34c759; --success-glow: rgba(52, 199, 89, 0.4); /* Surface Colors */ --surface-base: linear-gradient(135deg, #f5f5f7 0%, #e8e8ed 50%, #f0f0f5 100%); --surface-elevated: rgba(255, 255, 255, 0.9); --surface-canvas: rgba(255, 255, 255, 0.6); /* Ambient Orbs for Background */ --ambient-blue: rgba(59, 130, 246, 0.15); --ambient-purple: rgba(139, 92, 246, 0.12); --ambient-pink: rgba(236, 72, 153, 0.1); --ambient-cyan: rgba(34, 211, 238, 0.1); /* Shadows */ --shadow-glass-sm: 0 2px 8px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.06); --shadow-glass-md: 0 4px 16px rgba(0, 0, 0, 0.06), 0 2px 4px rgba(0, 0, 0, 0.04); --shadow-glass-lg: 0 8px 32px rgba(0, 0, 0, 0.08), 0 4px 8px rgba(0, 0, 0, 0.04); --shadow-glass-xl: 0 16px 48px rgba(0, 0, 0, 0.1), 0 8px 16px rgba(0, 0, 0, 0.06); } /* System preference (when no manual override) */ @media (prefers-color-scheme: dark) { :root:not(.light):not(.dark) { --background: #0a0a0c; --foreground: #f5f5f7; /* Glass Backgrounds - Dark */ --glass-bg: rgba(30, 30, 35, 0.75); --glass-bg-elevated: rgba(45, 45, 50, 0.85); --glass-bg-muted: rgba(25, 25, 30, 0.6); --glass-bg-strong: rgba(40, 40, 45, 0.92); /* Glass Borders - Dark */ --glass-border: rgba(255, 255, 255, 0.12); --glass-border-subtle: rgba(255, 255, 255, 0.08); --glass-border-strong: rgba(255, 255, 255, 0.18); /* Specular Highlights - Dark (subtle luminosity) */ --specular-light: rgba(255, 255, 255, 0.15); --specular-medium: rgba(255, 255, 255, 0.1); --specular-subtle: rgba(255, 255, 255, 0.05); /* Inner Shadows - Dark */ --inner-shadow-light: inset 0 1px 1px rgba(255, 255, 255, 0.08); --inner-shadow-dark: inset 0 -1px 1px rgba(0, 0, 0, 0.2); /* Severity Colors - Dark Mode */ --critical-bg: rgba(255, 69, 58, 0.15); --critical-bg-glass: rgba(255, 69, 58, 0.1); --critical-border: rgba(255, 69, 58, 0.35); --critical-text: #ff6961; --critical-accent: #ff453a; --warning-bg: rgba(255, 159, 10, 0.15); --warning-bg-glass: rgba(255, 159, 10, 0.1); --warning-border: rgba(255, 159, 10, 0.35); --warning-text: #ffc04d; --warning-accent: #ff9f0a; --suggestion-bg: rgba(10, 132, 255, 0.15); --suggestion-bg-glass: rgba(10, 132, 255, 0.1); --suggestion-border: rgba(10, 132, 255, 0.35); --suggestion-text: #64b5f6; --suggestion-accent: #0a84ff; --success-bg: rgba(48, 209, 88, 0.15); --success-bg-glass: rgba(48, 209, 88, 0.1); --success-border: rgba(48, 209, 88, 0.35); --success-text: #6ee7a0; --success-accent: #30d158; /* Surface Colors - Dark */ --surface-base: linear-gradient(135deg, #0a0a0c 0%, #121216 50%, #0e0e12 100%); --surface-elevated: rgba(35, 35, 40, 0.9); --surface-canvas: rgba(20, 20, 25, 0.6); /* Ambient Orbs - Dark */ --ambient-blue: rgba(59, 130, 246, 0.1); --ambient-purple: rgba(139, 92, 246, 0.08); --ambient-pink: rgba(236, 72, 153, 0.06); --ambient-cyan: rgba(34, 211, 238, 0.06); /* Shadows - Dark */ --shadow-glass-sm: 0 2px 8px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.3); --shadow-glass-md: 0 4px 16px rgba(0, 0, 0, 0.25), 0 2px 4px rgba(0, 0, 0, 0.2); --shadow-glass-lg: 0 8px 32px rgba(0, 0, 0, 0.3), 0 4px 8px rgba(0, 0, 0, 0.2); --shadow-glass-xl: 0 16px 48px rgba(0, 0, 0, 0.4), 0 8px 16px rgba(0, 0, 0, 0.25); } } /* Smooth transitions */ * { transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease; } /* ---- Tailwind Theme Extension ---- */ @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); --font-sans: var(--font-sans); --font-mono: var(--font-mono); /* Glass Colors */ --color-glass-bg: var(--glass-bg); --color-glass-border: var(--glass-border); /* Severity Colors */ --color-critical: var(--critical-accent); --color-warning: var(--warning-accent); --color-suggestion: var(--suggestion-accent); --color-success: var(--success-accent); } /* ============================================ BASE STYLES ============================================ */ html { scroll-behavior: smooth; } body { background: var(--background); color: var(--foreground); font-family: var(--font-sans); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; overflow-x: hidden; } /* ============================================ GLASS UTILITY CLASSES ============================================ */ /* Base Glass Effect */ .glass { background: var(--glass-bg); backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturation)) brightness(var(--glass-brightness)); -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(var(--glass-saturation)) brightness(var(--glass-brightness)); border: 1px solid var(--glass-border); box-shadow: var(--shadow-glass-md), var(--inner-shadow-light), var(--inner-shadow-dark); } /* Elevated Glass (stronger effect) */ .glass-elevated { background: var(--glass-bg-elevated); backdrop-filter: blur(32px) saturate(200%) brightness(108%); -webkit-backdrop-filter: blur(32px) saturate(200%) brightness(108%); border: 1px solid var(--glass-border-strong); box-shadow: var(--shadow-glass-lg), var(--inner-shadow-light), var(--inner-shadow-dark); } /* Muted Glass (subtle effect) */ .glass-muted { background: var(--glass-bg-muted); backdrop-filter: blur(16px) saturate(150%); -webkit-backdrop-filter: blur(16px) saturate(150%); border: 1px solid var(--glass-border-subtle); box-shadow: var(--shadow-glass-sm); } /* Specular Highlight Overlay */ .glass-specular { position: relative; } .glass-specular::before { content: ''; position: absolute; inset: 0; background: linear-gradient( 135deg, var(--specular-light) 0%, var(--specular-medium) 10%, transparent 40% ); border-radius: inherit; pointer-events: none; } /* Severity-Tinted Glass */ .glass-critical { background: var(--critical-bg-glass); border-color: var(--critical-border); } .glass-warning { background: var(--warning-bg-glass); border-color: var(--warning-border); } .glass-suggestion { background: var(--suggestion-bg-glass); border-color: var(--suggestion-border); } .glass-success { background: var(--success-bg-glass); border-color: var(--success-border); } /* ============================================ ANIMATION UTILITIES ============================================ */ /* Shimmer Loading Effect */ @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } .shimmer { background: linear-gradient( 90deg, transparent 0%, var(--specular-subtle) 50%, transparent 100% ); background-size: 200% 100%; animation: shimmer 2s ease-in-out infinite; } /* Pulse Glow Effect */ @keyframes pulse-glow { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 var(--success-glow); } 50% { opacity: 0.8; box-shadow: 0 0 16px 4px var(--success-glow); } } .pulse-glow-success { animation: pulse-glow 2s ease-in-out infinite; } @keyframes pulse-glow-critical { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 var(--critical-glow); } 50% { opacity: 0.9; box-shadow: 0 0 12px 3px var(--critical-glow); } } .pulse-glow-critical { animation: pulse-glow-critical 2s ease-in-out infinite; } @keyframes pulse-glow-warning { 0%, 100% { box-shadow: 0 0 0 0 var(--warning-glow); } 50% { box-shadow: 0 0 10px 2px var(--warning-glow); } } .pulse-glow-warning { animation: pulse-glow-warning 2.5s ease-in-out infinite; } /* Gradient Flow Animation */ @keyframes gradient-flow { 0% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } 100% { background-position: 0% 50%; } } .gradient-animate { background-size: 200% 200%; animation: gradient-flow 8s ease infinite; } /* Float Animation for Ambient Orbs */ @keyframes float { 0%, 100% { transform: translateY(0) rotate(0deg); } 33% { transform: translateY(-15px) rotate(1deg); } 66% { transform: translateY(10px) rotate(-1deg); } } .float-slow { animation: float 20s ease-in-out infinite; } .float-medium { animation: float 15s ease-in-out infinite; } /* ============================================ REDUCED MOTION ============================================ */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } .shimmer, .pulse-glow-success, .pulse-glow-critical, .pulse-glow-warning, .gradient-animate, .float-slow, .float-medium { animation: none !important; } } /* ============================================ SCROLLBAR STYLING ============================================ */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--glass-border); border-radius: var(--radius-full); } ::-webkit-scrollbar-thumb:hover { background: var(--glass-border-strong); } /* Firefox */ * { scrollbar-width: thin; scrollbar-color: var(--glass-border) transparent; } /* ============================================ FOCUS STYLES ============================================ */ .focus-ring { outline: none; } .focus-ring:focus-visible { outline: none; box-shadow: 0 0 0 2px var(--background), 0 0 0 4px var(--suggestion-accent), var(--shadow-glass-md); } /* ============================================ SELECTION STYLES ============================================ */ ::selection { background: var(--suggestion-bg); color: var(--suggestion-text); }