/* игра «Убери игрушки» (sort): стили только этой игры. Селекторы без #s-sort действуют на всю страницу — новые правила пишите через #s-sort. */
/* sort */
.sort-area{position:absolute;inset:0;z-index:3;pointer-events:none}   /* позиции игрушек и корзин считает layout() в sort.js (px секции) */
#s-sort .bg{filter:saturate(.8) brightness(1.08) blur(1.5px)}
.toy{position:absolute;width:19vmin;height:19vmin;touch-action:none;pointer-events:auto;animation:pop-in .4s backwards}
.toy svg{width:100%;height:100%;pointer-events:none;filter:drop-shadow(0 .8vmin .6vmin rgba(0,0,0,.25))}
.baskets{position:absolute;inset:0;z-index:4;pointer-events:none}
.basket{position:absolute;width:24vmin;height:24vmin}
.basket svg{width:100%;height:100%;pointer-events:none}
.basket.ok{animation:chomp .4s}
.basket.no{animation:shake .4s}
.basket .inside{position:absolute;left:12%;right:12%;top:12%;height:40%;display:flex;flex-wrap:wrap;justify-content:center;align-items:flex-end;gap:2px;pointer-events:none}
.basket .inside svg{width:38%;height:auto}
.basket .inside[data-n="3"] svg,.basket .inside[data-n="4"] svg{width:30%}
.basket .inside[data-n="5"] svg,.basket .inside[data-n="6"] svg{width:24%}   /* куча не вылезает выше края корзины */

/* sort v2 */
.toy .wob{width:100%;height:100%;animation:wob 2.8s ease-in-out infinite}
/* @keyframes wob -> перенесён в core/core.css (им пользуется memory, sort) */
.eyes{transform-box:fill-box;transform-origin:50% 50%;animation:blink 4.2s infinite}
@keyframes blink{0%,93%,100%{transform:scaleY(1)}96%{transform:scaleY(.1)}}
.basket{transition:scale .15s;transform-origin:50% 100%}
.basket.new{animation:pop-in .4s backwards}
.basket.open{scale:1.14}

