Add files via upload

This commit is contained in:
xVRVx
2025-12-18 09:56:22 +03:00
committed by GitHub
parent 1cf8e7fe51
commit 96cf55241a
2 changed files with 161 additions and 133 deletions

View File

@@ -94,7 +94,7 @@ mkdir -p "$WEB_PATH"
# Генерируем сайт маскировку
bash -c "$(curl -L https://github.com/xVRVx/autoXRAY/raw/refs/heads/main/test/gen_page2.sh)" -- $WEB_PATH
bash -c "$(curl -L https://github.com/xVRVx/autoXRAY/raw/refs/heads/main/test/gen_page.sh)" -- $WEB_PATH
# Установка Xray
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install
@@ -789,7 +789,7 @@ cat > "$WEB_PATH/$path_subpage.html" <<EOF
const text = document.getElementById(elementId).innerText;
navigator.clipboard.writeText(text).then(() => {
const originalText = btnElement.innerText;
btnElement.innerText = "Скопировано!";
btnElement.innerText = "Copied!";
btnElement.style.background = "#c3e88d";
btnElement.style.color = "#121212";
setTimeout(() => {
@@ -839,15 +839,14 @@ cat > "$WEB_PATH/$path_subpage.html" <<EOF
</head>
<body>
<h2>📂 Ссылка на подписку</h2>
<div class="config-row">
<h2>📂 Ссылка на подписку (готовый конфиг клиента с роутингом)</h2><div class="config-row">
<div class="config-code" id="subLink">$subPageLink</div>
<button class="btn-action copy-btn" onclick="copyText('subLink', this)">Копировать</button>
<button class="btn-action copy-btn" onclick="copyText('subLink', this)">Copy</button>
<button class="btn-action qr-btn" onclick="showQR('subLink')">QR</button>
</div>
<h3>📱 Приложение HAPP (Windows/Android/iOS)</h3>
<p>Маршрутизация выключена по умолчанию.</p>
<h3>📱 Приложение HAPP (Windows/Android/iOS/MAC/Linux)</h3>
<p>Маршрутизацию нужно выключить, она тут встроенная. По умолчанию она выключена - включатся, если вы пользовались сторонними сервисами.</p>
<div class="btn-group">
<a href="happ://add/$subPageLink" class="btn">⚡ Добавить в HAPP</a>
<a href="https://www.happ.su/main/ru" target="_blank" class="btn download">⬇️ Скачать HAPP</a>
@@ -856,35 +855,35 @@ cat > "$WEB_PATH/$path_subpage.html" <<EOF
<h3>➡️ VLESS RAW Reality xtls-rprx-vision</h3>
<div class="config-row">
<div class="config-code" id="c1">$link1</div>
<button class="btn-action copy-btn" onclick="copyText('c1', this)">Копировать</button>
<button class="btn-action copy-btn" onclick="copyText('c1', this)">Copy</button>
<button class="btn-action qr-btn" onclick="showQR('c1')">QR</button>
</div>
<h3>➡️ VLESS XHTTP Reality EXTRA - для роутера</h3>
<div class="config-row">
<div class="config-code" id="c2">$link2</div>
<button class="btn-action copy-btn" onclick="copyText('c2', this)">Копировать</button>
<button class="btn-action copy-btn" onclick="copyText('c2', this)">Copy</button>
<button class="btn-action qr-btn" onclick="showQR('c2')">QR</button>
</div>
<h3>➡️ VLESS RAW Reality noMUX</h3>
<div class="config-row">
<div class="config-code" id="c3">$link3</div>
<button class="btn-action copy-btn" onclick="copyText('c3', this)">Копировать</button>
<button class="btn-action copy-btn" onclick="copyText('c3', this)">Copy</button>
<button class="btn-action qr-btn" onclick="showQR('c3')">QR</button>
</div>
<h3>➡️ Shadowsocks2022blake3</h3>
<div class="config-row">
<div class="config-code" id="c4">$linkSS</div>
<button class="btn-action copy-btn" onclick="copyText('c4', this)">Копировать</button>
<button class="btn-action copy-btn" onclick="copyText('c4', this)">Copy</button>
<button class="btn-action qr-btn" onclick="showQR('c4')">QR</button>
</div>
<h3>➡️ Socks5 proxy (используйте для ТГ)</h3>
<div class="config-row">
<div class="config-code" id="sockCreds">server=$DOMAIN port=10443 user=${socksUser} pass=${socksPasw}</div>
<button class="btn-action copy-btn" onclick="copyText('sockCreds', this)">Копировать</button>
<button class="btn-action copy-btn" onclick="copyText('sockCreds', this)">Copy</button>
</div>
<div class="btn-group">
@@ -894,7 +893,7 @@ cat > "$WEB_PATH/$path_subpage.html" <<EOF
<h2>💠 Все конфиги вместе</h2>
<div class="config-row">
<div class="config-code" id="cAll">$link1<br>$link2<br>$link3<br>$linkSS</div>
<button class="btn-action copy-btn" onclick="copyText('cAll', this)">Копировать</button>
<button class="btn-action copy-btn" onclick="copyText('cAll', this)">Copy</button>
<button class="btn-action qr-btn" onclick="showQR('cAll')">QR</button>
</div>

View File

@@ -3,18 +3,14 @@
TARGET_DIR=$1
if [ -z "$TARGET_DIR" ]; then
echo "❌ Ошибка: домен не задан."
echo "Err: Target directory required."
exit 1
fi
echo "🎨 Запуск генератора дизайна с анимациями..."
# --- 1. МАССИВЫ ДАННЫХ ---
TITLES=("FileShare" "CloudBox" "DataVault" "SecureShare" "EasyFiles" "QuickAccess" "VaultZone" "SkyDrive" "SafeData" "FlexShare" "DropZone" "SecureStorage" "FastFiles" "SharePoint" "MegaVault" "Boxify" "DataBank" "DriveSecure" "FileStream" "AccessHub")
HEADERS=("Welcome to FileShare" "Login to Your CloudBox" "Enter Your Secure Vault" "Access Your DataVault" "Sign in to EasyFiles" "Connect to QuickAccess" "Welcome to VaultZone" "Login to SkyDrive" "Enter Your SafeData" "Sign in to FlexShare" "Access Your DropZone" "Welcome to SecureStorage" "Login to FastFiles" "Enter Your SharePoint" "Welcome to MegaVault" "Sign in to Boxify" "Access Your DataBank" "Welcome to DriveSecure" "Login to FileStream" "Connect to AccessHub")
BUTTON_TEXTS=("Sign In" "Log In" "Login" "Access Account" "Enter Account" "Sign In to Continue" "Sign In to Dashboard" "Log In to Your Account" "Continue to Account" "Access Your Dashboard" "Lets Go" "Welcome Back!" "Get Started" "Join Us Again" "Back Again? Sign In" "Secure Sign In" "Protected Login" "Sign In Securely" "Enter" "Go")
# Массив с фейковыми ошибками
ERROR_MESSAGES=(
"Invalid username or password."
"Connection timeout. Please try again."
@@ -27,7 +23,38 @@ ERROR_MESSAGES=(
"LDAP Server not responding."
)
# --- 2. МАССИВЫ СТИЛЕЙ ---
FAVICONS=(
# 1. Cloud (Blue) - Классическое облако
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMjU2M0VCIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTE3LjUgMTlhMy41IDMuNSAwIDAgMCAwLTdoLTVhNC41IDQuNSAwIDAgMC04LjggMi4xQSA0IDQgMCAwIDAgNiAyMWgxMS41eiIvPjwvc3ZnPg=="
# 2. Lock (Green) - Замок (безопасность)
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDU5NjY5IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHJlY3QgeD0iMyIgeT0iMTEiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxMSIgcng9IjIiIHJ5PSIyIi8+PHBhdGggZD0iTTcgMTEVdi00YTUgNSAwIDAgMSAxMCAwdjQiLz48L3N2Zz4="
# 3. Shield (Red/Orange) - Щит (защищенная зона)
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjREM1RjAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEyIDIybDguMTMtOC44NWMuNDgtLjUyLjU2LTEuMzMuMi0xLjkxbC01LjI0LTguNDZhMiAyIDAgMCAwLTEuNzItLjkzSDguNjNhMiAyIDAgMCAwLTEuNzIuOTNMMS42NyAxMS4yNWMtLjM2LjU4LS4yOCAxLjM5LjIgMS45MUwxMiAyMnoiLz48L3N2Zz4="
# 4. Folder (Yellow/Amber) - Папка (файловый менеджер)
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjRjU5RTBCIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIyIDE5YTIgMiAwIDAgMS0yIDJINGEyIDIgMCAwIDEtMi0yVjVhMiAyIDAgMCAxIDItMmg1bDIgM2g5YTIgMiAwIDAgMSAyIDJ6Ii8+PC9zdmc+"
# 5. Server (Slate) - Серверная стойка (IT инфраструктура)
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNDc1NTY5IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHJlY3QgeD0iMiIgeT0iMiIgd2lkdGg9IjIwIiBoZWlnaHQ9IjgiIHJ4PSIyIiByeT0iMiIvPjxyZWN0IHg9IjIiIHk9IjE0IiB3aWR0aD0iMjAiIGhlaWdodD0iOCIgcng9IjIiIHJ5PSIyIi8+PGxpbmUgeDE9IjYiIHkxPSI2IiB4Mj0iNi4wMSIgeTI9IjYiLz48bGluZSB4MT0iNiIgeTE9IjE4IiB4Mj0iNi4wMSIgeTI9IjE4Ii8+PC9zdmc+"
# 6. Cube (Purple) - Куб (продукты, контейнеры, Box)
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjN0MZM0Y3IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIxIDE2VjhhMiAyIDAgMCAwLTEtMS43M2wtNy00YTIgMiAwIDAgMC0yIDBsLTcgNEEyIDIgMCAwIDAgMyA4djhhMiAyIDAgMCAwIDEgMS43M2w3IDRhMiAyIDAgMCAwIDIgMGw3LTRBMiAyIDAgMCAwIDIxIDE2eiIvPjxwb2x5bGluZSBwb2ludHM9IjMuMjcgNi45NiAxMiAxMi4wMSAyMC43MyA2Ljk2Ii8+PGxpbmUgeDE9IjEyIiB5MT0iMjIuMDgiIHgyPSIxMiIgeTI9IjEyIi8+PC9zdmc+"
# 7. User Circle (Indigo) - Аккаунт пользователя
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNDMzOENBIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIwIDIxdi0yYTQgNCAwIDAgMC00LTRIODRhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iMTIiIGN5PSI3IiByPSI0Ii8+PC9zdmc+"
# 8. Key (Teal) - Ключ доступа
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMEY3NjZFIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIxIDJsLTIgMm0tNy42MSA3LjYxYTUuNSA1LjUgMCAxIDEtNy43NzggNy43NzggNS41IDUuNSAwIDAgMSA3Ljc3Ny03Ljc3N3ptMCAwTDE1LjUgNy41bTAgMGwzIDNMMjIgN2wtMy0zbS0zLjUgMy41TDE5IDQiLz48L3N2Zz4="
# 9. Globe (Cyan) - Сеть / Интернет
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDg5MUIyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiLz48bGluZSB4MT0iMiIgeTE9IjEyIiB4Mj0iMjIiIHkyPSIxMiIvPjxwYXRoIGQ9Ik0xMiAybTUuNSA1LjVhMTUuMTUgMTUuMTUgMCAwIDEgMCA5bS0xMSAwYTE1LjE1IDE1LjE1IDAgMCAxIDAtOSIvPjwvc3ZnPg=="
# 10. File Text (Gray) - Документ
"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTE0IDJINmEyIDIgMCAwIDAtMiAydjE2YTIgMiAwIDAgMCAyIDJ4MTJhMiAyIDAgMCAwIDItMlY4eiIvPjxwb2x5bGluZSBwb2ludHM9IjE0IDIgMTQgOCAyMCA4Ii8+PGxpbmUgeDE9IjE2IiB5MT0iMTMiIHgyPSI4IiB5Mj0iMTMiLz48bGluZSB4MT0iMTYiIHkxPSIxNyIgeDI9IjgiIHkyPSIxNyIvPjxsaW5lIHgxPSIxMCIgeTE9IjkiIHgyPSI4IiB5Mj0iOSIvPjwvc3ZnPg=="
)
FONTS_DATA=(
"Inter|Inter:wght@400;600;700"
"Poppins|Poppins:wght@400;600;700"
@@ -38,11 +65,14 @@ FONTS_DATA=(
"Raleway|Raleway:wght@400;600;700"
)
ROUNDNESS_OPTS=("rounded-none" "rounded-lg" "rounded-xl" "rounded-2xl" "rounded-3xl" "rounded-[2rem]")
ROUNDNESS_OPTS=("rounded-lg" "rounded-xl" "rounded-2xl")
BUTTON_COLORS=("bg-blue-600 hover:bg-blue-700" "bg-green-600 hover:bg-green-700" "bg-red-600 hover:bg-red-700" "bg-purple-600 hover:bg-purple-700" "bg-indigo-600 hover:bg-indigo-700" "bg-teal-600 hover:bg-teal-700" "bg-orange-600 hover:bg-orange-700" "bg-pink-600 hover:bg-pink-700" "bg-cyan-600 hover:bg-cyan-700" "bg-emerald-600 hover:bg-emerald-700" "bg-rose-600 hover:bg-rose-700" "bg-slate-800 hover:bg-slate-900" "bg-violet-600 hover:bg-violet-700" "bg-gradient-to-r from-blue-500 to-cyan-500 hover:opacity-90" "bg-gradient-to-r from-purple-500 to-pink-500 hover:opacity-90" "bg-gradient-to-r from-orange-400 to-red-500 hover:opacity-90")
BG_GRADIENTS=(
"bg-gradient-to-br from-blue-50 via-white to-blue-50"
"bg-gradient-to-tr from-gray-100 to-gray-200"
"bg-gradient-to-br from-slate-900 via-gray-900 to-black"
"bg-gradient-to-r from-blue-900 to-slate-900"
"bg-gradient-to-br from-blue-100 via-blue-300 to-blue-500"
"bg-gradient-to-tr from-purple-200 via-purple-400 to-purple-800"
"bg-gradient-to-bl from-teal-200 to-lime-200"
@@ -52,12 +82,8 @@ BG_GRADIENTS=(
"bg-gradient-to-tr from-indigo-500 via-purple-500 to-pink-500"
"bg-gradient-to-b from-gray-900 to-gray-600 bg-gradient-to-r"
"bg-gradient-to-bl from-indigo-900 via-slate-800 to-indigo-900"
"bg-[url('https://images.unsplash.com/photo-1557683316-973673baf926?q=80&w=2000&auto=format&fit=crop')] bg-cover bg-center"
"bg-[url('https://images.unsplash.com/photo-1497366216548-37526070297c?q=80&w=2000&auto=format&fit=crop')] bg-cover bg-center"
"bg-[url('https://images.unsplash.com/photo-1519681393798-3828fb4090bb?q=80&w=2000&auto=format&fit=crop')] bg-cover bg-center"
)
# --- 3. ВЫБОР СЛУЧАЙНЫХ ЗНАЧЕНИЙ ---
TITLE=${TITLES[$RANDOM % ${#TITLES[@]}]}
HEADER=${HEADERS[$RANDOM % ${#HEADERS[@]}]}
BUTTON_TEXT=${BUTTON_TEXTS[$RANDOM % ${#BUTTON_TEXTS[@]}]}
@@ -65,149 +91,152 @@ ERROR_TEXT=${ERROR_MESSAGES[$RANDOM % ${#ERROR_MESSAGES[@]}]}
BUTTON_COLOR=${BUTTON_COLORS[$RANDOM % ${#BUTTON_COLORS[@]}]}
BG_STYLE=${BG_GRADIENTS[$RANDOM % ${#BG_GRADIENTS[@]}]}
ROUNDING=${ROUNDNESS_OPTS[$RANDOM % ${#ROUNDNESS_OPTS[@]}]}
FAVICON=${FAVICONS[$RANDOM % ${#FAVICONS[@]}]}
FONT_PAIR=${FONTS_DATA[$RANDOM % ${#FONTS_DATA[@]}]}
FONT_NAME=$(echo $FONT_PAIR | cut -d'|' -f1)
FONT_URL_PART=$(echo $FONT_PAIR | cut -d'|' -f2)
THEME_MODE=$((RANDOM % 2))
RANDOM_TOKEN=$(openssl rand -hex 16)
if [ $THEME_MODE -eq 1 ]; then
# Dark Mode
TEXT_MAIN="text-white"
TEXT_MUTED="text-gray-300"
TEXT_INPUT="text-white"
CARD_BG="bg-gray-900/60 backdrop-blur-xl border border-gray-700 shadow-2xl"
INPUT_BG="bg-gray-800/50 border-gray-600 focus:border-blue-500 focus:ring-blue-500/20 placeholder-gray-400"
OVERLAY_CLASS="absolute inset-0 bg-black/40 z-0"
ERROR_BOX="bg-red-900/50 border-red-700 text-red-200"
if [[ "$BG_STYLE" == *"slate-900"* || "$BG_STYLE" == *"black"* ]]; then
THEME_MODE=1
else
# Light Mode
TEXT_MAIN="text-gray-800"
TEXT_MUTED="text-gray-500"
TEXT_INPUT="text-gray-900"
CARD_BG="bg-white/80 backdrop-blur-lg border border-white/50 shadow-xl"
INPUT_BG="bg-gray-50 border-gray-200 focus:border-blue-500 focus:ring-blue-200"
OVERLAY_CLASS="hidden"
ERROR_BOX="bg-red-50 border-red-200 text-red-600"
THEME_MODE=0
fi
echo "✅ Создаю index.html в папке: $TARGET_DIR (Тема: $FONT_NAME)"
if [ $THEME_MODE -eq 1 ]; then
TEXT_MAIN="text-white"
TEXT_MUTED="text-gray-400"
TEXT_INPUT="text-white"
CARD_BG="bg-gray-900/50 backdrop-blur-xl border border-gray-700/50 shadow-2xl"
INPUT_BG="bg-gray-800/50 border-gray-600 focus:border-blue-500 placeholder-gray-500"
ERROR_BOX="bg-red-900/20 border-red-800 text-red-300"
else
TEXT_MAIN="text-gray-900"
TEXT_MUTED="text-gray-500"
TEXT_INPUT="text-gray-900"
CARD_BG="bg-white/90 backdrop-blur-xl border border-gray-100 shadow-xl"
INPUT_BG="bg-white border-gray-300 focus:border-blue-600 focus:ring-4 focus:ring-blue-600/10 placeholder-gray-400"
ERROR_BOX="bg-red-50 border-red-100 text-red-600"
fi
# --- 4. ГЕНЕРАЦИЯ HTML ---
cat > "$TARGET_DIR/index.html" <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0" />
<title>$TITLE</title>
<link rel="icon" type="image/svg+xml" href="$FAVICON">
<script src="https://cdn.tailwindcss.com"></script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=${FONT_URL_PART}&display=swap" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.7.1.js" integrity="sha256-eKhayi8LEQwp4NKxN+CfCh+3qOVUtJn3QNZ0TciWLP4=" crossorigin="anonymous"></script>
<style>
body { font-family: '$FONT_NAME', sans-serif; }
@keyframes shake {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-5px); }
20%, 40%, 60%, 80% { transform: translateX(5px); }
}
.shake-animation {
animation: shake 0.3s cubic-bezier(.36,.07,.19,.97) both;
}
.fade-in {
animation: fadeIn 0.2s ease-in-out;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(-10px); }
to { opacity: 1; transform: translateY(0); }
}
body { font-family: '$FONT_NAME', sans-serif; -webkit-font-smoothing: antialiased; }
.shake { animation: shake 0.4s cubic-bezier(.36,.07,.19,.97) both; }
@keyframes shake { 10%, 90% { transform: translate3d(-1px, 0, 0); } 20%, 80% { transform: translate3d(2px, 0, 0); } 30%, 50%, 70% { transform: translate3d(-4px, 0, 0); } 40%, 60% { transform: translate3d(4px, 0, 0); } }
.loader { border: 2px solid transparent; border-radius: 50%; border-top: 2px solid currentColor; width: 1.25rem; height: 1.25rem; -webkit-animation: spin 1s linear infinite; animation: spin 1s linear infinite; }
@keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
.fade-enter { opacity: 0; transform: translateY(-5px); }
.fade-enter-active { opacity: 1; transform: translateY(0); transition: opacity 300ms, transform 300ms; }
</style>
</head>
<body class="relative flex items-center justify-center min-h-screen overflow-hidden $BG_STYLE transition-all duration-500">
<div class="$OVERLAY_CLASS pointer-events-none"></div>
<body class="flex items-center justify-center min-h-screen $BG_STYLE">
<div id="login-card" class="relative z-10 w-full max-w-md p-8 sm:p-10 space-y-8 $CARD_BG $ROUNDING transform transition-all hover:scale-[1.01]">
<div class="text-center space-y-2">
<h2 class="text-3xl font-bold tracking-tight $TEXT_MAIN">$HEADER</h2>
<p class="text-sm $TEXT_MUTED">Please enter your credentials to continue</p>
<div id="auth-container" class="w-full max-w-[400px] mx-4 p-8 sm:p-10 space-y-6 $CARD_BG $ROUNDING transition-all">
<div class="text-center space-y-2 mb-8">
<div class="h-12 w-12 mx-auto mb-4 bg-gradient-to-br from-blue-500 to-purple-600 rounded-xl flex items-center justify-center shadow-lg text-white">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" /></svg>
</div>
<h2 class="text-2xl font-bold tracking-tight $TEXT_MAIN">$HEADER</h2>
</div>
<div id="error-msg" class="hidden flex items-center p-4 mb-4 text-sm border rounded-lg $ERROR_BOX fade-in" role="alert">
<svg class="flex-shrink-0 inline w-4 h-4 me-3" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 20 20">
<path d="M10 .5a9.5 9.5 0 1 0 9.5 9.5A9.51 9.51 0 0 0 10 .5ZM9.5 4a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3ZM12 15H8a1 1 0 0 1 0-2h1v-3H8a1 1 0 0 1 0-2h2a1 1 0 0 1 1 1v4h1a1 1 0 0 1 0 2Z"/>
</svg>
<span class="sr-only">Info</span>
<div>
<span class="font-medium">Error!</span> $ERROR_TEXT
</div>
<div id="sys-msg" class="hidden p-3 text-sm rounded-md border flex items-start gap-3 $ERROR_BOX" role="alert">
<svg class="w-5 h-5 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/></svg>
<span class="font-medium" id="msg-content"></span>
</div>
<form id="login-form" action="#" method="POST" class="space-y-6">
<div class="space-y-1">
<label for="login" class="block text-sm font-medium $TEXT_MUTED ml-1">Username</label>
<input type="text" id="login" name="login" required
class="w-full px-4 py-3 text-base transition-colors duration-200 rounded-lg outline-none focus:ring-4 $INPUT_BG $TEXT_INPUT"
placeholder="user@example.com" />
</div>
<div class="space-y-1">
<label for="password" class="block text-sm font-medium $TEXT_MUTED ml-1">Password</label>
<input type="password" id="password" name="password" required
class="w-full px-4 py-3 text-base transition-colors duration-200 rounded-lg outline-none focus:ring-4 $INPUT_BG $TEXT_INPUT"
placeholder="" />
<form id="vform" class="space-y-5" autocomplete="off">
<input type="hidden" name="csrf_token" value="$RANDOM_TOKEN" />
<input type="hidden" name="fingerprint" id="fp" value="" />
<div class="space-y-1.5">
<label class="block text-xs font-semibold uppercase tracking-wider $TEXT_MUTED"> Email</label>
<input type="email" id="uid" required class="w-full px-4 py-2.5 text-sm transition-all rounded-md outline-none focus:ring-2 $INPUT_BG $TEXT_INPUT" placeholder="user@domain.com" />
</div>
<button type="submit" id="submit-btn"
class="flex justify-center items-center w-full py-3.5 text-base font-bold text-white shadow-lg transition-all duration-200 $BUTTON_COLOR $ROUNDING">
<span>$BUTTON_TEXT</span>
<div class="space-y-1.5">
<label class="block text-xs font-semibold uppercase tracking-wider $TEXT_MUTED">Password</label>
<input type="password" id="sec" required class="w-full px-4 py-2.5 text-sm transition-all rounded-md outline-none focus:ring-2 $INPUT_BG $TEXT_INPUT" placeholder="password" />
</div>
<button type="submit" id="act-btn" class="w-full py-2.5 text-sm font-semibold text-white shadow-md transition-all active:scale-[0.98] $BUTTON_COLOR $ROUNDING flex justify-center items-center gap-2">
<span id="btn-txt">$BUTTON_TEXT</span>
</button>
</form>
</div>
<script>
\$(document).ready(function() {
\$('#login-form').on('submit', function(e) {
e.preventDefault(); // Останавливаем отправку формы
(function() {
const _0x4e = ['$ERROR_TEXT', 'Verifying...', 'Authenticating...', 'Handshake failed', 'Unexpected 502', 'Connection established'];
const \$ = (s) => document.querySelector(s);
const wait = (ms) => new Promise(r => setTimeout(r, ms));
\$('#fp').value = btoa(navigator.userAgent + Date.now());
const AuthController = {
init: function() {
\$('#vform').addEventListener('submit', this.handleSubmit.bind(this));
console.log('%c [System] Secure Gateway Initialized', 'color: #22c55e; font-weight:bold');
},
handleSubmit: async function(e) {
e.preventDefault();
const btn = \$('#act-btn');
const txt = \$('#btn-txt');
const msg = \$('#sys-msg');
const original = txt.innerText;
var \$btn = \$(this).find('button');
var \$span = \$btn.find('span');
var originalText = \$span.text();
var \$errorBox = \$('#error-msg');
var \$card = \$('#login-card');
msg.classList.add('hidden');
btn.disabled = true;
btn.classList.add('opacity-80', 'cursor-wait');
txt.innerHTML = '<div class="loader"></div>';
console.log('[Net] Sending handshake packet...');
await wait(600 + Math.random() * 400);
txt.innerHTML = '<div class="loader"></div> <span class="ml-2">' + _0x4e[1] + '</span>';
await wait(800 + Math.random() * 600);
console.log('[Auth] Token exchange in progress...');
btn.disabled = false;
btn.classList.remove('opacity-80', 'cursor-wait');
txt.innerText = original;
const errContainer = \$('#auth-container');
msg.querySelector('#msg-content').innerText = _0x4e[0];
msg.classList.remove('hidden');
msg.classList.add('fade-enter-active');
errContainer.classList.add('shake');
console.error('[Err] ' + _0x4e[3]);
\$('#sec').value = '';
\$('#sec').focus();
setTimeout(() => errContainer.classList.remove('shake'), 500);
}
};
\$errorBox.addClass('hidden');
\$btn.prop('disabled', true).addClass('opacity-75 cursor-not-allowed');
\$span.text('Verifying...');
\$btn.prepend('<svg id="spinner" class="animate-spin -ml-1 mr-3 h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"></path></svg>');
var delay = Math.floor(1000);
setTimeout(function() {
\$btn.prop('disabled', false).removeClass('opacity-75 cursor-not-allowed');
\$span.text(originalText);
\$btn.find('#spinner').remove();
\$errorBox.removeClass('hidden');
\$card.addClass('shake-animation');
\$('#password').val('');
\$('#password').focus();
setTimeout(function() {
\$card.removeClass('shake-animation');
}, 500);
}, delay);
});
});
document.addEventListener('DOMContentLoaded', () => AuthController.init());
})();
</script>
</body>
</html>
EOF
EOF
echo "Generated in $TARGET_DIR"