reaper-arcade-hub 1.0.0 → 1.0.2

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 CHANGED
@@ -452,20 +452,37 @@ body {
452
452
  }
453
453
 
454
454
  .game-card {
455
- background: var(--bg-card);
456
- border: 1px solid var(--blue-border);
455
+ background: linear-gradient(145deg, rgba(8, 18, 36, 0.95) 0%, rgba(4, 10, 22, 0.98) 100%);
456
+ border: 1.5px solid var(--blue-border);
457
457
  border-radius: var(--radius-md);
458
458
  overflow: hidden;
459
459
  cursor: pointer;
460
- transition: all 0.25s ease;
460
+ transition: transform 0.15s cubic-bezier(0.2, 0, 0.2, 1), box-shadow 0.25s ease, border-color 0.25s ease;
461
461
  display: flex;
462
462
  flex-direction: column;
463
+ position: relative;
464
+ transform-style: preserve-3d;
465
+ will-change: transform;
466
+ }
467
+
468
+ .game-card::after {
469
+ content: '';
470
+ position: absolute;
471
+ inset: 0;
472
+ background: radial-gradient(circle at var(--mouse-x, 50%) var(--mouse-y, 50%), rgba(0, 210, 255, 0.25) 0%, transparent 65%);
473
+ opacity: 0;
474
+ transition: opacity 0.3s ease;
475
+ pointer-events: none;
476
+ mix-blend-mode: screen;
477
+ }
478
+
479
+ .game-card:hover::after {
480
+ opacity: 1;
463
481
  }
464
482
 
465
483
  .game-card:hover {
466
- transform: translateY(-4px);
467
484
  border-color: var(--blue-bright);
468
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.7), 0 0 20px rgba(0, 136, 255, 0.3);
485
+ box-shadow: 0 16px 36px rgba(0, 0, 0, 0.8), 0 0 25px rgba(0, 136, 255, 0.45);
469
486
  }
470
487
 
471
488
  .game-thumb-container {
@@ -971,10 +988,83 @@ body {
971
988
  border: 1px solid var(--blue-bright);
972
989
  color: #fff;
973
990
  padding: 0.65rem 1.4rem;
974
- border-radius: 25px;
975
- font-size: 0.82rem;
991
+ border-radius: 24px;
992
+ font-size: 0.85rem;
976
993
  font-weight: 700;
977
- box-shadow: 0 10px 30px rgba(0, 0, 0, 0.9), 0 0 20px var(--blue-glow);
978
- z-index: 999999;
994
+ box-shadow: 0 0 25px var(--blue-glow);
995
+ z-index: 99999;
979
996
  display: none;
997
+ animation: toastPop 0.3s ease;
998
+ }
999
+
1000
+ /* Fluid Tab Slide & Fade */
1001
+ .tab-section {
1002
+ animation: tabSlideFade 0.35s cubic-bezier(0.16, 1, 0.3, 1) forwards;
1003
+ }
1004
+
1005
+ @keyframes tabSlideFade {
1006
+ from {
1007
+ opacity: 0;
1008
+ transform: translateY(10px) scale(0.99);
1009
+ }
1010
+ to {
1011
+ opacity: 1;
1012
+ transform: translateY(0) scale(1);
1013
+ }
1014
+ }
1015
+
1016
+ /* Recently Played Carousel Grid */
1017
+ .recent-bar-container {
1018
+ width: 100%;
1019
+ max-width: 680px;
1020
+ margin-bottom: 1.5rem;
1021
+ background: rgba(4, 12, 24, 0.85);
1022
+ border: 1.5px solid var(--blue-border);
1023
+ border-radius: var(--radius-md);
1024
+ padding: 0.85rem 1.15rem;
1025
+ box-shadow: 0 0 20px rgba(0, 136, 255, 0.15);
1026
+ }
1027
+
1028
+ .recent-grid {
1029
+ display: grid;
1030
+ grid-template-columns: repeat(auto-fill, minmax(95px, 1fr));
1031
+ gap: 0.65rem;
1032
+ margin-top: 0.65rem;
1033
+ }
1034
+
1035
+ .recent-card {
1036
+ background: #020712;
1037
+ border: 1px solid var(--blue-border);
1038
+ border-radius: 6px;
1039
+ padding: 0.4rem;
1040
+ text-align: center;
1041
+ cursor: pointer;
1042
+ transition: all 0.2s cubic-bezier(0.2, 0, 0.2, 1);
1043
+ display: flex;
1044
+ flex-direction: column;
1045
+ align-items: center;
1046
+ }
1047
+
1048
+ .recent-card:hover {
1049
+ border-color: var(--blue-bright);
1050
+ transform: translateY(-3px) scale(1.04);
1051
+ box-shadow: 0 6px 18px rgba(0, 136, 255, 0.45);
1052
+ }
1053
+
1054
+ .recent-card-img {
1055
+ width: 100%;
1056
+ aspect-ratio: 16/10;
1057
+ object-fit: cover;
1058
+ border-radius: 4px;
1059
+ margin-bottom: 0.3rem;
1060
+ }
1061
+
1062
+ .recent-card-name {
1063
+ font-size: 0.68rem;
1064
+ font-weight: 700;
1065
+ color: #fff;
1066
+ white-space: nowrap;
1067
+ overflow: hidden;
1068
+ text-overflow: ellipsis;
1069
+ width: 100%;
980
1070
  }
package/index.html CHANGED
@@ -94,6 +94,11 @@
94
94
  <!-- Starfield Space Canvas -->
95
95
  <canvas id="bg-canvas"></canvas>
96
96
 
97
+ <!-- Global Live Broadcast Alert Banner -->
98
+ <div id="global-broadcast-banner" style="display: none; background: linear-gradient(90deg, #ff0055, #ff8800); color: #fff; padding: 0.55rem 1rem; text-align: center; font-weight: 800; font-size: 0.85rem; letter-spacing: 0.05em; z-index: 99990; position: sticky; top: 0; box-shadow: 0 4px 15px rgba(255, 0, 85, 0.5);">
99
+ <span id="global-broadcast-text">🚨 SYSTEM ALERT</span>
100
+ </div>
101
+
97
102
  <!-- App Header -->
98
103
  <header class="app-header">
99
104
  <div class="nav-container">
@@ -106,12 +111,19 @@
106
111
  <button class="nav-tab-btn active" data-tab="home" onclick="app.switchTab('home')">Home</button>
107
112
  <button class="nav-tab-btn" data-tab="games" onclick="app.switchTab('games')">Games (788)</button>
108
113
  <button class="nav-tab-btn" data-tab="leaderboard" onclick="app.switchTab('leaderboard')">Leaderboard</button>
109
- <button class="nav-tab-btn" data-tab="shield" style="color: #00d2ff;" onclick="app.switchTab('shield')">🛡️ Shield</button>
110
114
  <button class="nav-tab-btn" id="nav-tab-mod" style="display: none; color: #00ffaa;" data-tab="mod" onclick="app.switchTab('mod')">Mod</button>
111
115
  <button class="nav-tab-btn" id="nav-tab-admin" style="display: none; color: #ffd700;" data-tab="admin" onclick="app.switchTab('admin')">Admin</button>
112
116
  </nav>
113
117
 
114
118
  <div class="header-right">
119
+ <button class="btn-stealth" id="btn-sfx-toggle" onclick="app.toggleSoundFX()" title="Toggle Sci-Fi SFX">
120
+ 🔊 SFX
121
+ </button>
122
+
123
+ <button class="btn-stealth" onclick="if(window.reaperShield) window.reaperShield.togglePanicDisguise()" title="Emergency Panic Cloak (Hotkey: ~)">
124
+ 🚨 Panic (~)
125
+ </button>
126
+
115
127
  <button class="btn-stealth" onclick="app.openUpdateLogsModal()" title="View update logs">
116
128
  Updates
117
129
  </button>
@@ -124,6 +136,10 @@
124
136
  <span class="bind-username" id="header-username-display">Reaper</span>
125
137
  <span class="bind-rank rank-pill rank-member" id="header-rank-badge">MEMBER</span>
126
138
  </div>
139
+
140
+ <button class="btn-stealth" id="btn-settings-toggle" onclick="app.openSettingsModal()" style="border-color: var(--blue-bright); color: #00d2ff; font-weight: 800;" title="Settings & Security Shield">
141
+ ⚙️ Settings
142
+ </button>
127
143
  </div>
128
144
  </div>
129
145
  </header>
@@ -140,7 +156,16 @@
140
156
  <section id="section-home" class="tab-section">
141
157
  <div class="opium-home-container">
142
158
  <h1 class="opium-logo-title">reaper</h1>
143
- <div class="opium-subtitle">788 High-Speed Unblocked Games & Live Leaderboard</div>
159
+ <div class="opium-subtitle">788 High-Speed Unblocked Games &amp; Live Leaderboard</div>
160
+
161
+ <!-- Recently Played Bar -->
162
+ <div id="recent-games-container" class="recent-bar-container" style="display: none;">
163
+ <div style="display: flex; justify-content: space-between; align-items: center;">
164
+ <span style="font-size: 0.78rem; font-weight: 800; color: #00d2ff; letter-spacing: 0.05em; text-transform: uppercase;">⚡ RECENTLY PLAYED</span>
165
+ <button onclick="app.clearRecentlyPlayed()" class="btn-stealth" style="font-size: 0.68rem; padding: 0.2rem 0.5rem;">CLEAR</button>
166
+ </div>
167
+ <div class="recent-grid" id="recent-games-grid"></div>
168
+ </div>
144
169
 
145
170
  <!-- Pill Search Bar -->
146
171
  <div class="opium-search-wrapper">
@@ -148,14 +173,20 @@
148
173
  <input type="text" id="opium-search-input" class="opium-search-input" placeholder="Search 780+ games or topics..." autocomplete="off" onkeydown="if(event.key==='Enter') app.handleOpiumSearch()">
149
174
  </div>
150
175
 
151
- <!-- Quick Navigation Tiles -->
152
- <div style="display: flex; gap: 0.85rem; flex-wrap: wrap; justify-content: center; max-width: 580px;">
176
+ <!-- Quick Navigation Tiles & Save Manager -->
177
+ <div style="display: flex; gap: 0.85rem; flex-wrap: wrap; justify-content: center; max-width: 650px; margin-bottom: 1.25rem;">
153
178
  <button class="btn-primary" style="padding: 0.75rem 1.4rem; font-size: 0.88rem;" onclick="app.switchTab('games')">
154
179
  BROWSE 788 GAMES
155
180
  </button>
156
181
  <button class="btn-stealth" style="padding: 0.75rem 1.4rem; font-size: 0.88rem;" onclick="app.switchTab('leaderboard')">
157
182
  PLAYTIME LEADERBOARD
158
183
  </button>
184
+ <button class="btn-stealth" style="padding: 0.75rem 1.4rem; font-size: 0.88rem; color: #00ffaa; border-color: rgba(0,255,170,0.3);" onclick="app.exportSaveData()" title="Backup your game saves">
185
+ 💾 BACKUP SAVES
186
+ </button>
187
+ <button class="btn-stealth" style="padding: 0.75rem 1.4rem; font-size: 0.88rem; color: #ffd700; border-color: rgba(255,215,0,0.3);" onclick="app.importSaveData()" title="Restore game save data">
188
+ 📥 RESTORE SAVES
189
+ </button>
159
190
  </div>
160
191
  </div>
161
192
  </section>
@@ -214,62 +245,6 @@
214
245
  </div>
215
246
  </section>
216
247
 
217
- <!-- ========================================== -->
218
- <!-- TAB: BROWSER EXTENSION SHIELD & FIREWALL -->
219
- <!-- ========================================== -->
220
- <section id="section-shield" class="tab-section" style="display: none;">
221
- <div class="leaderboard-container">
222
- <div class="leaderboard-header" style="border-color: #00d2ff;">
223
- <div>
224
- <h2 style="font-size: 1.6rem; color: #00d2ff; margin-bottom: 0.25rem; font-family: var(--font-heading);">
225
- 🛡️ BROWSER EXTENSION FIREWALL &amp; SPY DEFENDER
226
- </h2>
227
- <p style="color: var(--text-sub); font-size: 0.85rem;">
228
- Live extension detection engine. Scans, cuts, and isolates all school surveillance hooks and DOM sniffers.
229
- </p>
230
- </div>
231
- <div style="text-align: right;">
232
- <button class="btn-primary" onclick="app.purgeAllExtensionHooks()" style="background: #ff0055; border-color: #ff3377; padding: 0.6rem 1.2rem; font-size: 0.82rem;">
233
- ⚡ DISABLE &amp; PURGE ALL HOOKS
234
- </button>
235
- </div>
236
- </div>
237
-
238
- <!-- Controls & Status Strip -->
239
- <div style="display: flex; justify-content: space-between; align-items: center; background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; margin-bottom: 1.5rem; flex-wrap: wrap; gap: 1rem;">
240
- <div style="display: flex; gap: 1.5rem; align-items: center;">
241
- <div>
242
- <span style="font-size: 0.72rem; color: #88aacc; text-transform: uppercase; display: block;">SHIELD STATUS</span>
243
- <strong style="color: #00ffaa; font-size: 0.95rem;">ACTIVE &amp; ENFORCING</strong>
244
- </div>
245
- <div>
246
- <span style="font-size: 0.72rem; color: #88aacc; text-transform: uppercase; display: block;">ISOLATION INTEGRITY</span>
247
- <strong style="color: #00d2ff; font-size: 0.95rem;">100% SECURE</strong>
248
- </div>
249
- </div>
250
-
251
- <div style="display: flex; gap: 1rem; align-items: center;">
252
- <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer; color: #fff; font-size: 0.82rem; font-weight: 700;">
253
- <input type="checkbox" id="auto-shield-toggle" style="width: 20px; height: 20px; accent-color: #0088ff;" onchange="app.toggleAutoShield(this.checked)" checked>
254
- AUTO-PURGE ON EVERY VISIT
255
- </label>
256
- <button class="btn-stealth" onclick="app.refreshExtensionScan()" style="padding: 0.4rem 0.85rem; font-size: 0.78rem;">
257
- 🔄 RESCAN BROWSER
258
- </button>
259
- </div>
260
- </div>
261
-
262
- <!-- Detected Extensions Matrix -->
263
- <div style="font-size: 0.82rem; color: #88aacc; font-weight: 800; margin-bottom: 0.75rem; letter-spacing: 0.05em; text-transform: uppercase;">
264
- DETECTED EXTENSIONS &amp; SPY PROBES:
265
- </div>
266
-
267
- <div id="shield-extensions-list" style="display: flex; flex-direction: column; gap: 0.6rem;">
268
- <!-- Extensions rendered dynamically -->
269
- </div>
270
- </div>
271
- </section>
272
-
273
248
  <!-- ========================================== -->
274
249
  <!-- TAB 4: CHAT MOD TAB (MOD ONLY) -->
275
250
  <!-- ========================================== -->
@@ -281,6 +256,15 @@
281
256
  <span class="rank-pill rank-mod">CHAT MOD ACCESS</span>
282
257
  </div>
283
258
 
259
+ <!-- Slow Mode Toggle for Mods -->
260
+ <div class="mod-section" style="display: flex; justify-content: space-between; align-items: center;">
261
+ <div>
262
+ <strong style="color: #fff; font-size: 0.92rem;">CHAT SLOW-MODE (5 SECONDS)</strong>
263
+ <p style="color: #88aacc; font-size: 0.78rem;">Enforces a 5-second cooldown between messages to prevent spamming.</p>
264
+ </div>
265
+ <input type="checkbox" id="mod-slowmode-toggle" style="width: 22px; height: 22px; cursor: pointer; accent-color: #00ffaa;" onchange="app.toggleSlowMode(this.checked)">
266
+ </div>
267
+
284
268
  <!-- Timeout User Box -->
285
269
  <div class="mod-section">
286
270
  <h3 style="font-size: 0.95rem; color: #fff; margin-bottom: 0.35rem;">TIMEOUT / MUTE USER</h3>
@@ -296,7 +280,7 @@
296
280
  <!-- Live Chat Logs with Quick Actions -->
297
281
  <div class="mod-section">
298
282
  <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
299
- <h3 style="font-size: 0.95rem; color: #fff;">LIVE CHAT LOGS & MESSAGE PURGE</h3>
283
+ <h3 style="font-size: 0.95rem; color: #fff;">LIVE CHAT LOGS &amp; MESSAGE PURGE</h3>
300
284
  </div>
301
285
  <p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.75rem;">Click DEL to remove rulebreaking messages or TIMEOUT to mute the user.</p>
302
286
  <div id="mod-chat-logs" style="max-height: 280px; overflow-y: auto; background: #040912; border: 1px solid var(--blue-border); border-radius: 4px;"></div>
@@ -318,26 +302,47 @@
318
302
  </div>
319
303
  </div>
320
304
 
321
- <!-- User Roles & Directory (Promote / Demote) -->
305
+ <!-- Superpower: Global Live Broadcast Alert -->
306
+ <div class="admin-section" style="border-color: #ff0055; background: #18030c;">
307
+ <h3 style="font-size: 0.95rem; color: #ff3377; margin-bottom: 0.4rem;">👑 GLOBAL LIVE BROADCAST BANNER</h3>
308
+ <p style="color: #ff99bb; font-size: 0.8rem; margin-bottom: 0.75rem;">Display an instant sticky banner across all players' screens in real time.</p>
309
+ <div style="display: flex; gap: 0.5rem; flex-wrap: wrap;">
310
+ <input type="text" id="admin-broadcast-msg" class="red-chat-input" placeholder="Type global announcement message..." autocomplete="off" style="flex: 1; min-width: 250px;">
311
+ <button class="btn-primary" style="background: #ff0055; border-color: #ff3377;" onclick="app.sendGlobalAlert()">BROADCAST TO ALL PLAYERS</button>
312
+ <button class="btn-stealth" onclick="app.clearGlobalAlert()" style="color: #ff8888;">CLEAR BANNER</button>
313
+ </div>
314
+ </div>
315
+
316
+ <!-- Superpower: Chat Slow-Mode Switch -->
317
+ <div class="admin-section" style="display: flex; justify-content: space-between; align-items: center;">
318
+ <div>
319
+ <strong style="color: #fff; font-size: 0.95rem;">CHAT SLOW-MODE (5-SECOND COOLDOWN)</strong>
320
+ <p style="color: #88aacc; font-size: 0.8rem;">Enforces a 5-second interval between chat messages for non-owner players.</p>
321
+ </div>
322
+ <input type="checkbox" id="admin-slowmode-toggle" style="width: 22px; height: 22px; cursor: pointer; accent-color: #00d2ff;" onchange="app.toggleSlowMode(this.checked)">
323
+ </div>
324
+
325
+ <!-- Connected Players Directory (With Promote/Demote/Kick/Ban) -->
322
326
  <div class="admin-section">
323
- <h3 style="font-size: 0.95rem; color: #fff; margin-bottom: 0.35rem;">USER ROLES & PROMOTION</h3>
324
- <p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.85rem;">Promote members to Chat Mod, de-rank mods back to Member, or ban offenders.</p>
325
- <div id="admin-users-directory" style="display: flex; flex-direction: column; gap: 0.4rem; max-height: 220px; overflow-y: auto;">
326
- <!-- Users rendered dynamically -->
327
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
328
+ <h3 style="font-size: 0.95rem; color: #fff;">LIVE PLAYERS DIRECTORY &amp; ROLES</h3>
329
+ <button onclick="app.renderAdminUsersDirectory()" class="btn-stealth" style="font-size: 0.75rem;">REFRESH LIST</button>
327
330
  </div>
331
+ <p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.65rem;">Manage connected users, promote to Chat Mod, de-rank, kick, or permanently ban.</p>
332
+ <div id="admin-users-directory" style="max-height: 200px; overflow-y: auto; display: flex; flex-direction: column; gap: 0.4rem;"></div>
328
333
  </div>
329
334
 
330
- <!-- Key Generator (Duration, Max Uses, & Auto-Expiration) -->
335
+ <!-- Custom Access Key Generator -->
331
336
  <div class="admin-section">
332
337
  <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;">
333
- <h3 style="font-size: 0.95rem; color: #fff;">KEY GENERATOR & USAGE CONTROLS</h3>
334
- <button onclick="app.clearAllKeys()" class="btn-stealth" style="color: #ff5555; border-color: #771111; font-size: 0.72rem;">CLEAR ALL KEYS</button>
338
+ <h3 style="font-size: 0.95rem; color: #fff;">CUSTOM ACCESS KEY GENERATOR</h3>
339
+ <button onclick="app.clearAllKeys()" class="btn-stealth" style="color: #ff5555; border-color: #771111; font-size: 0.75rem;">PURGE ALL KEYS</button>
335
340
  </div>
336
- <p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.85rem;">Set key name, duration, and max uses. Keys auto-expire once all uses are exhausted.</p>
341
+ <p style="color: #88aacc; font-size: 0.8rem; margin-bottom: 0.65rem;">Generate keys with custom durations (e.g. 3 Days, 5 Days, Lifetime) and usage limits.</p>
337
342
 
338
343
  <!-- Custom Key Creation Input -->
339
344
  <div style="display: flex; gap: 0.5rem; margin-bottom: 0.85rem; flex-wrap: wrap; align-items: center;">
340
- <input type="text" id="admin-custom-key-input" class="red-chat-input" placeholder="Blank for REAPER-$$$ (or type name)" autocomplete="off" style="max-width: 250px;">
345
+ <input type="text" id="admin-custom-key-input" class="red-chat-input" placeholder="Blank for REAPER-$$$ (or custom name)" autocomplete="off" style="max-width: 250px;">
341
346
 
342
347
  <select id="admin-custom-key-rank" style="background: #040912; color: #fff; border: 1px solid var(--blue-border); border-radius: 6px; padding: 0.45rem 0.65rem; font-size: 0.8rem; font-weight: 700;">
343
348
  <option value="member">Rank: Member</option>
@@ -366,7 +371,7 @@
366
371
  <button class="btn-primary" style="padding: 0.5rem 1.15rem;" onclick="app.createCustomKey()">GENERATE KEY</button>
367
372
  </div>
368
373
 
369
- <div style="font-size: 0.78rem; color: #88aacc; margin-bottom: 0.3rem;">ACTIVE KEYS & REMAINING USES:</div>
374
+ <div style="font-size: 0.78rem; color: #88aacc; margin-bottom: 0.3rem;">ACTIVE KEYS &amp; REMAINING USES:</div>
370
375
  <div id="admin-keys-list" style="max-height: 180px; overflow-y: auto;"></div>
371
376
  </div>
372
377
 
@@ -408,7 +413,7 @@
408
413
  <div style="display: flex; justify-content: space-between; align-items: center;">
409
414
  <div>
410
415
  <strong style="color: #ffbb33; font-size: 0.95rem;">PAUSE / FREEZE ALL ACCESS KEYS</strong>
411
- <p style="color: #ffe099; font-size: 0.8rem;">When paused, no new key logins can occur on the gateway. Key durations & remaining uses are frozen and preserved.</p>
416
+ <p style="color: #ffe099; font-size: 0.8rem;">When paused, no new key logins can occur on the gateway. Key durations &amp; remaining uses are frozen and preserved.</p>
412
417
  </div>
413
418
  <input type="checkbox" id="admin-keys-locked-toggle" style="width: 24px; height: 24px; cursor: pointer; accent-color: #ffaa00;" onchange="app.toggleKeysLocked(this.checked)">
414
419
  </div>
@@ -534,6 +539,184 @@
534
539
  </div>
535
540
  </div>
536
541
 
542
+ <!-- Emergency Google Classroom Panic Disguise Overlay -->
543
+ <div id="panic-disguise-overlay" style="position: fixed; inset: 0; width: 100vw; height: 100vh; background: #f8f9fa; color: #3c4043; font-family: 'Roboto', -apple-system, BlinkMacSystemFont, Arial, sans-serif; z-index: 999999; display: none; overflow-y: auto;">
544
+ <!-- Classroom Top Bar -->
545
+ <div style="height: 64px; background: #ffffff; border-bottom: 1px solid #dadce0; display: flex; align-items: center; justify-content: space-between; padding: 0 1.5rem;">
546
+ <div style="display: flex; align-items: center; gap: 1rem;">
547
+ <span style="font-size: 1.5rem; cursor: pointer; color: #5f6368;">☰</span>
548
+ <div style="display: flex; align-items: center; gap: 0.5rem;">
549
+ <img src="https://ssl.gstatic.com/classroom/favicon.png" width="24" height="24" alt="Google Classroom">
550
+ <span style="font-size: 1.25rem; font-weight: 500; color: #3c4043;">Google Classroom</span>
551
+ </div>
552
+ </div>
553
+ <div style="display: flex; align-items: center; gap: 1rem;">
554
+ <span style="font-size: 0.85rem; color: #5f6368;">Period 4 • Mathematics</span>
555
+ <button onclick="if(window.reaperShield) window.reaperShield.togglePanicDisguise()" style="background: #e8f0fe; border: 1px solid #d2e3fc; color: #1a73e8; border-radius: 4px; padding: 0.35rem 0.75rem; font-size: 0.75rem; font-weight: 600; cursor: pointer;">Exit Disguise (Press ~)</button>
556
+ <div style="width: 32px; height: 32px; border-radius: 50%; background: #1a73e8; color: #fff; display: flex; align-items: center; justify-content: center; font-weight: 600;">S</div>
557
+ </div>
558
+ </div>
559
+
560
+ <!-- Classroom Stream -->
561
+ <div style="max-width: 1000px; margin: 2rem auto; padding: 0 1.5rem;">
562
+ <div style="height: 180px; background: linear-gradient(135deg, #1e8e3e, #137333); border-radius: 8px; padding: 1.5rem; color: #fff; display: flex; flex-direction: column; justify-content: flex-end; margin-bottom: 1.5rem; box-shadow: 0 1px 3px rgba(0,0,0,0.12);">
563
+ <h1 style="font-size: 1.8rem; margin: 0;">AP Calculus &amp; Analytical Geometry</h1>
564
+ <p style="margin: 0.25rem 0 0 0; opacity: 0.9; font-size: 0.95rem;">Instructor: Dr. Harrison • Room 302</p>
565
+ </div>
566
+
567
+ <div style="display: grid; grid-template-columns: 240px 1fr; gap: 1.5rem;">
568
+ <div style="background: #fff; border: 1px solid #dadce0; border-radius: 8px; padding: 1rem; height: fit-content;">
569
+ <h3 style="font-size: 0.95rem; margin-bottom: 0.75rem;">Upcoming</h3>
570
+ <p style="font-size: 0.85rem; color: #5f6368; margin-bottom: 0.5rem;">Due Friday, 11:59 PM</p>
571
+ <a href="#" style="color: #1a73e8; font-size: 0.88rem; text-decoration: none;">Unit 4 Practice: Derivative Applications</a>
572
+ </div>
573
+
574
+ <div style="display: flex; flex-direction: column; gap: 1rem;">
575
+ <div style="background: #fff; border: 1px solid #dadce0; border-radius: 8px; padding: 1.25rem;">
576
+ <div style="display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem;">
577
+ <div style="width: 36px; height: 36px; border-radius: 50%; background: #137333; color: #fff; display: flex; align-items: center; justify-content: center; font-weight: bold;">H</div>
578
+ <div>
579
+ <strong style="font-size: 0.9rem;">Dr. Harrison</strong>
580
+ <div style="font-size: 0.75rem; color: #5f6368;">Posted Yesterday at 8:45 AM</div>
581
+ </div>
582
+ </div>
583
+ <p style="font-size: 0.88rem; line-height: 1.5; color: #3c4043;">Please review Section 4.2 in the digital textbook before tomorrow's lecture. Completed problem sets 1-15 will be collected at the start of class.</p>
584
+ </div>
585
+ </div>
586
+ </div>
587
+ </div>
588
+ </div>
589
+
590
+ <!-- Settings & Security Suite Modal -->
591
+ <div id="settings-modal" style="position: fixed; inset: 0; background: rgba(0, 4, 10, 0.85); backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); z-index: 99995; display: none; align-items: center; justify-content: center; padding: 1.5rem;">
592
+ <div style="background: linear-gradient(145deg, #061124 0%, #030814 100%); border: 1.5px solid var(--blue-border); border-radius: 14px; width: 100%; max-width: 850px; max-height: 90vh; display: flex; flex-direction: column; overflow: hidden; box-shadow: 0 0 45px rgba(0, 136, 255, 0.35);">
593
+
594
+ <!-- Settings Header -->
595
+ <div style="padding: 1rem 1.4rem; border-bottom: 1px solid var(--blue-border); display: flex; justify-content: space-between; align-items: center; background: #020712;">
596
+ <div style="display: flex; align-items: center; gap: 0.6rem;">
597
+ <span style="font-size: 1.2rem;">⚙️</span>
598
+ <span style="font-family: var(--font-heading); font-weight: 800; font-size: 1.1rem; color: #fff;">SETTINGS &amp; SECURITY SUITE</span>
599
+ </div>
600
+ <button onclick="app.closeSettingsModal()" class="btn-stealth" style="padding: 0.3rem 0.65rem; font-size: 0.9rem; font-weight: bold;">✕</button>
601
+ </div>
602
+
603
+ <!-- Settings Sub-Tabs -->
604
+ <div style="display: flex; border-bottom: 1px solid var(--blue-border); background: #030a18; padding: 0.5rem 1.4rem; gap: 0.5rem; overflow-x: auto;">
605
+ <button class="nav-tab-btn active" id="st-tab-btn-shield" onclick="app.switchSettingsTab('shield')" style="padding: 0.45rem 1rem; font-size: 0.82rem;">🛡️ Security Shield</button>
606
+ <button class="nav-tab-btn" id="st-tab-btn-prefs" onclick="app.switchSettingsTab('prefs')" style="padding: 0.45rem 1rem; font-size: 0.82rem;">⚡ Preferences &amp; Audio</button>
607
+ <button class="nav-tab-btn" id="st-tab-btn-saves" onclick="app.switchSettingsTab('saves')" style="padding: 0.45rem 1rem; font-size: 0.82rem;">💾 Game Saves</button>
608
+ <button class="nav-tab-btn" id="st-tab-btn-identity" onclick="app.switchSettingsTab('identity')" style="padding: 0.45rem 1rem; font-size: 0.82rem;">🔑 Device &amp; Rank</button>
609
+ </div>
610
+
611
+ <!-- Settings Content Body -->
612
+ <div style="padding: 1.4rem; overflow-y: auto; flex: 1;">
613
+
614
+ <!-- SUBTAB 1: SECURITY SHIELD -->
615
+ <div id="st-content-shield">
616
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 1.25rem; flex-wrap: wrap; gap: 1rem;">
617
+ <div>
618
+ <h3 style="font-size: 1.15rem; color: #00d2ff; font-family: var(--font-heading); margin-bottom: 0.2rem;">
619
+ 🛡️ BROWSER EXTENSION FIREWALL &amp; SPY DEFENDER
620
+ </h3>
621
+ <p style="color: var(--text-sub); font-size: 0.82rem;">
622
+ Scans, isolates, and terminates school surveillance hooks, screen snipers, and keyloggers.
623
+ </p>
624
+ </div>
625
+ <button class="btn-primary" onclick="app.purgeAllExtensionHooks()" style="background: #ff0055; border-color: #ff3377; padding: 0.6rem 1.2rem; font-size: 0.82rem;">
626
+ ⚡ DISABLE &amp; PURGE ALL HOOKS
627
+ </button>
628
+ </div>
629
+
630
+ <div style="display: flex; justify-content: space-between; align-items: center; background: #040e1e; border: 1px solid var(--blue-border); padding: 0.85rem 1.15rem; border-radius: 8px; margin-bottom: 1.25rem; flex-wrap: wrap; gap: 1rem;">
631
+ <div style="display: flex; gap: 1.5rem; align-items: center;">
632
+ <div>
633
+ <span style="font-size: 0.7rem; color: #88aacc; text-transform: uppercase; display: block;">SHIELD STATUS</span>
634
+ <strong style="color: #00ffaa; font-size: 0.92rem;">ACTIVE &amp; ENFORCING</strong>
635
+ </div>
636
+ <div>
637
+ <span style="font-size: 0.7rem; color: #88aacc; text-transform: uppercase; display: block;">ISOLATION INTEGRITY</span>
638
+ <strong style="color: #00d2ff; font-size: 0.92rem;">100% SECURE</strong>
639
+ </div>
640
+ </div>
641
+
642
+ <div style="display: flex; gap: 1rem; align-items: center;">
643
+ <label style="display: flex; align-items: center; gap: 0.5rem; cursor: pointer; color: #fff; font-size: 0.8rem; font-weight: 700;">
644
+ <input type="checkbox" id="auto-shield-toggle" style="width: 18px; height: 18px; accent-color: #0088ff;" onchange="app.toggleAutoShield(this.checked)" checked>
645
+ AUTO-PURGE ON VISIT
646
+ </label>
647
+ <button class="btn-stealth" onclick="app.refreshExtensionScan()" style="padding: 0.35rem 0.75rem; font-size: 0.75rem;">
648
+ 🔄 RESCAN BROWSER
649
+ </button>
650
+ </div>
651
+ </div>
652
+
653
+ <div style="font-size: 0.78rem; color: #88aacc; font-weight: 800; margin-bottom: 0.6rem; letter-spacing: 0.05em; text-transform: uppercase;">
654
+ DETECTED EXTENSIONS &amp; SPY PROBES:
655
+ </div>
656
+ <div id="shield-extensions-list" style="display: flex; flex-direction: column; gap: 0.55rem;"></div>
657
+ </div>
658
+
659
+ <!-- SUBTAB 2: PREFERENCES & AUDIO -->
660
+ <div id="st-content-prefs" style="display: none;">
661
+ <div style="display: flex; flex-direction: column; gap: 1.2rem;">
662
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px; display: flex; justify-content: space-between; align-items: center;">
663
+ <div>
664
+ <strong style="color: #fff; font-size: 0.95rem;">🔊 Sci-Fi Synthesizer Sound FX</strong>
665
+ <p style="color: #88aacc; font-size: 0.8rem;">Play high-tech audio blips on card hover, tab clicks, and game launch.</p>
666
+ </div>
667
+ <button class="btn-primary" onclick="app.toggleSoundFX()" style="font-size: 0.82rem; padding: 0.5rem 1.2rem;">TOGGLE SFX</button>
668
+ </div>
669
+
670
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px;">
671
+ <strong style="color: #00d2ff; font-size: 0.95rem;">🚨 Emergency Panic Cloak Hotkey</strong>
672
+ <p style="color: #88aacc; font-size: 0.8rem; margin-top: 0.35rem; line-height: 1.4;">
673
+ Press the <kbd style="background: #000; border: 1px solid var(--blue-bright); color: #00d2ff; padding: 0.15rem 0.45rem; border-radius: 4px; font-weight: bold;">~</kbd> (Tilde / Backquote) key at any moment to instantly disguise the site as <strong>Google Classroom</strong> with authentic assignments. Press <kbd style="background: #000; border: 1px solid var(--blue-bright); color: #00d2ff; padding: 0.15rem 0.45rem; border-radius: 4px; font-weight: bold;">~</kbd> again to exit disguise.
674
+ </p>
675
+ </div>
676
+ </div>
677
+ </div>
678
+
679
+ <!-- SUBTAB 3: GAME SAVES -->
680
+ <div id="st-content-saves" style="display: none;">
681
+ <div style="display: flex; flex-direction: column; gap: 1.2rem;">
682
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px;">
683
+ <strong style="color: #00ffaa; font-size: 0.95rem;">💾 Export &amp; Backup Game Save Data</strong>
684
+ <p style="color: #88aacc; font-size: 0.8rem; margin: 0.4rem 0 0.85rem 0;">Download a single backup file containing all your local progress for Slope, Subway Surfers, BitLife, Retro Bowl, 1v1.LOL, and more.</p>
685
+ <button class="btn-primary" onclick="app.exportSaveData()" style="background: #00ffaa; color: #000; border-color: #00ffaa; font-size: 0.82rem;">💾 DOWNLOAD SAVE BACKUP</button>
686
+ </div>
687
+
688
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px;">
689
+ <strong style="color: #ffd700; font-size: 0.95rem;">📥 Import &amp; Restore Game Save Data</strong>
690
+ <p style="color: #88aacc; font-size: 0.8rem; margin: 0.4rem 0 0.85rem 0;">Upload a previously downloaded JSON save backup file to restore all your game saves instantly.</p>
691
+ <button class="btn-primary" onclick="app.importSaveData()" style="background: #ffd700; color: #000; border-color: #ffd700; font-size: 0.82rem;">📥 RESTORE SAVE BACKUP</button>
692
+ </div>
693
+ </div>
694
+ </div>
695
+
696
+ <!-- SUBTAB 4: IDENTITY & HWID -->
697
+ <div id="st-content-identity" style="display: none;">
698
+ <div style="display: flex; flex-direction: column; gap: 1rem;">
699
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px;">
700
+ <div style="font-size: 0.72rem; color: #88aacc; text-transform: uppercase; margin-bottom: 0.25rem;">CURRENT USERNAME</div>
701
+ <div id="st-display-username" style="font-size: 1.1rem; font-weight: 800; color: #fff;">-</div>
702
+ </div>
703
+
704
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px;">
705
+ <div style="font-size: 0.72rem; color: #88aacc; text-transform: uppercase; margin-bottom: 0.25rem;">SECURITY ROLE / RANK</div>
706
+ <div id="st-display-rank" style="font-size: 1rem; font-weight: 800; color: #00d2ff;">MEMBER</div>
707
+ </div>
708
+
709
+ <div style="background: #040e1e; border: 1px solid var(--blue-border); padding: 1rem 1.25rem; border-radius: 8px;">
710
+ <div style="font-size: 0.72rem; color: #88aacc; text-transform: uppercase; margin-bottom: 0.25rem;">DEVICE HARDWARE ID (HWID HASH)</div>
711
+ <div id="st-display-hwid" style="font-family: var(--font-mono); font-size: 0.85rem; color: #88aacc;">-</div>
712
+ </div>
713
+ </div>
714
+ </div>
715
+
716
+ </div>
717
+ </div>
718
+ </div>
719
+
537
720
  <!-- Toast -->
538
721
  <div id="toast-box" class="toast-box"></div>
539
722