From a4d8c1aa399bc003f6b9dfd29b6df7f5431e08ca Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Mon, 25 May 2026 00:45:50 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=88=E7=AB=AF=E5=8D=87=E7=BA=A7=EF=BC=9AMi?= =?UTF-8?q?niSparkline=20=E6=9B=BF=E6=8D=A2=E4=B8=BA=20Recharts=20?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E5=9B=BE=E8=A1=A8=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=A6=82=E7=8E=87=E5=88=86=E5=B8=83=E6=9F=B1=E7=8A=B6=E5=AF=B9?= =?UTF-8?q?=E6=AF=94=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/ScanTerminalDashboard.tsx | 154 ++++++++++++++---- frontend/public/logo.png | Bin 0 -> 791330 bytes 2 files changed, 120 insertions(+), 34 deletions(-) create mode 100644 frontend/public/logo.png diff --git a/frontend/components/dashboard/ScanTerminalDashboard.tsx b/frontend/components/dashboard/ScanTerminalDashboard.tsx index 063830ce..79cdc9ee 100644 --- a/frontend/components/dashboard/ScanTerminalDashboard.tsx +++ b/frontend/components/dashboard/ScanTerminalDashboard.tsx @@ -19,6 +19,17 @@ import { UserRound, } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; +import { + Area, + AreaChart, + Bar, + BarChart as ReBarChart, + CartesianGrid, + ResponsiveContainer, + Tooltip, + XAxis, + YAxis, +} from "recharts"; import type { ProAccessState, ScanOpportunityRow } from "@/lib/dashboard-types"; import { getInitialLocaleFromNavigator } from "@/lib/i18n"; import { isBrowserLocalFullAccess } from "@/lib/local-dev-access"; @@ -114,23 +125,91 @@ function decisionClass(label: string) { return "border-amber-200 bg-amber-50 text-amber-700"; } -function MiniSparkline({ tone = "blue" }: { tone?: "blue" | "emerald" | "red" }) { - const stroke = - tone === "emerald" ? "#059669" : tone === "red" ? "#dc2626" : "#2563eb"; +function SparkArea({ + color = "#2563eb", + data, +}: { + color?: string; + data: { v: number }[]; +}) { + if (!data.length) { + return ( +
*KS!OCh6i=*+Gsp$pE_~B4N{9vdc)>;@F6CD#%yV}C9k7_zczm6XO
zKc_U&dY~E!RkMaNhJL6K9bGLx3J_>I)I1?p8W&qVRV?NJ>$Ihjkpf~GlT1t#MNW~C
z7&sNGA8C?Qy%uPaMs~QJ4&Y0GHQ;Jc)ySKKx-n8Q)T}`baMq7Tf(ro{u+f_jia1aN
z7fe7Aoe$Cf(j0CGHK^#dcBLEgon%M5G!BOhH-#Ek$dvL=9tssiXZ)&1bbM57L3FJs
zP@fc25FH&gXNx(7!;P8tc;JYQ^-u5Uq2Sexbr;RJVM=lJxtHGJ%)sWwnAx29$*hhq
z?Abf-Ygb+v%r<4_Yfe7)CyigLyV57R 8;z)O*C2U5bAFoVGSU<
zB*mj{`dx^6L+WUh+qg%GBVz~Aa?2W58MxTs?D2Bv;>J2PNe+yVpBCPzsf=bV1+`d}(-JUi~(=1EbPPjBr}GqEN=
z@j$gzpW1Rx9gchY
VnJITec=-3GWTou`j5SC-`uXc5c{D*p!f
zVPBbvYt=-g&rf9>IFWsf7K|-WoKysTk0`*#_C96TH}cQB&}ZRiaAqrCtj=-;1YaIw
zg@A=58lKJ{!4GW&3}KyrjeYVyhhD&aC1xrtq>k#NDV_8Z3BxXD-Lf>DM723gsO!$~
z!<(eVraSp+jYrnpzd4TRa#wyV=6_lf8v5D13q#%Zbf|Ru&XjKW8Je47h{o_Mzs32P
zj8c(--Y10uijC5qxf
Z!l
zCuS#;*CE&tU?A~lthCH*!oXfHg;GScX2b(fC?SLBpdP>Ca~uA}RKwilK44