From 3616b69925609c38267a28703a934eebd68f777e Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Mon, 8 Dec 2025 23:55:27 +0000 Subject: [PATCH] pagespeed --- .../src/components/design-elements/Table.tsx | 2 +- .../monitors/ChartPageSpeedReport.tsx | 94 ++++++++++++++----- .../HistogramPageSpeedScoresTooltip.tsx | 2 +- 3 files changed, 74 insertions(+), 24 deletions(-) diff --git a/client/src/components/design-elements/Table.tsx b/client/src/components/design-elements/Table.tsx index 51f6f1893..cbbea2903 100644 --- a/client/src/components/design-elements/Table.tsx +++ b/client/src/components/design-elements/Table.tsx @@ -96,7 +96,7 @@ export function DataTable< return ( - + {header.content} diff --git a/client/src/components/monitors/ChartPageSpeedReport.tsx b/client/src/components/monitors/ChartPageSpeedReport.tsx index 6aabe5b6e..1edd8068f 100644 --- a/client/src/components/monitors/ChartPageSpeedReport.tsx +++ b/client/src/components/monitors/ChartPageSpeedReport.tsx @@ -2,9 +2,12 @@ import { BaseChart } from "@/components/monitors/Chart"; import { FileText } from "lucide-react"; import { Pie, PieChart, ResponsiveContainer, Label } from "recharts"; import Typography from "@mui/material/Typography"; +import Box from "@mui/material/Box"; import { getPageSpeedPalette } from "@/utils/MonitorUtils"; import { useTheme } from "@mui/material/styles"; import { alpha } from "@mui/material/styles"; +import { useState } from "react"; +import Tooltip from "@mui/material/Tooltip"; const CenterLabel = ({ viewBox, value }: any) => { const { cx, cy } = viewBox; @@ -19,6 +22,15 @@ const CenterLabel = ({ viewBox, value }: any) => { export const ChartPageSpeedReport = ({ latestCheck }: { latestCheck: any }) => { const theme = useTheme(); + const [hoverTitle, setHoverTitle] = useState(null); + + const LABELS: Record = { + FCP: "First Contentful Paint", + SI: "Speed Index", + LCP: "Largest Contentful Paint", + TBT: "Total Blocking Time", + CLS: "Cumulative Layout Shift", + }; const metrics = [ { key: "fcp", color: alpha("#1DE9B6", 0.6), weight: 0.1 }, { key: "si", color: alpha("#7C4DFF", 0.6), weight: 0.1 }, @@ -60,33 +72,71 @@ export const ChartPageSpeedReport = ({ latestCheck }: { latestCheck: any }) => { const score = [ { value: 100, - fill: alpha( - theme.palette[pageSpeedPalette].light || "#ffffff", - 0.6 - ), + fill: alpha(theme.palette[pageSpeedPalette].light || "#ffffff", 0.6), stroke: "none", }, ]; return ( - } title="Average PageSpeed score"> - - - - - `${name}: ${Math.round(value)}`} - dataKey="value" - /> - - + } + title="Average PageSpeed score" + > + + + + + + + `${name}: ${Math.round(value)}`} + dataKey="value" + stroke="none" + onMouseEnter={(_, index: number) => { + const d = scores[index]; + if (!d) return; + const isInverse = String(d.name).includes("Inverse"); + const pair = + isInverse && scores[index + 1] ? scores[index + 1] : d; + const base = String(pair.name).replace(" Inverse", ""); + const full = LABELS[base] ?? base; + const displayVal = Math.round(Number(pair.value) || 0); + setHoverTitle(`${full}: ${displayVal}`); + }} + onMouseLeave={() => setHoverTitle(null)} + /> + + + + ); }; diff --git a/client/src/components/monitors/HistogramPageSpeedScoresTooltip.tsx b/client/src/components/monitors/HistogramPageSpeedScoresTooltip.tsx index e7f826270..20539354b 100644 --- a/client/src/components/monitors/HistogramPageSpeedScoresTooltip.tsx +++ b/client/src/components/monitors/HistogramPageSpeedScoresTooltip.tsx @@ -24,7 +24,7 @@ export const HistogramPageSpeedScoresTooltip = ({ return (