Files
Cli-Proxy-API-Management-Ce…/styles.css
2025-09-06 17:11:39 +08:00

673 lines
12 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 全局样式 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
/* 更沉稳的浅色中性背景 */
background: linear-gradient(135deg, #e5e7eb 0%, #f3f4f6 100%);
min-height: 100vh;
color: #333;
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 20px;
}
/* 头部样式 */
.header {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-radius: 15px;
padding: 48px 28px; /* 再次拉长,适配更大 Logo */
margin-bottom: 20px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
}
.header-content {
display: flex;
justify-content: space-between;
align-items: center;
}
.header h1 {
color: #334155; /* slate-700 */
font-size: 1.6rem; /* 字体小一号 */
font-weight: 600;
}
.header h1.brand {
display: flex;
align-items: flex-end; /* 文字在 Logo 右下角(底对齐) */
gap: 18px;
line-height: 1; /* 减少标题内上下空白 */
}
.header h1 i {
color: #64748b; /* slate-500 */
margin-right: 10px;
}
/* 站点 Logo嵌入头部 */
#site-logo {
height: 88px; /* 继续增大 Logo */
width: auto;
display: inline-block;
object-fit: contain;
border-radius: 6px;
padding: 2px;
background: #fff;
border: 1px solid rgba(15, 23, 42, 0.06);
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06);
}
.brand-title {
display: inline-block;
line-height: 1.1; /* 保持原字号不变,同时更紧凑 */
margin-bottom: 4px; /* 让文字更贴近更高的 Logo 底部 */
}
/* 小屏幕适配:避免 Logo 过大占位 */
@media (max-width: 640px) {
#site-logo { height: 64px; }
}
.header-actions {
display: flex;
gap: 10px;
}
/* 认证区域 */
.auth-section {
margin-bottom: 20px;
}
/* 主要内容区域 */
.main-content {
display: flex;
gap: 20px;
}
/* 侧边栏 */
.sidebar {
width: 250px;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-radius: 15px;
padding: 20px;
height: fit-content;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
}
.nav-menu {
list-style: none;
}
.nav-menu li {
margin-bottom: 8px;
}
.nav-item {
display: flex;
align-items: center;
padding: 12px 16px;
color: #475569; /* slate-600 */
text-decoration: none;
border-radius: 10px;
transition: all 0.3s ease;
border: 2px solid transparent;
}
.nav-item:hover {
background: rgba(71, 85, 105, 0.12); /* slate-600 @ 12% */
color: #475569;
}
.nav-item.active {
background: linear-gradient(135deg, #475569, #334155);
color: white;
box-shadow: 0 4px 15px rgba(51, 65, 85, 0.35);
}
.nav-item i {
margin-right: 10px;
width: 20px;
}
/* 内容区域 */
.content-area {
flex: 1;
}
.content-section {
display: none;
}
.content-section.active {
display: block;
}
.content-section h2 {
color: #334155; /* 更稳重的标题色 */
margin-bottom: 20px;
font-size: 1.5rem;
font-weight: 600;
}
/* 卡片样式 */
.card {
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(10px);
border-radius: 15px;
margin-bottom: 20px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1);
overflow: hidden;
}
.card-header {
background: linear-gradient(135deg, #f8fafc, #f1f5f9);
padding: 20px;
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
display: flex;
justify-content: space-between;
align-items: center;
}
.card-header h3 {
color: #334155;
font-size: 1.2rem;
font-weight: 600;
}
.card-header h3 i {
color: #64748b;
margin-right: 10px;
}
.card-content {
padding: 20px;
}
/* 按钮样式 */
.btn {
padding: 10px 20px;
border: none;
border-radius: 8px;
cursor: pointer;
font-size: 14px;
font-weight: 500;
transition: all 0.3s ease;
display: inline-flex;
align-items: center;
gap: 8px;
text-decoration: none;
}
.btn-primary {
background: linear-gradient(135deg, #475569, #334155);
color: white;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(51, 65, 85, 0.45);
}
.btn-secondary {
background: #e2e8f0;
color: #4a5568;
}
.btn-secondary:hover {
background: #cbd5e0;
transform: translateY(-1px);
}
.btn-danger {
background: linear-gradient(135deg, #ef4444, #b91c1c);
color: white;
}
.btn-danger:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(185, 28, 28, 0.45);
}
.btn-success {
background: linear-gradient(135deg, #22c55e, #15803d);
color: white;
}
.btn-success:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(21, 128, 61, 0.45);
}
.btn:disabled {
opacity: 0.6;
cursor: not-allowed;
transform: none !important;
}
/* 表单元素 */
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
margin-bottom: 8px;
color: #4a5568;
font-weight: 500;
}
.form-hint {
margin-top: 6px;
color: #64748b; /* slate-500 */
font-size: 12px;
}
.input-group {
display: flex;
gap: 10px;
align-items: center;
}
input[type="text"],
input[type="password"],
input[type="number"],
input[type="url"],
textarea,
select {
flex: 1;
padding: 12px 16px;
border: 2px solid #e2e8f0;
border-radius: 8px;
font-size: 14px;
transition: all 0.3s ease;
background: white;
}
input:focus,
textarea:focus,
select:focus {
outline: none;
border-color: #475569;
box-shadow: 0 0 0 3px rgba(71, 85, 105, 0.15);
}
/* 切换开关 */
.toggle-group {
display: flex;
align-items: center;
gap: 15px;
margin-bottom: 15px;
}
.toggle-switch {
position: relative;
display: inline-block;
width: 50px;
height: 25px;
}
.toggle-switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #ccc;
transition: .4s;
border-radius: 25px;
}
.slider:before {
position: absolute;
content: "";
height: 19px;
width: 19px;
left: 3px;
bottom: 3px;
background-color: white;
transition: .4s;
border-radius: 50%;
}
input:checked + .slider {
background: linear-gradient(135deg, #475569, #334155);
}
input:checked + .slider:before {
transform: translateX(25px);
}
.toggle-label {
color: #475569;
font-weight: 500;
}
/* 列表样式 */
.key-list,
.provider-list,
.file-list {
max-height: 400px;
overflow-y: auto;
}
.key-item,
.provider-item,
.file-item {
background: #f7fafc;
border: 1px solid #e2e8f0;
border-radius: 8px;
padding: 15px;
margin-bottom: 10px;
display: flex;
justify-content: space-between;
align-items: center;
transition: all 0.3s ease;
}
.key-item:hover,
.provider-item:hover,
.file-item:hover {
background: #edf2f7;
border-color: #cbd5e0;
transform: translateY(-1px);
}
.item-content {
flex: 1;
}
.item-actions {
display: flex;
gap: 8px;
}
.item-title {
font-weight: 600;
color: #2d3748;
margin-bottom: 4px;
}
.item-subtitle {
color: #718096;
font-size: 0.9rem;
}
.item-value {
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
background: #edf2f7;
padding: 4px 8px;
border-radius: 4px;
font-size: 0.85rem;
color: #4a5568;
word-break: break-all;
}
/* 状态信息 */
.status-info {
background: #f7fafc;
border-radius: 8px;
padding: 20px;
}
.status-item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
padding-bottom: 15px;
border-bottom: 1px solid #e2e8f0;
}
.status-item:last-child {
margin-bottom: 0;
padding-bottom: 0;
border-bottom: none;
}
.status-label {
font-weight: 600;
color: #4a5568;
}
.status-value {
color: #718096;
}
/* 模态框 */
.modal {
display: none;
position: fixed;
z-index: 1000;
left: 0;
top: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
backdrop-filter: blur(5px);
}
.modal-content {
background-color: white;
margin: 10% auto;
padding: 0;
border-radius: 15px;
width: 90%;
max-width: 500px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
animation: modalSlideIn 0.3s ease;
}
@keyframes modalSlideIn {
from {
opacity: 0;
transform: translateY(-50px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.close {
color: #aaa;
float: right;
font-size: 28px;
font-weight: bold;
padding: 20px;
cursor: pointer;
}
.close:hover,
.close:focus {
color: #475569;
}
#modal-body {
padding: 0 30px 30px 30px;
}
/* 通知 */
.notification {
position: fixed;
top: 20px;
right: 20px;
padding: 15px 20px;
border-radius: 8px;
color: white;
font-weight: 500;
z-index: 1001;
transform: translateX(400px);
transition: all 0.3s ease;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
}
.notification.show {
transform: translateX(0);
}
.notification.success {
background: linear-gradient(135deg, #68d391, #38a169);
}
.notification.error {
background: linear-gradient(135deg, #fc8181, #e53e3e);
}
.notification.info {
background: linear-gradient(135deg, #63b3ed, #3182ce);
}
/* 响应式设计 */
@media (max-width: 768px) {
.main-content {
flex-direction: column;
}
.sidebar {
width: 100%;
order: 2;
}
.content-area {
order: 1;
}
.nav-menu {
display: flex;
overflow-x: auto;
gap: 10px;
}
.nav-menu li {
margin-bottom: 0;
flex-shrink: 0;
}
.header-content {
flex-direction: column;
gap: 15px;
text-align: center;
}
.input-group {
flex-direction: column;
align-items: stretch;
}
.card-header {
flex-direction: column;
gap: 15px;
align-items: flex-start;
}
.header-actions {
width: 100%;
justify-content: center;
}
}
/* 加载动画 */
.loading {
display: inline-block;
width: 20px;
height: 20px;
border: 3px solid rgba(255, 255, 255, 0.3);
border-radius: 50%;
border-top-color: #fff;
animation: spin 1s ease-in-out infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* 空状态 */
.empty-state {
text-align: center;
padding: 40px 20px;
color: #718096;
}
.empty-state i {
font-size: 48px;
margin-bottom: 16px;
color: #cbd5e0;
}
.empty-state h3 {
margin-bottom: 8px;
color: #4a5568;
}
/* 滚动条样式 */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 4px;
}
::-webkit-scrollbar-thumb {
background: linear-gradient(135deg, #475569, #334155);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: linear-gradient(135deg, #334155, #1f2937);
}
/* 连接状态指示器 */
.connection-indicator {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
margin-right: 8px;
}
.connection-indicator.connected {
background-color: #68d391;
box-shadow: 0 0 8px rgba(104, 211, 145, 0.6);
}
.connection-indicator.disconnected {
background-color: #fc8181;
box-shadow: 0 0 8px rgba(252, 129, 129, 0.6);
}
.connection-indicator.connecting {
background-color: #fbb040;
animation: pulse 1.5s infinite;
}
@keyframes pulse {
0% {
opacity: 1;
}
50% {
opacity: 0.5;
}
100% {
opacity: 1;
}
}