@tailwind base; @tailwind components; @tailwind utilities; :root { --background: #ffffff; --foreground: #171717; --card: #f9fafb; --card-border: #e5e7eb; --muted: #6b7280; --primary: #3b82f6; } .dark { --background: #0a0a0a; --foreground: #ededed; --card: #1a1a2e; --card-border: #2d2d44; --muted: #9ca3af; --primary: #60a5fa; } body { background: var(--background); color: var(--foreground); font-family: system-ui, -apple-system, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-size: 16px; /* prevent auto-zoom on iOS */ max-width: 100vw; overflow-x: hidden; } /* Mobile-first base */ * { box-sizing: border-box; -webkit-tap-highlight-color: transparent; } input[type="text"], input[type="email"], input[type="password"], input[type="datetime-local"], textarea, select { font-size: 16px; /* Prevent zoom on iOS */ } /* Touch targets - minimum 44px for accessibility */ @media (max-width: 768px) { button, a, [role="button"] { min-height: 44px; } } @layer utilities { .scrollbar-hide { -ms-overflow-style: none; scrollbar-width: none; } .scrollbar-hide::-webkit-scrollbar { display: none; } .text-muted { color: var(--muted); } } /* Smooth scrolling with snap */ .snap-x { scroll-snap-type: x mandatory; -webkit-overflow-scrolling: touch; } .snap-center { scroll-snap-align: center; } .snap-mandatory { scroll-snap-type: x mandatory; } /* Bottom navigation responsive */ @media (max-width: 640px) { .bottom-nav { display: flex; } .desktop-sidebar { display: none; } } @media (min-width: 641px) { .bottom-nav { display: none; } } /* Safe area for notched devices */ .safe-area-bottom { padding-bottom: env(safe-area-inset-bottom, 0px); } /* Smooth page transitions */ main { animation: fadeIn 0.15s ease-out; } @keyframes fadeIn { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } } /* Slide-in animations for drawer */ @keyframes slideInRight { from { transform: translateX(100%); } to { transform: translateX(0); } } .animate-slideInRight { animation: slideInRight 0.25s ease-out; } /* Swipe overlay animations */ @keyframes slideOverlayLeft { 0% { opacity: 0; transform: translateX(40px) scale(0.9); } 30% { opacity: 1; transform: translateX(0) scale(1); } 70% { opacity: 1; transform: translateX(0) scale(1); } 100% { opacity: 0; transform: translateX(-20px) scale(0.95); } } @keyframes slideOverlayRight { 0% { opacity: 0; transform: translateX(-40px) scale(0.9); } 30% { opacity: 1; transform: translateX(0) scale(1); } 70% { opacity: 1; transform: translateX(0) scale(1); } 100% { opacity: 0; transform: translateX(20px) scale(0.95); } } .animate-slideOverlayLeft { animation: slideOverlayLeft 0.6s ease-out forwards; } .animate-slideOverlayRight { animation: slideOverlayRight 0.6s ease-out forwards; } /* Content slide animations for group switch */ @keyframes slideContentLeft { 0% { opacity: 0.3; transform: translateX(30px); } 100% { opacity: 1; transform: translateX(0); } } @keyframes slideContentRight { 0% { opacity: 0.3; transform: translateX(-30px); } 100% { opacity: 1; transform: translateX(0); } } .animate-slideContentLeft { animation: slideContentLeft 0.3s ease-out; } .animate-slideContentRight { animation: slideContentRight 0.3s ease-out; } /* Fade-in for backdrop */ @keyframes fadeInBackdrop { from { opacity: 0; } to { opacity: 1; } } .animate-fadeIn { animation: fadeInBackdrop 0.2s ease-out; } /* Mobile overscroll behavior */ @media (max-width: 640px) { html { overscroll-behavior-y: contain; } } /* Mobile modal fix */ .modal-content { max-height: 90vh; max-height: 90dvh; /* dynamic viewport height */ overflow-y: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain; } /* Ensure modal buttons visible above keyboard */ @media (max-width: 640px) { .modal-content { max-height: 85vh; max-height: 85dvh; } } /* Selection color */ ::selection { background: rgba(59, 130, 246, 0.3); }