update 2025-01-26 00:23:38

This commit is contained in:
kenzok8 2025-01-26 00:23:38 +08:00
parent 576aacbe19
commit 8ce829e231
14 changed files with 691 additions and 265 deletions

View File

@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
PKG_MAINTAINER:=Thaolga <https://github.com/Thaolga/luci-app-nekobox> PKG_MAINTAINER:=Thaolga <https://github.com/Thaolga/luci-app-nekobox>
PKG_NAME:=luci-app-nekobox PKG_NAME:=luci-app-nekobox
PKG_VERSION:=1.6.8 PKG_VERSION:=1.6.9
PKG_RELEASE:=cn PKG_RELEASE:=cn
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)

View File

@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="186" height="20" role="img" aria-label="Latest Version: v1.6.8"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="186" height="20" role="img" aria-label="Latest Version: v1.6.9">
<title>Latest Version: v1.6.8</title> <title>Latest Version: v1.6.9</title>
<linearGradient id="s" x2="0" y2="100%"> <linearGradient id="s" x2="0" y2="100%">
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/> <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
<stop offset="1" stop-opacity=".1"/> <stop offset="1" stop-opacity=".1"/>
@ -15,7 +15,7 @@
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"> <g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110">
<text aria-hidden="true" x="495" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="700" style="letter-spacing: -5;">Latest Version</text> <text aria-hidden="true" x="495" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="700" style="letter-spacing: -5;">Latest Version</text>
<text x="495" y="140" transform="scale(.1)" fill="#fff" textLength="700" style="letter-spacing: -5;">Latest Version</text> <text x="495" y="140" transform="scale(.1)" fill="#fff" textLength="700" style="letter-spacing: -5;">Latest Version</text>
<text aria-hidden="true" x="1405" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="600" style="letter-spacing: -3;">v1.6.8</text> <text aria-hidden="true" x="1405" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="600" style="letter-spacing: -3;">v1.6.9</text>
<text x="1405" y="140" transform="scale(.1)" fill="#fff" textLength="600" style="letter-spacing: -3;">v1.6.8</text> <text x="1405" y="140" transform="scale(.1)" fill="#fff" textLength="600" style="letter-spacing: -3;">v1.6.9</text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1,5 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="186" height="20" role="img" aria-label="Current Version: v1.6.8"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="186" height="20" role="img" aria-label="Current Version: v1.6.9">
<title>Current Version: v1.6.8</title> <title>Current Version: v1.6.9</title>
<linearGradient id="s" x2="0" y2="100%"> <linearGradient id="s" x2="0" y2="100%">
<stop offset="0" stop-color="#bbb" stop-opacity=".1"/> <stop offset="0" stop-color="#bbb" stop-opacity=".1"/>
<stop offset="1" stop-opacity=".1"/> <stop offset="1" stop-opacity=".1"/>
@ -15,7 +15,7 @@
<g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110"> <g fill="#fff" text-anchor="middle" font-family="Verdana,Geneva,DejaVu Sans,sans-serif" text-rendering="geometricPrecision" font-size="110">
<text aria-hidden="true" x="495" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="700" style="letter-spacing: -5;">Current Version</text> <text aria-hidden="true" x="495" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="700" style="letter-spacing: -5;">Current Version</text>
<text x="495" y="140" transform="scale(.1)" fill="#fff" textLength="700" style="letter-spacing: -5;">Current Version</text> <text x="495" y="140" transform="scale(.1)" fill="#fff" textLength="700" style="letter-spacing: -5;">Current Version</text>
<text aria-hidden="true" x="1405" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="600" style="letter-spacing: -3;">v1.6.8</text> <text aria-hidden="true" x="1405" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="600" style="letter-spacing: -3;">v1.6.9</text>
<text x="1405" y="140" transform="scale(.1)" fill="#fff" textLength="600" style="letter-spacing: -3;">v1.6.8</text> <text x="1405" y="140" transform="scale(.1)" fill="#fff" textLength="600" style="letter-spacing: -3;">v1.6.9</text>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -1075,6 +1075,241 @@ if(typeof checkSiteStatus !== 'undefined') {
setInterval(IP.getIpipnetIP, 180000); setInterval(IP.getIpipnetIP, 180000);
</script> </script>
<script>
window.addEventListener('load', function() {
let snowContainer = document.querySelector('#snow-container');
if (snowContainer) {
snowContainer.innerHTML = '';
}
if (snowContainer) {
for (let i = 0; i < 80; i++) {
let snowflake = document.createElement('div');
snowflake.classList.add('snowflake');
let size = Math.random() * 10 + 5 + 'px';
snowflake.style.width = size;
snowflake.style.height = size;
let speed = Math.random() * 3 + 2 + 's';
snowflake.style.animationDuration = speed;
let rotate = Math.random() * 360 + 'deg';
let rotateSpeed = Math.random() * 5 + 2 + 's';
snowflake.style.animationName = 'fall';
snowflake.style.animationDuration = speed;
snowflake.style.animationTimingFunction = 'linear';
snowflake.style.animationIterationCount = 'infinite';
let leftPosition = Math.random() * 100 + 'vw';
snowflake.style.left = leftPosition;
snowflake.style.animationDelay = Math.random() * 5 + 's';
snowContainer.appendChild(snowflake);
}
}
});
</script>
<script>
const audioPlayer = new Audio();
let songs = [];
let currentSongIndex = 0;
let isPlaying = false;
let isReportingTime = false;
function loadDefaultPlaylist() {
fetch('https://raw.githubusercontent.com/Thaolga/Rules/main/Clash/songs.txt')
.then(response => {
if (!response.ok) {
throw new Error('加载播放列表失败');
}
return response.text();
})
.then(data => {
songs = data.split('\n').filter(url => url.trim() !== '');
if (songs.length === 0) {
throw new Error('播放列表中没有有效的歌曲');
}
console.log('播放列表已加载:', songs);
restorePlayerState();
})
.catch(error => {
console.error('加载播放列表时出错:', error.message);
});
}
function loadSong(index) {
if (index >= 0 && index < songs.length) {
audioPlayer.src = songs[index];
audioPlayer.addEventListener('loadedmetadata', () => {
const savedState = JSON.parse(localStorage.getItem('playerState'));
if (savedState && savedState.currentSongIndex === index) {
audioPlayer.currentTime = savedState.currentTime || 0;
if (savedState.isPlaying) {
audioPlayer.play().catch(error => {
console.error('恢复播放失败:', error);
});
}
}
}, { once: true });
}
}
document.addEventListener('dblclick', function() {
if (!isPlaying) {
loadSong(currentSongIndex);
audioPlayer.play().then(() => {
isPlaying = true;
savePlayerState();
console.log('开始播放');
}).catch(error => {
console.log('播放失败:', error);
});
} else {
audioPlayer.pause();
isPlaying = false;
savePlayerState();
console.log('播放已暂停');
}
});
document.addEventListener('keydown', function(event) {
if (event.key === 'ArrowLeft') {
currentSongIndex = (currentSongIndex - 1 + songs.length) % songs.length;
loadSong(currentSongIndex);
savePlayerState();
if (isPlaying) {
audioPlayer.play();
}
} else if (event.key === 'ArrowRight') {
currentSongIndex = (currentSongIndex + 1) % songs.length;
loadSong(currentSongIndex);
savePlayerState();
if (isPlaying) {
audioPlayer.play();
}
}
});
function startHourlyAlert() {
setInterval(() => {
const now = new Date();
const hours = now.getHours();
if (now.getMinutes() === 0 && !isReportingTime) {
isReportingTime = true;
const timeAnnouncement = new SpeechSynthesisUtterance(`整点报时,现在是北京时间 ${hours} 点整`);
timeAnnouncement.lang = 'zh-CN';
speechSynthesis.speak(timeAnnouncement);
console.log(`整点报时:现在是北京时间 ${hours} 点整`);
}
if (now.getMinutes() !== 0) {
isReportingTime = false;
}
}, 60000);
}
audioPlayer.addEventListener('ended', function() {
currentSongIndex = (currentSongIndex + 1) % songs.length;
loadSong(currentSongIndex);
savePlayerState();
audioPlayer.play();
});
function savePlayerState() {
const state = {
currentSongIndex,
currentTime: audioPlayer.currentTime,
isPlaying
};
localStorage.setItem('playerState', JSON.stringify(state));
}
function restorePlayerState() {
const state = JSON.parse(localStorage.getItem('playerState'));
if (state) {
currentSongIndex = state.currentSongIndex || 0;
loadSong(currentSongIndex);
}
}
loadDefaultPlaylist();
startHourlyAlert();
</script>
<script>
const websites = [
'https://www.youtube.com/',
'https://www.google.com/',
'https://www.facebook.com/',
'https://www.twitter.com/',
'https://www.github.com/'
];
function speakMessage(message) {
const utterance = new SpeechSynthesisUtterance(message);
utterance.lang = 'zh-CN';
speechSynthesis.speak(utterance);
}
function getWebsiteStatusMessage(url, status) {
const statusMessages = {
'https://www.youtube.com/': status ? 'YouTube 网站访问正常。' : '无法访问 YouTube 网站,请检查网络连接。',
'https://www.google.com/': status ? 'Google 网站访问正常。' : '无法访问 Google 网站,请检查网络连接。',
'https://www.facebook.com/': status ? 'Facebook 网站访问正常。' : '无法访问 Facebook 网站,请检查网络连接。',
'https://www.twitter.com/': status ? 'Twitter 网站访问正常。' : '无法访问 Twitter 网站,请检查网络连接。',
'https://www.github.com/': status ? 'GitHub 网站访问正常。' : '无法访问 GitHub 网站,请检查网络连接。',
};
return statusMessages[url] || (status ? `${url} 网站访问正常。` : `无法访问 ${url} 网站,请检查网络连接。`);
}
function checkWebsiteAccess(urls) {
const statusMessages = [];
let requestsCompleted = 0;
urls.forEach(url => {
fetch(url, { mode: 'no-cors' })
.then(response => {
const isAccessible = response.type === 'opaque';
statusMessages.push(getWebsiteStatusMessage(url, isAccessible));
})
.catch(() => {
statusMessages.push(getWebsiteStatusMessage(url, false));
})
.finally(() => {
requestsCompleted++;
if (requestsCompleted === urls.length) {
speakMessage(statusMessages.join(' '));
}
});
});
}
let isDetectionStarted = false;
document.addEventListener('contextmenu', function(event) {
event.preventDefault();
if (!isDetectionStarted) {
speakMessage('开始检测网站连通性...');
checkWebsiteAccess(websites);
isDetectionStarted = true;
}
});
</script>

View File

@ -0,0 +1,21 @@
<?php
if (isset($_POST['enableSnowEffect'])) {
$enableSnowEffect = $_POST['enableSnowEffect'] == '1' ? true : false;
$pingFile = 'ping.php';
$fileContent = file_get_contents($pingFile);
if ($enableSnowEffect) {
if (strpos($fileContent, '<div id="snow-container"></div>') === false) {
$fileContent .= '<div id="snow-container"></div>';
file_put_contents($pingFile, $fileContent);
}
} else {
if (strpos($fileContent, '<div id="snow-container"></div>') !== false) {
$fileContent = str_replace('<div id="snow-container"></div>', '', $fileContent);
file_put_contents($pingFile, $fileContent);
}
}
}
?>

View File

@ -20,8 +20,8 @@ if(isset($_POST['fw'])){
if ($dt == 'disable') shell_exec("uci set neko.cfg.new_interface='0' && uci commit neko"); if ($dt == 'disable') shell_exec("uci set neko.cfg.new_interface='0' && uci commit neko");
} }
$fwstatus=shell_exec("uci get neko.cfg.new_interface"); $fwstatus=shell_exec("uci get neko.cfg.new_interface");
$enableSnow = false;
?> ?>
<?php <?php
function getSingboxVersion() { function getSingboxVersion() {
$singBoxPath = '/usr/bin/sing-box'; $singBoxPath = '/usr/bin/sing-box';
@ -637,11 +637,11 @@ $razordVersion = getRazordVersion();
</div> </div>
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label for="bodyBgColor" class="form-label">主背景色</label> <label for="bodyBgColor" class="form-label">主背景色</label>
<input type="color" class="form-control" name="bodyBgColor" id="bodyBgColor" value="#087990"> <input type="color" class="form-control" name="bodyBgColor" id="bodyBgColor" value="#23407e">
</div> </div>
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label for="infoBgSubtle" class="form-label">信息背景色</label> <label for="infoBgSubtle" class="form-label">信息背景色</label>
<input type="color" class="form-control" name="infoBgSubtle" id="infoBgSubtle" value="#087990"> <input type="color" class="form-control" name="infoBgSubtle" id="infoBgSubtle" value="#23407e">
</div> </div>
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label for="backgroundColor" class="form-label">表格背景色</label> <label for="backgroundColor" class="form-label">表格背景色</label>
@ -661,15 +661,15 @@ $razordVersion = getRazordVersion();
</div> </div>
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label for="selectColor" class="form-label">主边框背景色</label> <label for="selectColor" class="form-label">主边框背景色</label>
<input type="color" class="form-control" name="selectColor" id="selectColor" value="#087990"> <input type="color" class="form-control" name="selectColor" id="selectColor" value="#23407e">
</div> </div>
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label for="bodyColor" class="form-label">表格文本色 1</label> <label for="bodyColor" class="form-label">表格文本色 1</label>
<input type="color" class="form-control" name="bodyColor" id="bodyColor" value="#00ccff"> <input type="color" class="form-control" name="bodyColor" id="bodyColor" value="#04f153">
</div> </div>
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label for="tertiaryColor" class="form-label">表格文本色 2</label> <label for="tertiaryColor" class="form-label">表格文本色 2</label>
<input type="color" class="form-control" name="tertiaryColor" id="tertiaryColor" value="#00ff00"> <input type="color" class="form-control" name="tertiaryColor" id="tertiaryColor" value="#46e1ec">
</div> </div>
<div class="col-md-6 mb-3"> <div class="col-md-6 mb-3">
<label for="tertiaryRgbColor" class="form-label">表格文本色 3</label> <label for="tertiaryRgbColor" class="form-label">表格文本色 3</label>
@ -724,14 +724,15 @@ $razordVersion = getRazordVersion();
<input type="color" class="form-control" name="heading6Color" id="heading6Color" value="#00ffff"> <input type="color" class="form-control" name="heading6Color" id="heading6Color" value="#00ffff">
</div> </div>
</div> </div>
<div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="enableSnowEffect" name="enableSnowEffect" <?php echo $enableSnow ? 'checked' : ''; ?>>
<label class="form-check-label" for="enableSnowEffect">启用雪花动画要禁用重复勾选2次</label>
</div>
<div class="mb-3 form-check"> <div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="useBackgroundImage" name="useBackgroundImage"> <input type="checkbox" class="form-check-input" id="useBackgroundImage" name="useBackgroundImage">
<label class="form-check-label" for="useBackgroundImage">使用自定义背景图片</label> <label class="form-check-label" for="useBackgroundImage">使用自定义背景图片</label>
</div> </div>
<div class="mb-3" id="backgroundImageContainer" style="display:none; position: relative; left: -1ch;"> <div class="mb-3" id="backgroundImageContainer" style="display:none; position: relative; left: -1ch;">
<label for="backgroundImage" class="form-label">选择背景图片</label>
<select class="form-select" id="backgroundImage" name="backgroundImage"> <select class="form-select" id="backgroundImage" name="backgroundImage">
<option value="">请选择图片</option> <option value="">请选择图片</option>
<?php <?php
@ -790,6 +791,42 @@ $razordVersion = getRazordVersion();
}); });
</script> </script>
<script>
const tooltip = document.createElement('div');
tooltip.style.position = 'fixed';
tooltip.style.top = '10px';
tooltip.style.left = '10px';
tooltip.style.backgroundColor = 'rgba(0, 128, 0, 0.7)';
tooltip.style.color = 'white';
tooltip.style.padding = '10px';
tooltip.style.borderRadius = '5px';
tooltip.style.zIndex = '9999';
tooltip.style.display = 'none';
document.body.appendChild(tooltip);
function showTooltip(message) {
tooltip.textContent = message;
tooltip.style.display = 'block';
setTimeout(() => {
tooltip.style.display = 'none';
}, 5000);
}
window.onload = function() {
showTooltip('双击左键打开播放器,双击右键开启网站连通性检测');
};
</script>
<script>
document.getElementById('enableSnowEffect').addEventListener('change', function() {
var isChecked = this.checked;
var xhr = new XMLHttpRequest();
xhr.open('POST', 'save_snow_status.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('enableSnowEffect=' + (isChecked ? '1' : '0'));
});
</script>
<div class="modal fade" id="filesModal" tabindex="-1" aria-labelledby="filesModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false"> <div class="modal fade" id="filesModal" tabindex="-1" aria-labelledby="filesModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-xl"> <div class="modal-dialog modal-xl">
<div class="modal-content"> <div class="modal-content">
@ -912,11 +949,11 @@ function formatSize($size) {
document.getElementById('resetButton').addEventListener('click', function() { document.getElementById('resetButton').addEventListener('click', function() {
document.getElementById('primaryColor').value = '#0ceda2'; document.getElementById('primaryColor').value = '#0ceda2';
document.getElementById('secondaryColor').value = '#00ffff'; document.getElementById('secondaryColor').value = '#00ffff';
document.getElementById('bodyBgColor').value = '#087990'; document.getElementById('bodyBgColor').value = '#23407e';
document.getElementById('bodyColor').value = '#00ccff'; document.getElementById('bodyColor').value = '#04f153';
document.getElementById('infoBgSubtle').value = '#087990'; document.getElementById('infoBgSubtle').value = '#23407e';
document.getElementById('selectColor').value = '#087990'; document.getElementById('selectColor').value = '#23407e';
document.getElementById('tertiaryColor').value = '#00ff00'; document.getElementById('tertiaryColor').value = '#46e1ec';
document.getElementById('tertiaryRgbColor').value = '#1e90ff'; document.getElementById('tertiaryRgbColor').value = '#1e90ff';
document.getElementById('heading1Color').value = '#21e4f2'; document.getElementById('heading1Color').value = '#21e4f2';
document.getElementById('heading2Color').value = '#65f1fb'; document.getElementById('heading2Color').value = '#65f1fb';
@ -1769,3 +1806,9 @@ document.getElementById('checkCliverButton').addEventListener('click', function
</div> </div>
</body> </body>
</html> </html>

View File

@ -2,13 +2,13 @@
if ($_SERVER['REQUEST_METHOD'] === 'POST') { if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$primaryColor = $_POST['primaryColor'] ?? '#0ceda2'; $primaryColor = $_POST['primaryColor'] ?? '#0ceda2';
$secondaryColor = $_POST['secondaryColor'] ?? '#00ffff'; $secondaryColor = $_POST['secondaryColor'] ?? '#00ffff';
$bodyBgColor = $_POST['bodyBgColor'] ?? '#087990'; $bodyBgColor = $_POST['bodyBgColor'] ?? '#23407e';
$bodyColor = $_POST['bodyColor'] ?? '#00ccff'; $bodyColor = $_POST['bodyColor'] ?? '#04f153';
$infoBgSubtle = $_POST['infoBgSubtle'] ?? '#087990'; $infoBgSubtle = $_POST['infoBgSubtle'] ?? '#23407e';
$primaryBorderSubtle = $_POST['primaryBorderSubtle'] ?? '#1815d1'; $primaryBorderSubtle = $_POST['primaryBorderSubtle'] ?? '#1815d1';
$tertiaryColor = $_POST['tertiaryColor'] ?? '#00ff00'; $tertiaryColor = $_POST['tertiaryColor'] ?? '#46e1ec';
$tertiaryRgbColor = $_POST['tertiaryRgbColor'] ?? '#1e90ff'; $tertiaryRgbColor = $_POST['tertiaryRgbColor'] ?? '#1e90ff';
$selectColor = $_POST['selectColor'] ?? '#087990'; $selectColor = $_POST['selectColor'] ?? '#23407e';
$backgroundColor = $_POST['backgroundColor'] ?? '#20cdd9'; $backgroundColor = $_POST['backgroundColor'] ?? '#20cdd9';
$placeholderColor = $_POST['placeholderColor'] ?? '#f82af2'; $placeholderColor = $_POST['placeholderColor'] ?? '#f82af2';
$logTextColor = $_POST['logTextColor'] ?? '#f8f9fa'; $logTextColor = $_POST['logTextColor'] ?? '#f8f9fa';
@ -38,6 +38,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
} }
$backgroundImagePath = $_POST['backgroundImage'] ?? ''; $backgroundImagePath = $_POST['backgroundImage'] ?? '';
$enableSnowEffect = isset($_POST['enableSnowEffect']) ? true : false;
$cssContent = " $cssContent = "
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;700&family=Noto+Serif+SC:wght@400;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;700&family=Noto+Serif+SC:wght@400;700&display=swap');
@ -339,203 +340,316 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
.card-header { background-color: var(--bs-primary); color: #fff; } .card-header { background-color: var(--bs-primary); color: #fff; }
.royal-style { font-family: 'Cinzel Decorative', cursive; font-weight: 900; font-size: 80px; color: var(--bs-primary); text-shadow: 2px 2px 4px rgba(142, 68, 173, 0.7), 0 0 20px rgba(142, 68, 173, 0.3); letter-spacing: 4px; text-align: center; margin-top: 20px; transition: all var(-- bs-transition-speed); } .royal-style { font-family: 'Cinzel Decorative', cursive; font-weight: 900; font-size: 80px; color: var(--bs-primary); text-shadow: 2px 2px 4px rgba(142, 68, 173, 0.7), 0 0 20px rgba(142, 68, 173, 0.3); letter-spacing: 4px; text-align: center; margin-top: 20px; transition: all var(-- bs-transition-speed); }
.royal-style:hover { transform: skew(-5deg); text-shadow: 3px 3px 6px rgba(0,0,0,0.2); } .royal-style:hover { transform: skew(-5deg); text-shadow: 3px 3px 6px rgba(0,0,0,0.2); }
@media (max-width: 991.98px) { @media (max-width: 991.98px) {
.container-sm.container-bg.callout { .container-sm.container-bg.callout {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
.container-sm.container-bg.callout a { .container-sm.container-bg.callout a {
margin: 0.5rem 0; margin: 0.5rem 0;
} }
} }
h1, h2, h3, h4, h5, h6 { h1, h2, h3, h4, h5, h6 {
font-family: var(--bs-heading-font-family); font-family: var(--bs-heading-font-family);
font-weight: var(--bs-heading-font-weight); font-weight: var(--bs-heading-font-weight);
letter-spacing: var(--bs-heading-letter-spacing); letter-spacing: var(--bs-heading-letter-spacing);
text-transform: var(--bs-heading-text-transform); text-transform: var(--bs-heading-text-transform);
margin-bottom: 1rem; margin-bottom: 1rem;
} }
h1 { h1 {
color: var(--bs-heading-1); color: var(--bs-heading-1);
font-size: 2.5rem; font-size: 2.5rem;
} }
h2 { h2 {
color: var(--bs-secondary); color: var(--bs-secondary);
font-size: 2rem; font-size: 2rem;
} }
h3 { h3 {
color: #9c27b0; color: #9c27b0;
font-size: 1.75rem; font-size: 1.75rem;
} }
h4 { h4 {
color: #9c27b0; color: #9c27b0;
font-size: 1.5rem; font-size: 1.5rem;
} }
h5 { h5 {
color: #673ab7; color: #673ab7;
font-size: 1.25rem; font-size: 1.25rem;
} }
h6 { h6 {
color: #e91e63; color: #e91e63;
font-size: 1rem; font-size: 1rem;
} }
h1:hover, h2:hover, h3:hover, h4:hover, h5:hover, h6:hover { h1:hover, h2:hover, h3:hover, h4:hover, h5:hover, h6:hover {
text-shadow: 2px 2px 4px rgba(0,0,0,0.1); text-shadow: 2px 2px 4px rgba(0,0,0,0.1);
transition: all 0.3s ease; transition: all 0.3s ease;
} }
.text-3d { .text-3d {
display: inline-block; display: inline-block;
transition: transform 0.5s, text-shadow 0.5s; transition: transform 0.5s, text-shadow 0.5s;
text-shadow: text-shadow:
1px 1px 1px rgba(0, 0, 0, 0.2), 1px 1px 1px rgba(0, 0, 0, 0.2),
2px 2px 1px rgba(0, 0, 0, 0.15), 2px 2px 1px rgba(0, 0, 0, 0.15),
3px 3px 1px rgba(0, 0, 0, 0.1); 3px 3px 1px rgba(0, 0, 0, 0.1);
} }
.text-3d:hover { .text-3d:hover {
transform: rotateY(15deg) rotateX(15deg); transform: rotateY(15deg) rotateX(15deg);
text-shadow: text-shadow:
3px 3px 1px rgba(0, 0, 0, 0.3), 3px 3px 1px rgba(0, 0, 0, 0.3),
4px 4px 2px rgba(0, 0, 0, 0.25), 4px 4px 2px rgba(0, 0, 0, 0.25),
5px 5px 3px rgba(0, 0, 0, 0.2); 5px 5px 3px rgba(0, 0, 0, 0.2);
} }
.card { .card {
border-radius: 12px; border-radius: 12px;
overflow: hidden; overflow: hidden;
box-shadow: var(--bs-shadow-medium); box-shadow: var(--bs-shadow-medium);
} }
.card-header { .card-header {
background-color: var(--bs-primary); background-color: var(--bs-primary);
color: #fff; color: #fff;
} }
.royal-style { .royal-style {
font-family: 'Cinzel Decorative', cursive; font-family: 'Cinzel Decorative', cursive;
font-weight: 900; font-weight: 900;
font-size: 80px; font-size: 80px;
color: var(--bs-primary); color: var(--bs-primary);
text-shadow: text-shadow:
2px 2px 4px rgba(142, 68, 173, 0.7), 2px 2px 4px rgba(142, 68, 173, 0.7),
0 0 20px rgba(142, 68, 173, 0.3); 0 0 20px rgba(142, 68, 173, 0.3);
letter-spacing: 4px; letter-spacing: 4px;
text-align: center; text-align: center;
margin-top: 20px; margin-top: 20px;
transition: all var(--bs-transition-speed); transition: all var(--bs-transition-speed);
} }
.royal-style:hover { .royal-style:hover {
transform: skew(-5deg); transform: skew(-5deg);
text-shadow: 3px 3px 6px rgba(0,0,0,0.2); text-shadow: 3px 3px 6px rgba(0,0,0,0.2);
} }
@media (max-width: 767px) {
body {
font-size: 14px;
}
@media (max-width: 767px) { h1 { font-size: 2rem; }
body { h2 { font-size: 1.75rem; }
font-size: 14px; h3 { font-size: 1.5rem; }
} h4 { font-size: 1.25rem; }
h5 { font-size: 1.1rem; }
h6 { font-size: 1rem; }
h1 { font-size: 2rem; } .royal-style {
h2 { font-size: 1.75rem; } font-size: 40px;
h3 { font-size: 1.5rem; } }
h4 { font-size: 1.25rem; }
h5 { font-size: 1.1rem; }
h6 { font-size: 1rem; }
.royal-style { .btn {
font-size: 40px; padding: 8px 16px;
} font-size: 14px;
}
.btn { .table-3d {
padding: 8px 16px; font-size: 14px;
font-size: 14px; }
}
.table-3d { .table-3d td,
font-size: 14px; .table-3d th {
} padding: 10px;
}
.table-3d td, .container-bg {
.table-3d th { padding: 1rem;
padding: 10px; margin-top: 1rem;
} margin-bottom: 1rem;
}
.container-bg { @media (max-width: 575px) {
padding: 1rem; .container-sm.container-bg.callout {
margin-top: 1rem; flex-direction: column;
margin-bottom: 1rem; align-items: stretch;
} }
@media (max-width: 575px) { .container-sm.container-bg.callout a {
.container-sm.container-bg.callout { margin: 0.25rem 0;
flex-direction: column; display: block;
align-items: stretch; text-align: center;
} }
}
.container-sm.container-bg.callout a { @media (min-width: 992px) {
margin: 0.25rem 0; .container-sm.container-bg.callout {
display: block;
text-align: center;
}
}
@media (min-width: 992px) {
.container-sm.container-bg.callout {
display: flex;
justify-content: center;
align-items: center;
}
.container-sm.container-bg.callout a {
margin: 0 0.5rem;
}
}
@media (max-width: 767px) {
.row.justify-content-md-center .col.input-group.mb-3.justify-content-md-center {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center;
}
.container-sm.container-bg.callout a {
margin: 0 0.5rem;
}
} }
.row.justify-content-md-center .col.input-group.mb-3.justify-content-md-center .btn-info { @media (max-width: 767px) {
width: auto; .row.justify-content-md-center .col.input-group.mb-3.justify-content-md-center {
min-width: 200px; display: flex;
justify-content: center;
}
.row.justify-content-md-center .col.input-group.mb-3.justify-content-md-center .btn-info {
width: auto;
min-width: 200px;
}
} }
}
.btn-info, .btn-info,
.btn-success, .btn-success,
.btn-danger { .btn-danger {
color: #fff !important; color: #fff !important;
} }
.btn-info:hover, .btn-info:hover,
.btn-success:hover, .btn-success:hover,
.btn-danger:hover, .btn-danger:hover,
.btn-info:focus, .btn-info:focus,
.btn-success:focus, .btn-success:focus,
.btn-danger:focus { .btn-danger:focus {
color: #fff !important; color: #fff !important;
} }
@media (max-width: 767px) { @media (max-width: 767px) {
.btn { .btn {
font-size: 10px; font-size: 10px;
}
} }
}
"; ";
if ($enableSnowEffect) {
$snowEffectCSS = "
#snow-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 9999;
display: block;
}
.snowflake {
position: absolute;
top: -10px;
width: 10px;
height: 10px;
background-color: white;
border-radius: 50%;
animation: fall linear infinite;
}
@keyframes fall {
0% {
transform: translateY(0) rotate(0deg);
}
100% {
transform: translateY(100vh) rotate(360deg);
}
}
.snowflake:nth-child(1) {
animation-duration: 8s;
animation-delay: -2s;
left: 10%;
width: 12px;
height: 12px;
}
.snowflake:nth-child(2) {
animation-duration: 10s;
animation-delay: -3s;
left: 20%;
width: 8px;
height: 8px;
}
.snowflake:nth-child(3) {
animation-duration: 12s;
animation-delay: -1s;
left: 30%;
width: 15px;
height: 15px;
}
.snowflake:nth-child(4) {
animation-duration: 9s;
animation-delay: -5s;
left: 40%;
width: 10px;
height: 10px;
}
.snowflake:nth-child(5) {
animation-duration: 11s;
animation-delay: -4s;
left: 50%;
width: 14px;
height: 14px;
}
.snowflake:nth-child(6) {
animation-duration: 7s;
animation-delay: -6s;
left: 60%;
width: 9px;
height: 9px;
}
.snowflake:nth-child(7) {
animation-duration: 8s;
animation-delay: -7s;
left: 70%;
width: 11px;
height: 11px;
}
.snowflake:nth-child(8) {
animation-duration: 10s;
animation-delay: -8s;
left: 80%;
width: 13px;
height: 13px;
}
.snowflake:nth-child(9) {
animation-duration: 6s;
animation-delay: -9s;
left: 90%;
width: 10px;
height: 10px;
}
";
$pos = strpos($cssContent, "#plugin_log, #bin_logs, #singbox_log") + strlen("#plugin_log, #bin_logs, #singbox_log {");
$endPos = strpos($cssContent, "}", $pos);
if ($pos !== false && $endPos !== false) {
$cssContent = substr_replace($cssContent, $snowEffectCSS, $endPos + 1, 0);
}
} else {
$cssContent .= "#snow-container { display: none; }\n";
}
$filePath = $_SERVER['DOCUMENT_ROOT'] . '/nekobox/assets/theme/transparent.css'; $filePath = $_SERVER['DOCUMENT_ROOT'] . '/nekobox/assets/theme/transparent.css';
file_put_contents($filePath, $cssContent); file_put_contents($filePath, $cssContent);
echo "<script> echo "<script>
@ -566,4 +680,5 @@ if (isset($_GET['delete'])) {
exit; exit;
} }
} }
?> ?>

View File

@ -1 +1 @@
V1.6.8-cn V1.6.9-cn

View File

@ -33,8 +33,8 @@
name="theme-color" name="theme-color"
content="#FFFFFF" content="#FFFFFF"
/> />
<script type="module" crossorigin src="./assets/index-DqRnidtX.js"></script> <script type="module" crossorigin src="./assets/index-CvSbIFcl.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-Bt6wtUNb.css"> <link rel="stylesheet" crossorigin href="./assets/index-LfbVF08o.css">
<link rel="manifest" href="./manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="./registerSW.js"></script></head> <link rel="manifest" href="./manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="./registerSW.js"></script></head>
<body class="overflow-hidden overscroll-none"> <body class="overflow-hidden overscroll-none">
<div id="app"></div> <div id="app"></div>

View File

@ -1 +1 @@
if(!self.define){let e,i={};const n=(n,s)=>(n=new URL(n+".js",s).href,i[n]||new Promise((i=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=i,document.head.appendChild(e)}else e=n,importScripts(n),i()})).then((()=>{let e=i[n];if(!e)throw new Error(`Module ${n} didnt register its module`);return e})));self.define=(s,r)=>{const f=e||("document"in self?document.currentScript.src:"")||location.href;if(i[f])return;let d={};const t=e=>n(e,f),o={module:{uri:f},exports:d,require:t};i[f]=Promise.all(s.map((e=>o[e]||t(e)))).then((e=>(r(...e),d)))}}define(["./workbox-3e8df8c8"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"assets/index-Bt6wtUNb.css",revision:null},{url:"assets/index-DqRnidtX.js",revision:null},{url:"index.html",revision:"a6fe46348527c1c8304d4883d456fddf"},{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"favicon.svg",revision:"7f1c4521acc10694fefef8f72dd2ea5f"},{url:"pwa-192x192.png",revision:"021df52501f4357c03eebd808f40dc6a"},{url:"pwa-512x512.png",revision:"d2f759aaabcb2c44ff52b27fde3de6e0"},{url:"pwa-maskable-192x192.png",revision:"7cd11dc5f0490b349d23eef5591d10e5"},{url:"pwa-maskable-512x512.png",revision:"8c97dc367a85a5a1eba523b24f79d03b"},{url:"manifest.webmanifest",revision:"c452912633990899ffe790f985ad0db9"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))})); if(!self.define){let e,i={};const s=(s,n)=>(s=new URL(s+".js",n).href,i[s]||new Promise((i=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=i,document.head.appendChild(e)}else e=s,importScripts(s),i()})).then((()=>{let e=i[s];if(!e)throw new Error(`Module ${s} didnt register its module`);return e})));self.define=(n,r)=>{const f=e||("document"in self?document.currentScript.src:"")||location.href;if(i[f])return;let o={};const c=e=>s(e,f),d={module:{uri:f},exports:o,require:c};i[f]=Promise.all(n.map((e=>d[e]||c(e)))).then((e=>(r(...e),o)))}}define(["./workbox-3e8df8c8"],(function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"assets/index-CvSbIFcl.js",revision:null},{url:"assets/index-LfbVF08o.css",revision:null},{url:"index.html",revision:"e32434c606efed2fabef8fd3a08fecf5"},{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"favicon.svg",revision:"7f1c4521acc10694fefef8f72dd2ea5f"},{url:"pwa-192x192.png",revision:"021df52501f4357c03eebd808f40dc6a"},{url:"pwa-512x512.png",revision:"d2f759aaabcb2c44ff52b27fde3de6e0"},{url:"pwa-maskable-192x192.png",revision:"7cd11dc5f0490b349d23eef5591d10e5"},{url:"pwa-maskable-512x512.png",revision:"8c97dc367a85a5a1eba523b24f79d03b"},{url:"manifest.webmanifest",revision:"c452912633990899ffe790f985ad0db9"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))}));

