mycopunk-website/index.html

547 lines
18 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Coming Soon - MycopunkXYZ</title>
<meta name="description" content="MycopunkXYZ - Coming soon. A mycelial vision for decentralized futures.">
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🍄</text></svg>">
<!-- Open Graph / Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://mycopunk.xyz/">
<meta property="og:title" content="MycopunkXYZ - Coming Soon">
<meta property="og:description" content="A mycelial vision for decentralized futures.">
<meta property="og:image" content="https://mycopunk.xyz/og-image.jpg">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:url" content="https://mycopunk.xyz/">
<meta name="twitter:title" content="MycopunkXYZ - Coming Soon">
<meta name="twitter:description" content="A mycelial vision for decentralized futures.">
<meta name="twitter:image" content="https://mycopunk.xyz/og-image.jpg">
<style>
:root {
--primary-color: #D27D2D;
--secondary-color: #8E4A1B;
--accent-color: #E6B17E;
--background-color: #1A1006;
--text-color: #F5E6D8;
--mycelium-light: #FFC38B;
--mycelium-medium: #D9864D;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Nunito', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background-color: var(--background-color);
color: var(--text-color);
line-height: 1.6;
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 2rem;
overflow-x: hidden;
position: relative;
}
.mycelium-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 0;
overflow: hidden;
opacity: 0.2;
pointer-events: none;
}
.mycelium-strand {
position: absolute;
background-color: var(--mycelium-light);
border-radius: 50px;
transform-origin: center;
}
.container {
max-width: 900px;
text-align: center;
position: relative;
z-index: 1;
background-color: rgba(26, 16, 6, 0.7);
padding: 3rem;
border-radius: 16px;
box-shadow: 0 0 30px rgba(210, 125, 45, 0.2);
backdrop-filter: blur(10px);
border: 1px solid rgba(210, 125, 45, 0.3);
}
.logo {
font-size: 3.5rem;
font-weight: 800;
margin-bottom: 0.5rem;
background: linear-gradient(90deg, var(--primary-color), var(--accent-color));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
position: relative;
font-family: 'Courier New', monospace;
letter-spacing: -1px;
}
.logo span {
color: var(--mycelium-light);
}
.tagline {
font-size: 1.4rem;
font-weight: 300;
margin-bottom: 2rem;
color: var(--accent-color);
font-style: italic;
}
.description {
margin-bottom: 3rem;
max-width: 700px;
margin-left: auto;
margin-right: auto;
font-size: 1.1rem;
}
.features {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 2rem;
margin-bottom: 3rem;
}
.feature {
flex: 1 1 250px;
padding: 1.5rem;
background-color: rgba(142, 74, 27, 0.2);
border-radius: 12px;
transition: all 0.5s ease;
backdrop-filter: blur(5px);
border: 1px solid rgba(226, 177, 126, 0.2);
position: relative;
overflow: hidden;
}
.feature::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 4px;
background: linear-gradient(90deg, var(--primary-color), var(--accent-color));
opacity: 0;
transition: opacity 0.5s ease;
}
.feature:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(210, 125, 45, 0.2);
}
.feature:hover::before {
opacity: 1;
}
.feature-title {
font-size: 1.3rem;
margin-bottom: 0.8rem;
color: var(--primary-color);
}
.cta {
display: inline-block;
background: linear-gradient(90deg, var(--secondary-color), var(--primary-color));
color: var(--text-color);
padding: 1rem 2.5rem;
border-radius: 50px;
font-weight: 600;
text-decoration: none;
transition: all 0.3s ease;
border: none;
cursor: pointer;
margin-bottom: 2rem;
font-size: 1.1rem;
position: relative;
overflow: hidden;
box-shadow: 0 5px 15px rgba(142, 74, 27, 0.4);
}
.cta::after {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg,
rgba(255, 255, 255, 0),
rgba(255, 255, 255, 0.2),
rgba(255, 255, 255, 0));
transition: all 0.5s ease;
}
.cta:hover {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(142, 74, 27, 0.6);
}
.cta:hover::after {
left: 100%;
}
.footer {
margin-top: 4rem;
font-size: 0.95rem;
opacity: 0.8;
}
.footer a {
color: var(--accent-color);
text-decoration: none;
}
.footer a:hover {
text-decoration: underline;
}
.countdown {
margin: 2.5rem 0;
display: flex;
justify-content: center;
gap: 1.5rem;
}
.countdown-item {
display: flex;
flex-direction: column;
align-items: center;
background-color: rgba(142, 74, 27, 0.15);
padding: 1.2rem;
border-radius: 12px;
min-width: 100px;
backdrop-filter: blur(5px);
border: 1px solid rgba(226, 177, 126, 0.2);
position: relative;
overflow: hidden;
}
.countdown-item::after {
content: '';
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: radial-gradient(circle at center, rgba(210, 125, 45, 0.1) 0%, rgba(26, 16, 6, 0) 70%);
z-index: -1;
}
.countdown-number {
font-size: 2.5rem;
font-weight: 700;
color: var(--primary-color);
font-family: 'Courier New', monospace;
}
.countdown-label {
font-size: 0.85rem;
text-transform: uppercase;
letter-spacing: 2px;
color: var(--accent-color);
margin-top: 0.5rem;
}
.spore {
position: absolute;
width: 8px;
height: 8px;
background-color: var(--mycelium-medium);
border-radius: 50%;
filter: blur(1px);
opacity: 0;
pointer-events: none;
z-index: 0;
animation: float 8s linear infinite;
}
@keyframes float {
0% {
transform: translateY(0) rotate(0deg);
opacity: 0;
}
10% {
opacity: 0.5;
}
90% {
opacity: 0.5;
}
100% {
transform: translateY(-100vh) rotate(360deg);
opacity: 0;
}
}
.wisdom {
position: fixed;
bottom: 20px;
color: var(--mycelium-light);
font-style: italic;
opacity: 0;
transition: opacity 0.5s ease;
font-size: 0.9rem;
text-align: center;
max-width: 80%;
}
@media (max-width: 768px) {
.container {
padding: 2rem;
}
.logo {
font-size: 2.5rem;
}
.features {
flex-direction: column;
}
.countdown {
flex-wrap: wrap;
}
.countdown-item {
min-width: 80px;
}
}
</style>
</head>
<body>
<div class="mycelium-bg" id="mycelium-bg"></div>
<div class="container">
<h1 class="logo">myco<span>punk</span>.xyz</h1>
<p class="tagline">Building from beneath the surface</p>
<p class="description">
A network-based approach to technology and community. Drawing inspiration from mycelial structures to create resilient systems.
Moving slowly and mending things.
</p>
<!-- Newsletter signup -->
<div class="newsletter-section" style="margin: 2rem 0;">
<h3 style="color: var(--primary-color); margin-bottom: 0.5rem;">Join the Mycelial Network</h3>
<p style="font-size: 0.9rem; margin-bottom: 1rem; opacity: 0.8;">Subscribe for updates on mycopunk principles and community.</p>
<form id="newsletter-form" style="display: flex; flex-direction: column; gap: 0.75rem; max-width: 400px; margin: 0 auto;">
<input type="email" id="newsletter-email" placeholder="your@email.com" required
style="padding: 0.75rem 1rem; border-radius: 8px; border: 1px solid rgba(210, 125, 45, 0.3); background: rgba(26, 16, 6, 0.8); color: var(--text-color); font-size: 1rem;">
<button type="submit" class="cta" style="margin-bottom: 0; padding: 0.75rem 1.5rem;">Subscribe</button>
</form>
<p id="newsletter-message" style="margin-top: 0.75rem; font-size: 0.9rem; display: none;"></p>
<p style="font-size: 0.75rem; opacity: 0.6; margin-top: 0.5rem;">No spam, unsubscribe anytime.</p>
</div>
<a href="https://mycofi.earth" class="cta" id="cta-button">Let's Get Anastomosing</a>
<div class="footer">
<p>Underground networks, emergent possibilities.</p>
</div>
</div>
<div class="wisdom" id="wisdom"></div>
<script>
// Generate mycelium background
const myceliumBg = document.getElementById('mycelium-bg');
const numStrands = 100;
for (let i = 0; i < numStrands; i++) {
createMyceliumStrand();
}
function createMyceliumStrand() {
const strand = document.createElement('div');
strand.className = 'mycelium-strand';
// Random properties
const startX = Math.random() * 100;
const startY = Math.random() * 100;
const length = 5 + Math.random() * 20;
const width = 1 + Math.random() * 3;
const angle = Math.random() * 360;
const opacity = 0.1 + Math.random() * 0.4;
const color = Math.random() > 0.7 ? 'var(--mycelium-medium)' : 'var(--mycelium-light)';
strand.style.left = `${startX}vw`;
strand.style.top = `${startY}vh`;
strand.style.width = `${length}px`;
strand.style.height = `${width}px`;
strand.style.transform = `rotate(${angle}deg)`;
strand.style.opacity = opacity;
strand.style.backgroundColor = color;
myceliumBg.appendChild(strand);
// Branching logic
if (Math.random() > 0.7 && length > 10) {
setTimeout(() => {
createBranch(startX, startY, angle);
}, Math.random() * 1000);
}
}
function createBranch(x, y, parentAngle) {
const strand = document.createElement('div');
strand.className = 'mycelium-strand';
// Branch properties
const branchAngle = parentAngle + (-30 + Math.random() * 60);
const length = 5 + Math.random() * 15;
const width = 1 + Math.random() * 2;
const opacity = 0.1 + Math.random() * 0.3;
strand.style.left = `${x}vw`;
strand.style.top = `${y}vh`;
strand.style.width = `${length}px`;
strand.style.height = `${width}px`;
strand.style.transform = `rotate(${branchAngle}deg)`;
strand.style.opacity = opacity;
myceliumBg.appendChild(strand);
}
// Rising spores animation
function createSpores() {
const numSpores = 2;
for (let i = 0; i < numSpores; i++) {
setTimeout(() => {
const spore = document.createElement('div');
spore.className = 'spore';
const x = 10 + Math.random() * 80;
const delay = Math.random() * 5;
const duration = 8 + Math.random() * 7;
spore.style.left = `${x}vw`;
spore.style.bottom = '0';
spore.style.animationDelay = `${delay}s`;
spore.style.animationDuration = `${duration}s`;
document.body.appendChild(spore);
// Remove after animation completes
setTimeout(() => {
spore.remove();
}, (delay + duration) * 1000);
}, Math.random() * 1000);
}
}
// Create spores periodically
setInterval(createSpores, 2000);
// Countdown timer removed as requested
// Mushroom wisdom quotes - more understated
const mushroomWisdom = [
"Networks precede structures.",
"Underground connections sustain ecosystems.",
"Strong networks bend, they don't break.",
"Resilience through distributed systems.",
"What grows beneath the surface shapes what emerges above.",
"Cooperation amplifies potential.",
"Systems that learn from mycelium.",
"Interconnected, adaptable, resilient.",
"From decomposition comes renewal.",
"Distributed networks outlast centralized systems."
];
const wisdomElement = document.getElementById('wisdom');
let currentWisdomIndex = 0;
function showWisdom() {
wisdomElement.textContent = mushroomWisdom[currentWisdomIndex];
wisdomElement.style.opacity = '1';
setTimeout(() => {
wisdomElement.style.opacity = '0';
currentWisdomIndex = (currentWisdomIndex + 1) % mushroomWisdom.length;
}, 5000);
}
// Show wisdom periodically
setInterval(showWisdom, 8000);
showWisdom(); // Show first wisdom immediately
// CTA button hover effect
document.getElementById('cta-button').addEventListener('mouseenter', function() {
createSpores();
});
// Newsletter form handler
const LISTMONK_URL = 'https://newsletter.jeffemmett.com';
const LIST_UUID = '1f477b24-17ec-4ea1-8248-4f629d2365e4'; // Mycopunk list
document.getElementById('newsletter-form').addEventListener('submit', async function(e) {
e.preventDefault();
const email = document.getElementById('newsletter-email').value;
const messageEl = document.getElementById('newsletter-message');
const submitBtn = this.querySelector('button[type="submit"]');
submitBtn.textContent = 'Subscribing...';
submitBtn.disabled = true;
try {
const response = await fetch(LISTMONK_URL + '/subscription/form', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams({
email: email,
list: LIST_UUID,
name: '',
}),
});
if (response.ok) {
messageEl.textContent = 'Check your email to confirm your subscription!';
messageEl.style.color = 'var(--accent-color)';
messageEl.style.display = 'block';
document.getElementById('newsletter-email').value = '';
} else {
throw new Error('Subscription failed');
}
} catch (error) {
messageEl.textContent = 'Something went wrong. Please try again.';
messageEl.style.color = '#ff6b6b';
messageEl.style.display = 'block';
}
submitBtn.textContent = 'Subscribe';
submitBtn.disabled = false;
});
</script>
</body>
</html>