Website updates based on round 2 feedback
- Subtitle: removed colon, uppercase "(TO BE DEFINED)", larger font - Floating concepts: Reality-bending, Speculative fiction, Games as organisations - Shape the Programme: co-labs → "mycollabs" - Game Prototyping: "Any collectively prototyped games..." - Sustainable Models: shortened text, "Exploring...for sustaining the network" - Eutopia track: added "Utopia on the Tabletop", removed "The Transition Year" - When/Where: removed redundant "in the Austrian Alps", added Commons Hub photo - Register interest: full sentence about 60 participant limit - Form: "Other" role shows text input, updated thread names to match programme - Added newsletter subscription checkbox - Fixed Commons Hub link, removed duplicate Newsletter button - Backend: captures otherRole and newsletter fields Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
196ca4589d
commit
ca3494a74b
95
index.html
95
index.html
|
|
@ -277,10 +277,11 @@
|
|||
|
||||
.subtitle {
|
||||
font-family: 'Space Mono', monospace;
|
||||
font-size: clamp(1rem, 3vw, 1.5rem);
|
||||
font-size: clamp(1.2rem, 3.5vw, 1.8rem);
|
||||
color: var(--text-secondary);
|
||||
margin-bottom: 2rem;
|
||||
font-style: italic;
|
||||
letter-spacing: 0.1em;
|
||||
}
|
||||
|
||||
.hero-meta {
|
||||
|
|
@ -590,6 +591,21 @@
|
|||
animation: mountainPulse 4s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.venue-image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
opacity: 0.85;
|
||||
transition: opacity 0.3s ease;
|
||||
}
|
||||
|
||||
.location-map:hover .venue-image {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@keyframes mountainPulse {
|
||||
0%, 100% { transform: scale(1); opacity: 0.5; }
|
||||
50% { transform: scale(1.05); opacity: 0.7; }
|
||||
|
|
@ -954,6 +970,19 @@
|
|||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
.newsletter-checkbox {
|
||||
width: 100%;
|
||||
justify-content: flex-start;
|
||||
background: transparent;
|
||||
border: 1px dashed rgba(157, 78, 221, 0.3);
|
||||
padding: 0.75rem 1rem;
|
||||
}
|
||||
|
||||
.newsletter-checkbox:hover {
|
||||
border-color: var(--accent-cyan);
|
||||
background: rgba(0, 217, 255, 0.05);
|
||||
}
|
||||
|
||||
.form-submit {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
|
@ -1226,7 +1255,7 @@
|
|||
<div class="glitch-wrapper">
|
||||
<h1 class="glitch" data-text="WORLDPLAY"><span class="highlight">WORLD</span>PLAY</h1>
|
||||
</div>
|
||||
<p class="subtitle">: To be Defined</p>
|
||||
<p class="subtitle">(TO BE DEFINED)</p>
|
||||
|
||||
<div class="cta-group">
|
||||
<a href="#register" class="btn btn-primary">Register Interest</a>
|
||||
|
|
@ -1255,15 +1284,15 @@
|
|||
<div class="about-visual">
|
||||
<div class="floating-card">
|
||||
<span class="emoji">🎭</span>
|
||||
Reality as<br>design space
|
||||
Reality-bending
|
||||
</div>
|
||||
<div class="floating-card">
|
||||
<span class="emoji">✒️</span>
|
||||
Speculative<br>fictions
|
||||
Speculative<br>fiction
|
||||
</div>
|
||||
<div class="floating-card">
|
||||
<span class="emoji">🎲</span>
|
||||
Games as<br>social orgs
|
||||
Games as<br>organisations
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1282,7 +1311,7 @@
|
|||
<div class="community-card">
|
||||
<span class="icon">🎤</span>
|
||||
<h3>Shape the Programme</h3>
|
||||
<p>Participants can shape the programme in advance and on-site by pitching sessions and co-labs</p>
|
||||
<p>Participants can shape the programme in advance and on-site by pitching sessions and "mycollabs"</p>
|
||||
</div>
|
||||
<div class="community-card">
|
||||
<span class="icon">📚</span>
|
||||
|
|
@ -1292,7 +1321,7 @@
|
|||
<div class="community-card">
|
||||
<span class="icon">🎮</span>
|
||||
<h3>Game Prototyping</h3>
|
||||
<p>Selected games will be prototyped, resourced for production, and shared as open designs</p>
|
||||
<p>Any collectively prototyped games will be resourced for production and shared as open designs</p>
|
||||
</div>
|
||||
<div class="community-card">
|
||||
<span class="icon">🔗</span>
|
||||
|
|
@ -1302,7 +1331,7 @@
|
|||
<div class="community-card">
|
||||
<span class="icon">💰</span>
|
||||
<h3>Sustainable Models</h3>
|
||||
<p>We'll explore alternative revenue and self-sustaining models for keeping the WORLDPLAY network alive—co-ops, art DAOs, fiction-fueled crowdfunds, functional guerrilla futuring merch, and more</p>
|
||||
<p>Exploring alternative revenue and self-sustaining models for sustaining the network—co-ops, art DAOs, fiction-fueled crowdfunds, and more</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1400,12 +1429,12 @@
|
|||
</div>
|
||||
<div class="track-examples">
|
||||
<h4>Examples</h4>
|
||||
<span class="example-tag">Utopia on the Tabletop</span>
|
||||
<span class="example-tag">Game-Changers: The Game</span>
|
||||
<span class="example-tag">Game Commons Online Platform</span>
|
||||
<span class="example-tag">Half-Earth Socialism</span>
|
||||
<span class="example-tag">Post-Growth Toolkit – The Game</span>
|
||||
<span class="example-tag">The Social Strike Game</span>
|
||||
<span class="example-tag">The Transition Year</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1465,14 +1494,14 @@
|
|||
<span class="icon">🏠</span>
|
||||
<div>
|
||||
<strong>Commons Hub</strong>
|
||||
<span>A co-working, co-living and event venue in the Austrian Alps that harbours artists, digital movements and decentralized communities</span>
|
||||
<span>A co-working, co-living and event venue that harbours artists, digital movements and decentralized communities</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="location-map">
|
||||
<span class="mountain-icon">🏔️</span>
|
||||
<img src="https://www.commons-hub.at/wp-content/uploads/2023/03/Commons-Hub-building-min-scaled.jpg" alt="Commons Hub venue" class="venue-image">
|
||||
<div class="location-badge">
|
||||
🇦🇹 Austria · Alps · Commons Hub
|
||||
</div>
|
||||
|
|
@ -1486,7 +1515,7 @@
|
|||
<div class="section-header">
|
||||
<span class="section-tag">Join Us</span>
|
||||
<h2 class="section-title">Register Interest</h2>
|
||||
<p class="section-subtitle">First edition. Limited spaces.</p>
|
||||
<p class="section-subtitle">This is the first edition of WORLDPLAY and spaces are limited to 60 participants. Express your interest early to secure your place.</p>
|
||||
</div>
|
||||
|
||||
<div class="register-content">
|
||||
|
|
@ -1545,7 +1574,7 @@
|
|||
|
||||
<div class="form-group">
|
||||
<label>How would you describe yourself?</label>
|
||||
<select name="role">
|
||||
<select name="role" id="role-select">
|
||||
<option value="">Select one...</option>
|
||||
<option value="writer">Sci-Fi Writer / Storyteller</option>
|
||||
<option value="gamemaker">Game Designer / Maker</option>
|
||||
|
|
@ -1560,6 +1589,11 @@
|
|||
</select>
|
||||
</div>
|
||||
|
||||
<div class="form-group" id="other-role-group" style="display: none;">
|
||||
<label>Please describe yourself</label>
|
||||
<input type="text" name="otherRole" id="other-role-input" placeholder="How would you describe yourself?">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>Which threads interest you most?</label>
|
||||
<div class="checkbox-group">
|
||||
|
|
@ -1569,15 +1603,11 @@
|
|||
</label>
|
||||
<label class="checkbox-item">
|
||||
<input type="checkbox" name="interests" value="fiction">
|
||||
<span>✒️ Science Fictions</span>
|
||||
</label>
|
||||
<label class="checkbox-item">
|
||||
<input type="checkbox" name="interests" value="worlding">
|
||||
<span>🛠 Guerrilla Futuring</span>
|
||||
<span>✒️ Econ Sci-Fi</span>
|
||||
</label>
|
||||
<label class="checkbox-item">
|
||||
<input type="checkbox" name="interests" value="games">
|
||||
<span>🎲 Game Commons</span>
|
||||
<span>🎲 Eutopian Games</span>
|
||||
</label>
|
||||
<label class="checkbox-item">
|
||||
<input type="checkbox" name="interests" value="infrastructure">
|
||||
|
|
@ -1605,6 +1635,13 @@
|
|||
<textarea name="message" placeholder="Tell us about your work, what excites you about WORLDPLAY, or any questions you have..."></textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="checkbox-item newsletter-checkbox">
|
||||
<input type="checkbox" name="newsletter" value="yes">
|
||||
<span>Subscribe to the WORLDPLAY newsletter for updates</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="form-submit">
|
||||
<button type="submit" class="btn btn-primary">Register Interest</button>
|
||||
</div>
|
||||
|
|
@ -1646,8 +1683,7 @@
|
|||
<h4>Connect</h4>
|
||||
<ul>
|
||||
<li><a href="mailto:hello@worldplay.earth">Email</a></li>
|
||||
<li><a href="#">Newsletter</a></li>
|
||||
<li><a href="https://commonshub.net" target="_blank" rel="noopener">Commons Hub</a></li>
|
||||
<li><a href="https://www.commons-hub.at" target="_blank" rel="noopener">Commons Hub</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -1679,6 +1715,23 @@
|
|||
});
|
||||
});
|
||||
|
||||
// Role "Other" dropdown functionality
|
||||
const roleSelect = document.getElementById('role-select');
|
||||
const otherRoleGroup = document.getElementById('other-role-group');
|
||||
const otherRoleInput = document.getElementById('other-role-input');
|
||||
|
||||
if (roleSelect && otherRoleGroup) {
|
||||
roleSelect.addEventListener('change', () => {
|
||||
if (roleSelect.value === 'other') {
|
||||
otherRoleGroup.style.display = 'block';
|
||||
otherRoleInput.focus();
|
||||
} else {
|
||||
otherRoleGroup.style.display = 'none';
|
||||
otherRoleInput.value = '';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Particle animation
|
||||
const canvas = document.getElementById('particles-canvas');
|
||||
const ctx = canvas.getContext('2d');
|
||||
|
|
|
|||
11
server.js
11
server.js
|
|
@ -78,12 +78,13 @@ async function appendToGoogleSheet(registration) {
|
|||
Array.isArray(registration.interests) ? registration.interests.join(', ') : registration.interests,
|
||||
registration.contribute,
|
||||
registration.message,
|
||||
registration.newsletter ? 'Yes' : 'No',
|
||||
registration.id
|
||||
]];
|
||||
|
||||
await sheets.spreadsheets.values.append({
|
||||
spreadsheetId: GOOGLE_SHEET_ID,
|
||||
range: 'Registrations!A:J',
|
||||
range: 'Registrations!A:K',
|
||||
valueInputOption: 'USER_ENTERED',
|
||||
insertDataOption: 'INSERT_ROWS',
|
||||
requestBody: { values },
|
||||
|
|
@ -239,7 +240,7 @@ async function sendConfirmationEmail(registration) {
|
|||
// Registration endpoint
|
||||
app.post('/api/register', async (req, res) => {
|
||||
try {
|
||||
const { firstName, lastName, email, location, role, interests, contribute, message } = req.body;
|
||||
const { firstName, lastName, email, location, role, otherRole, interests, contribute, message, newsletter } = req.body;
|
||||
|
||||
// Validation
|
||||
if (!firstName || !lastName || !email) {
|
||||
|
|
@ -265,10 +266,11 @@ app.post('/api/register', async (req, res) => {
|
|||
lastName: lastName.trim(),
|
||||
email: email.toLowerCase().trim(),
|
||||
location: location?.trim() || '',
|
||||
role: role || '',
|
||||
role: role === 'other' && otherRole ? `Other: ${otherRole.trim()}` : (role || ''),
|
||||
interests: interests || [],
|
||||
contribute: contribute || '',
|
||||
message: message?.trim() || '',
|
||||
newsletter: newsletter === 'yes',
|
||||
registeredAt: new Date().toISOString(),
|
||||
ipAddress: req.ip || req.connection.remoteAddress
|
||||
};
|
||||
|
|
@ -332,7 +334,7 @@ app.get('/api/registrations/export', async (req, res) => {
|
|||
try {
|
||||
const registrations = await loadRegistrations();
|
||||
|
||||
const headers = ['ID', 'First Name', 'Last Name', 'Email', 'Location', 'Role', 'Interests', 'Contribute', 'Message', 'Registered At'];
|
||||
const headers = ['ID', 'First Name', 'Last Name', 'Email', 'Location', 'Role', 'Interests', 'Contribute', 'Message', 'Newsletter', 'Registered At'];
|
||||
const rows = registrations.map(r => [
|
||||
r.id,
|
||||
r.firstName,
|
||||
|
|
@ -343,6 +345,7 @@ app.get('/api/registrations/export', async (req, res) => {
|
|||
Array.isArray(r.interests) ? r.interests.join('; ') : r.interests,
|
||||
r.contribute,
|
||||
r.message.replace(/"/g, '""'),
|
||||
r.newsletter ? 'Yes' : 'No',
|
||||
r.registeredAt
|
||||
]);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue