/* Движение Neon (ТЗ 1711, документ 02). Переменные §2, режимы §3, keyframes для M01–M20.
   Цвета — только через токены design-tokens.css; transition на ВСЕ свойства запрещён. */
body[data-design="command-core"]{
  --ds-motion-fast:120ms;--ds-motion-hover:160ms;--ds-motion-state:200ms;--ds-motion-panel:240ms;
  --ds-motion-theme:240ms;--ds-motion-enter:360ms;--ds-motion-update:600ms;--ds-motion-chart:900ms;
  --ds-motion-stagger:40ms;--ds-ease-ui:cubic-bezier(.2,0,0,1);--ds-ease-enter:cubic-bezier(.16,1,.3,1);
  --ds-motion-play:running;
  --ds-flash-color:color-mix(in srgb,var(--ds-violet) 10%,transparent);
  --ds-sweep-opacity:.10;
}
html[data-theme="light"] body[data-design="command-core"]{
  --ds-flash-color:color-mix(in srgb,var(--ds-violet) 6%,transparent);
  --ds-sweep-opacity:.05;
}
body[data-design="command-core"][data-motion="paused"]{--ds-motion-play:paused}

/* M02/M03 — отклик кликабельных карточек и кнопок (только hover-устройства) */
@media (hover:hover) and (pointer:fine){
  body[data-design="command-core"] :where(.kcard[onclick],.card[onclick],.pcard .phead[onclick]){
    transition:transform var(--ds-motion-hover) var(--ds-ease-ui),box-shadow var(--ds-motion-hover) var(--ds-ease-ui);
  }
  body[data-design="command-core"] :where(.kcard[onclick],.card[onclick]):hover{
    transform:translateY(-2px);box-shadow:0 12px 30px var(--ds-shadow),0 0 18px var(--ds-glow);
  }
}
/* M2 (ревью 20.09): .pwd-eye (глазок пароля, translateY(-50%) в design-system.css) и
   .nav-item (M05 — пункт сайдбара меняет ТОЛЬКО заливку/кромку, не масштаб) исключены —
   иначе :active сбивал их собственное позиционирование/спеку. */
body[data-design="command-core"] :where(button,[role="button"]):not(:disabled):not(.pwd-eye):not(.nav-item):active{transform:scale(.98);transition:transform var(--ds-motion-fast) var(--ds-ease-ui)}
/* M04/M05 — строки и пункты: только заливка */
body[data-design="command-core"] :where(tbody tr>td,.nav-item,.nav-dom){transition:background-color var(--ds-motion-fast) var(--ds-ease-ui),border-color var(--ds-motion-hover) var(--ds-ease-ui)}
/* M05 (1719) — смена активного пункта: заливка и грань 160 ms, hover остаётся на 120 (M04).
   Reduced гасит через общий transition-duration:.001ms ниже по файлу. */
