[feat] add button side-to-side dragging with snap-back to origin