/* ── Кнопка-«стрелка» форм кабинета (сессия 487, референс дизайнера tervio-sweep-button.html):
   пилюля 52px, справа кружок со стрелкой. Нажали — стрелка уходит из кружка, пролетает через
   кнопку и сдувает буквы, кнопка переворачивается: на обороте точки, пока сервер отвечает, в
   конце — галочка (там, где форма остаётся на месте). Логика — sweep() в скрипте. */
.tv-scene{display:block;perspective:900px;position:relative;margin-top:8px}
.tv-btn{--tv-front-1:#3B69F1;--tv-front-2:#2A55E2;--tv-back-1:#2E5AE4;--tv-back-2:#2348CC;--tv-sweep:420ms;
  position:relative;display:block;width:100%;height:52px;padding:0;border:0;background:transparent;font:inherit;font-size:16px;font-weight:700;color:#fff;cursor:pointer;
  transform-style:preserve-3d;transition:transform .6s cubic-bezier(.2,.75,.25,1.15);-webkit-tap-highlight-color:transparent}
.tv-btn.danger{--tv-front-1:#E5484D;--tv-front-2:#C9302C;--tv-back-1:#D33B3F;--tv-back-2:#B42A26}
.tv-btn:focus-visible{outline:3px solid rgba(47,95,234,.45);outline-offset:4px;border-radius:999px}
.tv-btn:not([data-phase="idle"]){cursor:progress}
.tv-btn:is([data-phase="loading"],[data-phase="done"],[data-phase="reset"]){transform:rotateX(180deg)}
.tv-face{position:absolute;inset:0;border-radius:999px;overflow:hidden;backface-visibility:hidden;-webkit-backface-visibility:hidden;transition:filter .2s ease,box-shadow .2s ease}
.tv-front{background:linear-gradient(180deg,var(--tv-front-1),var(--tv-front-2));box-shadow:inset 0 1px 0 rgba(255,255,255,.35),0 8px 20px -8px rgba(40,85,230,.55)}
.tv-back{transform:rotateX(180deg);background:linear-gradient(180deg,var(--tv-back-1),var(--tv-back-2));box-shadow:inset 0 1px 0 rgba(255,255,255,.3),0 8px 20px -8px rgba(40,85,230,.55)}
.tv-btn.danger .tv-front,.tv-btn.danger .tv-back{box-shadow:inset 0 1px 0 rgba(255,255,255,.3),0 8px 20px -8px rgba(201,48,44,.6)}
.tv-label{position:absolute;inset:0;padding:0 56px;display:flex;align-items:center;justify-content:center;white-space:pre}
.tv-ch{display:inline-block;white-space:pre;transition:transform .38s cubic-bezier(.15,.8,.3,1),opacity .3s ease,filter .3s ease;transition-delay:var(--d,0ms)}
.tv-btn:is([data-phase="sweep"],[data-phase="catch"],[data-phase="loading"],[data-phase="done"]) .tv-ch{transform:translate(var(--dx),var(--dy)) rotate(var(--r));opacity:0;filter:blur(2px)}
.tv-chip{position:absolute;right:6px;top:6px;width:40px;height:40px;border-radius:999px;background:#fff;color:var(--tv-front-2);display:flex;align-items:center;justify-content:center;overflow:hidden;transition:box-shadow .2s ease}
.tv-arr{transition:transform .2s ease}
@media (hover:hover) and (pointer:fine){
.tv-btn[data-phase="idle"]:not(:disabled):hover .tv-front{filter:brightness(1.07)}
.tv-btn[data-phase="idle"]:not(:disabled):hover .tv-chip{box-shadow:0 2px 8px rgba(20,40,120,.25)}
.tv-btn[data-phase="idle"]:not(:disabled):hover .tv-arr{transform:translateX(3px)}
}
.tv-btn[data-phase="exit"] .tv-arr{transform:translateX(36px);transition:transform .18s cubic-bezier(.6,0,.9,.5)}
.tv-btn[data-phase="sweep"] .tv-arr{transform:translateX(-36px);transition:none}
.tv-btn:is([data-phase="catch"],[data-phase="loading"],[data-phase="done"]) .tv-arr{transform:none;transition:transform .26s cubic-bezier(.2,.8,.3,1)}
.tv-btn[data-phase="catch"] .tv-chip{animation:tv-pop .34s cubic-bezier(.3,1.5,.5,1)}
@keyframes tv-pop{0%{transform:scale(1)}35%{transform:scale(1.12)}100%{transform:scale(1)}}
.tv-flyer{position:absolute;top:13px;left:-64px;opacity:0;pointer-events:none}
.tv-btn[data-phase="sweep"] .tv-flyer{left:calc(100% - 50px);opacity:1;transition:left var(--tv-sweep) linear}
.tv-btn:is([data-phase="catch"],[data-phase="loading"],[data-phase="done"]) .tv-flyer{left:calc(100% - 50px);opacity:0;transition:none}
.tv-btn[data-phase="reset"] :is(.tv-ch,.tv-arr,.tv-chip,.tv-flyer){transition:none!important;animation:none!important}
.tv-layer{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;gap:8px;transition:opacity .2s ease,transform .25s ease}
.tv-dot{width:8px;height:8px;border-radius:50%;background:#fff;opacity:.55}
.tv-btn[data-phase="loading"] .tv-dot{animation:tv-hop 1s ease-in-out infinite}
.tv-btn[data-phase="loading"] .tv-dot:nth-child(2){animation-delay:.15s}
.tv-btn[data-phase="loading"] .tv-dot:nth-child(3){animation-delay:.3s}
@keyframes tv-hop{0%,60%,100%{transform:translateY(0);opacity:.55}30%{transform:translateY(-8px);opacity:1}}
.tv-done{opacity:0;transform:translateY(6px)}
.tv-chk path{stroke-dasharray:24;stroke-dashoffset:24}
.tv-btn:is([data-phase="done"],[data-phase="reset"]) .tv-dots{opacity:0;transform:scale(.6)}
.tv-btn:is([data-phase="done"],[data-phase="reset"]) .tv-done{opacity:1;transform:none}
.tv-btn:is([data-phase="done"],[data-phase="reset"]) .tv-chk path{stroke-dashoffset:0;transition:stroke-dashoffset .35s ease .12s}
.tv-btn:disabled{cursor:not-allowed}
.tv-btn:disabled .tv-front{background:var(--off);color:var(--off-text);box-shadow:none}
.tv-btn:disabled .tv-chip{background:rgba(255,255,255,.55);color:var(--off-text)}
/* ── Красная кнопка (сессия 490): обратная анимация. Стрелка в кружке разворачивается влево,
   кружок едет справа налево и сметает буквы влево, пилюля стягивается в красный круг вокруг
   кружка («дверь закрылась»), в кружке крутится ожидание, в конце рисуется галочка. ── */
.tv-btn.danger .tv-flyer{display:none}
.tv-btn.danger:is([data-phase="loading"],[data-phase="done"],[data-phase="reset"]){transform:none}
.tv-btn.danger .tv-chip{transition:transform var(--tv-sweep) cubic-bezier(.55,0,.25,1),box-shadow .2s ease}
.tv-btn.danger .tv-arr{transition:transform .22s cubic-bezier(.3,1.3,.5,1),opacity .15s ease}
.tv-btn.danger:not([data-phase="idle"]):not([data-phase="reset"]) .tv-arr{transform:rotate(180deg)}
.tv-btn.danger:is([data-phase="sweep"],[data-phase="catch"]) .tv-chip{transform:translateX(calc(52px - var(--tv-w,300px)))}
/* Свернулась у левого края — круг съезжает в центр кнопки, там ожидание и галочка. */
.tv-btn.danger:is([data-phase="loading"],[data-phase="done"]) .tv-chip{transform:translateX(calc(26px - var(--tv-w,300px) / 2));transition:transform .5s cubic-bezier(.65,0,.25,1)}
.tv-btn.danger:is([data-phase="sweep"],[data-phase="catch"],[data-phase="loading"],[data-phase="done"]) .tv-ch{transform:translate(calc(-1.6 * var(--dx)),var(--dy)) rotate(calc(-1 * var(--r)))}
.tv-btn.danger[data-phase="catch"] .tv-chip{animation:none}
.tv-btn.danger .tv-front{clip-path:inset(0 0 0 0 round 999px);transition:clip-path .45s cubic-bezier(.65,0,.25,1),filter .2s ease}
.tv-btn.danger[data-phase="catch"] .tv-front{clip-path:inset(0 calc(100% - 52px) 0 0 round 999px)}
.tv-btn.danger:is([data-phase="loading"],[data-phase="done"]) .tv-front{clip-path:inset(0 calc(50% - 26px) 0 calc(50% - 26px) round 999px);transition:clip-path .5s cubic-bezier(.65,0,.25,1)}
.tv-btn.danger[data-phase="loading"] .tv-arr{opacity:0}
.tv-btn.danger[data-phase="loading"] .tv-chip::after{content:"";position:absolute;inset:10px;border-radius:50%;border:2.5px solid currentColor;border-right-color:transparent;animation:tv-spin .7s linear infinite}
@keyframes tv-spin{to{transform:rotate(360deg)}}
.tv-chip-chk{position:absolute;opacity:0}
.tv-chip-chk path{stroke-dasharray:24;stroke-dashoffset:24}
.tv-btn.danger[data-phase="done"] .tv-arr{opacity:0}
.tv-btn.danger[data-phase="done"] .tv-chip-chk{opacity:1}
.tv-btn.danger[data-phase="done"] .tv-chip-chk path{stroke-dashoffset:0;transition:stroke-dashoffset .35s ease .05s}
.tv-btn.danger[data-phase="done"] .tv-chip{animation:tv-pop .34s cubic-bezier(.3,1.5,.5,1)}
.tv-btn.danger[data-phase="reset"] :is(.tv-front,.tv-chip,.tv-arr,.tv-ch){transition:none!important;animation:none!important}
@media (hover:hover) and (pointer:fine){.tv-btn.danger[data-phase="idle"]:hover .tv-arr{transform:translateX(-3px) rotate(180deg)}}
@media (prefers-reduced-motion:reduce){.tv-btn,.tv-btn *{transition:none!important}.tv-btn[data-phase="loading"] .tv-dot{animation:none;opacity:1}}