body[data-design="command-core"] :is(.nav-item,.nav-dom).active{transition:background-color var(--ds-motion-hover) var(--ds-ease-ui),border-color var(--ds-motion-hover) var(--ds-ease-ui),box-shadow var(--ds-motion-hover) var(--ds-ease-ui)}
/* M01 — вступление верхних панелей (контент в DOM с первого кадра) */
body[data-design="command-core"] .ds-enter{animation:dsEnter var(--ds-motion-enter) var(--ds-ease-enter) both;animation-delay:var(--ds-enter-delay,0ms)}
@keyframes dsEnter{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
/* M06/M07 — панели и диалоги */
body[data-design="command-core"] :where(.modal-bg.open > .modal,#uiConfirm > div,.ai-panel[style*="flex"]){animation:dsPanelIn var(--ds-motion-panel) var(--ds-ease-enter) 1}
@keyframes dsPanelIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
/* M07 — закрытие ассистента: обратный переход 160 ms (класс ставит assistant.js на время таймера) */
body[data-design="command-core"] .ai-panel.ai-closing{animation:dsPanelOut var(--ds-motion-hover) var(--ds-ease-ui) 1 forwards}
@keyframes dsPanelOut{from{opacity:1;transform:none}to{opacity:0;transform:translateY(8px)}}
/* M09 — изменившееся значение: затухающая заливка, без геометрии */
body[data-design="command-core"] .ds-flash{animation:dsFlash var(--ds-motion-update) var(--ds-ease-ui) 1}
@keyframes dsFlash{from{background-color:var(--ds-flash-color)}to{background-color:transparent}}
/* M10 — смена темы: один согласованный переход на разрешённых поверхностях.
   M3 (ревью 20.09): `:where(body,…)` внутри ПОТОМКОВОГО селектора никогда не совпадает
   с самим body[data-design][data-theme-transition] — body не бывает потомком самого себя,
   поэтому у body переход на смену темы не применялся вовсе. Отдельное правило на body. */
body[data-design="command-core"][data-theme-transition]{
  transition:background-color var(--ds-motion-theme) var(--ds-ease-ui),color var(--ds-motion-theme) var(--ds-ease-ui);
}
body[data-design="command-core"][data-theme-transition] :where(.panel,.card,.kcard,.pcard,.nav-side,.nav-topbar,table,th,td,input,select,textarea,.modal,.ai-panel,.dash){
  transition:background-color var(--ds-motion-theme) var(--ds-ease-ui),border-color var(--ds-motion-theme) var(--ds-ease-ui),color var(--ds-motion-theme) var(--ds-ease-ui);
}
/* M11 — скелет с редким shimmer */
body[data-design="command-core"] .ds-skel{position:relative;overflow:hidden;background:var(--ds-surface-soft);border-radius:var(--ds-radius-sm);min-height:14px}
body[data-design="command-core"] .ds-skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,var(--ds-hover),transparent);animation:dsShimmer 1800ms linear infinite;animation-play-state:var(--ds-motion-play)}
@keyframes dsShimmer{to{transform:translateX(100%)}}
/* M12 — реально работающий агент: точка/ring */
body[data-design="command-core"] .ds-pulse{animation:dsPulse 1800ms ease-in-out infinite;animation-play-state:var(--ds-motion-play)}
@keyframes dsPulse{0%,100%{opacity:.55}50%{opacity:1}}
/* M13 — спиннер 14px busy-кнопки */
body[data-design="command-core"] .ds-spin{display:inline-block;width:14px;height:14px;border:2px solid var(--ds-line-strong);border-top-color:var(--ds-indigo);border-radius:50%;animation:dsSpin 900ms linear infinite;animation-play-state:var(--ds-motion-play);vertical-align:-2px}
@keyframes dsSpin{to{transform:rotate(360deg)}}
/* 02 §5.1/§8 — офф-скрин непрерывные индикаторы тоже на паузе (общий IntersectionObserver) */
body[data-design="command-core"] :is(.ds-pulse,.ds-spin)[data-motion-visible="0"]{animation-play-state:paused}
/* C14 (программа 2164) — секция, которой MPDesign.motion запретил движение (вне экрана, скрытый
   документ, бюджет, уход с маршрута), стоит на паузе ЦЕЛИКОМ: сама секция, потомки и их
   ::before/::after. Пауза, а не снятие анимации: возврат продолжает цикл с того же места,
   вступление M01 не переигрывается. */
body[data-design="command-core"] [data-motion-section][data-motion-play="0"],
body[data-design="command-core"] [data-motion-section][data-motion-play="0"]::before,
body[data-design="command-core"] [data-motion-section][data-motion-play="0"]::after,
body[data-design="command-core"] [data-motion-section][data-motion-play="0"] *,
body[data-design="command-core"] [data-motion-section][data-motion-play="0"] *::before,
body[data-design="command-core"] [data-motion-section][data-motion-play="0"] *::after{animation-play-state:paused!important}
/* M02 — световой проход по связи (общий для схем Flow Atlas): блик ТОЛЬКО transform/opacity
   внутри линии с overflow:hidden — stroke-dashoffset запрещён (замер F06 задачи 2035: layout
   каждый кадр). Цикл 8 s, вариант --ds-fx-delay разводит соседние связи. */
