Files
qihuaiflow/frontend/src/pages/front/TokenDashboardPage.css
T
QihuAI Design a08ec87b22 chore(align): sync Git with running container as authoritative source
One-time alignment to close drift between the running container
(qihu-aiflow / image qihuaiflow:with-deps) and this Git repository.
Container hotfixes previously persisted only via `docker commit` are now
captured in Git so Git becomes the single source of truth.

Backend:
- chat_service.py: accumulated fixes incl. EigenFlux README guidance
- chat_context.py / chat_media.py: URL/web-repo context injection
- api/url_reader.py: NEW SSRF-safe web/README reader (Issue #725)
- skills_admin.py & Skills.tsx: 14-scene capability unification
- pgvector_search.py, orchestrator.py, platform_knowledge.py,
  market.py, admin/models.py: drift sync

Frontend:
- ChatPage.tsx: collapsible AI think/act block (Issue #724)
- MarketPage / EvolutionDashboard / TokenDashboard styling sync

Migrations:
- 018_normalize_marketapp_scene.sql: fixed capability allowlist
  (prevents capability wipe on restart)

Alignment performed 2026-07-23 05:42:47. No deletions; secrets/venv/node_modules/
caches were not touched (tracked-source-only copy).
2026-07-23 05:42:48 +08:00

609 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.
/* ===== Token Dashboard Page ===== */
.tkd-page {
padding: var(--space-3xl) var(--space-4xl);
max-width: 1280px;
margin: 0 auto;
/* 见 #714:FrontLayout 的 .front-main 裁剪了主内容区,
此处让页面自身在可用高度内纵向滚动,避免内容被截断无法上下查阅 */
height: 100%;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
animation: fadeIn var(--transition-normal);
}
/* ===== Header ===== */
.tkd-header {
margin-bottom: var(--space-3xl);
}
.tkd-title {
font-size: var(--text-2xl);
font-weight: 800;
color: var(--color-text-primary);
letter-spacing: -0.02em;
margin-bottom: var(--space-xs);
}
.tkd-subtitle {
font-size: var(--text-base);
color: var(--color-text-tertiary);
}
/* ===== Warning Banner ===== */
.tkd-warning-banner {
display: flex;
align-items: center;
gap: var(--space-sm);
padding: var(--space-md) var(--space-lg);
background: var(--color-warning-light);
border: 1px solid rgba(232, 146, 44, 0.2);
border-left: 4px solid var(--color-warning);
border-radius: var(--radius-lg);
margin-bottom: var(--space-2xl);
font-size: var(--text-sm);
color: var(--color-text-secondary);
}
.tkd-warning-banner svg {
color: var(--color-warning);
flex-shrink: 0;
}
.tkd-warning-banner strong {
color: var(--color-warning);
font-weight: 700;
}
/* ===== KPI Cards ===== */
.tkd-kpi-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--space-xl);
margin-bottom: var(--space-2xl);
}
.tkd-kpi-card {
display: flex;
align-items: center;
gap: var(--space-xl);
padding: var(--space-2xl);
border-radius: var(--radius-xl);
position: relative;
overflow: hidden;
transition: transform var(--transition-fast), box-shadow var(--transition-fast);
}
.tkd-kpi-card:hover {
transform: translateY(-2px);
box-shadow: var(--shadow-lg);
}
.tkd-kpi--blue {
background: linear-gradient(135deg, #5B5FED 0%, #8185F5 100%);
}
.tkd-kpi--green {
background: linear-gradient(135deg, #219B5E 0%, #34C97A 100%);
}
.tkd-kpi--orange {
background: linear-gradient(135deg, #E8922C 0%, #F5A84C 100%);
}
.tkd-kpi-card::after {
content: '';
position: absolute;
width: 120px;
height: 120px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.08);
top: -30px;
right: -30px;
}
.tkd-kpi-card::before {
content: '';
position: absolute;
width: 80px;
height: 80px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.06);
bottom: -20px;
left: -20px;
}
.tkd-kpi-icon-wrapper {
width: 52px;
height: 52px;
border-radius: var(--radius-lg);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
z-index: 1;
}
.tkd-kpi-icon--blue { background: rgba(255, 255, 255, 0.18); color: #FFFFFF; }
.tkd-kpi-icon--green { background: rgba(255, 255, 255, 0.18); color: #FFFFFF; }
.tkd-kpi-icon--orange { background: rgba(255, 255, 255, 0.18); color: #FFFFFF; }
.tkd-kpi-content {
display: flex;
flex-direction: column;
gap: 2px;
z-index: 1;
}
.tkd-kpi-label {
font-size: var(--text-sm);
color: rgba(255, 255, 255, 0.75);
font-weight: 500;
}
.tkd-kpi-value {
font-size: clamp(1.25rem, 5vw, var(--text-3xl));
font-weight: 800;
color: #FFFFFF;
font-family: var(--font-mono);
letter-spacing: -0.02em;
line-height: 1.1;
word-break: break-all;
overflow-wrap: break-word;
}
.tkd-kpi-sub {
font-size: var(--text-xs);
color: rgba(255, 255, 255, 0.6);
font-weight: 400;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* ===== Middle Row ===== */
.tkd-middle-row {
display: grid;
grid-template-columns: 1fr 1fr 220px;
gap: var(--space-xl);
margin-bottom: var(--space-2xl);
}
/* ===== Rank Card ===== */
.tkd-rank-card {
background: var(--color-bg-secondary);
border: 1px solid var(--color-border-light);
border-radius: var(--radius-xl);
padding: var(--space-xl);
box-shadow: var(--shadow-xs);
}
.tkd-rank-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: var(--space-lg);
}
.tkd-rank-header svg {
color: var(--color-text-tertiary);
}
.tkd-rank-title {
font-size: var(--text-sm);
font-weight: 700;
color: var(--color-text-primary);
}
.tkd-rank-model-body {
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
.tkd-rank-model-name {
font-size: var(--text-lg);
font-weight: 700;
color: var(--color-accent);
}
.tkd-rank-model-tokens {
font-size: var(--text-sm);
color: var(--color-text-tertiary);
font-family: var(--font-mono);
}
/* Rank List */
.tkd-rank-list {
display: flex;
flex-direction: column;
gap: var(--space-sm);
}
.tkd-rank-item {
display: flex;
align-items: center;
gap: var(--space-md);
padding: var(--space-sm) var(--space-md);
border-radius: var(--radius-md);
background: var(--color-bg-primary);
transition: background var(--transition-fast);
}
.tkd-rank-item:hover {
background: var(--color-bg-hover);
}
.tkd-rank-item-idx {
width: 24px;
height: 24px;
border-radius: var(--radius-sm);
display: flex;
align-items: center;
justify-content: center;
font-size: var(--text-xs);
font-weight: 700;
color: var(--color-accent);
background: var(--color-accent-light);
}
.tkd-rank-item:nth-child(1) .tkd-rank-item-idx { background: #FEF3C7; color: #D97706; }
.tkd-rank-item:nth-child(2) .tkd-rank-item-idx { background: #E3E6EB; color: #545A65; }
.tkd-rank-item:nth-child(3) .tkd-rank-item-idx { background: #FDE8CD; color: #B45309; }
.tkd-rank-item-name {
flex: 1;
font-size: var(--text-sm);
font-weight: 500;
color: var(--color-text-primary);
}
.tkd-rank-item-val {
font-size: var(--text-xs);
color: var(--color-text-tertiary);
font-family: var(--font-mono);
}
.tkd-rank-empty {
text-align: center;
color: var(--color-text-disabled);
font-size: var(--text-sm);
padding: var(--space-xl);
}
/* ===== Actions Card ===== */
.tkd-actions-card {
display: flex;
flex-direction: column;
gap: var(--space-md);
justify-content: center;
}
.tkd-btn {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-sm);
padding: var(--space-md) var(--space-xl);
border-radius: var(--radius-lg);
font-size: var(--text-sm);
font-weight: 600;
transition: all var(--transition-fast);
height: 48px;
}
.tkd-btn svg {
flex-shrink: 0;
}
.tkd-btn-primary {
background: var(--color-accent);
color: #FFFFFF;
}
.tkd-btn-primary:hover {
background: var(--color-accent-hover);
box-shadow: var(--shadow-md);
transform: translateY(-1px);
}
.tkd-btn-secondary {
background: var(--color-bg-secondary);
color: var(--color-accent);
border: 1.5px solid var(--color-accent);
}
.tkd-btn-secondary:hover {
background: var(--color-accent-subtle);
transform: translateY(-1px);
}
/* ===== Table ===== */
.tkd-table-wrapper {
background: var(--color-bg-secondary);
border: 1px solid var(--color-border-light);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-xs);
}
.tkd-table-title {
font-size: var(--text-base);
font-weight: 700;
color: var(--color-text-primary);
padding: var(--space-xl) var(--space-xl) 0;
}
.tkd-table-scroll {
overflow-x: auto;
overflow-y: auto;
max-height: 60vh;
padding: var(--space-lg) var(--space-xl) var(--space-sm);
}
.tkd-table {
width: 100%;
border-collapse: collapse;
font-size: var(--text-sm);
}
.tkd-table th {
text-align: left;
padding: var(--space-md) var(--space-md);
font-size: var(--text-xs);
font-weight: 600;
color: var(--color-text-tertiary);
text-transform: uppercase;
letter-spacing: 0.05em;
border-bottom: 1px solid var(--color-border-light);
white-space: nowrap;
}
.tkd-table td {
padding: var(--space-md);
color: var(--color-text-secondary);
border-bottom: 1px solid var(--color-border-light);
white-space: nowrap;
}
.tkd-table tbody tr:hover {
background: var(--color-bg-tertiary);
}
.tkd-table tbody tr:last-child td {
border-bottom: none;
}
.tkd-col-num {
text-align: right;
font-family: var(--font-mono);
}
.tkd-col-bold {
font-weight: 600;
color: var(--color-text-primary);
}
.tkd-col-cost {
color: var(--color-accent);
font-weight: 600;
}
.tkd-col-time {
color: var(--color-text-tertiary);
font-size: var(--text-xs);
}
.tkd-model-badge {
display: inline-flex;
align-items: center;
padding: 2px 10px;
border-radius: var(--radius-full);
background: var(--color-accent-light);
color: var(--color-accent);
font-size: var(--text-xs);
font-weight: 600;
}
/* ===== Pagination ===== */
.tkd-pagination {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-lg);
padding: var(--space-lg) var(--space-xl);
border-top: 1px solid var(--color-border-light);
}
.tkd-page-btn {
padding: var(--space-sm) var(--space-lg);
border: 1px solid var(--color-border);
border-radius: var(--radius-md);
font-size: var(--text-sm);
color: var(--color-text-secondary);
background: var(--color-bg-secondary);
transition: all var(--transition-fast);
}
.tkd-page-btn:hover:not(:disabled) {
border-color: var(--color-accent);
color: var(--color-accent);
}
.tkd-page-btn:disabled {
opacity: 0.4;
cursor: not-allowed;
}
.tkd-page-info {
font-size: var(--text-sm);
color: var(--color-text-tertiary);
font-family: var(--font-mono);
}
/* ===== Loading ===== */
.tkd-loading {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: var(--space-lg);
padding: var(--space-5xl);
color: var(--color-text-tertiary);
font-size: var(--text-sm);
}
.tkd-loading .audit-spinner {
width: 40px;
height: 40px;
border: 3px solid var(--color-border-light);
border-top-color: var(--color-accent);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* ===== Responsive ===== */
@media (max-width: 1024px) {
.tkd-page {
padding: var(--space-xl) var(--space-lg);
}
.tkd-kpi-grid {
grid-template-columns: 1fr;
}
.tkd-middle-row {
grid-template-columns: 1fr;
}
}
@media (max-width: 768px) {
.tkd-kpi-card {
padding: var(--space-lg);
}
.tkd-kpi-value {
font-size: var(--text-xl);
}
}
/* ===== Media Generation Stats ===== */
.tkd-media-section {
background: var(--color-bg-secondary);
border: 1px solid var(--color-border-light);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-xs);
padding: var(--space-xl);
margin-bottom: var(--space-3xl);
}
.tkd-media-summary {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-lg);
margin-top: var(--space-lg);
}
.tkd-media-sum-card {
display: flex;
align-items: center;
gap: var(--space-lg);
padding: var(--space-xl);
border-radius: var(--radius-lg);
border: 1px solid var(--color-border-light);
}
.tkd-media-sum--image {
background: linear-gradient(135deg, rgba(33,155,94,0.10), rgba(33,155,94,0.02));
border-color: rgba(33,155,94,0.25);
}
.tkd-media-sum--video {
background: linear-gradient(135deg, rgba(217,56,58,0.10), rgba(217,56,58,0.02));
border-color: rgba(217,56,58,0.25);
}
.tkd-media-sum-icon {
font-size: 28px;
line-height: 1;
}
.tkd-media-sum-value {
display: block;
font-size: var(--text-2xl);
font-weight: 800;
color: var(--color-text-primary);
line-height: 1.1;
}
.tkd-media-sum-label {
display: block;
font-size: var(--text-xs);
color: var(--color-text-tertiary);
margin-top: 2px;
}
.tkd-media-list {
margin-top: var(--space-lg);
display: flex;
flex-direction: column;
gap: 2px;
}
.tkd-media-item {
display: flex;
align-items: center;
gap: var(--space-md);
padding: var(--space-md) var(--space-lg);
border-radius: var(--radius-md);
transition: background var(--transition-fast);
}
.tkd-media-item:hover {
background: var(--color-bg-tertiary);
}
.tkd-media-item-badge {
display: inline-flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
border-radius: 50%;
font-size: 14px;
flex-shrink: 0;
}
.tkd-media-item-name {
flex: 1;
font-size: var(--text-sm);
font-weight: 600;
color: var(--color-text-primary);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.tkd-media-item-count {
font-size: var(--text-sm);
color: var(--color-text-secondary);
font-weight: 600;
}
.tkd-media-item-tokens {
font-size: var(--text-xs);
color: var(--color-text-tertiary);
font-family: var(--font-mono);
min-width: 110px;
text-align: right;
}
@media (max-width: 768px) {
.tkd-media-summary {
grid-template-columns: 1fr;
}
.tkd-media-item-tokens {
min-width: 80px;
}
}