Files

1248 lines
27 KiB
CSS

/* public/style.css - 自定义样式 */
/* Alpine.js cloak - 防止初始化前元素闪现 */
[x-cloak] { display: none !important; }
/* 主页面使用宽屏布局,并保留固定的桌面端左右留白。 */
.app-page-wide {
width: 100%;
max-width: none;
margin-left: auto;
margin-right: auto;
padding-left: 200px;
padding-right: 200px;
}
@media (max-width: 1200px) {
.app-page-wide {
padding-left: 12px;
padding-right: 12px;
}
}
/* 顶部栏独立层,避免命中区域被同层元素抢占 */
.app-header {
isolation: isolate;
}
.header-top-controls {
position: relative;
z-index: 2;
}
.header-top-controls input,
.header-top-controls button {
position: relative;
z-index: 3;
pointer-events: auto;
}
/* 状态颜色 */
.status-badge {
padding: 2px 8px;
border-radius: 4px;
font-size: 11px;
font-weight: 600;
white-space: nowrap;
}
.status-未登录 { background: #e5e7eb; color: #374151; }
.status-无状态 { background: #f3f4f6; color: #6b7280; }
.status-已退款 { background: #dbeafe; color: #1e40af; }
.status-未退款 { background: #e0f2fe; color: #075985; }
.status-退款失败 { background: #ffedd5; color: #9a3412; }
.status-已申请退款 { background: #e5e7eb; color: #374151; }
.status-未发起 { background: #f3f4f6; color: #6b7280; }
.status-已发起 { background: #dbeafe; color: #1e40af; }
.status-发起失败 { background: #fee2e2; color: #991b1b; }
.status-google封号无法查询 { background: #fecaca; color: #991b1b; }
.status-gpt封号退款失败 { background: #fbcfe8; color: #9d174d; }
.status-gpt警告 { background: #fef3c7; color: #92400e; }
.status-已被改密无法查询 { background: #ede9fe; color: #6d28d9; }
.status-已被改2FA无法查询 { background: #dcfce7; color: #166534; }
.status-需要手机号查询 { background: #f3e8ff; color: #7e22ce; }
.status-无订阅 { background: #ecfccb; color: #3f6212; }
.status-等待已确认 { background: #fef3c7; color: #92400e; font-weight: 700; }
.status-账号本身已有会员 { background: #dbeafe; color: #1e40af; font-weight: 700; }
.status-登录成功 { background: #d1fae5; color: #065f46; }
.status-登录失败 { background: #fee2e2; color: #991b1b; }
.status-有资格 { background: #dbeafe; color: #1e40af; }
.status-无资格 { background: #f3f4f6; color: #6b7280; }
.status-认证成功 { background: #e0e7ff; color: #3730a3; }
.status-认证失败 { background: #fee2e2; color: #991b1b; }
.status-绑卡成功 { background: #fef3c7; color: #92400e; }
.status-绑卡失败 { background: #fee2e2; color: #991b1b; }
.status-改密成功 { background: #d1fae5; color: #065f46; }
.status-改密失败 { background: #fee2e2; color: #991b1b; }
.status-2FA修改成功 { background: #dbeafe; color: #1e40af; }
.status-2FA修改失败 { background: #fee2e2; color: #991b1b; }
.status-未验证已改密和2FA { background: #fef3c7; color: #92400e; font-weight: 700; }
.status-已验证改密和2FA { background: #d1fae5; color: #065f46; font-weight: 700; }
.status-ChatGPT成功 { background: #d1fae5; color: #065f46; }
.status-ChatGPT失败 { background: #fee2e2; color: #991b1b; }
.status-订阅成功 { background: #bbf7d0; color: #14532d; font-weight: 700; }
.status-已充值提取 { background: #ccfbf1; color: #115e59; font-weight: 700; }
.status-未违反规则 { background: #d1fae5; color: #065f46; font-weight: 600; }
.status-违反规则 { background: #fee2e2; color: #991b1b; font-weight: 600; }
.status-创建失败 { background: #fee2e2; color: #991b1b; }
/* 日志区域 */
#log-container {
font-family: 'Consolas', 'Monaco', monospace;
font-size: 12px;
background: #1e1e1e;
color: #d4d4d4;
padding: 12px;
border-radius: 6px;
height: 100%;
max-height: 100%;
overflow-y: auto;
line-height: 1.5;
}
#log-container .log-line {
padding: 1px 0;
}
#log-container .log-success { color: #4ec9b0; }
#log-container .log-error { color: #f44747; }
#log-container .log-warn { color: #dcdcaa; }
#log-container .log-info { color: #9cdcfe; }
/* 表格 */
table {
width: 100%;
border-collapse: collapse;
}
th {
background: #f3f4f6;
padding: 8px 10px;
text-align: left;
font-size: 12px;
font-weight: 600;
color: #374151;
border-bottom: 1px solid #e5e7eb;
white-space: nowrap;
position: sticky;
top: 0;
z-index: 1;
}
td {
padding: 6px 10px;
font-size: 12px;
color: #374151;
border-bottom: 1px solid #f3f4f6;
max-width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
tr:hover td { background: #f0f7ff; }
tr.selected td { background: #dbeafe; }
/* 诊断日志表格优化 */
.diag-table { max-height: 520px; }
.diag-thead th { position: sticky; top: 0; z-index: 2; }
/* 操作按钮 */
.btn {
height: 32px;
padding: 0 14px;
border-radius: 5px;
font-size: 13px;
font-weight: 500;
cursor: pointer;
border: none;
transition: opacity 0.15s;
display: inline-flex;
align-items: center;
justify-content: center;
white-space: nowrap;
flex-shrink: 0;
}
.btn:hover { opacity: 0.85; }
.btn:disabled { opacity: 0.4; cursor: not-allowed; }
.btn-primary { background: #3b82f6; color: white; }
.btn-green { background: #10b981; color: white; }
.btn-red { background: #ef4444; color: white; }
.btn-orange { background: #f59e0b; color: white; }
.btn-gray { background: #6b7280; color: white; }
.btn-blue { background: #2563eb; color: white; }
.btn-purple { background: #7c3aed; color: white; }
.btn-outline { background: #fff; color: #374151; border: 1px solid #d1d5db; }
.btn-sm { height: 26px; padding: 0 8px; font-size: 11px; }
/* 模态框 */
.modal-backdrop {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.4);
z-index: 100;
display: flex;
align-items: center;
justify-content: center;
}
.modal-box {
background: white;
border-radius: 8px;
padding: 24px;
max-width: 500px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
box-shadow: 0 20px 60px rgba(0,0,0,0.15);
}
/* 紧凑型弹窗 - 减小内边距 */
.modal-box.modal-compact {
padding: 16px 18px;
}
.chatgpt-status-cell {
display: flex;
align-items: center;
gap: 6px;
min-width: 0;
white-space: nowrap;
}
.chatgpt-session-trigger {
padding: 0;
border: 0;
background: transparent;
color: #2563eb;
font-size: 11px;
line-height: 20px;
cursor: pointer;
}
.chatgpt-session-trigger:hover {
color: #1d4ed8;
text-decoration: underline;
}
.chatgpt-session-modal {
width: min(860px, 92vw);
max-width: 860px;
overflow: hidden;
}
.chatgpt-session-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
margin-bottom: 12px;
}
.chatgpt-session-close {
width: 28px;
height: 28px;
flex: 0 0 28px;
border: 0;
border-radius: 4px;
background: transparent;
color: #6b7280;
font-size: 22px;
line-height: 26px;
cursor: pointer;
}
.chatgpt-session-close:hover {
background: #f3f4f6;
color: #111827;
}
.chatgpt-session-output {
width: 100%;
height: min(56vh, 520px);
min-height: 280px;
resize: none;
border: 1px solid #d1d5db;
border-radius: 5px;
background: #f9fafb;
color: #1f2937;
font-family: Consolas, "Courier New", monospace;
font-size: 12px;
line-height: 1.55;
padding: 12px;
white-space: pre;
overflow: auto;
}
.chatgpt-session-state {
display: flex;
align-items: center;
justify-content: center;
min-height: 280px;
border: 1px solid #e5e7eb;
border-radius: 5px;
background: #f9fafb;
color: #6b7280;
font-size: 13px;
}
.chatgpt-session-state--error {
border-color: #fecaca;
background: #fef2f2;
color: #b91c1c;
}
.chatgpt-session-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 12px;
}
.recharge-card-modal {
width: min(560px, 92vw);
max-width: 560px;
overflow: hidden;
}
.recharge-card-output {
height: 96px;
min-height: 96px;
white-space: pre-wrap;
overflow-wrap: anywhere;
}
.recharge-card-state {
min-height: 96px;
}
.staging-modal {
max-width: 1000px;
}
.staging-folder-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
max-height: 58vh;
overflow: auto;
padding: 2px;
}
.staging-folder {
width: 100%;
min-height: 76px;
display: flex;
align-items: center;
gap: 12px;
padding: 11px 12px;
color: #374151;
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 6px;
text-align: left;
cursor: pointer;
transition: border-color .15s, background .15s;
}
.staging-folder:hover {
border-color: #93c5fd;
background: #f8fbff;
}
.staging-folder__icon {
position: relative;
width: 30px;
height: 22px;
flex: 0 0 30px;
border-radius: 3px;
background: #eab308;
}
.staging-folder__icon::before {
content: '';
position: absolute;
left: 2px;
top: -5px;
width: 13px;
height: 7px;
border-radius: 3px 3px 0 0;
background: #ca8a04;
}
.staging-folder__body {
display: flex;
flex: 1;
min-width: 0;
flex-direction: column;
gap: 3px;
}
.staging-folder__name {
font-size: 13px;
color: #1f2937;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.staging-folder__meta,
.staging-folder__fields {
font-size: 11px;
color: #94a3b8;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.staging-folder__fields { color: #6d28d9; }
.staging-folder__arrow {
flex: 0 0 auto;
color: #94a3b8;
font-size: 22px;
}
.staging-empty {
grid-column: 1 / -1;
padding: 50px 16px;
color: #9ca3af;
text-align: center;
border: 1px dashed #d1d5db;
border-radius: 6px;
}
.staging-detail-header {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
}
.staging-output {
width: 100%;
height: 56vh;
min-height: 260px;
resize: vertical;
white-space: pre;
overflow: auto;
font-family: Consolas, "Courier New", monospace;
font-size: 12px;
line-height: 1.55;
color: #1f2937;
background: #f8fafc;
}
.staging-detail-actions {
flex-wrap: wrap;
}
.staging-browser-toggle {
position: relative;
display: flex;
align-items: center;
gap: 10px;
padding: 9px 10px;
border: 1px solid #e5e7eb;
border-radius: 6px;
cursor: pointer;
background: #f8fafc;
}
.staging-browser-toggle > span:first-child {
display: flex;
flex: 1;
min-width: 0;
flex-direction: column;
gap: 2px;
}
.staging-browser-toggle strong {
color: #374151;
font-size: 12px;
}
.staging-browser-toggle small {
color: #94a3b8;
font-size: 11px;
}
.staging-browser-toggle input {
position: absolute;
opacity: 0;
pointer-events: none;
}
.staging-browser-toggle__switch {
position: relative;
width: 36px;
height: 20px;
flex: 0 0 36px;
border-radius: 10px;
background: #cbd5e1;
transition: background .15s;
}
.staging-browser-toggle__switch::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 16px;
height: 16px;
border-radius: 50%;
background: #fff;
box-shadow: 0 1px 3px rgba(0,0,0,.2);
transition: transform .15s;
}
.staging-browser-toggle input:checked + .staging-browser-toggle__switch {
background: #2563eb;
}
.staging-browser-toggle input:checked + .staging-browser-toggle__switch::after {
transform: translateX(16px);
}
.staging-browser-toggle input:focus-visible + .staging-browser-toggle__switch {
box-shadow: 0 0 0 3px rgba(37,99,235,.2);
}
@media (max-width: 768px) {
.staging-folder-grid { grid-template-columns: 1fr; }
.staging-output { height: 48vh; }
}
/* 弹窗内小尺寸下拉 */
.modal-select {
width: auto;
min-width: 80px;
padding: 4px 8px;
font-size: 12px;
border: 1px solid #d1d5db;
border-radius: 5px;
outline: none;
height: 28px;
}
.modal-select:focus {
border-color: #3b82f6;
box-shadow: 0 0 0 2px rgba(59,130,246,0.15);
}
/* 选项卡 */
.tab-btn {
padding: 13px 20px;
border-radius: 5px 5px 0 0;
font-size: 13px;
font-weight: 500;
cursor: pointer;
border: none;
background: transparent;
color: #6b7280;
}
.tab-btn.active {
background: white;
color: #3b82f6;
border-bottom: 2px solid #3b82f6;
}
/* 输入框 */
input[type="text"], input[type="password"], input[type="number"], textarea, select {
width: 100%;
padding: 7px 10px;
border: 1px solid #d1d5db;
border-radius: 5px;
font-size: 13px;
outline: none;
}
.status-select {
font-size: 13px;
padding: 7px 10px;
line-height: 1.4;
height: 38px;
}
.edit-message-input {
padding: 7px 10px;
font-size: 13px;
line-height: 1.4;
height: 38px;
}
input:focus, textarea:focus, select:focus {
border-color: #3b82f6;
box-shadow: 0 0 0 2px rgba(59,130,246,0.15);
}
/* 设置页下拉框使用固定控件样式,避免浏览器原生 select 丢失高度和边框。 */
.settings-select {
display: block;
width: 100%;
height: 34px;
min-height: 34px;
box-sizing: border-box;
padding: 0 32px 0 10px;
border: 1px solid #d1d5db;
border-radius: 5px;
background-color: #fff;
color: #374151;
font-size: 13px;
line-height: 32px;
cursor: pointer;
}
.settings-select:hover { border-color: #9ca3af; }
.settings-select:focus {
border-color: #3b82f6;
box-shadow: 0 0 0 2px rgba(59,130,246,0.15);
}
/* 退款截止时间弹窗的单位选择框固定尺寸,避免回退成浏览器原生小控件。 */
.refund-deadline-unit-select {
flex: 0 0 110px;
width: 110px;
height: 34px;
min-height: 34px;
box-sizing: border-box;
margin: 0;
padding: 0 30px 0 10px;
border: 1px solid #c4b5fd;
border-radius: 6px;
background-color: #fff;
color: #4c1d95;
font-size: 13px;
line-height: 32px;
}
.refund-deadline-unit-select:hover { border-color: #8b5cf6; }
.refund-deadline-unit-select:focus {
border-color: #7c3aed;
box-shadow: 0 0 0 2px rgba(124,58,237,.16);
}
/* 进度条 */
.progress-bar {
height: 4px;
background: #e5e7eb;
border-radius: 2px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: #3b82f6;
transition: width 0.3s;
}
/* 连接状态 */
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
margin-right: 6px;
}
.status-dot.online { background: #10b981; }
.status-dot.offline { background: #ef4444; }
.status-dot.checking { background: #f59e0b; }
/* 表格容器 */
.table-container {
overflow: auto;
border: 1px solid #e5e7eb;
border-radius: 6px;
}
.account-pagination {
min-height: 34px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 10px;
padding: 3px 8px;
border: 1px solid #e5e7eb;
border-radius: 6px;
background: #fff;
flex-shrink: 0;
}
.account-pagination__summary {
color: #6b7280;
font-size: 12px;
white-space: nowrap;
}
.account-pagination__controls {
display: flex;
align-items: center;
gap: 4px;
}
.page-icon-btn {
width: 28px;
height: 26px;
display: inline-flex;
align-items: center;
justify-content: center;
border: 1px solid #d1d5db;
border-radius: 4px;
background: #fff;
color: #374151;
font-size: 17px;
line-height: 1;
cursor: pointer;
}
.page-icon-btn:hover:not(:disabled) { background: #f3f4f6; }
.page-icon-btn:disabled { color: #cbd5e1; cursor: default; }
.account-pagination__page {
min-width: 64px;
text-align: center;
color: #374151;
font-size: 12px;
font-variant-numeric: tabular-nums;
}
.account-page-size {
height: 26px;
padding: 0 6px;
border: 1px solid #d1d5db;
border-radius: 4px;
background: #fff;
color: #374151;
font-size: 12px;
}
/* 统计卡片栅格 - 7列 + 分隔线 + 2列 */
.stats-grid {
display: grid;
grid-template-columns: repeat(5, minmax(0, 1fr));
gap: 8px;
padding-top: 2px;
}
.stats-grid.stats-grid--six {
grid-template-columns: repeat(6, minmax(0, 1fr));
}
.stats-grid.stats-grid--seven {
grid-template-columns: repeat(7, minmax(0, 1fr));
}
.stats-divider {
background: #d1d5db;
border-radius: 1px;
grid-row: span 2;
}
.stat-card {
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 8px 12px;
cursor: pointer;
transition: all 0.15s ease;
box-shadow: 0 1px 2px rgba(0,0,0,0.03);
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
min-width: 0;
}
.stat-card:hover { border-color: #cbd5e1; transform: translateY(-1px); }
.stat-card.active { border-color: #3b82f6; box-shadow: 0 4px 12px rgba(59,130,246,0.12); }
.stat-card__title { font-size: 12px; color: #475569; white-space: nowrap; flex-shrink: 0; }
.stat-card__value { font-size: 18px; font-weight: 700; color: #111827; }
/* 顶部工具栏 */
.toolbar-row {
display: flex;
align-items: stretch;
width: 100%;
}
.toolbar-stack {
display: flex;
flex-direction: column;
gap: 8px;
width: 100%;
min-width: 0;
}
.toolbar-line {
display: flex;
align-items: center;
gap: 12px;
width: 100%;
min-width: 0;
flex-wrap: wrap;
}
.toolbar-left, .toolbar-right {
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
}
.toolbar-info { font-size: 12px; color: #6b7280; }
.search-box {
display: flex;
align-items: center;
gap: 6px;
}
input.search-input {
border: 1px solid #d1d5db;
border-radius: 5px;
outline: none;
font-size: 13px;
font-weight: 500;
width: 180px;
height: 32px;
padding: 0 10px;
box-sizing: border-box;
}
input.search-input:focus {
border-color: #3b82f6;
box-shadow: 0 0 0 2px rgba(59,130,246,0.15);
}
.account-filter-bar {
min-height: 42px;
display: flex;
flex-direction: column;
align-items: stretch;
gap: 6px;
padding: 6px 10px;
border-top: 1px solid #e2e8f0;
border-bottom: 1px solid #e2e8f0;
background: #f8fafc;
}
.account-filter-bar__header {
min-height: 30px;
display: flex;
align-items: center;
gap: 8px;
}
.account-filter-bar__title {
flex-shrink: 0;
color: #475569;
font-size: 11px;
font-weight: 700;
}
.account-filter-list {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
}
.account-filter-condition {
min-height: 34px;
display: inline-grid;
grid-template-columns: 20px 116px 94px minmax(132px, 190px) 26px;
align-items: center;
gap: 5px;
padding: 2px 4px;
border-left: 2px solid #94a3b8;
background: #fff;
}
.account-filter-condition select,
.account-filter-condition input[type="text"] {
width: 100%;
height: 30px;
padding: 0 8px;
color: #1f2937;
font-size: 12px;
box-sizing: border-box;
}
.account-filter-condition__index {
color: #64748b;
font-size: 10px;
font-weight: 700;
text-align: center;
}
.account-filter-condition__no-value {
color: #94a3b8;
font-size: 11px;
text-align: center;
}
.account-filter-remove {
width: 26px;
height: 26px;
border: 0;
background: transparent;
color: #94a3b8;
font-size: 18px;
line-height: 1;
cursor: pointer;
}
.account-filter-remove:hover {
background: #fee2e2;
color: #b91c1c;
}
.account-filter-clear { height: 28px; }
.account-filter-bar__result {
margin-left: auto;
flex-shrink: 0;
color: #64748b;
font-size: 11px;
}
.account-filter-bar__result strong { color: #0f172a; }
@media (max-width: 768px) {
.account-filter-bar__header { flex-wrap: wrap; }
.account-filter-condition {
width: 100%;
grid-template-columns: 20px minmax(94px, .8fr) minmax(86px, .7fr) minmax(110px, 1fr) 26px;
}
.account-filter-bar__result { margin-left: 0; }
}
/* 横向按钮组 */
.action-row {
display: flex;
flex-direction: column;
gap: 10px;
align-items: stretch;
width: 100%;
}
.action-line {
display: flex;
align-items: stretch;
gap: 10px;
width: 100%;
min-width: 0;
flex-wrap: wrap;
}
.action-line--tasks > .btn-group {
min-width: 0;
}
.btn-group {
display: flex;
gap: 6px;
align-items: center;
flex-wrap: wrap;
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 8px 10px;
box-shadow: 0 1px 2px rgba(0,0,0,0.03);
}
.btn-group-label {
font-size: 10px;
color: #9ca3af;
font-weight: 700;
letter-spacing: 0.6px;
text-transform: uppercase;
padding-right: 4px;
border-right: 1px solid #e5e7eb;
margin-right: 2px;
white-space: nowrap;
align-self: center;
}
.invite-group {
min-width: unset;
}
.invite-group textarea { display: none; }
/* 编辑模态框加宽 */
.modal-box.max-w-3xl { max-width: 900px; }
/* 批量操作栅格 */
.action-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 12px;
}
.action-card {
background: white;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 12px;
box-shadow: 0 1px 2px rgba(0,0,0,0.03);
}
.action-card-title {
font-size: 12px;
font-weight: 700;
color: #4b5563;
letter-spacing: 0.4px;
text-transform: uppercase;
margin-bottom: 8px;
}
/* 日志抽屉 */
.log-drawer {
position: fixed;
top: 0;
right: 0;
width: 360px;
max-width: 90vw;
height: 100vh;
background: #fff;
border-left: 1px solid #e5e7eb;
box-shadow: -8px 0 24px rgba(0,0,0,0.08);
transition: right 0.25s ease;
z-index: 60;
display: flex;
flex-direction: column;
transform: translateX(100%);
visibility: hidden;
transition: transform 0.2s ease, visibility 0s linear 0.2s;
pointer-events: none;
}
.log-drawer.open {
transform: translateX(0);
visibility: visible;
transition: transform 0.2s ease;
pointer-events: auto;
}
.log-drawer-header {
padding: 12px;
border-bottom: 1px solid #e5e7eb;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.log-drawer-body {
padding: 10px;
flex: 1;
overflow: hidden;
}
.log-drawer-mask {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.25);
z-index: 50;
}
@media (max-width: 768px) {
.log-drawer {
width: 100%;
max-width: 100vw;
}
.log-drawer-body {
padding: 8px;
}
}
/* 小屏幕适配 */
@media (max-width: 768px) {
.hide-mobile { display: none; }
.modal-box { width: 95%; padding: 16px; }
.app-header__inner {
flex-direction: column;
align-items: stretch;
}
.app-header__left,
.app-header__right {
width: 100%;
min-width: 0;
}
.app-header__left {
justify-content: space-between;
}
.app-header__right {
flex-wrap: wrap;
border-top: 1px solid #f1f5f9;
}
.header-top-controls {
width: 100%;
margin-left: 0 !important;
padding: 6px 0;
justify-content: space-between;
gap: 8px !important;
flex-wrap: wrap;
}
.tab-btn {
padding: 9px 12px;
white-space: nowrap;
}
}
/* 设置页两列布局 */
.settings-2col {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
align-items: start;
}
@media (max-width: 900px) {
.settings-2col { grid-template-columns: 1fr; }
.stats-grid { grid-template-columns: repeat(5, 1fr); }
.stats-grid.stats-grid--six { grid-template-columns: repeat(3, 1fr); }
.stats-grid.stats-grid--seven { grid-template-columns: repeat(4, 1fr); }
}
@media (max-width: 600px) {
.stats-grid.stats-grid--six { grid-template-columns: repeat(2, 1fr); }
.stats-grid.stats-grid--seven { grid-template-columns: repeat(2, 1fr); }
}
/* 可点击复制的单元格 */
.copy-cell {
cursor: pointer;
}
.copy-cell:hover {
color: #2563eb;
text-decoration: underline;
}
/* 拖拽选择时禁止文本选中 */
body.drag-selecting {
user-select: none;
-webkit-user-select: none;
}
body.drag-selecting tr {
cursor: default;
}
.task-progress-strip {
flex-shrink: 0;
padding: 7px 12px 8px;
background: #f8fafc;
border-top: 1px solid #e2e8f0;
border-bottom: 1px solid #cbd5e1;
}
.task-progress-strip__meta {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
margin-bottom: 5px;
font-size: 12px;
line-height: 1.35;
}
.task-progress-strip__task {
color: #1d4ed8;
font-weight: 700;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.task-progress-strip__count {
color: #334155;
white-space: nowrap;
}
.task-progress-strip__eta {
margin-left: auto;
color: #475569;
white-space: nowrap;
}
.task-progress-strip__track {
height: 7px;
overflow: hidden;
background: #dbe4ef;
border-radius: 3px;
}
.task-progress-strip__fill {
display: block;
width: 0;
height: 100%;
background: #2563eb;
transition: width .2s ease;
}
@media (max-width: 720px) {
.task-progress-strip__meta { flex-wrap: wrap; gap: 4px 8px; }
.task-progress-strip__eta { width: 100%; margin-left: 0; }
}
/* 复制成功 Toast */
.copy-toast {
background: #1e293b;
color: #fff;
font-size: 13px;
padding: 7px 20px;
border-radius: 20px;
box-shadow: 0 4px 14px rgba(0,0,0,.25);
white-space: nowrap;
}
/* ===== 自定义任务列表(stats-grid 内) ===== */
.custom-joblist-card {
grid-column: span 3;
background: #fff;
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 8px 12px;
box-shadow: 0 1px 2px rgba(0,0,0,0.03);
display: flex;
flex-direction: column;
min-width: 0;
}
.custom-joblist-card-hd {
display: flex;
align-items: center;
gap: 6px;
margin-bottom: 4px;
}
.custom-joblist-clear {
margin-left: auto;
font-size: 10px;
color: #9ca3af;
background: none;
border: none;
cursor: pointer;
padding: 0 4px;
}
.custom-joblist-clear:hover { color: #ef4444; }
.custom-joblist-body {
max-height: 62px;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 1px;
}
.custom-joblist-row {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
padding: 1px 2px;
border-radius: 3px;
}
.custom-joblist-row:hover { background: #f9fafb; }
.custom-joblist-email {
font-weight: 500;
color: #374151;
min-width: 80px;
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex-shrink: 0;
}
.custom-joblist-task {
color: #6b7280;
font-size: 10px;
min-width: 40px;
white-space: nowrap;
}
.custom-joblist-dots {
display: flex;
gap: 2px;
align-items: center;
}
.custom-joblist-st {
font-size: 11px;
font-weight: 600;
margin-left: auto;
flex-shrink: 0;
}
.custom-tasklist-dot {
width: 8px;
height: 8px;
border-radius: 50%;
display: inline-block;
flex-shrink: 0;
}
.custom-tasklist-dot.dot-pending { background: #d1d5db; }
.custom-tasklist-dot.dot-running { background: #3b82f6; box-shadow: 0 0 0 2px rgba(59,130,246,0.3); }
.custom-tasklist-dot.dot-done { background: #22c55e; }
/* badge */
.custom-tasklist-badge-running {
display: inline-flex;
align-items: center;
gap: 5px;
font-size: 12px;
font-weight: 600;
color: #2563eb;
background: #eff6ff;
border: 1px solid #bfdbfe;
border-radius: 12px;
padding: 2px 10px;
}
/* 运行账号区域 */
.custom-tasklist-accounts {
border-top: 1px solid #e5e7eb;
padding: 6px 12px;
}
.custom-tasklist-accounts-hd {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
font-weight: 600;
color: #6b7280;
margin-bottom: 4px;
}
.custom-tasklist-accounts-body {
max-height: 120px;
overflow-y: auto;
}
.custom-tasklist-acc-row {
display: flex;
align-items: center;
gap: 8px;
padding: 2px 4px;
border-radius: 3px;
font-size: 12px;
}
.custom-tasklist-acc-row:hover { background: #f9fafb; }
.custom-tasklist-acc-email {
font-weight: 500;
color: #374151;
min-width: 180px;
max-width: 240px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex-shrink: 0;
}
.custom-tasklist-acc-msg {
font-size: 11px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
flex: 1;
min-width: 0;
}
/* 旋转动画 */
.custom-run-spinner {
display: inline-block;
width: 12px;
height: 12px;
border: 2px solid #93c5fd;
border-top-color: #2563eb;
border-radius: 50%;
animation: custom-spin 0.7s linear infinite;
}
@keyframes custom-spin {
to { transform: rotate(360deg); }
}