diff --git a/index.html b/index.html index edeb5b3..197e7e2 100644 --- a/index.html +++ b/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 @@

WORLDPLAY

-

: To be Defined

+

(TO BE DEFINED)

Register Interest @@ -1255,15 +1284,15 @@
๐ŸŽญ - Reality as
design space + Reality-bending
โœ’๏ธ - Speculative
fictions + Speculative
fiction
๐ŸŽฒ - Games as
social orgs + Games as
organisations
@@ -1282,7 +1311,7 @@
๐ŸŽค

Shape the Programme

-

Participants can shape the programme in advance and on-site by pitching sessions and co-labs

+

Participants can shape the programme in advance and on-site by pitching sessions and "mycollabs"

๐Ÿ“š @@ -1292,7 +1321,7 @@
๐ŸŽฎ

Game Prototyping

-

Selected games will be prototyped, resourced for production, and shared as open designs

+

Any collectively prototyped games will be resourced for production and shared as open designs

๐Ÿ”— @@ -1302,7 +1331,7 @@
๐Ÿ’ฐ

Sustainable Models

-

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

+

Exploring alternative revenue and self-sustaining models for sustaining the networkโ€”co-ops, art DAOs, fiction-fueled crowdfunds, and more

@@ -1400,12 +1429,12 @@

Examples

+ Utopia on the Tabletop Game-Changers: The Game Game Commons Online Platform Half-Earth Socialism Post-Growth Toolkit โ€“ The Game The Social Strike Game - The Transition Year
@@ -1465,14 +1494,14 @@ ๐Ÿ 
Commons Hub - A co-working, co-living and event venue in the Austrian Alps that harbours artists, digital movements and decentralized communities + A co-working, co-living and event venue that harbours artists, digital movements and decentralized communities
- ๐Ÿ”๏ธ + Commons Hub venue
๐Ÿ‡ฆ๐Ÿ‡น Austria ยท Alps ยท Commons Hub
@@ -1486,7 +1515,7 @@

Register Interest

-

First edition. Limited spaces.

+

This is the first edition of WORLDPLAY and spaces are limited to 60 participants. Express your interest early to secure your place.

@@ -1545,7 +1574,7 @@
- @@ -1560,6 +1589,11 @@
+ +
@@ -1569,15 +1603,11 @@ -
+
+ +
+
@@ -1646,8 +1683,7 @@

Connect

@@ -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'); diff --git a/server.js b/server.js index 961ecdc..a0d25ac 100644 --- a/server.js +++ b/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 ]);