diff --git a/src/app/demo/page.tsx b/src/app/demo/page.tsx new file mode 100644 index 0000000..734bd82 --- /dev/null +++ b/src/app/demo/page.tsx @@ -0,0 +1,481 @@ +import Link from 'next/link' +import type { Metadata } from 'next' + +export const metadata: Metadata = { + title: 'rMaps Demo - CCC Camp 2026', + description: 'See how rMaps helps you find your friends at events. A demo showcasing real-time location sharing, event maps, and privacy-first friend finding at CCC Camp 2026.', + openGraph: { + title: 'rMaps Demo - CCC Camp 2026', + description: 'Privacy-first real-time location sharing for events. Find your crew at CCC Camp 2026.', + url: 'https://rmaps.online/demo', + siteName: 'rMaps', + type: 'website', + }, +} + +/* ─── Mock Data ─────────────────────────────────────────────── */ + +const friends = [ + { + name: 'Mika', + emoji: '🦊', + color: '#10b981', + status: 'At Main Stage', + lastSeen: '1 min ago', + x: 520, + y: 155, + online: true, + }, + { + name: 'Zara', + emoji: '🐙', + color: '#6366f1', + status: 'Heading to Food Court', + lastSeen: '3 min ago', + x: 340, + y: 260, + online: true, + }, + { + name: 'Leo', + emoji: '🐻', + color: '#f59e0b', + status: 'In Tent', + lastSeen: '12 min ago', + x: 160, + y: 310, + online: false, + }, + { + name: 'Ren', + emoji: '🦉', + color: '#ef4444', + status: 'At Workshop Hall', + lastSeen: '2 min ago', + x: 640, + y: 290, + online: true, + }, + { + name: 'Juno', + emoji: '🐧', + color: '#ec4899', + status: 'Getting coffee', + lastSeen: '5 min ago', + x: 400, + y: 180, + online: true, + }, + { + name: 'Kai', + emoji: '🐝', + color: '#06b6d4', + status: 'At Soldering Village', + lastSeen: '8 min ago', + x: 280, + y: 130, + online: true, + }, +] + +const statusOptions = [ + 'At Main Stage', + 'Heading to Food Court', + 'In Tent', + 'At Workshop Hall', + 'Getting coffee', + 'At Soldering Village', + 'Exploring', + 'At the Lake', + 'On my way!', +] + +/* ─── SVG Camp Map ─────────────────────────────────────────── */ + +function CampMap() { + return ( +
+ + {/* Background terrain */} + + + {/* Grass / ground patches */} + + + + {/* Paths - main walkways */} + + + + + + {/* ── Area: Main Stage (top right) ── */} + + + STAGE + Main Stage + + {/* ── Area: Food Court (center-left) ── */} + + {/* Food stall icons */} + + + + + + + Food Court + + {/* ── Area: Workshops (right) ── */} + + + + + + Workshops + + {/* ── Area: Camping (bottom-left) ── */} + + {/* Tent icons */} + + + + + Camping + + {/* ── Area: Soldering Village (top-left) ── */} + + + + Soldering Village + + {/* ── Area: Info / Coffee (center) ── */} + + + INFO + + {/* ── Entrance marker ── */} + + ENTER + + {/* ── Trees / decoration ── */} + + + + + + + {/* ── Friend markers ── */} + {friends.map((f) => ( + + {/* Pulse ring for online friends */} + {f.online && ( + + + + + )} + {/* Dot */} + + {/* Emoji */} + {f.emoji} + {/* Name label */} + + {f.name} + + ))} + + + {/* Map legend */} +
+ + Stage + + + Food + + + Workshops + + + Camping + +
+ + {/* Simulated live badge */} +
+ + Live +
+
+ ) +} + +/* ─── Friend List Panel ────────────────────────────────────── */ + +function FriendListPanel() { + return ( +
+
+
+ 👥 + Friends in Room +
+ {friends.filter((f) => f.online).length}/{friends.length} online +
+
+ {friends.map((f) => ( +
+ {/* Avatar */} +
+ {f.emoji} +
+ + {/* Info */} +
+
+ {f.name} + +
+

{f.status}

+
+ + {/* Last seen */} + {f.lastSeen} +
+ ))} +
+ + {/* Status selector preview */} +
+

Your status:

+
+ {statusOptions.slice(0, 5).map((s) => ( + + {s} + + ))} + + +{statusOptions.length - 5} more + +
+
+
+ ) +} + +/* ─── Page ──────────────────────────────────────────────────── */ + +export default function DemoPage() { + return ( +
+ {/* Nav */} + + + {/* Hero / Event Header */} +
+
+
+ + Live Demo +
+

+ CCC Camp 2026 +

+

+ Find your friends across the campground in real time +

+
+ 📍 Ziegeleipark Mildenberg + 📅 Aug 2026 + 👥 6 friends connected +
+ + {/* Member avatars */} +
+ {friends.map((f) => ( +
+ {f.emoji} +
+ ))} + 6 friends +
+
+
+ + {/* Intro text */} +
+

+ This demo shows how rMaps works at a + real event. See your friends on the camp map, check their status, and find each other without + sharing your location with any central server. +

+
+ + {/* Main Demo Content */} +
+
+ {/* Map - takes 2 columns */} +
+
+
+
+ 🗺️ + Camp Map +
+
+ Last updated 2 min ago +
+
+
+ +
+
+
+ + {/* Friend List - 1 column */} +
+ +
+
+
+ + {/* How It Works (brief) */} +
+

How rMaps Works at Events

+
+
+
+ 📱 +
+

Open & Share

+

+ Create a map room and share the link with your crew. No app install needed. +

+
+
+
+ 📍 +
+

See Everyone

+

+ Friends appear on the map in real time. Set your status so everyone knows where you are. +

+
+
+
+ 🔒 +
+

Stay Private

+

+ Only people in your room see your location. Go invisible anytime. No tracking. +

+
+
+
+ + {/* Bottom CTA */} +
+
+

Ready to Find Your Friends?

+

+ Create a map room for your next event. Share the link, and never lose your crew in the crowd again. +

+ + Create Your Map + +
+
+ + {/* Footer */} + +
+ ) +} diff --git a/src/app/page.tsx b/src/app/page.tsx index c604721..d5be12c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -2,6 +2,7 @@ import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; +import Link from 'next/link'; import { nanoid } from 'nanoid'; import { AuthButton } from '@/components/AuthButton'; import { useAuthStore } from '@/stores/auth'; @@ -99,165 +100,324 @@ export default function HomePage() { }; return ( -
-
- {/* Logo/Title */} -
-

- rMaps -

-

Find your friends at events

-
- -
-
+
+ {/* ── Hero Section ─────────────────────────────────────────── */} +
+ {/* Subtle background grid */} +
- {/* Quick Rejoin Card - show when user has saved info and last room */} - {isLoaded && name && lastRoom && ( -
-

Welcome back, {name}!

- -

- Or create/join a different room below + Try the Demo + + + Get Started + +

+ +

+ No app install. No sign-up required to join a room. +

+
+
+ + {/* ── Feature Cards ────────────────────────────────────────── */} +
+
+ {/* Real-time GPS */} +
+
+ + + + +
+

Real-time GPS

+

+ Share your live location with friends. See everyone on the map updating in real time as you move.

- )} - {/* Main Card */} -
- {/* User Setup */} -
-

Your Profile

- -
- - setName(e.target.value)} - placeholder="Enter your name" - className="input w-full" - maxLength={20} - /> -
- -
- -
- {EMOJI_OPTIONS.map((e) => ( - - ))} -
+ {/* Event Maps */} +
+
+ + +
+

