@tailwind base; @tailwind components; @tailwind utilities; /* ===== МОБИЛЬНАЯ АДАПТАЦИЯ ===== */ /* Улучшенный перенос слов для мобильных устройств */ @media (max-width: 768px) { .prose { word-wrap: break-word; overflow-wrap: break-word; hyphens: auto; } .prose p, .prose li { word-wrap: break-word; overflow-wrap: break-word; } /* Предотвращение горизонтальной прокрутки */ body { overflow-x: hidden; } /* Адаптация длинных слов в интерфейсе */ .break-word-mobile { word-break: break-word; hyphens: auto; } /* Усечение текста с троеточием на мобильных */ .truncate-mobile { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } } /* Line clamp utilities для совместимости */ .line-clamp-1 { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; } .line-clamp-2 { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } .line-clamp-3 { overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; } /* ===== ГЛОБАЛЬНЫЕ АНИМАЦИИ ===== */ /* Fade in снизу */ @keyframes fade-in-up { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } /* Fade in сверху */ @keyframes fade-in-down { from { opacity: 0; transform: translateY(-30px); } to { opacity: 1; transform: translateY(0); } } /* Fade in слева */ @keyframes fade-in-left { from { opacity: 0; transform: translateX(-30px); } to { opacity: 1; transform: translateX(0); } } /* Fade in справа */ @keyframes fade-in-right { from { opacity: 0; transform: translateX(30px); } to { opacity: 1; transform: translateX(0); } } /* Scale in */ @keyframes scale-in { from { opacity: 0; transform: scale(0.9); } to { opacity: 1; transform: scale(1); } } /* Bounce subtle */ @keyframes bounce-subtle { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-5px); } } /* Float */ @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } /* Pulse glow */ @keyframes pulse-glow { 0%, 100% { box-shadow: 0 0 5px rgba(59, 130, 246, 0.5); } 50% { box-shadow: 0 0 20px rgba(59, 130, 246, 0.8); } } /* Slide in from bottom for cards */ @keyframes slide-up { from { opacity: 0; transform: translateY(50px); } to { opacity: 1; transform: translateY(0); } } /* Классы анимаций */ .animate-fade-in-up { animation: fade-in-up 0.6s ease-out forwards; } .animate-fade-in-down { animation: fade-in-down 0.6s ease-out forwards; } .animate-fade-in-left { animation: fade-in-left 0.6s ease-out forwards; } .animate-fade-in-right { animation: fade-in-right 0.6s ease-out forwards; } .animate-scale-in { animation: scale-in 0.5s ease-out forwards; } .animate-bounce-subtle { animation: bounce-subtle 2s ease-in-out infinite; } .animate-float { animation: float 3s ease-in-out infinite; } .animate-pulse-glow { animation: pulse-glow 2s ease-in-out infinite; } .animate-slide-up { animation: slide-up 0.6s ease-out forwards; } /* Задержки анимаций */ .animation-delay-100 { animation-delay: 0.1s; } .animation-delay-200 { animation-delay: 0.2s; } .animation-delay-300 { animation-delay: 0.3s; } .animation-delay-400 { animation-delay: 0.4s; } .animation-delay-500 { animation-delay: 0.5s; } .animation-delay-600 { animation-delay: 0.6s; } .animation-delay-700 { animation-delay: 0.7s; } .animation-delay-800 { animation-delay: 0.8s; } /* Начальное состояние для анимируемых элементов */ .animate-on-scroll { opacity: 0; } /* Hover эффекты для карточек */ .card-hover { transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); } .card-hover:hover { transform: translateY(-8px); box-shadow: 0 20px 40px -15px rgba(0, 0, 0, 0.2); } /* Hover эффект для кнопок */ .btn-hover { transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .btn-hover:hover { transform: translateY(-2px); box-shadow: 0 10px 20px -10px rgba(0, 0, 0, 0.3); } .btn-hover:active { transform: translateY(0); } /* ===== СУЩЕСТВУЮЩИЕ АНИМАЦИИ ===== */ /* Анимации для модальных окон и уведомлений */ @keyframes modal-enter { from { opacity: 0; transform: scale(0.95) translateY(-10px); } to { opacity: 1; transform: scale(1) translateY(0); } } @keyframes toast-enter { from { opacity: 0; transform: translateX(100%); } to { opacity: 1; transform: translateX(0); } } .animate-modal-enter { animation: modal-enter 0.2s ease-out; } .animate-toast-enter { animation: toast-enter 0.3s ease-out; }