cool stuff
This commit is contained in:
38
index.html
38
index.html
@@ -17,42 +17,42 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main>
|
<main>
|
||||||
<section class="hero">
|
<section class="hero reveal">
|
||||||
<div class="hero-text">
|
<div class="hero-text">
|
||||||
<h2>He's Just <span class="glow">Him</span></h2>
|
<h2>He's Just <span class="glow">Him</span></h2>
|
||||||
<p>Some yinglets are good. Some are great. And then there's Zeppo.</p>
|
<p>Some yinglets are good. Some are great. And then there's Zeppo.</p>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="facts">
|
<section class="facts reveal">
|
||||||
<h2>Why Zeppo is the Best</h2>
|
<h2>Why Zeppo is the Best</h2>
|
||||||
<div class="card-grid">
|
<div class="card-grid">
|
||||||
<div class="card">
|
<div class="card reveal" style="transition-delay: 0.1s">
|
||||||
<span class="emoji">⚡</span>
|
<span class="emoji">⚡</span>
|
||||||
<h3>Unmatched Swagger</h3>
|
<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>
|
<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>
|
||||||
<div class="card">
|
<div class="card reveal" style="transition-delay: 0.2s">
|
||||||
<span class="emoji">🧠</span>
|
<span class="emoji">🧠</span>
|
||||||
<h3>Galaxy Brain</h3>
|
<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>
|
<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>
|
||||||
<div class="card">
|
<div class="card reveal" style="transition-delay: 0.3s">
|
||||||
<span class="emoji">❤️</span>
|
<span class="emoji">❤️</span>
|
||||||
<h3>Big Heart (Literally)</h3>
|
<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>
|
<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>
|
||||||
<div class="card">
|
<div class="card reveal" style="transition-delay: 0.4s">
|
||||||
<span class="emoji">🦷</span>
|
<span class="emoji">🦷</span>
|
||||||
<h3>Magnificent Tooth</h3>
|
<h3>Magnificent Tooth</h3>
|
||||||
<p>Name a better dental situation. You can't. That shelltooth has 10,000 PSI of pure charisma.</p>
|
<p>Name a better dental situation. You can't. That shelltooth has 10,000 PSI of pure charisma.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card reveal" style="transition-delay: 0.5s">
|
||||||
<span class="emoji">🌪️</span>
|
<span class="emoji">🌪️</span>
|
||||||
<h3>Chaos Magnet</h3>
|
<h3>Chaos Magnet</h3>
|
||||||
<p>Where Zeppo goes, adventure follows. Not always good adventure, but never boring. The universe literally cannot ignore him.</p>
|
<p>Where Zeppo goes, adventure follows. Not always good adventure, but never boring. The universe literally cannot ignore him.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="card">
|
<div class="card reveal" style="transition-delay: 0.6s">
|
||||||
<span class="emoji">👑</span>
|
<span class="emoji">👑</span>
|
||||||
<h3>King Energy</h3>
|
<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>
|
<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>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="testimonials">
|
<section class="testimonials reveal">
|
||||||
<h2>What Others Are Saying</h2>
|
<h2>What Others Are Saying</h2>
|
||||||
<div class="testimonial-viewport">
|
<div class="testimonial-viewport">
|
||||||
<div id="testimonial-track">
|
<div id="testimonial-track">
|
||||||
@@ -80,29 +80,29 @@
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="stats">
|
<section class="stats reveal">
|
||||||
<h2>Zeppo by the Numbers</h2>
|
<h2>Zeppo by the Numbers</h2>
|
||||||
<div class="stat-grid">
|
<div class="stat-grid">
|
||||||
<div class="stat">
|
<div class="stat reveal" style="transition-delay: 0.1s">
|
||||||
<span class="number">100%</span>
|
<span class="number" data-target="100" data-suffix="%" data-duration="1000">100%</span>
|
||||||
<span class="label">Pure Yinglet</span>
|
<span class="label">Pure Yinglet</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat">
|
<div class="stat reveal" style="transition-delay: 0.2s">
|
||||||
<span class="number">∞</span>
|
<span class="number" data-target="100000" data-duration="2000" data-final="∞">∞</span>
|
||||||
<span class="label">Swagger Units</span>
|
<span class="label">Swagger Units</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat">
|
<div class="stat reveal" style="transition-delay: 0.3s">
|
||||||
<span class="number">11/10</span>
|
<span class="number" data-target="11" data-suffix="/10" data-duration="500">11/10</span>
|
||||||
<span class="label">Whisker Rating</span>
|
<span class="label">Whisker Rating</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="stat">
|
<div class="stat reveal" style="transition-delay: 0.4s">
|
||||||
<span class="number">0</span>
|
<span class="number" data-target="0">0</span>
|
||||||
<span class="label">Enemies (They All Folded)</span>
|
<span class="label">Enemies (They All Folded)</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="conclusion">
|
<section class="conclusion reveal">
|
||||||
<h2>The Verdict</h2>
|
<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>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>
|
<p class="final">Zeppo. Believe the hype.</p>
|
||||||
|
|||||||
72
script.js
72
script.js
@@ -1004,7 +1004,11 @@
|
|||||||
var viewport = track.parentElement;
|
var viewport = track.parentElement;
|
||||||
var paused = false;
|
var paused = false;
|
||||||
var scrollPos = 0;
|
var scrollPos = 0;
|
||||||
var speed = 0.35;
|
var speed = 0.55;
|
||||||
|
|
||||||
|
while (track.scrollHeight < viewport.clientHeight * 1.5) {
|
||||||
|
track.appendChild(createElement(generateQuote()));
|
||||||
|
}
|
||||||
|
|
||||||
function step() {
|
function step() {
|
||||||
try {
|
try {
|
||||||
@@ -1018,6 +1022,7 @@
|
|||||||
var distance = second.offsetTop - first.offsetTop;
|
var distance = second.offsetTop - first.offsetTop;
|
||||||
if (distance > 0 && scrollPos >= distance) {
|
if (distance > 0 && scrollPos >= distance) {
|
||||||
scrollPos -= distance;
|
scrollPos -= distance;
|
||||||
|
track.style.transform = 'translateY(' + (-scrollPos) + 'px)';
|
||||||
track.removeChild(first);
|
track.removeChild(first);
|
||||||
track.appendChild(createElement(generateQuote()));
|
track.appendChild(createElement(generateQuote()));
|
||||||
}
|
}
|
||||||
@@ -1027,8 +1032,67 @@
|
|||||||
requestAnimationFrame(step);
|
requestAnimationFrame(step);
|
||||||
}
|
}
|
||||||
|
|
||||||
viewport.addEventListener('mouseenter', function () { paused = true; });
|
|
||||||
viewport.addEventListener('mouseleave', function () { paused = false; });
|
|
||||||
|
|
||||||
step();
|
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);
|
||||||
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
89
style.css
89
style.css
@@ -7,6 +7,43 @@
|
|||||||
--accent-dim: #b87d1a;
|
--accent-dim: #b87d1a;
|
||||||
--text: #e8e8ee;
|
--text: #e8e8ee;
|
||||||
--muted: #8888a0;
|
--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;
|
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 {
|
header {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 4rem 1rem 2rem;
|
padding: 4rem 1rem 2rem;
|
||||||
@@ -64,7 +113,8 @@ h1 {
|
|||||||
-webkit-background-clip: text;
|
-webkit-background-clip: text;
|
||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
background-clip: text;
|
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 {
|
.hero p {
|
||||||
@@ -99,12 +149,13 @@ section h2 {
|
|||||||
border: 1px solid #2a2a3a;
|
border: 1px solid #2a2a3a;
|
||||||
border-radius: 1rem;
|
border-radius: 1rem;
|
||||||
padding: 2rem;
|
padding: 2rem;
|
||||||
transition: transform 0.2s, border-color 0.2s;
|
transition: transform 0.3s, border-color 0.3s, box-shadow 0.3s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.card:hover {
|
.card:hover {
|
||||||
transform: translateY(-4px);
|
transform: translateY(-6px);
|
||||||
border-color: var(--accent-dim);
|
border-color: var(--accent);
|
||||||
|
box-shadow: 0 8px 32px rgba(var(--glow-rgb), 0.12);
|
||||||
}
|
}
|
||||||
|
|
||||||
.card .emoji {
|
.card .emoji {
|
||||||
@@ -142,6 +193,13 @@ section h2 {
|
|||||||
border-radius: 0.75rem;
|
border-radius: 0.75rem;
|
||||||
padding: 1.5rem;
|
padding: 1.5rem;
|
||||||
margin-bottom: 1rem;
|
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 {
|
.testimonial p {
|
||||||
@@ -169,6 +227,13 @@ section h2 {
|
|||||||
border: 1px solid #2a2a3a;
|
border: 1px solid #2a2a3a;
|
||||||
border-radius: 1rem;
|
border-radius: 1rem;
|
||||||
padding: 2rem 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 {
|
.stat .number {
|
||||||
@@ -207,6 +272,8 @@ section h2 {
|
|||||||
-webkit-text-fill-color: transparent;
|
-webkit-text-fill-color: transparent;
|
||||||
background-clip: text;
|
background-clip: text;
|
||||||
margin-top: 1.5rem !important;
|
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 {
|
footer {
|
||||||
@@ -220,10 +287,22 @@ footer {
|
|||||||
|
|
||||||
.testimonial-viewport {
|
.testimonial-viewport {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
max-height: 320px;
|
max-height: 480px;
|
||||||
position: relative;
|
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 {
|
.testimonial-viewport::after {
|
||||||
content: '';
|
content: '';
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
|||||||
Reference in New Issue
Block a user