I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.
Code: https://github.com/vandrieu/canvas-bouncing-ball (the collision logic is in src/collision.ts)
Result/Demo: https://vandrieu.github.io/canvas-bouncing-ball/