Event Maps

+

+ Navigate festivals, camps, and conferences. Custom maps with labeled stages, food courts, and meeting points. +

-
- - {/* Create Room */} - {!isCreating ? ( -
- - -
or
- - {/* Join Room */} -
- setJoinSlug(e.target.value)} - placeholder="Enter room name or code" - className="input w-full" - /> - -
+ {/* Privacy First */} +
+
+ + +
- ) : ( -
-
- -
- setRoomName(e.target.value)} - placeholder="e.g., 39c3-crew" - className="input flex-1" - maxLength={20} - /> - .rmaps.online -
-

- Leave blank for a random code -

-
+

Privacy First

+

+ Zero-knowledge architecture. You control who sees you. Go invisible anytime. No tracking, no data collection. +

+
+
+
-
- - -
+ {/* ── How It Works ─────────────────────────────────────────── */} +
+

How It Works

+
+ {/* Step 1 */} +
+
+ 1
- )} +

Create a Map Room

+

+ Sign in and create a room for your event. Get a shareable link like rmaps.online/ccc-camp +

+
+ + {/* Step 2 */} +
+
+ 2 +
+

Share with Friends

+

+ Send the link to your crew. They join instantly from any device -- no app download, no account needed. +

+
+ + {/* Step 3 */} +
+
+ 3 +
+

Find Each Other

+

+ See everyone on the map in real time. Set your status, share meeting points, and never lose your friends again. +

+
- {/* Footer */} -
-

Privacy-first location sharing

-

- Built for{' '} + {/* Connector lines (decorative) */} +

+
+ Built for CCC events + and beyond +
+
+
+ + {/* ── Get Started (existing login/room interface) ──────────── */} +
+
+
+ {/* Section heading */} +
+

Get Started

+

Create or join a map room

+
+ +
+
+ + {/* Quick Rejoin Card - show when user has saved info and last room */} + {isLoaded && name && lastRoom && ( +
+

Welcome back, {name}!

+ +

+ Or create/join a different room below +

+
+ )} + + {/* Main Card */} +
+ {/* User Setup */} +
+

Your Profile

+ +
+ + setName(e.target.value)} + placeholder="Enter your name" + className="input w-full" + maxLength={20} + /> +
+ +
+ +
+ {EMOJI_OPTIONS.map((e) => ( + + ))} +
+
+
+ +
+ + {/* Create Room */} + {!isCreating ? ( +
+ + +
or
+ + {/* Join Room */} +
+ setJoinSlug(e.target.value)} + placeholder="Enter room name or code" + className="input w-full" + /> + +
+
+ ) : ( +
+
+ +
+ setRoomName(e.target.value)} + placeholder="e.g., 39c3-crew" + className="input flex-1" + maxLength={20} + /> + .rmaps.online +
+

+ Leave blank for a random code +

+
+ +
+ + +
+
+ )} +
+
+
+
+ + {/* ── Ecosystem Footer ─────────────────────────────────────── */} +
-
+ + ); }