View File

@ -1 +1 @@
v1.59.0 v1.60.0

View File

@ -29,9 +29,19 @@ table td, .table .td {
color: red !important; color: red !important;
} }
._now_use_bg {
background: #5e72e445 !important;
}
.ping a:hover{ .ping a:hover{
text-decoration : underline; text-decoration : underline;
} }
@media (prefers-color-scheme: dark) {
._now_use_bg {
background: #4a90e2 !important;
}
}
</style> </style>
<script type="text/javascript"> <script type="text/javascript">
@ -212,6 +222,7 @@ table td, .table .td {
var dom = document.getElementById("cbi-passwall-" + id); var dom = document.getElementById("cbi-passwall-" + id);
if (dom) { if (dom) {
dom.title = "当前使用的 TCP 节点"; dom.title = "当前使用的 TCP 节点";
dom.classList.add("_now_use_bg");
//var v = "<a style='color: red'>当前TCP节点</a>" + document.getElementById("cbid.passwall." + id + ".remarks").value; //var v = "<a style='color: red'>当前TCP节点</a>" + document.getElementById("cbid.passwall." + id + ".remarks").value;
//document.getElementById("cbi-passwall-" + id + "-remarks").innerHTML = v; //document.getElementById("cbi-passwall-" + id + "-remarks").innerHTML = v;
var dom_remarks = document.getElementById("cbi-passwall-" + id + "-remarks"); var dom_remarks = document.getElementById("cbi-passwall-" + id + "-remarks");
@ -229,6 +240,7 @@ table td, .table .td {
} else { } else {
dom.title = "当前使用的 UDP 节点"; dom.title = "当前使用的 UDP 节点";
} }
dom.classList.add("_now_use_bg");
var dom_remarks = document.getElementById("cbi-passwall-" + id + "-remarks"); var dom_remarks = document.getElementById("cbi-passwall-" + id + "-remarks");
if (dom_remarks) { if (dom_remarks) {
dom_remarks.classList.add("_now_use"); dom_remarks.classList.add("_now_use");