@import "tailwindcss"; :root { --color-primary: #1e3a5f; --color-primary-light: #2d5a87; --color-accent: #fbbf24; --color-success: #059669; --color-warning: #d97706; --color-background: #f5f6f8; --color-surface: #ffffff; --color-text: #111827; --color-text-muted: #6b7280; --color-border: #e5e7eb; --glass-bg: #ffffff; --glass-border: #e5e7eb; color-scheme: light; } @theme inline { --color-background: var(--color-background); --color-foreground: var(--color-text); --font-sans: 'Inter', system-ui, sans-serif; --font-display: 'Lora', Georgia, serif; } * { box-sizing: border-box; } html { scroll-behavior: smooth; } body { margin: 0; padding: 0; background: var(--color-background); color: var(--color-text); font-family: var(--font-sans); font-size: 16px; line-height: 1.6; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* Typography Wrapped in @layer base so Tailwind utility classes (e.g. font-sans), which Tailwind puts in @layer utilities, can actually override this — unlayered CSS always beats layered CSS regardless of specificity, so without this @layer wrapper a `font-sans` class on an

had no effect at all against this rule. */ @layer base { h1, h2, h3, h4, h5, h6 { font-family: var(--font-display); font-weight: 600; line-height: 1.2; margin: 0; } } /* Custom scrollbar */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: var(--color-text-muted); } /* Button styles */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 0.625rem 1.25rem; font-family: var(--font-sans); font-weight: 500; font-size: 0.875rem; border-radius: 8px; border: none; cursor: pointer; transition: all 0.15s ease; text-decoration: none; } .btn-primary { background: var(--color-primary); color: white; } .btn-primary:hover { background: var(--color-primary-light); } .btn-accent { background: var(--color-accent); color: #1a2332; font-weight: 600; } .btn-accent:hover { background: #f59e0b; } /* Sparkle particle (spawned programmatically on button click) */ @keyframes sparkle-fly { 0% { transform: translate(0, 0) scale(1); opacity: 1; } 100% { transform: translate(var(--dx), var(--dy)) scale(0); opacity: 0; } } .sparkle-particle { position: absolute; width: 10px; height: 10px; border-radius: 50%; background: var(--color-accent, #fbbf24); box-shadow: 0 0 6px 1px rgba(251, 191, 36, 0.6); pointer-events: none; animation: sparkle-fly 0.75s ease-out forwards; z-index: 10; } .btn-outline { background: var(--color-surface); color: var(--color-text); border: 1px solid var(--color-border); } .btn-outline:hover { border-color: var(--color-primary); color: var(--color-primary); } /* Card styles */ .card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: 12px; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05); } /* Input styles */ .input { width: 100%; padding: 0.75rem 1rem; font-family: var(--font-sans); font-size: 0.9375rem; color: var(--color-text); background: var(--color-surface); border: 1px solid var(--color-border); border-radius: 8px; outline: none; transition: border-color 0.15s ease, box-shadow 0.15s ease; } .input:focus { outline: none; border-color: var(--color-primary); box-shadow: 0 0 0 3px rgba(30, 58, 95, 0.14); } .input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px var(--color-surface) inset; -webkit-text-fill-color: var(--color-text); border: 1px solid var(--color-border); } .input:-webkit-autofill:focus { -webkit-box-shadow: 0 0 0px 1000px var(--color-surface) inset, 0 0 0 3px rgba(30, 58, 95, 0.14); -webkit-text-fill-color: var(--color-text); border: 1px solid var(--color-primary); } .input::placeholder { color: var(--color-text-muted); } /* Badge styles */ .badge { display: inline-flex; align-items: center; gap: 0.25rem; padding: 0.2rem 0.625rem; font-size: 0.75rem; font-weight: 600; border-radius: 9999px; } .badge-success { background: rgba(5, 150, 105, 0.1); color: var(--color-success); } .badge-warning { background: rgba(217, 119, 6, 0.1); color: var(--color-warning); } /* Candy-stripe progress bar */ @keyframes stripe-slide { 0% { background-position: 0 0; } 100% { background-position: 40px 0; } } @keyframes stripe-breathe { 0%, 100% { opacity: 1; } 50% { opacity: 0.75; } } .progress-stripe { background: repeating-linear-gradient( -45deg, var(--color-primary) 0px, var(--color-primary) 14px, var(--color-primary-light) 14px, var(--color-primary-light) 28px ); background-size: 40px 40px; animation: stripe-slide 0.6s linear infinite, stripe-breathe 2s ease-in-out infinite; } /* Paper plane floating animation */ @keyframes plane-float { 0%, 100% { transform: translateY(0px) rotate(0deg); } 50% { transform: translateY(-14px) rotate(-2deg); } } .plane-float { animation: plane-float 3.2s ease-in-out infinite; } @keyframes arrow-nudge { 0%, 100% { transform: translateX(0); opacity: 0.85; } 50% { transform: translateX(-4px); opacity: 1; } } .arrow-nudge { animation: arrow-nudge 1.4s ease-in-out infinite; } /* Upload dropzone icon bounce — draws the eye to where a click is expected */ @keyframes upload-bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-6px); } } .upload-bounce { animation: upload-bounce 1.8s ease-in-out infinite; } /* Coffee steam animation */ @keyframes steam-rise { 0% { transform: translateY(0) scaleX(1); opacity: 0.7; } 50% { transform: translateY(-8px) scaleX(1.2); opacity: 0.4; } 100% { transform: translateY(-16px) scaleX(0.8); opacity: 0; } } .steam-line { animation: steam-rise 1.6s ease-in-out infinite; transform-origin: bottom center; } .steam-line:nth-child(1) { animation-delay: 0s; } .steam-line:nth-child(2) { animation-delay: 0.4s; } .steam-line:nth-child(3) { animation-delay: 0.8s; } /* Animations */ @keyframes fadeInUp { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } .animate-fade-in-up { animation: fadeInUp 0.4s ease-out forwards; } .animate-pulse { animation: pulse 2s ease-in-out infinite; } .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; }