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:
Jeff Emmett 2026-01-25 17:31:58 +01:00
parent 196ca4589d
commit ca3494a74b
2 changed files with 81 additions and 25 deletions

View File

@ -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');

View File

@ -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
]);