/* sort v3 */
.basket .tag{position:absolute;left:50%;bottom:8%;width:46%;aspect-ratio:1;translate:-50% 0;background:#fff;border-radius:50%;padding:8%;box-shadow:0 .4vmin .8vmin rgba(0,0,0,.25);pointer-events:none}
.basket .tag svg{width:100%;height:100%}
#s-sort .bg{object-position:50% 20%}

/* помощник и корзины ставит layout() в sort.js: помощник — колонка слева на ковре (или над корзинами), игрушки обходят его, кнопки и корзины */
@media (orientation:portrait){
  #s-sort .helper{left:calc(4vw + env(safe-area-inset-left));bottom:calc(2vh + 34vmin + env(safe-area-inset-bottom));width:22vmin;height:22vmin}   /* запас до первой раскладки / помощник без 3D */
}
/* помощник из семьи: размер и место на экране этой игры (их читает общий .helper.fam3d в core/core.css).
   --hp-h = высота фигуры (доля высоты экрана), --hp-x = отступ слева, --hp-y = где стоят ноги (от низа) */
#s-sort .helper.fam3d{--hp-h:42%;--hp-x:2.5vmin;--hp-y:1%}
/* портрет: ноги над корзинами (большие 32vmin + 1vh снизу), макушка под областью игрушек (50%) */
@media (orientation:portrait){#s-sort .helper.fam3d{--hp-y:calc(1vh + 33vmin);--hp-h:28%}}
/* портрет: над мамой сразу игрушки — прыжок ниже общего (8% вместо 20%), чтобы голова не заходила на игрушки */
@media (orientation:portrait){#s-sort .hp-mv.jump{animation-name:sort-hp-jump}}
@keyframes sort-hp-jump{0%{transform:translateY(0) scale(1.06,.9)}15%{transform:translateY(0) scale(.96,1.05)}50%{transform:translateY(-8%) scale(1,1)}82%{transform:translateY(0) scale(1.08,.9)}100%{transform:translateY(0) scale(1,1)}}

/* sort polish (14.10): слой эффектов, появление, живой фон. Только transform/translate/scale/opacity. План — agents/polish/sort_plan.md */
#s-sort .toy{animation:sr-drop .62s backwards}   /* падает с перелётом и сплющивается при посадке (вместо pop-in) */
@keyframes sr-drop{
  0%{translate:0 -14vmin;scale:.3;opacity:0;animation-timing-function:cubic-bezier(.5,0,.9,.6)}
  45%{translate:0 0;scale:1 1;opacity:1;animation-timing-function:ease-out}
  62%{scale:1.16 .8;animation-timing-function:ease-out}
  82%{scale:.97 1.05;animation-timing-function:ease-in-out}
  100%{scale:1 1}
}
#s-sort .basket.new{animation:sr-bpop .6s cubic-bezier(.34,1.4,.5,1) backwards}
@keyframes sr-bpop{0%{translate:0 10vmin;scale:.5 .3;opacity:0}100%{translate:0 0;scale:1 1;opacity:1}}
#s-sort .basket{transition:scale .22s cubic-bezier(.34,1.56,.64,1)}
#s-sort .basket.ok{animation:sr-ok .52s}
@keyframes sr-ok{0%{scale:1 1}20%{scale:1.14 .84}45%{scale:.94 1.08}70%{scale:1.03 .98}100%{scale:1 1}}

#s-sort .sr-fxl{position:absolute;inset:0;z-index:45;pointer-events:none;overflow:hidden}
#s-sort .sr-flash,#s-sort .sr-pulse,#s-sort .sr-veil{position:absolute;inset:0;opacity:0}
#s-sort .sr-veil{background:linear-gradient(#fff6dc,#fff)}
#s-sort .sr-pulse{background:radial-gradient(circle at 50% 60%,transparent 20%,var(--pc,#fff) 125%)}
#s-sort .sr-ring{position:absolute;width:16vmin;height:16vmin;margin:-8vmin 0 0 -8vmin;border:1vmin solid #fff;border-radius:50%;pointer-events:none}
#s-sort .sr-plus{position:absolute;font:900 7vmin/1 'Arial Rounded MT Bold',sans-serif;-webkit-text-stroke:.7vmin #fff;paint-order:stroke fill;pointer-events:none;white-space:nowrap}
#s-sort .sr-say{position:absolute;left:50%;top:24%;z-index:2;translate:-50% 0;white-space:nowrap;font:900 11vmin/1 'Arial Rounded MT Bold',sans-serif;color:#fff;-webkit-text-stroke:.9vmin #ff7aa8;paint-order:stroke fill;text-shadow:0 1vmin 0 #d6477f,0 1.6vmin 2.4vmin rgba(0,0,0,.25);pointer-events:none}
#s-sort .sr-say.rec{-webkit-text-stroke-color:#ffb300;color:#fff8d0;font-size:9vmin;text-shadow:0 1vmin 0 #c98a00,0 0 3vmin #ffe680}

/* радужная подложка финала: под игрушками, сдвиг + прозрачность */
#s-sort .sr-rainbow{position:absolute;inset:0;z-index:1;overflow:hidden;opacity:0;pointer-events:none;transition:opacity .5s ease-out}
#s-sort .sr-rainbow i{position:absolute;left:-100%;top:0;width:300%;height:100%;background:linear-gradient(100deg,#ff5b6e,#ff9f1c,#ffd23f,#5fd068,#3fa3ff,#b26cff,#ff5b6e,#ff9f1c,#ffd23f,#5fd068,#3fa3ff);animation:sr-rb 5s ease-in-out infinite alternate paused}
#s-sort.sr-rb .sr-rainbow{opacity:.22}
#s-sort.sr-rb .sr-rainbow i{animation-play-state:running}
@keyframes sr-rb{to{translate:33% 0}}

/* живой фон: свет из окна «дышит», блики, пылинки */
#s-sort .sr-sky{position:absolute;inset:0;z-index:1;pointer-events:none;overflow:hidden}
#s-sort .sr-sun{position:absolute;left:0;top:0;width:100%;height:60%;background:radial-gradient(ellipse at 52% 0%,rgba(255,236,150,.55),transparent 62%);opacity:.25;animation:sr-sun 5s ease-in-out infinite alternate}
@keyframes sr-sun{to{opacity:.7}}
#s-sort .sr-gl{position:absolute;width:3.2vmin;height:3.2vmin;opacity:0;background:#fff;clip-path:polygon(50% 0,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0 50%,40% 40%);animation:sr-glint 3.4s ease-in-out infinite}
@keyframes sr-glint{0%,100%{opacity:0;scale:.3}50%{opacity:.85;scale:1}}
#s-sort .sr-mote{position:absolute;width:1.1vmin;height:1.1vmin;border-radius:50%;background:#fff;opacity:0;animation:sr-mote 9s linear infinite}
@keyframes sr-mote{0%{translate:0 0;opacity:0}20%{opacity:.6}80%{opacity:.5}100%{translate:3vmin -16vmin;opacity:0}}
@media (prefers-reduced-motion:reduce){#s-sort .sr-sun,#s-sort .sr-gl,#s-sort .sr-mote,#s-sort .toy,#s-sort .basket.new{animation:none}}