body[data-design="command-core"] .ds-fx-link{position:relative;overflow:hidden}
body[data-design="command-core"] .ds-fx-link::after{content:"";position:absolute;inset:0;width:34%;
  background:linear-gradient(90deg,transparent,var(--ds-viz-edge),transparent);opacity:0;transform:translateX(-110%);
  animation:dsLinkPass 8s linear infinite;animation-delay:var(--ds-fx-delay,0s);will-change:transform,opacity}
body[data-design="command-core"] .ds-fx-link.is-v::after{inset:0;width:auto;height:34%;
  background:linear-gradient(180deg,transparent,var(--ds-viz-edge),transparent);transform:translateY(-110%);animation-name:dsLinkPassV}
@keyframes dsLinkPass{0%{opacity:0;transform:translateX(-110%)}6%{opacity:.9}40%{opacity:.9}46%{opacity:0;transform:translateX(310%)}100%{opacity:0;transform:translateX(310%)}}
@keyframes dsLinkPassV{0%{opacity:0;transform:translateY(-110%)}6%{opacity:.9}40%{opacity:.9}46%{opacity:0;transform:translateY(310%)}100%{opacity:0;transform:translateY(310%)}}
/* M03 — акцент внимания: дышит декоративная полоса/ореол (::before), текст и число неподвижны */
body[data-design="command-core"] .ds-fx-breathe{position:relative}
body[data-design="command-core"] .ds-fx-breathe::before{content:"";position:absolute;inset:-1px;border-radius:inherit;pointer-events:none;
  box-shadow:0 0 0 1px var(--ds-fx-c,var(--ds-coral)),0 0 22px color-mix(in srgb,var(--ds-fx-c,var(--ds-coral)) 30%,transparent);
  opacity:.25;animation:dsBreathe 4.5s ease-in-out infinite;will-change:opacity}
