Разобраны 5 роликов: A00_map (главный реф переходов), P07, P08, P10,
P13. Подробные раскладки: A00_map/, P07/,
P08/, P10/, P13/ (sheet.jpg,
keyframes/, breakdown.json, breakdown.md). Обозначения: f = кадр (с 1),
«dur» в кадрах при 30 fps (P13 при 24), кривые по GSAP. Числа взяты из
замеров по кадрам (OpenCV, ink-bbox, яркость), ~ = оценка
глазом.
Короткий ответ на «почему переходы плавные и креативные как в Map»: в A00 нет ни одной склейки. Один герой превращается в следующего, вход и выход разной длины и кривой (выход 8 кадров ease-in, вход 15–18 кадров ease-out), смена содержимого прячется в момент нулевого размера (линия, ребро) или под мазком, блюр идёт по скорости, на каждое движение свой звук.
Для каждого: раскадровка по кадрам, длительность, кривая (замер), сборка в HyperFrames (GSAP + CSS). Время в мс при 30 fps (1 кадр = 33.3 мс).
Раскадровка: f26 строка «Time to get sleep» стоит. f27 снизу в кадр
заезжает диск часов. f28–31 диск идёт вверх, строка начинает
раздвигаться с задержкой 1 кадр. f33 диск на месте, f36 строка раскрыта
на 90%, f42 покой. Длительность: подъём 15 кадров (500 мс); раздвижка 16
кадров (533 мс). Кривая замеров: подъём нижнего края 92%→60% высоты:
expo.out (rmse .014) [0 / .78 / .95 / .99 / 1]; левый край строки
26%→14% ширины, правый 73%→90%: power2.out [0 / .45 / .82 / .94 / 1].
Блюр: вертикальный на диске в f27–31. Сборка: строка во flex-контейнере
с justify-content:center; вставка — отдельный
flex-элемент.
// вход снизу: expo.out; раздвижка строки: power2.out с задержкой 1 кадр
tl.fromTo(clock,{yPercent:140,opacity:0,filter:'blur(10px)'},
{yPercent:0,opacity:1,filter:'blur(0px)',duration:.5,ease:'expo.out'},t);
tl.fromTo(clock,{width:0},{width:112,duration:.5,ease:'power2.out'},t+.033);Строка раздвигается автоматически (flex). Ширина вставки 112 px = 15.5% от 720. Без пружины, без overshoot.
Раскадровка: f64 слова держатся, f65 вокруг часов кольцо (red hairline) диаметром 91 px, f66–69 кольцо растёт 102→126 px (за 5 кадров +38%), f69–71 гаснет; одновременно слова срываются по отдельным траекториям (Time влево-вверх с поворотом −10° и scale 1.3, get scale 1.4, sleep вправо +12°), часы уменьшаются 145→101 px и тают, снизу поднимается карточка (f78–84). Длительность 26 кадров (867 мс). Кольцо ~power1.out; слова power2.in 0.5 с. Сборка:
tl.fromTo(ring,{scale:1,opacity:1},{scale:1.38,opacity:0,duration:.17,ease:'power1.out'},t)
words.forEach((w,i)=>tl.to(w,{x:dx[i],y:dy[i],rotation:r[i],scale:s[i],opacity:0,filter:'blur(6px)',duration:.5,ease:'power2.in'},t+.03));Ring = border 1.5px, цвет ~#ff5a6e. Параметры слов: Time {x:−140,y:−60,rot:−10,s:1.3}, to {y:+90}, get {x:+60,y:+40,rot:−12,s:1.4}, sleep {x:+220,rot:+12} (в px при 720).
Раскадровка: f84–130 карточки по одной садятся снизу (шаг ~10
кадров), стопка из 5. f124–134 стопка ускоряется вверх с блюром
(ease-in), f131–134 пусто, f135 снизу появляется блок «пункт управления»
(верх 90% высоты), f136–147 поднимается к 31%. Длительность 18 кадров
(600 мс). Подъём: top-край 331→112 px за 12 кадров (400 мс), power2.out
[0 / .55 / .84 / .96 / 1] (rmse .024). Сборка: выход
y:-120%, filter:'blur(14px)', power2.in, .35
с; вход yPercent:100→0, power2.out, .4 с. Зазор между
выходом и входом 3 кадра (100 мс) — «вдох».
Раскадровка: f170 блок на месте, f172 лёгкий 3D-наклон, f174–177 высота падает 109→22 px, f178 линия толщиной 3 px (ширина 175 px сохранена, центр y=193 px из 367), f179 из линии растёт карта, f180–186 высота 3→50 px, f187–192 55→65 + маркер. Длительность 22 кадра (733 мс): схлопывание 8 кадров (233 мс), sine.inOut [0 / .10 / .41 / .76 / 1] (rmse .069); разворот 14 кадров (433 мс), sine.out/power1.out [0 / .43 / .72 / .94 / 1] (rmse .019). Блюр: горизонтальный 4 px на линии. Сборка:
tl.to(a,{scaleY:.03,duration:.26,ease:'sine.inOut'},t)
.set(a,{autoAlpha:0}).set(b,{autoAlpha:1,scaleY:.04})
.to(b,{scaleY:1,rotationX:62,duration:.43,ease:'sine.out'});Центр сохраняется (transform-origin 50% 50%) — склейка невидима.
Раскадровка: f236–243 карта поворачивается вокруг вертикальной оси (ширина 185→36 px), f244 почти нулевая линия, f245 уже карточка будильника (24 px), f246–254 раскрывается до 194 px. Длительность 19 кадров (633 мс): выход 8 кадров (233 мс) power1.in/power2.in [0 / .05 / .19 / .62 / 1]; вход 18 кадров (567 мс) power3.out [0 / .70 / .91 / .98 / 1] (rmse .032). Сборка:
gsap.set(stage,{perspective:900});
tl.to(a,{rotationY:88,filter:'blur(5px)',duration:.25,ease:'power2.in'},t)
.set(a,{autoAlpha:0}).set(b,{autoAlpha:1,rotationY:-88,filter:'blur(5px)'})
.to(b,{rotationY:0,filter:'blur(0px)',duration:.57,ease:'power3.out'});Асимметрия: вход вдвое длиннее выхода.
Раскадровка: f281 тумблер включается (#38c45c), справа заезжает серый
размытый мазок; f291–294 второй мазок идёт сверху к карточке; f295
вместо карточки уже панель сообщения (склейка под мазком, diff 2.17),
панель выравнивается из −10° в 0. Длительность 19 кадров (633 мс). Мазок
4–5 кадров, блюр 20+ px. Сборка: div-полоса с
filter:blur(12px),
linear-gradient(90deg,transparent,#666 60%,transparent),
rotate −35°, x:-40%→120% за 0.13 с power1.in;
на 3-м кадре set замена слоя.
Раскадровка: f73 плитка 1 выглядывает справа (288 из 360 px), f74
плитка 2 стартует, f75 плитка 3, f76 всё на ~162 px, f90 садятся (120
px). Длительность 17 кадров (567 мс), задержка между плитками 1 кадр (33
мс). Кривая: circ.out/expo.out [0 / .66 / .88 / .97 / 1] (rmse .014), 20
кадров до полного покоя. Блюр горизонтальный 20–30 px на первых 3
кадрах. Сборка:
gsap.from(tiles,{x:360,filter:'blur(14px)',opacity:0,duration:.5,ease:'expo.out',stagger:.033}).
Раскадровка: f91 плитки со слегка волнистыми краями, f94 края плывут
(displacement), f97 плитки сжаты в вертикальную каплю, f100 зелёное
пятно с надписью, f103–109 растекается в пилюлю «Done ✓». Длительность
27 кадров (900 мс), ease ~power2.inOut. Сборка: SVG-фильтр на
контейнере: feTurbulence baseFrequency=.012 →
feDisplacementMap scale анимировать 0→60 за 0.3 с; затем
feGaussianBlur stdDeviation=8 →
feColorMatrix values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 18 -7"
для порога; плитки scale 1→.2 к центру.
Раскадровка: f183 чат с белым пузырём, f184 внизу появляется зелёная «горка» с пучком штрихов на пике, f186 пик на 86% высоты, f188 на 72%, f190 на 53%, f192 на 26%, f193 на 9%, f194 пик за кадром, f195–197 боковины добирают углы (площадь 78→95%), в центре въезжает белый ярлык «Lets go!!». Длительность 13 кадров (433 мс). Кривая пика: power1.in (rmse .038) [0 / .12 / .30 / .59 / 1], то есть в основном разгон без торможения, как «поглощение». Площадь заливки: 2%, 15%, 25%, 49%, 79%, 95% (f186, 189, 190, 192, 194, 197). Цвет заливки #268102 (на экране), Wise-лайм #55e208 у объектов. Сборка: слой 100%×100%, clip-path как polygon с вогнутыми боками, обновляется из timeline (seek-safe):
const st={p:0}; tl.to(st,{p:1,duration:.33,ease:'power1.in',onUpdate:()=>{
const y=100-110*st.p, w=60+60*st.p; // %
flood.style.clipPath=`polygon(50% ${y}%, ${50+w*.3}% ${y+ (100-y)*.55}%, ${50+w}% 100%, ${50-w}% 100%, ${50-w*.3}% ${y+(100-y)*.55}%)`;}},t);Затем держать 1.3 с (40 кадров, диф≈0), чек: пузырь scale→круг→галка за 16 кадров. Выход: HARD CUT в белый (f231, diff 165) — самое сильное событие ролика.
Раскадровка: f279 иконка документа слева за краем с 5 призраками,
f282 призраки убывающей яркости (0.5→0.1), декселерация 12 кадров, f291
след растворился, f294–300 иконка на месте, f303–312 scale pop 1.0→1.2,
3D-наклон, блик-звезда. Длительность 33 кадра (1100 мс). Кривая
expo.out/power3.out. Сборка: 5 клонов иконки, stagger:.033,
opacity:.5→.1, x отстаёт по шагам (−18, −36,
−54, −72, −90 px) и сходится к 0 с expo.out .4 с.
Раскадровка: f455 точки набора, f460–472 пузырь растёт по ширине
126→246 px (power4.out [0 / .75 / .93 / .98 / 1]), текст «How do you out
reach?» печатается 21 знак за ~14 кадров, f486–496 раздувается по высоте
78→267 px (power1.in [0 / .07 / .26 / .65 / 1]), цвет бледнеет, f497–500
заменяется белым экраном «Messages». Длительность 14 кадров на раздув
(467 мс). Сборка: width 246→300, height 78→267
.37 с power1.in, borderRadius 22→28, bg
#4d92f7→#eaf1ff→#fff; содержимое экрана fade-in за 4 кадра
в конце.
Раскадровка: f97 белый список, f99 курсор у строки, f100 строка
поднята в серую карточку (scale 1.12), яркость фона 255→168 (f100)→67
(f101)→15 (f102), f103–135 тёмная тема. Обратно: f141–154 яркость 45→254
линейно. Тёмный флип: 3 кадра (100 мс) к 15; обратный: 12 кадров (400
мс) linear (rmse .014). Старт флипа точно в удар (+33 мс). Сборка:
tl.to(bg,{backgroundColor:'#0f0f0f',duration:.1,ease:'sine.out'},t);
обратно
tl.to(bg,{backgroundColor:'#fff',duration:.4,ease:'none'},t2).
Остальные пункты filter:blur(6px).
Раскадровка: f158 строка «Get your subscription», f160 справа входит
курсор с блюром, на слове «subscription» зарождается синий
прямоугольник, f162–166 растёт 45%→93% ширины и 45→97 px высоты, f166
перелёт +2% и возврат, f170–176 подпись «Joi Pro» + звезда + кнопка
Upgrade, f177–184 зум: плашка выходит за края (×~1.6) с блюром 30 px по
горизонтали, f186–196 возврат. Длительность 18 кадров (600 мс) на рост +
20 кадров (667 мс) зум. Кривая: power3.out + микро-overshoot
(back.out(1.2)). Сборка:
tl.fromTo(pill,{scaleX:.45},{scaleX:.93,duration:.22,ease:'back.out(1.2)'},t);
зум: scale 1→1.6 .2 с power2.in + blur(18px);
затем 1.6→1 .3 с power3.out.
Раскадровка: f232–233 бирюзовый каст, f234 диагональная оранжевая
полоса слева, f235–236 раздувается на половину кадра (яркость
54→88→103), f237 жёсткая склейка на новую сцену (яркость 45).
Длительность 5 кадров (167 мс), склейка на 4-м кадре, после — хвост
цветокора 3–5 кадров. Сборка: div,
background:linear-gradient(100deg,transparent 30%,#ff9a2f 48%,#fff4c2 52%,transparent 70%),
mix-blend-mode:screen, rotate(12deg),
x:-120%→120% за 0.13 с power1.in;
tl.set(sceneA,{autoAlpha:0},t+.1).set(sceneB,{autoAlpha:1},t+.1).
Раскадровка: f423–424 яркость 243, f425 199 (мигание), f426 245
(белый кадр), f427 жёсткая склейка на лицо (58) с синим отливом, f429
зелёный, f431 нейтраль (45). Длительность 6 кадров вспышки + 5 кадров
хвоста (367 мс). Рост яркости linear 3 кадра. Сборка:
white.opacity 0→1 за 0.1 с linear, hold 0.07
с, hard cut, tint.opacity .6→0 за 0.17 с, tint
#2f4bff→#38c46a.
Раскадровка (24 fps): f12 белая капсула у правого края, f13 кадр
#fbe18c (яркость 220), f14 кадр #eb0836 (78), f15 тёмный с красной
точкой (29). Строб f83 жёлтый → f84 красный → f85 жёлтый → f86 тёмный.
Длительность 1–3 кадра (42–125 мс). Герой остаётся на месте и
инвертируется (чёрный на жёлтом, белый на красном). Сборка: fills
div 100%×100% на 1 кадр
(tl.set(fill,{background:'#fbe18c'},t).set(fill,{background:'#eb0836'},t+1/24).set(fill,{opacity:0},t+2/24));
бит 14 кадров (103 BPM).
Раскадровка: f1080 видео на весь кадр, f1084 высота 589 px из 640,
f1088 543, f1090 533, f1094 525 (покой), рамка чёрная, снизу вылетает
«“2025”». Длительность 14 кадров (467 мс), sine.out/power1.out [0 / .25
/ .75 / .95 / 1] (rmse .071). Масштаб итоговый 0.65. Сборка:
scale 1→.65, borderRadius 0→24px,
.3–.47 с sine.out; текст yPercent 60→0
power4.out .17.
| вход | где | как устроен | шаг (stagger) | кривая / блюр | сколько знаков | держится |
|---|---|---|---|---|---|---|
| Слова с разнонаправленным смещением | A00 f1–12 | слово = элемент; каждое входит с вертикальным смещением ±8–14 px (to выше, get/sleep ниже), садится на линию | 3.5 кадра (117 мс) | power3.out 0.25 с, blur 8→0 за 2 кадра | 13 букв за 0.37 с = ~35 зн/с | 68 кадров (2.3 с) на 4 слова |
| Раздвижка строки под вставку | A00 f27–42 | строка раздвигается (ширина 47%→76%) | задержка 1 кадр после вставки | power2.out 0.5 с | 17 | сохраняется |
| Печать с наклоном панели | A00 f307–321 | поле ввода печатает «Good Night», панель выравнивается −10°→0° | 1.4 кадра/знак с джиттером | steps | 10 зн за 14 кадров = 21 зн/с | 20+ кадров |
| Разлёт слов | A00 f64–83 | слова улетают по траекториям, поворот ±12°, scale 1.3–1.4, блюр | 0–2 кадра | power2.in 0.5 с | 4 слова | выход 26 кадров |
| Пословные субтитры на груди | P07 f202–1081 | 1–2 строки, слово за словом, фраза обнуляется целиком | 7–9 кадров (230–300 мс), в паре 3 кадра | pop без overshoot, блюр 4→0 | ≤25 зн; 18–20 зн/с | 15–30 кадров после последнего слова |
| Акцентное слово с блюром | P07 f519–537 | «you're just» чёрный, «ONE MORE» синий узкий курсив, слово за словом | ONE f519, MORE f524 | blur 6→0 за 3 кадра (ONE) / 12 кадров (MORE) | 12 зн | 15 кадров |
| Буквенный набор в коллаже | P07 f97–109 | b, beh, behi, behind | 2 кадра/буква (67 мс) | step | 6 букв за 0.4 с | 5+ кадров |
| Камера-отъезд с остатком | P07 f29–112 | новая фраза крупно в центре, прошлые уменьшаются до 0.63× и тускнеют | 0.8 с на фразу | power2.inOut | до 60 зн в коллаже | остаются фоном |
| Печать в пузыре | P08 f464–478, f169–181 | текст появляется в пузыре равномерно | 0.7 кадра/знак (45 зн/с) | steps | 21–23 | 20–30 кадров |
| Размазка цифр | P08 f139–145 | старая цифра размывается вертикально, новая резкая | 7 кадров | blur y 0→14→0 | 8–10 | 20+ кадров |
| Колесо цифр | P10 f3–16 | цифры 6→9 проматываются вертикально, блюр y | 3 кадра/цифра | linear steps | 1–2 | 12 кадров |
| Каскад строк | P10 f61–91 | строки списка по очереди, «призрак» первой буквы | 4–5 кадров (133–167 мс) | power3.out 0.3 с, blur 6→0 | 40–55 | 17+ |
| Цвет-морф слова | P10 f143–150 | «Get your subscription» красное→чёрное, «subscription» выше строки на 6 px | 7 кадров | power2.out | 21 | 8+ |
| Слово → пилюля | P10 f158–166 | слово превращается в кнопку | — | power3.out + 2% overshoot | 12 | 18 |
Типографические данные:
Дополнительно (в запас): эхо-след влёта для логотипов (P08), колесо цифр для счётчиков звёзд/версий (P10), контейнер-трансформ пузырь→экран (P08).
breakdown.md.~)._tmp/), перемеры
возможны заново из refs/video/*.mp4.