/* Движение портала (§6 промпта). Только transform/opacity; prefers-reduced-motion отключает всё.
   Появление экрана запускает класс .rt-enter на #page и #pagehead (его снимает app.js через ~1 с),
   поэтому обновления внутри экрана анимацию заново не запускают. */
:root{--ease-out:cubic-bezier(.2,.8,.2,1);--ease-spring:cubic-bezier(.34,1.4,.64,1);--ease:var(--ease-out)}

@keyframes rtRise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes rtFade{from{opacity:0}to{opacity:1}}
@keyframes rtGrowX{from{transform:scaleX(0)}to{transform:scaleX(1)}}
@keyframes rtGrowY{from{transform:scaleY(0)}to{transform:scaleY(1)}}
@keyframes rtSlideIn{from{opacity:0;transform:translateX(-10px)}to{opacity:1;transform:none}}
@keyframes rtPop{from{opacity:0;transform:translateY(8px) scale(.96)}to{opacity:1;transform:none}}
@keyframes rtPopOut{to{opacity:0;transform:translateY(6px) scale(.97)}}
@keyframes rtToastIn{from{opacity:0;transform:translateX(24px)}to{opacity:1;transform:none}}
@keyframes rtPing{0%{transform:rotate(0)}15%{transform:rotate(14deg)}30%{transform:rotate(-12deg)}45%{transform:rotate(8deg)}60%{transform:rotate(-5deg)}100%{transform:rotate(0)}}
@keyframes rtBlink{0%,80%,100%{opacity:.25}40%{opacity:1}}
@keyframes rtDash{from{stroke-dashoffset:60}to{stroke-dashoffset:0}}

/* Появление экрана: заголовок, затем карточки по очереди (--d выставляет app.js) */
.rt-enter .page-head-t,#pagehead.rt-enter .page-head-t{animation:rtRise .42s var(--ease-out) both}
#pagehead.rt-enter .page-head-a{animation:rtFade .5s var(--ease-out) .12s both}
.rt-enter .rt-card,.rt-enter .rt-kpi,.rt-enter .rt-sec,.rt-enter .rt-hero,.rt-enter .rt-note,.rt-enter .rt-stub,
.rt-enter .rt-toolbar,.rt-enter .rt-alert,.rt-enter .lk-pchat{animation:rtRise .42s var(--ease-out) both;animation-delay:var(--d,0s)}

/* Полосы и столбики «вырастают» */
.rt-enter .rt-bar>i,.rt-enter .rt-stages>i{transform-origin:left center;animation:rtGrowX .8s var(--ease-out) .15s both}
.rt-enter .rt-spark>i,.rt-enter .rt-weeks>i{transform-origin:bottom;animation:rtGrowY .7s var(--ease-out) both}
.rt-enter .rt-spark>i:nth-child(2){animation-delay:.04s}.rt-enter .rt-spark>i:nth-child(3){animation-delay:.08s}
.rt-enter .rt-spark>i:nth-child(4){animation-delay:.12s}.rt-enter .rt-spark>i:nth-child(5){animation-delay:.16s}
.rt-enter .rt-spark>i:nth-child(n+6){animation-delay:.2s}
.ab-srv .sp polyline{stroke-dasharray:60;animation:rtDash 1s var(--ease-out) both}

/* Строки таблиц и списков — каскад задержек 0/60/100/140/190/240 мс */
.rt-enter .rt-list>*,.rt-enter .rt-tbl tr{animation:rtFade .4s var(--ease-out) both}
.rt-enter .rt-list>*:nth-child(1),.rt-enter .rt-tbl tr:nth-child(1){animation-delay:0s}
.rt-enter .rt-list>*:nth-child(2),.rt-enter .rt-tbl tr:nth-child(2){animation-delay:.06s}
.rt-enter .rt-list>*:nth-child(3),.rt-enter .rt-tbl tr:nth-child(3){animation-delay:.1s}
.rt-enter .rt-list>*:nth-child(4),.rt-enter .rt-tbl tr:nth-child(4){animation-delay:.14s}
.rt-enter .rt-list>*:nth-child(5),.rt-enter .rt-tbl tr:nth-child(5){animation-delay:.19s}
.rt-enter .rt-list>*:nth-child(n+6),.rt-enter .rt-tbl tr:nth-child(n+6){animation-delay:.24s}

