cool stuff

This commit is contained in:
Stephen Tafoya
2026-06-11 02:20:25 -06:00
parent 7e9bc97a27
commit aa37ed3d6f
3 changed files with 171 additions and 28 deletions

View File

@@ -17,42 +17,42 @@
</header>
<main>
<section class="hero">
<section class="hero reveal">
<div class="hero-text">
<h2>He's Just <span class="glow">Him</span></h2>
<p>Some yinglets are good. Some are great. And then there's Zeppo.</p>
</div>
</section>
<section class="facts">
<section class="facts reveal">
<h2>Why Zeppo is the Best</h2>
<div class="card-grid">
<div class="card">
<div class="card reveal" style="transition-delay: 0.1s">
<span class="emoji"></span>
<h3>Unmatched Swagger</h3>
<p>Zeppo doesn't walk into a room — he arrives. Whiskers perfectly groomed, tail held high and shelltooth sharp. He knows he's him.</p>
</div>
<div class="card">
<div class="card reveal" style="transition-delay: 0.2s">
<span class="emoji">🧠</span>
<h3>Galaxy Brain</h3>
<p>Wits sharper than a creystone blade. Zeppo could scheme his way out of any jam and still have time to steal your lunch.</p>
</div>
<div class="card">
<div class="card reveal" style="transition-delay: 0.3s">
<span class="emoji">❤️</span>
<h3>Big Heart (Literally)</h3>
<p>Despite being a tiny rodent-person, his heart is the size of a melon. Loyal, fierce, and ride-or-die for his crew.</p>
</div>
<div class="card">
<div class="card reveal" style="transition-delay: 0.4s">
<span class="emoji">🦷</span>
<h3>Magnificent Tooth</h3>
<p>Name a better dental situation. You can't. That shelltooth has 10,000 PSI of pure charisma.</p>
</div>
<div class="card">
<div class="card reveal" style="transition-delay: 0.5s">
<span class="emoji">🌪️</span>
<h3>Chaos Magnet</h3>
<p>Where Zeppo goes, adventure follows. Not always good adventure, but never boring. The universe literally cannot ignore him.</p>
</div>
<div class="card">
<div class="card reveal" style="transition-delay: 0.6s">
<span class="emoji">👑</span>
<h3>King Energy</h3>
<p>No throne needed. Zeppo rules through sheer force of personality. Say his name three times and he appears to judge you.</p>
@@ -60,7 +60,7 @@
</div>
</section>
<section class="testimonials">
<section class="testimonials reveal">
<h2>What Others Are Saying</h2>
<div class="testimonial-viewport">
<div id="testimonial-track">
@@ -80,29 +80,29 @@
</div>
</section>
<section class="stats">
<section class="stats reveal">
<h2>Zeppo by the Numbers</h2>
<div class="stat-grid">
<div class="stat">
<span class="number">100%</span>
<div class="stat reveal" style="transition-delay: 0.1s">
<span class="number" data-target="100" data-suffix="%" data-duration="1000">100%</span>
<span class="label">Pure Yinglet</span>
</div>
<div class="stat">
<span class="number"></span>
<div class="stat reveal" style="transition-delay: 0.2s">
<span class="number" data-target="100000" data-duration="2000" data-final="∞"></span>
<span class="label">Swagger Units</span>
</div>
<div class="stat">
<span class="number">11/10</span>
<div class="stat reveal" style="transition-delay: 0.3s">
<span class="number" data-target="11" data-suffix="/10" data-duration="500">11/10</span>
<span class="label">Whisker Rating</span>
</div>
<div class="stat">
<span class="number">0</span>
<div class="stat reveal" style="transition-delay: 0.4s">
<span class="number" data-target="0">0</span>
<span class="label">Enemies (They All Folded)</span>
</div>
</div>
</section>
<section class="conclusion">
<section class="conclusion reveal">
<h2>The Verdict</h2>
<p>Zeppo is the GOAT. Well, GY — Greatest Yinglet. In a world full of yinglets, he's the one you'd want on your side, in your corner, and absolutely never playing cards against.</p>
<p class="final">Zeppo. Believe the hype.</p>

View File

