Implement custom cursor effects across multiple project pages

This commit is contained in:
2026-07-25 21:42:54 -05:00
parent cd0ecda8f9
commit 2e68953295
11 changed files with 233 additions and 80 deletions
+21 -7
View File
@@ -9,18 +9,14 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
<a href="../index.html">Home</a>
<a href="fedl.html">FEDL</a>
<a href="omniemu.html">OmniEmu</a>
<a href="decompilations.html" class="active">Decompilations</a>
<a href="https://github.com/mileswolfallen2" target="_blank">GitHub</a>
</nav>
@@ -249,5 +245,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+20 -6
View File
@@ -9,12 +9,8 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
@@ -319,5 +315,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+21 -7
View File
@@ -9,18 +9,14 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
<a href="../index.html">Home</a>
<a href="fedl.html">FEDL</a>
<a href="omniemu.html">OmniEmu</a>
<a href="geode-mod.html" class="active">Geode Mod</a>
<a href="https://github.com/mileswolfallen2" target="_blank">GitHub</a>
</nav>
@@ -281,5 +277,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+21 -7
View File
@@ -9,18 +9,14 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
<a href="../index.html">Home</a>
<a href="fedl.html">FEDL</a>
<a href="omniemu.html">OmniEmu</a>
<a href="issue-tracker.html" class="active">Issue Tracker</a>
<a href="https://github.com/mileswolfallen2" target="_blank">GitHub</a>
</nav>
@@ -246,5 +242,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+28 -18
View File
@@ -9,18 +9,14 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
<a href="../index.html">Home</a>
<a href="fedl.html">FEDL</a>
<a href="omniemu.html">OmniEmu</a>
<a href="moon-gaming.html" class="active">Moon Gaming</a>
<a href="https://github.com/mileswolfallen2" target="_blank">GitHub</a>
</nav>
@@ -138,18 +134,14 @@
<section class="reveal">
<div class="section-divider"></div>
<h2 class="section-title">Quick Start</h2>
<div class="code-block">
<div class="code-header">
<span>Terminal</span>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2"/><path d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"/></svg>
</div>
<pre><code><span class="code-comment"># Clone the repository</span>
<span class="code-prompt">$</span> git clone https://github.com/mileswolfallen2/moon-gaming.git
<span class="code-prompt">$</span> cd moon-gaming
<code-block>
<span class="comment"># Clone the repository</span>
<span class="cmd">$</span> git clone https://github.com/mileswolfallen2/moon-gaming.git
<span class="cmd">$</span> cd moon-gaming
<span class="code-comment"># Open in browser</span>
<span class="code-prompt">$</span> open index.html</code></pre>
</div>
<span class="comment"># Open in browser</span>
<span class="cmd">$</span> open index.html
</code-block>
</section>
<footer>
@@ -271,5 +263,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+21 -7
View File
@@ -9,18 +9,14 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
<a href="../index.html">Home</a>
<a href="fedl.html">FEDL</a>
<a href="omniemu.html">OmniEmu</a>
<a href="music-app.html" class="active">Music App</a>
<a href="https://github.com/mileswolfallen2" target="_blank">GitHub</a>
</nav>
@@ -266,5 +262,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+21 -7
View File
@@ -9,18 +9,14 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
<a href="../index.html">Home</a>
<a href="fedl.html">FEDL</a>
<a href="omniemu.html">OmniEmu</a>
<a href="noto.html" class="active">Noto</a>
<a href="https://github.com/mileswolfallen2" target="_blank">GitHub</a>
</nav>
@@ -312,5 +308,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+21 -7
View File
@@ -9,18 +9,14 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
<a href="../index.html">Home</a>
<a href="fedl.html">FEDL</a>
<a href="omniemu.html">OmniEmu</a>
<a href="nova.html" class="active">Nova AI</a>
<a href="https://github.com/mileswolfallen2" target="_blank">GitHub</a>
</nav>
@@ -295,5 +291,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+20 -6
View File
@@ -9,12 +9,8 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
@@ -330,5 +326,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+21 -7
View File
@@ -9,18 +9,14 @@
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="blob-field">
<div class="blob b1"></div>
<div class="blob b2"></div>
<div class="blob b3"></div>
</div>
<div class="noise"></div>
<div class="cursor-dot" id="cursorDot"></div>
<div class="cursor-ring" id="cursorRing"></div>
<div class="flash" id="flash"></div>
<div class="toast-stack" id="toastStack"></div>
<nav class="mobile-nav">
<a href="../index.html">Home</a>
<a href="fedl.html">FEDL</a>
<a href="omniemu.html">OmniEmu</a>
<a href="rhythm-game.html" class="active">Rhythm Game</a>
<a href="https://github.com/mileswolfallen2" target="_blank">GitHub</a>
</nav>
@@ -260,5 +256,23 @@
}
})();
</script>
<script>
(function(){
var dot=document.getElementById('cursorDot');
var ring=document.getElementById('cursorRing');
if(!dot||!ring)return;
var mx=0,my=0,rx=0,ry=0;
document.addEventListener('mousemove',function(e){mx=e.clientX;my=e.clientY;dot.style.left=mx+'px';dot.style.top=my+'px';});
(function loop(){
rx+=(mx-rx)*0.15;ry+=(my-ry)*0.15;
ring.style.left=rx+'px';ring.style.top=ry+'px';
requestAnimationFrame(loop);
})();
document.querySelectorAll('a,button,.meta-chip,.tech-badge,.feature-card').forEach(function(el){
el.addEventListener('mouseenter',function(){dot.classList.add('hover');ring.classList.add('hover');});
el.addEventListener('mouseleave',function(){dot.classList.remove('hover');ring.classList.remove('hover');});
});
})();
</script>
</body>
</html>
+18 -1
View File
@@ -7,6 +7,7 @@
--accent:#FF3D9A;
--tape:#FFC93C;
--red:#FF0000;
--green:#39FF14;
--font-pixel:'Press Start 2P', monospace;
--font-mono:'Space Mono', monospace;
--font-body:'Inter', sans-serif;
@@ -23,12 +24,28 @@ body::before{
}
body::after{
content:'';position:fixed;inset:0;pointer-events:none;z-index:9998;
background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,0.12) 2px,rgba(0,0,0,0.12) 4px);
background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,0.15) 2px,rgba(0,0,0,0.15) 4px);
}
::selection{background:var(--accent);color:#000;}
a{color:inherit;text-decoration:none;}
*{cursor:none !important;}
.cursor-dot,.cursor-ring{position:fixed;top:0;left:0;pointer-events:none;z-index:99999;border-radius:50%;}
.cursor-dot{
width:6px;height:6px;background:var(--accent);
transform:translate(-50%,-50%);transition:width .2s,height .2s,background .2s;
}
.cursor-ring{
width:36px;height:36px;border:2px solid var(--accent);
transform:translate(-50%,-50%);transition:width .3s,height .3s,border-color .3s,opacity .3s;
opacity:.5;
}
.cursor-dot.hover{width:10px;height:10px;background:var(--tape);}
.cursor-ring.hover{width:50px;height:50px;border-color:var(--tape);opacity:.8;}
@media(max-width:640px){.cursor-dot,.cursor-ring{display:none;}}
@media(hover:none){.cursor-dot,.cursor-ring{display:none;}}
.container{max-width:1200px;margin:0 auto;padding:0 5vw;position:relative;z-index:2;}
/* NAV */