I just laughed out loud at the ridiculousness of my oversight. Scrub with a number is literally exactly what I was looking for. Thats embarrassing. I even ended up implementing a solution similar to the one I was looking at from that site.
Inside the mounted function in my vue app I had this code: (didnt think I needed to add to a codepen since its convoluted and your suggestion accomplishes the same thing easier)
const proxy = { value: 0 };
this.animationTimelines = [
new gsap.TimelineMax({
paused: true,
ease: gsap.Power3.easeOut,
onUpdate: () => {
console.log('Real update');
}
})
];
const that = this;
this.scrollTriggers = [
new gsap.TimelineMax({
scrollTrigger: {
trigger: "#bio",
scrub: true,
start: "top top",
end: "bottom top"
},
onUpdate: () => {
console.log('psuedo update');
let unrefinedProgress = that.scrollTriggers[0].progress()
let currentProgress = unrefinedProgress.toFixed(6);
gsap.TweenLite.to(that.animationTimelines[0], 0.8, {
progress: currentProgress,
ease: gsap.Power3.easeOut
});
}
})
.to(proxy, 1, { value: 1 })
]
//okay now add the actual animation
this.animationTimelines[0]
.fromTo('#bio-container .bio-animation-wrapper',
{ opacity: 1, rotationX: 0, scale: 1, y: 0, z: 0, transformOrigin: "50% 50% -100px" },
{ opacity: 1, rotationX: 90, y: 100, z: -100, duration: 0.5 })
.fromTo('#bio-container .bio-animation-wrapper',
{ height: '160' },
{ height: '0px' },
'-=.5')