From 096628b25f0a662a7496a49678d9529eb41cbab6 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 6 Dec 2025 19:34:00 +0300 Subject: [PATCH] Restyle fake UI and inputs, hide scrollbars --- frontend/src/assets/neon.css | 6 + frontend/src/components/Navbar.vue | 16 +- frontend/src/views/ServiceModal.vue | 19 + .../controller/FakeAdminController.java | 2 +- .../security/FakeAdminAuthFilter.java | 2 +- .../packmate/security/FakeAdminResponder.java | 413 +++++++++++++----- 6 files changed, 331 insertions(+), 127 deletions(-) diff --git a/frontend/src/assets/neon.css b/frontend/src/assets/neon.css index b7eb159..e936b4d 100644 --- a/frontend/src/assets/neon.css +++ b/frontend/src/assets/neon.css @@ -24,6 +24,12 @@ * { box-sizing: border-box; + scrollbar-width: none; +} + +*::-webkit-scrollbar { + width: 0; + height: 0; } body { diff --git a/frontend/src/components/Navbar.vue b/frontend/src/components/Navbar.vue index e5095b7..21c9053 100644 --- a/frontend/src/components/Navbar.vue +++ b/frontend/src/components/Navbar.vue @@ -168,6 +168,7 @@ nav { overflow-x: auto; + scrollbar-width: none; } u { @@ -175,19 +176,8 @@ text-decoration-style: dotted; } - ::-webkit-scrollbar { - height: 0.2em - } - - ::-webkit-scrollbar-button { + nav::-webkit-scrollbar { width: 0; - } - - ::-webkit-scrollbar-track-piece { - background: #F1F1F1 - } - - ::-webkit-scrollbar-thumb { - background: #C1C1C1 + height: 0; } diff --git a/frontend/src/views/ServiceModal.vue b/frontend/src/views/ServiceModal.vue index a7ca813..c2ce6f0 100644 --- a/frontend/src/views/ServiceModal.vue +++ b/frontend/src/views/ServiceModal.vue @@ -134,3 +134,22 @@ }, }; + + diff --git a/src/main/java/ru/serega6531/packmate/controller/FakeAdminController.java b/src/main/java/ru/serega6531/packmate/controller/FakeAdminController.java index c4b8861..dcc2809 100644 --- a/src/main/java/ru/serega6531/packmate/controller/FakeAdminController.java +++ b/src/main/java/ru/serega6531/packmate/controller/FakeAdminController.java @@ -20,7 +20,7 @@ public class FakeAdminController { return ResponseEntity.ok(responder.funPageHtml()); } - @GetMapping(value = "/fakePackets", produces = MediaType.TEXT_HTML_VALUE) + @GetMapping(value = "/packets", produces = MediaType.TEXT_HTML_VALUE) public ResponseEntity fakePackets() { return ResponseEntity.ok(responder.fakePacketsHtml()); } diff --git a/src/main/java/ru/serega6531/packmate/security/FakeAdminAuthFilter.java b/src/main/java/ru/serega6531/packmate/security/FakeAdminAuthFilter.java index 0f1a02a..61fcd87 100644 --- a/src/main/java/ru/serega6531/packmate/security/FakeAdminAuthFilter.java +++ b/src/main/java/ru/serega6531/packmate/security/FakeAdminAuthFilter.java @@ -70,7 +70,7 @@ public class FakeAdminAuthFilter extends OncePerRequestFilter { private String resolvePath(FakeAdminMode mode) { return switch (mode) { - case FAKE_PACKETS -> "fakePackets"; + case FAKE_PACKETS -> "packets"; case FUN -> "fun"; }; } diff --git a/src/main/java/ru/serega6531/packmate/security/FakeAdminResponder.java b/src/main/java/ru/serega6531/packmate/security/FakeAdminResponder.java index 23d1021..f53d4bd 100644 --- a/src/main/java/ru/serega6531/packmate/security/FakeAdminResponder.java +++ b/src/main/java/ru/serega6531/packmate/security/FakeAdminResponder.java @@ -200,6 +200,10 @@ public class FakeAdminResponder { const textEl = document.getElementById('typed-text'); const pick = (list) => list[Math.floor(Math.random() * list.length)]; + const specialLink = { + text: 'Your special guide to get flag!', + href: 'https://youtu.be/rrw-Pv3rc0E?si=-ZQmhZVxh4HF6luD' + }; function renderImage() { const chosen = (images && images.length) ? pick(images) : ''; @@ -242,25 +246,45 @@ public class FakeAdminResponder { function typewriter() { const phrase = pick(phrases); + const isSpecial = phrase === specialLink.text; textEl.textContent = ''; + let linkEl = null; + if (isSpecial) { + linkEl = document.createElement('a'); + linkEl.href = specialLink.href; + linkEl.target = '_blank'; + linkEl.rel = 'noreferrer noopener'; + linkEl.style.color = '#aaf6ff'; + textEl.appendChild(linkEl); + } let i = 0; const typeDelay = phrase.length ? 5000 / phrase.length : 120; const typeInterval = setInterval(() => { - textEl.textContent += phrase.charAt(i); + const target = isSpecial ? linkEl : textEl; + target.textContent += phrase.charAt(i); i++; if (i >= phrase.length) { clearInterval(typeInterval); - setTimeout(() => erase(phrase), 3000); + setTimeout(() => erase(phrase, isSpecial), 3000); } }, typeDelay); } - function erase(phrase) { + function erase(phrase, isSpecial) { const eraseDelay = phrase.length ? 2000 / phrase.length : 80; const eraser = setInterval(() => { - textEl.textContent = textEl.textContent.slice(0, -1); - if (!textEl.textContent.length) { + const target = isSpecial ? textEl.querySelector('a') : textEl; + if (!target) { + clearInterval(eraser); + setTimeout(typewriter, 200); + return; + } + target.textContent = target.textContent.slice(0, -1); + if (!target.textContent.length) { + if (isSpecial) { + target.remove(); + } clearInterval(eraser); setTimeout(typewriter, 200); } @@ -284,158 +308,323 @@ public class FakeAdminResponder { - 0xb00b5 team Packmate // fake packets + 0xb00b5 PM // packets + - -
-
- -
You're stupid:)
+
+
+ +
+ +
+
+
Streams
+
mode: fake
+
+
+
+
Decoy feed only. Real capture stays sealed.
+
+
+
+
@@ -460,7 +649,7 @@ public class FakeAdminResponder { "b00b5 is not a fresh meat:(", "marcus, send your packmate credits pls", "Marcus, fuck off", - "Your special guide to get flag!" + "Your special guide to get flag!" ); }