fakeshield-api / fakeshield /src /pages /VideoLab /TimelineChart.tsx
Akash4911's picture
Production Deploy: Improved robustness and logging
66b6851
import React from 'react';
import {
AreaChart,
Area,
XAxis,
YAxis,
CartesianGrid,
Tooltip,
ResponsiveContainer,
ReferenceLine
} from 'recharts';
interface TimelineChartProps {
data: number[];
label: string;
color: string;
}
const TimelineChart: React.FC<TimelineChartProps> = ({ data, label, color }) => {
const chartData = data.map((val, i) => ({
time: i,
score: Math.round(val * 100),
}));
return (
<div className="w-full h-48 mt-4">
<h4 className="text-[10px] font-bold uppercase tracking-[0.2em] text-slate-400 mb-2">{label} Timeline</h4>
<ResponsiveContainer width="100%" height="100%">
<AreaChart data={chartData}>
<defs>
<linearGradient id="colorScore" x1="0" y1="0" x2="0" y2="1">
<stop offset="5%" stopColor={color} stopOpacity={0.2}/>
<stop offset="95%" stopColor={color} stopOpacity={0}/>
</linearGradient>
</defs>
<CartesianGrid strokeDasharray="3 3" stroke="rgba(0,0,0,0.05)" vertical={false} />
<XAxis
dataKey="time"
hide
/>
<YAxis
domain={[0, 100]}
tick={{ fontSize: 9, fill: '#94a3b8', fontWeight: 600 }}
axisLine={false}
tickLine={false}
/>
<Tooltip
contentStyle={{
backgroundColor: '#fff',
border: '1px solid #e2e8f0',
borderRadius: '8px',
fontSize: '11px',
boxShadow: '0 4px 6px -1px rgb(0 0 0 / 0.1)'
}}
itemStyle={{ color: color, fontWeight: 700 }}
/>
<ReferenceLine y={75} stroke="#ef4444" strokeDasharray="4 4" label={{ position: 'right', value: 'THREAT THRESHOLD', fill: '#ef4444', fontSize: 8, fontWeight: 800 }} />
<Area
type="monotone"
dataKey="score"
stroke={color}
fillOpacity={1}
fill="url(#colorScore)"
strokeWidth={2}
/>
</AreaChart>
</ResponsiveContainer>
</div>
);
};
export default TimelineChart;