Spaces:
Configuration error
Configuration error
in GA - Initial Deployment
Browse files- README.md +6 -4
- index.html +227 -18
- instructions.html +388 -0
- privacy.html +176 -0
- tos.html +185 -0
- voidcaptcha.js +154 -0
README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
colorFrom: green
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
| 1 |
---
|
| 2 |
+
title: voidcaptcha
|
| 3 |
+
emoji: 🐳
|
| 4 |
colorFrom: green
|
| 5 |
+
colorTo: green
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite
|
| 10 |
---
|
| 11 |
|
| 12 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
index.html
CHANGED
|
@@ -1,19 +1,228 @@
|
|
| 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>VoidCaptcha - Simple, Secure Dark Mode CAPTCHA</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<!-- Google tag (gtag.js) -->
|
| 11 |
+
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
|
| 12 |
+
<script>
|
| 13 |
+
window.dataLayer = window.dataLayer || [];
|
| 14 |
+
function gtag(){dataLayer.push(arguments);}
|
| 15 |
+
gtag('js', new Date());
|
| 16 |
+
gtag('config', 'G-XXXXXXXXXX');
|
| 17 |
+
</script>
|
| 18 |
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
| 19 |
+
<style>
|
| 20 |
+
body {
|
| 21 |
+
font-family: 'Inter', sans-serif;
|
| 22 |
+
background-color: #111827;
|
| 23 |
+
color: #f3f4f6;
|
| 24 |
+
}
|
| 25 |
+
.gradient-text {
|
| 26 |
+
background: linear-gradient(90deg, #6366f1, #8b5cf6);
|
| 27 |
+
-webkit-background-clip: text;
|
| 28 |
+
background-clip: text;
|
| 29 |
+
color: transparent;
|
| 30 |
+
}
|
| 31 |
+
.hero-gradient {
|
| 32 |
+
background: linear-gradient(135deg, #f9fafb 0%, #eef2ff 100%);
|
| 33 |
+
}
|
| 34 |
+
.feature-card:hover {
|
| 35 |
+
transform: translateY(-5px);
|
| 36 |
+
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
|
| 37 |
+
}
|
| 38 |
+
</style>
|
| 39 |
+
</head>
|
| 40 |
+
<body class="min-h-screen flex flex-col">
|
| 41 |
+
<!-- Navigation -->
|
| 42 |
+
<nav class="bg-white shadow-sm">
|
| 43 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 44 |
+
<div class="flex justify-between h-16">
|
| 45 |
+
<div class="flex items-center">
|
| 46 |
+
<div class="flex-shrink-0 flex items-center">
|
| 47 |
+
<span class="text-xl font-bold gradient-text">VoidCaptcha</span>
|
| 48 |
+
</div>
|
| 49 |
+
</div>
|
| 50 |
+
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
| 51 |
+
<a href="index.html" class="border-indigo-500 text-gray-900 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Home</a>
|
| 52 |
+
<a href="instructions.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Instructions</a>
|
| 53 |
+
<a href="privacy.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Privacy</a>
|
| 54 |
+
<a href="tos.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Terms</a>
|
| 55 |
+
</div>
|
| 56 |
+
<div class="-mr-2 flex items-center sm:hidden">
|
| 57 |
+
<button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500" aria-controls="mobile-menu" aria-expanded="false" id="mobile-menu-button">
|
| 58 |
+
<i data-feather="menu"></i>
|
| 59 |
+
</button>
|
| 60 |
+
</div>
|
| 61 |
+
</div>
|
| 62 |
+
</div>
|
| 63 |
+
|
| 64 |
+
<!-- Mobile menu -->
|
| 65 |
+
<div class="sm:hidden hidden" id="mobile-menu">
|
| 66 |
+
<div class="pt-2 pb-3 space-y-1">
|
| 67 |
+
<a href="index.html" class="bg-indigo-50 border-indigo-500 text-indigo-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Home</a>
|
| 68 |
+
<a href="instructions.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Instructions</a>
|
| 69 |
+
<a href="privacy.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Privacy</a>
|
| 70 |
+
<a href="tos.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Terms</a>
|
| 71 |
+
</div>
|
| 72 |
+
</div>
|
| 73 |
+
</nav>
|
| 74 |
+
|
| 75 |
+
<!-- Hero Section -->
|
| 76 |
+
<div class="hero-gradient">
|
| 77 |
+
<div class="max-w-7xl mx-auto py-16 px-4 sm:py-24 sm:px-6 lg:px-8">
|
| 78 |
+
<div class="text-center">
|
| 79 |
+
<h1 class="text-4xl font-extrabold tracking-tight text-gray-900 sm:text-5xl md:text-6xl">
|
| 80 |
+
<span class="block">Simple, Secure</span>
|
| 81 |
+
<span class="block gradient-text">CAPTCHA Solution</span>
|
| 82 |
+
</h1>
|
| 83 |
+
<p class="mt-3 max-w-md mx-auto text-base text-gray-500 sm:text-lg md:mt-5 md:text-xl md:max-w-3xl">
|
| 84 |
+
VoidCaptcha provides an elegant, user-friendly way to verify human users without the frustration of traditional CAPTCHAs.
|
| 85 |
+
</p>
|
| 86 |
+
<div class="mt-5 max-w-md mx-auto sm:flex sm:justify-center md:mt-8">
|
| 87 |
+
|
| 88 |
+
</a>
|
| 89 |
+
</div>
|
| 90 |
+
<div class="mt-3 rounded-md shadow sm:mt-0 sm:ml-3">
|
| 91 |
+
<a href="instructions.html" class="w-full flex items-center justify-center px-8 py-3 border border-transparent text-base font-medium rounded-md text-indigo-600 bg-white hover:bg-gray-50 md:py-4 md:text-lg md:px-10">
|
| 92 |
+
Get Started
|
| 93 |
+
</a>
|
| 94 |
+
</div>
|
| 95 |
+
</div>
|
| 96 |
+
</div>
|
| 97 |
+
</div>
|
| 98 |
+
</div>
|
| 99 |
+
|
| 100 |
+
<!-- Features Section -->
|
| 101 |
+
<div class="py-12 bg-white">
|
| 102 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 103 |
+
<div class="lg:text-center">
|
| 104 |
+
<h2 class="text-base text-indigo-600 font-semibold tracking-wide uppercase">Features</h2>
|
| 105 |
+
<p class="mt-2 text-3xl leading-8 font-extrabold tracking-tight text-gray-900 sm:text-4xl">
|
| 106 |
+
Why choose VoidCaptcha?
|
| 107 |
+
</p>
|
| 108 |
+
<p class="mt-4 max-w-2xl text-xl text-gray-500 lg:mx-auto">
|
| 109 |
+
Our solution combines security with exceptional user experience.
|
| 110 |
+
</p>
|
| 111 |
+
</div>
|
| 112 |
+
|
| 113 |
+
<div class="mt-10">
|
| 114 |
+
<div class="space-y-10 md:space-y-0 md:grid md:grid-cols-3 md:gap-x-8 md:gap-y-10">
|
| 115 |
+
<div class="feature-card relative bg-white p-6 rounded-lg shadow-md transition-all duration-300 ease-in-out">
|
| 116 |
+
<div>
|
| 117 |
+
<div class="flex items-center justify-center h-12 w-12 rounded-md bg-indigo-500 text-white">
|
| 118 |
+
<i data-feather="shield"></i>
|
| 119 |
+
</div>
|
| 120 |
+
<div class="mt-5">
|
| 121 |
+
<h3 class="text-lg leading-6 font-medium text-gray-900">Bot Protection</h3>
|
| 122 |
+
<p class="mt-2 text-base text-gray-500">
|
| 123 |
+
Effectively blocks automated bots while keeping the process simple for humans.
|
| 124 |
+
</p>
|
| 125 |
+
</div>
|
| 126 |
+
</div>
|
| 127 |
+
</div>
|
| 128 |
+
|
| 129 |
+
<div class="feature-card relative bg-white p-6 rounded-lg shadow-md transition-all duration-300 ease-in-out">
|
| 130 |
+
<div>
|
| 131 |
+
<div class="flex items-center justify-center h-12 w-12 rounded-md bg-indigo-500 text-white">
|
| 132 |
+
<i data-feather="user-check"></i>
|
| 133 |
+
</div>
|
| 134 |
+
<div class="mt-5">
|
| 135 |
+
<h3 class="text-lg leading-6 font-medium text-gray-900">User-Friendly</h3>
|
| 136 |
+
<p class="mt-2 text-base text-gray-500">
|
| 137 |
+
Simple color selection makes verification quick and intuitive for all users.
|
| 138 |
+
</p>
|
| 139 |
+
</div>
|
| 140 |
+
</div>
|
| 141 |
+
</div>
|
| 142 |
+
|
| 143 |
+
<div class="feature-card relative bg-white p-6 rounded-lg shadow-md transition-all duration-300 ease-in-out">
|
| 144 |
+
<div>
|
| 145 |
+
<div class="flex items-center justify-center h-12 w-12 rounded-md bg-indigo-500 text-white">
|
| 146 |
+
<i data-feather="zap"></i>
|
| 147 |
+
</div>
|
| 148 |
+
<div class="mt-5">
|
| 149 |
+
<h3 class="text-lg leading-6 font-medium text-gray-900">Lightweight</h3>
|
| 150 |
+
<p class="mt-2 text-base text-gray-500">
|
| 151 |
+
Just 3KB minified with zero dependencies. Loads instantly on any device.
|
| 152 |
+
</p>
|
| 153 |
+
</div>
|
| 154 |
+
</div>
|
| 155 |
+
</div>
|
| 156 |
+
</div>
|
| 157 |
+
</div>
|
| 158 |
+
</div>
|
| 159 |
+
</div>
|
| 160 |
+
|
| 161 |
+
|
| 162 |
+
|
| 163 |
+
<!-- CTA Section -->
|
| 164 |
+
<div class="bg-indigo-700">
|
| 165 |
+
<div class="max-w-2xl mx-auto text-center py-16 px-4 sm:py-20 sm:px-6 lg:px-8">
|
| 166 |
+
<h2 class="text-3xl font-extrabold text-white sm:text-4xl">
|
| 167 |
+
<span class="block">Ready to implement VoidCaptcha?</span>
|
| 168 |
+
</h2>
|
| 169 |
+
<p class="mt-4 text-lg leading-6 text-indigo-200">
|
| 170 |
+
Get started in minutes with our simple integration guide.
|
| 171 |
+
</p>
|
| 172 |
+
<a href="instructions.html" class="mt-8 w-full inline-flex items-center justify-center px-5 py-3 border border-transparent text-base font-medium rounded-md text-indigo-600 bg-white hover:bg-indigo-50 sm:w-auto">
|
| 173 |
+
View Documentation
|
| 174 |
+
</a>
|
| 175 |
+
</div>
|
| 176 |
+
</div>
|
| 177 |
+
|
| 178 |
+
<!-- Footer -->
|
| 179 |
+
<footer class="bg-white">
|
| 180 |
+
<div class="max-w-7xl mx-auto py-12 px-4 overflow-hidden sm:px-6 lg:px-8">
|
| 181 |
+
<nav class="-mx-5 -my-2 flex flex-wrap justify-center" aria-label="Footer">
|
| 182 |
+
<div class="px-5 py-2">
|
| 183 |
+
<a href="index.html" class="text-base text-gray-500 hover:text-gray-900">Home</a>
|
| 184 |
+
</div>
|
| 185 |
+
<div class="px-5 py-2">
|
| 186 |
+
<a href="instructions.html" class="text-base text-gray-500 hover:text-gray-900">Instructions</a>
|
| 187 |
+
</div>
|
| 188 |
+
<div class="px-5 py-2">
|
| 189 |
+
<a href="privacy.html" class="text-base text-gray-500 hover:text-gray-900">Privacy Policy</a>
|
| 190 |
+
</div>
|
| 191 |
+
<div class="px-5 py-2">
|
| 192 |
+
<a href="tos.html" class="text-base text-gray-500 hover:text-gray-900">Terms of Service</a>
|
| 193 |
+
</div>
|
| 194 |
+
</nav>
|
| 195 |
+
<p class="mt-8 text-center text-base text-gray-400">
|
| 196 |
+
© 2025 VoidCaptcha. All rights reserved. Contact: voidisopenscience@gmail.com
|
| 197 |
+
</p>
|
| 198 |
+
</div>
|
| 199 |
+
</footer>
|
| 200 |
+
|
| 201 |
+
<script>
|
| 202 |
+
// Mobile menu toggle
|
| 203 |
+
document.getElementById('mobile-menu-button').addEventListener('click', function() {
|
| 204 |
+
const menu = document.getElementById('mobile-menu');
|
| 205 |
+
menu.classList.toggle('hidden');
|
| 206 |
+
});
|
| 207 |
+
|
| 208 |
+
|
| 209 |
+
|
| 210 |
+
document.body.appendChild(form);
|
| 211 |
+
|
| 212 |
+
|
| 213 |
+
// Close button
|
| 214 |
+
const closeBtn = document.createElement('button');
|
| 215 |
+
closeBtn.innerHTML = '<i data-feather="x"></i>';
|
| 216 |
+
closeBtn.className = 'absolute top-2 right-2 text-gray-500 hover:text-gray-700';
|
| 217 |
+
closeBtn.addEventListener('click', function() {
|
| 218 |
+
document.body.removeChild(form);
|
| 219 |
+
document.body.removeChild(script);
|
| 220 |
+
});
|
| 221 |
+
form.appendChild(closeBtn);
|
| 222 |
+
|
| 223 |
+
feather.replace();
|
| 224 |
+
});
|
| 225 |
+
</script>
|
| 226 |
+
<script>feather.replace();</script>
|
| 227 |
+
</body>
|
| 228 |
</html>
|
instructions.html
ADDED
|
@@ -0,0 +1,388 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>VoidCaptcha - Implementation Instructions</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<!-- Google tag (gtag.js) -->
|
| 11 |
+
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
|
| 12 |
+
<script>
|
| 13 |
+
window.dataLayer = window.dataLayer || [];
|
| 14 |
+
function gtag(){dataLayer.push(arguments);}
|
| 15 |
+
gtag('js', new Date());
|
| 16 |
+
gtag('config', 'G-XXXXXXXXXX');
|
| 17 |
+
</script>
|
| 18 |
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
| 19 |
+
<style>
|
| 20 |
+
body {
|
| 21 |
+
font-family: 'Inter', sans-serif;
|
| 22 |
+
background-color: #111827;
|
| 23 |
+
color: #f3f4f6;
|
| 24 |
+
}
|
| 25 |
+
.gradient-text {
|
| 26 |
+
background: linear-gradient(90deg, #6366f1, #8b5cf6);
|
| 27 |
+
-webkit-background-clip: text;
|
| 28 |
+
background-clip: text;
|
| 29 |
+
color: transparent;
|
| 30 |
+
}
|
| 31 |
+
pre {
|
| 32 |
+
background-color: #1e293b;
|
| 33 |
+
color: #f8fafc;
|
| 34 |
+
padding: 1rem;
|
| 35 |
+
border-radius: 0.5rem;
|
| 36 |
+
overflow-x: auto;
|
| 37 |
+
}
|
| 38 |
+
code {
|
| 39 |
+
font-family: 'Courier New', Courier, monospace;
|
| 40 |
+
}
|
| 41 |
+
</style>
|
| 42 |
+
</head>
|
| 43 |
+
<body class="min-h-screen flex flex-col">
|
| 44 |
+
<!-- Navigation -->
|
| 45 |
+
<nav class="bg-white shadow-sm">
|
| 46 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 47 |
+
<div class="flex justify-between h-16">
|
| 48 |
+
<div class="flex items-center">
|
| 49 |
+
<div class="flex-shrink-0 flex items-center">
|
| 50 |
+
<span class="text-xl font-bold gradient-text">VoidCaptcha</span>
|
| 51 |
+
</div>
|
| 52 |
+
</div>
|
| 53 |
+
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
| 54 |
+
<a href="index.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Home</a>
|
| 55 |
+
<a href="instructions.html" class="border-indigo-500 text-gray-900 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Instructions</a>
|
| 56 |
+
<a href="privacy.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Privacy</a>
|
| 57 |
+
<a href="tos.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Terms</a>
|
| 58 |
+
</div>
|
| 59 |
+
<div class="-mr-2 flex items-center sm:hidden">
|
| 60 |
+
<button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500" aria-controls="mobile-menu" aria-expanded="false" id="mobile-menu-button">
|
| 61 |
+
<i data-feather="menu"></i>
|
| 62 |
+
</button>
|
| 63 |
+
</div>
|
| 64 |
+
</div>
|
| 65 |
+
</div>
|
| 66 |
+
|
| 67 |
+
<!-- Mobile menu -->
|
| 68 |
+
<div class="sm:hidden hidden" id="mobile-menu">
|
| 69 |
+
<div class="pt-2 pb-3 space-y-1">
|
| 70 |
+
<a href="index.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Home</a>
|
| 71 |
+
<a href="instructions.html" class="bg-indigo-50 border-indigo-500 text-indigo-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Instructions</a>
|
| 72 |
+
<a href="privacy.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Privacy</a>
|
| 73 |
+
<a href="tos.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Terms</a>
|
| 74 |
+
</div>
|
| 75 |
+
</div>
|
| 76 |
+
</nav>
|
| 77 |
+
|
| 78 |
+
<!-- Main Content -->
|
| 79 |
+
<div class="flex-grow">
|
| 80 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
| 81 |
+
<div class="text-center mb-12">
|
| 82 |
+
<h1 class="text-3xl font-extrabold text-gray-900 sm:text-4xl">
|
| 83 |
+
Implementation <span class="gradient-text">Instructions</span>
|
| 84 |
+
</h1>
|
| 85 |
+
<p class="mt-3 max-w-2xl mx-auto text-xl text-gray-500 sm:mt-4">
|
| 86 |
+
Get VoidCaptcha up and running on your website in just a few simple steps.
|
| 87 |
+
</p>
|
| 88 |
+
</div>
|
| 89 |
+
|
| 90 |
+
<div class="bg-white shadow overflow-hidden sm:rounded-lg">
|
| 91 |
+
<div class="px-4 py-5 sm:px-6">
|
| 92 |
+
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
| 93 |
+
Basic Implementation
|
| 94 |
+
</h3>
|
| 95 |
+
<p class="mt-1 max-w-2xl text-sm text-gray-500">
|
| 96 |
+
Add VoidCaptcha to any form on your website.
|
| 97 |
+
</p>
|
| 98 |
+
</div>
|
| 99 |
+
<div class="border-t border-gray-200 px-4 py-5 sm:p-0">
|
| 100 |
+
<div class="sm:divide-y sm:divide-gray-200">
|
| 101 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 102 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 103 |
+
1. Include the script
|
| 104 |
+
</dt>
|
| 105 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 106 |
+
<p class="mb-4">Add this script tag just before your closing <code></body></code> tag:</p>
|
| 107 |
+
<div class="mb-4">
|
| 108 |
+
<p class="mt-4 text-sm text-gray-400"> Code
|
| 109 |
+
</p>
|
| 110 |
+
<pre><code>// voidcaptcha.js
|
| 111 |
+
(function(){
|
| 112 |
+
const COLORS=["red","blue"];
|
| 113 |
+
const BASE_TINY=15.19202383;
|
| 114 |
+
let target=null, tries=0, cooldown=5000, blockedUntil=0, verified=false, countdownTimer=null;
|
| 115 |
+
|
| 116 |
+
function createOverlay(){
|
| 117 |
+
if(document.getElementById("voidcaptcha-overlay")) return;
|
| 118 |
+
|
| 119 |
+
// full screen overlay
|
| 120 |
+
const overlay=document.createElement("div");
|
| 121 |
+
overlay.id="voidcaptcha-overlay";
|
| 122 |
+
overlay.style.cssText=`
|
| 123 |
+
position:fixed;top:0;left:0;width:100%;height:100%;
|
| 124 |
+
background:#000;display:flex;justify-content:center;align-items:center;
|
| 125 |
+
z-index:2147483647;flex-direction:column;
|
| 126 |
+
`;
|
| 127 |
+
|
| 128 |
+
// container card
|
| 129 |
+
const card=document.createElement("div");
|
| 130 |
+
card.style.cssText=`
|
| 131 |
+
background:#111214;color:#eee;padding:26px;border-radius:14px;
|
| 132 |
+
text-align:center;box-shadow:0 18px 60px rgba(0,0,0,0.7);
|
| 133 |
+
max-width:380px;width:92%;display:flex;flex-direction:column;align-items:center;
|
| 134 |
+
`;
|
| 135 |
+
|
| 136 |
+
const title=document.createElement("h2");
|
| 137 |
+
title.innerText="VoidCaptcha";
|
| 138 |
+
title.style.margin="0 0 10px 0";
|
| 139 |
+
title.style.fontSize="20px";
|
| 140 |
+
|
| 141 |
+
// checkbox container
|
| 142 |
+
const cbContainer=document.createElement("div");
|
| 143 |
+
cbContainer.style.margin="10px 0 20px 0";
|
| 144 |
+
const checkbox=document.createElement("input");
|
| 145 |
+
checkbox.type="checkbox";
|
| 146 |
+
checkbox.id="voidcaptcha-checkbox";
|
| 147 |
+
checkbox.style.width="24px"; checkbox.style.height="24px"; checkbox.style.cursor="pointer";
|
| 148 |
+
const label=document.createElement("label");
|
| 149 |
+
label.style.color="#eee"; label.style.cursor="pointer"; label.style.marginLeft="8px";
|
| 150 |
+
label.innerText="I'm not a robot";
|
| 151 |
+
cbContainer.appendChild(checkbox); cbContainer.appendChild(label);
|
| 152 |
+
|
| 153 |
+
// links
|
| 154 |
+
const links=document.createElement("div");
|
| 155 |
+
links.style.fontSize="12px"; links.style.color="#aaa"; links.style.marginTop="8px";
|
| 156 |
+
links.innerHTML=`<a href="https://example.com" target="_blank" style="color:#8ab4f8;">Privacy Policy</a> | <a href="https://example.com" target="_blank" style="color:#8ab4f8;">Terms of Service</a>`;
|
| 157 |
+
|
| 158 |
+
// instruction & result
|
| 159 |
+
const instruction=document.createElement("p");
|
| 160 |
+
instruction.style.margin="10px 0 12px 0";
|
| 161 |
+
instruction.style.color="#cfcfcf"; instruction.style.fontSize="14px";
|
| 162 |
+
const result=document.createElement("div");
|
| 163 |
+
result.style.fontWeight="700"; result.style.minHeight="20px"; result.style.marginTop="10px";
|
| 164 |
+
|
| 165 |
+
// box container (hidden until checkbox checked)
|
| 166 |
+
const boxesWrap=document.createElement("div");
|
| 167 |
+
boxesWrap.style.margin="6px 0 8px 0"; boxesWrap.style.display="none"; boxesWrap.style.justifyContent="center";
|
| 168 |
+
|
| 169 |
+
card.appendChild(title);
|
| 170 |
+
card.appendChild(cbContainer);
|
| 171 |
+
card.appendChild(instruction);
|
| 172 |
+
card.appendChild(boxesWrap);
|
| 173 |
+
card.appendChild(result);
|
| 174 |
+
card.appendChild(links);
|
| 175 |
+
overlay.appendChild(card);
|
| 176 |
+
document.body.appendChild(overlay);
|
| 177 |
+
|
| 178 |
+
// create box
|
| 179 |
+
function makeBox(color){
|
| 180 |
+
const el=document.createElement("div"); el.dataset.color=color;
|
| 181 |
+
el.style.cssText=`
|
| 182 |
+
display:inline-block;width:120px;height:120px;margin:8px;cursor:pointer;
|
| 183 |
+
border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,0.45);
|
| 184 |
+
background:${color};transition: transform .12s ease, filter .12s ease;
|
| 185 |
+
`;
|
| 186 |
+
el.addEventListener("mouseover",()=>el.style.transform="translateY(-3px)");
|
| 187 |
+
el.addEventListener("mouseout",()=>el.style.transform="translateY(0px)");
|
| 188 |
+
boxesWrap.appendChild(el);
|
| 189 |
+
el.addEventListener("click",(e)=>onBoxClick(e,el,result));
|
| 190 |
+
return el;
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
const redBox=makeBox("red"), blueBox=makeBox("blue");
|
| 194 |
+
|
| 195 |
+
function setTarget(){
|
| 196 |
+
target=COLORS[Math.floor(Math.random()*COLORS.length)];
|
| 197 |
+
instruction.innerText=`Click the ${target} box`;
|
| 198 |
+
}
|
| 199 |
+
|
| 200 |
+
function setCooldown(){
|
| 201 |
+
blockedUntil=Date.now()+cooldown;
|
| 202 |
+
cooldown=Math.min(cooldown*2,3600000); // max 1 hour
|
| 203 |
+
if(cooldown>=3600000) result.innerText="⏳ Maximum wait reached! Next fail = infinite wait";
|
| 204 |
+
redBox.style.pointerEvents="none"; blueBox.style.pointerEvents="none";
|
| 205 |
+
clearInterval(countdownTimer);
|
| 206 |
+
countdownTimer=setInterval(()=>{
|
| 207 |
+
const left=Math.max(0,Math.ceil((blockedUntil-Date.now())/1000));
|
| 208 |
+
result.innerText=`⏳ Wait ${left}s before trying again...`;
|
| 209 |
+
if(left<=0){
|
| 210 |
+
clearInterval(countdownTimer); countdownTimer=null; tries=0;
|
| 211 |
+
redBox.style.pointerEvents="auto"; blueBox.style.pointerEvents="auto"; result.innerText="";
|
| 212 |
+
setTarget();
|
| 213 |
+
}
|
| 214 |
+
},300);
|
| 215 |
+
}
|
| 216 |
+
|
| 217 |
+
function failAttempt(msg){
|
| 218 |
+
tries++;
|
| 219 |
+
if(msg) result.innerText=msg;
|
| 220 |
+
if(tries>=2){
|
| 221 |
+
if(cooldown>=3600000){ // infinite wait
|
| 222 |
+
blockedUntil=1e20;
|
| 223 |
+
result.innerText="⏳ Infinite wait! You failed too many times.";
|
| 224 |
+
}else setCooldown();
|
| 225 |
+
}else setTimeout(()=>{result.innerText=""; setTarget();},350);
|
| 226 |
+
}
|
| 227 |
+
|
| 228 |
+
function pass(){
|
| 229 |
+
verified=true;
|
| 230 |
+
overlay.style.transition="opacity .36s ease"; overlay.style.opacity="0";
|
| 231 |
+
setTimeout(()=>{if(overlay.parentNode) overlay.parentNode.removeChild(overlay);},380);
|
| 232 |
+
checkbox.checked=true; checkbox.disabled=true;
|
| 233 |
+
}
|
| 234 |
+
|
| 235 |
+
function onBoxClick(e,el,result){
|
| 236 |
+
if(Date.now()<blockedUntil) return;
|
| 237 |
+
const color=el.dataset.color;
|
| 238 |
+
if(color!==target){el.style.filter="blur(2px)"; setTimeout(()=>el.style.filter="",350); setTimeout(setTarget,350); return;}
|
| 239 |
+
|
| 240 |
+
const rect=el.getBoundingClientRect();
|
| 241 |
+
const clickX=e.clientX-rect.left, clickY=e.clientY-rect.top;
|
| 242 |
+
const forbiddenX=(rect.width/100)*BASE_TINY+1;
|
| 243 |
+
const forbiddenY=(rect.height/100)*BASE_TINY+1;
|
| 244 |
+
|
| 245 |
+
if(Math.abs(clickX-rect.width/2)<forbiddenX && Math.abs(clickY-rect.height/2)<forbiddenY){
|
| 246 |
+
failAttempt("❌ Try Again!"); return;
|
| 247 |
+
}
|
| 248 |
+
|
| 249 |
+
pass();
|
| 250 |
+
}
|
| 251 |
+
|
| 252 |
+
// checkbox click → show boxes
|
| 253 |
+
checkbox.addEventListener("change",()=>{
|
| 254 |
+
if(verified){ checkbox.checked=true; checkbox.disabled=true; return;}
|
| 255 |
+
if(checkbox.checked){ boxesWrap.style.display="flex"; setTarget();}
|
| 256 |
+
});
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
if(document.readyState==="loading") document.addEventListener("DOMContentLoaded",createOverlay);
|
| 260 |
+
else createOverlay();
|
| 261 |
+
})();
|
| 262 |
+
</code></pre>
|
| 263 |
+
<p class="mt-4 text-sm text-gray-400">^^^
|
| 264 |
+
code!!! that is actally the voidcaptcha.js code
|
| 265 |
+
</p>
|
| 266 |
+
|
| 267 |
+
</div>
|
| 268 |
+
<pre><code><script src="voidcaptcha.js"></script></code></pre>
|
| 269 |
+
<p class="mt-4 text-sm text-gray-400">Step 1: Download and include the script above before your closing </body> tag</p>
|
| 270 |
+
</dd>
|
| 271 |
+
</div>
|
| 272 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 273 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 274 |
+
2. Verify in your backend
|
| 275 |
+
</dt>
|
| 276 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 277 |
+
<p class="mb-4">When the form is submitted, check for the <code>voidcaptcha-checkbox</code> field in your form data. It will be set to "on" if the user successfully completed the CAPTCHA.</p>
|
| 278 |
+
<p>Here's an example in PHP:</p>
|
| 279 |
+
<pre><code>if (!isset($_POST['voidcaptcha-checkbox']) || $_POST['voidcaptcha-checkbox'] !== 'on') {
|
| 280 |
+
// CAPTCHA verification failed
|
| 281 |
+
die('Please complete the CAPTCHA verification.');
|
| 282 |
+
}</code></pre>
|
| 283 |
+
</dd>
|
| 284 |
+
</div>
|
| 285 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 286 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 287 |
+
3. Customization (optional)
|
| 288 |
+
</dt>
|
| 289 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 290 |
+
<p class="mb-4">You can customize the colors and behavior by modifying the <code>voidcaptcha.js</code> file:</p>
|
| 291 |
+
<pre><code>const COLORS = ["red", "blue"]; // Change these colors
|
| 292 |
+
const BASE_TINY = 15.19202383; // Adjust sensitivity
|
| 293 |
+
let cooldown = 5000; // Initial cooldown period</code></pre>
|
| 294 |
+
</dd>
|
| 295 |
+
</div>
|
| 296 |
+
</div>
|
| 297 |
+
</div>
|
| 298 |
+
</div>
|
| 299 |
+
|
| 300 |
+
<div class="mt-12 bg-white shadow overflow-hidden sm:rounded-lg">
|
| 301 |
+
<div class="px-4 py-5 sm:px-6">
|
| 302 |
+
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
| 303 |
+
Advanced Usage
|
| 304 |
+
</h3>
|
| 305 |
+
<p class="mt-1 max-w-2xl text-sm text-gray-500">
|
| 306 |
+
Programmatic control and event listeners.
|
| 307 |
+
</p>
|
| 308 |
+
</div>
|
| 309 |
+
<div class="border-t border-gray-200 px-4 py-5 sm:p-0">
|
| 310 |
+
<div class="sm:divide-y sm:divide-gray-200">
|
| 311 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 312 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 313 |
+
Manual Trigger
|
| 314 |
+
</dt>
|
| 315 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 316 |
+
<p class="mb-4">You can manually trigger the CAPTCHA by calling:</p>
|
| 317 |
+
<pre><code>voidcaptcha.createOverlay();</code></pre>
|
| 318 |
+
</dd>
|
| 319 |
+
</div>
|
| 320 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 321 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 322 |
+
Verification Callback
|
| 323 |
+
</dt>
|
| 324 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 325 |
+
<p class="mb-4">Listen for verification events:</p>
|
| 326 |
+
<pre><code>document.addEventListener('voidcaptcha-verified', function() {
|
| 327 |
+
console.log('User verified!');
|
| 328 |
+
// Submit your form or continue with your flow
|
| 329 |
+
});</code></pre>
|
| 330 |
+
</dd>
|
| 331 |
+
</div>
|
| 332 |
+
</div>
|
| 333 |
+
</div>
|
| 334 |
+
</div>
|
| 335 |
+
|
| 336 |
+
<div class="mt-12 bg-indigo-50 rounded-lg p-6">
|
| 337 |
+
<div class="flex">
|
| 338 |
+
<div class="flex-shrink-0">
|
| 339 |
+
<i data-feather="alert-circle" class="h-5 w-5 text-indigo-500"></i>
|
| 340 |
+
</div>
|
| 341 |
+
<div class="ml-3">
|
| 342 |
+
<h3 class="text-sm font-medium text-indigo-800">
|
| 343 |
+
Important Note
|
| 344 |
+
</h3>
|
| 345 |
+
<div class="mt-2 text-sm text-indigo-700">
|
| 346 |
+
<p>
|
| 347 |
+
For security reasons, always verify the CAPTCHA on your server-side code. Client-side verification alone is not sufficient as it can be bypassed by malicious users.
|
| 348 |
+
</p>
|
| 349 |
+
</div>
|
| 350 |
+
</div>
|
| 351 |
+
</div>
|
| 352 |
+
</div>
|
| 353 |
+
</div>
|
| 354 |
+
</div>
|
| 355 |
+
|
| 356 |
+
<!-- Footer -->
|
| 357 |
+
<footer class="bg-white">
|
| 358 |
+
<div class="max-w-7xl mx-auto py-12 px-4 overflow-hidden sm:px-6 lg:px-8">
|
| 359 |
+
<nav class="-mx-5 -my-2 flex flex-wrap justify-center" aria-label="Footer">
|
| 360 |
+
<div class="px-5 py-2">
|
| 361 |
+
<a href="index.html" class="text-base text-gray-500 hover:text-gray-900">Home</a>
|
| 362 |
+
</div>
|
| 363 |
+
<div class="px-5 py-2">
|
| 364 |
+
<a href="instructions.html" class="text-base text-gray-500 hover:text-gray-900">Instructions</a>
|
| 365 |
+
</div>
|
| 366 |
+
<div class="px-5 py-2">
|
| 367 |
+
<a href="privacy.html" class="text-base text-gray-500 hover:text-gray-900">Privacy Policy</a>
|
| 368 |
+
</div>
|
| 369 |
+
<div class="px-5 py-2">
|
| 370 |
+
<a href="tos.html" class="text-base text-gray-500 hover:text-gray-900">Terms of Service</a>
|
| 371 |
+
</div>
|
| 372 |
+
</nav>
|
| 373 |
+
<p class="mt-8 text-center text-base text-gray-400">
|
| 374 |
+
© 2025 VoidCaptcha. All rights reserved. Contact: voidisopenscience@gmail.com
|
| 375 |
+
</p>
|
| 376 |
+
</div>
|
| 377 |
+
</footer>
|
| 378 |
+
|
| 379 |
+
<script>
|
| 380 |
+
// Mobile menu toggle
|
| 381 |
+
document.getElementById('mobile-menu-button').addEventListener('click', function() {
|
| 382 |
+
const menu = document.getElementById('mobile-menu');
|
| 383 |
+
menu.classList.toggle('hidden');
|
| 384 |
+
});
|
| 385 |
+
</script>
|
| 386 |
+
<script>feather.replace();</script>
|
| 387 |
+
</body>
|
| 388 |
+
</html>
|
privacy.html
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>VoidCaptcha - Privacy Policy</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<!-- Google tag (gtag.js) -->
|
| 11 |
+
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
|
| 12 |
+
<script>
|
| 13 |
+
window.dataLayer = window.dataLayer || [];
|
| 14 |
+
function gtag(){dataLayer.push(arguments);}
|
| 15 |
+
gtag('js', new Date());
|
| 16 |
+
gtag('config', 'G-XXXXXXXXXX');
|
| 17 |
+
</script>
|
| 18 |
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
| 19 |
+
<style>
|
| 20 |
+
body {
|
| 21 |
+
font-family: 'Inter', sans-serif;
|
| 22 |
+
background-color: #111827;
|
| 23 |
+
color: #f3f4f6;
|
| 24 |
+
}
|
| 25 |
+
.gradient-text {
|
| 26 |
+
background: linear-gradient(90deg, #6366f1, #8b5cf6);
|
| 27 |
+
-webkit-background-clip: text;
|
| 28 |
+
background-clip: text;
|
| 29 |
+
color: transparent;
|
| 30 |
+
}
|
| 31 |
+
</style>
|
| 32 |
+
</head>
|
| 33 |
+
<body class="min-h-screen flex flex-col">
|
| 34 |
+
<!-- Navigation -->
|
| 35 |
+
<nav class="bg-white shadow-sm">
|
| 36 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 37 |
+
<div class="flex justify-between h-16">
|
| 38 |
+
<div class="flex items-center">
|
| 39 |
+
<div class="flex-shrink-0 flex items-center">
|
| 40 |
+
<span class="text-xl font-bold gradient-text">VoidCaptcha</span>
|
| 41 |
+
</div>
|
| 42 |
+
</div>
|
| 43 |
+
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
| 44 |
+
<a href="index.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Home</a>
|
| 45 |
+
<a href="instructions.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Instructions</a>
|
| 46 |
+
<a href="privacy.html" class="border-indigo-500 text-gray-900 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Privacy</a>
|
| 47 |
+
<a href="tos.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Terms</a>
|
| 48 |
+
</div>
|
| 49 |
+
<div class="-mr-2 flex items-center sm:hidden">
|
| 50 |
+
<button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500" aria-controls="mobile-menu" aria-expanded="false" id="mobile-menu-button">
|
| 51 |
+
<i data-feather="menu"></i>
|
| 52 |
+
</button>
|
| 53 |
+
</div>
|
| 54 |
+
</div>
|
| 55 |
+
</div>
|
| 56 |
+
|
| 57 |
+
<!-- Mobile menu -->
|
| 58 |
+
<div class="sm:hidden hidden" id="mobile-menu">
|
| 59 |
+
<div class="pt-2 pb-3 space-y-1">
|
| 60 |
+
<a href="index.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Home</a>
|
| 61 |
+
<a href="instructions.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Instructions</a>
|
| 62 |
+
<a href="privacy.html" class="bg-indigo-50 border-indigo-500 text-indigo-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Privacy</a>
|
| 63 |
+
<a href="tos.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Terms</a>
|
| 64 |
+
</div>
|
| 65 |
+
</div>
|
| 66 |
+
</nav>
|
| 67 |
+
|
| 68 |
+
<!-- Main Content -->
|
| 69 |
+
<div class="flex-grow">
|
| 70 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
| 71 |
+
<div class="text-center mb-12">
|
| 72 |
+
<h1 class="text-3xl font-extrabold text-gray-900 sm:text-4xl">
|
| 73 |
+
<span class="gradient-text">Privacy</span> Policy
|
| 74 |
+
</h1>
|
| 75 |
+
<p class="mt-3 max-w-2xl mx-auto text-xl text-gray-500 sm:mt-4">
|
| 76 |
+
Last updated: January 1, 2023
|
| 77 |
+
</p>
|
| 78 |
+
</div>
|
| 79 |
+
|
| 80 |
+
<div class="bg-white shadow overflow-hidden sm:rounded-lg">
|
| 81 |
+
<div class="px-4 py-5 sm:px-6">
|
| 82 |
+
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
| 83 |
+
Our Commitment to Privacy
|
| 84 |
+
</h3>
|
| 85 |
+
<p class="mt-1 max-w-2xl text-sm text-gray-500">
|
| 86 |
+
VoidCaptcha values your privacy and is committed to protecting it.
|
| 87 |
+
</p>
|
| 88 |
+
</div>
|
| 89 |
+
<div class="border-t border-gray-200 px-4 py-5 sm:p-0">
|
| 90 |
+
<div class="sm:divide-y sm:divide-gray-200">
|
| 91 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 92 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 93 |
+
Information We Collect
|
| 94 |
+
</dt>
|
| 95 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 96 |
+
<p class="mb-4">VoidCaptcha is designed with privacy in mind. Unlike many other CAPTCHA solutions, we do not:</p>
|
| 97 |
+
<ul class="list-disc pl-5 space-y-2">
|
| 98 |
+
<li>Collect any personally identifiable information</li>
|
| 99 |
+
<li>Use cookies or tracking technologies</li>
|
| 100 |
+
<li>Store IP addresses or device identifiers</li>
|
| 101 |
+
<li>Profile users or their behavior</li>
|
| 102 |
+
</ul>
|
| 103 |
+
<p class="mt-4">The only information processed is whether the user successfully completed the CAPTCHA challenge, which is temporarily stored in memory and not persisted.</p>
|
| 104 |
+
</dd>
|
| 105 |
+
</div>
|
| 106 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 107 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 108 |
+
How We Use Information
|
| 109 |
+
</dt>
|
| 110 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 111 |
+
<p>The sole purpose of VoidCaptcha is to distinguish human users from automated bots. The verification result is used exclusively for this purpose and is not used for any other tracking or analytics.</p>
|
| 112 |
+
</dd>
|
| 113 |
+
</div>
|
| 114 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 115 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 116 |
+
Data Security
|
| 117 |
+
</dt>
|
| 118 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 119 |
+
<p>We implement appropriate technical measures to ensure that any temporary data processed by VoidCaptcha is protected against unauthorized access, alteration, disclosure, or destruction.</p>
|
| 120 |
+
</dd>
|
| 121 |
+
</div>
|
| 122 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 123 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 124 |
+
Changes to This Policy
|
| 125 |
+
</dt>
|
| 126 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 127 |
+
<p>We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page and updating the "Last updated" date.</p>
|
| 128 |
+
</dd>
|
| 129 |
+
</div>
|
| 130 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 131 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 132 |
+
Contact Us
|
| 133 |
+
</dt>
|
| 134 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 135 |
+
<p>If you have any questions about this Privacy Policy, please contact us at voidisopenscience@gmail.com.</p>
|
| 136 |
+
</dd>
|
| 137 |
+
</div>
|
| 138 |
+
</div>
|
| 139 |
+
</div>
|
| 140 |
+
</div>
|
| 141 |
+
</div>
|
| 142 |
+
</div>
|
| 143 |
+
|
| 144 |
+
<!-- Footer -->
|
| 145 |
+
<footer class="bg-white">
|
| 146 |
+
<div class="max-w-7xl mx-auto py-12 px-4 overflow-hidden sm:px-6 lg:px-8">
|
| 147 |
+
<nav class="-mx-5 -my-2 flex flex-wrap justify-center" aria-label="Footer">
|
| 148 |
+
<div class="px-5 py-2">
|
| 149 |
+
<a href="index.html" class="text-base text-gray-500 hover:text-gray-900">Home</a>
|
| 150 |
+
</div>
|
| 151 |
+
<div class="px-5 py-2">
|
| 152 |
+
<a href="instructions.html" class="text-base text-gray-500 hover:text-gray-900">Instructions</a>
|
| 153 |
+
</div>
|
| 154 |
+
<div class="px-5 py-2">
|
| 155 |
+
<a href="privacy.html" class="text-base text-gray-500 hover:text-gray-900">Privacy Policy</a>
|
| 156 |
+
</div>
|
| 157 |
+
<div class="px-5 py-2">
|
| 158 |
+
<a href="tos.html" class="text-base text-gray-500 hover:text-gray-900">Terms of Service</a>
|
| 159 |
+
</div>
|
| 160 |
+
</nav>
|
| 161 |
+
<p class="mt-8 text-center text-base text-gray-400">
|
| 162 |
+
© 2025 VoidCaptcha. All rights reserved. Contact: voidisopenscience@gmail.com
|
| 163 |
+
</p>
|
| 164 |
+
</div>
|
| 165 |
+
</footer>
|
| 166 |
+
|
| 167 |
+
<script>
|
| 168 |
+
// Mobile menu toggle
|
| 169 |
+
document.getElementById('mobile-menu-button').addEventListener('click', function() {
|
| 170 |
+
const menu = document.getElementById('mobile-menu');
|
| 171 |
+
menu.classList.toggle('hidden');
|
| 172 |
+
});
|
| 173 |
+
</script>
|
| 174 |
+
<script>feather.replace();</script>
|
| 175 |
+
</body>
|
| 176 |
+
</html>
|
tos.html
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>VoidCaptcha - Terms of Service</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<!-- Google tag (gtag.js) -->
|
| 11 |
+
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
|
| 12 |
+
<script>
|
| 13 |
+
window.dataLayer = window.dataLayer || [];
|
| 14 |
+
function gtag(){dataLayer.push(arguments);}
|
| 15 |
+
gtag('js', new Date());
|
| 16 |
+
gtag('config', 'G-XXXXXXXXXX');
|
| 17 |
+
</script>
|
| 18 |
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
|
| 19 |
+
<style>
|
| 20 |
+
body {
|
| 21 |
+
font-family: 'Inter', sans-serif;
|
| 22 |
+
background-color: #111827;
|
| 23 |
+
color: #f3f4f6;
|
| 24 |
+
}
|
| 25 |
+
.gradient-text {
|
| 26 |
+
background: linear-gradient(90deg, #6366f1, #8b5cf6);
|
| 27 |
+
-webkit-background-clip: text;
|
| 28 |
+
background-clip: text;
|
| 29 |
+
color: transparent;
|
| 30 |
+
}
|
| 31 |
+
</style>
|
| 32 |
+
</head>
|
| 33 |
+
<body class="min-h-screen flex flex-col">
|
| 34 |
+
<!-- Navigation -->
|
| 35 |
+
<nav class="bg-white shadow-sm">
|
| 36 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
| 37 |
+
<div class="flex justify-between h-16">
|
| 38 |
+
<div class="flex items-center">
|
| 39 |
+
<div class="flex-shrink-0 flex items-center">
|
| 40 |
+
<span class="text-xl font-bold gradient-text">VoidCaptcha</span>
|
| 41 |
+
</div>
|
| 42 |
+
</div>
|
| 43 |
+
<div class="hidden sm:ml-6 sm:flex sm:space-x-8">
|
| 44 |
+
<a href="index.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Home</a>
|
| 45 |
+
<a href="instructions.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Instructions</a>
|
| 46 |
+
<a href="privacy.html" class="border-transparent text-gray-500 hover:border-gray-300 hover:text-gray-700 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Privacy</a>
|
| 47 |
+
<a href="tos.html" class="border-indigo-500 text-gray-900 inline-flex items-center px-1 pt-1 border-b-2 text-sm font-medium">Terms</a>
|
| 48 |
+
</div>
|
| 49 |
+
<div class="-mr-2 flex items-center sm:hidden">
|
| 50 |
+
<button type="button" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-indigo-500" aria-controls="mobile-menu" aria-expanded="false" id="mobile-menu-button">
|
| 51 |
+
<i data-feather="menu"></i>
|
| 52 |
+
</button>
|
| 53 |
+
</div>
|
| 54 |
+
</div>
|
| 55 |
+
</div>
|
| 56 |
+
|
| 57 |
+
<!-- Mobile menu -->
|
| 58 |
+
<div class="sm:hidden hidden" id="mobile-menu">
|
| 59 |
+
<div class="pt-2 pb-3 space-y-1">
|
| 60 |
+
<a href="index.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Home</a>
|
| 61 |
+
<a href="instructions.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Instructions</a>
|
| 62 |
+
<a href="privacy.html" class="border-transparent text-gray-500 hover:bg-gray-50 hover:border-gray-300 hover:text-gray-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Privacy</a>
|
| 63 |
+
<a href="tos.html" class="bg-indigo-50 border-indigo-500 text-indigo-700 block pl-3 pr-4 py-2 border-l-4 text-base font-medium">Terms</a>
|
| 64 |
+
</div>
|
| 65 |
+
</div>
|
| 66 |
+
</nav>
|
| 67 |
+
|
| 68 |
+
<!-- Main Content -->
|
| 69 |
+
<div class="flex-grow">
|
| 70 |
+
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
|
| 71 |
+
<div class="text-center mb-12">
|
| 72 |
+
<h1 class="text-3xl font-extrabold text-gray-900 sm:text-4xl">
|
| 73 |
+
Terms of <span class="gradient-text">Service</span>
|
| 74 |
+
</h1>
|
| 75 |
+
<p class="mt-3 max-w-2xl mx-auto text-xl text-gray-500 sm:mt-4">
|
| 76 |
+
Last updated: January 1, 2023
|
| 77 |
+
</p>
|
| 78 |
+
</div>
|
| 79 |
+
|
| 80 |
+
<div class="bg-white shadow overflow-hidden sm:rounded-lg">
|
| 81 |
+
<div class="px-4 py-5 sm:px-6">
|
| 82 |
+
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
| 83 |
+
Terms and Conditions
|
| 84 |
+
</h3>
|
| 85 |
+
<p class="mt-1 max-w-2xl text-sm text-gray-500">
|
| 86 |
+
Please read these Terms of Service carefully before using VoidCaptcha.
|
| 87 |
+
</p>
|
| 88 |
+
</div>
|
| 89 |
+
<div class="border-t border-gray-200 px-4 py-5 sm:p-0">
|
| 90 |
+
<div class="sm:divide-y sm:divide-gray-200">
|
| 91 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 92 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 93 |
+
1. Acceptance of Terms
|
| 94 |
+
</dt>
|
| 95 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 96 |
+
<p>By using VoidCaptcha, you agree to be bound by these Terms of Service. If you do not agree to all the terms and conditions, you may not use our service.</p>
|
| 97 |
+
</dd>
|
| 98 |
+
</div>
|
| 99 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 100 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 101 |
+
2. License
|
| 102 |
+
</dt>
|
| 103 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 104 |
+
<p>VoidCaptcha is provided under the MIT License. You are free to use, modify, and distribute the software in accordance with the terms of this license.</p>
|
| 105 |
+
</dd>
|
| 106 |
+
</div>
|
| 107 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 108 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 109 |
+
3. No Warranty
|
| 110 |
+
</dt>
|
| 111 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 112 |
+
<p>VoidCaptcha is provided "as is" without warranty of any kind, either express or implied, including but not limited to the implied warranties of merchantability and fitness for a particular purpose.</p>
|
| 113 |
+
</dd>
|
| 114 |
+
</div>
|
| 115 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 116 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 117 |
+
4. Limitation of Liability
|
| 118 |
+
</dt>
|
| 119 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 120 |
+
<p>In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the software or the use or other dealings in the software.</p>
|
| 121 |
+
</dd>
|
| 122 |
+
</div>
|
| 123 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 124 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 125 |
+
5. Modifications
|
| 126 |
+
</dt>
|
| 127 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 128 |
+
<p>We reserve the right to modify these terms at any time. Your continued use of VoidCaptcha after any such changes constitutes your acceptance of the new Terms of Service.</p>
|
| 129 |
+
</dd>
|
| 130 |
+
</div>
|
| 131 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 132 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 133 |
+
6. Governing Law
|
| 134 |
+
</dt>
|
| 135 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 136 |
+
<p>These Terms shall be governed and construed in accordance with the laws of the State of Georgia, United States, without regard to its conflict of law provisions.</p>
|
| 137 |
+
</dd>
|
| 138 |
+
</div>
|
| 139 |
+
<div class="py-4 sm:py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
|
| 140 |
+
<dt class="text-sm font-medium text-gray-500">
|
| 141 |
+
7. Contact Information
|
| 142 |
+
</dt>
|
| 143 |
+
<dd class="mt-1 text-sm text-gray-900 sm:mt-0 sm:col-span-2">
|
| 144 |
+
<p>If you have any questions about these Terms, please contact us at voidisopenscience@gmail.com.</p>
|
| 145 |
+
</dd>
|
| 146 |
+
</div>
|
| 147 |
+
</div>
|
| 148 |
+
</div>
|
| 149 |
+
</div>
|
| 150 |
+
</div>
|
| 151 |
+
</div>
|
| 152 |
+
|
| 153 |
+
<!-- Footer -->
|
| 154 |
+
<footer class="bg-white">
|
| 155 |
+
<div class="max-w-7xl mx-auto py-12 px-4 overflow-hidden sm:px-6 lg:px-8">
|
| 156 |
+
<nav class="-mx-5 -my-2 flex flex-wrap justify-center" aria-label="Footer">
|
| 157 |
+
<div class="px-5 py-2">
|
| 158 |
+
<a href="index.html" class="text-base text-gray-500 hover:text-gray-900">Home</a>
|
| 159 |
+
</div>
|
| 160 |
+
<div class="px-5 py-2">
|
| 161 |
+
<a href="instructions.html" class="text-base text-gray-500 hover:text-gray-900">Instructions</a>
|
| 162 |
+
</div>
|
| 163 |
+
<div class="px-5 py-2">
|
| 164 |
+
<a href="privacy.html" class="text-base text-gray-500 hover:text-gray-900">Privacy Policy</a>
|
| 165 |
+
</div>
|
| 166 |
+
<div class="px-5 py-2">
|
| 167 |
+
<a href="tos.html" class="text-base text-gray-500 hover:text-gray-900">Terms of Service</a>
|
| 168 |
+
</div>
|
| 169 |
+
</nav>
|
| 170 |
+
<p class="mt-8 text-center text-base text-gray-400">
|
| 171 |
+
© 2025 VoidCaptcha. All rights reserved. Contact: voidisopenscience@gmail.com
|
| 172 |
+
</p>
|
| 173 |
+
</div>
|
| 174 |
+
</footer>
|
| 175 |
+
|
| 176 |
+
<script>
|
| 177 |
+
// Mobile menu toggle
|
| 178 |
+
document.getElementById('mobile-menu-button').addEventListener('click', function() {
|
| 179 |
+
const menu = document.getElementById('mobile-menu');
|
| 180 |
+
menu.classList.toggle('hidden');
|
| 181 |
+
});
|
| 182 |
+
</script>
|
| 183 |
+
<script>feather.replace();</script>
|
| 184 |
+
</body>
|
| 185 |
+
</html>
|
voidcaptcha.js
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
```javascript
|
| 2 |
+
// voidcaptcha.js
|
| 3 |
+
(function(){
|
| 4 |
+
const COLORS=["red","blue"];
|
| 5 |
+
const BASE_TINY=15.19202383;
|
| 6 |
+
let target=null, tries=0, cooldown=5000, blockedUntil=0, verified=false, countdownTimer=null;
|
| 7 |
+
|
| 8 |
+
function createOverlay(){
|
| 9 |
+
if(document.getElementById("voidcaptcha-overlay")) return;
|
| 10 |
+
|
| 11 |
+
// full screen overlay
|
| 12 |
+
const overlay=document.createElement("div");
|
| 13 |
+
overlay.id="voidcaptcha-overlay";
|
| 14 |
+
overlay.style.cssText=`
|
| 15 |
+
position:fixed;top:0;left:0;width:100%;height:100%;
|
| 16 |
+
background:#000;display:flex;justify-content:center;align-items:center;
|
| 17 |
+
z-index:2147483647;flex-direction:column;
|
| 18 |
+
`;
|
| 19 |
+
|
| 20 |
+
// container card
|
| 21 |
+
const card=document.createElement("div");
|
| 22 |
+
card.style.cssText=`
|
| 23 |
+
background:#111214;color:#eee;padding:26px;border-radius:14px;
|
| 24 |
+
text-align:center;box-shadow:0 18px 60px rgba(0,0,0,0.7);
|
| 25 |
+
max-width:380px;width:92%;display:flex;flex-direction:column;align-items:center;
|
| 26 |
+
`;
|
| 27 |
+
|
| 28 |
+
const title=document.createElement("h2");
|
| 29 |
+
title.innerText="VoidCaptcha";
|
| 30 |
+
title.style.margin="0 0 10px 0";
|
| 31 |
+
title.style.fontSize="20px";
|
| 32 |
+
|
| 33 |
+
// checkbox container
|
| 34 |
+
const cbContainer=document.createElement("div");
|
| 35 |
+
cbContainer.style.margin="10px 0 20px 0";
|
| 36 |
+
const checkbox=document.createElement("input");
|
| 37 |
+
checkbox.type="checkbox";
|
| 38 |
+
checkbox.id="voidcaptcha-checkbox";
|
| 39 |
+
checkbox.style.width="24px"; checkbox.style.height="24px"; checkbox.style.cursor="pointer";
|
| 40 |
+
const label=document.createElement("label");
|
| 41 |
+
label.style.color="#eee"; label.style.cursor="pointer"; label.style.marginLeft="8px";
|
| 42 |
+
label.innerText="I'm not a robot";
|
| 43 |
+
cbContainer.appendChild(checkbox); cbContainer.appendChild(label);
|
| 44 |
+
|
| 45 |
+
// links
|
| 46 |
+
const links=document.createElement("div");
|
| 47 |
+
links.style.fontSize="12px"; links.style.color="#aaa"; links.style.marginTop="8px";
|
| 48 |
+
links.innerHTML=`<a href="privacy.html" target="_blank" style="color:#8ab4f8;">Privacy Policy</a> | <a href="tos.html" target="_blank" style="color:#8ab4f8;">Terms of Service</a>`;
|
| 49 |
+
|
| 50 |
+
// instruction & result
|
| 51 |
+
const instruction=document.createElement("p");
|
| 52 |
+
instruction.style.margin="10px 0 12px 0";
|
| 53 |
+
instruction.style.color="#cfcfcf"; instruction.style.fontSize="14px";
|
| 54 |
+
const result=document.createElement("div");
|
| 55 |
+
result.style.fontWeight="700"; result.style.minHeight="20px"; result.style.marginTop="10px";
|
| 56 |
+
|
| 57 |
+
// box container (hidden until checkbox checked)
|
| 58 |
+
const boxesWrap=document.createElement("div");
|
| 59 |
+
boxesWrap.style.margin="6px 0 8px 0"; boxesWrap.style.display="none"; boxesWrap.style.justifyContent="center";
|
| 60 |
+
|
| 61 |
+
card.appendChild(title);
|
| 62 |
+
card.appendChild(cbContainer);
|
| 63 |
+
card.appendChild(instruction);
|
| 64 |
+
card.appendChild(boxesWrap);
|
| 65 |
+
card.appendChild(result);
|
| 66 |
+
card.appendChild(links);
|
| 67 |
+
overlay.appendChild(card);
|
| 68 |
+
document.body.appendChild(overlay);
|
| 69 |
+
|
| 70 |
+
// create box
|
| 71 |
+
function makeBox(color){
|
| 72 |
+
const el=document.createElement("div"); el.dataset.color=color;
|
| 73 |
+
el.style.cssText=`
|
| 74 |
+
display:inline-block;width:120px;height:120px;margin:8px;cursor:pointer;
|
| 75 |
+
border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,0.45);
|
| 76 |
+
background:${color};transition: transform .12s ease, filter .12s ease;
|
| 77 |
+
`;
|
| 78 |
+
el.addEventListener("mouseover",()=>el.style.transform="translateY(-3px)");
|
| 79 |
+
el.addEventListener("mouseout",()=>el.style.transform="translateY(0px)");
|
| 80 |
+
boxesWrap.appendChild(el);
|
| 81 |
+
el.addEventListener("click",(e)=>onBoxClick(e,el,result));
|
| 82 |
+
return el;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
const redBox=makeBox("red"), blueBox=makeBox("blue");
|
| 86 |
+
|
| 87 |
+
function setTarget(){
|
| 88 |
+
target=COLORS[Math.floor(Math.random()*COLORS.length)];
|
| 89 |
+
instruction.innerText=`Click the ${target} box`;
|
| 90 |
+
}
|
| 91 |
+
|
| 92 |
+
function setCooldown(){
|
| 93 |
+
blockedUntil=Date.now()+cooldown;
|
| 94 |
+
cooldown=Math.min(cooldown*2,3600000); // max 1 hour
|
| 95 |
+
if(cooldown>=3600000) result.innerText="⏳ Maximum wait reached! Next fail = infinite wait";
|
| 96 |
+
redBox.style.pointerEvents="none"; blueBox.style.pointerEvents="none";
|
| 97 |
+
clearInterval(countdownTimer);
|
| 98 |
+
countdownTimer=setInterval(()=>{
|
| 99 |
+
const left=Math.max(0,Math.ceil((blockedUntil-Date.now())/1000));
|
| 100 |
+
result.innerText=`⏳ Wait ${left}s before trying again...`;
|
| 101 |
+
if(left<=0){
|
| 102 |
+
clearInterval(countdownTimer); countdownTimer=null; tries=0;
|
| 103 |
+
redBox.style.pointerEvents="auto"; blueBox.style.pointerEvents="auto"; result.innerText="";
|
| 104 |
+
setTarget();
|
| 105 |
+
}
|
| 106 |
+
},300);
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
function failAttempt(msg){
|
| 110 |
+
tries++;
|
| 111 |
+
if(msg) result.innerText=msg;
|
| 112 |
+
if(tries>=2){
|
| 113 |
+
if(cooldown>=3600000){ // infinite wait
|
| 114 |
+
blockedUntil=1e20;
|
| 115 |
+
result.innerText="⏳ Infinite wait! You failed too many times.";
|
| 116 |
+
}else setCooldown();
|
| 117 |
+
}else setTimeout(()=>{result.innerText=""; setTarget();},350);
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
function pass(){
|
| 121 |
+
verified=true;
|
| 122 |
+
overlay.style.transition="opacity .36s ease"; overlay.style.opacity="0";
|
| 123 |
+
setTimeout(()=>{if(overlay.parentNode) overlay.parentNode.removeChild(overlay);},380);
|
| 124 |
+
checkbox.checked=true; checkbox.disabled=true;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
function onBoxClick(e,el,result){
|
| 128 |
+
if(Date.now()<blockedUntil) return;
|
| 129 |
+
const color=el.dataset.color;
|
| 130 |
+
if(color!==target){el.style.filter="blur(2px)"; setTimeout(()=>el.style.filter="",350); setTimeout(setTarget,350); return;}
|
| 131 |
+
|
| 132 |
+
const rect=el.getBoundingClientRect();
|
| 133 |
+
const clickX=e.clientX-rect.left, clickY=e.clientY-rect.top;
|
| 134 |
+
const forbiddenX=(rect.width/100)*BASE_TINY+1;
|
| 135 |
+
const forbiddenY=(rect.height/100)*BASE_TINY+1;
|
| 136 |
+
|
| 137 |
+
if(Math.abs(clickX-rect.width/2)<forbiddenX && Math.abs(clickY-rect.height/2)<forbiddenY){
|
| 138 |
+
failAttempt("❌ Try Again!"); return;
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
pass();
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
// checkbox click → show boxes
|
| 145 |
+
checkbox.addEventListener("change",()=>{
|
| 146 |
+
if(verified){ checkbox.checked=true; checkbox.disabled=true; return;}
|
| 147 |
+
if(checkbox.checked){ boxesWrap.style.display="flex"; setTarget();}
|
| 148 |
+
});
|
| 149 |
+
}
|
| 150 |
+
|
| 151 |
+
if(document.readyState==="loading") document.addEventListener("DOMContentLoaded",createOverlay);
|
| 152 |
+
else createOverlay();
|
| 153 |
+
})();
|
| 154 |
+
```
|