/* Linglov — общие анимации для всех страниц.
   Классы .m-* расставляет linglov-motion.js; без JS страница выглядит как обычно. */
:root { --m-out: cubic-bezier(.22, 1, .36, 1); --m-spring: cubic-bezier(.34, 1.56, .64, 1); }

@keyframes m-fade-down { from { opacity: 0; transform: translateY(-12px); } to { opacity: 1; transform: none; } }
@keyframes m-fade-in { from { opacity: 0; } to { opacity: 1; } }
@keyframes m-fade-out { from { opacity: 1; } to { opacity: 0; } }
@keyframes m-pop-in { from { opacity: 0; transform: scale(.94) translateY(12px); } to { opacity: 1; transform: none; } }
@keyframes m-pop-out { from { opacity: 1; transform: none; } to { opacity: 0; transform: scale(.95) translateY(10px); } }
@keyframes m-slide-in { from { opacity: 0; transform: translateX(-14px); } to { opacity: 1; transform: none; } }
@keyframes m-ripple { to { transform: translate(-50%, -50%) scale(1); opacity: 0; } }

/* вход на страницу и уход с неё */
body { animation: m-fade-in .35s ease both; }
html.m-leaving body { opacity: 0; transform: translateY(6px); transition: opacity .18s ease, transform .18s ease; }
.topbar { animation: m-fade-down .55s var(--m-out) both; }
.notice, .msg, .messages > *, .ob-notice { animation: m-slide-in .45s var(--m-out) both; }

/* появление блоков при прокрутке */
.m-reveal { opacity: 0; transform: translateY(20px); transition: opacity .65s var(--m-out), transform .65s var(--m-out); transition-delay: var(--m-d, 0ms); }
.m-reveal.m-in { opacity: 1; transform: none; }
.m-reveal.m-in.m-done { transition-delay: 0ms; transition-duration: .3s; }

/* наведение на карточки */
.m-hover { transition: transform .35s var(--m-out), box-shadow .35s var(--m-out), border-color .25s ease, opacity .65s var(--m-out); }
.m-hover:hover { transform: translateY(-3px); box-shadow: 0 16px 36px rgba(46, 33, 38, .11); }
.m-reveal.m-in.m-hover:hover { transform: translateY(-3px); }

/* кнопки: наведение, нажатие, волна */
.m-press { position: relative; overflow: hidden; -webkit-tap-highlight-color: transparent; transition: transform .2s var(--m-out), box-shadow .25s ease, filter .2s ease, background-color .2s ease, color .2s ease, border-color .2s ease; }
.m-press:not(:disabled):hover { transform: translateY(-1px); }
.m-press:not(:disabled):active { transform: scale(.96); transition-duration: .08s; }
.m-ripple { position: absolute; left: var(--x); top: var(--y); width: var(--s); height: var(--s); border-radius: 50%; background: currentColor; opacity: .18; transform: translate(-50%, -50%) scale(0); pointer-events: none; animation: m-ripple .6s ease-out forwards; }

/* меню: подчёркивание */
.nav a { position: relative; }
.nav a::after { content: ""; position: absolute; left: 0; right: 0; bottom: -6px; height: 2px; border-radius: 2px; background: #d85b78; transform: scaleX(0); transform-origin: left; transition: transform .3s var(--m-out); pointer-events: none; }
.nav a:hover::after, .nav a.is-active::after, .nav a[aria-current="page"]::after { transform: scaleX(1); }
.avatar { transition: transform .35s var(--m-spring); }
a:hover > .avatar, .profile-link:hover .avatar, .teacher-link:hover .avatar { transform: rotate(-8deg) scale(1.06); }

/* поля ввода */
input:not([type=checkbox]):not([type=radio]):not([type=file]):not([type=hidden]), select, textarea { transition: border-color .2s ease, box-shadow .25s ease, background-color .2s ease; }

/* модальные окна: открытие и закрытие */
.m-modal-open { animation: m-fade-in .22s ease both; }
.m-modal-open > :first-child { animation: m-pop-in .42s var(--m-spring) both; }
.m-modal-closing { animation: m-fade-out .2s ease both !important; pointer-events: none; }
.m-modal-closing > :first-child { animation: m-pop-out .2s ease both !important; }
dialog[open] { animation: m-pop-in .4s var(--m-spring) both; }
dialog[open]::backdrop { animation: m-fade-in .22s ease both; }
dialog.m-dialog-closing { animation: m-pop-out .2s ease both; }
dialog.m-dialog-closing::backdrop { animation: m-fade-out .2s ease both; }
details > :not(summary) { animation: m-fade-down .3s var(--m-out) both; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; transition-delay: 0ms !important; }
  .m-reveal { opacity: 1; transform: none; }
}
