{
if (!G.img) return html`<div>Loading image...</div>`;
const canvas = DOM.canvas(G.sizes.x, G.sizes.y);
const ctx = canvas.getContext("2d");
if (!window.portalLastPosition) {
window.portalLastPosition = { x: 300, y: 200 };
}
const startTime = Date.now();
const targetPosition = { x: portalPosition.x, y: portalPosition.y };
const easeOutCubic = (t) => 1 - Math.pow(1 - t, 3);
const duration = G.duration;
function animate() {
const elapsed = Date.now() - startTime;
const t = Math.min(elapsed / duration, 1);
const progress = easeOutCubic(t);
const currentX =
window.portalLastPosition.x +
(targetPosition.x - window.portalLastPosition.x) * progress;
const currentY =
window.portalLastPosition.y +
(targetPosition.y - window.portalLastPosition.y) * progress;
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.globalAlpha = 0.4;
ctx.drawImage(G.img, 0, 0, canvas.width, canvas.height);
ctx.save();
ctx.globalAlpha = 1.0;
ctx.beginPath();
ctx.arc(currentX, currentY, G.radius, 0, Math.PI * 2);
ctx.clip();
ctx.drawImage(G.img, 0, 0, canvas.width, canvas.height);
ctx.restore();
if (t < 1) {
requestAnimationFrame(animate);
} else {
window.portalLastPosition = { x: targetPosition.x, y: targetPosition.y };
}
}
animate();
return canvas;
}