@tailwind base; @tailwind components; @tailwind utilities; /* Import Leaflet CSS for maps */ @import 'leaflet/dist/leaflet.css'; /* Base styles */ @layer base { html { scroll-behavior: smooth; } body { font-family: 'Inter', system-ui, -apple-system, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* Custom scrollbar */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { @apply bg-gray-100; } ::-webkit-scrollbar-thumb { @apply bg-gray-300 rounded-full; } ::-webkit-scrollbar-thumb:hover { @apply bg-gray-400; } } /* Component styles */ @layer components { .btn { @apply inline-flex items-center justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-lg focus:outline-none focus:ring-2 focus:ring-offset-2 transition-colors duration-200; } .btn-primary { @apply btn bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500; } .btn-secondary { @apply btn bg-gray-600 text-white hover:bg-gray-700 focus:ring-gray-500; } .btn-outline { @apply btn border-gray-300 text-gray-700 bg-white hover:bg-gray-50 focus:ring-primary-500; } .btn-danger { @apply btn bg-red-600 text-white hover:bg-red-700 focus:ring-red-500; } .btn-success { @apply btn bg-grass-600 text-white hover:bg-grass-700 focus:ring-grass-500; } .input { @apply block w-full px-3 py-2 border border-gray-300 rounded-lg shadow-sm placeholder-gray-400 focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm; } .input-error { @apply input border-red-300 text-red-900 placeholder-red-300 focus:ring-red-500 focus:border-red-500; } .label { @apply block text-sm font-medium text-gray-700 mb-1; } .card { @apply bg-white rounded-lg shadow-sm border border-gray-200 p-6; } .card-header { @apply border-b border-gray-200 pb-4 mb-4; } .nav-link { @apply flex items-center px-3 py-2 text-sm font-medium rounded-lg transition-colors duration-200; } .nav-link-active { @apply nav-link bg-primary-100 text-primary-700; } .nav-link-inactive { @apply nav-link text-gray-600 hover:text-gray-900 hover:bg-gray-50; } .badge { @apply inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium; } .badge-green { @apply badge bg-grass-100 text-grass-800; } .badge-blue { @apply badge bg-blue-100 text-blue-800; } .badge-yellow { @apply badge bg-yellow-100 text-yellow-800; } .badge-red { @apply badge bg-red-100 text-red-800; } .badge-gray { @apply badge bg-gray-100 text-gray-800; } } /* Utility styles */ @layer utilities { .text-balance { text-wrap: balance; } .animation-delay-200 { animation-delay: 200ms; } .animation-delay-400 { animation-delay: 400ms; } .animation-delay-600 { animation-delay: 600ms; } .glass { @apply bg-white/80 backdrop-blur-sm border border-white/20; } .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; } .scrollbar-hide::-webkit-scrollbar { display: none; } } /* Loading animations */ .loading-dots { display: inline-block; } .loading-dots::after { content: ''; animation: dots 1.5s steps(4, end) infinite; } @keyframes dots { 0%, 20% { content: ''; } 40% { content: '.'; } 60% { content: '..'; } 80%, 100% { content: '...'; } } /* Map styles */ .mapboxgl-popup-content { @apply rounded-lg shadow-lg; } .mapboxgl-popup-close-button { @apply text-gray-400 hover:text-gray-600; } /* React Query loading states */ .query-loading { @apply animate-pulse; } /* Mobile-specific styles */ @media (max-width: 640px) { .mobile-full-width { width: 100vw; margin-left: calc(-50vw + 50%); } } /* Print styles */ @media print { .no-print { display: none !important; } .print-break { page-break-after: always; } } /* Dark mode support (future enhancement) */ @media (prefers-color-scheme: dark) { .dark-mode { @apply bg-gray-900 text-white; } }