@tailwind base; @tailwind components; @tailwind utilities; @layer base { :root { --background: 0 0% 100%; --foreground: 222.2 84% 4.9%; --card: 0 0% 100%; --card-foreground: 222.2 84% 4.9%; --popover: 0 0% 100%; --popover-foreground: 222.2 84% 4.9%; --primary: 221.2 83.2% 53.3%; --primary-foreground: 210 40% 98%; --secondary: 210 40% 96%; --secondary-foreground: 222.2 84% 4.9%; --muted: 210 40% 96%; --muted-foreground: 215.4 16.3% 46.9%; --accent: 210 40% 96%; --accent-foreground: 222.2 84% 4.9%; --destructive: 0 84.2% 60.2%; --destructive-foreground: 210 40% 98%; --border: 214.3 31.8% 91.4%; --input: 214.3 31.8% 91.4%; --ring: 221.2 83.2% 53.3%; --radius: 0.5rem; } .dark { --background: 222.2 84% 4.9%; --foreground: 210 40% 98%; --card: 222.2 84% 4.9%; --card-foreground: 210 40% 98%; --popover: 222.2 84% 4.9%; --popover-foreground: 210 40% 98%; --primary: 217.2 91.2% 59.8%; --primary-foreground: 222.2 84% 4.9%; --secondary: 217.2 32.6% 17.5%; --secondary-foreground: 210 40% 98%; --muted: 217.2 32.6% 17.5%; --muted-foreground: 215 20.2% 65.1%; --accent: 217.2 32.6% 17.5%; --accent-foreground: 210 40% 98%; --destructive: 0 62.8% 30.6%; --destructive-foreground: 210 40% 98%; --border: 217.2 32.6% 17.5%; --input: 217.2 32.6% 17.5%; --ring: 224.3 76.3% 94.1%; } * { @apply border-gray-200; } body { @apply bg-white text-gray-900; } /* Custom scrollbar */ ::-webkit-scrollbar { @apply w-2; } ::-webkit-scrollbar-track { @apply bg-gray-100; } ::-webkit-scrollbar-thumb { @apply bg-gray-300 rounded-full; } ::-webkit-scrollbar-thumb:hover { @apply bg-gray-400; } /* Text selection */ ::selection { @apply bg-blue-100 text-blue-900; } /* Focus ring */ :focus-visible { @apply outline-none ring-2 ring-blue-500 ring-offset-2; } } /* Component-layer utilities */ @layer components { /* Page container */ .container { @apply mx-auto max-w-7xl px-4 sm:px-6 lg:px-8; } /* Button-style helpers */ .btn-primary { @apply bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500; } .btn-secondary { @apply bg-gray-100 text-gray-900 hover:bg-gray-200 focus:ring-gray-500; } .btn-outline { @apply border border-gray-300 bg-white text-gray-700 hover:bg-gray-50 focus:ring-blue-500; } /* Card helpers */ .card { @apply rounded-lg border border-gray-200 bg-white shadow-sm; } .card-hover { @apply transition-shadow hover:shadow-md; } /* Input helpers */ .input { @apply flex h-10 w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm; } .input-focus { @apply focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2; } /* Typography helpers */ .text-balance { text-wrap: balance; } .text-gradient { @apply bg-gradient-to-r from-blue-600 to-blue-800 bg-clip-text text-transparent; } /* Animation helpers */ .animate-fade-in { animation: fadeIn 0.5s ease-in-out; } .animate-slide-up { animation: slideUp 0.3s ease-out; } .animate-bounce-slow { animation: bounce 2s infinite; } } /* Extra utilities */ @layer utilities { /* Grid helpers */ .grid-auto-fit { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); } .grid-auto-fill { grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); } /* Responsive visibility */ .mobile-only { @apply block sm:hidden; } .desktop-only { @apply hidden sm:block; } /* Dark mode surface */ .dark-mode { @apply dark:bg-gray-900 dark:text-gray-100; } /* Print */ @media print { .print-hidden { @apply hidden; } .print-visible { @apply block; } } } /* Keyframes */ @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @keyframes slideUp { from { transform: translateY(10px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } @keyframes bounce { 0%, 20%, 53%, 80%, 100% { transform: translate3d(0, 0, 0); } 40%, 43% { transform: translate3d(0, -30px, 0); } 70% { transform: translate3d(0, -15px, 0); } 90% { transform: translate3d(0, -4px, 0); } } /* Dark color-scheme hint */ @media (prefers-color-scheme: dark) { .dark-mode { @apply bg-gray-900 text-gray-100; } } /* High contrast */ @media (prefers-contrast: high) { .high-contrast { @apply border-2 border-black; } } /* Reduced motion */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }