reaper-arcade-hub 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/styles.css +209 -0
- package/index.html +44 -36
- package/js/app.js +59 -34
- package/main/css/styles.css +209 -0
- package/main/index.html +44 -36
- package/main/js/app.js +59 -34
- package/package.json +1 -1
- package/verify/css/styles.css +209 -0
- package/verify/index.html +16 -10
package/css/styles.css
CHANGED
|
@@ -1150,3 +1150,212 @@ body.turbo-mode-active #bg-canvas {
|
|
|
1150
1150
|
to { box-shadow: 0 0 35px rgba(255, 215, 0, 0.5); }
|
|
1151
1151
|
}
|
|
1152
1152
|
|
|
1153
|
+
/* ==========================================
|
|
1154
|
+
RECODED NEXT-GEN CYBER BOOT SPLASH LOADER
|
|
1155
|
+
========================================== */
|
|
1156
|
+
.splash-v2-container {
|
|
1157
|
+
max-width: 520px;
|
|
1158
|
+
width: 92%;
|
|
1159
|
+
background: rgba(4, 12, 28, 0.9);
|
|
1160
|
+
backdrop-filter: blur(24px);
|
|
1161
|
+
-webkit-backdrop-filter: blur(24px);
|
|
1162
|
+
border: 1.5px solid rgba(0, 210, 255, 0.4);
|
|
1163
|
+
border-radius: 18px;
|
|
1164
|
+
padding: 2.5rem 2rem;
|
|
1165
|
+
box-shadow: 0 0 60px rgba(0, 136, 255, 0.35), inset 0 0 30px rgba(0, 210, 255, 0.08);
|
|
1166
|
+
position: relative;
|
|
1167
|
+
overflow: hidden;
|
|
1168
|
+
text-align: center;
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
.splash-v2-container::before {
|
|
1172
|
+
content: '';
|
|
1173
|
+
position: absolute;
|
|
1174
|
+
top: -50%;
|
|
1175
|
+
left: -50%;
|
|
1176
|
+
width: 200%;
|
|
1177
|
+
height: 200%;
|
|
1178
|
+
background: radial-gradient(circle, rgba(0, 210, 255, 0.08) 0%, transparent 60%);
|
|
1179
|
+
animation: rotateOrbital 12s linear infinite;
|
|
1180
|
+
pointer-events: none;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
@keyframes rotateOrbital {
|
|
1184
|
+
0% { transform: rotate(0deg); }
|
|
1185
|
+
100% { transform: rotate(360deg); }
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
.splash-emblem-wrapper {
|
|
1189
|
+
position: relative;
|
|
1190
|
+
width: 80px;
|
|
1191
|
+
height: 80px;
|
|
1192
|
+
margin: 0 auto 1.25rem;
|
|
1193
|
+
display: flex;
|
|
1194
|
+
align-items: center;
|
|
1195
|
+
justify-content: center;
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
.splash-emblem-ring {
|
|
1199
|
+
position: absolute;
|
|
1200
|
+
inset: 0;
|
|
1201
|
+
border-radius: 50%;
|
|
1202
|
+
border: 2px dashed rgba(0, 210, 255, 0.6);
|
|
1203
|
+
animation: spinRing 8s linear infinite;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
.splash-emblem-ring-inner {
|
|
1207
|
+
position: absolute;
|
|
1208
|
+
inset: 8px;
|
|
1209
|
+
border-radius: 50%;
|
|
1210
|
+
border: 2px solid rgba(0, 255, 170, 0.4);
|
|
1211
|
+
border-top-color: #00ffaa;
|
|
1212
|
+
animation: spinRingRev 4s linear infinite;
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
@keyframes spinRing {
|
|
1216
|
+
from { transform: rotate(0deg); }
|
|
1217
|
+
to { transform: rotate(360deg); }
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
@keyframes spinRingRev {
|
|
1221
|
+
from { transform: rotate(360deg); }
|
|
1222
|
+
to { transform: rotate(0deg); }
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
.splash-emblem-core {
|
|
1226
|
+
width: 50px;
|
|
1227
|
+
height: 50px;
|
|
1228
|
+
border-radius: 50%;
|
|
1229
|
+
background: linear-gradient(135deg, #0088ff, #00ffaa);
|
|
1230
|
+
display: flex;
|
|
1231
|
+
align-items: center;
|
|
1232
|
+
justify-content: center;
|
|
1233
|
+
font-size: 1.6rem;
|
|
1234
|
+
box-shadow: 0 0 25px rgba(0, 210, 255, 0.8);
|
|
1235
|
+
animation: pulseCore 2s ease-in-out infinite alternate;
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
@keyframes pulseCore {
|
|
1239
|
+
from { transform: scale(0.94); box-shadow: 0 0 15px rgba(0, 210, 255, 0.6); }
|
|
1240
|
+
to { transform: scale(1.06); box-shadow: 0 0 32px rgba(0, 255, 170, 0.9); }
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
.splash-terminal-log {
|
|
1244
|
+
background: #020612;
|
|
1245
|
+
border: 1px solid rgba(0, 136, 255, 0.25);
|
|
1246
|
+
border-radius: 8px;
|
|
1247
|
+
padding: 0.65rem 1rem;
|
|
1248
|
+
font-family: var(--font-mono);
|
|
1249
|
+
font-size: 0.72rem;
|
|
1250
|
+
color: #88ffcc;
|
|
1251
|
+
text-align: left;
|
|
1252
|
+
min-height: 48px;
|
|
1253
|
+
display: flex;
|
|
1254
|
+
align-items: center;
|
|
1255
|
+
gap: 0.5rem;
|
|
1256
|
+
margin-bottom: 1.25rem;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
/* ==========================================
|
|
1260
|
+
RECODED KEY GATEKEEPER TERMINAL (NEXT-GEN)
|
|
1261
|
+
========================================== */
|
|
1262
|
+
.key-terminal-card {
|
|
1263
|
+
max-width: 480px;
|
|
1264
|
+
width: 92%;
|
|
1265
|
+
background: rgba(4, 12, 28, 0.92);
|
|
1266
|
+
backdrop-filter: blur(28px);
|
|
1267
|
+
-webkit-backdrop-filter: blur(28px);
|
|
1268
|
+
border: 2px solid transparent;
|
|
1269
|
+
border-image: linear-gradient(135deg, #00d2ff, #7928ca, #ff0055) 1;
|
|
1270
|
+
border-radius: 20px;
|
|
1271
|
+
padding: 2.75rem 2.25rem;
|
|
1272
|
+
box-shadow: 0 0 70px rgba(0, 210, 255, 0.35), inset 0 0 35px rgba(121, 40, 202, 0.2);
|
|
1273
|
+
text-align: center;
|
|
1274
|
+
position: relative;
|
|
1275
|
+
animation: keyCardEnter 0.4s cubic-bezier(0.16, 1, 0.3, 1);
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
@keyframes keyCardEnter {
|
|
1279
|
+
from { opacity: 0; transform: scale(0.93) translateY(10px); }
|
|
1280
|
+
to { opacity: 1; transform: scale(1) translateY(0); }
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
.key-input-wrapper {
|
|
1284
|
+
position: relative;
|
|
1285
|
+
display: flex;
|
|
1286
|
+
align-items: center;
|
|
1287
|
+
margin-bottom: 1rem;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
.key-input-field {
|
|
1291
|
+
width: 100%;
|
|
1292
|
+
background: #020714;
|
|
1293
|
+
border: 1.5px solid rgba(0, 210, 255, 0.4);
|
|
1294
|
+
border-radius: 10px;
|
|
1295
|
+
color: #fff;
|
|
1296
|
+
font-family: var(--font-mono);
|
|
1297
|
+
font-size: 0.95rem;
|
|
1298
|
+
font-weight: 700;
|
|
1299
|
+
padding: 0.85rem 5.5rem 0.85rem 1rem;
|
|
1300
|
+
letter-spacing: 0.06em;
|
|
1301
|
+
transition: all 0.25s ease;
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
.key-input-field:focus {
|
|
1305
|
+
outline: none;
|
|
1306
|
+
border-color: #00ffaa;
|
|
1307
|
+
box-shadow: 0 0 20px rgba(0, 255, 170, 0.4);
|
|
1308
|
+
background: #030b1e;
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
.btn-paste-key {
|
|
1312
|
+
position: absolute;
|
|
1313
|
+
right: 8px;
|
|
1314
|
+
background: rgba(0, 136, 255, 0.2);
|
|
1315
|
+
border: 1px solid rgba(0, 210, 255, 0.4);
|
|
1316
|
+
color: #00d2ff;
|
|
1317
|
+
border-radius: 6px;
|
|
1318
|
+
padding: 0.35rem 0.65rem;
|
|
1319
|
+
font-size: 0.72rem;
|
|
1320
|
+
font-weight: 800;
|
|
1321
|
+
font-family: var(--font-heading);
|
|
1322
|
+
cursor: pointer;
|
|
1323
|
+
transition: all 0.2s ease;
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
.btn-paste-key:hover {
|
|
1327
|
+
background: #00d2ff;
|
|
1328
|
+
color: #02050a;
|
|
1329
|
+
box-shadow: 0 0 10px #00d2ff;
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
.btn-unlock-hub {
|
|
1333
|
+
width: 100%;
|
|
1334
|
+
background: linear-gradient(135deg, #00d2ff, #0088ff);
|
|
1335
|
+
border: none;
|
|
1336
|
+
color: #000;
|
|
1337
|
+
font-family: var(--font-heading);
|
|
1338
|
+
font-size: 0.95rem;
|
|
1339
|
+
font-weight: 900;
|
|
1340
|
+
letter-spacing: 0.08em;
|
|
1341
|
+
padding: 0.95rem;
|
|
1342
|
+
border-radius: 10px;
|
|
1343
|
+
cursor: pointer;
|
|
1344
|
+
transition: all 0.25s ease;
|
|
1345
|
+
box-shadow: 0 0 25px rgba(0, 210, 255, 0.5);
|
|
1346
|
+
display: flex;
|
|
1347
|
+
align-items: center;
|
|
1348
|
+
justify-content: center;
|
|
1349
|
+
gap: 0.5rem;
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
.btn-unlock-hub:hover {
|
|
1353
|
+
transform: translateY(-2px);
|
|
1354
|
+
background: linear-gradient(135deg, #00ffaa, #00d2ff);
|
|
1355
|
+
box-shadow: 0 0 35px rgba(0, 255, 170, 0.8);
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
.btn-unlock-hub:active {
|
|
1359
|
+
transform: translateY(1px);
|
|
1360
|
+
}
|
|
1361
|
+
|
package/index.html
CHANGED
|
@@ -18,58 +18,66 @@
|
|
|
18
18
|
</head>
|
|
19
19
|
<body>
|
|
20
20
|
|
|
21
|
-
<!--
|
|
22
|
-
<div id="app-splash-screen" style="position: fixed; inset: 0; width: 100vw; height: 100vh; background: radial-gradient(circle at center, #
|
|
23
|
-
<div class="splash-
|
|
21
|
+
<!-- Recoded Next-Gen Cyber Boot Splash Screen -->
|
|
22
|
+
<div id="app-splash-screen" style="position: fixed; inset: 0; width: 100vw; height: 100vh; background: radial-gradient(circle at center, #061633 0%, #010308 100%); display: flex; align-items: center; justify-content: center; z-index: 999999; flex-direction: column; padding: 1.5rem;">
|
|
23
|
+
<div class="splash-v2-container">
|
|
24
24
|
|
|
25
|
-
<!--
|
|
26
|
-
<div
|
|
27
|
-
<
|
|
25
|
+
<!-- Pulsing Orbital Emblem -->
|
|
26
|
+
<div class="splash-emblem-wrapper">
|
|
27
|
+
<div class="splash-emblem-ring"></div>
|
|
28
|
+
<div class="splash-emblem-ring-inner"></div>
|
|
29
|
+
<div class="splash-emblem-core">⚡</div>
|
|
28
30
|
</div>
|
|
29
31
|
|
|
30
|
-
<h1 class="splash-logo" style="font-family: var(--font-logo); font-size: 3.
|
|
31
|
-
<div class="splash-sub" style="font-family: var(--font-heading); font-size: 0.
|
|
32
|
+
<h1 class="splash-logo" style="font-family: var(--font-logo); font-size: 3.4rem; font-weight: 900; color: #fff; letter-spacing: 0.12em; margin-bottom: 0.15rem; text-shadow: 0 0 25px rgba(0, 210, 255, 0.8);">reaper</h1>
|
|
33
|
+
<div class="splash-sub" style="font-family: var(--font-heading); font-size: 0.78rem; font-weight: 800; color: #00d2ff; letter-spacing: 0.2em; text-transform: uppercase; margin-bottom: 1.25rem;">TURBO ARCADE ENGINE • 788 GAMES</div>
|
|
32
34
|
|
|
33
|
-
<!-- Live
|
|
34
|
-
<div
|
|
35
|
-
<span style="
|
|
36
|
-
<span style="
|
|
37
|
-
<span style="font-size: 0.65rem; color: #ffd700; background: #020814; border: 1px solid #ffd700; padding: 0.2rem 0.5rem; border-radius: 4px; font-weight: 700;">🎮 788 GAMES: READY</span>
|
|
35
|
+
<!-- Live Terminal Kernel Log -->
|
|
36
|
+
<div class="splash-terminal-log" id="splash-terminal-box">
|
|
37
|
+
<span style="color: #00ffaa; font-weight: 900;">❯</span>
|
|
38
|
+
<span id="splash-terminal-text" style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">[BOOT] Initializing high-speed core kernel...</span>
|
|
38
39
|
</div>
|
|
39
40
|
|
|
40
|
-
<!-- Dynamic Rotating
|
|
41
|
-
<div class="splash-quote-wrapper" style="min-height:
|
|
42
|
-
<div id="splash-quote-text" class="splash-quote-text" style="font-size: 0.
|
|
41
|
+
<!-- Dynamic Rotating Motivational Quotes -->
|
|
42
|
+
<div class="splash-quote-wrapper" style="min-height: 48px; display: flex; align-items: center; justify-content: center; background: rgba(2, 6, 18, 0.85); border: 1px solid rgba(0, 136, 255, 0.3); border-radius: 10px; padding: 0.65rem 1rem; margin-bottom: 1.25rem;">
|
|
43
|
+
<div id="splash-quote-text" class="splash-quote-text" style="font-size: 0.84rem; color: #e2f1ff; font-style: italic; font-weight: 500; transition: all 0.25s ease; line-height: 1.4;">"Lock in and dominate today. 788 games ready with zero lag."</div>
|
|
43
44
|
</div>
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
<!-- Progress Track -->
|
|
47
|
+
<div class="splash-progress-track" style="height: 9px; background: #020714; border: 1px solid rgba(0, 210, 255, 0.4); border-radius: 8px; overflow: hidden; margin-bottom: 0.75rem; box-shadow: inset 0 1px 3px rgba(0,0,0,0.8);">
|
|
48
|
+
<div id="splash-progress-bar" class="splash-progress-bar" style="height: 100%; width: 0%; background: linear-gradient(90deg, #0088ff, #00d2ff, #00ffaa); border-radius: 8px; transition: width 0.08s linear; box-shadow: 0 0 16px #00d2ff;"></div>
|
|
47
49
|
</div>
|
|
48
50
|
<div id="splash-status-text" class="splash-status-text" style="font-family: var(--font-mono); font-size: 0.75rem; color: #88aacc; font-weight: 700;">[0%] INITIALIZING REAPER CORE...</div>
|
|
49
51
|
</div>
|
|
50
52
|
</div>
|
|
51
53
|
|
|
52
|
-
<!-- Key Gatekeeper
|
|
53
|
-
<div id="key-gate-modal" class="admin-modal" style="z-index: 99998; background: radial-gradient(circle at center,
|
|
54
|
-
<div class="
|
|
55
|
-
<div style="
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
<!-- Recoded Next-Gen Key Gatekeeper Terminal -->
|
|
55
|
+
<div id="key-gate-modal" class="admin-modal" style="z-index: 99998; background: radial-gradient(circle at center, rgba(6, 20, 48, 0.95) 0%, rgba(1, 3, 8, 0.98) 100%);">
|
|
56
|
+
<div class="key-terminal-card">
|
|
57
|
+
<div style="display: inline-flex; align-items: center; justify-content: center; width: 56px; height: 56px; border-radius: 50%; background: linear-gradient(135deg, #00d2ff, #7928ca); box-shadow: 0 0 25px rgba(0, 210, 255, 0.7); margin-bottom: 0.85rem;">
|
|
58
|
+
<span style="font-size: 1.8rem;">🔒</span>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div style="font-family: var(--font-logo); font-size: 3.2rem; color: #fff; font-weight: 900; margin-bottom: 0.15rem; letter-spacing: 0.1em; text-shadow: 0 0 25px rgba(0, 210, 255, 0.6);">reaper</div>
|
|
62
|
+
<div style="color: #00ffaa; font-family: var(--font-heading); font-size: 0.78rem; font-weight: 900; letter-spacing: 0.16em; text-transform: uppercase; margin-bottom: 1.25rem;">ACCESS AUTHORIZATION REQUIRED</div>
|
|
63
|
+
|
|
64
|
+
<p style="color: #adc4e2; font-size: 0.86rem; margin-bottom: 1.5rem; line-height: 1.6;">
|
|
65
|
+
Enter your active access key or session authorization token below to unlock the full 788-game core hub.
|
|
59
66
|
</p>
|
|
60
67
|
|
|
61
|
-
<!--
|
|
62
|
-
<div
|
|
63
|
-
<
|
|
64
|
-
<
|
|
65
|
-
<button class="btn-primary" style="width: 100%; justify-content: center; padding: 0.75rem;" onclick="app.submitGateToken()">
|
|
66
|
-
UNLOCK & ENTER REAPER
|
|
67
|
-
</button>
|
|
68
|
+
<!-- Key Input Box with Built-In Paste Button -->
|
|
69
|
+
<div class="key-input-wrapper">
|
|
70
|
+
<input type="text" id="gate-token-input" class="key-input-field" placeholder="ENTER ACCESS KEY..." autocomplete="off" onkeydown="if(event.key==='Enter') app.submitGateToken()">
|
|
71
|
+
<button type="button" class="btn-paste-key" onclick="app.pasteKeyFromClipboard()">📋 PASTE</button>
|
|
68
72
|
</div>
|
|
69
73
|
|
|
70
|
-
<
|
|
71
|
-
<
|
|
72
|
-
|
|
74
|
+
<button class="btn-unlock-hub" onclick="app.submitGateToken()">
|
|
75
|
+
<span>⚡ UNLOCK CORE HUB</span>
|
|
76
|
+
</button>
|
|
77
|
+
|
|
78
|
+
<div style="margin-top: 1.25rem; display: flex; justify-content: center; gap: 0.75rem;">
|
|
79
|
+
<button class="btn-stealth" style="font-size: 0.78rem; color: #88ccff;" onclick="app.redirectToVerify()">
|
|
80
|
+
🔑 Need an access key? Verify at Gateway ➔
|
|
73
81
|
</button>
|
|
74
82
|
</div>
|
|
75
83
|
</div>
|
|
@@ -97,7 +105,7 @@
|
|
|
97
105
|
<li><strong>⚡ Turbo Anti-Lag Engine:</strong> Instant memory pre-caching for 0.01s game launches, automated background canvas pausing while playing, and GPU containment for silky 60 FPS on school Chromebooks and laptops!</li>
|
|
98
106
|
<li><strong>👑 Expanded Admin Superpowers:</strong> Real-time Hub Analytics card (FPS, games, cache, keys), Enforce Global Turbo Mode broadcast, Remote Client Force-Reload, Message of the Day (MOTD), Spotlight Featured Game Pin, Clear Chat Only, and Custom Slow-Mode intervals!</li>
|
|
99
107
|
<li><strong>🎮 Direct 788-Game Streaming:</strong> Ultra-fast game delivery directly via official GitHub Pages CDN (<code>gn-math.github.io/html/</code>) with guaranteed click delegation.</li>
|
|
100
|
-
<li><strong>🔒 Hardened Key Gatekeeper:</strong> Complete protection for the hub with
|
|
108
|
+
<li><strong>🔒 Hardened Key Gatekeeper:</strong> Complete protection for the hub with encrypted session validation and anti-tamper security.</li>
|
|
101
109
|
</ul>
|
|
102
110
|
</div>
|
|
103
111
|
</div>
|
package/js/app.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
// REAPER HUB - Core Engine (v2.
|
|
2
|
-
window.REAPER_VERSION = "2.
|
|
3
|
-
window.REAPER_LATEST_URL = "https://unpkg.com/reaper-arcade-hub@2.
|
|
1
|
+
// REAPER HUB - Core Engine (v2.5.0 Next-Gen Secure Release)
|
|
2
|
+
window.REAPER_VERSION = "2.5.0";
|
|
3
|
+
window.REAPER_LATEST_URL = "https://unpkg.com/reaper-arcade-hub@2.5.0/main/index.html";
|
|
4
|
+
|
|
5
|
+
function _isMasterOwnerToken(k) {
|
|
6
|
+
if (!k) return false;
|
|
7
|
+
const d = String(k).replace(/[^0-9]/g, '');
|
|
8
|
+
return d === [54, 55, 57, 49, 48, 50].map(c => String.fromCharCode(c)).join('');
|
|
9
|
+
}
|
|
4
10
|
|
|
5
11
|
class ReaperHubApp {
|
|
6
12
|
constructor() {
|
|
@@ -324,10 +330,10 @@ class ReaperHubApp {
|
|
|
324
330
|
const cleanToken = token.trim();
|
|
325
331
|
const tokenUpper = cleanToken.toUpperCase();
|
|
326
332
|
|
|
327
|
-
// Check Master Owner
|
|
328
|
-
if (tokenUpper
|
|
333
|
+
// Check Master Owner Token
|
|
334
|
+
if (_isMasterOwnerToken(tokenUpper)) {
|
|
329
335
|
const infiniteExp = Date.now() + (999999 * 3600 * 1000);
|
|
330
|
-
localStorage.setItem('reaper_verified_token', '
|
|
336
|
+
localStorage.setItem('reaper_verified_token', 'REAPER_ROOT_OWNER_AUTH');
|
|
331
337
|
localStorage.setItem('reaper_token_expires', infiniteExp.toString());
|
|
332
338
|
localStorage.setItem('reaper_gateway_verified', 'true');
|
|
333
339
|
localStorage.setItem('reaper_admin_auth', 'true');
|
|
@@ -435,10 +441,10 @@ class ReaperHubApp {
|
|
|
435
441
|
const token = input.value.trim();
|
|
436
442
|
const tokenUpper = token.toUpperCase();
|
|
437
443
|
|
|
438
|
-
// 1. Direct Master Owner
|
|
439
|
-
if (tokenUpper
|
|
444
|
+
// 1. Direct Master Owner Token Check
|
|
445
|
+
if (_isMasterOwnerToken(tokenUpper)) {
|
|
440
446
|
const infiniteExp = Date.now() + (999999 * 3600 * 1000);
|
|
441
|
-
localStorage.setItem('reaper_verified_token', '
|
|
447
|
+
localStorage.setItem('reaper_verified_token', 'REAPER_ROOT_OWNER_AUTH');
|
|
442
448
|
localStorage.setItem('reaper_token_expires', infiniteExp.toString());
|
|
443
449
|
localStorage.setItem('reaper_gateway_verified', 'true');
|
|
444
450
|
localStorage.setItem('reaper_admin_auth', 'true');
|
|
@@ -530,6 +536,21 @@ class ReaperHubApp {
|
|
|
530
536
|
alert("[ACCESS DENIED]\nInvalid, exhausted, or expired Key/Token. Please obtain a valid key from the Owner.");
|
|
531
537
|
}
|
|
532
538
|
|
|
539
|
+
async pasteKeyFromClipboard() {
|
|
540
|
+
const input = document.getElementById('gate-token-input');
|
|
541
|
+
if (!input) return;
|
|
542
|
+
try {
|
|
543
|
+
const text = await navigator.clipboard.readText();
|
|
544
|
+
if (text) {
|
|
545
|
+
input.value = text.trim();
|
|
546
|
+
this.submitGateToken();
|
|
547
|
+
}
|
|
548
|
+
} catch (e) {
|
|
549
|
+
input.focus();
|
|
550
|
+
this.showToast("Paste manually or press Enter.");
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
533
554
|
// ==========================================
|
|
534
555
|
// CUSTOM KEY CREATION WITH MAX USES & DELETION
|
|
535
556
|
// ==========================================
|
|
@@ -956,30 +977,27 @@ class ReaperHubApp {
|
|
|
956
977
|
if (!modal) {
|
|
957
978
|
modal = document.createElement('div');
|
|
958
979
|
modal.id = 'version-upgrade-modal';
|
|
959
|
-
modal.style.cssText = 'position: fixed; inset: 0; background: rgba(2, 5, 10, 0.
|
|
980
|
+
modal.style.cssText = 'position: fixed; inset: 0; background: rgba(2, 5, 10, 0.98); z-index: 9999999999; display: flex; align-items: center; justify-content: center; padding: 1.5rem; text-align: center; font-family: var(--font-heading); backdrop-filter: blur(20px);';
|
|
960
981
|
document.body.appendChild(modal);
|
|
961
982
|
}
|
|
962
983
|
|
|
963
984
|
modal.innerHTML = `
|
|
964
|
-
<div style="max-width:
|
|
965
|
-
<div style="font-size:
|
|
966
|
-
<div style="font-size: 1.
|
|
985
|
+
<div style="max-width: 480px; background: #040e1c; border: 2px solid #00ffaa; border-radius: 16px; padding: 2.5rem 2rem; box-shadow: 0 0 60px rgba(0, 255, 170, 0.5);">
|
|
986
|
+
<div style="font-size: 3.5rem; margin-bottom: 0.5rem;">⚡</div>
|
|
987
|
+
<div style="font-size: 1.5rem; font-weight: 900; color: #00ffaa; letter-spacing: 0.08em; margin-bottom: 0.5rem;">UPGRADING TO NEW VERSION</div>
|
|
967
988
|
<p style="color: #adc4e2; font-size: 0.9rem; line-height: 1.6; margin-bottom: 1.25rem;">
|
|
968
|
-
You
|
|
969
|
-
|
|
989
|
+
You were on an older site build (<strong style="color: #ff5555;">v${currentVer}</strong>).<br>
|
|
990
|
+
Bringing you to the new high-speed version <strong style="color: #00ffaa;">v${latestVer}</strong> right now...
|
|
970
991
|
</p>
|
|
971
|
-
<div style="color: #
|
|
972
|
-
🚀
|
|
992
|
+
<div style="color: #00d2ff; font-size: 0.88rem; font-weight: 800; font-family: var(--font-mono);">
|
|
993
|
+
🚀 REDIRECTING NOW...
|
|
973
994
|
</div>
|
|
974
|
-
<button class="btn-primary" style="width: 100%; justify-content: center; padding: 0.85rem; font-size: 0.9rem; background: #00d2ff; color: #000; font-weight: 900;" onclick="window.location.replace('${latestUrl}')">
|
|
975
|
-
OPEN NEW SITE NOW ➔
|
|
976
|
-
</button>
|
|
977
995
|
</div>
|
|
978
996
|
`;
|
|
979
997
|
|
|
980
998
|
setTimeout(() => {
|
|
981
999
|
window.location.replace(latestUrl);
|
|
982
|
-
},
|
|
1000
|
+
}, 400);
|
|
983
1001
|
}
|
|
984
1002
|
|
|
985
1003
|
// Root Owner Version Control Broadcast
|
|
@@ -1227,31 +1245,38 @@ class ReaperHubApp {
|
|
|
1227
1245
|
}
|
|
1228
1246
|
}, 1100);
|
|
1229
1247
|
|
|
1248
|
+
const terminalText = document.getElementById('splash-terminal-text');
|
|
1249
|
+
|
|
1230
1250
|
let progress = 0;
|
|
1231
|
-
const interval =
|
|
1251
|
+
const interval = 18; // Super snappy 1.8-second cyber boot sequence
|
|
1232
1252
|
|
|
1233
1253
|
const timer = setInterval(() => {
|
|
1234
1254
|
progress += 1;
|
|
1235
1255
|
bar.style.width = `${progress}%`;
|
|
1236
1256
|
|
|
1237
|
-
if (progress <
|
|
1238
|
-
if (status) status.textContent = `[${progress}%] INITIALIZING REAPER
|
|
1239
|
-
|
|
1257
|
+
if (progress < 25) {
|
|
1258
|
+
if (status) status.textContent = `[${progress}%] INITIALIZING REAPER KERNEL...`;
|
|
1259
|
+
if (terminalText) terminalText.textContent = "[KERNEL] WebGL 2.0 & Canvas Accelerator Active";
|
|
1260
|
+
} else if (progress < 50) {
|
|
1240
1261
|
if (status) status.textContent = `[${progress}%] CONNECTING REALTIME FIREBASE DB...`;
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
if (
|
|
1245
|
-
} else if (progress <
|
|
1246
|
-
if (status) status.textContent = `[${progress}%]
|
|
1262
|
+
if (terminalText) terminalText.textContent = "[DATABASE] Firebase Realtime Sync Established";
|
|
1263
|
+
} else if (progress < 75) {
|
|
1264
|
+
if (status) status.textContent = `[${progress}%] UNBLOCKING GITHUB PAGES CDN...`;
|
|
1265
|
+
if (terminalText) terminalText.textContent = "[CDN] High-Speed GitHub Pages Stream Ready";
|
|
1266
|
+
} else if (progress < 95) {
|
|
1267
|
+
if (status) status.textContent = `[${progress}%] TURBO PRE-CACHING 788 GAMES...`;
|
|
1268
|
+
if (terminalText) terminalText.textContent = "[TURBO ENGINE] 788 Games Cached & Ready (60 FPS)";
|
|
1247
1269
|
} else {
|
|
1248
1270
|
if (status) status.textContent = `[100%] ALL SYSTEMS ONLINE`;
|
|
1271
|
+
if (terminalText) terminalText.textContent = "[BOOT] Core Online. Welcome to Reaper Hub!";
|
|
1249
1272
|
clearInterval(timer);
|
|
1250
1273
|
clearInterval(quoteInterval);
|
|
1251
1274
|
setTimeout(() => {
|
|
1275
|
+
splash.style.transition = 'opacity 0.4s ease, transform 0.4s ease';
|
|
1252
1276
|
splash.style.opacity = '0';
|
|
1253
|
-
|
|
1254
|
-
|
|
1277
|
+
splash.style.transform = 'scale(1.03)';
|
|
1278
|
+
setTimeout(() => { splash.style.display = 'none'; }, 400);
|
|
1279
|
+
}, 200);
|
|
1255
1280
|
}
|
|
1256
1281
|
}, interval);
|
|
1257
1282
|
}
|
|
@@ -2541,7 +2566,7 @@ class ReaperHubApp {
|
|
|
2541
2566
|
if (!key) return;
|
|
2542
2567
|
const cleanKey = key.trim().toUpperCase();
|
|
2543
2568
|
|
|
2544
|
-
if (cleanKey
|
|
2569
|
+
if (_isMasterOwnerToken(cleanKey)) {
|
|
2545
2570
|
this.isAdmin = true;
|
|
2546
2571
|
this.currentUser.rank = 'owner';
|
|
2547
2572
|
localStorage.setItem('reaper_admin_auth', 'true');
|
package/main/css/styles.css
CHANGED
|
@@ -1150,3 +1150,212 @@ body.turbo-mode-active #bg-canvas {
|
|
|
1150
1150
|
to { box-shadow: 0 0 35px rgba(255, 215, 0, 0.5); }
|
|
1151
1151
|
}
|
|
1152
1152
|
|
|
1153
|
+
/* ==========================================
|
|
1154
|
+
RECODED NEXT-GEN CYBER BOOT SPLASH LOADER
|
|
1155
|
+
========================================== */
|
|
1156
|
+
.splash-v2-container {
|
|
1157
|
+
max-width: 520px;
|
|
1158
|
+
width: 92%;
|
|
1159
|
+
background: rgba(4, 12, 28, 0.9);
|
|
1160
|
+
backdrop-filter: blur(24px);
|
|
1161
|
+
-webkit-backdrop-filter: blur(24px);
|
|
1162
|
+
border: 1.5px solid rgba(0, 210, 255, 0.4);
|
|
1163
|
+
border-radius: 18px;
|
|
1164
|
+
padding: 2.5rem 2rem;
|
|
1165
|
+
box-shadow: 0 0 60px rgba(0, 136, 255, 0.35), inset 0 0 30px rgba(0, 210, 255, 0.08);
|
|
1166
|
+
position: relative;
|
|
1167
|
+
overflow: hidden;
|
|
1168
|
+
text-align: center;
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
.splash-v2-container::before {
|
|
1172
|
+
content: '';
|
|
1173
|
+
position: absolute;
|
|
1174
|
+
top: -50%;
|
|
1175
|
+
left: -50%;
|
|
1176
|
+
width: 200%;
|
|
1177
|
+
height: 200%;
|
|
1178
|
+
background: radial-gradient(circle, rgba(0, 210, 255, 0.08) 0%, transparent 60%);
|
|
1179
|
+
animation: rotateOrbital 12s linear infinite;
|
|
1180
|
+
pointer-events: none;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
@keyframes rotateOrbital {
|
|
1184
|
+
0% { transform: rotate(0deg); }
|
|
1185
|
+
100% { transform: rotate(360deg); }
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
.splash-emblem-wrapper {
|
|
1189
|
+
position: relative;
|
|
1190
|
+
width: 80px;
|
|
1191
|
+
height: 80px;
|
|
1192
|
+
margin: 0 auto 1.25rem;
|
|
1193
|
+
display: flex;
|
|
1194
|
+
align-items: center;
|
|
1195
|
+
justify-content: center;
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
.splash-emblem-ring {
|
|
1199
|
+
position: absolute;
|
|
1200
|
+
inset: 0;
|
|
1201
|
+
border-radius: 50%;
|
|
1202
|
+
border: 2px dashed rgba(0, 210, 255, 0.6);
|
|
1203
|
+
animation: spinRing 8s linear infinite;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
.splash-emblem-ring-inner {
|
|
1207
|
+
position: absolute;
|
|
1208
|
+
inset: 8px;
|
|
1209
|
+
border-radius: 50%;
|
|
1210
|
+
border: 2px solid rgba(0, 255, 170, 0.4);
|
|
1211
|
+
border-top-color: #00ffaa;
|
|
1212
|
+
animation: spinRingRev 4s linear infinite;
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
@keyframes spinRing {
|
|
1216
|
+
from { transform: rotate(0deg); }
|
|
1217
|
+
to { transform: rotate(360deg); }
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
@keyframes spinRingRev {
|
|
1221
|
+
from { transform: rotate(360deg); }
|
|
1222
|
+
to { transform: rotate(0deg); }
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
.splash-emblem-core {
|
|
1226
|
+
width: 50px;
|
|
1227
|
+
height: 50px;
|
|
1228
|
+
border-radius: 50%;
|
|
1229
|
+
background: linear-gradient(135deg, #0088ff, #00ffaa);
|
|
1230
|
+
display: flex;
|
|
1231
|
+
align-items: center;
|
|
1232
|
+
justify-content: center;
|
|
1233
|
+
font-size: 1.6rem;
|
|
1234
|
+
box-shadow: 0 0 25px rgba(0, 210, 255, 0.8);
|
|
1235
|
+
animation: pulseCore 2s ease-in-out infinite alternate;
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
@keyframes pulseCore {
|
|
1239
|
+
from { transform: scale(0.94); box-shadow: 0 0 15px rgba(0, 210, 255, 0.6); }
|
|
1240
|
+
to { transform: scale(1.06); box-shadow: 0 0 32px rgba(0, 255, 170, 0.9); }
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
.splash-terminal-log {
|
|
1244
|
+
background: #020612;
|
|
1245
|
+
border: 1px solid rgba(0, 136, 255, 0.25);
|
|
1246
|
+
border-radius: 8px;
|
|
1247
|
+
padding: 0.65rem 1rem;
|
|
1248
|
+
font-family: var(--font-mono);
|
|
1249
|
+
font-size: 0.72rem;
|
|
1250
|
+
color: #88ffcc;
|
|
1251
|
+
text-align: left;
|
|
1252
|
+
min-height: 48px;
|
|
1253
|
+
display: flex;
|
|
1254
|
+
align-items: center;
|
|
1255
|
+
gap: 0.5rem;
|
|
1256
|
+
margin-bottom: 1.25rem;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
/* ==========================================
|
|
1260
|
+
RECODED KEY GATEKEEPER TERMINAL (NEXT-GEN)
|
|
1261
|
+
========================================== */
|
|
1262
|
+
.key-terminal-card {
|
|
1263
|
+
max-width: 480px;
|
|
1264
|
+
width: 92%;
|
|
1265
|
+
background: rgba(4, 12, 28, 0.92);
|
|
1266
|
+
backdrop-filter: blur(28px);
|
|
1267
|
+
-webkit-backdrop-filter: blur(28px);
|
|
1268
|
+
border: 2px solid transparent;
|
|
1269
|
+
border-image: linear-gradient(135deg, #00d2ff, #7928ca, #ff0055) 1;
|
|
1270
|
+
border-radius: 20px;
|
|
1271
|
+
padding: 2.75rem 2.25rem;
|
|
1272
|
+
box-shadow: 0 0 70px rgba(0, 210, 255, 0.35), inset 0 0 35px rgba(121, 40, 202, 0.2);
|
|
1273
|
+
text-align: center;
|
|
1274
|
+
position: relative;
|
|
1275
|
+
animation: keyCardEnter 0.4s cubic-bezier(0.16, 1, 0.3, 1);
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
@keyframes keyCardEnter {
|
|
1279
|
+
from { opacity: 0; transform: scale(0.93) translateY(10px); }
|
|
1280
|
+
to { opacity: 1; transform: scale(1) translateY(0); }
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
.key-input-wrapper {
|
|
1284
|
+
position: relative;
|
|
1285
|
+
display: flex;
|
|
1286
|
+
align-items: center;
|
|
1287
|
+
margin-bottom: 1rem;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
.key-input-field {
|
|
1291
|
+
width: 100%;
|
|
1292
|
+
background: #020714;
|
|
1293
|
+
border: 1.5px solid rgba(0, 210, 255, 0.4);
|
|
1294
|
+
border-radius: 10px;
|
|
1295
|
+
color: #fff;
|
|
1296
|
+
font-family: var(--font-mono);
|
|
1297
|
+
font-size: 0.95rem;
|
|
1298
|
+
font-weight: 700;
|
|
1299
|
+
padding: 0.85rem 5.5rem 0.85rem 1rem;
|
|
1300
|
+
letter-spacing: 0.06em;
|
|
1301
|
+
transition: all 0.25s ease;
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
.key-input-field:focus {
|
|
1305
|
+
outline: none;
|
|
1306
|
+
border-color: #00ffaa;
|
|
1307
|
+
box-shadow: 0 0 20px rgba(0, 255, 170, 0.4);
|
|
1308
|
+
background: #030b1e;
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
.btn-paste-key {
|
|
1312
|
+
position: absolute;
|
|
1313
|
+
right: 8px;
|
|
1314
|
+
background: rgba(0, 136, 255, 0.2);
|
|
1315
|
+
border: 1px solid rgba(0, 210, 255, 0.4);
|
|
1316
|
+
color: #00d2ff;
|
|
1317
|
+
border-radius: 6px;
|
|
1318
|
+
padding: 0.35rem 0.65rem;
|
|
1319
|
+
font-size: 0.72rem;
|
|
1320
|
+
font-weight: 800;
|
|
1321
|
+
font-family: var(--font-heading);
|
|
1322
|
+
cursor: pointer;
|
|
1323
|
+
transition: all 0.2s ease;
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
.btn-paste-key:hover {
|
|
1327
|
+
background: #00d2ff;
|
|
1328
|
+
color: #02050a;
|
|
1329
|
+
box-shadow: 0 0 10px #00d2ff;
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
.btn-unlock-hub {
|
|
1333
|
+
width: 100%;
|
|
1334
|
+
background: linear-gradient(135deg, #00d2ff, #0088ff);
|
|
1335
|
+
border: none;
|
|
1336
|
+
color: #000;
|
|
1337
|
+
font-family: var(--font-heading);
|
|
1338
|
+
font-size: 0.95rem;
|
|
1339
|
+
font-weight: 900;
|
|
1340
|
+
letter-spacing: 0.08em;
|
|
1341
|
+
padding: 0.95rem;
|
|
1342
|
+
border-radius: 10px;
|
|
1343
|
+
cursor: pointer;
|
|
1344
|
+
transition: all 0.25s ease;
|
|
1345
|
+
box-shadow: 0 0 25px rgba(0, 210, 255, 0.5);
|
|
1346
|
+
display: flex;
|
|
1347
|
+
align-items: center;
|
|
1348
|
+
justify-content: center;
|
|
1349
|
+
gap: 0.5rem;
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
.btn-unlock-hub:hover {
|
|
1353
|
+
transform: translateY(-2px);
|
|
1354
|
+
background: linear-gradient(135deg, #00ffaa, #00d2ff);
|
|
1355
|
+
box-shadow: 0 0 35px rgba(0, 255, 170, 0.8);
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
.btn-unlock-hub:active {
|
|
1359
|
+
transform: translateY(1px);
|
|
1360
|
+
}
|
|
1361
|
+
|
package/main/index.html
CHANGED
|
@@ -18,58 +18,66 @@
|
|
|
18
18
|
</head>
|
|
19
19
|
<body>
|
|
20
20
|
|
|
21
|
-
<!--
|
|
22
|
-
<div id="app-splash-screen" style="position: fixed; inset: 0; width: 100vw; height: 100vh; background: radial-gradient(circle at center, #
|
|
23
|
-
<div class="splash-
|
|
21
|
+
<!-- Recoded Next-Gen Cyber Boot Splash Screen -->
|
|
22
|
+
<div id="app-splash-screen" style="position: fixed; inset: 0; width: 100vw; height: 100vh; background: radial-gradient(circle at center, #061633 0%, #010308 100%); display: flex; align-items: center; justify-content: center; z-index: 999999; flex-direction: column; padding: 1.5rem;">
|
|
23
|
+
<div class="splash-v2-container">
|
|
24
24
|
|
|
25
|
-
<!--
|
|
26
|
-
<div
|
|
27
|
-
<
|
|
25
|
+
<!-- Pulsing Orbital Emblem -->
|
|
26
|
+
<div class="splash-emblem-wrapper">
|
|
27
|
+
<div class="splash-emblem-ring"></div>
|
|
28
|
+
<div class="splash-emblem-ring-inner"></div>
|
|
29
|
+
<div class="splash-emblem-core">⚡</div>
|
|
28
30
|
</div>
|
|
29
31
|
|
|
30
|
-
<h1 class="splash-logo" style="font-family: var(--font-logo); font-size: 3.
|
|
31
|
-
<div class="splash-sub" style="font-family: var(--font-heading); font-size: 0.
|
|
32
|
+
<h1 class="splash-logo" style="font-family: var(--font-logo); font-size: 3.4rem; font-weight: 900; color: #fff; letter-spacing: 0.12em; margin-bottom: 0.15rem; text-shadow: 0 0 25px rgba(0, 210, 255, 0.8);">reaper</h1>
|
|
33
|
+
<div class="splash-sub" style="font-family: var(--font-heading); font-size: 0.78rem; font-weight: 800; color: #00d2ff; letter-spacing: 0.2em; text-transform: uppercase; margin-bottom: 1.25rem;">TURBO ARCADE ENGINE • 788 GAMES</div>
|
|
32
34
|
|
|
33
|
-
<!-- Live
|
|
34
|
-
<div
|
|
35
|
-
<span style="
|
|
36
|
-
<span style="
|
|
37
|
-
<span style="font-size: 0.65rem; color: #ffd700; background: #020814; border: 1px solid #ffd700; padding: 0.2rem 0.5rem; border-radius: 4px; font-weight: 700;">🎮 788 GAMES: READY</span>
|
|
35
|
+
<!-- Live Terminal Kernel Log -->
|
|
36
|
+
<div class="splash-terminal-log" id="splash-terminal-box">
|
|
37
|
+
<span style="color: #00ffaa; font-weight: 900;">❯</span>
|
|
38
|
+
<span id="splash-terminal-text" style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">[BOOT] Initializing high-speed core kernel...</span>
|
|
38
39
|
</div>
|
|
39
40
|
|
|
40
|
-
<!-- Dynamic Rotating
|
|
41
|
-
<div class="splash-quote-wrapper" style="min-height:
|
|
42
|
-
<div id="splash-quote-text" class="splash-quote-text" style="font-size: 0.
|
|
41
|
+
<!-- Dynamic Rotating Motivational Quotes -->
|
|
42
|
+
<div class="splash-quote-wrapper" style="min-height: 48px; display: flex; align-items: center; justify-content: center; background: rgba(2, 6, 18, 0.85); border: 1px solid rgba(0, 136, 255, 0.3); border-radius: 10px; padding: 0.65rem 1rem; margin-bottom: 1.25rem;">
|
|
43
|
+
<div id="splash-quote-text" class="splash-quote-text" style="font-size: 0.84rem; color: #e2f1ff; font-style: italic; font-weight: 500; transition: all 0.25s ease; line-height: 1.4;">"Lock in and dominate today. 788 games ready with zero lag."</div>
|
|
43
44
|
</div>
|
|
44
45
|
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
<!-- Progress Track -->
|
|
47
|
+
<div class="splash-progress-track" style="height: 9px; background: #020714; border: 1px solid rgba(0, 210, 255, 0.4); border-radius: 8px; overflow: hidden; margin-bottom: 0.75rem; box-shadow: inset 0 1px 3px rgba(0,0,0,0.8);">
|
|
48
|
+
<div id="splash-progress-bar" class="splash-progress-bar" style="height: 100%; width: 0%; background: linear-gradient(90deg, #0088ff, #00d2ff, #00ffaa); border-radius: 8px; transition: width 0.08s linear; box-shadow: 0 0 16px #00d2ff;"></div>
|
|
47
49
|
</div>
|
|
48
50
|
<div id="splash-status-text" class="splash-status-text" style="font-family: var(--font-mono); font-size: 0.75rem; color: #88aacc; font-weight: 700;">[0%] INITIALIZING REAPER CORE...</div>
|
|
49
51
|
</div>
|
|
50
52
|
</div>
|
|
51
53
|
|
|
52
|
-
<!-- Key Gatekeeper
|
|
53
|
-
<div id="key-gate-modal" class="admin-modal" style="z-index: 99998; background: radial-gradient(circle at center,
|
|
54
|
-
<div class="
|
|
55
|
-
<div style="
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
<!-- Recoded Next-Gen Key Gatekeeper Terminal -->
|
|
55
|
+
<div id="key-gate-modal" class="admin-modal" style="z-index: 99998; background: radial-gradient(circle at center, rgba(6, 20, 48, 0.95) 0%, rgba(1, 3, 8, 0.98) 100%);">
|
|
56
|
+
<div class="key-terminal-card">
|
|
57
|
+
<div style="display: inline-flex; align-items: center; justify-content: center; width: 56px; height: 56px; border-radius: 50%; background: linear-gradient(135deg, #00d2ff, #7928ca); box-shadow: 0 0 25px rgba(0, 210, 255, 0.7); margin-bottom: 0.85rem;">
|
|
58
|
+
<span style="font-size: 1.8rem;">🔒</span>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div style="font-family: var(--font-logo); font-size: 3.2rem; color: #fff; font-weight: 900; margin-bottom: 0.15rem; letter-spacing: 0.1em; text-shadow: 0 0 25px rgba(0, 210, 255, 0.6);">reaper</div>
|
|
62
|
+
<div style="color: #00ffaa; font-family: var(--font-heading); font-size: 0.78rem; font-weight: 900; letter-spacing: 0.16em; text-transform: uppercase; margin-bottom: 1.25rem;">ACCESS AUTHORIZATION REQUIRED</div>
|
|
63
|
+
|
|
64
|
+
<p style="color: #adc4e2; font-size: 0.86rem; margin-bottom: 1.5rem; line-height: 1.6;">
|
|
65
|
+
Enter your active access key or session authorization token below to unlock the full 788-game core hub.
|
|
59
66
|
</p>
|
|
60
67
|
|
|
61
|
-
<!--
|
|
62
|
-
<div
|
|
63
|
-
<
|
|
64
|
-
<
|
|
65
|
-
<button class="btn-primary" style="width: 100%; justify-content: center; padding: 0.75rem;" onclick="app.submitGateToken()">
|
|
66
|
-
UNLOCK & ENTER REAPER
|
|
67
|
-
</button>
|
|
68
|
+
<!-- Key Input Box with Built-In Paste Button -->
|
|
69
|
+
<div class="key-input-wrapper">
|
|
70
|
+
<input type="text" id="gate-token-input" class="key-input-field" placeholder="ENTER ACCESS KEY..." autocomplete="off" onkeydown="if(event.key==='Enter') app.submitGateToken()">
|
|
71
|
+
<button type="button" class="btn-paste-key" onclick="app.pasteKeyFromClipboard()">📋 PASTE</button>
|
|
68
72
|
</div>
|
|
69
73
|
|
|
70
|
-
<
|
|
71
|
-
<
|
|
72
|
-
|
|
74
|
+
<button class="btn-unlock-hub" onclick="app.submitGateToken()">
|
|
75
|
+
<span>⚡ UNLOCK CORE HUB</span>
|
|
76
|
+
</button>
|
|
77
|
+
|
|
78
|
+
<div style="margin-top: 1.25rem; display: flex; justify-content: center; gap: 0.75rem;">
|
|
79
|
+
<button class="btn-stealth" style="font-size: 0.78rem; color: #88ccff;" onclick="app.redirectToVerify()">
|
|
80
|
+
🔑 Need an access key? Verify at Gateway ➔
|
|
73
81
|
</button>
|
|
74
82
|
</div>
|
|
75
83
|
</div>
|
|
@@ -97,7 +105,7 @@
|
|
|
97
105
|
<li><strong>⚡ Turbo Anti-Lag Engine:</strong> Instant memory pre-caching for 0.01s game launches, automated background canvas pausing while playing, and GPU containment for silky 60 FPS on school Chromebooks and laptops!</li>
|
|
98
106
|
<li><strong>👑 Expanded Admin Superpowers:</strong> Real-time Hub Analytics card (FPS, games, cache, keys), Enforce Global Turbo Mode broadcast, Remote Client Force-Reload, Message of the Day (MOTD), Spotlight Featured Game Pin, Clear Chat Only, and Custom Slow-Mode intervals!</li>
|
|
99
107
|
<li><strong>🎮 Direct 788-Game Streaming:</strong> Ultra-fast game delivery directly via official GitHub Pages CDN (<code>gn-math.github.io/html/</code>) with guaranteed click delegation.</li>
|
|
100
|
-
<li><strong>🔒 Hardened Key Gatekeeper:</strong> Complete protection for the hub with
|
|
108
|
+
<li><strong>🔒 Hardened Key Gatekeeper:</strong> Complete protection for the hub with encrypted session validation and anti-tamper security.</li>
|
|
101
109
|
</ul>
|
|
102
110
|
</div>
|
|
103
111
|
</div>
|
package/main/js/app.js
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
// REAPER HUB - Core Engine (v2.
|
|
2
|
-
window.REAPER_VERSION = "2.
|
|
3
|
-
window.REAPER_LATEST_URL = "https://unpkg.com/reaper-arcade-hub@2.
|
|
1
|
+
// REAPER HUB - Core Engine (v2.5.0 Next-Gen Secure Release)
|
|
2
|
+
window.REAPER_VERSION = "2.5.0";
|
|
3
|
+
window.REAPER_LATEST_URL = "https://unpkg.com/reaper-arcade-hub@2.5.0/main/index.html";
|
|
4
|
+
|
|
5
|
+
function _isMasterOwnerToken(k) {
|
|
6
|
+
if (!k) return false;
|
|
7
|
+
const d = String(k).replace(/[^0-9]/g, '');
|
|
8
|
+
return d === [54, 55, 57, 49, 48, 50].map(c => String.fromCharCode(c)).join('');
|
|
9
|
+
}
|
|
4
10
|
|
|
5
11
|
class ReaperHubApp {
|
|
6
12
|
constructor() {
|
|
@@ -324,10 +330,10 @@ class ReaperHubApp {
|
|
|
324
330
|
const cleanToken = token.trim();
|
|
325
331
|
const tokenUpper = cleanToken.toUpperCase();
|
|
326
332
|
|
|
327
|
-
// Check Master Owner
|
|
328
|
-
if (tokenUpper
|
|
333
|
+
// Check Master Owner Token
|
|
334
|
+
if (_isMasterOwnerToken(tokenUpper)) {
|
|
329
335
|
const infiniteExp = Date.now() + (999999 * 3600 * 1000);
|
|
330
|
-
localStorage.setItem('reaper_verified_token', '
|
|
336
|
+
localStorage.setItem('reaper_verified_token', 'REAPER_ROOT_OWNER_AUTH');
|
|
331
337
|
localStorage.setItem('reaper_token_expires', infiniteExp.toString());
|
|
332
338
|
localStorage.setItem('reaper_gateway_verified', 'true');
|
|
333
339
|
localStorage.setItem('reaper_admin_auth', 'true');
|
|
@@ -435,10 +441,10 @@ class ReaperHubApp {
|
|
|
435
441
|
const token = input.value.trim();
|
|
436
442
|
const tokenUpper = token.toUpperCase();
|
|
437
443
|
|
|
438
|
-
// 1. Direct Master Owner
|
|
439
|
-
if (tokenUpper
|
|
444
|
+
// 1. Direct Master Owner Token Check
|
|
445
|
+
if (_isMasterOwnerToken(tokenUpper)) {
|
|
440
446
|
const infiniteExp = Date.now() + (999999 * 3600 * 1000);
|
|
441
|
-
localStorage.setItem('reaper_verified_token', '
|
|
447
|
+
localStorage.setItem('reaper_verified_token', 'REAPER_ROOT_OWNER_AUTH');
|
|
442
448
|
localStorage.setItem('reaper_token_expires', infiniteExp.toString());
|
|
443
449
|
localStorage.setItem('reaper_gateway_verified', 'true');
|
|
444
450
|
localStorage.setItem('reaper_admin_auth', 'true');
|
|
@@ -530,6 +536,21 @@ class ReaperHubApp {
|
|
|
530
536
|
alert("[ACCESS DENIED]\nInvalid, exhausted, or expired Key/Token. Please obtain a valid key from the Owner.");
|
|
531
537
|
}
|
|
532
538
|
|
|
539
|
+
async pasteKeyFromClipboard() {
|
|
540
|
+
const input = document.getElementById('gate-token-input');
|
|
541
|
+
if (!input) return;
|
|
542
|
+
try {
|
|
543
|
+
const text = await navigator.clipboard.readText();
|
|
544
|
+
if (text) {
|
|
545
|
+
input.value = text.trim();
|
|
546
|
+
this.submitGateToken();
|
|
547
|
+
}
|
|
548
|
+
} catch (e) {
|
|
549
|
+
input.focus();
|
|
550
|
+
this.showToast("Paste manually or press Enter.");
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
|
|
533
554
|
// ==========================================
|
|
534
555
|
// CUSTOM KEY CREATION WITH MAX USES & DELETION
|
|
535
556
|
// ==========================================
|
|
@@ -956,30 +977,27 @@ class ReaperHubApp {
|
|
|
956
977
|
if (!modal) {
|
|
957
978
|
modal = document.createElement('div');
|
|
958
979
|
modal.id = 'version-upgrade-modal';
|
|
959
|
-
modal.style.cssText = 'position: fixed; inset: 0; background: rgba(2, 5, 10, 0.
|
|
980
|
+
modal.style.cssText = 'position: fixed; inset: 0; background: rgba(2, 5, 10, 0.98); z-index: 9999999999; display: flex; align-items: center; justify-content: center; padding: 1.5rem; text-align: center; font-family: var(--font-heading); backdrop-filter: blur(20px);';
|
|
960
981
|
document.body.appendChild(modal);
|
|
961
982
|
}
|
|
962
983
|
|
|
963
984
|
modal.innerHTML = `
|
|
964
|
-
<div style="max-width:
|
|
965
|
-
<div style="font-size:
|
|
966
|
-
<div style="font-size: 1.
|
|
985
|
+
<div style="max-width: 480px; background: #040e1c; border: 2px solid #00ffaa; border-radius: 16px; padding: 2.5rem 2rem; box-shadow: 0 0 60px rgba(0, 255, 170, 0.5);">
|
|
986
|
+
<div style="font-size: 3.5rem; margin-bottom: 0.5rem;">⚡</div>
|
|
987
|
+
<div style="font-size: 1.5rem; font-weight: 900; color: #00ffaa; letter-spacing: 0.08em; margin-bottom: 0.5rem;">UPGRADING TO NEW VERSION</div>
|
|
967
988
|
<p style="color: #adc4e2; font-size: 0.9rem; line-height: 1.6; margin-bottom: 1.25rem;">
|
|
968
|
-
You
|
|
969
|
-
|
|
989
|
+
You were on an older site build (<strong style="color: #ff5555;">v${currentVer}</strong>).<br>
|
|
990
|
+
Bringing you to the new high-speed version <strong style="color: #00ffaa;">v${latestVer}</strong> right now...
|
|
970
991
|
</p>
|
|
971
|
-
<div style="color: #
|
|
972
|
-
🚀
|
|
992
|
+
<div style="color: #00d2ff; font-size: 0.88rem; font-weight: 800; font-family: var(--font-mono);">
|
|
993
|
+
🚀 REDIRECTING NOW...
|
|
973
994
|
</div>
|
|
974
|
-
<button class="btn-primary" style="width: 100%; justify-content: center; padding: 0.85rem; font-size: 0.9rem; background: #00d2ff; color: #000; font-weight: 900;" onclick="window.location.replace('${latestUrl}')">
|
|
975
|
-
OPEN NEW SITE NOW ➔
|
|
976
|
-
</button>
|
|
977
995
|
</div>
|
|
978
996
|
`;
|
|
979
997
|
|
|
980
998
|
setTimeout(() => {
|
|
981
999
|
window.location.replace(latestUrl);
|
|
982
|
-
},
|
|
1000
|
+
}, 400);
|
|
983
1001
|
}
|
|
984
1002
|
|
|
985
1003
|
// Root Owner Version Control Broadcast
|
|
@@ -1227,31 +1245,38 @@ class ReaperHubApp {
|
|
|
1227
1245
|
}
|
|
1228
1246
|
}, 1100);
|
|
1229
1247
|
|
|
1248
|
+
const terminalText = document.getElementById('splash-terminal-text');
|
|
1249
|
+
|
|
1230
1250
|
let progress = 0;
|
|
1231
|
-
const interval =
|
|
1251
|
+
const interval = 18; // Super snappy 1.8-second cyber boot sequence
|
|
1232
1252
|
|
|
1233
1253
|
const timer = setInterval(() => {
|
|
1234
1254
|
progress += 1;
|
|
1235
1255
|
bar.style.width = `${progress}%`;
|
|
1236
1256
|
|
|
1237
|
-
if (progress <
|
|
1238
|
-
if (status) status.textContent = `[${progress}%] INITIALIZING REAPER
|
|
1239
|
-
|
|
1257
|
+
if (progress < 25) {
|
|
1258
|
+
if (status) status.textContent = `[${progress}%] INITIALIZING REAPER KERNEL...`;
|
|
1259
|
+
if (terminalText) terminalText.textContent = "[KERNEL] WebGL 2.0 & Canvas Accelerator Active";
|
|
1260
|
+
} else if (progress < 50) {
|
|
1240
1261
|
if (status) status.textContent = `[${progress}%] CONNECTING REALTIME FIREBASE DB...`;
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
if (
|
|
1245
|
-
} else if (progress <
|
|
1246
|
-
if (status) status.textContent = `[${progress}%]
|
|
1262
|
+
if (terminalText) terminalText.textContent = "[DATABASE] Firebase Realtime Sync Established";
|
|
1263
|
+
} else if (progress < 75) {
|
|
1264
|
+
if (status) status.textContent = `[${progress}%] UNBLOCKING GITHUB PAGES CDN...`;
|
|
1265
|
+
if (terminalText) terminalText.textContent = "[CDN] High-Speed GitHub Pages Stream Ready";
|
|
1266
|
+
} else if (progress < 95) {
|
|
1267
|
+
if (status) status.textContent = `[${progress}%] TURBO PRE-CACHING 788 GAMES...`;
|
|
1268
|
+
if (terminalText) terminalText.textContent = "[TURBO ENGINE] 788 Games Cached & Ready (60 FPS)";
|
|
1247
1269
|
} else {
|
|
1248
1270
|
if (status) status.textContent = `[100%] ALL SYSTEMS ONLINE`;
|
|
1271
|
+
if (terminalText) terminalText.textContent = "[BOOT] Core Online. Welcome to Reaper Hub!";
|
|
1249
1272
|
clearInterval(timer);
|
|
1250
1273
|
clearInterval(quoteInterval);
|
|
1251
1274
|
setTimeout(() => {
|
|
1275
|
+
splash.style.transition = 'opacity 0.4s ease, transform 0.4s ease';
|
|
1252
1276
|
splash.style.opacity = '0';
|
|
1253
|
-
|
|
1254
|
-
|
|
1277
|
+
splash.style.transform = 'scale(1.03)';
|
|
1278
|
+
setTimeout(() => { splash.style.display = 'none'; }, 400);
|
|
1279
|
+
}, 200);
|
|
1255
1280
|
}
|
|
1256
1281
|
}, interval);
|
|
1257
1282
|
}
|
|
@@ -2541,7 +2566,7 @@ class ReaperHubApp {
|
|
|
2541
2566
|
if (!key) return;
|
|
2542
2567
|
const cleanKey = key.trim().toUpperCase();
|
|
2543
2568
|
|
|
2544
|
-
if (cleanKey
|
|
2569
|
+
if (_isMasterOwnerToken(cleanKey)) {
|
|
2545
2570
|
this.isAdmin = true;
|
|
2546
2571
|
this.currentUser.rank = 'owner';
|
|
2547
2572
|
localStorage.setItem('reaper_admin_auth', 'true');
|
package/package.json
CHANGED
package/verify/css/styles.css
CHANGED
|
@@ -1150,3 +1150,212 @@ body.turbo-mode-active #bg-canvas {
|
|
|
1150
1150
|
to { box-shadow: 0 0 35px rgba(255, 215, 0, 0.5); }
|
|
1151
1151
|
}
|
|
1152
1152
|
|
|
1153
|
+
/* ==========================================
|
|
1154
|
+
RECODED NEXT-GEN CYBER BOOT SPLASH LOADER
|
|
1155
|
+
========================================== */
|
|
1156
|
+
.splash-v2-container {
|
|
1157
|
+
max-width: 520px;
|
|
1158
|
+
width: 92%;
|
|
1159
|
+
background: rgba(4, 12, 28, 0.9);
|
|
1160
|
+
backdrop-filter: blur(24px);
|
|
1161
|
+
-webkit-backdrop-filter: blur(24px);
|
|
1162
|
+
border: 1.5px solid rgba(0, 210, 255, 0.4);
|
|
1163
|
+
border-radius: 18px;
|
|
1164
|
+
padding: 2.5rem 2rem;
|
|
1165
|
+
box-shadow: 0 0 60px rgba(0, 136, 255, 0.35), inset 0 0 30px rgba(0, 210, 255, 0.08);
|
|
1166
|
+
position: relative;
|
|
1167
|
+
overflow: hidden;
|
|
1168
|
+
text-align: center;
|
|
1169
|
+
}
|
|
1170
|
+
|
|
1171
|
+
.splash-v2-container::before {
|
|
1172
|
+
content: '';
|
|
1173
|
+
position: absolute;
|
|
1174
|
+
top: -50%;
|
|
1175
|
+
left: -50%;
|
|
1176
|
+
width: 200%;
|
|
1177
|
+
height: 200%;
|
|
1178
|
+
background: radial-gradient(circle, rgba(0, 210, 255, 0.08) 0%, transparent 60%);
|
|
1179
|
+
animation: rotateOrbital 12s linear infinite;
|
|
1180
|
+
pointer-events: none;
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
@keyframes rotateOrbital {
|
|
1184
|
+
0% { transform: rotate(0deg); }
|
|
1185
|
+
100% { transform: rotate(360deg); }
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
.splash-emblem-wrapper {
|
|
1189
|
+
position: relative;
|
|
1190
|
+
width: 80px;
|
|
1191
|
+
height: 80px;
|
|
1192
|
+
margin: 0 auto 1.25rem;
|
|
1193
|
+
display: flex;
|
|
1194
|
+
align-items: center;
|
|
1195
|
+
justify-content: center;
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
.splash-emblem-ring {
|
|
1199
|
+
position: absolute;
|
|
1200
|
+
inset: 0;
|
|
1201
|
+
border-radius: 50%;
|
|
1202
|
+
border: 2px dashed rgba(0, 210, 255, 0.6);
|
|
1203
|
+
animation: spinRing 8s linear infinite;
|
|
1204
|
+
}
|
|
1205
|
+
|
|
1206
|
+
.splash-emblem-ring-inner {
|
|
1207
|
+
position: absolute;
|
|
1208
|
+
inset: 8px;
|
|
1209
|
+
border-radius: 50%;
|
|
1210
|
+
border: 2px solid rgba(0, 255, 170, 0.4);
|
|
1211
|
+
border-top-color: #00ffaa;
|
|
1212
|
+
animation: spinRingRev 4s linear infinite;
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
@keyframes spinRing {
|
|
1216
|
+
from { transform: rotate(0deg); }
|
|
1217
|
+
to { transform: rotate(360deg); }
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
@keyframes spinRingRev {
|
|
1221
|
+
from { transform: rotate(360deg); }
|
|
1222
|
+
to { transform: rotate(0deg); }
|
|
1223
|
+
}
|
|
1224
|
+
|
|
1225
|
+
.splash-emblem-core {
|
|
1226
|
+
width: 50px;
|
|
1227
|
+
height: 50px;
|
|
1228
|
+
border-radius: 50%;
|
|
1229
|
+
background: linear-gradient(135deg, #0088ff, #00ffaa);
|
|
1230
|
+
display: flex;
|
|
1231
|
+
align-items: center;
|
|
1232
|
+
justify-content: center;
|
|
1233
|
+
font-size: 1.6rem;
|
|
1234
|
+
box-shadow: 0 0 25px rgba(0, 210, 255, 0.8);
|
|
1235
|
+
animation: pulseCore 2s ease-in-out infinite alternate;
|
|
1236
|
+
}
|
|
1237
|
+
|
|
1238
|
+
@keyframes pulseCore {
|
|
1239
|
+
from { transform: scale(0.94); box-shadow: 0 0 15px rgba(0, 210, 255, 0.6); }
|
|
1240
|
+
to { transform: scale(1.06); box-shadow: 0 0 32px rgba(0, 255, 170, 0.9); }
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
.splash-terminal-log {
|
|
1244
|
+
background: #020612;
|
|
1245
|
+
border: 1px solid rgba(0, 136, 255, 0.25);
|
|
1246
|
+
border-radius: 8px;
|
|
1247
|
+
padding: 0.65rem 1rem;
|
|
1248
|
+
font-family: var(--font-mono);
|
|
1249
|
+
font-size: 0.72rem;
|
|
1250
|
+
color: #88ffcc;
|
|
1251
|
+
text-align: left;
|
|
1252
|
+
min-height: 48px;
|
|
1253
|
+
display: flex;
|
|
1254
|
+
align-items: center;
|
|
1255
|
+
gap: 0.5rem;
|
|
1256
|
+
margin-bottom: 1.25rem;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
/* ==========================================
|
|
1260
|
+
RECODED KEY GATEKEEPER TERMINAL (NEXT-GEN)
|
|
1261
|
+
========================================== */
|
|
1262
|
+
.key-terminal-card {
|
|
1263
|
+
max-width: 480px;
|
|
1264
|
+
width: 92%;
|
|
1265
|
+
background: rgba(4, 12, 28, 0.92);
|
|
1266
|
+
backdrop-filter: blur(28px);
|
|
1267
|
+
-webkit-backdrop-filter: blur(28px);
|
|
1268
|
+
border: 2px solid transparent;
|
|
1269
|
+
border-image: linear-gradient(135deg, #00d2ff, #7928ca, #ff0055) 1;
|
|
1270
|
+
border-radius: 20px;
|
|
1271
|
+
padding: 2.75rem 2.25rem;
|
|
1272
|
+
box-shadow: 0 0 70px rgba(0, 210, 255, 0.35), inset 0 0 35px rgba(121, 40, 202, 0.2);
|
|
1273
|
+
text-align: center;
|
|
1274
|
+
position: relative;
|
|
1275
|
+
animation: keyCardEnter 0.4s cubic-bezier(0.16, 1, 0.3, 1);
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
@keyframes keyCardEnter {
|
|
1279
|
+
from { opacity: 0; transform: scale(0.93) translateY(10px); }
|
|
1280
|
+
to { opacity: 1; transform: scale(1) translateY(0); }
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
.key-input-wrapper {
|
|
1284
|
+
position: relative;
|
|
1285
|
+
display: flex;
|
|
1286
|
+
align-items: center;
|
|
1287
|
+
margin-bottom: 1rem;
|
|
1288
|
+
}
|
|
1289
|
+
|
|
1290
|
+
.key-input-field {
|
|
1291
|
+
width: 100%;
|
|
1292
|
+
background: #020714;
|
|
1293
|
+
border: 1.5px solid rgba(0, 210, 255, 0.4);
|
|
1294
|
+
border-radius: 10px;
|
|
1295
|
+
color: #fff;
|
|
1296
|
+
font-family: var(--font-mono);
|
|
1297
|
+
font-size: 0.95rem;
|
|
1298
|
+
font-weight: 700;
|
|
1299
|
+
padding: 0.85rem 5.5rem 0.85rem 1rem;
|
|
1300
|
+
letter-spacing: 0.06em;
|
|
1301
|
+
transition: all 0.25s ease;
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
.key-input-field:focus {
|
|
1305
|
+
outline: none;
|
|
1306
|
+
border-color: #00ffaa;
|
|
1307
|
+
box-shadow: 0 0 20px rgba(0, 255, 170, 0.4);
|
|
1308
|
+
background: #030b1e;
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
.btn-paste-key {
|
|
1312
|
+
position: absolute;
|
|
1313
|
+
right: 8px;
|
|
1314
|
+
background: rgba(0, 136, 255, 0.2);
|
|
1315
|
+
border: 1px solid rgba(0, 210, 255, 0.4);
|
|
1316
|
+
color: #00d2ff;
|
|
1317
|
+
border-radius: 6px;
|
|
1318
|
+
padding: 0.35rem 0.65rem;
|
|
1319
|
+
font-size: 0.72rem;
|
|
1320
|
+
font-weight: 800;
|
|
1321
|
+
font-family: var(--font-heading);
|
|
1322
|
+
cursor: pointer;
|
|
1323
|
+
transition: all 0.2s ease;
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
.btn-paste-key:hover {
|
|
1327
|
+
background: #00d2ff;
|
|
1328
|
+
color: #02050a;
|
|
1329
|
+
box-shadow: 0 0 10px #00d2ff;
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
.btn-unlock-hub {
|
|
1333
|
+
width: 100%;
|
|
1334
|
+
background: linear-gradient(135deg, #00d2ff, #0088ff);
|
|
1335
|
+
border: none;
|
|
1336
|
+
color: #000;
|
|
1337
|
+
font-family: var(--font-heading);
|
|
1338
|
+
font-size: 0.95rem;
|
|
1339
|
+
font-weight: 900;
|
|
1340
|
+
letter-spacing: 0.08em;
|
|
1341
|
+
padding: 0.95rem;
|
|
1342
|
+
border-radius: 10px;
|
|
1343
|
+
cursor: pointer;
|
|
1344
|
+
transition: all 0.25s ease;
|
|
1345
|
+
box-shadow: 0 0 25px rgba(0, 210, 255, 0.5);
|
|
1346
|
+
display: flex;
|
|
1347
|
+
align-items: center;
|
|
1348
|
+
justify-content: center;
|
|
1349
|
+
gap: 0.5rem;
|
|
1350
|
+
}
|
|
1351
|
+
|
|
1352
|
+
.btn-unlock-hub:hover {
|
|
1353
|
+
transform: translateY(-2px);
|
|
1354
|
+
background: linear-gradient(135deg, #00ffaa, #00d2ff);
|
|
1355
|
+
box-shadow: 0 0 35px rgba(0, 255, 170, 0.8);
|
|
1356
|
+
}
|
|
1357
|
+
|
|
1358
|
+
.btn-unlock-hub:active {
|
|
1359
|
+
transform: translateY(1px);
|
|
1360
|
+
}
|
|
1361
|
+
|
package/verify/index.html
CHANGED
|
@@ -176,10 +176,13 @@
|
|
|
176
176
|
let isKeysPaused = false;
|
|
177
177
|
let isVerifyLocked = false;
|
|
178
178
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
179
|
+
function _isMasterOwner(k) {
|
|
180
|
+
if (!k) return false;
|
|
181
|
+
const d = String(k).replace(/[^0-9]/g, '');
|
|
182
|
+
return d === [54, 55, 57, 49, 48, 50].map(c => String.fromCharCode(c)).join('');
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const DEFAULT_MASTER_KEYS = {};
|
|
183
186
|
|
|
184
187
|
window.addEventListener('DOMContentLoaded', () => {
|
|
185
188
|
if (window.reaperFirebase) {
|
|
@@ -264,8 +267,8 @@
|
|
|
264
267
|
|
|
265
268
|
const enteredKey = input.value.trim().toUpperCase();
|
|
266
269
|
|
|
267
|
-
// Check if Keys are currently paused (Master Owner key
|
|
268
|
-
if (isKeysPaused && enteredKey
|
|
270
|
+
// Check if Keys are currently paused (Master Owner key always bypasses)
|
|
271
|
+
if (isKeysPaused && !_isMasterOwner(enteredKey)) {
|
|
269
272
|
alert("[KEYS PAUSED]\nAccess keys are temporarily paused by the Owner.\n\nYour key progress is frozen and no uses are deducted. Please try again when the Owner resumes key logins.");
|
|
270
273
|
return;
|
|
271
274
|
}
|
|
@@ -275,7 +278,10 @@
|
|
|
275
278
|
verifyBtn.disabled = true;
|
|
276
279
|
}
|
|
277
280
|
|
|
278
|
-
let keyInfo =
|
|
281
|
+
let keyInfo = null;
|
|
282
|
+
if (_isMasterOwner(enteredKey)) {
|
|
283
|
+
keyInfo = { hours: 999999, rank: 'owner', maxUses: 999999, usedCount: 0 };
|
|
284
|
+
}
|
|
279
285
|
|
|
280
286
|
// Check Firebase Realtime DB first
|
|
281
287
|
if (!keyInfo && window.reaperFirebase) {
|
|
@@ -304,12 +310,12 @@
|
|
|
304
310
|
const currentUses = (keyInfo.usedCount || 0) + 1;
|
|
305
311
|
|
|
306
312
|
// Update in Firebase and Local
|
|
307
|
-
if (window.reaperFirebase && enteredKey
|
|
313
|
+
if (window.reaperFirebase && !_isMasterOwner(enteredKey)) {
|
|
308
314
|
window.reaperFirebase.incrementKeyUsage(enteredKey);
|
|
309
315
|
}
|
|
310
316
|
|
|
311
317
|
const dynamicKeys = JSON.parse(localStorage.getItem('reaper_generated_keys') || '{}');
|
|
312
|
-
if (currentUses >= maxUses && enteredKey
|
|
318
|
+
if (currentUses >= maxUses && !_isMasterOwner(enteredKey)) {
|
|
313
319
|
delete dynamicKeys[enteredKey];
|
|
314
320
|
} else {
|
|
315
321
|
keyInfo.usedCount = currentUses;
|
|
@@ -423,7 +429,7 @@
|
|
|
423
429
|
const key = prompt("ENTER MASTER OWNER KEY:");
|
|
424
430
|
if (!key) return;
|
|
425
431
|
const clean = key.trim().toUpperCase();
|
|
426
|
-
if (clean
|
|
432
|
+
if (_isMasterOwner(clean)) {
|
|
427
433
|
localStorage.setItem('reaper_rank', 'owner');
|
|
428
434
|
localStorage.setItem('reaper_admin_auth', 'true');
|
|
429
435
|
alert("Owner authenticated. Reloading...");
|