@keyframes dsBreathe{0%,100%{opacity:.25}50%{opacity:.85}}
/* M14/M15/M16/M17 — однократные появления */
body[data-design="command-core"] .ds-pop{animation:dsPop var(--ds-motion-state) var(--ds-ease-ui) 1}
@keyframes dsPop{from{opacity:0;transform:scale(.9)}to{opacity:1;transform:none}}
body[data-design="command-core"] .ds-fade{animation:dsFade var(--ds-motion-hover) var(--ds-ease-ui) 1}
@keyframes dsFade{from{opacity:0}to{opacity:1}}
body[data-design="command-core"] :where(#tcBellCnt,.tc-btn-cnt):not([style*="none"]),
body[data-design="command-core"] .tct-btn-cnt{animation:dsBadge var(--ds-motion-state) var(--ds-ease-ui) 1}
@keyframes dsBadge{from{opacity:0;transform:scale(.95)}to{opacity:1;transform:none}}
/* M17 (1719) — toast: вход 200 ms (opacity 0→1, translateY −8→0: стек живёт сверху), выход 160 ms
   классом .out — его ставит ui.js и снимает узел по длительности из вычисленного стиля, не «220 на глаз». */
body[data-design="command-core"] .ui-toast{transition:opacity var(--ds-motion-state) var(--ds-ease-ui),transform var(--ds-motion-state) var(--ds-ease-enter)}
body[data-design="command-core"] .ui-toast:not(.in){transform:translateY(-8px)}
body[data-design="command-core"] .ui-toast.out{opacity:0;transition-duration:var(--ds-motion-hover)}
/* M18 — орбита знака: только точка, 16 s */
body[data-design="command-core"] .brand-orbit-dot{animation:dsOrbit 16s linear infinite;animation-play-state:var(--ds-motion-play)}
@keyframes dsOrbit{to{transform:rotate(360deg)}}
/* M19 — свет в верхней зоне: только opt-in [data-neon-ambient="hero"], 1 проход 1600 ms каждые 24 s */
:where(body[data-design="command-core"] [data-motion-plate="ambient"]){position:relative}
body[data-design="command-core"] [data-motion-plate="ambient"] > .ds-motion-surface{
  position:absolute;inset:0;overflow:hidden;border-radius:inherit;pointer-events:none;z-index:var(--ds-z-base);
}
body[data-design="command-core"] [data-motion-plate="ambient"] > .ds-motion-surface::before{
  content:"";position:absolute;inset:-40% -60%;
  background:linear-gradient(112deg,transparent 42%,var(--ds-edge-cyan) 50%,transparent 58%);
  opacity:0;transform:translateX(70%);
  animation:dsSweep 24s linear infinite;animation-play-state:var(--ds-motion-play);
}
body[data-design="command-core"] [data-motion-visible="0"] > .ds-motion-surface::before{animation-play-state:paused}
@keyframes dsSweep{0%{opacity:0;transform:translateX(70%)}1%{opacity:var(--ds-sweep-opacity)}5.5%{opacity:var(--ds-sweep-opacity)}6.66%{opacity:0;transform:translateX(-70%)}100%{opacity:0;transform:translateX(-70%)}}
/* Советник: кольца и состояния — без scale крупного контента и смены оттенка (02 §5.3) */
body[data-design="command-core"] .adv-core-ring--one{animation:dsSpin 15s linear infinite;animation-play-state:var(--ds-motion-play)}
body[data-design="command-core"] .adv-core-ring--two{animation:dsSpinBack 10s linear infinite;animation-play-state:var(--ds-motion-play)}
@keyframes dsSpinBack{to{transform:rotate(-360deg)}}
body[data-design="command-core"] [data-ai-state="pending"] .adv-core::before,
body[data-design="command-core"] [data-ai-state="running"] .adv-core::before{animation:dsPulse 1800ms ease-in-out infinite;animation-play-state:var(--ds-motion-play)}
body[data-design="command-core"] [data-ai-state="success"] .adv-core{animation:dsPop var(--ds-motion-state) var(--ds-ease-ui) 1}
body[data-design="command-core"] [data-ai-state="quiet-fail"] .adv-core{animation:dsFade var(--ds-motion-hover) var(--ds-ease-ui) 1}
/* Просрочка — статичный статус, без вечного halo (02 §5.3) */
body[data-design="command-core"] .rv-card.rv-overdue{box-shadow:inset 0 0 0 1px var(--ds-coral)}
/* Защита редакторов и плотного контента */
body[data-design="command-core"] :where(.tc-comp,.tc-inp,.tct-inp,.tct-sel,.chat-thread,.chat-msg,.ai-msgs,.ai-msg-user,.ai-msg-bot,.kb-ed-body,.kb-editor,.tc-log){animation:none!important;transform:none!important}
body[data-design="command-core"] :where(tr,td,th,input,select,textarea,[contenteditable="true"]){animation:none!important;transform:none!important}
/* Reduced: всё выключено, контент виден */
body[data-design="command-core"][data-motion="reduced"] *,
body[data-design="command-core"][data-motion="reduced"] *::before,
body[data-design="command-core"][data-motion="reduced"] *::after{animation:none!important;transition-duration:.001ms!important;scroll-behavior:auto!important}
body[data-design="command-core"][data-motion="reduced"] .ds-motion-surface{display:none!important}
body[data-design="command-core"][data-motion="reduced"] .ds-enter{opacity:1!important;transform:none!important}
@media (prefers-reduced-motion:reduce){
  body[data-design="command-core"] *,body[data-design="command-core"] *::before,body[data-design="command-core"] *::after{animation:none!important;transition-duration:.001ms!important;scroll-behavior:auto!important}
  body[data-design="command-core"] .ds-motion-surface{display:none!important}
}