@@ -1004,7 +1004,11 @@
var viewport = track.parentElement;
var paused = false;
var scrollPos = 0;
var speed = 0.35;
var speed = 0.55;
while (track.scrollHeight < viewport.clientHeight * 1.5) {
track.appendChild(createElement(generateQuote()));
}
function step() {
try {
@@ -1018,6 +1022,7 @@
var distance = second.offsetTop - first.offsetTop;
if (distance > 0 && scrollPos >= distance) {
scrollPos -= distance;
track.style.transform = 'translateY(' + (-scrollPos) + 'px)';
track.removeChild(first);
track.appendChild(createElement(generateQuote()));
}
@@ -1027,8 +1032,67 @@
requestAnimationFrame(step);
}
viewport.addEventListener('mouseenter', function () { paused = true; });
viewport.addEventListener('mouseleave', function () { paused = false; });
step();
// Scroll reveal
var reveals = document.querySelectorAll('.reveal');
var revealObserver = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
entry.target.classList.add('revealed');
}
});
}, { threshold: 0.1 });
reveals.forEach(function(el) { revealObserver.observe(el); });
// Stat counter
var statsSection = document.querySelector('.stats');
if (statsSection) {
var counted = false;
var statObserver = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting && !counted) {
counted = true;
var numbers = document.querySelectorAll('.stat .number[data-target]');
numbers.forEach(function(el) {
var target = parseInt(el.getAttribute('data-target'));
var suffix = el.getAttribute('data-suffix') || '';
var current = 0;
if (target <= 0) return;
var duration = parseInt(el.getAttribute('data-duration')) || 1000;
var final = el.getAttribute('data-final');
var ticks = Math.min(target, Math.floor(duration / 10));
var step = Math.max(1, Math.floor(target / ticks));
var intervalMs = Math.max(10, Math.floor(duration / ticks));
var timer = setInterval(function() {
current += step;
if (current >= target) {
current = target;
clearInterval(timer);
if (final) {
el.textContent = final;
return;
}
}
el.textContent = current + suffix;
}, intervalMs);
});
}
});
}, { threshold: 0.5 });
statObserver.observe(statsSection);
}
// Sparkle particles
for (var i = 0; i < 25; i++) {
var dot = document.createElement('div');
dot.className = 'particle';
dot.style.left = Math.random() * 100 + '%';
dot.style.top = Math.random() * 100 + '%';
dot.style.animationDelay = Math.random() * 5 + 's';
dot.style.animationDuration = (3 + Math.random() * 4) + 's';
dot.style.width = (2 + Math.random() * 3) + 'px';
dot.style.height = dot.style.width;
document.body.appendChild(dot);
}
})();

View File

@@ -7,6 +7,43 @@
--accent-dim: #b87d1a;
--text: #e8e8ee;
--muted: #8888a0;
--glow-rgb: 245, 166, 35;
}
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(30px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes pulse {
0%, 100% { opacity: 1; filter: drop-shadow(0 0 20px rgba(var(--glow-rgb), 0.3)); }
50% { opacity: 0.85; filter: drop-shadow(0 0 40px rgba(var(--glow-rgb), 0.5)); }
}
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-8px); }
}
@keyframes twinkle {
0%, 100% { opacity: 0; transform: scale(0.5); }
50% { opacity: 0.6; transform: scale(1); }
}
@keyframes breathe {
0%, 100% { box-shadow: 0 0 20px rgba(var(--glow-rgb), 0.1); }
50% { box-shadow: 0 0 40px rgba(var(--glow-rgb), 0.25); }
}
.reveal {
opacity: 0;
transform: translateY(30px);
transition: opacity 0.7s ease, transform 0.7s ease;
}
.reveal.revealed {
opacity: 1;
transform: translateY(0);
}
* {
@@ -23,6 +60,18 @@ body {
overflow-x: hidden;
}
/* Sparkle particles */
.particle {
position: fixed;
width: 3px;
height: 3px;
background: var(--accent);
border-radius: 50%;
pointer-events: none;
z-index: -1;
animation: twinkle 4s ease-in-out infinite;
}
header {
text-align: center;
padding: 4rem 1rem 2rem;
@@ -64,7 +113,8 @@ h1 {
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
text-shadow: 0 0 40px rgba(245, 166, 35, 0.3);
animation: pulse 3s ease-in-out infinite;
filter: drop-shadow(0 0 30px rgba(var(--glow-rgb), 0.3));
}
.hero p {
@@ -99,12 +149,13 @@ section h2 {
border: 1px solid #2a2a3a;
border-radius: 1rem;
padding: 2rem;
transition: transform 0.2s, border-color 0.2s;
transition: transform 0.3s, border-color 0.3s, box-shadow 0.3s;
}
.card:hover {
transform: translateY(-4px);
border-color: var(--accent-dim);
transform: translateY(-6px);
border-color: var(--accent);
box-shadow: 0 8px 32px rgba(var(--glow-rgb), 0.12);
}
.card .emoji {
@@ -142,6 +193,13 @@ section h2 {
border-radius: 0.75rem;
padding: 1.5rem;
margin-bottom: 1rem;
transition: transform 0.3s, border-color 0.3s, box-shadow 0.3s;
}
.testimonial:hover {
transform: translateX(4px);
border-color: var(--accent-dim);
box-shadow: 0 4px 20px rgba(var(--glow-rgb), 0.08);
}
.testimonial p {
@@ -169,6 +227,13 @@ section h2 {
border: 1px solid #2a2a3a;
border-radius: 1rem;
padding: 2rem 1rem;
transition: transform 0.3s, border-color 0.3s, box-shadow 0.3s;
}
.stat:hover {
transform: scale(1.05);
border-color: var(--accent-dim);
box-shadow: 0 4px 24px rgba(var(--glow-rgb), 0.1);
}
.stat .number {
@@ -207,6 +272,8 @@ section h2 {
-webkit-text-fill-color: transparent;
background-clip: text;
margin-top: 1.5rem !important;
animation: float 3s ease-in-out infinite;
filter: drop-shadow(0 0 20px rgba(var(--glow-rgb), 0.2));
}
footer {
@@ -220,10 +287,22 @@ footer {
.testimonial-viewport {
overflow: hidden;
max-height: 320px;
max-height: 480px;
position: relative;
}
.testimonial-viewport::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 48px;
background: linear-gradient(#151520, transparent);
pointer-events: none;
z-index: 1;
}
.testimonial-viewport::after {
content: '';
position: absolute;