Ape Gang – $APEGANG – GO BANANAS OR GO HOME!
GO BANANAS OR GO HOME!
The WILDEST, FUNNIEST, MOST APE-MAZING token in the crypto jungle! $APEGANG is here to stay and play!
🍌 $APEGANG MOONING! 🚀 GET YOUR DAILY DOSE OF POTASSIUM! 💎 DIAMOND HANDS GET MORE BANANAS! 🦍 APE TOGETHER STRONK! 🎉 PARTY IN THE JUNGLE! 🍌
WHY $APEGANG? IT’S APE-IC!
We’re building a whole banana republic of FUN and UTILITY!
GET YOUR PAWS ON $APEGANG!
TOKENOMICS – BANANA-NOMICS!
CA: 0xAPESAREAWESOMEANDFUNKY123…SOON
SHILL TEXT BLAST-O-MATIC!
APE RUNNER – BANANA DASH!
document.addEventListener(‘DOMContentLoaded’, () => {
// — CONFIGURATIONS —
const launchTargetDate = “2025-06-20T00:00:00”;
const numFloatingBananas = 20; // How many bananas to float
// — CUSTOM CURSOR (Banana) —
const cursor = document.querySelector(‘.custom-cursor’);
if (cursor && !isTouchDevice()) { // Only show custom cursor on non-touch devices
document.addEventListener(‘mousemove’, e => {
cursor.style.left = e.pageX + ‘px’;
cursor.style.top = e.pageY – window.scrollY + ‘px’; // Account for scroll
});
document.body.style.cursor = ‘none’; // Hide default system cursor
} else if (cursor) {
cursor.style.display = ‘none’; // Hide if touch device
}
function isTouchDevice() {
return (‘ontouchstart’ in window) || navigator.maxTouchPoints > 0;
}
// — FLOATING BANANAS —
const bananaContainer = document.querySelector(‘.floating-banana-container’);
if (bananaContainer) {
for (let i = 0; i < numFloatingBananas; i++) {
const banana = document.createElement('div');
banana.classList.add('banana-floater');
banana.style.left = Math.random() * 100 + 'vw';
const duration = Math.random() * 8 + 7; // Random duration between 7-15 seconds
banana.style.animationDuration = duration + 's';
banana.style.animationDelay = Math.random() * duration + 's'; // Stagger start times
banana.style.setProperty('--sway', (Math.random() * 60 - 30) + 'px'); // Random sway
banana.style.transform = `scale(${Math.random() * 0.5 + 0.5})`; // Random size
bananaContainer.appendChild(banana);
}
}
// --- PARALLAX BACKGROUNDS ---
const parallaxElements = document.querySelectorAll('.parallax-bg');
parallaxElements.forEach(el => {
const bgImage = el.dataset.bgImage;
if (bgImage) {
el.style.backgroundImage = `url(‘${bgImage}’)`;
}
});
// — MOBILE MENU —
const mobileMenuToggle = document.querySelector(‘.mobile-menu-toggle’);
const mobileNav = document.querySelector(‘.mobile-nav’);
if (mobileMenuToggle && mobileNav) {
mobileMenuToggle.addEventListener(‘click’, () => {
mobileNav.classList.toggle(‘active’);
mobileMenuToggle.innerHTML = mobileNav.classList.contains(‘active’) ? ‘
‘ : ‘
‘;
});
mobileNav.querySelectorAll(‘a’).forEach(link => {
link.addEventListener(‘click’, () => {
if (mobileNav.classList.contains(‘active’)) {
mobileNav.classList.remove(‘active’);
mobileMenuToggle.innerHTML = ‘
‘;
}
});
});
}
// — LAUNCH COUNTDOWN TIMER —
// (Uses same logic as before, ensure IDs match new HTML)
const daysEl = document.getElementById(‘days’);
const hoursEl = document.getElementById(‘hours’);
const minutesEl = document.getElementById(‘minutes’);
const secondsEl = document.getElementById(‘seconds’);
const launchDateDisplayEl = document.getElementById(‘launchDateDisplay’);
if (launchDateDisplayEl) { /* … (countdown logic unchanged from previous script) … */ }
function countdown() {
const launchDate = new Date(launchTargetDate);
const currentDate = new Date();
const totalSeconds = (launchDate – currentDate) / 1000;
if (totalSeconds <= 0) {
if(daysEl) daysEl.innerHTML = '00';
if(hoursEl) hoursEl.innerHTML = '00';
if(minutesEl) minutesEl.innerHTML = '00';
if(secondsEl) secondsEl.innerHTML = '00';
const timerContainer = document.getElementById('launch-timer');
if (timerContainer) {
const parentContainer = timerContainer.parentElement;
if (parentContainer) {
const launchedMessage = parentContainer.querySelector('.launch-date-text');
if(launchedMessage) launchedMessage.innerHTML = "
APE GANG HAS LAUNCHED! 🚀“;
}
}
if (typeof countdownInterval !== ‘undefined’) clearInterval(countdownInterval);
return;
}
const days = Math.floor(totalSeconds / 3600 / 24);
const hours = Math.floor(totalSeconds / 3600) % 24;
const minutes = Math.floor(totalSeconds / 60) % 60;
const seconds = Math.floor(totalSeconds) % 60;
if(daysEl) daysEl.innerHTML = formatTime(days);
if(hoursEl) hoursEl.innerHTML = formatTime(hours);
if(minutesEl) minutesEl.innerHTML = formatTime(minutes);
if(secondsEl) secondsEl.innerHTML = formatTime(seconds);
}
function formatTime(time) { return time < 10 ? `0${time}` : time; }
if (daysEl) { // Check if timer elements exist
if (launchDateDisplayEl) {
const formattedLaunchDate = new Date(launchTargetDate).toLocaleDateString('en-US', {
year: 'numeric', month: 'long', day: 'numeric'
});
launchDateDisplayEl.textContent = formattedLaunchDate;
}
countdown();
var countdownInterval = setInterval(countdown, 1000);
}
// --- SCROLL ANIMATIONS ---
const animatedElements = document.querySelectorAll('.animate-on-scroll');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add(‘is-visible’);
observer.unobserve(entry.target);
}
});
}, { threshold: 0.1 });
animatedElements.forEach(el => observer.observe(el));
// — CONTRACT ADDRESS COPY —
const copyCAButton = document.getElementById(‘copyCAButton’);
const contractAddressEl = document.getElementById(‘contractAddress’);
if (copyCAButton && contractAddressEl) {
copyCAButton.addEventListener(‘click’, () => {
navigator.clipboard.writeText(contractAddressEl.textContent.trim())
.then(() => {
const originalText = copyCAButton.innerHTML;
copyCAButton.innerHTML = ‘
Copied!’;
setTimeout(() => { copyCAButton.innerHTML = originalText; }, 2000);
})
.catch(err => console.error(‘Failed to copy: ‘, err));
});
}
// — MEME MAKER STUB —
const memeCanvas = document.getElementById(‘memeCanvas’);
const memeCtx = memeCanvas ? memeCanvas.getContext(‘2d’) : null;
const memeImageUpload = document.getElementById(‘memeImageUpload’);
const memeTopText = document.getElementById(‘memeTopText’);
const memeBottomText = document.getElementById(‘memeBottomText’);
const generateMemeBtn = document.getElementById(‘generateMemeBtn’);
const downloadMemeBtn = document.getElementById(‘downloadMemeBtn’);
const memeFontColor = document.getElementById(‘memeFontColor’);
const memeFontSize = document.getElementById(‘memeFontSize’);
let currentMemeImage = null;
function drawMeme() {
if (!memeCtx || !memeCanvas) return;
memeCtx.clearRect(0, 0, memeCanvas.width, memeCanvas.height);
memeCtx.fillStyle = ‘#ddd’; // Default bg if no image
memeCtx.fillRect(0, 0, memeCanvas.width, memeCanvas.height);
if (currentMemeImage) {
// Calculate aspect ratio to fit image within canvas
const hRatio = memeCanvas.width / currentMemeImage.width;
const vRatio = memeCanvas.height / currentMemeImage.height;
const ratio = Math.min(hRatio, vRatio);
const centerShift_x = (memeCanvas.width – currentMemeImage.width * ratio) / 2;
const centerShift_y = (memeCanvas.height – currentMemeImage.height * ratio) / 2;
memeCtx.drawImage(currentMemeImage, 0, 0, currentMemeImage.width, currentMemeImage.height,
centerShift_x, centerShift_y, currentMemeImage.width * ratio, currentMemeImage.height * ratio);
}
memeCtx.fillStyle = memeFontColor ? memeFontColor.value : ‘#FFFFFF’;
const fontSize = memeFontSize ? parseInt(memeFontSize.value) : 40;
memeCtx.font = `bold ${fontSize}px ‘Luckiest Guy’, cursive`;
memeCtx.textAlign = ‘center’;
memeCtx.strokeStyle = ‘black’;
memeCtx.lineWidth = Math.max(1, fontSize / 15); // Stroke width relative to font size
// Top text
const topText = memeTopText ? memeTopText.value.toUpperCase() : “”;
memeCtx.strokeText(topText, memeCanvas.width / 2, fontSize * 1.2);
memeCtx.fillText(topText, memeCanvas.width / 2, fontSize * 1.2);
// Bottom text
const bottomText = memeBottomText ? memeBottomText.value.toUpperCase() : “”;
memeCtx.strokeText(bottomText, memeCanvas.width / 2, memeCanvas.height – (fontSize * 0.5));
memeCtx.fillText(bottomText, memeCanvas.width / 2, memeCanvas.height – (fontSize * 0.5));
if(downloadMemeBtn) downloadMemeBtn.style.display = ‘inline-block’;
}
if (memeImageUpload) {
memeImageUpload.addEventListener(‘change’, (e) => {
const reader = new FileReader();
reader.onload = (event) => {
currentMemeImage = new Image();
currentMemeImage.onload = () => {
drawMeme();
};
currentMemeImage.src = event.target.result;
}
if (e.target.files[0]) {
reader.readAsDataURL(e.target.files[0]);
}
});
}
if (generateMemeBtn) generateMemeBtn.addEventListener(‘click’, drawMeme);
if (memeTopText) memeTopText.addEventListener(‘input’, drawMeme);
if (memeBottomText) memeBottomText.addEventListener(‘input’, drawMeme);
if (memeFontColor) memeFontColor.addEventListener(‘input’, drawMeme);
if (memeFontSize) memeFontSize.addEventListener(‘input’, drawMeme);
if (downloadMemeBtn) {
downloadMemeBtn.addEventListener(‘click’, () => {
if (!memeCanvas) return;
const imageURL = memeCanvas.toDataURL(‘image/png’);
const link = document.createElement(‘a’);
link.href = imageURL;
link.download = ‘apegang-meme.png’;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
}
if (memeCanvas) drawMeme(); // Initial draw
// — APE RUNNER MINI-GAME STUB —
const gameCanvas = document.getElementById(‘apeRunnerGame’);
const gameCtx = gameCanvas ? gameCanvas.getContext(‘2d’) : null;
const startGameBtn = document.getElementById(‘startGameBtn’);
const restartGameBtn = document.getElementById(‘restartGameBtn’);
const gameInstructionsEl = document.getElementById(‘gameInstructions’);
const gameOverScreenEl = document.getElementById(‘gameOverScreen’);
const finalScoreEl = document.getElementById(‘finalScore’);
let gameLoop;
let player, obstacles, score, gameActive;
function initGame() {
if (!gameCtx || !gameCanvas) return;
player = { x: 50, y: gameCanvas.height – 60, width: 40, height: 50, dy: 0, onGround: true, jumpPower: 15, gravity: 0.8 };
obstacles = [];
score = 0;
gameActive = true;
if(gameInstructionsEl) gameInstructionsEl.style.display = ‘none’;
if(gameOverScreenEl) gameOverScreenEl.style.display = ‘none’;
spawnObstacle();
gameLoop = requestAnimationFrame(updateGame);
}
function drawPlayer() {
if (!gameCtx) return;
gameCtx.fillStyle = ‘brown’; // Simple ape color
gameCtx.fillRect(player.x, player.y, player.width, player.height);
// Banana in hand (very simple)
gameCtx.fillStyle = ‘yellow’;
gameCtx.fillRect(player.x + player.width -10, player.y + 10, 10, 15);
}
function drawObstacles() {
if (!gameCtx) return;
obstacles.forEach(obs => {
gameCtx.fillStyle = ‘red’; // FUD Monster color
gameCtx.fillRect(obs.x, obs.y, obs.width, obs.height);
});
}
function drawScore() {
if (!gameCtx) return;
gameCtx.fillStyle = ‘black’;
gameCtx.font = “24px ‘Luckiest Guy’, cursive”;
gameCtx.textAlign = ‘left’;
gameCtx.fillText(“Score: ” + score, 10, 30);
}
function spawnObstacle() {
if (!gameCanvas) return;
const height = Math.random() * 50 + 20; // Random height
obstacles.push({
x: gameCanvas.width,
y: gameCanvas.height – height,
width: 30,
height: height,
speed: 3 + (score / 100) // Speed increases with score
});
}
let obstacleSpawnTimer = 0;
function updateGame() {
if (!gameActive || !gameCtx || !gameCanvas) return;
gameCtx.clearRect(0, 0, gameCanvas.width, gameCanvas.height);
// Player physics
player.y += player.dy;
player.dy += player.gravity;
if (player.y + player.height >= gameCanvas.height) {
player.y = gameCanvas.height – player.height;
player.dy = 0;
player.onGround = true;
}
// Obstacles
obstacleSpawnTimer++;
if (obstacleSpawnTimer > (120 – Math.min(score / 5, 60)) ) { // Spawn faster as score increases
spawnObstacle();
obstacleSpawnTimer = 0;
}
obstacles.forEach((obs, index) => {
obs.x -= obs.speed;
if (obs.x + obs.width < 0) { // Off screen
obstacles.splice(index, 1);
score++;
}
// Collision
if (player.x < obs.x + obs.width &&
player.x + player.width > obs.x &&
player.y < obs.y + obs.height &&
player.y + player.height > obs.y) {
gameOver();
}
});
drawPlayer();
drawObstacles();
drawScore();
if (gameActive) gameLoop = requestAnimationFrame(updateGame);
}
function playerJump() {
if (player.onGround && gameActive) {
player.dy = -player.jumpPower;
player.onGround = false;
}
}
function gameOver() {
gameActive = false;
cancelAnimationFrame(gameLoop);
if(gameOverScreenEl) gameOverScreenEl.style.display = ‘block’;
if(finalScoreEl) finalScoreEl.textContent = score;
}
if (startGameBtn) startGameBtn.addEventListener(‘click’, initGame);
if (restartGameBtn) restartGameBtn.addEventListener(‘click’, initGame);
document.addEventListener(‘keydown’, (e) => {
if (e.code === ‘Space’) {
if (!gameActive && gameOverScreenEl && gameOverScreenEl.style.display === ‘block’) {
// If game over screen is shown, space can restart
// initGame(); // Or rely on button click
} else if (gameActive || (gameInstructionsEl && gameInstructionsEl.style.display !== ‘none’)) {
// If game active, or on instructions screen, space can jump/start
if (gameInstructionsEl && gameInstructionsEl.style.display !== ‘none’) initGame();
playerJump();
}
}
});
if (gameCanvas) { // Add touch to jump for mobile
gameCanvas.addEventListener(‘touchstart’, (e) => {
e.preventDefault(); // Prevent scrolling
if (gameInstructionsEl && gameInstructionsEl.style.display !== ‘none’) initGame();
playerJump();
});
}
// — FOOTER CURRENT YEAR —
const currentYearEl = document.getElementById(‘currentYear’);
if (currentYearEl) currentYearEl.textContent = new Date().getFullYear();
// — SMOOTH SCROLL FOR NAV LINKS (same as before) —
document.querySelectorAll(‘header a[href^=”#”]’).forEach(anchor => {
anchor.addEventListener(‘click’, function (e) {
e.preventDefault();
const targetId = this.getAttribute(‘href’);
const targetElement = document.querySelector(targetId);
if (targetElement) {
const headerOffset = document.querySelector(‘header’).offsetHeight || 80;
const elementPosition = targetElement.getBoundingClientRect().top;
const offsetPosition = elementPosition + window.pageYOffset – headerOffset;
window.scrollTo({ top: offsetPosition, behavior: “smooth” });
}
});
});
});
document.addEventListener(‘DOMContentLoaded’, () => {
// — CONFIGURATIONS —
const launchTargetDate = “2025-06-20T00:00:00”;
const numFloatingBananas = 20; // How many bananas to float
// — CUSTOM CURSOR (Banana) —
const cursor = document.querySelector(‘.custom-cursor’);
if (cursor && !isTouchDevice()) { // Only show custom cursor on non-touch devices
document.addEventListener(‘mousemove’, e => {
cursor.style.left = e.pageX + ‘px’;
cursor.style.top = e.pageY – window.scrollY + ‘px’; // Account for scroll
});
document.body.style.cursor = ‘none’; // Hide default system cursor
} else if (cursor) {
cursor.style.display = ‘none’; // Hide if touch device
}
function isTouchDevice() {
return (‘ontouchstart’ in window) || navigator.maxTouchPoints > 0;
}
// — FLOATING BANANAS —
const bananaContainer = document.querySelector(‘.floating-banana-container’);
if (bananaContainer) {
for (let i = 0; i < numFloatingBananas; i++) {
const banana = document.createElement('div');
banana.classList.add('banana-floater');
banana.style.left = Math.random() * 100 + 'vw';
const duration = Math.random() * 8 + 7; // Random duration between 7-15 seconds
banana.style.animationDuration = duration + 's';
banana.style.animationDelay = Math.random() * duration + 's'; // Stagger start times
banana.style.setProperty('--sway', (Math.random() * 60 - 30) + 'px'); // Random sway
banana.style.transform = `scale(${Math.random() * 0.5 + 0.5})`; // Random size
bananaContainer.appendChild(banana);
}
}
// --- PARALLAX BACKGROUNDS ---
const parallaxElements = document.querySelectorAll('.parallax-bg');
parallaxElements.forEach(el => {
const bgImage = el.dataset.bgImage;
if (bgImage) {
el.style.backgroundImage = `url(‘${bgImage}’)`;
}
});
// — MOBILE MENU —
const mobileMenuToggle = document.querySelector(‘.mobile-menu-toggle’);
const mobileNav = document.querySelector(‘.mobile-nav’);
if (mobileMenuToggle && mobileNav) {
mobileMenuToggle.addEventListener(‘click’, () => {
mobileNav.classList.toggle(‘active’);
mobileMenuToggle.innerHTML = mobileNav.classList.contains(‘active’) ? ‘
‘ : ‘
‘;
});
mobileNav.querySelectorAll(‘a’).forEach(link => {
link.addEventListener(‘click’, () => {
if (mobileNav.classList.contains(‘active’)) {
mobileNav.classList.remove(‘active’);
mobileMenuToggle.innerHTML = ‘
‘;
}
});
});
}
// — LAUNCH COUNTDOWN TIMER —
// (Uses same logic as before, ensure IDs match new HTML)
const daysEl = document.getElementById(‘days’);
const hoursEl = document.getElementById(‘hours’);
const minutesEl = document.getElementById(‘minutes’);
const secondsEl = document.getElementById(‘seconds’);
const launchDateDisplayEl = document.getElementById(‘launchDateDisplay’);
if (launchDateDisplayEl) { /* … (countdown logic unchanged from previous script) … */ }
function countdown() {
const launchDate = new Date(launchTargetDate);
const currentDate = new Date();
const totalSeconds = (launchDate – currentDate) / 1000;
if (totalSeconds <= 0) {
if(daysEl) daysEl.innerHTML = '00';
if(hoursEl) hoursEl.innerHTML = '00';
if(minutesEl) minutesEl.innerHTML = '00';
if(secondsEl) secondsEl.innerHTML = '00';
const timerContainer = document.getElementById('launch-timer');
if (timerContainer) {
const parentContainer = timerContainer.parentElement;
if (parentContainer) {
const launchedMessage = parentContainer.querySelector('.launch-date-text');
if(launchedMessage) launchedMessage.innerHTML = "
APE GANG HAS LAUNCHED! 🚀“;
}
}
if (typeof countdownInterval !== ‘undefined’) clearInterval(countdownInterval);
return;
}
const days = Math.floor(totalSeconds / 3600 / 24);
const hours = Math.floor(totalSeconds / 3600) % 24;
const minutes = Math.floor(totalSeconds / 60) % 60;
const seconds = Math.floor(totalSeconds) % 60;
if(daysEl) daysEl.innerHTML = formatTime(days);
if(hoursEl) hoursEl.innerHTML = formatTime(hours);
if(minutesEl) minutesEl.innerHTML = formatTime(minutes);
if(secondsEl) secondsEl.innerHTML = formatTime(seconds);
}
function formatTime(time) { return time < 10 ? `0${time}` : time; }
if (daysEl) { // Check if timer elements exist
if (launchDateDisplayEl) {
const formattedLaunchDate = new Date(launchTargetDate).toLocaleDateString('en-US', {
year: 'numeric', month: 'long', day: 'numeric'
});
launchDateDisplayEl.textContent = formattedLaunchDate;
}
countdown();
var countdownInterval = setInterval(countdown, 1000);
}
// --- SCROLL ANIMATIONS ---
const animatedElements = document.querySelectorAll('.animate-on-scroll');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add(‘is-visible’);
observer.unobserve(entry.target);
}
});
}, { threshold: 0.1 });
animatedElements.forEach(el => observer.observe(el));
// — CONTRACT ADDRESS COPY —
const copyCAButton = document.getElementById(‘copyCAButton’);
const contractAddressEl = document.getElementById(‘contractAddress’);
if (copyCAButton && contractAddressEl) {
copyCAButton.addEventListener(‘click’, () => {
navigator.clipboard.writeText(contractAddressEl.textContent.trim())
.then(() => {
const originalText = copyCAButton.innerHTML;
copyCAButton.innerHTML = ‘
Copied!’;
setTimeout(() => { copyCAButton.innerHTML = originalText; }, 2000);
})
.catch(err => console.error(‘Failed to copy: ‘, err));
});
}
// — MEME MAKER STUB —
const memeCanvas = document.getElementById(‘memeCanvas’);
const memeCtx = memeCanvas ? memeCanvas.getContext(‘2d’) : null;
const memeImageUpload = document.getElementById(‘memeImageUpload’);
const memeTopText = document.getElementById(‘memeTopText’);
const memeBottomText = document.getElementById(‘memeBottomText’);
const generateMemeBtn = document.getElementById(‘generateMemeBtn’);
const downloadMemeBtn = document.getElementById(‘downloadMemeBtn’);
const memeFontColor = document.getElementById(‘memeFontColor’);
const memeFontSize = document.getElementById(‘memeFontSize’);
let currentMemeImage = null;
function drawMeme() {
if (!memeCtx || !memeCanvas) return;
memeCtx.clearRect(0, 0, memeCanvas.width, memeCanvas.height);
memeCtx.fillStyle = ‘#ddd’; // Default bg if no image
memeCtx.fillRect(0, 0, memeCanvas.width, memeCanvas.height);
if (currentMemeImage) {
// Calculate aspect ratio to fit image within canvas
const hRatio = memeCanvas.width / currentMemeImage.width;
const vRatio = memeCanvas.height / currentMemeImage.height;
const ratio = Math.min(hRatio, vRatio);
const centerShift_x = (memeCanvas.width – currentMemeImage.width * ratio) / 2;
const centerShift_y = (memeCanvas.height – currentMemeImage.height * ratio) / 2;
memeCtx.drawImage(currentMemeImage, 0, 0, currentMemeImage.width, currentMemeImage.height,
centerShift_x, centerShift_y, currentMemeImage.width * ratio, currentMemeImage.height * ratio);
}
memeCtx.fillStyle = memeFontColor ? memeFontColor.value : ‘#FFFFFF’;
const fontSize = memeFontSize ? parseInt(memeFontSize.value) : 40;
memeCtx.font = `bold ${fontSize}px ‘Luckiest Guy’, cursive`;
memeCtx.textAlign = ‘center’;
memeCtx.strokeStyle = ‘black’;
memeCtx.lineWidth = Math.max(1, fontSize / 15); // Stroke width relative to font size
// Top text
const topText = memeTopText ? memeTopText.value.toUpperCase() : “”;
memeCtx.strokeText(topText, memeCanvas.width / 2, fontSize * 1.2);
memeCtx.fillText(topText, memeCanvas.width / 2, fontSize * 1.2);
// Bottom text
const bottomText = memeBottomText ? memeBottomText.value.toUpperCase() : “”;
memeCtx.strokeText(bottomText, memeCanvas.width / 2, memeCanvas.height – (fontSize * 0.5));
memeCtx.fillText(bottomText, memeCanvas.width / 2, memeCanvas.height – (fontSize * 0.5));
if(downloadMemeBtn) downloadMemeBtn.style.display = ‘inline-block’;
}
if (memeImageUpload) {
memeImageUpload.addEventListener(‘change’, (e) => {
const reader = new FileReader();
reader.onload = (event) => {
currentMemeImage = new Image();
currentMemeImage.onload = () => {
drawMeme();
};
currentMemeImage.src = event.target.result;
}
if (e.target.files[0]) {
reader.readAsDataURL(e.target.files[0]);
}
});
}
if (generateMemeBtn) generateMemeBtn.addEventListener(‘click’, drawMeme);
if (memeTopText) memeTopText.addEventListener(‘input’, drawMeme);
if (memeBottomText) memeBottomText.addEventListener(‘input’, drawMeme);
if (memeFontColor) memeFontColor.addEventListener(‘input’, drawMeme);
if (memeFontSize) memeFontSize.addEventListener(‘input’, drawMeme);
if (downloadMemeBtn) {
downloadMemeBtn.addEventListener(‘click’, () => {
if (!memeCanvas) return;
const imageURL = memeCanvas.toDataURL(‘image/png’);
const link = document.createElement(‘a’);
link.href = imageURL;
link.download = ‘apegang-meme.png’;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
}
if (memeCanvas) drawMeme(); // Initial draw
// — APE RUNNER MINI-GAME STUB —
const gameCanvas = document.getElementById(‘apeRunnerGame’);
const gameCtx = gameCanvas ? gameCanvas.getContext(‘2d’) : null;
const startGameBtn = document.getElementById(‘startGameBtn’);
const restartGameBtn = document.getElementById(‘restartGameBtn’);
const gameInstructionsEl = document.getElementById(‘gameInstructions’);
const gameOverScreenEl = document.getElementById(‘gameOverScreen’);
const finalScoreEl = document.getElementById(‘finalScore’);
let gameLoop;
let player, obstacles, score, gameActive;
function initGame() {
if (!gameCtx || !gameCanvas) return;
player = { x: 50, y: gameCanvas.height – 60, width: 40, height: 50, dy: 0, onGround: true, jumpPower: 15, gravity: 0.8 };
obstacles = [];
score = 0;
gameActive = true;
if(gameInstructionsEl) gameInstructionsEl.style.display = ‘none’;
if(gameOverScreenEl) gameOverScreenEl.style.display = ‘none’;
spawnObstacle();
gameLoop = requestAnimationFrame(updateGame);
}
function drawPlayer() {
if (!gameCtx) return;
gameCtx.fillStyle = ‘brown’; // Simple ape color
gameCtx.fillRect(player.x, player.y, player.width, player.height);
// Banana in hand (very simple)
gameCtx.fillStyle = ‘yellow’;
gameCtx.fillRect(player.x + player.width -10, player.y + 10, 10, 15);
}
function drawObstacles() {
if (!gameCtx) return;
obstacles.forEach(obs => {
gameCtx.fillStyle = ‘red’; // FUD Monster color
gameCtx.fillRect(obs.x, obs.y, obs.width, obs.height);
});
}
function drawScore() {
if (!gameCtx) return;
gameCtx.fillStyle = ‘black’;
gameCtx.font = “24px ‘Luckiest Guy’, cursive”;
gameCtx.textAlign = ‘left’;
gameCtx.fillText(“Score: ” + score, 10, 30);
}
function spawnObstacle() {
if (!gameCanvas) return;
const height = Math.random() * 50 + 20; // Random height
obstacles.push({
x: gameCanvas.width,
y: gameCanvas.height – height,
width: 30,
height: height,
speed: 3 + (score / 100) // Speed increases with score
});
}
let obstacleSpawnTimer = 0;
function updateGame() {
if (!gameActive || !gameCtx || !gameCanvas) return;
gameCtx.clearRect(0, 0, gameCanvas.width, gameCanvas.height);
// Player physics
player.y += player.dy;
player.dy += player.gravity;
if (player.y + player.height >= gameCanvas.height) {
player.y = gameCanvas.height – player.height;
player.dy = 0;
player.onGround = true;
}
// Obstacles
obstacleSpawnTimer++;
if (obstacleSpawnTimer > (120 – Math.min(score / 5, 60)) ) { // Spawn faster as score increases
spawnObstacle();
obstacleSpawnTimer = 0;
}
obstacles.forEach((obs, index) => {
obs.x -= obs.speed;
if (obs.x + obs.width < 0) { // Off screen
obstacles.splice(index, 1);
score++;
}
// Collision
if (player.x < obs.x + obs.width &&
player.x + player.width > obs.x &&
player.y < obs.y + obs.height &&
player.y + player.height > obs.y) {
gameOver();
}
});
drawPlayer();
drawObstacles();
drawScore();
if (gameActive) gameLoop = requestAnimationFrame(updateGame);
}
function playerJump() {
if (player.onGround && gameActive) {
player.dy = -player.jumpPower;
player.onGround = false;
}
}
function gameOver() {
gameActive = false;
cancelAnimationFrame(gameLoop);
if(gameOverScreenEl) gameOverScreenEl.style.display = ‘block’;
if(finalScoreEl) finalScoreEl.textContent = score;
}
if (startGameBtn) startGameBtn.addEventListener(‘click’, initGame);
if (restartGameBtn) restartGameBtn.addEventListener(‘click’, initGame);
document.addEventListener(‘keydown’, (e) => {
if (e.code === ‘Space’) {
if (!gameActive && gameOverScreenEl && gameOverScreenEl.style.display === ‘block’) {
// If game over screen is shown, space can restart
// initGame(); // Or rely on button click
} else if (gameActive || (gameInstructionsEl && gameInstructionsEl.style.display !== ‘none’)) {
// If game active, or on instructions screen, space can jump/start
if (gameInstructionsEl && gameInstructionsEl.style.display !== ‘none’) initGame();
playerJump();
}
}
});
if (gameCanvas) { // Add touch to jump for mobile
gameCanvas.addEventListener(‘touchstart’, (e) => {
e.preventDefault(); // Prevent scrolling
if (gameInstructionsEl && gameInstructionsEl.style.display !== ‘none’) initGame();
playerJump();
});
}
// — FOOTER CURRENT YEAR —
const currentYearEl = document.getElementById(‘currentYear’);
if (currentYearEl) currentYearEl.textContent = new Date().getFullYear();
// — SMOOTH SCROLL FOR NAV LINKS (same as before) —
document.querySelectorAll(‘header a[href^=”#”]’).forEach(anchor => {
anchor.addEventListener(‘click’, function (e) {
e.preventDefault();
const targetId = this.getAttribute(‘href’);
const targetElement = document.querySelector(targetId);
if (targetElement) {
const headerOffset = document.querySelector(‘header’).offsetHeight || 80;
const elementPosition = targetElement.getBoundingClientRect().top;
const offsetPosition = elementPosition + window.pageYOffset – headerOffset;
window.scrollTo({ top: offsetPosition, behavior: “smooth” });
}
});
});
});
document.addEventListener(‘DOMContentLoaded’, () => {
// … (Keep existing setup: launchTargetDate, numFloatingBananas, cursor, mobile menu, countdown, scroll animations, CA copy, footer year, smooth scroll) …
const launchTargetDate = “2025-06-20T00:00:00”;
const numFloatingBananas = 25;
// — CUSTOM CURSOR —
const cursor = document.querySelector(‘.custom-cursor’);
// … (cursor logic from previous response) …
if (cursor && !isTouchDevice()) {
document.addEventListener(‘mousemove’, e => {
cursor.style.left = e.pageX + ‘px’;
cursor.style.top = e.pageY – window.scrollY + ‘px’;
});
document.body.style.cursor = ‘none’;
} else if (cursor) {
cursor.style.display = ‘none’;
}
function isTouchDevice() { return (‘ontouchstart’ in window) || navigator.maxTouchPoints > 0; }
// — FLOATING BANANAS (Enhanced) —
const bananaContainer = document.querySelector(‘.floating-banana-container’);
if (bananaContainer) {
for (let i = 0; i < numFloatingBananas; i++) {
const banana = document.createElement('div');
banana.classList.add('banana-floater');
banana.style.left = Math.random() * 100 + 'vw';
const duration = Math.random() * 10 + 8; // Random duration 8-18s
banana.style.animationDuration = duration + 's';
banana.style.animationDelay = Math.random() * duration + 's';
banana.style.setProperty('--sway', (Math.random() * 80 - 40) + 'px');
banana.style.setProperty('--rotate1', (Math.random() * 360 - 180) + 'deg');
banana.style.setProperty('--rotate2', (Math.random() * 360 - 180) + 'deg');
banana.style.transform = `scale(${Math.random() * 0.6 + 0.4})`; // Random size 0.4 to 1.0
bananaContainer.appendChild(banana);
}
}
// --- PARALLAX BACKGROUNDS ---
// ... (parallax logic from previous response) ...
const parallaxElements = document.querySelectorAll('.parallax-bg');
parallaxElements.forEach(el => {
const bgImage = el.dataset.bgImage;
if (bgImage) el.style.backgroundImage = `url(‘${bgImage}’)`;
});
// — MOBILE MENU —
// … (mobile menu logic from previous response) …
const mobileMenuToggle = document.querySelector(‘.mobile-menu-toggle’);
const mobileNav = document.querySelector(‘.mobile-nav’);
if (mobileMenuToggle && mobileNav) { /* … */ }
// — LAUNCH COUNTDOWN —
// … (countdown logic, make sure IDs are correct e.g. `launchDateDisplay`) …
const daysEl = document.getElementById(‘days’); // etc.
if (daysEl) { /* … countdown() and formatTime() … */ }
// — SCROLL ANIMATIONS —
// … (observer logic from previous response) …
const animatedElements = document.querySelectorAll(‘.animate-on-scroll’);
const observer = new IntersectionObserver((entries) => { /* … */ }, { threshold: 0.1 });
animatedElements.forEach(el => observer.observe(el));
// — CONTRACT ADDRESS COPY (For main CA display) —
const copyCAMainButton = document.getElementById(‘copyCAMainButton’);
const contractAddressMainEl = document.getElementById(‘contractAddressMain’);
if (copyCAMainButton && contractAddressMainEl) {
copyCAMainButton.addEventListener(‘click’, () => {
navigator.clipboard.writeText(contractAddressMainEl.textContent.trim())
.then(() => {
const originalText = copyCAMainButton.innerHTML;
copyCAMainButton.innerHTML = ‘
‘;
setTimeout(() => { copyCAMainButton.innerHTML = originalText; }, 1500);
})
.catch(err => console.error(‘Failed to copy main CA: ‘, err));
});
}
// — BANANA CLICKER GAME LOGIC —
const bananaCountEl = document.getElementById(‘bananaCount’);
const bananasPerSecondEl = document.getElementById(‘bananasPerSecond’);
const clickableBanana = document.getElementById(‘clickableBanana’);
const clickEffectContainer = document.getElementById(‘clickEffectContainer’);
const upgradeClickPowerBtn = document.querySelector(‘#upgradeClickPower button’);
const clickPowerValueEl = document.getElementById(‘clickPowerValue’);
const clickPowerCostEl = document.getElementById(‘clickPowerCost’);
const upgradeAutoMonkeyBtn = document.querySelector(‘#upgradeAutoMonkey button’);
const autoMonkeyCostEl = document.getElementById(‘autoMonkeyCost’);
const autoMonkeyOwnedEl = document.getElementById(‘autoMonkeyOwned’);
const upgradeBananaFarmBtn = document.querySelector(‘#upgradeBananaFarm button’);
const bananaFarmCostEl = document.getElementById(‘bananaFarmCost’);
const bananaFarmOwnedEl = document.getElementById(‘bananaFarmOwned’);
const buyGoldenBananaBoostBtn = document.getElementById(‘buyGoldenBananaBoost’);
const goldenBananaCostEl = document.getElementById(‘goldenBananaCost’);
let bananas = 0;
let clickPower = 1;
let bananasPerSecond = 0;
let autoMonkeys = 0;
let bananaFarms = 0;
let clickPowerCost = 10;
let autoMonkeyCost = 50;
let bananaFarmCost = 500;
let goldenBananaCost = 1000;
let goldenBananaActive = false;
let goldenBananaMultiplier = 1; // Becomes 2 when active
function updateClickerDisplay() {
if (bananaCountEl) bananaCountEl.textContent = Math.floor(bananas);
if (bananasPerSecondEl) bananasPerSecondEl.textContent = (bananasPerSecond * goldenBananaMultiplier).toFixed(1);
if (clickPowerValueEl) clickPowerValueEl.textContent = clickPower;
if (clickPowerCostEl) clickPowerCostEl.textContent = clickPowerCost;
if (autoMonkeyCostEl) autoMonkeyCostEl.textContent = autoMonkeyCost;
if (autoMonkeyOwnedEl) autoMonkeyOwnedEl.textContent = autoMonkeys;
if (bananaFarmCostEl) bananaFarmCostEl.textContent = bananaFarmCost;
if (bananaFarmOwnedEl) bananaFarmOwnedEl.textContent = bananaFarms;
if (goldenBananaCostEl) goldenBananaCostEl.textContent = goldenBananaCost;
// Disable buttons if not affordable
if (upgradeClickPowerBtn) upgradeClickPowerBtn.parentElement.classList.toggle(‘disabled’, bananas < clickPowerCost);
if (upgradeAutoMonkeyBtn) upgradeAutoMonkeyBtn.parentElement.classList.toggle('disabled', bananas < autoMonkeyCost);
if (upgradeBananaFarmBtn) upgradeBananaFarmBtn.parentElement.classList.toggle('disabled', bananas < bananaFarmCost);
if (buyGoldenBananaBoostBtn) buyGoldenBananaBoostBtn.parentElement.classList.toggle('disabled', bananas < goldenBananaCost || goldenBananaActive);
}
if (clickableBanana) {
clickableBanana.addEventListener('click', () => {
bananas += clickPower * goldenBananaMultiplier;
// sound_bananaClick.play(); // Sound cue
// Click visual effect
if (clickEffectContainer) {
const effect = document.createElement(‘div’);
effect.classList.add(‘click-effect’);
effect.textContent = `+${clickPower * goldenBananaMultiplier}`;
effect.style.left = (Math.random() * 50 + 25) + ‘%’; // Random horizontal position
effect.style.top = (Math.random() * 20 + 40) + ‘%’; // Random vertical position
clickEffectContainer.appendChild(effect);
setTimeout(() => effect.remove(), 1000);
}
updateClickerDisplay();
});
}
if (upgradeClickPowerBtn) {
upgradeClickPowerBtn.addEventListener(‘click’, () => {
if (bananas >= clickPowerCost) {
bananas -= clickPowerCost;
clickPower++;
clickPowerCost = Math.ceil(clickPowerCost * 1.5);
// sound_upgrade.play();
updateClickerDisplay();
}
});
}
if (upgradeAutoMonkeyBtn) {
upgradeAutoMonkeyBtn.addEventListener(‘click’, () => {
if (bananas >= autoMonkeyCost) {
bananas -= autoMonkeyCost;
autoMonkeys++;
bananasPerSecond += 1;
autoMonkeyCost = Math.ceil(autoMonkeyCost * 1.25);
// sound_monkey.play();
updateClickerDisplay();
}
});
}
if (upgradeBananaFarmBtn) {
upgradeBananaFarmBtn.addEventListener(‘click’, () => {
if (bananas >= bananaFarmCost) {
bananas -= bananaFarmCost;
bananaFarms++;
bananasPerSecond += 10;
bananaFarmCost = Math.ceil(bananaFarmCost * 1.35);
// sound_farm.play();
updateClickerDisplay();
}
});
}
if (buyGoldenBananaBoostBtn) {
buyGoldenBananaBoostBtn.addEventListener(‘click’, () => {
if (bananas >= goldenBananaCost && !goldenBananaActive) {
bananas -= goldenBananaCost;
goldenBananaActive = true;
goldenBananaMultiplier = 2;
// sound_powerup.play();
buyGoldenBananaBoostBtn.textContent = “ACTIVE!”;
buyGoldenBananaBoostBtn.parentElement.classList.add(‘disabled’); // Visually disable while active
setTimeout(() => {
goldenBananaActive = false;
goldenBananaMultiplier = 1;
buyGoldenBananaBoostBtn.textContent = “Activate!”;
// Re-check affordability for visual state
buyGoldenBananaBoostBtn.parentElement.classList.toggle(‘disabled’, bananas < goldenBananaCost || goldenBananaActive);
updateClickerDisplay();
}, 30000); // 30 seconds
updateClickerDisplay();
}
});
}
// Passive banana generation
setInterval(() => {
bananas += (bananasPerSecond * goldenBananaMultiplier) / 10; // BPS divided by interval ticks (100ms)
updateClickerDisplay();
}, 100); // Update 10 times per second for smoother display
if (bananaCountEl) updateClickerDisplay(); // Initial display
// — MEME MAKER (with Presets) —
const memeCanvas = document.getElementById(‘memeCanvas’);
const memeCtx = memeCanvas ? memeCanvas.getContext(‘2d’) : null;
const memeImageUpload = document.getElementById(‘memeImageUpload’);
const memeTopText = document.getElementById(‘memeTopText’);
const memeBottomText = document.getElementById(‘memeBottomText’);
const generateMemeBtn = document.getElementById(‘generateMemeBtn’);
const downloadMemeBtn = document.getElementById(‘downloadMemeBtn’);
const memeFontColor = document.getElementById(‘memeFontColor’);
const memeFontSize = document.getElementById(‘memeFontSize’);
const memePresetSelect = document.getElementById(‘memePresetSelect’);
let currentMemeImage = null;
const memePresets = { // Using placeholder image URLs
drake: {
url: ‘https://i.imgflip.com/2/30b1gx.jpg’, // Drake Hotline Bling
top: ‘Old Thing’, bottom: ‘New Hotness’
},
distracted: {
url: ‘https://i.imgflip.com/2/1ur9b0.jpg’, // Distracted Boyfriend
top: ‘You’, bottom: ‘$APEGANG’, other: ‘Responsibilities’ // Need to handle ‘other’ if used
},
brain: {
url: ‘https://i.imgflip.com/2/1jwhww.jpg’, // Expanding Brain (multi-panel)
top: ‘Small Brain: Other Coins’, bottom: ‘Galaxy Brain: $APEGANG’
},
ape: { // Custom for Ape Gang
url: ‘https://bodegacrypto.com/wp-content/uploads/2025/05/mokey.png’, // Your hero monkey
top: ‘$APEGANG TO THE MOON!’, bottom: ‘HODL STRONG APES!’
}
};
function drawMeme() { /* … (drawMeme logic unchanged from previous script, but ensure it uses currentMemeImage) … */
if (!memeCtx || !memeCanvas) return;
memeCtx.clearRect(0, 0, memeCanvas.width, memeCanvas.height);
memeCtx.fillStyle = ‘#eee’;
memeCtx.fillRect(0, 0, memeCanvas.width, memeCanvas.height);
if (currentMemeImage) {
const hRatio = memeCanvas.width / currentMemeImage.width;
const vRatio = memeCanvas.height / currentMemeImage.height;
const ratio = Math.min(hRatio, vRatio, 1); // Ensure image is not stretched beyond its original size if smaller than canvas
const imgDrawWidth = currentMemeImage.width * ratio;
const imgDrawHeight = currentMemeImage.height * ratio;
const centerShift_x = (memeCanvas.width – imgDrawWidth) / 2;
const centerShift_y = (memeCanvas.height – imgDrawHeight) / 2;
memeCtx.drawImage(currentMemeImage, 0, 0, currentMemeImage.width, currentMameImage.height,
centerShift_x, centerShift_y, imgDrawWidth, imgDrawHeight);
}
memeCtx.fillStyle = memeFontColor ? memeFontColor.value : ‘#FFFFFF’;
const fontSize = memeFontSize ? parseInt(memeFontSize.value) : 40;
memeCtx.font = `bold ${fontSize}px ‘Luckiest Guy’, cursive`;
memeCtx.textAlign = ‘center’;
memeCtx.strokeStyle = ‘black’;
memeCtx.lineWidth = Math.max(2, fontSize / 12);
const topTextVal = memeTopText ? memeTopText.value.toUpperCase() : “”;
memeCtx.strokeText(topTextVal, memeCanvas.width / 2, fontSize * 1.2);
memeCtx.fillText(topTextVal, memeCanvas.width / 2, fontSize * 1.2);
const bottomTextVal = memeBottomText ? memeBottomText.value.toUpperCase() : “”;
memeCtx.strokeText(bottomTextVal, memeCanvas.width / 2, memeCanvas.height – (fontSize * 0.5));
memeCtx.fillText(bottomTextVal, memeCanvas.width / 2, memeCanvas.height – (fontSize * 0.5));
if(downloadMemeBtn) downloadMemeBtn.style.display = ‘inline-block’;
}
if (memePresetSelect) {
memePresetSelect.addEventListener(‘change’, (e) => {
const selectedPresetKey = e.target.value;
if (selectedPresetKey && memePresets[selectedPresetKey]) {
const preset = memePresets[selectedPresetKey];
currentMemeImage = new Image();
currentMemeImage.crossOrigin = “anonymous”; // For Imgflip, etc.
currentMemeImage.onload = () => {
if (memeTopText) memeTopText.value = preset.top || “”;
if (memeBottomText) memeBottomText.value = preset.bottom || “”;
drawMeme();
};
currentMemeImage.onerror = () => {
console.error(“Error loading preset image. CORS issue or invalid URL?”);
// Draw a fallback or clear canvas
memeCtx.clearRect(0,0,memeCanvas.width, memeCanvas.height);
memeCtx.fillStyle = ‘#ccc’;
memeCtx.fillRect(0,0,memeCanvas.width, memeCanvas.height);
memeCtx.fillStyle = ‘red’;
memeCtx.font = “20px Arial”;
memeCtx.textAlign = ‘center’;
memeCtx.fillText(“Error loading image.”, memeCanvas.width/2, memeCanvas.height/2);
}
currentMemeImage.src = preset.url;
} else if (selectedPresetKey === “”) { // “– Select Preset –”
currentMemeImage = null;
if (memeTopText) memeTopText.value = “”;
if (memeBottomText) memeBottomText.value = “”;
drawMeme(); // Redraw with blank or default background
}
});
}
// … (Rest of meme maker event listeners: imageUpload, generateMemeBtn, text inputs, downloadMemeBtn) …
// (Ensure these are present from the previous script)
if (memeImageUpload) { /* … */ }
if (generateMemeBtn) generateMemeBtn.addEventListener(‘click’, drawMeme);
if (memeTopText) memeTopText.addEventListener(‘input’, drawMeme); // etc.
if (downloadMemeBtn) { /* … */ }
if (memeCanvas) drawMeme(); // Initial draw
// — SHILL TEXT GENERATOR —
const shillTokenNameEl = document.getElementById(‘shillTokenName’);
const shillFeature1El = document.getElementById(‘shillFeature1’);
const shillFeature2El = document.getElementById(‘shillFeature2’);
const shillCTAEl = document.getElementById(‘shillCTA’);
const shillEmojiPackEl = document.getElementById(‘shillEmojiPack’);
const generateShillBtn = document.getElementById(‘generateShillBtn’);
const shillOutputAreaEl = document.getElementById(‘shillOutputArea’);
const emojiPacks = {
rockets: [“🚀”, “🌕”, “💎”, “✨”, “🌟”, “🛰️”],
fire: [“🔥”, “💯”, “✔️”, “💥”, “⚡”, “🤯”],
animals: [“🦍”, “🍌”, “🎉”, “🥳”, “🐅”, “🦁”, “🐒”],
money: [“💰”, “💸”, “🤑”, “💲”, “💵”, “📈”]
};
const shillTemplates = [
(token, f1, f2, cta, emojis) => `${emojis[0]} ${token} IS GOING PARABOLIC! ${emojis[1]} With ${f1} and ${f2}, this is a GUARANTEED MOONSHOT! ${emojis[2]} ${cta} ${emojis[3]}`,
(token, f1, f2, cta, emojis) => `ATTENTION APES! ${emojis[4]} ${token} is the hidden gem you’ve been waiting for! Featuring ${f1} & don’t forget the ${f2}! ${emojis[5]} ${cta}! LFG! ${emojis[0]}`,
(token, f1, f2, cta, emojis) => `HOLD ONTO YOUR BANANAS! ${emojis[1]} ${token} is about to EXPLODE! ${emojis[2]} ${f1} will blow your mind, and ${f2} is just the cherry on top! ${cta} ${emojis[3]}${emojis[4]}`,
(token, f1, f2, cta, emojis) => `You SNOOZE you LOSE! ${emojis[5]} ${token} is the NEXT 1000X! ${emojis[0]} ${f1} + ${f2} = PURE GAINS! ${cta} #DYOR #ToTheMoon ${emojis[1]}`,
(token, f1, f2, cta, emojis) => `GET IN ON ${token} NOW! ${emojis[2]} This isn’t just a coin, it’s a REVOLUTION! With ${f1} and the incredible ${f2}, we’re unstoppable! ${cta} ${emojis[3]}${emojis[0]}${emojis[4]}`
];
function getRandomSubset(arr, count) {
const shuffled = […arr].sort(() => 0.5 – Math.random());
return shuffled.slice(0, count);
}
if (generateShillBtn) {
generateShillBtn.addEventListener(‘click’, () => {
const token = shillTokenNameEl.value || “$TOKEN”;
const f1 = shillFeature1El.value || “amazing devs”;
const f2 = shillFeature2El.value || “a strong community”;
const cta = shillCTAEl.value || “Join the Telegram now!”;
const selectedEmojiPack = emojiPacks[shillEmojiPackEl.value] || emojiPacks.rockets;
if(shillOutputAreaEl) shillOutputAreaEl.innerHTML = “”; // Clear previous
for (let i = 0; i < 3; i++) { // Generate 3 variations
const template = shillTemplates[Math.floor(Math.random() * shillTemplates.length)];
const randomEmojis = getRandomSubset(selectedEmojiPack, 6); // Get 6 random emojis from the pack
const shillText = template(token, f1, f2, cta, randomEmojis);
const shillDiv = document.createElement('div');
shillDiv.classList.add('shill-message');
const p = document.createElement('p');
p.textContent = shillText;
const copyBtn = document.createElement('button');
copyBtn.classList.add('copy-shill-btn');
copyBtn.innerHTML = '
‘;
copyBtn.title = “Copy to clipboard”;
copyBtn.addEventListener(‘click’, () => {
navigator.clipboard.writeText(shillText)
.then(() => {
const originalIcon = copyBtn.innerHTML;
copyBtn.innerHTML = ‘
‘;
setTimeout(() => { copyBtn.innerHTML = originalIcon; }, 1500);
})
.catch(err => console.error(‘Failed to copy shill: ‘, err));
});
shillDiv.appendChild(p);
shillDiv.appendChild(copyBtn);
if (shillOutputAreaEl) shillOutputAreaEl.appendChild(shillDiv);
}
// sound_shillGenerated.play();
});
}
// — APE RUNNER GAME STUB —
// … (Ape Runner logic unchanged from previous script, ensure IDs match if used) …
const gameCanvas = document.getElementById(‘apeRunnerGame’); // etc.
if (gameCanvas) { /* … initGame(), drawPlayer(), etc. … */ }
// — FOOTER CURRENT YEAR —
const currentYearEl = document.getElementById(‘currentYear’);
if (currentYearEl) currentYearEl.textContent = new Date().getFullYear();
// — SMOOTH SCROLL —
document.querySelectorAll(‘header a[href^=”#”]’).forEach(anchor => { /* … */ });
}); // End DOMContentLoaded
/* Global Styles & Variables */
:root {
–primary-yellow: #ffff00;
–dark-gold: #b8860b; /* #DAA520 is another option for a brighter gold */
–black: #000000;
–white: #ffffff;
–dark-bg: #121212; /* Very dark gray for main background */
–card-bg: #1f1f1f; /* Slightly lighter for cards */
–text-light: #f0f0f0;
–text-medium: #cccccc;
–border-color: #333333;
–comic-font: ‘Comic Neue’, cursive;
–body-font: ‘Open Sans’, sans-serif;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
scroll-behavior: smooth;
}
body {
font-family: var(–body-font);
background-color: var(–dark-bg);
color: var(–text-light);
line-height: 1.6;
overflow-x: hidden; /* Prevent horizontal scroll */
cursor: none; /* Hide default cursor */
}
.custom-cursor {
position: fixed;
left: 0;
top: 0;
width: 20px;
height: 20px;
border: 2px solid var(–primary-yellow);
border-radius: 50%;
pointer-events: none;
transform: translate(-50%, -50%);
transition: width 0.1s, height 0.1s, background-color 0.1s;
z-index: 9999;
}
body:hover .custom-cursor { display: block; } /* Show only on hover */
a:hover ~ .custom-cursor, button:hover ~ .custom-cursor, input:hover ~ .custom-cursor {
width: 30px;
height: 30px;
background-color: rgba(255, 255, 0, 0.3);
}
h1, h2, h3, h4 {
font-family: var(–comic-font);
color: var(–primary-yellow);
margin-bottom: 1rem;
line-height: 1.2;
text-shadow: 1px 1px 2px rgb(255, 253, 253);
}
h1 { font-size: 3rem; }
h2 { font-size: 2.5rem; text-align: center; margin-bottom: 2rem; }
h3 { font-size: 1.8rem; }
p {
margin-bottom: 1rem;
color: var(–text-medium);
}
a {
color: var(–primary-yellow);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
img {
max-width: 100%;
height: auto;
display: block;
}
section {
padding: 60px 20px;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
/* Buttons */
.btn {
display: inline-block;
padding: 12px 25px;
font-family: var(–comic-font);
font-size: 1.1rem;
font-weight: bold;
text-transform: uppercase;
border-radius: 50px; /* Fun, rounded buttons */
transition: all 0.3s ease;
border: 2px solid transparent;
cursor: pointer;
}
.btn-primary {
background-color: var(–primary-yellow);
color: var(–black);
border-color: var(–primary-yellow);
}
.btn-primary:hover {
background-color: var(–dark-gold);
color: var(–black);
border-color: var(–dark-gold);
transform: translateY(-3px);
box-shadow: 0 5px 10px rgba(255, 255, 0, 0.3);
text-decoration: none;
}
.btn-secondary {
background-color: transparent;
color: var(–primary-yellow);
border: 2px solid var(–primary-yellow);
}
.btn-secondary:hover {
background-color: var(–primary-yellow);
color: var(–black);
transform: translateY(-3px);
box-shadow: 0 5px 10px rgba(255, 255, 0, 0.2);
text-decoration: none;
}
/* Header & Navigation */
header {
background-color: rgba(18, 18, 18, 0.85); /* Slightly transparent dark */
backdrop-filter: blur(10px);
padding: 1rem 0;
position: fixed;
width: 100%;
top: 0;
z-index: 1000;
box-shadow: 0 2px 10px rgba(0,0,0,0.5);
}
nav {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.logo-container {
display: flex;
align-items: center;
}
.nav-logo-img {
height: 40px; /* Adjust as needed */
margin-right: 10px;
}
.nav-logo-text {
font-family: var(–comic-font);
font-size: 1.8rem;
color: var(–primary-yellow);
font-weight: bold;
}
nav ul {
list-style: none;
display: flex;
}
nav ul li {
margin-left: 25px;
}
nav ul li a {
font-family: var(–comic-font);
font-size: 1rem;
color: var(–white);
padding: 5px 0;
position: relative;
}
nav ul li a::after {
content: ”;
position: absolute;
bottom: 0;
left: 0;
width: 0;
height: 2px;
background-color: var(–primary-yellow);
transition: width 0.3s ease;
}
nav ul li a:hover::after {
width: 100%;
}
nav ul li a:hover { text-decoration: none; color: var(–primary-yellow); }
.mobile-menu-toggle {
display: none; /* Hidden by default */
background: none;
border: none;
color: var(–primary-yellow);
font-size: 1.8rem;
cursor: pointer;
}
/* Hero Section */
.hero-section {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding-top: 80px; /* Account for fixed header */
background: var(–dark-bg) url(‘https://www.transparenttextures.com/patterns/dark-geometric.png’); /* Subtle pattern */
position: relative;
overflow: hidden;
}
.hero-section::before { /* Optional overlay for text contrast */
content: ”;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
background: rgba(0,0,0,0.3);
z-index: 0;
}
.hero-content {
display: flex;
align-items: center;
justify-content: space-between;
max-width: 1200px;
margin: 0 auto;
width: 100%;
gap: 30px;
position: relative;
z-index: 1;
}
.hero-text-content {
flex: 1.2; /* Give more space to text */
animation: slideInFromLeft 1s ease-out;
}
.hero-text-logo {
max-width: 300px; /* Adjust as needed */
margin-bottom: 1.5rem;
}
.hero-text-content h1 {
font-size: 3.5rem;
margin-bottom: 0.5rem;
color: var(–primary-yellow);
}
.hero-text-content .subtitle {
font-family: var(–comic-font);
font-size: 1.8rem;
color: var(–white);
margin-bottom: 1rem;
}
.hero-text-content p {
font-size: 1.1rem;
color: var(–text-light);
margin-bottom: 2rem;
}
.hero-cta a {
margin-right: 15px;
margin-bottom: 10px; /* For mobile stacking */
}
.hero-image-content {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
animation: fadeIn 1.5s ease-out;
}
.hero-mokey {
max-width: 450px;
width: 100%;
filter: drop-shadow(0 0 20px rgba(255, 255, 0, 0.3));
}
/* Marquee Section */
.marquee-section {
background-color: var(–black);
color: var(–primary-yellow);
padding: 10px 0;
overflow: hidden;
white-space: nowrap;
font-family: var(–comic-font);
font-weight: bold;
}
.marquee span {
display: inline-block;
padding-left: 100%;
animation: marquee-scroll 25s linear infinite;
}
@keyframes marquee-scroll {
0% { transform: translateX(0); }
100% { transform: translateX(-100%); }
}
/* Countdown Section */
.countdown-section {
background-color: var(–card-bg);
text-align: center;
}
.countdown-section h2 { color: var(–primary-yellow); }
#launch-timer {
display: flex;
justify-content: center;
gap: 20px;
margin: 30px 0;
}
#launch-timer div {
background: linear-gradient(to bottom, var(–primary-yellow), var(–dark-gold));
color: var(–black);
padding: 20px;
border-radius: 10px;
min-width: 100px;
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}
#launch-timer div span {
display: block;
font-size: 2.5rem;
font-weight: bold;
font-family: var(–comic-font);
}
#launchDateDisplay {
font-weight: bold;
color: var(–primary-yellow);
}
/* Utility Section */
.utility-section {
background-color: var(–dark-bg);
}
.utility-section > p { text-align: center; max-width: 700px; margin-left: auto; margin-right: auto;}
.utility-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 30px;
margin-top: 2rem;
}
.utility-card {
background: linear-gradient(145deg, var(–primary-yellow), var(–dark-gold));
color: var(–black);
padding: 30px;
border-radius: 15px;
box-shadow: 0 8px 20px rgba(0,0,0,0.4);
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.utility-card:hover {
transform: translateY(-10px);
box-shadow: 0 12px 25px rgba(255, 215, 0, 0.3); /* Gold glow */
}
.utility-card h3 {
color: var(–black);
font-family: var(–comic-font);
margin-bottom: 1rem;
font-size: 1.6rem;
}
.utility-card p {
color: #333; /* Darker text for readability on yellow */
font-size: 1rem;
}
.card-icon {
font-size: 3rem;
margin-bottom: 1rem;
text-align: center; /* Or adjust as needed */
}
/* Discount Banner Section */
.discount-banner-section {
background: var(–black); /* Dark background for rainbow text to pop */
padding: 30px 20px;
text-align: center;
}
.rainbow-text {
font-size: 2.2rem; /* Make it prominent */
font-family: var(–comic-font);
font-weight: bold;
background: linear-gradient(to right, red, orange, yellow, green, blue, indigo, violet, red); /* Added red at end for smoother loop */
background-size: 200% auto;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: rainbow-flow 4s linear infinite;
}
@keyframes rainbow-flow {
to {
background-position: -200% center;
}
}
/* About Section */
.about-section {
background-color: var(–card-bg);
}
.about-content {
display: flex;
align-items: center;
gap: 40px;
max-width: 1100px;
margin: 0 auto;
}
.about-text { flex: 1.5; }
.about-image { flex: 1; }
.about-image img {
border-radius: 15px;
box-shadow: 0 0 25px rgba(255,255,0,0.2);
}
/* Tokenomics Section */
.tokenomics-content {
display: flex;
flex-wrap: wrap;
align-items: flex-start;
gap: 40px;
max-width: 1000px;
margin: 0 auto;
}
.tokenomics-info {
flex: 1;
min-width: 300px;
}
.tokenomics-info .token-address {
font-weight: bold;
color: var(–primary-yellow);
word-break: break-all;
}
.token-distribution {
list-style: none;
padding-left: 0;
}
.token-distribution li {
margin-bottom: 0.5rem;
padding-left: 20px;
position: relative;
}
.token-distribution li::before {
content: “🍌”; /* Banana bullet */
position: absolute;
left: 0;
top: 0;
font-size: 0.9em;
}
.tokenomics-chart-placeholder {
flex: 1;
min-width: 300px;
background-color: var(–card-bg);
padding: 20px;
border-radius: 10px;
text-align: center;
}
.tokenomics-chart-placeholder h4 {
color: var(–primary-yellow);
margin-bottom: 15px;
}
.chart-visual { /* Simple CSS pie chart concept */
width: 150px;
height: 150px;
border-radius: 50%;
background-image: conic-gradient(
var(–color1, #FFD700) 0% var(–p1, 97%),
var(–color2, #FFA500) var(–p1, 97%) var(–p2, 99%), /* 97 + 2 = 99 */
var(–color3, #FF8C00) var(–p2, 99%) var(–p3, 100%), /* 99 + 1 = 100 */
var(–color4, #FF6347) var(–p3, 100%) 100% /* Placeholder for the last 1%, ensure it adds to 100 if used for small % */
);
/* This CSS chart is very basic. For accurate representation, use SVG or a JS library */
margin: 20px auto;
display: none; /* Hiding this basic one for now. Better to use an image or proper chart lib */
}
.chart-note { font-size: 0.9em; color: var(–text-medium); margin-top: 10px;}
/* Roadmap Section */
.roadmap-section {
background-color: var(–card-bg);
}
.roadmap-list {
list-style: none;
position: relative;
padding-left: 40px; /* Space for timeline line */
max-width: 800px;
margin: 0 auto;
}
.roadmap-list::before { /* Timeline line */
content: ”;
position: absolute;
left: 10px;
top: 0;
bottom: 0;
width: 4px;
background: linear-gradient(to bottom, var(–primary-yellow), var(–dark-gold));
border-radius: 2px;
}
.roadmap-item {
margin-bottom: 40px;
padding-left: 30px; /* Space from timeline marker */
position: relative;
}
.roadmap-item::before { /* Timeline marker (circle) */
content: ”;
position: absolute;
left: -28px; /* (40px padding – (30px marker width / 2) – (4px line / 2) ) */
top: 0px;
width: 20px;
height: 20px;
background-color: var(–primary-yellow);
border: 3px solid var(–dark-bg);
border-radius: 50%;
z-index: 1;
}
.roadmap-phase {
font-family: var(–comic-font);
font-size: 1.5rem;
color: var(–primary-yellow);
margin-bottom: 0.5rem;
}
.roadmap-details p {
margin-bottom: 0.3rem;
font-size: 0.95rem;
}
.roadmap-details p::before {
content: “✅”; /* Or use different emojis for different states */
margin-right: 8px;
}
/* Whitepaper Section */
.whitepaper-section {
text-align: center;
background: var(–dark-bg) url(‘https://www.transparenttextures.com/patterns/otis-redding.png’);
}
.whitepaper-section p {
max-width: 600px;
margin-left: auto;
margin-right: auto;
margin-bottom: 2rem;
}
/* Team Section */
.team-section {
background-color: var(–card-bg);
}
.team-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 30px;
max-width: 1000px;
margin: 0 auto;
}
.team-member {
background-color: var(–dark-bg);
padding: 20px;
border-radius: 10px;
text-align: center;
border: 1px solid var(–border-color);
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.team-member:hover {
transform: translateY(-5px);
box-shadow: 0 0 15px var(–primary-yellow);
}
.team-member img {
width: 120px;
height: 120px;
border-radius: 50%;
margin: 0 auto 15px auto;
border: 3px solid var(–primary-yellow);
object-fit: cover;
}
.team-member h3 {
color: var(–primary-yellow);
font-size: 1.3rem;
margin-bottom: 0.5rem;
}
.team-member p {
font-size: 0.9rem;
color: var(–text-medium);
}
/* FAQ Section */
.faq-list {
max-width: 800px;
margin: 0 auto;
}
.faq-list details {
background-color: var(–card-bg);
margin-bottom: 10px;
border-radius: 8px;
border: 1px solid var(–border-color);
overflow: hidden; /* To make border-radius apply to summary */
}
.faq-list summary {
padding: 15px 20px;
font-family: var(–comic-font);
font-size: 1.2rem;
font-weight: bold;
color: var(–primary-yellow);
cursor: pointer;
list-style: none; /* Remove default marker */
position: relative;
}
.faq-list summary::-webkit-details-marker { display: none; } /* Chrome/Safari */
.faq-list summary::after { /* Custom marker */
content: ‘🍌’; /* Banana as expand icon */
position: absolute;
right: 20px;
top: 50%;
transform: translateY(-50%) rotate(0deg);
transition: transform 0.3s ease;
}
.faq-list details[open] summary::after {
transform: translateY(-50%) rotate(90deg);
}
.faq-list details p {
padding: 0 20px 15px 20px;
color: var(–text-light);
font-size: 1rem;
}
/* Calculator Section */
.calculator-section {
background-color: var(–card-bg);
}
.calculator-form {
max-width: 500px;
margin: 0 auto;
background-color: var(–dark-bg);
padding: 30px;
border-radius: 10px;
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}
.calculator-form div {
margin-bottom: 15px;
}
.calculator-form label {
display: block;
margin-bottom: 5px;
color: var(–primary-yellow);
font-family: var(–comic-font);
}
.calculator-form input[type=”number”] {
width: 100%;
padding: 10px;
background-color: #333;
border: 1px solid #555;
color: var(–white);
border-radius: 5px;
font-size: 1rem;
}
#calculate-mc-btn { margin-top: 10px; width: 100%; }
#market-cap-result {
margin-top: 20px;
font-size: 1.2rem;
font-weight: bold;
color: var(–primary-yellow);
text-align: center;
}
#market-cap-result span {
color: var(–white);
}
/* Meme Generator & Game Section (Placeholders) */
.meme-generator-section, .mini-game-section {
text-align: center;
}
.meme-generator-concept, .game-concept {
max-width: 800px;
margin: 0 auto;
background-color: var(–card-bg);
padding: 30px;
border-radius: 10px;
}
.meme-generator-concept ul, .game-description ul {
text-align: left;
list-style-position: inside;
margin-bottom: 1rem;
}
.meme-generator-concept ul li, .game-description ul li {
margin-bottom: 0.5rem;
}
.meme-generator-concept ul ul, .game-description ul ul {
margin-left: 20px;
margin-top: 0.5rem;
}
.meme-concept-img, .game-visual-placeholder img {
margin-top: 20px;
border-radius: 8px;
border: 2px solid var(–primary-yellow);
}
.game-concept {
display: flex;
flex-wrap: wrap;
gap: 30px;
text-align: left;
}
.game-description { flex: 1.5; min-width: 300px; }
.game-visual-placeholder { flex: 1; min-width: 280px; text-align: center; }
.game-visual-placeholder p { font-size: 0.8em; color: var(–text-medium); }
/* Community Section */
.community-section {
background-color: var(–card-bg);
text-align: center;
}
.community-section p {
max-width: 600px;
margin-left: auto;
margin-right: auto;
margin-bottom: 2rem;
}
.social-links {
display: flex;
justify-content: center;
flex-wrap: wrap;
gap: 20px;
}
.social-icon {
font-size: 1.2rem;
font-family: var(–comic-font);
color: var(–black);
background-color: var(–primary-yellow);
padding: 10px 20px;
border-radius: 50px;
transition: all 0.3s ease;
min-width: 150px;
text-align: center;
}
.social-icon i {
margin-right: 8px;
}
.social-icon:hover {
background-color: var(–dark-gold);
color: var(–black);
transform: scale(1.1);
text-decoration: none;
}
/* Footer */
footer {
background-color: var(–black);
color: var(–text-medium);
text-align: center;
padding: 30px 20px;
font-size: 0.9rem;
}
footer p { margin-bottom: 0.5rem; }
footer a { color: var(–primary-yellow); }
.disclaimer {
font-size: 0.8rem;
color: #888;
margin-top: 1rem;
max-width: 700px;
margin-left: auto;
margin-right: auto;
}
/* Animation Classes */
.animate-on-scroll {
opacity: 0;
transform: translateY(30px);
transition: opacity 0.6s ease-out, transform 0.6s ease-out;
}
.animate-on-scroll.is-visible {
opacity: 1;
transform: translateY(0);
}
@keyframes slideInFromLeft {
0% { transform: translateX(-100%); opacity: 0; }
100% { transform: translateX(0); opacity: 1; }
}
@keyframes fadeIn {
0% { opacity: 0; }
100% { opacity: 1; }
}
/* Responsive Design */
@media (max-width: 992px) {
.hero-content {
flex-direction: column-reverse; /* Image on top on smaller screens */
text-align: center;
}
.hero-text-content {
align-items: center;
}
.hero-text-logo { margin-left: auto; margin-right: auto; }
.hero-cta { justify-content: center; }
.hero-mokey { max-width: 350px; }
.about-content { flex-direction: column; }
.tokenomics-content { flex-direction: column; align-items: center; }
.tokenomics-info, .tokenomics-chart-placeholder { width: 100%; max-width: 500px; }
}
@media (max-width: 768px) {
h1 { font-size: 2.5rem; }
h2 { font-size: 2rem; }
nav ul {
display: none; /* Hide desktop nav */
flex-direction: column;
width: 100%;
background-color: rgba(18, 18, 18, 0.98);
position: absolute;
top: 68px; /* Adjust based on header height */
left: 0;
padding: 1rem 0;
}
nav ul.active { display: flex; } /* Show when active */
nav ul li {
margin: 10px 0;
text-align: center;
}
.mobile-menu-toggle { display: block; }
.hero-text-content h1 { font-size: 2.8rem; }
.hero-text-content .subtitle { font-size: 1.5rem; }
.hero-mokey { max-width: 300px; }
#launch-timer { flex-wrap: wrap; gap: 10px; }
#launch-timer div { min-width: 80px; padding: 15px; }
#launch-timer div span { font-size: 2rem; }
.utility-grid { grid-template-columns: 1fr; } /* Stack cards */
.roadmap-list { padding-left: 20px; }
.roadmap-item::before { left: -18px; }
.team-grid { grid-template-columns: 1fr; }
.calculator-form { padding: 20px; }
.rainbow-text { font-size: 1.8rem; }
}
@media (max-width: 480px) {
body { font-size: 15px; }
h1 { font-size: 2.2rem; }
.hero-text-content h1 { font-size: 2.2rem; }
.hero-text-content .subtitle { font-size: 1.3rem; }
.hero-text-content p { font-size: 1rem; }
.btn { padding: 10px 20px; font-size: 1rem; }
.hero-mokey { max-width: 250px; }
#launch-timer div { min-width: 70px; padding: 10px; }
#launch-timer div span { font-size: 1.5rem; }
.social-icon { font-size: 1rem; padding: 8px 15px; min-width: 120px; }
.rainbow-text { font-size: 1.5rem; }
.custom-cursor { display: none !important; } /* Hide custom cursor on mobile */
body { cursor: auto; }
} /* Global Styles & Variables */
:root {
–primary-yellow: #FFDE00; /* Brighter Yellow */
–ape-black: #1c1c1c;
–ape-white: #ffffff;
–ape-stroke: #000000;
–bg-cream: #fffef7; /* Off-white background */
–card-bg-light: #fffacd; /* Lemon chiffon for cards */
–funky-blue: #00A9E0;
–funky-green: #98FB98; /* PaleGreen */
–luckiest-font: ‘Luckiest Guy’, cursive;
–body-font: ‘Open Sans’, sans-serif;
–border-thick: 4px solid var(–ape-stroke);
–border-medium: 2px solid var(–ape-stroke);
–border-radius-chunky: 15px;
–border-radius-smooth: 8px;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
scroll-behavior: smooth;
}
body {
font-family: var(–body-font);
background-color: var(–bg-cream);
color: var(–ape-black);
line-height: 1.6;
overflow-x: hidden;
cursor: none; /* Hide default cursor for custom one */
}
.custom-cursor { /* Same as before, ensure it fits new aesthetic */
position: fixed;
left: 0;
top: 0;
width: 25px;
height: 25px;
background-image: url(‘data:image/svg+xml;utf8,
‘);
background-size: contain;
pointer-events: none;
transform: translate(-50%, -50%);
transition: transform 0.1s;
z-index: 9999;
}
body:hover .custom-cursor { display: block; }
a:hover ~ .custom-cursor, button:hover ~ .custom-cursor {
transform: translate(-50%, -50%) scale(1.3) rotate(15deg);
}
/* Headings with Stroke */
h1, h2, h3, h4, .chunky-text {
font-family: var(–luckiest-font);
color: var(–primary-yellow);
-webkit-text-stroke: 2px var(–ape-stroke);
text-stroke: 2px var(–ape-stroke);
paint-order: stroke fill;
line-height: 1.1;
margin-bottom: 1rem;
text-align: center;
}
h1 { font-size: clamp(2.8rem, 7vw, 5rem); } /* Responsive font size */
h2.section-title {
font-size: clamp(2.2rem, 6vw, 4rem);
margin-bottom: 2rem;
padding: 10px 20px;
display: inline-block; /* To contain background */
background-color: var(–ape-black);
color: var(–primary-yellow);
-webkit-text-stroke-color: var(–primary-yellow); /* Stroke matches text on dark bg */
text-stroke-color: var(–primary-yellow);
border-radius: var(–border-radius-chunky);
border: var(–border-thick);
border-color: var(–primary-yellow); /* Yellow border on black bg */
box-shadow: 5px 5px 0px var(–ape-stroke);
}
h3 { font-size: clamp(1.8rem, 4vw, 2.5rem); }
h4 { font-size: clamp(1.5rem, 3vw, 2rem); color: var(–ape-black); -webkit-text-stroke-width: 1.5px; text-stroke-width: 1.5px;}
p { margin-bottom: 1rem; color: #333; }
a { color: var(–funky-blue); text-decoration: none; font-weight: bold; }
a:hover { color: var(–primary-yellow); text-decoration: underline; text-decoration-thickness: 2px; }
img { max-width: 100%; height: auto; display: block; }
section { padding: 60px 20px; text-align: center; }
/* Buttons – Chunky Style */
.btn {
font-family: var(–luckiest-font);
font-size: clamp(1rem, 2.5vw, 1.4rem);
padding: 12px 30px;
border-radius: 50px; /* Very rounded, almost pill-shaped */
border: var(–border-medium);
box-shadow: 3px 3px 0px var(–ape-stroke);
transition: all 0.2s ease-in-out;
display: inline-block;
text-align: center;
letter-spacing: 1px;
}
.btn:active {
transform: translate(3px, 3px);
box-shadow: none;
}
.btn-primary {
background-color: var(–primary-yellow);
color: var(–ape-stroke);
}
.btn-primary:hover {
background-color: #ffd000; /* Slightly darker yellow */
}
.btn-secondary {
background-color: var(–funky-blue);
color: var(–ape-white);
-webkit-text-stroke: 1px var(–ape-stroke); /* White text needs black stroke on blue */
text-stroke: 1px var(–ape-stroke);
}
.btn-secondary:hover {
background-color: #008bc5; /* Darker blue */
}
/* Header & Navigation – Funky */
header {
background-color: var(–primary-yellow);
border-bottom: var(–border-thick);
padding: 0.5rem 0;
position: sticky; /* Sticky for fun! */
top: 0;
z-index: 1000;
box-shadow: 0 4px 0px var(–ape-stroke);
}
nav {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
display: flex;
justify-content: space-between;
align-items: center;
}
.nav-logo-img { height: 50px; filter: drop-shadow(2px 2px 0 var(–ape-stroke)); }
.nav-logo-text { /* Removed for image only */ }
nav .desktop-nav { list-style: none; display: flex; }
nav .desktop-nav li { margin-left: 20px; }
nav .desktop-nav li a {
font-family: var(–luckiest-font);
font-size: 1.1rem;
color: var(–ape-stroke);
-webkit-text-stroke: 0; /* No stroke for nav links for clarity */
text-stroke: 0;
padding: 5px 8px;
border-radius: var(–border-radius-smooth);
transition: background-color 0.2s, color 0.2s;
}
nav .desktop-nav li a:hover {
background-color: var(–ape-stroke);
color: var(–primary-yellow);
text-decoration: none;
}
.social-header-icons a {
font-size: 1.8rem;
color: var(–ape-stroke);
margin-left: 15px;
transition: transform 0.2s;
}
.social-header-icons a:hover { transform: scale(1.2) rotate(10deg); }
.mobile-menu-toggle {
display: none;
background: none;
border: var(–border-medium);
border-radius: var(–border-radius-smooth);
color: var(–ape-stroke);
font-size: 1.8rem;
padding: 5px 10px;
cursor: pointer;
}
.mobile-nav { /* Hidden by default */
display: none;
list-style: none;
background-color: var(–primary-yellow);
border-top: var(–border-medium);
padding: 10px 0;
}
.mobile-nav.active { display: block; }
.mobile-nav li { text-align: center; margin: 10px 0; }
.mobile-nav li a {
font-family: var(–luckiest-font);
font-size: 1.3rem;
color: var(–ape-stroke);
padding: 10px;
}
/* Hero Section – Funky */
.hero-section {
min-height: 90vh;
display: flex;
align-items: center;
justify-content: center;
background-color: var(–funky-green); /* Fallback bg */
position: relative;
border-bottom: var(–border-thick);
overflow: hidden; /* For any stray mascot parts */
}
.hero-content-wrapper {
display: flex;
align-items: center;
justify-content: space-around;
gap: 20px;
max-width: 1200px;
width: 100%;
padding: 20px;
position: relative; /* For z-index if needed */
}
.hero-text-content { flex: 1.2; text-align: left; }
.hero-text-logo-main { max-width: 350px; margin-bottom: 1.5rem; filter: drop-shadow(3px 3px 0 var(–ape-stroke));}
.hero-text-content h1 {
text-align: left;
color: var(–ape-black); /* Black text on green bg */
-webkit-text-stroke-color: var(–primary-yellow);
text-stroke-color: var(–primary-yellow);
margin-bottom: 0.5rem;
}
.hero-text-content .subtitle {
font-family: var(–luckiest-font);
font-size: clamp(1.2rem, 3vw, 1.8rem);
color: var(–ape-black);
margin-bottom: 2rem;
-webkit-text-stroke: 1px var(–bg-cream);
text-stroke: 1px var(–bg-cream);
line-height: 1.3;
}
.hero-cta a { margin-right: 15px; margin-bottom: 10px; }
.hero-image-content { flex: 1; }
.hero-mokey {
max-width: 480px;
width: 100%;
filter: drop-shadow(5px 5px 0px var(–ape-stroke));
animation: bobbingMokey 3s ease-in-out infinite;
}
@keyframes bobbingMokey {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-20px); }
}
/* Parallax Background Utility */
.parallax-bg {
background-attachment: fixed;
background-position: center;
background-repeat: repeat; /* Repeat for patterns */
background-size: auto; /* Or cover if it’s a single image */
}
/* Marquee – Funky */
.marquee-section-funky {
background-color: var(–ape-stroke);
color: var(–primary-yellow);
padding: 15px 0;
overflow: hidden;
white-space: nowrap;
border-bottom: var(–border-thick);
border-color: var(–primary-yellow);
}
.marquee-funky span {
font-family: var(–luckiest-font);
font-size: 1.8rem;
display: inline-block;
padding-left: 100%;
animation: marquee-scroll-funky 20s linear infinite;
letter-spacing: 2px;
}
@keyframes marquee-scroll-funky {
0% { transform: translateX(0); }
100% { transform: translateX(-150%); } /* Faster scroll out */
}
/* Countdown – Funky */
.countdown-section-funky { background-color: var(–card-bg-light); border-bottom: var(–border-thick); }
#launch-timer {
display: flex;
justify-content: center;
flex-wrap: wrap;
gap: 20px;
margin: 30px 0;
}
#launch-timer div {
background: var(–primary-yellow);
color: var(–ape-stroke);
padding: 20px;
border-radius: var(–border-radius-chunky);
border: var(–border-medium);
min-width: 100px;
box-shadow: 3px 3px 0px var(–ape-stroke);
text-align: center;
}
#launch-timer div span {
display: block;
font-family: var(–luckiest-font);
font-size: clamp(2rem, 5vw, 3rem);
line-height: 1;
}
.launch-date-text { font-family: var(–luckiest-font); font-size: 1.2rem; color: var(–ape-stroke); }
.launch-date-text span { color: var(–funky-blue); }
/* Why ApeGang Section */
.why-apegang-section { background-color: var(–bg-cream); border-bottom: var(–border-thick);}
.section-subtitle {
font-family: var(–luckiest-font);
font-size: clamp(1.1rem, 2.5vw, 1.5rem);
color: var(–ape-black);
margin: -1rem auto 2rem auto;
max-width: 600px;
}
.why-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 30px;
max-width: 1000px;
margin: 0 auto;
}
.why-card {
background-color: var(–primary-yellow);
border: var(–border-medium);
border-radius: var(–border-radius-chunky);
padding: 25px;
box-shadow: 4px 4px 0 var(–ape-stroke);
transition: transform 0.2s, box-shadow 0.2s;
}
.why-card:hover {
transform: translate(-4px, -4px);
box-shadow: 8px 8px 0 var(–ape-stroke);
}
.card-icon-funky { font-size: 3rem; margin-bottom: 0.5rem; filter: drop-shadow(2px 2px 0px rgba(0,0,0,0.2));}
.why-card h3 { color: var(–ape-stroke); text-align: center; margin-top: 0.5rem; -webkit-text-stroke-width: 1.5px; }
.why-card p { color: var(–ape-black); text-align: center; font-size: 0.95rem; }
/* Discount Banner – Funky */
.discount-banner-section-funky { background: var(–ape-stroke); padding: 30px 20px; border-bottom: var(–border-thick); border-color: var(–primary-yellow); }
.rainbow-text-funky {
font-size: clamp(1.8rem, 5vw, 3rem);
font-weight: bold;
background: linear-gradient(to right, red, orange, yellow, green, var(–funky-blue), indigo, violet, red);
background-size: 200% auto;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: rainbow-flow 4s linear infinite;
-webkit-text-stroke: 0; /* No stroke on rainbow for better effect */
text-stroke: 0;
}
/* Keyframes rainbow-flow already defined in previous CSS, can be reused */
/* How to Buy Section */
.how-to-buy-section { background-color: var(–funky-green); border-bottom: var(–border-thick); } /* Fallback bg */
.how-to-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 25px;
max-width: 1000px;
margin: 2rem auto 0 auto;
}
.how-to-step {
background-color: var(–card-bg-light);
border: var(–border-medium);
border-radius: var(–border-radius-chunky);
padding: 20px;
box-shadow: 3px 3px 0 var(–ape-stroke);
}
.how-to-icon {
width: 60px;
height: 60px;
margin: 0 auto 15px auto;
object-fit: contain;
}
.how-to-step h4 { margin-bottom: 0.5rem; }
.how-to-step p { font-size: 0.9rem; }
/* Tokenomics – Funky */
.tokenomics-section-funky { background-color: var(–bg-cream); border-bottom: var(–border-thick); }
.ca-box {
background-color: var(–ape-black);
color: var(–primary-yellow);
padding: 15px 25px;
border-radius: var(–border-radius-chunky);
border: var(–border-medium);
border-color: var(–primary-yellow);
font-family: var(–luckiest-font);
font-size: clamp(1rem, 2.5vw, 1.4rem);
display: inline-flex; /* Use flex for better alignment */
align-items: center;
gap: 10px;
margin: 0 auto 2rem auto;
box-shadow: 3px 3px 0px var(–primary-yellow);
word-break: break-all; /* Allow address to wrap */
}
.ca-box span:first-child { font-weight: bold; }
#copyCAButton {
background: var(–primary-yellow);
color: var(–ape-stroke);
border: none;
border-radius: var(–border-radius-smooth);
padding: 8px 10px;
font-size: 1.1rem;
cursor: pointer;
transition: background-color 0.2s;
}
#copyCAButton:hover { background-color: #ffd000; }
.tokenomics-overview-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 25px;
max-width: 1100px;
margin: 0 auto 2rem auto;
}
.tokenomics-card { /* Reusing .why-card styles could be an option too */
background-color: var(–funky-green);
border: var(–border-medium);
border-radius: var(–border-radius-chunky);
padding: 20px;
box-shadow: 3px 3px 0 var(–ape-stroke);
}
.tokenomics-card h4 { color: var(–ape-black); margin-bottom: 0.5rem; }
.tokenomics-card p { font-size: 1rem; color: var(–ape-black); }
.tokenomics-chart-image-container { margin-top: 2rem; }
.funky-chart-img {
max-width: 400px;
border-radius: var(–border-radius-chunky);
border: var(–border-thick);
box-shadow: 5px 5px 0 var(–ape-stroke);
margin: 0 auto 1rem auto;
}
.tokenomics-chart-image-container p { font-style: italic; font-size: 0.9rem; }
/* Roadmap – Funky */
.roadmap-section-funky { background-color: var(–card-bg-light); border-bottom: var(–border-thick); } /* Fallback bg */
.roadmap-funky-container {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 30px;
max-width: 1200px;
margin: 0 auto;
}
.roadmap-phase-funky {
background-color: var(–primary-yellow);
border: var(–border-medium);
border-radius: var(–border-radius-chunky);
padding: 25px;
box-shadow: 4px 4px 0 var(–ape-stroke);
flex: 1; /* Allows them to grow */
min-width: 280px; /* Minimum width before wrapping */
max-width: 400px; /* Maximum width */
text-align: left;
}
.phase-icon {
font-size: 2.5rem;
float: left;
margin-right: 15px;
line-height: 1;
}
.roadmap-phase-funky h3 { color: var(–ape-stroke); text-align: left; -webkit-text-stroke-width: 1.5px; margin-bottom: 1rem;}
.roadmap-phase-funky ul { list-style: none; padding-left: 0; }
.roadmap-phase-funky li {
margin-bottom: 0.5rem;
font-size: 1rem;
color: var(–ape-black);
display: flex; /* Align checkmark and text */
align-items: flex-start;
}
.roadmap-phase-funky .check-mark {
font-family: sans-serif; /* For better checkmark rendering */
margin-right: 8px;
color: green;
font-weight: bold;
}
/* Meme Maker & Game Sections – Basic Layout */
.meme-maker-section, .mini-game-section-funky {
background-color: var(–bg-cream); /* Fallback */
border-bottom: var(–border-thick);
}
.meme-maker-container, .game-container-funky {
background-color: var(–card-bg-light);
border: var(–border-thick);
border-radius: var(–border-radius-chunky);
padding: 30px;
max-width: 800px;
margin: 0 auto;
box-shadow: 5px 5px 0 var(–ape-stroke);
}
/* Meme Maker Specifics */
.meme-maker-container { display: flex; flex-wrap: wrap; gap: 20px; }
.meme-canvas-area { flex: 1.5; min-width: 300px; }
#memeCanvas {
width: 100%;
height: auto;
max-height: 400px; /* Limit height */
border: var(–border-medium);
background-color: #eee;
border-radius: var(–border-radius-smooth);
}
.meme-controls { flex: 1; min-width: 250px; text-align: left;}
.meme-controls label {
display: block;
margin: 10px 0 5px 0;
font-family: var(–luckiest-font);
color: var(–ape-black);
font-size: 1.1rem;
}
.meme-controls input[type=”text”], .meme-controls input[type=”file”], .meme-controls input[type=”color”] {
width: 100%;
padding: 8px;
border-radius: var(–border-radius-smooth);
border: var(–border-medium);
margin-bottom: 10px;
font-size: 1rem;
}
.meme-controls input[type=”range”] { width: 100%; }
.meme-controls button, .meme-controls a.btn { width: 100%; margin-top: 10px; }
/* Game Specifics */
#apeRunnerGame {
width: 100%;
height: auto;
max-height: 400px;
border: var(–border-thick);
background-color: var(–funky-blue); /* Jungle sky */
border-radius: var(–border-radius-smooth);
display: block;
margin: 0 auto 1rem auto;
}
#gameInstructions, #gameOverScreen {
text-align: center;
font-family: var(–luckiest-font);
color: var(–ape-black);
}
#gameInstructions p, #gameOverScreen p { font-size: 1.2rem; margin-bottom: 1rem; }
#gameOverScreen h3 { color: red; -webkit-text-stroke-color: var(–ape-stroke); text-stroke-color: var(–ape-stroke); }
/* Community Section – Funky */
.community-section-funky { background-color: var(–funky-green); border-bottom: var(–border-thick); }
.social-links-funky {
display: flex;
justify-content: center;
flex-wrap: wrap;
gap: 20px;
margin-bottom: 2rem;
}
.social-btn { /* Re-use .btn styles and add specifics */
min-width: 200px;
}
.social-btn i { margin-right: 10px; }
.telegram-btn { background-color: #0088cc; color: white; -webkit-text-stroke: 1px var(–ape-stroke); text-stroke: 1px var(–ape-stroke); }
.telegram-btn:hover { background-color: #0077b3; }
.twitter-btn { background-color: #1DA1F2; color: white; -webkit-text-stroke: 1px var(–ape-stroke); text-stroke: 1px var(–ape-stroke); }
.twitter-btn:hover { background-color: #1a91da; }
.discord-btn { background-color: #7289DA; color: white; -webkit-text-stroke: 1px var(–ape-stroke); text-stroke: 1px var(–ape-stroke); }
.discord-btn:hover { background-color: #6273c4; }
.community-image {
max-width: 500px;
border-radius: var(–border-radius-chunky);
border: var(–border-thick);
box-shadow: 5px 5px 0 var(–ape-stroke);
margin: 2rem auto 0 auto;
}
/* Footer – Funky */
.footer-funky {
background-color: var(–primary-yellow);
color: var(–ape-stroke);
text-align: center;
padding: 30px 20px;
border-top: var(–border-thick);
font-family: var(–body-font);
}
.footer-logo { height: 60px; margin: 0 auto 1rem auto; filter: drop-shadow(2px 2px 0px var(–ape-stroke)); }
.footer-tagline {
font-family: var(–luckiest-font);
font-size: 1.5rem;
margin-bottom: 1rem;
-webkit-text-stroke: 1px var(–ape-stroke);
text-stroke: 1px var(–ape-stroke);
color: var(–ape-stroke); /* Or another color */
}
.footer-funky p { margin-bottom: 0.5rem; font-size: 0.9rem; }
.footer-funky a { color: var(–ape-stroke); font-weight: bold; }
.footer-funky a:hover { color: var(–funky-blue); }
.footer-funky .disclaimer { font-size: 0.8rem; color: #555; margin-top: 1rem; }
/* Floating Bananas Container */
.floating-banana-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
overflow: hidden;
z-index: -1; /* Behind most content but above body bg */
}
.banana-floater {
position: absolute;
bottom: -60px; /* Start off-screen */
width: 40px;
height: 40px;
background-image: url(‘data:image/svg+xml;utf8,
‘); /* Banana emoji */
background-size: contain;
background-repeat: no-repeat;
animation: floatUpwards linear infinite;
opacity: 0; /* Start invisible, JS will make it appear with delay */
}
@keyframes floatUpwards {
0% {
transform: translateY(0) translateX(0) rotate(0deg);
opacity: 0.8;
}
50% { /* Add some horizontal sway */
transform: translateY(-50vh) translateX(var(–sway, 20px)) rotate(180deg);
opacity: 0.6;
}
99% {
opacity: 0.1;
}
100% {
transform: translateY(-100vh) translateX(calc(var(–sway, 20px) * -1)) rotate(360deg);
opacity: 0;
}
}
/* Animation Classes (Can reuse existing .animate-on-scroll) */
.animate-on-scroll {
opacity: 0;
transform: translateY(50px) scale(0.95);
transition: opacity 0.6s ease-out, transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275); /* Funky ease */
}
.animate-on-scroll.is-visible {
opacity: 1;
transform: translateY(0) scale(1);
}
/* Responsive Design */
@media (max-width: 992px) {
.hero-content-wrapper { flex-direction: column-reverse; text-align: center; }
.hero-text-content { text-align: center; }
.hero-text-content h1 { text-align: center; }
.hero-text-logo-main { margin-left: auto; margin-right: auto; }
.hero-mokey { max-width: 350px; }
}
@media (max-width: 768px) {
nav .desktop-nav, .social-header-icons { display: none; }
.mobile-menu-toggle { display: block; }
.hero-mokey { max-width: 300px; }
#launch-timer div { min-width: 80px; padding: 15px; }
.how-to-grid { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }
.tokenomics-overview-grid { grid-template-columns: 1fr; }
.roadmap-funky-container { flex-direction: column; align-items: center; }
.roadmap-phase-funky { min-width: 90%; }
.meme-maker-container { flex-direction: column; }
.ca-box { flex-direction: column; text-align: center; font-size: 1rem;}
.ca-box #contractAddress { font-size: 0.8rem; }
}
@media (max-width: 480px) {
body { cursor: auto; } /* No custom cursor on small screens */
.custom-cursor { display: none !important; }
.hero-mokey { max-width: 250px; }
#launch-timer div { min-width: calc(50% – 10px); } /* Two per row */
#launch-timer div span { font-size: 1.8rem; }
.btn { padding: 10px 20px; }
.social-btn { min-width: 150px; }
}
/* … (Keep all previous styles from the “Bulldog-inspired” version) … */
/* Hero Background – Banana Pattern */
.hero-bg-banana-pattern {
position: relative; /* Needed for pseudo-element */
background-color: var(–funky-green); /* Fallback */
}
.hero-bg-banana-pattern::before {
content: “”;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: repeating-linear-gradient(
45deg,
transparent,
transparent 15px,
rgba(255, 222, 0, 0.1) 15px, /* Semi-transparent banana yellow */
rgba(255, 222, 0, 0.1) 30px
),
repeating-linear-gradient(
-45deg,
transparent,
transparent 15px,
rgba(255, 222, 0, 0.1) 15px,
rgba(255, 222, 0, 0.1) 30px
);
/* Or use an actual SVG/PNG repeating pattern for banana emojis */
/* background-image: url(‘path/to/your/banana-emoji-pattern.svg’); */
/* background-size: 100px 100px; */ /* Adjust size */
/* background-repeat: repeat; */
opacity: 0.3; /* Make it subtle */
z-index: 0; /* Behind hero content */
}
.hero-content-wrapper { /* Ensure hero content is above the pattern */
position: relative;
z-index: 1;
}
.bounce-text { /* For Hero H1 */
animation: textBounce 0.8s ease-out;
}
@keyframes textBounce {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.1); }
}
.btn-bounce:hover {
animation: btnBounceEffect 0.5s ease-in-out;
}
@keyframes btnBounceEffect {
0%, 100% { transform: translateY(0) scale(1); }
50% { transform: translateY(-5px) scale(1.05); }
}
/* Banana Clicker Game Styles */
.banana-clicker-section { background-color: var(–card-bg-light); border-bottom: var(–border-thick); }
.clicker-game-area {
background-color: var(–funky-green);
border: var(–border-thick);
border-radius: var(–border-radius-chunky);
padding: 20px;
max-width: 900px;
margin: 0 auto;
box-shadow: 5px 5px 0 var(–ape-stroke);
display: flex;
flex-direction: column;
align-items: center;
gap: 20px;
}
.clicker-stats p {
font-size: clamp(1.2rem, 3vw, 1.8rem);
margin-bottom: 0.5rem;
color: var(–ape-stroke);
}
.clicker-stats p.chunky-text {
font-size: clamp(1.5rem, 4vw, 2.2rem);
-webkit-text-stroke-color: var(–primary-yellow);
text-stroke-color: var(–primary-yellow);
color: var(–ape-black);
}
.clicker-main {
position: relative; /* For click effects */
}
.clickable-banana {
width: clamp(150px, 30vw, 250px);
cursor: pointer;
filter: drop-shadow(5px 5px 0px rgba(0,0,0,0.3));
transition: transform 0.1s ease-out;
}
.clickable-banana:active {
transform: scale(0.95) rotate(-5deg);
}
#clickEffectContainer {
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
pointer-events: none; /* Clicks pass through */
}
.click-effect { /* Little +1 banana animation */
position: absolute;
font-family: var(–luckiest-font);
font-size: 1.5rem;
color: var(–primary-yellow);
-webkit-text-stroke: 1px var(–ape-stroke);
text-stroke: 1px var(–ape-stroke);
animation: floatUpAndFade 1s ease-out forwards;
user-select: none;
}
@keyframes floatUpAndFade {
to {
transform: translateY(-50px);
opacity: 0;
}
}
.clicker-shop {
width: 100%;
max-width: 600px;
margin-top: 20px;
border-top: var(–border-medium);
padding-top: 20px;
}
.shop-item {
background-color: var(–primary-yellow);
border: var(–border-medium);
border-radius: var(–border-radius-smooth);
padding: 10px 15px;
margin-bottom: 15px;
display: flex;
align-items: center;
justify-content: space-between;
box-shadow: 3px 3px 0 var(–ape-stroke);
}
.shop-item.disabled {
opacity: 0.6;
pointer-events: none; /* Disable button clicks */
background-color: #ccc;
}
.shop-item.disabled button {
background-color: #aaa;
}
.item-icon { font-size: 2rem; margin-right: 15px; }
.item-details { flex-grow: 1; text-align: left;}
.item-details h4 {
font-size: clamp(1.1rem, 2.5vw, 1.4rem);
color: var(–ape-stroke);
margin-bottom: 0.2rem;
text-align: left;
-webkit-text-stroke-width: 1px;
}
.item-details p { font-size: 0.9rem; margin-bottom: 0.1rem; color: var(–ape-black); }
.btn-shop {
padding: 8px 15px;
font-size: 1rem;
background-color: var(–funky-blue);
color: var(–ape-white);
-webkit-text-stroke: 1px var(–ape-stroke);
}
.btn-shop:hover { background-color: #007bb5; }
/* Meme Maker Presets */
.meme-presets {
width: 100%;
margin-bottom: 20px;
text-align: center;
}
.meme-presets label { display: block; margin-bottom: 5px; color: var(–ape-stroke); }
#memePresetSelect {
font-family: var(–luckiest-font);
padding: 8px 12px;
border-radius: var(–border-radius-smooth);
border: var(–border-medium);
font-size: 1.1rem;
background-color: var(–ape-white);
min-width: 250px;
}
/* Shill Text Generator Styles */
.shill-generator-section { background-color: var(–card-bg-light); border-bottom: var(–border-thick); }
.shill-generator-container {
background-color: var(–primary-yellow);
border: var(–border-thick);
border-radius: var(–border-radius-chunky);
padding: 20px;
max-width: 900px;
margin: 0 auto;
box-shadow: 5px 5px 0 var(–ape-stroke);
display: flex;
flex-wrap: wrap;
gap: 30px;
}
.shill-inputs, .shill-outputs {
flex: 1;
min-width: 300px;
}
.shill-inputs h3, .shill-outputs h3 {
color: var(–ape-stroke);
text-align: center;
margin-bottom: 15px;
}
.shill-inputs label {
display: block;
font-family: var(–luckiest-font);
color: var(–ape-black);
font-size: 1.1rem;
margin: 10px 0 5px 0;
}
.shill-inputs input[type=”text”], .shill-inputs select {
width: 100%;
padding: 10px;
border-radius: var(–border-radius-smooth);
border: var(–border-medium);
font-size: 1rem;
margin-bottom: 10px;
}
#generateShillBtn { width: 100%; margin-top: 15px; }
#shillOutputArea {
background-color: var(–ape-white);
border: var(–border-medium);
border-radius: var(–border-radius-smooth);
padding: 15px;
min-height: 200px;
max-height: 400px;
overflow-y: auto;
font-size: 0.95rem;
}
.shill-message {
background-color: var(–funky-green);
border: 1px solid var(–ape-stroke);
border-radius: var(–border-radius-smooth);
padding: 10px;
margin-bottom: 10px;
position: relative; /* For copy button */
}
.shill-message p { margin-bottom: 5px; word-wrap: break-word; }
.copy-shill-btn {
position: absolute;
top: 5px;
right: 5px;
background: var(–funky-blue);
color: white;
border: none;
border-radius: 5px;
padding: 3px 6px;
font-size: 0.8rem;
cursor: pointer;
}
.copy-shill-btn:hover { background: #007bb5; }
/* Floating Bananas Enhanced */
@keyframes floatUpwards { /* Make it more wiggly and varied */
0% { transform: translateY(0) translateX(0) rotate(0deg); opacity: 0.8; }
25% { transform: translateY(-25vh) translateX(calc(var(–sway) * 0.5)) rotate(var(–rotate1, 90deg)); }
50% { transform: translateY(-50vh) translateX(var(–sway)) rotate(var(–rotate2, 180deg)); opacity: 0.6; }
75% { transform: translateY(-75vh) translateX(calc(var(–sway) * 0.3)) rotate(var(–rotate1, 270deg));}
99% { opacity: 0.1; }
100% { transform: translateY(-105vh) translateX(calc(var(–sway) * -0.2)) rotate(var(–rotate2, 360deg)); opacity: 0;}
}
.banana-floater {
/* … existing styles … */
animation: floatUpwards linear infinite; /* Ensure this is set */
/* JS will set –sway, –rotate1, –rotate2 */
}