Files
ospab.host/ospabhost/frontend/src/index.css
2025-12-31 19:59:43 +03:00

272 lines
5.0 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@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;
}