Build "Gayze" - a premium gay dating app for iOS and Android with a richer yolk yellow and black color theme.
Browse filesCORE FUNCTIONALITY:
User registration/login with email verification and phone number
Comprehensive user profiles with multiple photos, bio, preferences, and tags
Advanced 3-tier discovery system with cascading horizontal scrolling wheels
Real-time messaging with typing indicators and read receipts
Video calling integration with minimal controls
Photo verification system with live camera feed
Location-based matching with distance preferences
Premium subscription system with Stripe integration
Push notifications for matches, messages, and interactions
Content moderation and user safety features (block, report, emergency contacts)
UNIQUE FEATURES:
CASCADING MULTI-WHEEL DISCOVERY INTERFACE:
Three interconnected horizontal scrolling profile carousels (Filter 1, Filter 2, Filter 3)
Each wheel filters profiles based on layered criteria
Filter 3 allows selection of up to 3 Grindr-style tags (chill, smoke, bb, kink, etc.)
"Triple Match" wheel is visually emphasized as most refined matches
Empty state shows "Reset All Filters" when no matches found
Profile cards show peeled banana 'Like' and 'Message' icons
PHOTO VERIFICATION SYSTEM:
Mandatory verification screen with large circle for live camera feed
Ghosted silhouette overlay to guide user positioning
Banner text: "Secure Your Profile. Protect the Community."
Green and white color palette for verification screens
Verification badge on profiles once completed
10-SECOND VERIFY VIDEO FEATURE:
One-time viewable verification videos in chat
"Gayze Verified Original Video" watermark
White camera icon for video verification in chat interface
Auto-delete after viewing for privacy
HIERARCHICAL RELATIONSHIP FILTERS:
Primary options: "Single," "Attached," "Open"
Secondary checkboxes under "Single": "Serious relationship," "Casual dating," "Hookups"
Dark mode interface with blue accents for filter panels
SELF-SOVEREIGN IDENTITY SETTINGS:
Material Design "Data Security Settings" screen
Toggle switch for "Self-Sovereign Identity Status"
Simple layout optimized for users over 50
Clear explanatory text for privacy features
PREMIUM MONETIZATION:
"Verified First" feature banner at bottom of discovery screen (<10% height)
Violet color scheme with diamond icon
Text: "Skip the line. See only Verified Profiles."
Subscription tiers: $4.99, $7.99, $9.99 monthly options
DETAILED SCREENS TO BUILD:
ONBOARDING SEQUENCE:
Multi-screen welcome flow with app feature introduction
Account creation with email/phone verification
Profile photo upload with verification requirement
Bio creation with playful prompts: "My last song on repeat was..." "If you buy me a drink, make it..."
Preference setting (age range, distance, relationship goals)
Tutorial for cascading discovery interface
MAIN DISCOVERY SCREEN:
Three horizontally scrolling profile wheels stacked vertically
Filter buttons above each wheel (customizable criteria)
Profile cards with primary photo, name, age, verification badge
Swipe right for like (peeled banana icon), swipe left for pass
Tap card to view full profile
Premium banner at bottom for "Verified First"
FULL PROFILE VIEW:
Large photo gallery with swipe navigation
User bio with personality prompts answered
Tags/interests displayed as chips
Distance and last active status
Action buttons: Message, Like (banana icon), Report/Block
Verification status prominently displayed
CHAT/MESSAGING INTERFACE:
Standard messaging with text bubbles
Photo/video sharing capabilities
10-second verification video option (white camera icon)
Typing indicators and message read status
Match notification when first connecting
Safety features: report user, block user, emergency contact
VIDEO CALLING SCREEN:
Full-screen interface with minimal controls
Large video feeds for both users
Bottom controls: End call (prominent red), mute mic, toggle camera
Subtle gradient background
Connection quality indicator
PROFILE EDITING/MANAGEMENT:
Photo upload/management (drag to reorder, delete options)
Bio editing with character counter
Preference updates (age, distance, relationship type)
Tag selection from predefined list
Account settings (privacy, notifications, payments)
Verification status and re-verification option
FILTER SELECTION INTERFACE:
Hierarchical dropdown menus
Age range sliders
Distance radius selector
Relationship status with sub-options
Tag selection (up to 3 for Filter 3)
Apply/Reset filter buttons
ACCOUNT SETTINGS:
Privacy controls (profile visibility, location sharing)
Notification preferences (matches, messages, promotional)
Payment/subscription management
Data security settings with SSI toggle
Safety features (block list, report history)
Account deletion option
TECHNICAL REQUIREMENTS:
Real-time database for messaging and presence indicators
File storage for photos/videos with CDN delivery
Push notification system
Geolocation services for distance-based matching
Video calling infrastructure (WebRTC)
Payment processing (Stripe integration)
Content moderation API integration
User authentication and security
Analytics/usage tracking
Admin dashboard for user management
UI/UX SPECIFICATIONS:
Primary colors: Richer yolk yellow (#F4C430) and black (#000000)
Accent colors: White for contrast, subtle gradients
Rounded corners throughout interface
Material Design principles for settings screens
Large touch targets for older users (50+)
Smooth animations between screens
Consistent iconography (peeled banana for likes, etc.)
Accessibility features for screen readers
Dark mode support with blue accents
SAFETY & MODERATION:
Automated content scanning for inappropriate messages/images
User reporting system with multiple categories
Blocking functionality with complete profile hiding
Emergency contact feature for in-person meetings
Photo verification requirement before profile activation
Age verification (18+ requirement)
Terms of service and privacy policy compliance
DEPLOYMENT:
Native iOS app for App Store submission
Native Android app for Google Play submission
Backend API with database and file storage
Admin web dashboard for content moderation
Analytics dashboard for app performance
Payment webhook integration for subscriptions
Push notification service configuration
Build this as a complete, production-ready dating app with all backend infrastructure, database design, user authentication, real-time features, payment processing, and mobile app deployment ready for app store submission.
- README.md +8 -5
- index.html +215 -18
- verification.html +144 -0
|
@@ -1,10 +1,13 @@
|
|
| 1 |
---
|
| 2 |
-
title: Rainbow Rendezvous Connection Station
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Rainbow Rendezvous Connection Station ✨
|
| 3 |
+
colorFrom: purple
|
| 4 |
+
colorTo: yellow
|
| 5 |
+
emoji: 🐳
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite-v3
|
| 10 |
---
|
| 11 |
|
| 12 |
+
# Welcome to your new DeepSite project!
|
| 13 |
+
This project was created with [DeepSite](https://deepsite.hf.co).
|
|
@@ -1,19 +1,216 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</html>
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Rainbow Rendezvous - Premium LGBTQ+ Dating</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="https://static.photos/yellow/200x200/1">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 11 |
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
|
| 12 |
+
<script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.globe.min.js"></script>
|
| 13 |
+
<style>
|
| 14 |
+
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap');
|
| 15 |
+
body {
|
| 16 |
+
font-family: 'Poppins', sans-serif;
|
| 17 |
+
background-color: #000000;
|
| 18 |
+
color: #FFFFFF;
|
| 19 |
+
}
|
| 20 |
+
.primary-yellow {
|
| 21 |
+
background-color: #F4C430;
|
| 22 |
+
}
|
| 23 |
+
.text-yellow {
|
| 24 |
+
color: #F4C430;
|
| 25 |
+
}
|
| 26 |
+
.border-yellow {
|
| 27 |
+
border-color: #F4C430;
|
| 28 |
+
}
|
| 29 |
+
.banana-btn {
|
| 30 |
+
background-color: #F4C430;
|
| 31 |
+
color: #000000;
|
| 32 |
+
border-radius: 50%;
|
| 33 |
+
width: 60px;
|
| 34 |
+
height: 60px;
|
| 35 |
+
display: flex;
|
| 36 |
+
justify-content: center;
|
| 37 |
+
align-items: center;
|
| 38 |
+
box-shadow: 0 4px 6px rgba(244, 196, 48, 0.3);
|
| 39 |
+
}
|
| 40 |
+
.profile-card {
|
| 41 |
+
background: linear-gradient(145deg, #1a1a1a, #000000);
|
| 42 |
+
border: 1px solid #333333;
|
| 43 |
+
border-radius: 16px;
|
| 44 |
+
transition: transform 0.3s ease;
|
| 45 |
+
}
|
| 46 |
+
.profile-card:hover {
|
| 47 |
+
transform: translateY(-5px);
|
| 48 |
+
}
|
| 49 |
+
.filter-wheel {
|
| 50 |
+
scroll-behavior: smooth;
|
| 51 |
+
}
|
| 52 |
+
.filter-wheel::-webkit-scrollbar {
|
| 53 |
+
display: none;
|
| 54 |
+
}
|
| 55 |
+
.verification-circle {
|
| 56 |
+
border: 3px dashed #F4C430;
|
| 57 |
+
}
|
| 58 |
+
</style>
|
| 59 |
+
</head>
|
| 60 |
+
<body class="min-h-screen">
|
| 61 |
+
<!-- Vanta.js Globe Background -->
|
| 62 |
+
<div id="vanta-globe" class="fixed inset-0 z-0 opacity-20"></div>
|
| 63 |
+
|
| 64 |
+
<!-- Main App Container -->
|
| 65 |
+
<div class="relative z-10 max-w-md mx-auto min-h-screen flex flex-col">
|
| 66 |
+
<!-- Header -->
|
| 67 |
+
<header class="py-4 px-6 flex justify-between items-center bg-black/80 backdrop-blur-sm border-b border-yellow/20">
|
| 68 |
+
<div class="flex items-center space-x-2">
|
| 69 |
+
<i data-feather="users" class="text-yellow"></i>
|
| 70 |
+
<h1 class="text-xl font-bold text-yellow">Rainbow Rendezvous</h1>
|
| 71 |
+
</div>
|
| 72 |
+
<div class="flex space-x-4">
|
| 73 |
+
<button class="text-white"><i data-feather="search"></i></button>
|
| 74 |
+
<button class="text-white"><i data-feather="settings"></i></button>
|
| 75 |
+
</div>
|
| 76 |
+
</header>
|
| 77 |
+
|
| 78 |
+
<!-- Discovery Section -->
|
| 79 |
+
<main class="flex-1 px-4 py-6 overflow-y-auto">
|
| 80 |
+
<div class="mb-8">
|
| 81 |
+
<h2 class="text-lg font-semibold text-yellow mb-3">Primary Filter</h2>
|
| 82 |
+
<div class="filter-wheel flex space-x-4 overflow-x-auto pb-4">
|
| 83 |
+
<!-- Profile Cards -->
|
| 84 |
+
<div class="profile-card flex-shrink-0 w-40 p-3">
|
| 85 |
+
<div class="relative">
|
| 86 |
+
<img src="https://static.photos/people/320x240/1" alt="Profile" class="rounded-lg w-full h-48 object-cover">
|
| 87 |
+
<div class="absolute bottom-2 right-2 bg-yellow rounded-full p-1">
|
| 88 |
+
<i data-feather="check-circle" class="text-black w-4 h-4"></i>
|
| 89 |
+
</div>
|
| 90 |
+
</div>
|
| 91 |
+
<div class="mt-2">
|
| 92 |
+
<h3 class="font-medium text-white">Alex, 28</h3>
|
| 93 |
+
<p class="text-xs text-gray-400">3 miles away</p>
|
| 94 |
+
</div>
|
| 95 |
+
</div>
|
| 96 |
+
<!-- More profile cards... -->
|
| 97 |
+
</div>
|
| 98 |
+
</div>
|
| 99 |
+
|
| 100 |
+
<div class="mb-8">
|
| 101 |
+
<h2 class="text-lg font-semibold text-yellow mb-3">Secondary Filter</h2>
|
| 102 |
+
<div class="filter-wheel flex space-x-4 overflow-x-auto pb-4">
|
| 103 |
+
<!-- Profile Cards -->
|
| 104 |
+
<div class="profile-card flex-shrink-0 w-40 p-3">
|
| 105 |
+
<div class="relative">
|
| 106 |
+
<img src="https://static.photos/people/320x240/2" alt="Profile" class="rounded-lg w-full h-48 object-cover">
|
| 107 |
+
</div>
|
| 108 |
+
<div class="mt-2">
|
| 109 |
+
<h3 class="font-medium text-white">Jamie, 32</h3>
|
| 110 |
+
<p class="text-xs text-gray-400">5 miles away</p>
|
| 111 |
+
<div class="flex flex-wrap mt-1">
|
| 112 |
+
<span class="text-xs bg-yellow/20 text-yellow px-2 py-1 rounded-full mr-1 mb-1">Chill</span>
|
| 113 |
+
<span class="text-xs bg-yellow/20 text-yellow px-2 py-1 rounded-full mr-1 mb-1">BB</span>
|
| 114 |
+
</div>
|
| 115 |
+
</div>
|
| 116 |
+
</div>
|
| 117 |
+
<!-- More profile cards... -->
|
| 118 |
+
</div>
|
| 119 |
+
</div>
|
| 120 |
+
|
| 121 |
+
<div class="mb-8">
|
| 122 |
+
<h2 class="text-lg font-semibold text-yellow mb-3">Triple Match</h2>
|
| 123 |
+
<div class="filter-wheel flex space-x-4 overflow-x-auto pb-4">
|
| 124 |
+
<!-- Profile Cards -->
|
| 125 |
+
<div class="profile-card flex-shrink-0 w-40 p-3">
|
| 126 |
+
<div class="relative">
|
| 127 |
+
<img src="https://static.photos/people/320x240/3" alt="Profile" class="rounded-lg w-full h-48 object-cover">
|
| 128 |
+
<div class="absolute bottom-2 right-2 bg-yellow rounded-full p-1">
|
| 129 |
+
<i data-feather="check-circle" class="text-black w-4 h-4"></i>
|
| 130 |
+
</div>
|
| 131 |
+
</div>
|
| 132 |
+
<div class="mt-2">
|
| 133 |
+
<h3 class="font-medium text-white">Taylor, 25</h3>
|
| 134 |
+
<p class="text-xs text-gray-400">2 miles away</p>
|
| 135 |
+
<div class="flex flex-wrap mt-1">
|
| 136 |
+
<span class="text-xs bg-yellow/20 text-yellow px-2 py-1 rounded-full mr-1 mb-1">Kink</span>
|
| 137 |
+
<span class="text-xs bg-yellow/20 text-yellow px-2 py-1 rounded-full mr-1 mb-1">420</span>
|
| 138 |
+
<span class="text-xs bg-yellow/20 text-yellow px-2 py-1 rounded-full mr-1 mb-1">Gym</span>
|
| 139 |
+
</div>
|
| 140 |
+
</div>
|
| 141 |
+
</div>
|
| 142 |
+
<!-- More profile cards... -->
|
| 143 |
+
</div>
|
| 144 |
+
</div>
|
| 145 |
+
</main>
|
| 146 |
+
|
| 147 |
+
<!-- Navigation Footer -->
|
| 148 |
+
<footer class="bg-black/90 backdrop-blur-sm border-t border-yellow/20 py-3 px-6 flex justify-around">
|
| 149 |
+
<button class="text-white"><i data-feather="home"></i></button>
|
| 150 |
+
<button class="text-white"><i data-feather="compass"></i></button>
|
| 151 |
+
<button class="banana-btn"><i data-feather="heart" class="text-black"></i></button>
|
| 152 |
+
<button class="text-white"><i data-feather="message-square"></i></button>
|
| 153 |
+
<button class="text-white"><i data-feather="user"></i></button>
|
| 154 |
+
</footer>
|
| 155 |
+
|
| 156 |
+
<!-- Verification Modal -->
|
| 157 |
+
<div id="verificationModal" class="fixed inset-0 bg-black/90 z-20 flex items-center justify-center hidden">
|
| 158 |
+
<div class="bg-black p-6 rounded-xl border border-yellow max-w-sm w-full">
|
| 159 |
+
<div class="text-center mb-6">
|
| 160 |
+
<h2 class="text-xl font-bold text-yellow mb-2">Secure Your Profile</h2>
|
| 161 |
+
<p class="text-white">Protect the community with photo verification</p>
|
| 162 |
+
</div>
|
| 163 |
+
<div class="verification-circle w-64 h-64 mx-auto rounded-full flex items-center justify-center mb-6">
|
| 164 |
+
<div class="text-center">
|
| 165 |
+
<i data-feather="camera" class="w-12 h-12 text-yellow mx-auto mb-3"></i>
|
| 166 |
+
<p class="text-white text-sm">Align your face with the silhouette</p>
|
| 167 |
+
</div>
|
| 168 |
+
</div>
|
| 169 |
+
<button class="primary-yellow text-black font-bold py-3 px-6 rounded-lg w-full">
|
| 170 |
+
Take Verification Photo
|
| 171 |
+
</button>
|
| 172 |
+
<button onclick="closeVerificationModal()" class="mt-3 text-white text-center w-full">
|
| 173 |
+
Skip for now
|
| 174 |
+
</button>
|
| 175 |
+
</div>
|
| 176 |
+
</div>
|
| 177 |
+
</div>
|
| 178 |
+
|
| 179 |
+
<script>
|
| 180 |
+
// Initialize Vanta.js globe
|
| 181 |
+
VANTA.GLOBE({
|
| 182 |
+
el: "#vanta-globe",
|
| 183 |
+
mouseControls: true,
|
| 184 |
+
touchControls: true,
|
| 185 |
+
gyroControls: false,
|
| 186 |
+
minHeight: 200.00,
|
| 187 |
+
minWidth: 200.00,
|
| 188 |
+
scale: 1.00,
|
| 189 |
+
scaleMobile: 1.00,
|
| 190 |
+
color: 0xf4c430,
|
| 191 |
+
backgroundColor: 0x0
|
| 192 |
+
});
|
| 193 |
+
|
| 194 |
+
// Show verification modal after delay
|
| 195 |
+
setTimeout(() => {
|
| 196 |
+
document.getElementById('verificationModal').classList.remove('hidden');
|
| 197 |
+
}, 3000);
|
| 198 |
+
|
| 199 |
+
function closeVerificationModal() {
|
| 200 |
+
document.getElementById('verificationModal').classList.add('hidden');
|
| 201 |
+
}
|
| 202 |
+
|
| 203 |
+
// Initialize feather icons
|
| 204 |
+
feather.replace();
|
| 205 |
+
|
| 206 |
+
// Animation for profile cards
|
| 207 |
+
anime({
|
| 208 |
+
targets: '.profile-card',
|
| 209 |
+
translateY: [20, 0],
|
| 210 |
+
opacity: [0, 1],
|
| 211 |
+
delay: anime.stagger(100),
|
| 212 |
+
easing: 'easeOutQuad'
|
| 213 |
+
});
|
| 214 |
+
</script>
|
| 215 |
+
</body>
|
| 216 |
</html>
|
|
@@ -0,0 +1,144 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Verification | Rainbow Rendezvous</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 9 |
+
<style>
|
| 10 |
+
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap');
|
| 11 |
+
body {
|
| 12 |
+
font-family: 'Poppins', sans-serif;
|
| 13 |
+
background-color: #000000;
|
| 14 |
+
color: #FFFFFF;
|
| 15 |
+
}
|
| 16 |
+
.verification-container {
|
| 17 |
+
background: linear-gradient(180deg, #0A0A0A 0%, #000000 100%);
|
| 18 |
+
}
|
| 19 |
+
.verification-circle {
|
| 20 |
+
border: 3px dashed #F4C430;
|
| 21 |
+
background-color: rgba(244, 196, 48, 0.05);
|
| 22 |
+
}
|
| 23 |
+
.verification-btn {
|
| 24 |
+
background-color: #F4C430;
|
| 25 |
+
color: #000000;
|
| 26 |
+
box-shadow: 0 4px 15px rgba(244, 196, 48, 0.4);
|
| 27 |
+
}
|
| 28 |
+
.verification-btn:hover {
|
| 29 |
+
background-color: #F4C430;
|
| 30 |
+
transform: translateY(-2px);
|
| 31 |
+
}
|
| 32 |
+
.silhouette-overlay {
|
| 33 |
+
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><path d="M50 15c-10 0-15 5-15 15 0 5 5 10 5 15 0 5-5 10-5 15 0 10 10 25 15 25s15-15 15-25c0-5-5-10-5-15 0-5 5-10 5-15 0-10-5-15-15-15z" fill="none" stroke="%23F4C430" stroke-width="0.5"/></svg>');
|
| 34 |
+
background-size: 60%;
|
| 35 |
+
background-position: center;
|
| 36 |
+
background-repeat: no-repeat;
|
| 37 |
+
opacity: 0.5;
|
| 38 |
+
}
|
| 39 |
+
</style>
|
| 40 |
+
</head>
|
| 41 |
+
<body class="min-h-screen verification-container">
|
| 42 |
+
<div class="max-w-md mx-auto min-h-screen flex flex-col px-6 py-12">
|
| 43 |
+
<header class="mb-8">
|
| 44 |
+
<div class="flex justify-center mb-6">
|
| 45 |
+
<div class="w-16 h-16 bg-yellow-500 rounded-full flex items-center justify-center">
|
| 46 |
+
<i data-feather="shield" class="text-black w-8 h-8"></i>
|
| 47 |
+
</div>
|
| 48 |
+
</div>
|
| 49 |
+
<h1 class="text-2xl font-bold text-center text-yellow-500 mb-2">Photo Verification</h1>
|
| 50 |
+
<p class="text-center text-white/80">Secure your profile and help protect our community</p>
|
| 51 |
+
</header>
|
| 52 |
+
|
| 53 |
+
<main class="flex-1 flex flex-col">
|
| 54 |
+
<div class="relative mb-8">
|
| 55 |
+
<div class="verification-circle w-full aspect-square rounded-full mx-auto overflow-hidden relative">
|
| 56 |
+
<div class="absolute inset-0 silhouette-overlay"></div>
|
| 57 |
+
<video id="cameraFeed" autoplay playsinline class="w-full h-full object-cover"></video>
|
| 58 |
+
</div>
|
| 59 |
+
<div class="absolute bottom-4 left-0 right-0 flex justify-center">
|
| 60 |
+
<button id="flipCamera" class="bg-black/50 text-white p-2 rounded-full">
|
| 61 |
+
<i data-feather="refresh-ccw" class="w-5 h-5"></i>
|
| 62 |
+
</button>
|
| 63 |
+
</div>
|
| 64 |
+
</div>
|
| 65 |
+
|
| 66 |
+
<div class="text-center mb-8">
|
| 67 |
+
<h2 class="font-medium text-white mb-2">Follow these steps:</h2>
|
| 68 |
+
<div class="flex justify-center space-x-4 mb-4">
|
| 69 |
+
<div class="flex items-center">
|
| 70 |
+
<div class="w-8 h-8 rounded-full bg-yellow-500 text-black flex items-center justify-center mr-2">1</div>
|
| 71 |
+
<span class="text-sm">Remove sunglasses</span>
|
| 72 |
+
</div>
|
| 73 |
+
<div class="flex items-center">
|
| 74 |
+
<div class="w-8 h-8 rounded-full bg-yellow-500 text-black flex items-center justify-center mr-2">2</div>
|
| 75 |
+
<span class="text-sm">Face forward</span>
|
| 76 |
+
</div>
|
| 77 |
+
</div>
|
| 78 |
+
</div>
|
| 79 |
+
|
| 80 |
+
<button id="captureBtn" class="verification-btn py-4 px-6 rounded-full font-bold text-lg mb-4 transition-transform">
|
| 81 |
+
Take Photo
|
| 82 |
+
</button>
|
| 83 |
+
<button class="text-white/60 text-center w-full py-2">
|
| 84 |
+
Skip for now
|
| 85 |
+
</button>
|
| 86 |
+
</main>
|
| 87 |
+
</div>
|
| 88 |
+
|
| 89 |
+
<script>
|
| 90 |
+
// Initialize camera feed
|
| 91 |
+
let currentFacingMode = "user";
|
| 92 |
+
let stream = null;
|
| 93 |
+
|
| 94 |
+
async function startCamera(facingMode = "user") {
|
| 95 |
+
try {
|
| 96 |
+
if (stream) {
|
| 97 |
+
stream.getTracks().forEach(track => track.stop());
|
| 98 |
+
}
|
| 99 |
+
|
| 100 |
+
stream = await navigator.mediaDevices.getUserMedia({
|
| 101 |
+
video: {
|
| 102 |
+
facingMode: facingMode,
|
| 103 |
+
width: { ideal: 1280 },
|
| 104 |
+
height: { ideal: 1280 }
|
| 105 |
+
},
|
| 106 |
+
audio: false
|
| 107 |
+
});
|
| 108 |
+
|
| 109 |
+
const videoElement = document.getElementById('cameraFeed');
|
| 110 |
+
videoElement.srcObject = stream;
|
| 111 |
+
currentFacingMode = facingMode;
|
| 112 |
+
} catch (err) {
|
| 113 |
+
console.error("Error accessing camera:", err);
|
| 114 |
+
alert("Could not access the camera. Please check permissions.");
|
| 115 |
+
}
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
// Flip camera button
|
| 119 |
+
document.getElementById('flipCamera').addEventListener('click', () => {
|
| 120 |
+
const newFacingMode = currentFacingMode === "user" ? "environment" : "user";
|
| 121 |
+
startCamera(newFacingMode);
|
| 122 |
+
});
|
| 123 |
+
|
| 124 |
+
// Capture button
|
| 125 |
+
document.getElementById('captureBtn').addEventListener('click', async () => {
|
| 126 |
+
alert("Photo captured! Your verification is being processed.");
|
| 127 |
+
// In a real app, you would capture the image and send to server
|
| 128 |
+
});
|
| 129 |
+
|
| 130 |
+
// Initialize camera on load
|
| 131 |
+
window.addEventListener('DOMContentLoaded', () => {
|
| 132 |
+
startCamera();
|
| 133 |
+
feather.replace();
|
| 134 |
+
});
|
| 135 |
+
|
| 136 |
+
// Clean up camera on page leave
|
| 137 |
+
window.addEventListener('beforeunload', () => {
|
| 138 |
+
if (stream) {
|
| 139 |
+
stream.getTracks().forEach(track => track.stop());
|
| 140 |
+
}
|
| 141 |
+
});
|
| 142 |
+
</script>
|
| 143 |
+
</body>
|
| 144 |
+
</html>
|