Hi, thanks for all the Godot addons you've uploaded!
I am having a problem with the pop function in Juice, though - I have a texture button that I call pop() on the mouse entered signal. The issue is that if I move the mouse outside of the button and back in again before the tween finishes, no new pop starts because the first tween is still in progress. However, it seems that under the hood, the new tween is firing too, but not actually scaling the button. So it's possible to keep stacking invisible tweens - any new ones added to the stack will fail because a previous tween is still running. This isn't a problem for quick pops, but if the duration is set to something higher, like 1 second, it starts to become a problem.
I'm not a GDScript master, but I looked into it a little and it seems that Godot tweens just have this issue - stacking tweens without using SubTweens causes problems. So I guess the "right" way to do it would be to store the initial scale of the node, the tween, and the node in some kind of persistent way, then kill() the tween and manually restore the node's scale if the tween is running when it's triggered again. I'm sure there will be issues with doing all that, too, though.
In the meantime I found an addon called DampedOscillator that can do a similar pop, but uses an animation instance scene instead of tweening, and fwiw it doesn't have this problem.
You were right, and your diagnosis was right too - that is exactly the fix.
Two bugs, one cause. The one you hit: pop() never killed the running tween, so two tweens fought over `scale` every frame and the new pop looked like it did nothing.
The one underneath, which I only found because you reported this: `var base = node.scale` read the CURRENT scale. Mid-animation that is a point on the elastic curve, not the rest scale - and it became the new "base", so the node never returned to its real size. Repro: five pops, each interrupted after two frames. Old code ended at scale 0.9089 instead of 1.0000.
flash() had the same defect: stacked tweens, and it faded back to a hardcoded white, so any node whose modulate was not white got repainted permanently.
Fixed in 1.1.0, live now. The rest scale (and colour) is stored per node, the running tween is killed on retrigger, and the exact rest value is restored on finish - TRANS_ELASTIC can land a hair off. Also added pop_reset(node) for when you resize a node on purpose between pops. There is a headless regression test in the repo that fails on the old code and passes on the new one, so this cannot come back silently.
Thanks for writing it up that carefully - it saved everyone who installs this next. The itch download has 1.1.0; pushing the same commit to GitHub is still pending on my side.