• #Basic Animation

    function animate(timing, draw, duration) {
      return new Promise((resolve) => {
        const start = performance.now();
        requestAnimationFrame(function _animate(time) {
          let timeFraction = (time - start) / duration;
          if (timeFraction > 1) timeFraction = 1;
    
          const progress = timing ? timing(timeFraction) : timeFraction;
          draw(progress);
    
          if (timeFraction < 1) {
            requestAnimationFrame(_animate);
          } else {
            resolve();
          }
        });
      });
    }