/* Смена раздела — пункты меню въезжают */
.kgs-swap .kgs-link,.kgs-swap .kgs-grp{animation:rtSlideIn .32s var(--ease-out) both;animation-delay:calc(var(--i,0) * 28ms)}

/* Наведение и нажатие */
.btn,.btn-icon,.kgs-link,.progtab,.ab-link,.rt-row,.rt-tbl tr,.rt-env,.tb-user,.rt-acc,.kgs-logout{
  transition:background-color .15s,color .15s,border-color .15s,box-shadow .2s,transform .14s var(--ease-out),opacity .15s}
.btn:active,.btn-icon:active,.kgs-link:active,.progtab:active{transform:scale(.97)}
@media (hover:hover){
  a.rt-sec,.rt-sec,.rt-kpi{transition:transform .25s var(--ease-out),box-shadow .25s var(--ease-out),border-color .2s}
  a.rt-sec:hover,.rt-sec:hover{transform:translateY(-2px);box-shadow:0 14px 28px -16px var(--c,hsl(var(--primary)))}
  .rt-kpi:hover{transform:translateY(-2px);box-shadow:0 10px 22px -16px hsl(var(--foreground)/.4)}
  .rt-row:hover{background:hsl(var(--muted)/.55)}
  .rt-tbl tr:hover td{background:hsl(var(--muted)/.4)}
  .kgs-link:hover svg,.btn-icon:hover svg{transform:scale(1.1)}
}
.kgs-link svg,.btn-icon svg{transition:transform .25s var(--ease-spring)}
.kgs-toggle svg{transition:transform .3s var(--ease-out)}
body.kg-side-collapsed .kgs-toggle svg{transform:rotate(180deg)}

/* Смена темы — цвета перетекают 400 мс */
.theme-anim,.theme-anim *,.theme-anim *::before,.theme-anim *::after{
  transition:background-color .4s,color .4s,border-color .4s,fill .4s,stroke .4s,box-shadow .4s !important}

/* Боковое меню и скрим */
body.side-anim .kg-sidebar,body.side-anim .main-layout,body.side-anim .navbar,body.side-anim .adminbar{
  transition:width .28s var(--ease-out),margin .28s var(--ease-out),padding .28s var(--ease-out),left .28s var(--ease-out)}
@media (max-width:900px){.kg-sidebar{transition:transform .28s var(--ease-out)}.side-scrim{transition:opacity .28s}}

/* Модалки и тосты: появление и уход */
.rt-modal{animation:rtFade .2s ease both}
.rt-modal .box{animation:rtPop .26s var(--ease-spring) both}
.rt-modal.is-leaving{animation:rtFade .16s ease reverse both}
.rt-modal.is-leaving .box{animation:rtPopOut .16s ease both}
.lk-toast{animation:rtToastIn .3s var(--ease-out) both}
.lk-toast.is-leaving{animation:rtFade .2s ease reverse both}
.btn-icon.is-ping svg{animation:rtPing 1.1s var(--ease-out)}
.lk-typing i{display:inline-block;width:6px;height:6px;margin:0 2px;border-radius:50%;background:hsl(var(--muted-foreground));animation:rtBlink 1.2s infinite}
.lk-typing i:nth-child(2){animation-delay:.2s}.lk-typing i:nth-child(3){animation-delay:.4s}
.lk-empty svg{animation:lk-float 3.2s ease-in-out infinite}
@keyframes lk-float{0%,100%{transform:translateY(0)}50%{transform:translateY(-4px)}}

@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none !important;transition:none !important}
}
