/* ===== 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; } }