+ 预测版 · {homeName} 对 {awayName} +
+ {prediction.provider} / {prediction.model} {prediction.latency_ms !== null && ` · ${(prediction.latency_ms / 1000).toFixed(1)}s`}+ {prediction.pred_home_goals ?? '-'} + : + {prediction.pred_away_goals ?? '-'} +
+预测比分
预测模式
-{mode === 'multi' ? '多 Agent' : '单次'}
-- prompt {prediction.prompt_version ?? '—'} -
-模型耗时
-- {prediction.latency_ms !== null ? (prediction.latency_ms / 1000).toFixed(1) : '—'} - s -
-含专家并行 + 终裁汇总
-+ {mode === 'multi' ? `多专家模式 · ${okReports.length}/${prediction.agent_outputs?.length ?? 0} 路有效` : '单次模式'} + {prediction.prompt_version && ` · prompt ${prediction.prompt_version}`} + {prediction.latency_ms !== null && ` · 终裁耗时 ${(prediction.latency_ms / 1000).toFixed(1)} 秒`} +
+ + {/* ── 专家意见 ── */} {prediction.agent_outputs && prediction.agent_outputs.length > 0 && ( -专家 Agent 报告
+终裁推理
-{prediction.reasoning}
-终裁意见
++++ {prediction.reasoning} +
+
-
-
+
+
+ {no}
+ {AGENT_LABELS[r.agent] ?? r.agent}
+ {badge.label}
- {AGENT_LABELS[r.agent] ?? r.agent}
-
- {badge.label}
-
-
+
{r.status === 'ok' && r.subjective_confidence !== null && (
信心 {Math.round(r.subjective_confidence * 100)}%
)}
{r.status === 'ok' && r.probable_score && (
- {r.probable_score}
+ {r.probable_score}
)}
+
-
+
{/* 无数据 / 失败时给出明确说明,避免用户以为是空白 bug */}
{inactive && (
@@ -701,9 +634,9 @@ function AgentCard({ report: r }: { report: AgentReport }) {
{!inactive && r.home_edge !== null && (
-
- 主队优势
- 0 ? 'text-brand-600' : r.home_edge < 0 ? 'text-amber-600' : 'text-ink-500'}`}>
+
+ 主队优势
+ 0 ? 'text-press' : r.home_edge < 0 ? 'text-ink-700' : 'text-ink-500'}`}>
{r.home_edge > 0 ? '+' : ''}{r.home_edge.toFixed(2)}
@@ -716,14 +649,14 @@ function AgentCard({ report: r }: { report: AgentReport }) {
)}
{r.analysis && (
- {r.analysis}
+ {r.analysis}
)}
{r.key_evidence.length > 0 && (
{r.key_evidence.map((e, i) => (
-
-
+
{e}
))}
@@ -731,20 +664,18 @@ function AgentCard({ report: r }: { report: AgentReport }) {
)}
{r.exp_home_goals !== null && r.exp_away_goals !== null && (
-
- 进球期望
-
- {r.exp_home_goals.toFixed(1)} - {r.exp_away_goals.toFixed(1)}
-
-
+
+ 进球期望 {r.exp_home_goals.toFixed(1)} - {r.exp_away_goals.toFixed(1)}
+
)}
{!inactive && (
-
- 数据充分度 {SUFFICIENCY_LABEL[r.data_sufficiency] ?? r.data_sufficiency}
+
+ 数据充分度 {SUFFICIENCY_LABEL[r.data_sufficiency] ?? r.data_sufficiency}
+ |
{r.model}
- {r.latency_ms !== null && {r.latency_ms}ms}
-
+ {r.latency_ms !== null && {r.latency_ms}ms}
+
)}
diff --git a/frontend/tailwind.config.js b/frontend/tailwind.config.js
index 19b5424..2217c23 100644
--- a/frontend/tailwind.config.js
+++ b/frontend/tailwind.config.js
@@ -4,79 +4,57 @@ export default {
theme: {
extend: {
colors: {
- // 品牌主色:偏冷的蓝,比默认 blue-600 更沉稳,适合数据产品
- brand: {
- 50: '#EFF6FF',
- 100: '#DBEAFE',
- 200: '#BFDBFE',
- 300: '#93C5FD',
- 400: '#60A5FA',
- 500: '#3B82F6',
- 600: '#2563EB',
- 700: '#1D4ED8',
- 800: '#1E40AF',
- 900: '#1E3A8A',
- 950: '#172554',
+ // 纸白:微暖底色,像新闻纸而不是纯白画布
+ paper: {
+ 50: '#FDFCF8',
+ 100: '#F7F4EC',
+ 200: '#EDE9DE',
+ 300: '#DDD7C7',
},
- // 中性色:带一点冷调,避免纯灰显得脏
+ // 墨色:暖黑灰阶,替代冷调 slate
ink: {
- 50: '#F8FAFC',
- 100: '#F1F5F9',
- 200: '#E2E8F0',
- 300: '#CBD5E1',
- 400: '#94A3B8',
- 500: '#64748B',
- 600: '#475569',
- 700: '#334155',
- 800: '#1E293B',
- 900: '#0F172A',
+ 50: '#FAF9F7',
+ 100: '#F0EEE9',
+ 200: '#E2DFD7',
+ 300: '#C9C4B8',
+ 400: '#9C9587',
+ 500: '#6E675B',
+ 600: '#524C42',
+ 700: '#3B362E',
+ 800: '#282420',
+ 900: '#17140F',
+ },
+ // 印报红:全站唯一强调色,克制使用
+ press: {
+ DEFAULT: '#9E1B1B',
+ dark: '#7C1414',
+ wash: '#F7E9E4',
},
- // 语义色:状态徽章 / 提示条统一走这套
- win: { bg: '#ECFDF5', fg: '#047857', line: '#A7F3D0' },
- draw: { bg: '#FFFBEB', fg: '#B45309', line: '#FDE68A' },
- loss: { bg: '#FEF2F2', fg: '#B91C1C', line: '#FECACA' },
},
fontFamily: {
+ // 标题与比分:宋体血统,报纸版面的骨架
+ serif: [
+ 'Georgia',
+ '"Times New Roman"',
+ '"Songti SC"',
+ 'STSong',
+ 'SimSun',
+ '"Noto Serif CJK SC"',
+ 'serif',
+ ],
+ // 正文:中文黑体栈
sans: [
- 'ui-sans-serif',
- '-apple-system',
- 'BlinkMacSystemFont',
- '"Segoe UI"',
'"PingFang SC"',
'"Hiragino Sans GB"',
'"Microsoft YaHei"',
+ '"Noto Sans CJK SC"',
'sans-serif',
],
mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Consolas', 'monospace'],
},
fontSize: {
- // 多一档 2xs,给徽章/元信息用
'2xs': ['11px', { lineHeight: '16px' }],
},
- borderRadius: {
- card: '12px',
- pill: '9999px',
- },
- boxShadow: {
- // 卡片阴影:极浅,靠层次而非重影提升
- card: '0 1px 2px 0 rgb(15 23 42 / 0.04), 0 1px 3px 0 rgb(15 23 42 / 0.06)',
- raise: '0 4px 12px -2px rgb(15 23 42 / 0.08), 0 2px 6px -2px rgb(15 23 42 / 0.04)',
- focus: '0 0 0 3px rgb(37 99 235 / 0.15)',
- },
- keyframes: {
- 'fade-up': {
- '0%': { opacity: '0', transform: 'translateY(4px)' },
- '100%': { opacity: '1', transform: 'translateY(0)' },
- },
- shimmer: {
- '0%': { backgroundPosition: '-200% 0' },
- '100%': { backgroundPosition: '200% 0' },
- },
- },
- animation: {
- 'fade-up': 'fade-up 0.22s ease-out both',
- shimmer: 'shimmer 1.4s linear infinite',
- },
},
},
plugins: [],
+ {no} + {AGENT_LABELS[r.agent] ?? r.agent} + {badge.label} - {AGENT_LABELS[r.agent] ?? r.agent} - - {badge.label} - - + {r.status === 'ok' && r.subjective_confidence !== null && ( 信心 {Math.round(r.subjective_confidence * 100)}% )} {r.status === 'ok' && r.probable_score && ( - {r.probable_score} + {r.probable_score} )} +
-@@ -701,9 +634,9 @@ function AgentCard({ report: r }: { report: AgentReport }) { {!inactive && r.home_edge !== null && (
{r.analysis}
+{r.analysis}
)} {r.key_evidence.length > 0 && (-
{r.key_evidence.map((e, i) => (
- - + {e} ))} @@ -731,20 +664,18 @@ function AgentCard({ report: r }: { report: AgentReport }) { )} {r.exp_home_goals !== null && r.exp_away_goals !== null && ( -
+ 进球期望 {r.exp_home_goals.toFixed(1)} - {r.exp_away_goals.toFixed(1)} +
)} {!inactive && ( -+ 数据充分度 {SUFFICIENCY_LABEL[r.data_sufficiency] ?? r.data_sufficiency} + | {r.model} - {r.latency_ms !== null && {r.latency_ms}ms} -