Like we discussed in the replies, for future readers, the solution was to use the signals from the button node to keep track of UI events (focus lost/gained, mouse hovering or not, etc), and then use an animation player node in conjunction with a childed texture rect to make custom animations