@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700;800&display=swap'); @tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { --safe-area-inset-bottom: env(safe-area-inset-bottom, 0px); /* Unified Card System */ --bento-radius: 16px; --bento-radius-lg: 20px; --bento-gap: 16px; --bento-gap-lg: 24px; --bento-padding: 20px; --bento-padding-lg: 24px; /* Linear Design Tokens */ --linear-radius: 8px; --linear-radius-lg: 12px; --linear-blur: 12px; --linear-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05); --linear-shadow: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06); --linear-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); /* Border radius scale (used by user preferences) */ --radius-none: 0px; --radius-small: 8px; --radius-medium: 16px; --radius-large: 24px; --radius-pill: 9999px; /* Spacing scale */ --spacing-compact: 12px; --spacing-comfortable: 16px; --spacing-spacious: 24px; /* Theme colors - RGB format for opacity support */ /* Dark palette (RGB values) */ --color-dark-50: 248, 250, 252; --color-dark-100: 241, 245, 249; --color-dark-200: 226, 232, 240; --color-dark-300: 203, 213, 225; --color-dark-400: 148, 163, 184; --color-dark-500: 100, 116, 139; --color-dark-600: 71, 85, 105; --color-dark-700: 51, 65, 85; --color-dark-800: 30, 41, 59; --color-dark-850: 23, 32, 51; --color-dark-900: 15, 23, 42; --color-dark-950: 10, 15, 26; /* Champagne palette (RGB values) */ --color-champagne-50: 255, 253, 249; --color-champagne-100: 254, 249, 240; --color-champagne-200: 247, 231, 206; --color-champagne-300: 232, 212, 181; --color-champagne-400: 212, 188, 150; --color-champagne-500: 191, 164, 119; --color-champagne-600: 160, 139, 94; --color-champagne-700: 125, 107, 72; --color-champagne-800: 92, 79, 53; --color-champagne-900: 61, 52, 36; --color-champagne-950: 31, 26, 18; /* Accent palette (RGB values) - dynamically set by ThemeColorsProvider */ --color-accent-50: 239, 246, 255; --color-accent-100: 219, 234, 254; --color-accent-200: 191, 219, 254; --color-accent-300: 147, 197, 253; --color-accent-400: 96, 165, 250; --color-accent-500: 59, 130, 246; --color-accent-600: 37, 99, 235; --color-accent-700: 29, 78, 216; --color-accent-800: 30, 64, 175; --color-accent-900: 30, 58, 138; --color-accent-950: 23, 37, 84; /* Success palette (RGB values) */ --color-success-50: 240, 253, 244; --color-success-100: 220, 252, 231; --color-success-200: 187, 247, 208; --color-success-300: 134, 239, 172; --color-success-400: 74, 222, 128; --color-success-500: 34, 197, 94; --color-success-600: 22, 163, 74; --color-success-700: 21, 128, 61; --color-success-800: 22, 101, 52; --color-success-900: 20, 83, 45; --color-success-950: 5, 46, 22; /* Warning palette (RGB values) */ --color-warning-50: 255, 251, 235; --color-warning-100: 254, 243, 199; --color-warning-200: 253, 230, 138; --color-warning-300: 252, 211, 77; --color-warning-400: 251, 191, 36; --color-warning-500: 245, 158, 11; --color-warning-600: 217, 119, 6; --color-warning-700: 180, 83, 9; --color-warning-800: 146, 64, 14; --color-warning-900: 120, 53, 15; --color-warning-950: 69, 26, 3; /* Error palette (RGB values) */ --color-error-50: 254, 242, 242; --color-error-100: 254, 226, 226; --color-error-200: 254, 202, 202; --color-error-300: 252, 165, 165; --color-error-400: 248, 113, 113; --color-error-500: 239, 68, 68; --color-error-600: 220, 38, 38; --color-error-700: 185, 28, 28; --color-error-800: 153, 27, 27; --color-error-900: 127, 29, 29; --color-error-950: 69, 10, 10; /* Theme semantic colors (hex for direct use) */ --color-dark-bg: #0a0f1a; --color-dark-surface: #0f172a; --color-dark-text: #f1f5f9; --color-dark-text-secondary: #94a3b8; --color-light-bg: #f7e7ce; --color-light-surface: #fef9f0; --color-light-text: #1f1a12; --color-light-text-secondary: #7d6b48; } html { overflow-x: hidden; scrollbar-width: thin; scrollbar-color: rgb(var(--color-dark-700)) transparent; } /* Hide scrollbar on mobile (iOS/Android) */ @media (max-width: 1023px) { html, body { scrollbar-width: none; -ms-overflow-style: none; } html::-webkit-scrollbar, body::-webkit-scrollbar { display: none; width: 0; height: 0; } } ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: rgb(var(--color-dark-700)); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: rgb(var(--color-dark-600)); } .light ::-webkit-scrollbar-thumb { background: rgb(var(--color-champagne-400)); } .light ::-webkit-scrollbar-thumb:hover { background: rgb(var(--color-champagne-500)); } /* Smooth scroll only on desktop - mobile uses native */ @media (min-width: 1024px) { html { scroll-behavior: smooth; } } /* Dark theme (default) */ body, .dark body { @apply bg-dark-950 font-sans text-dark-100 antialiased; overscroll-behavior-y: contain; /* iOS smooth scrolling */ -webkit-overflow-scrolling: touch; position: relative; } /* Global Noise Texture */ body::before { content: ''; position: fixed; inset: 0; z-index: 0; pointer-events: none; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E"); opacity: 0.03; mix-blend-mode: overlay; } /* Optimize main scrollable content */ main { /* Prevent layout shifts during scroll */ contain: layout style; } /* Light theme - Champagne */ .light body { @apply bg-champagne-200 font-sans text-champagne-900 antialiased; overscroll-behavior-y: contain; -webkit-overflow-scrolling: touch; } /* Light theme: swap dark palette → dynamic champagne palette from API. Uses var() to reference values set by applyThemeColors(). !important overrides inline styles from applyThemeColors on :root. */ .light { --color-dark-50: var(--color-champagne-950) !important; --color-dark-100: var(--color-champagne-900) !important; --color-dark-200: var(--color-champagne-800) !important; --color-dark-300: var(--color-champagne-700) !important; --color-dark-400: var(--color-champagne-600) !important; --color-dark-500: var(--color-champagne-500) !important; --color-dark-600: var(--color-champagne-400) !important; --color-dark-700: var(--color-champagne-300) !important; --color-dark-800: var(--color-champagne-50) !important; --color-dark-850: var(--color-champagne-100) !important; --color-dark-900: var(--color-champagne-100) !important; --color-dark-950: var(--color-champagne-200) !important; } /* Custom scrollbar - Dark */ .dark ::-webkit-scrollbar { @apply w-2; } .dark ::-webkit-scrollbar-track { @apply bg-dark-900; } .dark ::-webkit-scrollbar-thumb { @apply rounded-full bg-dark-700; } .dark ::-webkit-scrollbar-thumb:hover { @apply bg-dark-600; } /* Custom scrollbar - Light */ .light ::-webkit-scrollbar { @apply w-2; } .light ::-webkit-scrollbar-track { @apply bg-champagne-200; } .light ::-webkit-scrollbar-thumb { @apply rounded-full bg-champagne-400; } .light ::-webkit-scrollbar-thumb:hover { @apply bg-champagne-500; } } @layer components { /* ========== BENTO DESIGN SYSTEM ========== */ .bento-card { @apply border border-dark-700/40 bg-dark-900/70; border-radius: var(--bento-radius); padding: var(--bento-padding); transform: translateZ(0); /* Glass Border - Inset Highlight */ box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.05); /* Stagger animation support */ animation: bentoFadeIn 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; animation-delay: calc(var(--stagger, 0) * 50ms); position: relative; overflow: hidden; } @media (min-width: 1024px) { .bento-card { @apply bg-dark-900/50 backdrop-blur-sm; } } /* Disable animation if user prefers reduced motion */ @media (prefers-reduced-motion: reduce) { .bento-card { animation: none; } } .bento-card-hover { @apply bento-card cursor-pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .bento-card-hover:hover { @apply border-dark-600/50 bg-dark-800/60 shadow-lg; transform: translateY(-4px); /* Intensify Glass Border & Add Top Spotlight */ box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.1), 0 10px 40px -10px rgba(0, 0, 0, 0.5); } /* CSS Spotlight Effect via pseudo-element */ .bento-card-hover::after { content: ''; position: absolute; inset: 0; background: radial-gradient(circle at top, rgba(255, 255, 255, 0.06), transparent 60%); opacity: 0; transition: opacity 0.3s ease; pointer-events: none; z-index: 10; } .bento-card-hover:hover::after { opacity: 1; } .bento-card-hover:active { transform: scale(0.98); transition-duration: 0.15s; } .bento-card-glow { @apply bento-card cursor-pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .bento-card-glow:hover { @apply border-accent-500/30 shadow-glow; transform: translateY(-4px); } .bento-card-glow:active { transform: scale(0.98); transition-duration: 0.15s; } .bento-grid { display: grid; grid-template-columns: 1fr; gap: var(--bento-gap); } @media (min-width: 375px) { .bento-grid { grid-template-columns: repeat(2, 1fr); } } @media (min-width: 768px) { .bento-grid { grid-template-columns: repeat(4, 1fr); gap: var(--bento-gap-lg); } } .light .bento-card { @apply border-champagne-300/50 bg-champagne-50/90 shadow-sm; /* Light Theme Glass Border */ box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.03); } @media (min-width: 1024px) { .light .bento-card { @apply bg-champagne-50/80 backdrop-blur-sm; } } .light .bento-card-hover:hover { @apply border-champagne-400/50 bg-champagne-50 shadow-md; transform: translateY(-4px); /* Intensify Light Theme Glass Border */ box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.06), 0 10px 40px -10px rgba(160, 139, 94, 0.15); } /* Adjust spotlight for light theme to be a warm glow */ .light .bento-card-hover::after { background: radial-gradient(circle at top, rgba(255, 253, 249, 0.8), transparent 70%); } .light .bento-card-glow:hover { @apply border-accent-400/40 shadow-lg; transform: translateY(-4px); } /* ========== DARK THEME COMPONENTS (default) ========== */ /* Cards - Dark (unified style) */ .card { @apply border border-dark-700/40 bg-dark-900/70 p-5 transition-all duration-200 sm:p-6; border-radius: var(--bento-radius); transform: translateZ(0); box-shadow: inset 0 1px 0 0 rgba(255, 255, 255, 0.05); } /* Enable backdrop-blur only on desktop */ @media (min-width: 1024px) { .card { @apply bg-dark-900/50 backdrop-blur-sm; } } .card-hover { @apply card cursor-pointer hover:border-dark-600/50 hover:bg-dark-800/60 active:scale-[0.98]; } .card-glow { @apply card cursor-pointer hover:border-accent-500/30 hover:shadow-glow; } .card-animated { @apply card animate-slide-up; } /* Glass effect - Dark (optimized for mobile) */ .glass { @apply border border-dark-700/30 bg-dark-900/80; /* GPU acceleration */ transform: translateZ(0); will-change: transform; } /* Enable backdrop-blur only on desktop where it's performant */ @media (min-width: 1024px) { .glass { @apply bg-dark-900/30 backdrop-blur-xl; } } /* Buttons - Dark */ .btn { @apply inline-flex items-center justify-center gap-2 rounded-lg px-4 py-2 text-sm font-medium transition-all duration-200 ease-smooth focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 focus-visible:ring-offset-dark-900 active:scale-[0.98] disabled:cursor-not-allowed disabled:opacity-50; } .btn-primary { @apply btn bg-accent-500 text-white shadow-lg shadow-accent-500/25 hover:bg-accent-400 hover:shadow-xl hover:shadow-accent-500/30 focus-visible:ring-accent-500 active:bg-accent-600; } .btn-secondary { @apply btn border border-dark-700 bg-dark-800 text-dark-200 hover:border-dark-600 hover:bg-dark-700 hover:text-dark-100 focus-visible:ring-dark-500 active:bg-dark-600; } .btn-ghost { @apply btn text-dark-400 hover:bg-dark-800 hover:text-dark-100 focus-visible:ring-dark-500; } .btn-danger { @apply btn border border-error-500/30 bg-error-500/10 text-error-400 hover:border-error-500/50 hover:bg-error-500/20 focus-visible:ring-error-500 active:bg-error-500/30; } .btn-icon { @apply rounded-lg p-2 text-dark-400 transition-all duration-200 hover:bg-dark-800 hover:text-dark-100 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-500/50 active:scale-95; } /* Highlighted button for onboarding */ .btn-highlight { @apply relative z-10 animate-spotlight; } /* Inputs - Dark */ .input { @apply w-full rounded-xl border border-dark-700/50 bg-dark-800/50 px-4 py-3 text-sm text-dark-100 placeholder-dark-500 transition-all duration-200 focus:border-accent-500/50 focus:outline-none focus:ring-2 focus:ring-accent-500/20; } .input-error { @apply input border-error-500/50 focus:border-error-500 focus:ring-error-500/20; } /* Remove tap highlight and focus outline on mobile */ button, a, [role='button'] { -webkit-tap-highlight-color: transparent; outline: none; } /* Only show focus ring for keyboard navigation */ button:focus-visible, a:focus-visible, [role='button']:focus-visible { @apply ring-2 ring-accent-500/50 ring-offset-2 ring-offset-dark-900; } .light button:focus-visible, .light a:focus-visible, .light [role='button']:focus-visible { @apply ring-offset-champagne-100; } .label { @apply mb-2 block text-sm font-medium text-dark-300; } /* Badge - Dark */ .badge { @apply inline-flex items-center rounded-full px-2.5 py-1 text-xs font-medium; } .badge-success { @apply badge border border-success-500/30 bg-success-500/15 text-success-400; } .badge-warning { @apply badge border border-warning-500/30 bg-warning-500/15 text-warning-400; } .badge-error { @apply badge border border-error-500/30 bg-error-500/15 text-error-400; } .badge-info { @apply badge border border-accent-500/30 bg-accent-500/15 text-accent-400; } .badge-neutral { @apply badge border border-dark-600/50 bg-dark-700/50 text-dark-300; } /* Progress bar - Dark */ .progress-bar { @apply h-2 w-full overflow-hidden rounded-full bg-dark-800; } .progress-fill { @apply h-full rounded-full transition-all duration-500 ease-smooth; } /* Stat card - Dark */ .stat-value { @apply text-2xl font-bold text-dark-50 sm:text-3xl; } .stat-label { @apply mt-1 text-sm text-dark-400; } /* Navigation - Dark */ .nav-item { @apply flex items-center gap-3 rounded-xl px-4 py-3 text-dark-400 transition-all duration-200 hover:bg-dark-800/50 hover:text-dark-100; } .nav-item-active { @apply nav-item bg-accent-500/10 text-accent-400; } .bottom-nav { @apply fixed z-50 bg-dark-900/95; bottom: calc(16px + env(safe-area-inset-bottom, 0px)); left: 16px; right: 16px; border-radius: var(--bento-radius); padding: 8px 4px; transform: translateZ(0); box-shadow: 0 4px 30px rgba(0, 0, 0, 0.4), 0 0 0 1px rgba(255, 255, 255, 0.05) inset; } @media (min-width: 1024px) { .bottom-nav { @apply bg-dark-900/80 backdrop-blur-xl; } } .bottom-nav-item { @apply flex min-w-[56px] flex-1 shrink-0 flex-col items-center justify-center rounded-2xl px-3 py-2.5 text-dark-500 transition-all duration-200; } .bottom-nav-item:hover { @apply text-dark-300; } .bottom-nav-item-active { @apply flex min-w-[56px] flex-1 shrink-0 flex-col items-center justify-center rounded-2xl bg-accent-500/15 px-3 py-2.5 text-accent-400 transition-all duration-200; } /* Divider - Dark */ .divider { @apply border-t border-dark-800/50; } /* ========== MOBILE PERFORMANCE: Disable backdrop-blur ========== */ @media (max-width: 1023px) { /* Disable all backdrop-blur on mobile for better scroll performance */ .backdrop-blur, .backdrop-blur-sm, .backdrop-blur-md, .backdrop-blur-lg, .backdrop-blur-xl, .backdrop-blur-2xl, .backdrop-blur-3xl { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; } } /* ========== LIGHT THEME COMPONENTS (Champagne) ========== */ /* Cards - Light */ .light .card { @apply border-champagne-300/50 bg-champagne-50/90 p-5 shadow-sm sm:p-6; border-radius: var(--bento-radius); transform: translateZ(0); box-shadow: inset 0 1px 0 0 rgba(0, 0, 0, 0.03); } @media (min-width: 1024px) { .light .card { @apply bg-champagne-50/80 backdrop-blur-sm; } } .light .card-hover { @apply hover:border-champagne-400/50 hover:bg-champagne-50 hover:shadow-md; } .light .card-glow { @apply hover:border-accent-400/40 hover:shadow-lg; } /* Glass effect - Light (optimized for mobile) */ .light .glass { @apply border border-champagne-300/40 bg-champagne-50/90; transform: translateZ(0); } @media (min-width: 1024px) { .light .glass { @apply bg-champagne-50/60 backdrop-blur-xl; } } /* Buttons - Light */ .light .btn { @apply focus-visible:ring-offset-champagne-100; } .light .btn-primary { @apply bg-champagne-700 text-white shadow-lg shadow-champagne-500/20 hover:bg-champagne-600 hover:shadow-xl hover:shadow-champagne-500/30 focus-visible:ring-champagne-500 active:bg-champagne-800; } .light .btn-secondary { @apply border border-champagne-300 bg-champagne-50 text-champagne-800 hover:border-champagne-400 hover:bg-champagne-100 hover:text-champagne-900 focus-visible:ring-champagne-400 active:bg-champagne-200; } .light .btn-ghost { @apply text-champagne-600 hover:bg-champagne-200/50 hover:text-champagne-900 focus-visible:ring-champagne-400; } .light .btn-danger { @apply border border-error-200 bg-error-50 text-error-600 hover:border-error-300 hover:bg-error-100 active:bg-error-200; } .light .btn-icon { @apply text-champagne-500 hover:bg-champagne-200/50 hover:text-champagne-800; } /* Inputs - Light */ .light .input { @apply rounded-xl border border-champagne-300 bg-champagne-50 text-champagne-900 placeholder-champagne-400 focus:border-accent-400 focus:ring-accent-300/30; } .light .input-error { @apply border-error-300 focus:border-error-400 focus:ring-error-300/30; } .light .label { @apply text-champagne-700; } /* Badge - Light */ .light .badge-success { @apply border border-success-200 bg-success-50 text-success-700; } .light .badge-warning { @apply border border-warning-200 bg-warning-50 text-warning-700; } .light .badge-error { @apply border border-error-200 bg-error-50 text-error-700; } .light .badge-info { @apply border border-accent-200 bg-accent-50 text-accent-700; } .light .badge-neutral { @apply border border-champagne-300 bg-champagne-200/50 text-champagne-700; } /* Progress bar - Light */ .light .progress-bar { @apply bg-champagne-200; } /* Stat card - Light */ .light .stat-value { @apply text-champagne-900; } .light .stat-label { @apply text-champagne-600; } /* Navigation - Light */ .light .nav-item { @apply text-champagne-600 hover:bg-champagne-200/50 hover:text-champagne-900; } .light .nav-item-active { @apply bg-champagne-200/70 text-champagne-800; } .light .bottom-nav { @apply bg-white/95; box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1), 0 0 0 1px rgba(0, 0, 0, 0.05); } @media (min-width: 1024px) { .light .bottom-nav { @apply bg-white/80 backdrop-blur-xl; } } .light .bottom-nav-item { @apply text-champagne-500; } .light .bottom-nav-item:hover { @apply text-champagne-700; } .light .bottom-nav-item-active { @apply bg-champagne-300/40 text-champagne-800; } /* Divider - Light */ .light .divider { @apply border-t border-champagne-200; } /* Safe area */ .safe-area-pb { padding-bottom: calc(0.5rem + var(--safe-area-inset-bottom)); } .pt-safe { padding-top: env(safe-area-inset-top, 0px); } /* Skeleton loader */ .skeleton { @apply animate-pulse rounded-lg bg-dark-800; } .light .skeleton { @apply bg-champagne-300; } /* Link */ .link { @apply text-accent-400 transition-colors duration-200 hover:text-accent-300; } .light .link { @apply text-accent-600 hover:text-accent-500; } /* Prose styles for formatted content */ .prose { @apply leading-relaxed text-dark-200; } .prose-invert { @apply text-dark-200; } .prose h1 { @apply mb-4 mt-6 text-2xl font-bold text-dark-50 first:mt-0; } .prose h2 { @apply mb-3 mt-6 text-xl font-semibold text-dark-50 first:mt-0; } .prose h3 { @apply mb-2 mt-5 text-lg font-semibold text-dark-100 first:mt-0; } .prose h4 { @apply mb-2 mt-4 text-base font-semibold text-dark-100 first:mt-0; } .prose p { @apply mb-4 last:mb-0; } .prose ul { @apply mb-4 list-inside list-disc space-y-2 pl-2; } .prose ol { @apply mb-4 list-inside list-decimal space-y-2 pl-2; } .prose li { @apply text-dark-300; } .prose li::marker { @apply text-accent-400; } .prose a { @apply text-accent-400 underline underline-offset-2 transition-colors hover:text-accent-300; } .prose strong, .prose b { @apply font-semibold text-dark-100; } .prose em, .prose i { @apply italic text-dark-300; } .prose blockquote { @apply my-4 rounded-r-lg border-l-4 border-accent-500/50 bg-dark-800/30 py-2 pl-4 italic text-dark-300; } .prose code { @apply rounded bg-dark-800 px-1.5 py-0.5 font-mono text-sm text-accent-300; } .prose pre { @apply mb-4 overflow-x-auto rounded-xl bg-dark-800 p-4; } .prose pre code { @apply bg-transparent p-0; } .prose hr { @apply my-6 border-dark-700; } .prose table { @apply mb-4 w-full border-collapse; } .prose th { @apply border border-dark-700 bg-dark-800 p-3 text-left font-semibold text-dark-100; } .prose td { @apply border border-dark-700 p-3 text-dark-300; } .prose img { @apply my-4 max-w-full rounded-xl; } /* Light theme prose styles */ .light .prose { @apply text-champagne-800; } .light .prose h1 { @apply text-champagne-950; } .light .prose h2 { @apply text-champagne-950; } .light .prose h3, .light .prose h4 { @apply text-champagne-900; } .light .prose li { @apply text-champagne-700; } .light .prose li::marker { @apply text-champagne-600; } .light .prose a { @apply text-accent-600 hover:text-accent-500; } .light .prose strong, .light .prose b { @apply text-champagne-900; } .light .prose em, .light .prose i { @apply text-champagne-700; } .light .prose blockquote { @apply border-champagne-400 bg-champagne-100/50 text-champagne-700; } .light .prose code { @apply bg-champagne-200 text-champagne-800; } .light .prose pre { @apply border border-champagne-300 bg-champagne-100; } .light .prose hr { @apply border-champagne-300; } .light .prose th { @apply border-champagne-300 bg-champagne-200 text-champagne-900; } .light .prose td { @apply border-champagne-300 text-champagne-700; } /* Support for plain text with line breaks */ .prose-plain { @apply whitespace-pre-line; } .max-w-none { max-width: none; } /* Hide scrollbar */ .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; } .scrollbar-hide::-webkit-scrollbar { display: none; } /* Touch target */ .touch-target { min-height: 44px; min-width: 44px; } } @layer utilities { /* Text gradient */ .text-gradient { @apply bg-gradient-to-r from-accent-400 to-accent-600 bg-clip-text text-transparent; } /* Glow effects */ .glow-accent { box-shadow: 0 0 20px theme('colors.accent.500 / 30%'); } .glow-success { box-shadow: 0 0 20px theme('colors.success.500 / 30%'); } /* Blur backdrop */ .blur-backdrop { backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); } /* Safe area insets for mobile bottom sheets */ .safe-area-inset-bottom { padding-bottom: max(1rem, env(safe-area-inset-bottom, 0px)); } @media (min-width: 640px) { .safe-area-inset-bottom { padding-bottom: 1.25rem; } } } /* Animations */ @keyframes bentoFadeIn { 0% { opacity: 0; transform: translateY(16px); } 100% { opacity: 1; transform: translateY(0); } } @keyframes shimmer { 0% { background-position: -200% 0; } 100% { background-position: 200% 0; } } .shimmer { background: linear-gradient( 90deg, theme('colors.dark.800') 0%, theme('colors.dark.700') 50%, theme('colors.dark.800') 100% ); background-size: 200% 100%; animation: shimmer 1.5s infinite; } .light .shimmer { background: linear-gradient( 90deg, theme('colors.champagne.200') 0%, theme('colors.champagne.300') 50%, theme('colors.champagne.200') 100% ); } /* Tap effect on mobile */ @media (hover: none) { .btn:active, .card-hover:active, .nav-item:active { transform: scale(0.98); } } /* Color picker range input styling */ input[type='range'] { -webkit-appearance: none; appearance: none; height: 12px; border-radius: 6px; outline: none; touch-action: pan-x; } /* Desktop: smaller track */ @media (min-width: 640px) { input[type='range'] { height: 8px; border-radius: 4px; } } input[type='range']::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 24px; height: 24px; border-radius: 50%; background: white; cursor: pointer; border: 2px solid rgba(0, 0, 0, 0.15); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.1); transition: transform 0.15s ease, box-shadow 0.15s ease; } input[type='range']::-webkit-slider-thumb:hover { transform: scale(1.1); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.4), 0 0 0 2px rgba(255, 255, 255, 0.2); } input[type='range']::-webkit-slider-thumb:active { transform: scale(0.95); } /* Desktop: smaller thumb */ @media (min-width: 640px) { input[type='range']::-webkit-slider-thumb { width: 18px; height: 18px; } } input[type='range']::-moz-range-thumb { width: 24px; height: 24px; border-radius: 50%; background: white; cursor: pointer; border: 2px solid rgba(0, 0, 0, 0.15); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.1); transition: transform 0.15s ease, box-shadow 0.15s ease; } input[type='range']::-moz-range-thumb:hover { transform: scale(1.1); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.4), 0 0 0 2px rgba(255, 255, 255, 0.2); } /* Desktop: smaller thumb */ @media (min-width: 640px) { input[type='range']::-moz-range-thumb { width: 18px; height: 18px; } } /* Hide number input spinners for cleaner look */ input[type='number']::-webkit-inner-spin-button, input[type='number']::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; } input[type='number'] { -moz-appearance: textfield; } /* Custom checkbox styling - more visible */ input[type='checkbox'] { -webkit-appearance: none; appearance: none; width: 1.25rem; height: 1.25rem; border: 1.5px solid rgb(var(--color-dark-600)); border-radius: 0.375rem; background-color: rgb(var(--color-dark-700)); cursor: pointer; transition: all 0.15s ease; position: relative; flex-shrink: 0; } input[type='checkbox']:checked { background-color: rgb(var(--color-accent-500)); border-color: rgb(var(--color-accent-500)); } input[type='checkbox']:checked::after { content: ''; position: absolute; left: 50%; top: 45%; width: 5px; height: 9px; border: solid white; border-width: 0 2px 2px 0; transform: translate(-50%, -50%) rotate(45deg); } input[type='checkbox']:focus { outline: none; box-shadow: 0 0 0 2px rgba(var(--color-accent-500), 0.3); } input[type='checkbox']:hover:not(:checked) { border-color: rgb(var(--color-dark-500)); background-color: rgb(var(--color-dark-600)); } .light input[type='checkbox'] { border-color: rgb(var(--color-champagne-400)); background-color: rgb(var(--color-champagne-100)); } .light input[type='checkbox']:checked { background-color: rgb(var(--color-accent-500)); border-color: rgb(var(--color-accent-500)); } .light input[type='checkbox']:hover:not(:checked) { border-color: rgb(var(--color-champagne-500)); background-color: rgb(var(--color-champagne-200)); } /* Selection color */ ::selection { @apply bg-accent-500/30 text-dark-50; } .light ::selection { @apply bg-champagne-400/50 text-champagne-950; } /* Onboarding styles */ .onboarding-overlay { @apply pointer-events-none fixed inset-0 z-[100]; background: rgba(0, 0, 0, 0.75); transition: opacity 0.4s cubic-bezier(0.16, 1, 0.3, 1); } .onboarding-spotlight { @apply pointer-events-auto absolute; border-radius: 16px; box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.75), 0 0 30px rgba(59, 130, 246, 0.4); transition: all 0.5s cubic-bezier(0.16, 1, 0.3, 1); } .onboarding-tooltip { @apply pointer-events-auto absolute max-w-xs rounded-2xl border border-accent-500/30 bg-dark-900 p-5 shadow-xl shadow-accent-500/10 sm:max-w-sm; animation: scaleInBounce 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); } .onboarding-tooltip::before { content: ''; @apply absolute h-3 w-3 border-l border-t border-accent-500/30 bg-dark-900; transform: rotate(45deg); } /* Light theme onboarding */ .light .onboarding-overlay { background: rgba(0, 0, 0, 0.5); } .light .onboarding-spotlight { box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.5), 0 0 30px rgba(160, 139, 94, 0.4); } .light .onboarding-tooltip { @apply border-champagne-400/50 bg-white shadow-champagne-500/20; } .light .onboarding-tooltip::before { @apply border-champagne-400/50 bg-white; } .onboarding-tooltip.tooltip-top::before { @apply -bottom-1.5 left-1/2 -translate-x-1/2; transform: translateX(-50%) rotate(-135deg); } .onboarding-tooltip.tooltip-bottom::before { @apply -top-1.5 left-1/2; transform: translateX(-50%) rotate(45deg); } .onboarding-tooltip.tooltip-left::before { @apply -right-1.5 top-1/2; transform: translateY(-50%) rotate(135deg); } .onboarding-tooltip.tooltip-right::before { @apply -left-1.5 top-1/2; transform: translateY(-50%) rotate(-45deg); } /* Stagger animation utilities */ .stagger-1 { animation-delay: 0.05s; } .stagger-2 { animation-delay: 0.1s; } .stagger-3 { animation-delay: 0.15s; } .stagger-4 { animation-delay: 0.2s; } .stagger-5 { animation-delay: 0.25s; } .stagger-6 { animation-delay: 0.3s; } .stagger-7 { animation-delay: 0.35s; } .stagger-8 { animation-delay: 0.4s; } /* Animation fill mode for stagger */ .animate-fill-both { animation-fill-mode: both; } /* Smooth page transitions */ .page-enter { @apply translate-y-4 opacity-0; } .page-enter-active { @apply translate-y-0 opacity-100 transition-all duration-500; transition-timing-function: cubic-bezier(0.16, 1, 0.3, 1); } .page-exit { @apply translate-y-0 opacity-100; } .page-exit-active { @apply -translate-y-4 opacity-0 transition-all duration-300; transition-timing-function: cubic-bezier(0.4, 0, 1, 1); } /* Keyframes for scale in bounce */ @keyframes scaleInBounce { 0% { opacity: 0; transform: scale(0.9); } 50% { transform: scale(1.02); } 100% { opacity: 1; transform: scale(1); } } /* Fortune Wheel animations */ @keyframes wheel-shimmer { 0% { background-position: 200% 50%; } 100% { background-position: -200% 50%; } } @keyframes wheel-glow { 0%, 100% { filter: drop-shadow(0 0 10px rgba(255, 215, 0, 0.3)); } 50% { filter: drop-shadow(0 0 20px rgba(255, 215, 0, 0.6)); } } @keyframes prize-reveal { 0% { opacity: 0; transform: scale(0.5) rotate(-10deg); } 50% { transform: scale(1.1) rotate(5deg); } 100% { opacity: 1; transform: scale(1) rotate(0); } } @keyframes confetti-fall { 0% { transform: translateY(-100%) rotate(0deg); opacity: 1; } 100% { transform: translateY(100vh) rotate(720deg); opacity: 0; } } .animate-scale-in { animation: scaleInBounce 0.4s cubic-bezier(0.34, 1.56, 0.64, 1); } .animate-prize-reveal { animation: prize-reveal 0.6s cubic-bezier(0.34, 1.56, 0.64, 1); } .animate-wheel-glow { animation: wheel-glow 2s ease-in-out infinite; } /* Toast progress bar animation */ @keyframes shrink { from { width: 100%; } to { width: 0%; } } /* ========== ANIMATED BACKGROUND (GPU Optimized) ========== */ .wave-bg-container { position: fixed; inset: 0; z-index: -1; overflow: hidden; pointer-events: none; contain: strict; /* Performance: isolate repaints */ } .wave-blob { position: absolute; border-radius: 50%; filter: blur(60px); /* Reduced from 80px for better performance */ opacity: 0.5; /* GPU acceleration */ will-change: transform; transform: translateZ(0); backface-visibility: hidden; } /* Smaller sizes for better performance */ .wave-blob-1 { width: 400px; height: 400px; background: radial-gradient(circle, rgba(var(--color-accent-800), 0.6) 0%, transparent 70%); top: -15%; left: -10%; animation: wave1 20s ease-in-out infinite; /* Slower = less CPU */ } .wave-blob-2 { width: 350px; height: 350px; background: radial-gradient(circle, rgba(59, 130, 246, 0.6) 0%, transparent 70%); bottom: -10%; right: -10%; animation: wave2 25s ease-in-out infinite; } .wave-blob-3 { width: 300px; height: 300px; background: radial-gradient(circle, rgba(168, 85, 247, 0.4) 0%, transparent 70%); top: 40%; left: 40%; animation: wave3 30s ease-in-out infinite; } .wave-blob-4 { width: 250px; height: 250px; background: radial-gradient(circle, rgba(236, 72, 153, 0.35) 0%, transparent 70%); bottom: 25%; left: 15%; animation: wave4 22s ease-in-out infinite; } /* Simplified keyframes - fewer steps = better performance */ @keyframes wave1 { 0%, 100% { transform: translate3d(0, 0, 0) scale(1); } 50% { transform: translate3d(8%, 12%, 0) scale(1.05); } } @keyframes wave2 { 0%, 100% { transform: translate3d(0, 0, 0) scale(1); } 50% { transform: translate3d(-10%, -8%, 0) scale(1.08); } } @keyframes wave3 { 0%, 100% { transform: translate3d(-50%, -50%, 0) scale(1); } 50% { transform: translate3d(-45%, -55%, 0) scale(1.1); } } @keyframes wave4 { 0%, 100% { transform: translate3d(0, 0, 0) scale(1); } 50% { transform: translate3d(12%, -8%, 0) scale(1.12); } } /* Light theme adjustments */ .light .wave-blob { opacity: 0.35; filter: blur(80px); } .light .wave-blob-1 { background: radial-gradient(circle, rgba(var(--color-accent-800), 0.7) 0%, transparent 70%); } /* Mobile: brighter and faster animations */ @media (max-width: 768px) { .wave-blob { opacity: 0.7; filter: blur(50px); } .wave-blob-1 { width: 300px; height: 300px; background: radial-gradient(circle, rgba(var(--color-accent-800), 0.8) 0%, transparent 70%); animation: wave1-mobile 12s ease-in-out infinite; } .wave-blob-2 { width: 280px; height: 280px; background: radial-gradient(circle, rgba(59, 130, 246, 0.8) 0%, transparent 70%); animation: wave2-mobile 15s ease-in-out infinite; } @keyframes wave1-mobile { 0%, 100% { transform: translate3d(0, 0, 0) scale(1); } 25% { transform: translate3d(15%, 20%, 0) scale(1.1); } 50% { transform: translate3d(5%, 35%, 0) scale(1.15); } 75% { transform: translate3d(20%, 10%, 0) scale(1.05); } } @keyframes wave2-mobile { 0%, 100% { transform: translate3d(0, 0, 0) scale(1); } 25% { transform: translate3d(-20%, -15%, 0) scale(1.15); } 50% { transform: translate3d(-10%, -30%, 0) scale(1.1); } 75% { transform: translate3d(-25%, -5%, 0) scale(1.05); } } } /* Disable animations for reduced motion preference */ @media (prefers-reduced-motion: reduce) { .wave-blob { animation: none !important; } } /* User preference: reduce motion */ .reduce-motion, .reduce-motion * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } /* ========== SHEET MODAL STYLES ========== */ /* Sheet animations */ @keyframes sheetSlideUp { from { transform: translateY(100%); } to { transform: translateY(0); } } @keyframes sheetSlideDown { from { transform: translateY(0); } to { transform: translateY(100%); } } @keyframes backdropFadeIn { from { opacity: 0; backdrop-filter: blur(0); } to { opacity: 1; backdrop-filter: blur(8px); } } @keyframes backdropFadeOut { from { opacity: 1; backdrop-filter: blur(8px); } to { opacity: 0; backdrop-filter: blur(0); } } /* Page transitions */ @keyframes pageEnter { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: translateY(0); } } @keyframes pageExit { from { opacity: 1; transform: translateY(0); } to { opacity: 0; transform: translateY(-12px); } } .page-enter { animation: pageEnter 0.3s cubic-bezier(0.16, 1, 0.3, 1) both; } .page-exit { animation: pageExit 0.2s ease-in both; } /* Light theme sheet overrides */ .light .sheet-backdrop { @apply bg-black/40; } .light .sheet-container { @apply bg-champagne-100; } .light .sheet-handle { @apply bg-champagne-400; }