mirror of
https://github.com/WJQSERVER-STUDIO/ghproxy.git
synced 2026-02-03 08:11:11 +08:00
25w14a
This commit is contained in:
parent
8336896979
commit
146dedea21
9 changed files with 651 additions and 648 deletions
|
|
@ -8,259 +8,7 @@
|
|||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<style>
|
||||
/* 通用样式 */
|
||||
:root {
|
||||
--primary-color: #007aff;
|
||||
/* 主要按钮颜色 */
|
||||
--secondary-color: #34c759;
|
||||
/* 次要按钮颜色 */
|
||||
--background-color: #f9f9f9;
|
||||
/* 亮色模式背景 */
|
||||
--card-background: #ffffff;
|
||||
/* 卡片背景 */
|
||||
--text-color: #333333;
|
||||
/* 亮色模式文本颜色 */
|
||||
--border-color: #e0e0e0;
|
||||
/* 边框颜色 */
|
||||
--input-background: #ffffff;
|
||||
/* 输入框背景 */
|
||||
--input-border: #d1d1d6;
|
||||
/* 输入框边框 */
|
||||
--pre-background: #f1f3f4;
|
||||
/* 代码块背景 */
|
||||
--pre-text-color: #333333;
|
||||
/* 代码块文本颜色 */
|
||||
--version-badge-hover: #39c5bb;
|
||||
/* 说明文字颜色 */
|
||||
--muted-text-color: #6c757d;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--background-color);
|
||||
color: var(--text-color);
|
||||
font-family: sans-serif;
|
||||
line-height: 1.8;
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
color: var(--text-color);
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.5px;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
p, span, a, li {
|
||||
color: var(--text-color);
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #0056b3;
|
||||
}
|
||||
|
||||
.card {
|
||||
background-color: var(--card-background);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 8px;
|
||||
padding: 16px;
|
||||
margin: 16px 0;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
|
||||
transform: translateY(-4px);
|
||||
}
|
||||
|
||||
.btn-outline-secondary {
|
||||
border-radius: 50%;
|
||||
padding: 6px;
|
||||
transition: #e9e9e9 0.3s ease-in-out, color 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.btn-outline-secondary:hover {
|
||||
background-color: var(--primary-color);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
background-color: var(--input-background);
|
||||
border: 1px solid var(--input-border);
|
||||
color: var(--text-color);
|
||||
padding: 10px;
|
||||
border-radius: 4px;
|
||||
font-size: 14px;
|
||||
outline: none;
|
||||
transition: border-color 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
border-color: var(--primary-color);
|
||||
box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3);
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
color: var(--muted-text-color) !important;
|
||||
}
|
||||
|
||||
.bg-light {
|
||||
background-color: var(--card-background) !important;
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: var(--pre-background);
|
||||
color: var(--pre-text-color);
|
||||
padding: 16px;
|
||||
border-radius: 8px;
|
||||
overflow-x: auto;
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.version-badge {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
right: 20px;
|
||||
background-color: var(--secondary-color);
|
||||
color: white;
|
||||
padding: 6px 12px;
|
||||
border-radius: 20px;
|
||||
font-size: 0.8rem;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
transition: background-color 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.version-badge:hover {
|
||||
background-color: var(--version-badge-hover);
|
||||
}
|
||||
|
||||
footer {
|
||||
padding: 16px;
|
||||
text-align: center;
|
||||
color: var(--text-color);
|
||||
font-size: 0.9rem;
|
||||
background-color: var(--card-background);
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
footer a:hover {
|
||||
color: #0056b3;
|
||||
}
|
||||
|
||||
/* 暗色模式 */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--background-color: #121212;
|
||||
/* 深灰色背景 */
|
||||
--card-background: #1e1e1e;
|
||||
/* 卡片背景稍浅 */
|
||||
--text-color: #ffffff;
|
||||
/* 纯白文本 */
|
||||
--primary-color: #0a84ff;
|
||||
/* 按钮蓝色 */
|
||||
--secondary-color: #30d158;
|
||||
/* 次要按钮绿色 */
|
||||
--border-color: #3a3a3a;
|
||||
/* 边框颜色 */
|
||||
--input-background: #2c2c2c;
|
||||
/* 输入框背景 */
|
||||
--input-border: #4a4a4a;
|
||||
/* 输入框边框 */
|
||||
--pre-background: #3b3636;
|
||||
/* 代码块背景 */
|
||||
--pre-text-color: #ffffff;
|
||||
/* 代码块文本颜色 */
|
||||
--version-badge-hover: #39c5bc9a;
|
||||
/* 说明文字颜色 */
|
||||
--muted-text-color: #a0a0a0;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--background-color);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
p,
|
||||
span,
|
||||
a,
|
||||
li {
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
.card {
|
||||
background-color: var(--card-background);
|
||||
color: var(--text-color);
|
||||
border: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.btn-outline-secondary {
|
||||
border-radius: 50%;
|
||||
padding: 6px;
|
||||
transition: background-color 0.3s ease-in-out, color 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.btn-outline-secondary:hover {
|
||||
background-color: var(--primary-color);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.toast {
|
||||
background-color: var(--card-background);
|
||||
color: var(--text-color);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.toast-body {
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
|
||||
.form-control {
|
||||
background-color: var(--input-background);
|
||||
border: 1px solid var(--input-border);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
.bg-light {
|
||||
background-color: var(--card-background) !important;
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: var(--pre-background);
|
||||
color: var(--pre-text-color);
|
||||
}
|
||||
|
||||
footer {
|
||||
background-color: var(--card-background);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: var(--primary-color);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<link href="style.css" rel="stylesheet">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
|
@ -349,92 +97,7 @@
|
|||
<div id="versionBadge" class="version-badge"></div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script>
|
||||
const githubForm = document.getElementById('github-form');
|
||||
const githubLinkInput = document.getElementById('githubLinkInput');
|
||||
const formattedLinkOutput = document.getElementById('formattedLinkOutput');
|
||||
const output = document.getElementById('output');
|
||||
const copyButton = document.getElementById('copyButton');
|
||||
const openButton = document.getElementById('openButton');
|
||||
const toast = new bootstrap.Toast(document.getElementById('toast'));
|
||||
|
||||
function showToast(message) {
|
||||
const toastBody = document.querySelector('.toast-body');
|
||||
toastBody.textContent = message;
|
||||
toast.show();
|
||||
}
|
||||
|
||||
function formatGithubLink(githubLink) {
|
||||
const currentHost = window.location.host;
|
||||
let formattedLink = "";
|
||||
|
||||
if (githubLink.startsWith("https://github.com/") || githubLink.startsWith("http://github.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/github.com" + githubLink.substring(githubLink.indexOf("/", 8));
|
||||
} else if (githubLink.startsWith("github.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/" + githubLink;
|
||||
} else if (githubLink.startsWith("https://raw.githubusercontent.com/") || githubLink.startsWith("http://raw.githubusercontent.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + githubLink.substring(githubLink.indexOf("/", 7));
|
||||
} else if (githubLink.startsWith("raw.githubusercontent.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/" + githubLink;
|
||||
} else if (githubLink.startsWith("https://gist.githubusercontent.com/") || githubLink.startsWith("http://gist.githubusercontent.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/gist.github.com" + githubLink.substring(githubLink.indexOf("/", 18));
|
||||
} else if (githubLink.startsWith("gist.githubusercontent.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/" + githubLink;
|
||||
} else {
|
||||
showToast('请输入有效的GitHub链接');
|
||||
return null;
|
||||
}
|
||||
|
||||
return formattedLink;
|
||||
}
|
||||
|
||||
githubForm.addEventListener('submit', function (e) {
|
||||
e.preventDefault();
|
||||
const formattedLink = formatGithubLink(githubLinkInput.value);
|
||||
if (formattedLink) {
|
||||
formattedLinkOutput.textContent = formattedLink;
|
||||
output.style.display = 'block';
|
||||
}
|
||||
});
|
||||
|
||||
copyButton.addEventListener('click', function () {
|
||||
navigator.clipboard.writeText(formattedLinkOutput.textContent).then(() => {
|
||||
showToast('链接已复制到剪贴板');
|
||||
});
|
||||
});
|
||||
|
||||
openButton.addEventListener('click', function () {
|
||||
window.open(formattedLinkOutput.textContent, '_blank');
|
||||
});
|
||||
|
||||
function fetchAPI() {
|
||||
fetch('/api/size_limit')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
document.getElementById('sizeLimitDisplay').textContent = `${data.MaxResponseBodySize} MB`;
|
||||
});
|
||||
|
||||
fetch('/api/whitelist/status')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
document.getElementById('whiteListStatus').textContent = data.Whitelist ? '已开启' : '已关闭';
|
||||
});
|
||||
|
||||
fetch('/api/blacklist/status')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
document.getElementById('blackListStatus').textContent = data.Blacklist ? '已开启' : '已关闭';
|
||||
});
|
||||
|
||||
fetch('/api/version')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
document.getElementById('versionBadge').textContent = data.Version;
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', fetchAPI);
|
||||
</script>
|
||||
<script src="script.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
84
pages/bootstrap/script.js
Normal file
84
pages/bootstrap/script.js
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
const githubForm = document.getElementById('github-form');
|
||||
const githubLinkInput = document.getElementById('githubLinkInput');
|
||||
const formattedLinkOutput = document.getElementById('formattedLinkOutput');
|
||||
const output = document.getElementById('output');
|
||||
const copyButton = document.getElementById('copyButton');
|
||||
const openButton = document.getElementById('openButton');
|
||||
const toast = new bootstrap.Toast(document.getElementById('toast'));
|
||||
|
||||
function showToast(message) {
|
||||
const toastBody = document.querySelector('.toast-body');
|
||||
toastBody.textContent = message;
|
||||
toast.show();
|
||||
}
|
||||
|
||||
function formatGithubLink(githubLink) {
|
||||
const currentHost = window.location.host;
|
||||
let formattedLink = "";
|
||||
|
||||
if (githubLink.startsWith("https://github.com/") || githubLink.startsWith("http://github.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/github.com" + githubLink.substring(githubLink.indexOf("/", 8));
|
||||
} else if (githubLink.startsWith("github.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/" + githubLink;
|
||||
} else if (githubLink.startsWith("https://raw.githubusercontent.com/") || githubLink.startsWith("http://raw.githubusercontent.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + githubLink.substring(githubLink.indexOf("/", 7));
|
||||
} else if (githubLink.startsWith("raw.githubusercontent.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/" + githubLink;
|
||||
} else if (githubLink.startsWith("https://gist.githubusercontent.com/") || githubLink.startsWith("http://gist.githubusercontent.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/gist.github.com" + githubLink.substring(githubLink.indexOf("/", 18));
|
||||
} else if (githubLink.startsWith("gist.githubusercontent.com/")) {
|
||||
formattedLink = window.location.protocol + "//" + currentHost + "/" + githubLink;
|
||||
} else {
|
||||
showToast('请输入有效的GitHub链接');
|
||||
return null;
|
||||
}
|
||||
|
||||
return formattedLink;
|
||||
}
|
||||
|
||||
githubForm.addEventListener('submit', function (e) {
|
||||
e.preventDefault();
|
||||
const formattedLink = formatGithubLink(githubLinkInput.value);
|
||||
if (formattedLink) {
|
||||
formattedLinkOutput.textContent = formattedLink;
|
||||
output.style.display = 'block';
|
||||
}
|
||||
});
|
||||
|
||||
copyButton.addEventListener('click', function () {
|
||||
navigator.clipboard.writeText(formattedLinkOutput.textContent).then(() => {
|
||||
showToast('链接已复制到剪贴板');
|
||||
});
|
||||
});
|
||||
|
||||
openButton.addEventListener('click', function () {
|
||||
window.open(formattedLinkOutput.textContent, '_blank');
|
||||
});
|
||||
|
||||
function fetchAPI() {
|
||||
fetch('/api/size_limit')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
document.getElementById('sizeLimitDisplay').textContent = `${data.MaxResponseBodySize} MB`;
|
||||
});
|
||||
|
||||
fetch('/api/whitelist/status')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
document.getElementById('whiteListStatus').textContent = data.Whitelist ? '已开启' : '已关闭';
|
||||
});
|
||||
|
||||
fetch('/api/blacklist/status')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
document.getElementById('blackListStatus').textContent = data.Blacklist ? '已开启' : '已关闭';
|
||||
});
|
||||
|
||||
fetch('/api/version')
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
document.getElementById('versionBadge').textContent = data.Version;
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', fetchAPI);
|
||||
259
pages/bootstrap/style.css
Normal file
259
pages/bootstrap/style.css
Normal file
|
|
@ -0,0 +1,259 @@
|
|||
/* 通用样式 */
|
||||
:root {
|
||||
--primary-color: #007aff;
|
||||
/* 主要按钮颜色 */
|
||||
--secondary-color: #34c759;
|
||||
/* 次要按钮颜色 */
|
||||
--background-color: #f9f9f9;
|
||||
/* 亮色模式背景 */
|
||||
--card-background: #ffffff;
|
||||
/* 卡片背景 */
|
||||
--text-color: #333333;
|
||||
/* 亮色模式文本颜色 */
|
||||
--border-color: #e0e0e0;
|
||||
/* 边框颜色 */
|
||||
--input-background: #ffffff;
|
||||
/* 输入框背景 */
|
||||
--input-border: #d1d1d6;
|
||||
/* 输入框边框 */
|
||||
--pre-background: #f1f3f4;
|
||||
/* 代码块背景 */
|
||||
--pre-text-color: #333333;
|
||||
/* 代码块文本颜色 */
|
||||
--version-badge-hover: #39c5bb;
|
||||
/* 说明文字颜色 */
|
||||
--muted-text-color: #6c757d;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--background-color);
|
||||
color: var(--text-color);
|
||||
font-family: sans-serif;
|
||||
line-height: 1.8;
|
||||
font-size: 15px;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
color: var(--text-color);
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.5px;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
p,
|
||||
span,
|
||||
a,
|
||||
li {
|
||||
color: var(--text-color);
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: #0056b3;
|
||||
}
|
||||
|
||||
.card {
|
||||
background-color: var(--card-background);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 8px;
|
||||
padding: 16px;
|
||||
margin: 16px 0;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
|
||||
transform: translateY(-4px);
|
||||
}
|
||||
|
||||
.btn-outline-secondary {
|
||||
border-radius: 50%;
|
||||
padding: 6px;
|
||||
transition: #e9e9e9 0.3s ease-in-out, color 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.btn-outline-secondary:hover {
|
||||
background-color: var(--primary-color);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.form-control {
|
||||
background-color: var(--input-background);
|
||||
border: 1px solid var(--input-border);
|
||||
color: var(--text-color);
|
||||
padding: 10px;
|
||||
border-radius: 4px;
|
||||
font-size: 14px;
|
||||
outline: none;
|
||||
transition: border-color 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.form-control:focus {
|
||||
border-color: var(--primary-color);
|
||||
box-shadow: 0 0 0 3px rgba(10, 132, 255, 0.3);
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
color: var(--muted-text-color) !important;
|
||||
}
|
||||
|
||||
.bg-light {
|
||||
background-color: var(--card-background) !important;
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: var(--pre-background);
|
||||
color: var(--pre-text-color);
|
||||
padding: 16px;
|
||||
border-radius: 8px;
|
||||
overflow-x: auto;
|
||||
font-size: 14px;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.version-badge {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
right: 20px;
|
||||
background-color: var(--secondary-color);
|
||||
color: white;
|
||||
padding: 6px 12px;
|
||||
border-radius: 20px;
|
||||
font-size: 0.8rem;
|
||||
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
|
||||
transition: background-color 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.version-badge:hover {
|
||||
background-color: var(--version-badge-hover);
|
||||
}
|
||||
|
||||
footer {
|
||||
padding: 16px;
|
||||
text-align: center;
|
||||
color: var(--text-color);
|
||||
font-size: 0.9rem;
|
||||
background-color: var(--card-background);
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: var(--primary-color);
|
||||
}
|
||||
|
||||
footer a:hover {
|
||||
color: #0056b3;
|
||||
}
|
||||
|
||||
/* 暗色模式 */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--background-color: #121212;
|
||||
/* 深灰色背景 */
|
||||
--card-background: #1e1e1e;
|
||||
/* 卡片背景稍浅 */
|
||||
--text-color: #ffffff;
|
||||
/* 纯白文本 */
|
||||
--primary-color: #0a84ff;
|
||||
/* 按钮蓝色 */
|
||||
--secondary-color: #30d158;
|
||||
/* 次要按钮绿色 */
|
||||
--border-color: #3a3a3a;
|
||||
/* 边框颜色 */
|
||||
--input-background: #2c2c2c;
|
||||
/* 输入框背景 */
|
||||
--input-border: #4a4a4a;
|
||||
/* 输入框边框 */
|
||||
--pre-background: #3b3636;
|
||||
/* 代码块背景 */
|
||||
--pre-text-color: #ffffff;
|
||||
/* 代码块文本颜色 */
|
||||
--version-badge-hover: #39c5bc9a;
|
||||
/* 说明文字颜色 */
|
||||
--muted-text-color: #a0a0a0;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: var(--background-color);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6,
|
||||
p,
|
||||
span,
|
||||
a,
|
||||
li {
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
.card {
|
||||
background-color: var(--card-background);
|
||||
color: var(--text-color);
|
||||
border: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.btn-outline-secondary {
|
||||
border-radius: 50%;
|
||||
padding: 6px;
|
||||
transition: background-color 0.3s ease-in-out, color 0.3s ease-in-out;
|
||||
}
|
||||
|
||||
.btn-outline-secondary:hover {
|
||||
background-color: var(--primary-color);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.toast {
|
||||
background-color: var(--card-background);
|
||||
color: var(--text-color);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.toast-body {
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
|
||||
.form-control {
|
||||
background-color: var(--input-background);
|
||||
border: 1px solid var(--input-border);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
.bg-light {
|
||||
background-color: var(--card-background) !important;
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: var(--pre-background);
|
||||
color: var(--pre-text-color);
|
||||
}
|
||||
|
||||
footer {
|
||||
background-color: var(--card-background);
|
||||
color: var(--text-color);
|
||||
}
|
||||
|
||||
footer a {
|
||||
color: var(--primary-color);
|
||||
}
|
||||
}
|
||||
|
|
@ -6,174 +6,15 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>GitHub加速服务</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<style>
|
||||
:root {
|
||||
--primary: #007aff;
|
||||
--secondary: #007aff;
|
||||
--background: #f9f9f9;
|
||||
--card-bg: #ffffff;
|
||||
--text: #333333;
|
||||
--border: #d1d1d6;
|
||||
--muted: #64748b;
|
||||
--success: #00a83ed2;
|
||||
--danger: #ce0000dd;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--background: #121212;
|
||||
--card-bg: #1e1e1e;
|
||||
--text: #ffffff;
|
||||
--border: #334155;
|
||||
--muted: #94a3b8;
|
||||
}
|
||||
|
||||
.form-control::placeholder {
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
color: var(--muted) !important;
|
||||
}
|
||||
|
||||
.btn-outline-secondary {
|
||||
color: var(--muted);
|
||||
border-color: var(--border);
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
color: var(--text) !important;
|
||||
}
|
||||
|
||||
.code-block {
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
}
|
||||
|
||||
.command-example {
|
||||
background: rgba(255, 255, 255, 0.03);
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
--bs-btn-bg: var(--primary);
|
||||
--bs-btn-border-color: var(--primary);
|
||||
--bs-btn-hover-bg: var(--secondary);
|
||||
--bs-btn-hover-border-color: var(--secondary);
|
||||
}
|
||||
|
||||
.form-control {
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
border-color: var(--border);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--secondary);
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
background: var(--background);
|
||||
color: var(--text);
|
||||
font-family: 'Inter', system-ui, sans-serif;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.main-card {
|
||||
background: var(--card-bg);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.main-card:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.code-block {
|
||||
background: rgba(37, 99, 235, 0.05);
|
||||
border-left: 3px solid var(--primary);
|
||||
border-radius: 6px;
|
||||
padding: 1rem;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
padding: 6px 12px;
|
||||
border-radius: 20px;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.guide-section {
|
||||
border-left: 3px solid var(--primary);
|
||||
padding-left: 1rem;
|
||||
margin: 2rem 0;
|
||||
}
|
||||
|
||||
.command-example {
|
||||
position: relative;
|
||||
padding: 1.25rem;
|
||||
background: rgba(37, 99, 235, 0.03);
|
||||
border-radius: 8px;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
.command-example::before {
|
||||
content: "➜";
|
||||
position: absolute;
|
||||
left: -1.5rem;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.toast {
|
||||
position: fixed;
|
||||
top: 1%;
|
||||
right: 1%;
|
||||
background-color: var(--card-background);
|
||||
color: var(--text-color);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.toast-body {
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
#version {
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
line-height: 26px;
|
||||
color: #747474;
|
||||
}
|
||||
|
||||
.bg-primary {
|
||||
--bs-bg-opacity: 1;
|
||||
background-color: #2c82de !important;
|
||||
}
|
||||
.bg-success {
|
||||
--bs-bg-opacity: 1;
|
||||
background-color: #2c82de !important;
|
||||
}
|
||||
.bg-danger {
|
||||
--bs-bg-opacity: 1;
|
||||
background-color: #2c82de !important;
|
||||
}
|
||||
</style>
|
||||
<link href="style.css" rel="stylesheet">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="container py-4 py-lg-5">
|
||||
<!-- 头部 -->
|
||||
<header class="text-center mb-5">
|
||||
<h1 class="display-5 fw-bold mb-3">GitHub加速服务</h1>
|
||||
<p class="lead text-muted">高速稳定的 GitHub 资源访问解决方案</p>
|
||||
</header>
|
||||
|
||||
<!-- 主功能区域 -->
|
||||
<div class="main-card p-4 mb-4">
|
||||
<form id="mainForm" class="mb-4">
|
||||
<div class="mb-3">
|
||||
|
|
@ -201,8 +42,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 服务状态 -->
|
||||
<div class="row g-3 mb-4">
|
||||
<div class="col-md-4">
|
||||
<div class="main-card p-3">
|
||||
|
|
@ -238,8 +77,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 详细使用指南 -->
|
||||
<div class="main-card p-4">
|
||||
<h2 class="h4 fw-bold mb-4">📚 详细使用指南</h2>
|
||||
|
||||
|
|
@ -253,7 +90,6 @@
|
|||
<li class="text-muted">❌ 不支持 SSH Git Clone</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="guide-section">
|
||||
<h3 class="h5 fw-semibold mb-3">基础用法示例</h3>
|
||||
<div class="command-example">
|
||||
|
|
@ -273,10 +109,8 @@
|
|||
class="d-block">curl -LO <span class="protocol">https</span>://<span class="host">example.com</span>/https://github.com/user/project/releases/download/v1.0.0/project_1.0.0.amd64.tar.gz</code>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="guide-section">
|
||||
<h3 class="h5 fw-semibold mb-3">支持的文件类型</h3>
|
||||
|
||||
<div class="row g-3">
|
||||
<div class="col-md-6">
|
||||
<div class="main-card p-3">
|
||||
|
|
@ -285,14 +119,12 @@
|
|||
class="d-block text-muted fs-sm">https://raw.githubusercontent.com/user/repo/main/file.txt</code>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="main-card p-3">
|
||||
<h4 class="h6 fw-medium mb-2">分支源码</h4>
|
||||
<code class="d-block text-muted fs-sm">https://github.com/user/repo/archive/main.zip</code>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="main-card p-3">
|
||||
<h4 class="h6 fw-medium mb-2">版本发布</h4>
|
||||
|
|
@ -300,7 +132,6 @@
|
|||
class="d-block text-muted fs-sm">https://github.com/user/repo/releases/download/v1.0.0/app.zip</code>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="main-card p-3">
|
||||
<h4 class="h6 fw-medium mb-2">Gist 文件</h4>
|
||||
|
|
@ -308,7 +139,6 @@
|
|||
class="d-block text-muted fs-sm">https://gist.githubusercontent.com/user/gist_id/raw/file.txt</code>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-6">
|
||||
<div class="main-card p-3">
|
||||
<h4 class="h6 fw-medium mb-2">HTTPS Git Clone</h4>
|
||||
|
|
@ -318,7 +148,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<footer class="text-center mt-5 text-muted">
|
||||
<p class="mb-0 small" id="version">v </p>
|
||||
<p class="mb-0 small">Copyright © 2024 - <span id="currentYear"></span> WJQSERVER-STUDIO<br>
|
||||
|
|
@ -327,148 +156,13 @@
|
|||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
|
||||
<!-- Toast 通知 -->
|
||||
<div class="toast-container position-fixed bottom-0 end-0 p-3">
|
||||
<div id="liveToast" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
|
||||
<div class="toast-body"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script>
|
||||
(() => {
|
||||
'use strict';
|
||||
|
||||
// 初始化基础配置
|
||||
const currentYear = new Date().getFullYear();
|
||||
document.getElementById('currentYear').textContent = currentYear;
|
||||
const toast = new bootstrap.Toast('#liveToast');
|
||||
|
||||
// DOM 元素
|
||||
const form = document.getElementById('mainForm');
|
||||
const input = document.getElementById('inputUrl');
|
||||
const output = document.getElementById('output');
|
||||
const outputLink = document.getElementById('outputLink');
|
||||
|
||||
// 获取当前域名
|
||||
const CURRENT_PROTOCOL = window.location.protocol.replace(':', '');
|
||||
const CURRENT_HOST = window.location.host;
|
||||
// 替换协议部分
|
||||
document.querySelectorAll('code .protocol').forEach(span => {
|
||||
span.textContent = CURRENT_PROTOCOL;
|
||||
});
|
||||
// 替换域名部分
|
||||
document.querySelectorAll('code .host').forEach(span => {
|
||||
span.textContent = CURRENT_HOST;
|
||||
});
|
||||
|
||||
// URL 转换规则
|
||||
const URL_RULES = [
|
||||
{
|
||||
regex: /^(?:https?:\/\/)?(?:www\.)?(github\.com\/.*)/i,
|
||||
build: path => `${location.protocol}//${location.host}/${path}`
|
||||
},
|
||||
{
|
||||
regex: /^(?:https?:\/\/)?(raw\.githubusercontent\.com\/.*)/i,
|
||||
build: path => `${location.protocol}//${location.host}/${path}`
|
||||
},
|
||||
{
|
||||
regex: /^(?:https?:\/\/)?(gist\.(?:githubusercontent|github)\.com\/.*)/i,
|
||||
build: path => `${location.protocol}//${location.host}/${path}`
|
||||
}
|
||||
];
|
||||
|
||||
// 核心功能:链接转换
|
||||
function transformGitHubURL(url) {
|
||||
const cleanURL = url.trim().replace(/^https?:\/\//i, '');
|
||||
for (const rule of URL_RULES) {
|
||||
const match = cleanURL.match(rule.regex);
|
||||
if (match) return rule.build(match[1]);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 事件处理
|
||||
form.addEventListener('submit', e => {
|
||||
e.preventDefault();
|
||||
|
||||
if (!input.checkValidity()) {
|
||||
input.classList.add('is-invalid');
|
||||
showToast('⚠️ 请输入有效的 GitHub 链接');
|
||||
return;
|
||||
}
|
||||
|
||||
const result = transformGitHubURL(input.value);
|
||||
if (!result) {
|
||||
showToast('❌ 不支持的链接格式');
|
||||
return;
|
||||
}
|
||||
|
||||
outputLink.textContent = result;
|
||||
output.hidden = false;
|
||||
window.scrollTo({ top: output.offsetTop - 100, behavior: 'smooth' });
|
||||
});
|
||||
|
||||
document.getElementById('copyBtn').addEventListener('click', async () => {
|
||||
try {
|
||||
await navigator.clipboard.writeText(outputLink.textContent);
|
||||
showToast('✅ 链接已复制');
|
||||
} catch {
|
||||
showToast('❌ 复制失败');
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById('openBtn').addEventListener('click', () => {
|
||||
window.open(outputLink.textContent, '_blank', 'noopener,noreferrer');
|
||||
});
|
||||
|
||||
// 服务状态监控
|
||||
async function loadServiceStatus() {
|
||||
try {
|
||||
const [size, whitelist, blacklist, version] = await Promise.all([
|
||||
fetchJSON('/api/size_limit'),
|
||||
fetchJSON('/api/whitelist/status'),
|
||||
fetchJSON('/api/blacklist/status'),
|
||||
fetchJSON('/api/version')
|
||||
]);
|
||||
|
||||
updateStatus('sizeLimit', `${size.MaxResponseBodySize}MB`);
|
||||
updateStatus('whitelistStatus', whitelist.Whitelist ? '已开启' : '已关闭');
|
||||
updateStatus('blacklistStatus', blacklist.Blacklist ? '已开启' : '已关闭');
|
||||
updateStatus('version', `Version ${version.Version}`);
|
||||
} catch {
|
||||
showToast('⚠️ 服务状态获取失败');
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchJSON(url) {
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) throw new Error('API Error');
|
||||
return response.json();
|
||||
}
|
||||
|
||||
function updateStatus(elementId, text) {
|
||||
const element = document.getElementById(elementId);
|
||||
if (element) element.textContent = text;
|
||||
}
|
||||
|
||||
// 工具函数
|
||||
function showToast(message) {
|
||||
const toastBody = document.querySelector('.toast-body');
|
||||
toastBody.textContent = message;
|
||||
toast.show();
|
||||
}
|
||||
|
||||
// 初始化
|
||||
input.addEventListener('input', () => {
|
||||
input.classList.remove('is-invalid');
|
||||
if (output.hidden === false) output.hidden = true;
|
||||
});
|
||||
|
||||
loadServiceStatus();
|
||||
})();
|
||||
</script>
|
||||
<script src="script.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
131
pages/nebula/script.js
Normal file
131
pages/nebula/script.js
Normal file
|
|
@ -0,0 +1,131 @@
|
|||
(() => {
|
||||
'use strict';
|
||||
|
||||
// 初始化基础配置
|
||||
const currentYear = new Date().getFullYear();
|
||||
document.getElementById('currentYear').textContent = currentYear;
|
||||
const toast = new bootstrap.Toast('#liveToast');
|
||||
|
||||
// DOM 元素
|
||||
const form = document.getElementById('mainForm');
|
||||
const input = document.getElementById('inputUrl');
|
||||
const output = document.getElementById('output');
|
||||
const outputLink = document.getElementById('outputLink');
|
||||
|
||||
// 获取当前域名
|
||||
const CURRENT_PROTOCOL = window.location.protocol.replace(':', '');
|
||||
const CURRENT_HOST = window.location.host;
|
||||
// 替换协议部分
|
||||
document.querySelectorAll('code .protocol').forEach(span => {
|
||||
span.textContent = CURRENT_PROTOCOL;
|
||||
});
|
||||
// 替换域名部分
|
||||
document.querySelectorAll('code .host').forEach(span => {
|
||||
span.textContent = CURRENT_HOST;
|
||||
});
|
||||
|
||||
// URL 转换规则
|
||||
const URL_RULES = [
|
||||
{
|
||||
regex: /^(?:https?:\/\/)?(?:www\.)?(github\.com\/.*)/i,
|
||||
build: path => `${location.protocol}//${location.host}/${path}`
|
||||
},
|
||||
{
|
||||
regex: /^(?:https?:\/\/)?(raw\.githubusercontent\.com\/.*)/i,
|
||||
build: path => `${location.protocol}//${location.host}/${path}`
|
||||
},
|
||||
{
|
||||
regex: /^(?:https?:\/\/)?(gist\.(?:githubusercontent|github)\.com\/.*)/i,
|
||||
build: path => `${location.protocol}//${location.host}/${path}`
|
||||
}
|
||||
];
|
||||
|
||||
// 核心功能:链接转换
|
||||
function transformGitHubURL(url) {
|
||||
const cleanURL = url.trim().replace(/^https?:\/\//i, '');
|
||||
for (const rule of URL_RULES) {
|
||||
const match = cleanURL.match(rule.regex);
|
||||
if (match) return rule.build(match[1]);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 事件处理
|
||||
form.addEventListener('submit', e => {
|
||||
e.preventDefault();
|
||||
|
||||
if (!input.checkValidity()) {
|
||||
input.classList.add('is-invalid');
|
||||
showToast('⚠️ 请输入有效的 GitHub 链接');
|
||||
return;
|
||||
}
|
||||
|
||||
const result = transformGitHubURL(input.value);
|
||||
if (!result) {
|
||||
showToast('❌ 不支持的链接格式');
|
||||
return;
|
||||
}
|
||||
|
||||
outputLink.textContent = result;
|
||||
output.hidden = false;
|
||||
window.scrollTo({ top: output.offsetTop - 100, behavior: 'smooth' });
|
||||
});
|
||||
|
||||
document.getElementById('copyBtn').addEventListener('click', async () => {
|
||||
try {
|
||||
await navigator.clipboard.writeText(outputLink.textContent);
|
||||
showToast('✅ 链接已复制');
|
||||
} catch {
|
||||
showToast('❌ 复制失败');
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById('openBtn').addEventListener('click', () => {
|
||||
window.open(outputLink.textContent, '_blank', 'noopener,noreferrer');
|
||||
});
|
||||
|
||||
// 服务状态监控
|
||||
async function loadServiceStatus() {
|
||||
try {
|
||||
const [size, whitelist, blacklist, version] = await Promise.all([
|
||||
fetchJSON('/api/size_limit'),
|
||||
fetchJSON('/api/whitelist/status'),
|
||||
fetchJSON('/api/blacklist/status'),
|
||||
fetchJSON('/api/version')
|
||||
]);
|
||||
|
||||
updateStatus('sizeLimit', `${size.MaxResponseBodySize}MB`);
|
||||
updateStatus('whitelistStatus', whitelist.Whitelist ? '已开启' : '已关闭');
|
||||
updateStatus('blacklistStatus', blacklist.Blacklist ? '已开启' : '已关闭');
|
||||
updateStatus('version', `Version ${version.Version}`);
|
||||
} catch {
|
||||
showToast('⚠️ 服务状态获取失败');
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchJSON(url) {
|
||||
const response = await fetch(url);
|
||||
if (!response.ok) throw new Error('API Error');
|
||||
return response.json();
|
||||
}
|
||||
|
||||
function updateStatus(elementId, text) {
|
||||
const element = document.getElementById(elementId);
|
||||
if (element) element.textContent = text;
|
||||
}
|
||||
|
||||
// 工具函数
|
||||
function showToast(message) {
|
||||
const toastBody = document.querySelector('.toast-body');
|
||||
toastBody.textContent = message;
|
||||
toast.show();
|
||||
}
|
||||
|
||||
// 初始化
|
||||
input.addEventListener('input', () => {
|
||||
input.classList.remove('is-invalid');
|
||||
if (output.hidden === false) output.hidden = true;
|
||||
});
|
||||
|
||||
loadServiceStatus();
|
||||
})();
|
||||
157
pages/nebula/style.css
Normal file
157
pages/nebula/style.css
Normal file
|
|
@ -0,0 +1,157 @@
|
|||
:root {
|
||||
--primary: #007aff;
|
||||
--secondary: #007aff;
|
||||
--background: #f9f9f9;
|
||||
--card-bg: #ffffff;
|
||||
--text: #333333;
|
||||
--border: #d1d1d6;
|
||||
--muted: #64748b;
|
||||
--success: #00a83ed2;
|
||||
--danger: #ce0000dd;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--background: #121212;
|
||||
--card-bg: #1e1e1e;
|
||||
--text: #ffffff;
|
||||
--border: #334155;
|
||||
--muted: #94a3b8;
|
||||
}
|
||||
|
||||
.form-control::placeholder {
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.text-muted {
|
||||
color: var(--muted) !important;
|
||||
}
|
||||
|
||||
.btn-outline-secondary {
|
||||
color: var(--muted);
|
||||
border-color: var(--border);
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
color: var(--text) !important;
|
||||
}
|
||||
|
||||
.code-block {
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
}
|
||||
|
||||
.command-example {
|
||||
background: rgba(255, 255, 255, 0.03);
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
--bs-btn-bg: var(--primary);
|
||||
--bs-btn-border-color: var(--primary);
|
||||
--bs-btn-hover-bg: var(--secondary);
|
||||
--bs-btn-hover-border-color: var(--secondary);
|
||||
}
|
||||
|
||||
.form-control {
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
border-color: var(--border);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--secondary);
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
background: var(--background);
|
||||
color: var(--text);
|
||||
font-family: 'Inter', system-ui, sans-serif;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.main-card {
|
||||
background: var(--card-bg);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: 12px;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
||||
transition: transform 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.main-card:hover {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.code-block {
|
||||
background: rgba(37, 99, 235, 0.05);
|
||||
border-left: 3px solid var(--primary);
|
||||
border-radius: 6px;
|
||||
padding: 1rem;
|
||||
position: relative;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.status-badge {
|
||||
padding: 6px 12px;
|
||||
border-radius: 20px;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.guide-section {
|
||||
border-left: 3px solid var(--primary);
|
||||
padding-left: 1rem;
|
||||
margin: 2rem 0;
|
||||
}
|
||||
|
||||
.command-example {
|
||||
position: relative;
|
||||
padding: 1.25rem;
|
||||
background: rgba(37, 99, 235, 0.03);
|
||||
border-radius: 8px;
|
||||
margin: 1rem 0;
|
||||
}
|
||||
|
||||
.command-example::before {
|
||||
content: "➜";
|
||||
position: absolute;
|
||||
left: -1.5rem;
|
||||
color: var(--muted);
|
||||
}
|
||||
|
||||
.toast {
|
||||
position: fixed;
|
||||
top: 1%;
|
||||
right: 1%;
|
||||
background-color: var(--card-background);
|
||||
color: var(--text-color);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 8px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.toast-body {
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
#version {
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
line-height: 26px;
|
||||
color: #747474;
|
||||
}
|
||||
|
||||
.bg-primary {
|
||||
--bs-bg-opacity: 1;
|
||||
background-color: #2c82de !important;
|
||||
}
|
||||
|
||||
.bg-success {
|
||||
--bs-bg-opacity: 1;
|
||||
background-color: #2c82de !important;
|
||||
}
|
||||
|
||||
.bg-danger {
|
||||
--bs-bg-opacity: 1;
|
||||
background-color: #2c82de !important;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue