const cursorDot: HTMLElement | null = document.querySelector('[data-cursor]'); const cursorOutline: HTMLElement = document.createElement('div'); const allLinksAndButtons: NodeListOf = document.querySelectorAll('a, button'); let outlineDelay: number | null; cursorDot?.classList.add('cursor-dot'); cursorOutline.classList.add('cursor-outline'); let cursorOutlineSize: number = 30; cursorDot?.after(cursorOutline); if (cursorDot && "getAttribute" in cursorDot) { outlineDelay = Number(cursorDot.getAttribute("data-cursor-delay")); } window.addEventListener('load', () => { cursorOutlineSize = cursorOutline.offsetWidth; }); window.addEventListener('mousemove', function (e) { const posX: number = e.clientX; const posY: number = e.clientY; if (cursorDot && cursorOutline) { if ("style" in cursorDot) { cursorDot.style.left = `${posX}px`; cursorDot.style.top = `${posY}px`; } if (outlineDelay) { cursorOutline.animate({ left: `${posX}px`, top: `${posY}px` }, {duration: outlineDelay, fill: "forwards"}); } else { cursorOutline.animate({ left: `${posX}px`, top: `${posY}px` }, {duration: 300, fill: "forwards"}); } } }) allLinksAndButtons.forEach((item) => { item.onmouseover = () => { if("style" in cursorOutline) { cursorOutline.style.width = cursorOutlineSize * 1.25 + 'px' cursorOutline.style.height = cursorOutlineSize * 1.25 + 'px' } } item.onmouseout = () => { if("style" in cursorOutline) { cursorOutline.style.width = cursorOutlineSize + 'px' cursorOutline.style.height = cursorOutlineSize + 'px' } } });